import React, { useState } from 'react'; import { Plus, Download, Clock, Users, AlertCircle, CheckCircle, Timer, ChefHat, Eye, Edit, Calendar, Zap, Package } from 'lucide-react'; import { Button, Input, Card, Badge, StatsGrid, StatusCard, getStatusColor, StatusModal } from '../../../../components/ui'; import { pagePresets } from '../../../../components/ui/Stats/StatsPresets'; import { PageHeader } from '../../../../components/layout'; import { ProductionSchedule, BatchTracker, QualityControl } from '../../../../components/domain/production'; const ProductionPage: React.FC = () => { const [activeTab, setActiveTab] = useState('schedule'); const [searchQuery, setSearchQuery] = useState(''); const [selectedOrder, setSelectedOrder] = useState(null); const [showForm, setShowForm] = useState(false); const [modalMode, setModalMode] = useState<'view' | 'edit'>('view'); const mockProductionStats = { dailyTarget: 150, completed: 85, inProgress: 12, pending: 53, efficiency: 78, quality: 94, }; const mockProductionOrders = [ { id: '1', recipeName: 'Pan de Molde Integral', quantity: 20, status: 'in_progress', priority: 'high', assignedTo: 'Juan Panadero', startTime: '2024-01-26T06:00:00Z', estimatedCompletion: '2024-01-26T10:00:00Z', progress: 65, }, { id: '2', recipeName: 'Croissants de Mantequilla', quantity: 50, status: 'pending', priority: 'medium', assignedTo: 'María González', startTime: '2024-01-26T08:00:00Z', estimatedCompletion: '2024-01-26T12:00:00Z', progress: 0, }, { id: '3', recipeName: 'Baguettes Francesas', quantity: 30, status: 'completed', priority: 'medium', assignedTo: 'Carlos Ruiz', startTime: '2024-01-26T04:00:00Z', estimatedCompletion: '2024-01-26T08:00:00Z', progress: 100, }, { id: '4', recipeName: 'Tarta de Chocolate', quantity: 5, status: 'pending', priority: 'low', assignedTo: 'Ana Pastelera', startTime: '2024-01-26T10:00:00Z', estimatedCompletion: '2024-01-26T16:00:00Z', progress: 0, }, { id: '5', recipeName: 'Empanadas de Pollo', quantity: 40, status: 'in_progress', priority: 'high', assignedTo: 'Luis Hornero', startTime: '2024-01-26T07:00:00Z', estimatedCompletion: '2024-01-26T11:00:00Z', progress: 45, }, { id: '6', recipeName: 'Donuts Glaseados', quantity: 60, status: 'pending', priority: 'urgent', assignedTo: 'María González', startTime: '2024-01-26T12:00:00Z', estimatedCompletion: '2024-01-26T15:00:00Z', progress: 0, }, { id: '7', recipeName: 'Pan de Centeno', quantity: 25, status: 'completed', priority: 'medium', assignedTo: 'Juan Panadero', startTime: '2024-01-26T05:00:00Z', estimatedCompletion: '2024-01-26T09:00:00Z', progress: 100, }, { id: '8', recipeName: 'Muffins de Arándanos', quantity: 36, status: 'in_progress', priority: 'medium', assignedTo: 'Ana Pastelera', startTime: '2024-01-26T08:30:00Z', estimatedCompletion: '2024-01-26T12:30:00Z', progress: 70, }, ]; const getProductionStatusConfig = (status: string, priority: string) => { const statusConfig = { pending: { text: 'Pendiente', icon: Clock }, in_progress: { text: 'En Proceso', icon: Timer }, completed: { text: 'Completado', icon: CheckCircle }, cancelled: { text: 'Cancelado', icon: AlertCircle }, }; const config = statusConfig[status as keyof typeof statusConfig]; const Icon = config?.icon; const isUrgent = priority === 'urgent'; return { color: getStatusColor(status), text: config?.text || status, icon: Icon, isCritical: isUrgent, isHighlight: false }; }; const filteredOrders = mockProductionOrders.filter(order => { const matchesSearch = order.recipeName.toLowerCase().includes(searchQuery.toLowerCase()) || order.assignedTo.toLowerCase().includes(searchQuery.toLowerCase()) || order.id.toLowerCase().includes(searchQuery.toLowerCase()); return matchesSearch; }); return (
console.log('Export production orders') }, { id: "new", label: "Nueva Orden de Producción", variant: "primary" as const, icon: Plus, onClick: () => setShowForm(true) } ]} /> {/* Production Stats */} {/* Tabs Navigation */}
{/* Production Orders Tab */} {activeTab === 'schedule' && ( <> {/* Simplified Controls */}
setSearchQuery(e.target.value)} className="w-full" />
{/* Production Orders Grid */}
{filteredOrders.map((order) => { const statusConfig = getProductionStatusConfig(order.status, order.priority); return ( { setSelectedOrder(order); setModalMode('view'); setShowForm(true); } }, { label: 'Editar', icon: Edit, variant: 'outline', onClick: () => { setSelectedOrder(order); setModalMode('edit'); setShowForm(true); } } ]} /> ); })}
{/* Empty State */} {filteredOrders.length === 0 && (

No se encontraron órdenes de producción

Intenta ajustar la búsqueda o crear una nueva orden de producción

)} )} {activeTab === 'batches' && ( )} {activeTab === 'quality' && ( )} {/* Production Order Modal */} {showForm && selectedOrder && ( { setShowForm(false); setSelectedOrder(null); setModalMode('view'); }} mode={modalMode} onModeChange={setModalMode} title={selectedOrder.recipeName} subtitle={`Orden de Producción #${selectedOrder.id}`} statusIndicator={getProductionStatusConfig(selectedOrder.status, selectedOrder.priority)} size="lg" sections={[ { title: 'Información General', icon: Package, fields: [ { label: 'Cantidad', value: `${selectedOrder.quantity} unidades`, highlight: true }, { label: 'Asignado a', value: selectedOrder.assignedTo, }, { label: 'Prioridad', value: selectedOrder.priority, type: 'status' }, { label: 'Progreso', value: selectedOrder.progress, type: 'percentage', highlight: true } ] }, { title: 'Cronograma', icon: Clock, fields: [ { label: 'Hora de inicio', value: selectedOrder.startTime, type: 'datetime' }, { label: 'Finalización estimada', value: selectedOrder.estimatedCompletion, type: 'datetime' } ] } ]} onEdit={() => { // Handle edit mode console.log('Editing production order:', selectedOrder.id); }} /> )}
); }; export default ProductionPage;