import React, { useState } from 'react'; import { ShoppingCart, TrendingUp, AlertCircle, Target, DollarSign, Award, BarChart3, Truck, Calendar } from 'lucide-react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from 'recharts'; import { AnalyticsPageLayout, AnalyticsCard } from '../../../components/analytics'; import { useSubscription } from '../../../api/hooks/subscription'; import { useCurrentTenant } from '../../../stores/tenant.store'; import { useProcurementDashboard, useProcurementTrends } from '../../../api/hooks/procurement'; import { formatters } from '../../../components/ui/Stats/StatsPresets'; const ProcurementAnalyticsPage: React.FC = () => { const { canAccessAnalytics, subscriptionInfo } = useSubscription(); const currentTenant = useCurrentTenant(); const tenantId = currentTenant?.id || ''; const [activeTab, setActiveTab] = useState('overview'); const { data: dashboard, isLoading: dashboardLoading } = useProcurementDashboard(tenantId); const { data: trends, isLoading: trendsLoading } = useProcurementTrends(tenantId, 7); // Check if user has access to advanced analytics (professional/enterprise) const hasAdvancedAccess = canAccessAnalytics('advanced'); // Tab configuration const tabs = [ { id: 'overview', label: 'Resumen', icon: BarChart3 }, { id: 'performance', label: 'Rendimiento', icon: TrendingUp }, { id: 'suppliers', label: 'Proveedores', icon: Truck }, { id: 'costs', label: 'Costos', icon: DollarSign }, { id: 'quality', label: 'Calidad', icon: Award } ]; return ( {activeTab === 'overview' && ( <> {/* Overview Tab */}
{/* Plan Status Distribution */}
{dashboard?.plan_status_distribution?.map((status: any) => (
{status.status}
{status.count}
))}
{/* Critical Requirements */} } >
Stock Crítico {dashboard?.critical_requirements?.low_stock || 0}
Entregas Atrasadas {dashboard?.critical_requirements?.overdue || 0}
Alta Prioridad {dashboard?.critical_requirements?.high_priority || 0}
{/* Recent Plans */}
{dashboard?.recent_plans?.map((plan: any) => ( ))}
Plan Fecha Estado Requerimientos Costo Total
{plan.plan_number} {new Date(plan.plan_date).toLocaleDateString()} {plan.status} {plan.total_requirements} €{formatters.currency(plan.total_estimated_cost)}
)} {activeTab === 'performance' && ( <> {/* Performance Tab */}
{formatters.percentage(dashboard?.performance_metrics?.average_fulfillment_rate || 0)}
Tasa de Cumplimiento
{formatters.percentage(dashboard?.performance_metrics?.average_on_time_delivery || 0)}
Entregas a Tiempo
{dashboard?.performance_metrics?.supplier_performance?.toFixed(1) || '0.0'}
Puntuación de Calidad
{/* Performance Trend Chart */} {trends && trends.performance_trend && trends.performance_trend.length > 0 ? ( `${(value * 100).toFixed(0)}%`} /> `${(value * 100).toFixed(1)}%`} labelStyle={{ color: 'var(--text-primary)' }} /> ) : (
No hay datos de tendencias disponibles
)}
)} {activeTab === 'suppliers' && ( <> {/* Suppliers Tab */}
{dashboard?.supplier_performance?.map((supplier: any) => ( ))}
Proveedor Órdenes Tasa Cumplimiento Entregas a Tiempo Calidad
{supplier.name} {supplier.total_orders} {formatters.percentage(supplier.fulfillment_rate)} {formatters.percentage(supplier.on_time_rate)} {supplier.quality_score?.toFixed(1) || 'N/A'}
)} {activeTab === 'costs' && ( <> {/* Costs Tab */}
Costo Total Estimado €{formatters.currency(dashboard?.summary?.total_estimated_cost || 0)}
Costo Total Aprobado €{formatters.currency(dashboard?.summary?.total_approved_cost || 0)}
Variación Promedio 0 ? 'text-[var(--color-error)]' : 'text-[var(--color-success)]' }`}> €{formatters.currency(Math.abs(dashboard?.summary?.cost_variance || 0))}
{dashboard?.cost_by_category?.map((category: any) => (
{category.name}
€{formatters.currency(category.amount)}
))}
)} {activeTab === 'quality' && ( <> {/* Quality Tab */}
Puntuación Promedio {dashboard?.quality_metrics?.avg_score?.toFixed(1) || '0.0'} / 10
Productos con Calidad Alta {dashboard?.quality_metrics?.high_quality_count || 0}
Productos con Calidad Baja {dashboard?.quality_metrics?.low_quality_count || 0}
{trends && trends.quality_trend && trends.quality_trend.length > 0 ? ( `${value.toFixed(1)} / 10`} labelStyle={{ color: 'var(--text-primary)' }} /> ) : (
No hay datos de calidad disponibles
)}
)} ); }; // Helper function for status colors function getStatusColor(status: string): string { const colors: Record = { draft: 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]', pending_approval: 'bg-yellow-100 text-yellow-800', approved: 'bg-green-100 text-green-800', in_execution: 'bg-blue-100 text-blue-800', completed: 'bg-green-100 text-green-800', cancelled: 'bg-red-100 text-red-800' }; return colors[status] || colors.draft; } export default ProcurementAnalyticsPage;