import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Package, Plus, MoreVertical, Eye, CheckCircle, XCircle, Calendar, RefreshCw, Search, Truck, ClipboardList, } from 'lucide-react'; import { Button } from '@components/atoms/Button'; import { Card, CardHeader, CardTitle, CardContent } from '@components/molecules/Card'; import { DataTable, type Column } from '@components/organisms/DataTable'; import { Dropdown, type DropdownItem } from '@components/organisms/Dropdown'; import { Breadcrumbs } from '@components/organisms/Breadcrumbs'; import { ConfirmModal } from '@components/organisms/Modal'; import { NoDataEmptyState, ErrorEmptyState } from '@components/templates/EmptyState'; import { usePurchaseReceipts } from '@features/purchases/hooks'; import type { PurchaseReceipt } from '@features/purchases/types'; import { formatDate } from '@utils/formatters'; type ReceiptStatus = 'draft' | 'done' | 'cancelled'; const statusLabels: Record = { draft: 'Borrador', done: 'Completado', cancelled: 'Cancelado', }; const statusColors: Record = { draft: 'bg-gray-100 text-gray-700', done: 'bg-green-100 text-green-700', cancelled: 'bg-red-100 text-red-700', }; // Helper function to get current date const getToday = (): string => { const today = new Date().toISOString().split('T')[0]; return today || ''; }; export function PurchaseReceiptsPage() { const navigate = useNavigate(); const [selectedStatus, setSelectedStatus] = useState(''); const [searchTerm, setSearchTerm] = useState(''); const [dateFrom, setDateFrom] = useState(''); const [dateTo, setDateTo] = useState(''); const [receiptToConfirm, setReceiptToConfirm] = useState(null); const [receiptToCancel, setReceiptToCancel] = useState(null); const { receipts, total, page, totalPages, isLoading, error, setPage, refresh, confirmReceipt, cancelReceipt, } = usePurchaseReceipts({ status: selectedStatus || undefined, search: searchTerm || undefined, dateFrom: dateFrom || undefined, dateTo: dateTo || undefined, limit: 20, }); const getActionsMenu = (receipt: PurchaseReceipt): DropdownItem[] => { const items: DropdownItem[] = [ { key: 'view', label: 'Ver detalle', icon: , onClick: () => navigate(`/purchases/receipts/${receipt.id}`), }, ]; if (receipt.status === 'draft') { items.push({ key: 'confirm', label: 'Validar recepcion', icon: , onClick: () => setReceiptToConfirm(receipt), }); items.push({ key: 'cancel', label: 'Cancelar', icon: , danger: true, onClick: () => setReceiptToCancel(receipt), }); } return items; }; const columns: Column[] = [ { key: 'receiptNumber', header: 'Recepcion', render: (receipt) => (
{receipt.receiptNumber}
OC: {receipt.purchaseOrderName || receipt.purchaseOrderId}
), }, { key: 'partner', header: 'Proveedor', render: (receipt) => (
{receipt.partnerName || receipt.partnerId}
), }, { key: 'date', header: 'Fecha Recepcion', sortable: true, render: (receipt) => ( {formatDate(receipt.receiptDate, 'short')} ), }, { key: 'items', header: 'Productos', render: (receipt) => (
{receipt.lines?.length || 0} lineas
), }, { key: 'status', header: 'Estado', render: (receipt) => ( {statusLabels[receipt.status]} ), }, { key: 'actions', header: '', render: (receipt) => ( } items={getActionsMenu(receipt)} align="right" /> ), }, ]; const handleConfirm = async () => { if (receiptToConfirm) { await confirmReceipt(receiptToConfirm.id); setReceiptToConfirm(null); } }; const handleCancel = async () => { if (receiptToCancel) { await cancelReceipt(receiptToCancel.id); setReceiptToCancel(null); } }; // Calculate summary stats const draftCount = receipts.filter(r => r.status === 'draft').length; const doneCount = receipts.filter(r => r.status === 'done').length; const todayReceipts = receipts.filter(r => r.receiptDate === getToday()).length; const totalItems = receipts.reduce((sum, r) => sum + (r.lines?.length || 0), 0); if (error) { return (
); } return (

Recepciones de Compra

Registra y valida la recepcion de productos de proveedores

{/* Summary Stats */}
setSelectedStatus('draft')}>
Pendientes
{draftCount}
setSelectedStatus('done')}>
Completadas
{doneCount}
Hoy
{todayReceipts}
Items Recibidos
{totalItems}
Lista de Recepciones
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full rounded-md border border-gray-300 py-2 pl-10 pr-4 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500" />
setDateFrom(e.target.value)} className="rounded-md border border-gray-300 px-3 py-2 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500" /> - setDateTo(e.target.value)} className="rounded-md border border-gray-300 px-3 py-2 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500" />
{(selectedStatus || searchTerm || dateFrom || dateTo) && ( )}
{/* Table */} {receipts.length === 0 && !isLoading ? ( ) : ( )}
{/* Confirm Receipt Modal */} setReceiptToConfirm(null)} onConfirm={handleConfirm} title="Validar recepcion" message={`¿Validar la recepcion ${receiptToConfirm?.receiptNumber}? Esto actualizara el inventario.`} variant="success" confirmText="Validar" /> {/* Cancel Receipt Modal */} setReceiptToCancel(null)} onConfirm={handleCancel} title="Cancelar recepcion" message={`¿Cancelar la recepcion ${receiptToCancel?.receiptNumber}? Esta accion no se puede deshacer.`} variant="danger" confirmText="Cancelar recepcion" />
); } export default PurchaseReceiptsPage;