Improve the frontend modals

This commit is contained in:
Urtzi Alfaro
2025-10-27 16:33:26 +01:00
parent 61376b7a9f
commit 858d985c92
143 changed files with 9289 additions and 2306 deletions

View File

@@ -1,7 +1,8 @@
import React from 'react';
import { ShoppingCart, TrendingUp, Clock, AlertTriangle } from 'lucide-react';
import { ShoppingCart, TrendingUp, Clock, AlertTriangle, Brain } from 'lucide-react';
import { Card, Input } from '../../../../../components/ui';
import type { ProcurementSettings } from '../../../../../api/types/settings';
import { useTranslation } from 'react-i18next';
interface ProcurementSettingsCardProps {
settings: ProcurementSettings;
@@ -14,6 +15,8 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
onChange,
disabled = false,
}) => {
const { t } = useTranslation('ajustes');
const handleChange = (field: keyof ProcurementSettings) => (
e: React.ChangeEvent<HTMLInputElement>
) => {
@@ -27,7 +30,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<Card className="p-6">
<h3 className="text-lg font-semibold text-[var(--text-primary)] mb-6 flex items-center">
<ShoppingCart className="w-5 h-5 mr-2 text-[var(--color-primary)]" />
Compras y Aprovisionamiento
{t('procurement.title')}
</h3>
<div className="space-y-6">
@@ -35,7 +38,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<div>
<h4 className="text-sm font-semibold text-[var(--text-secondary)] mb-4 flex items-center">
<TrendingUp className="w-4 h-4 mr-2" />
Auto-Aprobación de Órdenes de Compra
{t('procurement.auto_approval')}
</h4>
<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4 pl-6">
<div className="flex items-center gap-2 md:col-span-2 xl:col-span-3">
@@ -48,13 +51,13 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
className="rounded border-[var(--border-primary)]"
/>
<label htmlFor="auto_approve_enabled" className="text-sm text-[var(--text-secondary)]">
Habilitar auto-aprobación de órdenes de compra
{t('procurement.auto_approve_enabled')}
</label>
</div>
<Input
type="number"
label="Umbral de Auto-Aprobación (EUR)"
label={t('procurement.auto_approve_threshold')}
value={settings.auto_approve_threshold_eur}
onChange={handleChange('auto_approve_threshold_eur')}
disabled={disabled || !settings.auto_approve_enabled}
@@ -66,7 +69,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<Input
type="number"
label="Puntuación Mínima de Proveedor"
label={t('procurement.min_supplier_score')}
value={settings.auto_approve_min_supplier_score}
onChange={handleChange('auto_approve_min_supplier_score')}
disabled={disabled || !settings.auto_approve_enabled}
@@ -86,7 +89,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
className="rounded border-[var(--border-primary)]"
/>
<label htmlFor="require_approval_new_suppliers" className="text-sm text-[var(--text-secondary)]">
Requiere aprobación para nuevos proveedores
{t('procurement.require_approval_new_suppliers')}
</label>
</div>
@@ -100,7 +103,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
className="rounded border-[var(--border-primary)]"
/>
<label htmlFor="require_approval_critical_items" className="text-sm text-[var(--text-secondary)]">
Requiere aprobación para artículos críticos
{t('procurement.require_approval_critical_items')}
</label>
</div>
</div>
@@ -110,12 +113,12 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<div>
<h4 className="text-sm font-semibold text-[var(--text-secondary)] mb-4 flex items-center">
<Clock className="w-4 h-4 mr-2" />
Planificación y Previsión
{t('procurement.planning')}
</h4>
<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4 pl-6">
<Input
type="number"
label="Tiempo de Entrega (días)"
label={t('procurement.lead_time_days')}
value={settings.procurement_lead_time_days}
onChange={handleChange('procurement_lead_time_days')}
disabled={disabled}
@@ -127,7 +130,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<Input
type="number"
label="Días de Previsión de Demanda"
label={t('procurement.demand_forecast_days')}
value={settings.demand_forecast_days}
onChange={handleChange('demand_forecast_days')}
disabled={disabled}
@@ -139,7 +142,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<Input
type="number"
label="Stock de Seguridad (%)"
label={t('procurement.safety_stock_percentage')}
value={settings.safety_stock_percentage}
onChange={handleChange('safety_stock_percentage')}
disabled={disabled}
@@ -155,12 +158,12 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<div>
<h4 className="text-sm font-semibold text-[var(--text-secondary)] mb-4 flex items-center">
<AlertTriangle className="w-4 h-4 mr-2" />
Flujo de Aprobación
{t('procurement.workflow')}
</h4>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 pl-6">
<Input
type="number"
label="Recordatorio de Aprobación (horas)"
label={t('procurement.approval_reminder_hours')}
value={settings.po_approval_reminder_hours}
onChange={handleChange('po_approval_reminder_hours')}
disabled={disabled}
@@ -172,7 +175,7 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
<Input
type="number"
label="Escalación Crítica (horas)"
label={t('procurement.critical_escalation_hours')}
value={settings.po_critical_escalation_hours}
onChange={handleChange('po_critical_escalation_hours')}
disabled={disabled}
@@ -183,6 +186,110 @@ const ProcurementSettingsCard: React.FC<ProcurementSettingsCardProps> = ({
/>
</div>
</div>
{/* Smart Procurement Calculation */}
<div className="border-t border-[var(--border-primary)] pt-6">
<h4 className="text-sm font-semibold text-[var(--text-secondary)] mb-4 flex items-center">
<Brain className="w-4 h-4 mr-2" />
{t('procurement.smart_procurement')}
</h4>
<div className="space-y-3 pl-6">
<div className="flex items-start gap-2">
<input
type="checkbox"
id="use_reorder_rules"
checked={settings.use_reorder_rules}
onChange={handleChange('use_reorder_rules')}
disabled={disabled}
className="rounded border-[var(--border-primary)] mt-0.5"
/>
<div className="flex flex-col">
<label htmlFor="use_reorder_rules" className="text-sm font-medium text-[var(--text-secondary)]">
{t('procurement.use_reorder_rules')}
</label>
<span className="text-xs text-[var(--text-tertiary)] mt-0.5">
{t('procurement.use_reorder_rules_desc')}
</span>
</div>
</div>
<div className="flex items-start gap-2">
<input
type="checkbox"
id="economic_rounding"
checked={settings.economic_rounding}
onChange={handleChange('economic_rounding')}
disabled={disabled}
className="rounded border-[var(--border-primary)] mt-0.5"
/>
<div className="flex flex-col">
<label htmlFor="economic_rounding" className="text-sm font-medium text-[var(--text-secondary)]">
{t('procurement.economic_rounding')}
</label>
<span className="text-xs text-[var(--text-tertiary)] mt-0.5">
{t('procurement.economic_rounding_desc')}
</span>
</div>
</div>
<div className="flex items-start gap-2">
<input
type="checkbox"
id="respect_storage_limits"
checked={settings.respect_storage_limits}
onChange={handleChange('respect_storage_limits')}
disabled={disabled}
className="rounded border-[var(--border-primary)] mt-0.5"
/>
<div className="flex flex-col">
<label htmlFor="respect_storage_limits" className="text-sm font-medium text-[var(--text-secondary)]">
{t('procurement.respect_storage_limits')}
</label>
<span className="text-xs text-[var(--text-tertiary)] mt-0.5">
{t('procurement.respect_storage_limits_desc')}
</span>
</div>
</div>
<div className="flex items-start gap-2">
<input
type="checkbox"
id="use_supplier_minimums"
checked={settings.use_supplier_minimums}
onChange={handleChange('use_supplier_minimums')}
disabled={disabled}
className="rounded border-[var(--border-primary)] mt-0.5"
/>
<div className="flex flex-col">
<label htmlFor="use_supplier_minimums" className="text-sm font-medium text-[var(--text-secondary)]">
{t('procurement.use_supplier_minimums')}
</label>
<span className="text-xs text-[var(--text-tertiary)] mt-0.5">
{t('procurement.use_supplier_minimums_desc')}
</span>
</div>
</div>
<div className="flex items-start gap-2">
<input
type="checkbox"
id="optimize_price_tiers"
checked={settings.optimize_price_tiers}
onChange={handleChange('optimize_price_tiers')}
disabled={disabled}
className="rounded border-[var(--border-primary)] mt-0.5"
/>
<div className="flex flex-col">
<label htmlFor="optimize_price_tiers" className="text-sm font-medium text-[var(--text-secondary)]">
{t('procurement.optimize_price_tiers')}
</label>
<span className="text-xs text-[var(--text-tertiary)] mt-0.5">
{t('procurement.optimize_price_tiers_desc')}
</span>
</div>
</div>
</div>
</div>
</div>
</Card>
);