import React, { useState, useMemo } from 'react'; import { StandardPageLayout } from '@/components/layout/StandardPageLayout'; import { KanbanPrioridadesFabricacao } from '@/components/prioridades/KanbanPrioridadesFabricacao'; import { PecaSelectorModal } from '@/components/prioridades/PecaSelectorModal'; import { PrioridadesPDF } from '@/components/prioridades/PrioridadesPDF'; import { FiltrosVisualizacao } from '@/components/prioridades/FiltrosVisualizacao'; import { useItensPrioridadeFabricacaoFiltrado } from '@/hooks/useItensPrioridadeFabricacaoFiltrado'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Plus, FileText, RefreshCw, Printer, X } from 'lucide-react'; import { toast } from 'sonner'; const PrioridadesFabricacao = () => { const { itensPorPrioridade, loading, atualizarQuantidade, removerItem, removerItensPorPrioridade, transferirItem, reorderItems, refetch, ofSelecionada, faseSelecionada, versaoAtual, onFiltroChange, incrementarRevisao, resetarRevisao } = useItensPrioridadeFabricacaoFiltrado(); const [showPecaSelector, setShowPecaSelector] = useState(false); const [showPrioridadesPDF, setShowPrioridadesPDF] = useState(false); // Construir título dinâmico const tituloCompleto = useMemo(() => { if (ofSelecionada && faseSelecionada) { return `Prioridades de Fabricação - OF: ${ofSelecionada} - FASE: ${faseSelecionada}`; } return 'Prioridades de Fabricação'; }, [ofSelecionada, faseSelecionada]); const calcularTotalPecas = () => { return Object.values(itensPorPrioridade).reduce((total, itens) => total + itens.length, 0); }; const calcularPesoTotal = () => { return Object.values(itensPorPrioridade).reduce((total, itens) => { return total + itens.reduce((pesoItens, item) => pesoItens + (item.peso_total || 0), 0); }, 0); }; const handleAddPecas = async () => { await refetch(); }; const handleResetarRevisao = async () => { if (!ofSelecionada || !faseSelecionada) return; if (window.confirm(`Deseja resetar o número de revisão desta lista de prioridades (OF: ${ofSelecionada} - Fase: ${faseSelecionada}) para 0?`)) { await resetarRevisao(0); } }; const generateTickBoxesHTML = (quantity: number): string => { if (!quantity || quantity <= 0) return ''; let qtd50 = 0; let qtd10 = 0; let qtd5 = 0; let qtd1 = 0; if (quantity <= 10) { qtd1 = quantity; } else if (quantity <= 50) { qtd5 = Math.floor(quantity / 5); qtd1 = quantity % 5; } else if (quantity <= 100) { qtd10 = Math.floor(quantity / 10); const resto10 = quantity % 10; qtd5 = Math.floor(resto10 / 5); qtd1 = resto10 % 5; } else { // Acima de 100 unidades qtd50 = Math.floor(quantity / 50); const resto50 = quantity % 50; qtd10 = Math.floor(resto50 / 10); const resto10 = resto50 % 10; qtd5 = Math.floor(resto10 / 5); qtd1 = resto10 % 5; } let boxesHtml = ''; // Quadrados com "50" for (let i = 0; i < qtd50; i++) { boxesHtml += ` `; } // Quadrados com "10" for (let i = 0; i < qtd10; i++) { boxesHtml += ` `; } // Quadrados com "5" for (let i = 0; i < qtd5; i++) { boxesHtml += ` `; } // Quadrados unitários (vazios) for (let i = 0; i < qtd1; i++) { boxesHtml += ` `; } return `${boxesHtml}`; }; const handleImprimirRelatorio = async () => { if (!ofSelecionada || !faseSelecionada) { toast.error('Selecione uma OF e Fase para imprimir o relatório'); return; } let revisaoParaImprimir = versaoAtual?.revisao || 0; const querSubir = window.confirm( `Deseja incrementar a revisão para Rev. ${(versaoAtual?.revisao || 0) + 1} para esta impressão?\n\n- Clique em OK para subir a revisão para Rev. ${(versaoAtual?.revisao || 0) + 1}\n- Clique em Cancelar para manter a revisão atual (Rev. ${versaoAtual?.revisao || 0})` ); if (querSubir) { const sucesso = await incrementarRevisao(); if (sucesso) { revisaoParaImprimir += 1; } } try { // Criar nova janela para impressão const printWindow = window.open('', '_blank'); if (!printWindow) { throw new Error('Não foi possível abrir janela de impressão'); } // Obter data atual formatada const dataAtual = new Date().toLocaleDateString('pt-BR'); // Gerar conteúdo dos itens por prioridade let itemsContent = ''; ['P1', 'P2', 'P3', 'P4'].forEach((codigo, priorityIndex) => { const itens = itensPorPrioridade[codigo] || []; if (itens.length === 0) return; const getPrioridadeNome = (codigo: string) => { switch (codigo) { case 'P1': return 'Prioridade P1 - Urgente'; case 'P2': return 'Prioridade P2 - Alta'; case 'P3': return 'Prioridade P3 - Média'; case 'P4': return 'Prioridade P4 - Baixa'; default: return 'Desconhecida'; } }; const getCoresPrioridade = (codigo: string) => { switch (codigo) { case 'P1': return 'text-red-700 bg-red-100 border-red-300'; case 'P2': return 'text-orange-700 bg-orange-100 border-orange-300'; case 'P3': return 'text-blue-700 bg-blue-100 border-blue-300'; case 'P4': return 'text-gray-700 bg-gray-200 border-gray-300'; default: return 'text-gray-700 bg-gray-200 border-gray-300'; } }; itemsContent += `
Formulário para apontamento da fabricação.
Data de Emissão: ${dataAtual} Rev. ${revisaoParaImprimir}
Ordem de Fabricação (OF)
${ofSelecionada}
Fase
${faseSelecionada}
PROCESSO
Selecione uma OF e Fase nos filtros acima para visualizar o Kanban de prioridades.