import React, { useState } from 'react'; import { Plus, Download, AlertTriangle, Package, Clock, CheckCircle, Eye, Edit, Calendar, DollarSign } from 'lucide-react'; import { Button, Input, Card, Badge, StatsGrid, StatusCard, getStatusColor, StatusModal } from '../../../../components/ui'; import { formatters } from '../../../../components/ui/Stats/StatsPresets'; import { PageHeader } from '../../../../components/layout'; import { InventoryForm, LowStockAlert } from '../../../../components/domain/inventory'; const InventoryPage: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); const [showForm, setShowForm] = useState(false); const [modalMode, setModalMode] = useState<'view' | 'edit'>('view'); const [selectedItem, setSelectedItem] = useState(null); const mockInventoryItems = [ { id: '1', name: 'Harina de Trigo', category: 'Harinas', currentStock: 45, minStock: 20, maxStock: 100, unit: 'kg', cost: 1.20, supplier: 'Molinos del Sur', lastRestocked: '2024-01-20', expirationDate: '2024-06-30', status: 'normal', }, { id: '2', name: 'Levadura Fresca', category: 'Levaduras', currentStock: 8, minStock: 10, maxStock: 25, unit: 'kg', cost: 8.50, supplier: 'Levaduras SA', lastRestocked: '2024-01-25', expirationDate: '2024-02-15', status: 'low', }, { id: '3', name: 'Mantequilla', category: 'Lácteos', currentStock: 15, minStock: 5, maxStock: 30, unit: 'kg', cost: 5.80, supplier: 'Lácteos Frescos', lastRestocked: '2024-01-24', expirationDate: '2024-02-10', status: 'normal', }, { id: '4', name: 'Azúcar Blanco', category: 'Azúcares', currentStock: 0, minStock: 15, maxStock: 50, unit: 'kg', cost: 0.95, supplier: 'Distribuidora Central', lastRestocked: '2024-01-10', expirationDate: '2024-12-31', status: 'out', }, { id: '5', name: 'Leche Entera', category: 'Lácteos', currentStock: 3, minStock: 10, maxStock: 40, unit: 'L', cost: 1.45, supplier: 'Lácteos Frescos', lastRestocked: '2024-01-22', expirationDate: '2024-01-28', status: 'expired', }, ]; const getInventoryStatusConfig = (item: typeof mockInventoryItems[0]) => { const { currentStock, minStock, status } = item; if (status === 'expired') { return { color: getStatusColor('expired'), text: 'Caducado', icon: AlertTriangle, isCritical: true, isHighlight: false }; } if (currentStock === 0) { return { color: getStatusColor('out'), text: 'Sin Stock', icon: AlertTriangle, isCritical: true, isHighlight: false }; } if (currentStock <= minStock) { return { color: getStatusColor('low'), text: 'Stock Bajo', icon: AlertTriangle, isCritical: false, isHighlight: true }; } return { color: getStatusColor('normal'), text: 'Normal', icon: CheckCircle, isCritical: false, isHighlight: false }; }; const filteredItems = mockInventoryItems.filter(item => { const matchesSearch = item.name.toLowerCase().includes(searchTerm.toLowerCase()) || item.category.toLowerCase().includes(searchTerm.toLowerCase()) || item.supplier.toLowerCase().includes(searchTerm.toLowerCase()); return matchesSearch; }); const lowStockItems = mockInventoryItems.filter(item => item.currentStock <= item.minStock || item.status === 'low' || item.status === 'out' || item.status === 'expired' ); const mockInventoryStats = { totalItems: mockInventoryItems.length, lowStockItems: lowStockItems.length, outOfStock: mockInventoryItems.filter(item => item.currentStock === 0).length, expiringSoon: mockInventoryItems.filter(item => item.status === 'expired').length, totalValue: mockInventoryItems.reduce((sum, item) => sum + (item.currentStock * item.cost), 0), categories: [...new Set(mockInventoryItems.map(item => item.category))].length, }; const inventoryStats = [ { title: 'Total Artículos', value: mockInventoryStats.totalItems, variant: 'default' as const, icon: Package, }, { title: 'Stock Bajo', value: mockInventoryStats.lowStockItems, variant: 'warning' as const, icon: AlertTriangle, }, { title: 'Sin Stock', value: mockInventoryStats.outOfStock, variant: 'error' as const, icon: AlertTriangle, }, { title: 'Por Caducar', value: mockInventoryStats.expiringSoon, variant: 'error' as const, icon: Clock, }, { title: 'Valor Total', value: formatters.currency(mockInventoryStats.totalValue), variant: 'success' as const, icon: DollarSign, }, { title: 'Categorías', value: mockInventoryStats.categories, variant: 'info' as const, icon: Package, }, ]; return (
console.log('Export inventory') }, { id: "new", label: "Nuevo Artículo", variant: "primary" as const, icon: Plus, onClick: () => setShowForm(true) } ]} /> {/* Stats Grid */} {/* Low Stock Alert */} {lowStockItems.length > 0 && ( )} {/* Simplified Controls */}
setSearchTerm(e.target.value)} className="w-full" />
{/* Inventory Items Grid */}
{filteredItems.map((item) => { const statusConfig = getInventoryStatusConfig(item); const stockPercentage = Math.round((item.currentStock / item.maxStock) * 100); const isExpiringSoon = new Date(item.expirationDate) < new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); const isExpired = new Date(item.expirationDate) < new Date(); return ( { setSelectedItem(item); setModalMode('view'); setShowForm(true); } }, { label: 'Editar', icon: Edit, variant: 'outline', onClick: () => { setSelectedItem(item); setModalMode('edit'); setShowForm(true); } } ]} /> ); })}
{/* Empty State */} {filteredItems.length === 0 && (

No se encontraron artículos

Intenta ajustar la búsqueda o agregar un nuevo artículo al inventario

)} {/* Inventory Item Modal */} {showForm && selectedItem && ( { setShowForm(false); setSelectedItem(null); setModalMode('view'); }} mode={modalMode} onModeChange={setModalMode} title={selectedItem.name} subtitle={`${selectedItem.category} - ${selectedItem.supplier}`} statusIndicator={getInventoryStatusConfig(selectedItem)} size="lg" sections={[ { title: 'Información Básica', icon: Package, fields: [ { label: 'Nombre', value: selectedItem.name, highlight: true }, { label: 'Categoría', value: selectedItem.category }, { label: 'Proveedor', value: selectedItem.supplier }, { label: 'Unidad de medida', value: selectedItem.unit } ] }, { title: 'Stock y Niveles', icon: Package, fields: [ { label: 'Stock actual', value: `${selectedItem.currentStock} ${selectedItem.unit}`, highlight: true }, { label: 'Stock mínimo', value: `${selectedItem.minStock} ${selectedItem.unit}` }, { label: 'Stock máximo', value: `${selectedItem.maxStock} ${selectedItem.unit}` }, { label: 'Porcentaje de stock', value: Math.round((selectedItem.currentStock / selectedItem.maxStock) * 100), type: 'percentage', highlight: selectedItem.currentStock <= selectedItem.minStock } ] }, { title: 'Información Financiera', icon: DollarSign, fields: [ { label: 'Costo por unidad', value: selectedItem.cost, type: 'currency' }, { label: 'Valor total en stock', value: selectedItem.currentStock * selectedItem.cost, type: 'currency', highlight: true } ] }, { title: 'Fechas Importantes', icon: Calendar, fields: [ { label: 'Último restock', value: selectedItem.lastRestocked, type: 'date' }, { label: 'Fecha de caducidad', value: selectedItem.expirationDate, type: 'date', highlight: new Date(selectedItem.expirationDate) < new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) } ] } ]} onEdit={() => { console.log('Editing inventory item:', selectedItem.id); }} /> )}
); }; export default InventoryPage;