import React, { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog'; import { Plus, Search, Filter, Truck, Package, Calendar, FileText, Edit, Eye, Menu, X } from 'lucide-react'; import { RomaneioTable } from '@/components/expedicao/RomaneioTable'; import { RomaneioForm } from '@/components/expedicao/RomaneioForm'; import { ItensRomaneioModal } from '@/components/expedicao/ItensRomaneioModal'; import { useRomaneios, useCriarRomaneio, useAtualizarRomaneio } from '@/hooks/useRomaneios'; import { useRemoverRomaneio } from '@/hooks/useRemoverRomaneio'; import { useOFsAtivas } from '@/hooks/useOFsAtivas'; import { useMobileResponsive } from '@/hooks/useMobileResponsive'; import { RomaneioExpedicao } from '@/hooks/useRomaneios'; import { RelatoriosExpedicao } from '@/components/expedicao/RelatoriosExpedicao'; import { usePermissions } from '@/hooks/usePermissions'; import { toast } from 'sonner'; const Expedicao = () => { const { canRegra } = usePermissions(); const { isMobile } = useMobileResponsive(); const { data: romaneios, isLoading, refetch } = useRomaneios(); const { data: ofsAtivas, isLoading: isLoadingOFs } = useOFsAtivas(); const criarRomaneioMutation = useCriarRomaneio(); const atualizarRomaneioMutation = useAtualizarRomaneio(); const removerRomaneioMutation = useRemoverRomaneio(); const [activeTab, setActiveTab] = useState('romaneios'); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const [pecaFilter, setPecaFilter] = useState(''); const [showMobileFilters, setShowMobileFilters] = useState(false); const [showRomaneioForm, setShowRomaneioForm] = useState(false); const [showItensModal, setShowItensModal] = useState(false); const [selectedRomaneio, setSelectedRomaneio] = useState(null); const [romaneioToDelete, setRomaneioToDelete] = useState(null); // Memorizar última OF visualizada const [ofFilter, setOfFilter] = useState(() => { const saved = localStorage.getItem('expedicao-last-of-filter'); return saved || 'all'; }); // Salvar OF selecionada no localStorage useEffect(() => { if (ofFilter !== 'all') { localStorage.setItem('expedicao-last-of-filter', ofFilter); } }, [ofFilter]); const filteredRomaneios = romaneios?.filter(romaneio => { const matchesSearch = romaneio.numero_romaneio?.toLowerCase().includes(searchTerm.toLowerCase()) || romaneio.of_number?.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === 'all' || romaneio.status === statusFilter; const matchesOF = ofFilter === 'all' || romaneio.of_number === ofFilter; const matchesPeca = !pecaFilter || romaneio.itens_pecas?.some(item => item.marca?.toLowerCase().includes(pecaFilter.toLowerCase()) ); return matchesSearch && matchesStatus && matchesOF && matchesPeca; }); const stats = { total: filteredRomaneios?.length || 0, planejamento: filteredRomaneios?.filter(r => r.status === 'Em planejamento').length || 0, entregue: filteredRomaneios?.filter(r => r.status === 'Entregue').length || 0, conferidoEmObra: filteredRomaneios?.filter(r => r.status === 'Conferido em Obra').length || 0, }; // Calcular peso total dos romaneios filtrados const totalPesoFiltrado = filteredRomaneios?.reduce((sum, romaneio) => sum + (romaneio.peso_total_romaneio || 0), 0) || 0; const ofNumbers = ofsAtivas?.map(of => of.of_number) || []; const uniqueOFs = [...new Set(romaneios?.map(r => r.of_number) || [])]; const handleEdit = (romaneio: RomaneioExpedicao) => { setSelectedRomaneio(romaneio); setShowRomaneioForm(true); }; const handleView = (romaneio: RomaneioExpedicao) => { setSelectedRomaneio(romaneio); setShowItensModal(true); }; const handleDelete = (romaneioId: string) => { setRomaneioToDelete(romaneioId); }; const confirmDelete = async () => { if (!canRegra('exp_cancelar_estornar')) { toast.error('Atenção: Você não possui permissão para cancelar ou estornar romaneios de expedição.'); return; } if (romaneioToDelete) { try { await removerRomaneioMutation.mutateAsync(romaneioToDelete); setRomaneioToDelete(null); refetch(); } catch (error) { console.error('Error deleting romaneio:', error); } } }; // Função de print simplificada (removida a lógica de PDF) const handlePrint = (romaneio: RomaneioExpedicao) => { // A funcionalidade de impressão agora é tratada pelo RomaneioReportModal console.log('Print function called for romaneio:', romaneio.numero_romaneio); }; const handleSaveRomaneio = async (data: any) => { try { if (selectedRomaneio) { // Atualizando romaneio existente await atualizarRomaneioMutation.mutateAsync({ id: selectedRomaneio.id, ...data }); } else { // Criando novo romaneio await criarRomaneioMutation.mutateAsync(data); } setShowRomaneioForm(false); setSelectedRomaneio(null); refetch(); } catch (error) { console.error('Error saving romaneio:', error); } }; const handleCancelRomaneio = () => { setShowRomaneioForm(false); setSelectedRomaneio(null); }; const handleCloseItensModal = () => { setShowItensModal(false); setSelectedRomaneio(null); }; const MobileRomaneioCard = ({ romaneio }: { romaneio: any }) => (
#{romaneio.numero_romaneio} {romaneio.status === 'Em planejamento' ? 'Em planejamento' : romaneio.status === 'Confirmado' ? 'Entregue' : romaneio.status === 'Conferido em Obra' ? 'Conferido em Obra' : romaneio.status}
OF: {romaneio.of_number || 'N/A'}
Transporte: {romaneio.tipo_transporte || 'N/A'}
Data: {romaneio.data_criacao ? new Date(romaneio.data_criacao).toLocaleDateString('pt-BR') : 'N/A' }
Peso: {romaneio.peso_total_romaneio || 0} kg
); const MobileFilters = () => (
setSearchTerm(e.target.value)} className="pl-10" />
setPecaFilter(e.target.value)} />
); if (isLoading || isLoadingOFs) { return (
{[...Array(4)].map((_, i) => (
))}
); } return (
{/* Header */}

Expedição

{isMobile && ( Filtros Filtre os romaneios por diversos critérios )} {canRegra('exp_criar_romaneio') && ( )}
{/* Stats Cards */}
Total de Romaneios
{stats.total}
Em planejamento
{stats.planejamento}
Entregue
{stats.entregue}
Conferido em Obra
{stats.conferidoEmObra}
Romaneios Relatórios {/* Desktop Filters */} {!isMobile && (
setSearchTerm(e.target.value)} className="pl-10" />
setPecaFilter(e.target.value)} className="max-w-xs" />
)} {/* Content */} {isMobile ? (
{filteredRomaneios && filteredRomaneios.length > 0 ? ( filteredRomaneios.map((romaneio) => ( )) ) : (

Nenhum romaneio encontrado.

)}
) : (
{/* Info header with counts and total weight */}

Romaneios de Expedição

{filteredRomaneios?.length || 0} {(filteredRomaneios?.length || 0) === 1 ? 'romaneio' : 'romaneios'} Peso Total: {totalPesoFiltrado.toFixed(2)} kg
)}
{/* Modals */} {showItensModal && selectedRomaneio && ( )} {/* Delete Confirmation Dialog */} setRomaneioToDelete(null)}> Confirmar Exclusão Tem certeza que deseja excluir este romaneio? Esta ação não pode ser desfeita. Cancelar {removerRomaneioMutation.isPending ? 'Excluindo...' : 'Excluir'}
); }; export default Expedicao;