import React, { useState } from 'react'; import { Plus, Search, Download, ShoppingCart, Truck, DollarSign, Calendar, Clock, CheckCircle, AlertCircle, Package, Eye, Loader } from 'lucide-react'; import { Button, Input, Card, StatsGrid, StatusCard, getStatusColor, StatusModal } from '../../../../components/ui'; import { formatters } from '../../../../components/ui/Stats/StatsPresets'; import { PageHeader } from '../../../../components/layout'; import { useProcurementDashboard, useProcurementPlans, useCurrentProcurementPlan, useCriticalRequirements, useGenerateProcurementPlan, useUpdateProcurementPlanStatus, useTriggerDailyScheduler } from '../../../../api'; import { useTenantStore } from '../../../../stores/tenant.store'; const ProcurementPage: React.FC = () => { const [activeTab, setActiveTab] = useState('plans'); const [searchTerm, setSearchTerm] = useState(''); const [showForm, setShowForm] = useState(false); const [modalMode, setModalMode] = useState<'view' | 'edit'>('view'); const [selectedPlan, setSelectedPlan] = useState(null); const { currentTenant } = useTenantStore(); const tenantId = currentTenant?.id || ''; // Real API data hooks const { data: dashboardData, isLoading: isDashboardLoading } = useProcurementDashboard(tenantId); const { data: procurementPlans, isLoading: isPlansLoading } = useProcurementPlans({ tenant_id: tenantId, limit: 50, offset: 0 }); const { data: currentPlan, isLoading: isCurrentPlanLoading } = useCurrentProcurementPlan(tenantId); const { data: criticalRequirements, isLoading: isCriticalLoading } = useCriticalRequirements(tenantId); const generatePlanMutation = useGenerateProcurementPlan(); const updatePlanStatusMutation = useUpdateProcurementPlanStatus(); const triggerSchedulerMutation = useTriggerDailyScheduler(); if (!tenantId) { return (

No hay tenant seleccionado

Selecciona un tenant para ver los datos de procurement

); } const getPlanStatusConfig = (status: string) => { const statusConfig = { draft: { text: 'Borrador', icon: Clock }, pending_approval: { text: 'Pendiente Aprobación', icon: Clock }, approved: { text: 'Aprobado', icon: CheckCircle }, in_execution: { text: 'En Ejecución', icon: Truck }, completed: { text: 'Completado', icon: CheckCircle }, cancelled: { text: 'Cancelado', icon: AlertCircle }, }; const config = statusConfig[status as keyof typeof statusConfig]; const Icon = config?.icon; return { color: getStatusColor(status === 'in_execution' ? 'inTransit' : status === 'pending_approval' ? 'pending' : status), text: config?.text || status, icon: Icon, isCritical: status === 'cancelled', isHighlight: status === 'pending_approval' }; }; const filteredPlans = procurementPlans?.plans?.filter(plan => { const matchesSearch = plan.plan_number.toLowerCase().includes(searchTerm.toLowerCase()) || plan.status.toLowerCase().includes(searchTerm.toLowerCase()) || (plan.special_requirements && plan.special_requirements.toLowerCase().includes(searchTerm.toLowerCase())); return matchesSearch; }) || []; const stats = { totalPlans: dashboardData?.summary?.total_plans || 0, activePlans: dashboardData?.summary?.active_plans || 0, pendingRequirements: dashboardData?.summary?.pending_requirements || 0, criticalRequirements: dashboardData?.summary?.critical_requirements || 0, totalEstimatedCost: dashboardData?.summary?.total_estimated_cost || 0, totalApprovedCost: dashboardData?.summary?.total_approved_cost || 0, }; const procurementStats = [ { title: 'Planes Totales', value: stats.totalPlans, variant: 'default' as const, icon: Package, }, { title: 'Planes Activos', value: stats.activePlans, variant: 'success' as const, icon: CheckCircle, }, { title: 'Requerimientos Pendientes', value: stats.pendingRequirements, variant: 'warning' as const, icon: Clock, }, { title: 'Críticos', value: stats.criticalRequirements, variant: 'warning' as const, icon: AlertCircle, }, { title: 'Costo Estimado', value: formatters.currency(stats.totalEstimatedCost), variant: 'info' as const, icon: DollarSign, }, { title: 'Costo Aprobado', value: formatters.currency(stats.totalApprovedCost), variant: 'success' as const, icon: DollarSign, }, ]; return (
console.log('Export procurement data') }, { id: "generate", label: "Generar Plan", variant: "primary" as const, icon: Plus, onClick: () => generatePlanMutation.mutate({ tenantId, request: { force_regenerate: false, planning_horizon_days: 14, include_safety_stock: true, safety_stock_percentage: 20 } }) }, { id: "trigger", label: "Ejecutar Programador", variant: "outline" as const, icon: Calendar, onClick: () => triggerSchedulerMutation.mutate(tenantId) } ]} /> {/* Stats Grid */} {isDashboardLoading ? (
) : ( )} {/* Tabs Navigation */}
{activeTab === 'plans' && (
setSearchTerm(e.target.value)} className="w-full" />
)} {/* Procurement Plans Grid */} {activeTab === 'plans' && (
{isPlansLoading ? (
) : ( filteredPlans.map((plan) => { const statusConfig = getPlanStatusConfig(plan.status); return ( { setSelectedPlan(plan); setModalMode('view'); setShowForm(true); } }, ...(plan.status === 'pending_approval' ? [{ label: 'Aprobar', icon: CheckCircle, variant: 'outline' as const, onClick: () => { updatePlanStatusMutation.mutate({ tenant_id: tenantId, plan_id: plan.id, status: 'approved' }); } }] : []) ]} /> ); }) )}
)} {/* Empty State for Procurement Plans */} {activeTab === 'plans' && !isPlansLoading && filteredPlans.length === 0 && (

No se encontraron planes de compra

Intenta ajustar la búsqueda o generar un nuevo plan de compra

)} {activeTab === 'requirements' && (
{isCriticalLoading ? (
) : criticalRequirements && criticalRequirements.length > 0 ? (
{criticalRequirements.map((requirement) => ( console.log('View requirement details') } ]} /> ))}
) : (

No hay requerimientos críticos

Todos los requerimientos están bajo control

)}
)} {activeTab === 'analytics' && (

Costos de Procurement

Costo Estimado Total {formatters.currency(stats.totalEstimatedCost)}
Costo Aprobado {formatters.currency(stats.totalApprovedCost)}
Varianza {formatters.currency(stats.totalEstimatedCost - stats.totalApprovedCost)}

Alertas Críticas

{dashboardData?.low_stock_alerts?.slice(0, 5).map((alert: any, index: number) => (
{alert.product_name || `Alerta ${index + 1}`}
Stock Bajo
)) || (

No hay alertas críticas

)}

Resumen de Performance

{stats.totalPlans}

Planes Totales

{stats.activePlans}

Planes Activos

{stats.pendingRequirements}

Pendientes

{stats.criticalRequirements}

Críticos

)} {/* Procurement Plan Modal */} {showForm && selectedPlan && ( { setShowForm(false); setSelectedPlan(null); setModalMode('view'); }} mode={modalMode} onModeChange={setModalMode} title={`Plan de Compra ${selectedPlan.plan_number}`} subtitle={new Date(selectedPlan.plan_date).toLocaleDateString('es-ES')} statusIndicator={getPlanStatusConfig(selectedPlan.status)} size="lg" sections={[ { title: 'Información del Plan', icon: Package, fields: [ { label: 'Número de Plan', value: selectedPlan.plan_number, highlight: true }, { label: 'Tipo de Plan', value: selectedPlan.plan_type }, { label: 'Estrategia', value: selectedPlan.procurement_strategy }, { label: 'Prioridad', value: selectedPlan.priority, type: 'status' } ] }, { title: 'Fechas y Períodos', icon: Calendar, fields: [ { label: 'Fecha del Plan', value: selectedPlan.plan_date, type: 'date' }, { label: 'Período de Inicio', value: selectedPlan.plan_period_start, type: 'date' }, { label: 'Período de Fin', value: selectedPlan.plan_period_end, type: 'date', highlight: true }, { label: 'Horizonte de Planificación', value: `${selectedPlan.planning_horizon_days} días` } ] }, { title: 'Información Financiera', icon: DollarSign, fields: [ { label: 'Costo Estimado Total', value: selectedPlan.total_estimated_cost, type: 'currency', highlight: true }, { label: 'Costo Aprobado Total', value: selectedPlan.total_approved_cost, type: 'currency' }, { label: 'Varianza de Costo', value: selectedPlan.cost_variance, type: 'currency' } ] }, { title: 'Estadísticas', icon: ShoppingCart, fields: [ { label: 'Total de Requerimientos', value: `${selectedPlan.total_requirements} requerimientos` }, { label: 'Demanda Total (Cantidad)', value: `${selectedPlan.total_demand_quantity} unidades` }, { label: 'Proveedores Primarios', value: `${selectedPlan.primary_suppliers_count} proveedores` }, { label: 'Proveedores de Respaldo', value: `${selectedPlan.backup_suppliers_count} proveedores` } ] }, ...(selectedPlan.special_requirements ? [{ title: 'Requerimientos Especiales', fields: [ { label: 'Observaciones', value: selectedPlan.special_requirements, span: 2 as const, editable: true, placeholder: 'Añadir requerimientos especiales para el plan...' } ] }] : []) ]} onEdit={() => { console.log('Editing procurement plan:', selectedPlan.id); }} /> )}
); }; export default ProcurementPage;