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 += ` 50 `; } // Quadrados com "10" for (let i = 0; i < qtd10; i++) { boxesHtml += ` 10 `; } // Quadrados com "5" for (let i = 0; i < qtd5; i++) { boxesHtml += ` 5 `; } // 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 += `

${getPrioridadeNome(codigo)}

`; // Gerar linhas de itens (3 por linha) for (let i = 0; i < Math.ceil(itens.length / 3); i++) { const bgColorClass = i % 2 !== 0 ? 'bg-gray-50/70' : 'bg-white'; const rowItems = itens.slice(i * 3, (i + 1) * 3); itemsContent += `
`; rowItems.forEach((item) => { const quantidade = item.quantidade_priorizada; const marca = item.peca?.marca || 'N/A'; const temComponentes = item.peca?.tem_componentes; const infoType = temComponentes ? '(C/M)' : '(S/M)'; const tickBoxes = generateTickBoxesHTML(quantidade); itemsContent += `
${marca} (${quantidade}) ${infoType} ${tickBoxes}
Data/Operador:
`; }); // Preencher células vazias se necessário for (let j = rowItems.length; j < 3; j++) { itemsContent += `
`; } itemsContent += `
`; } itemsContent += `
`; }); // HTML completo seguindo exatamente o modelo fornecido const printContent = ` Checklist de Produção por Prioridade

Checklist de Produção

Formulário para apontamento da fabricação.

Data de Emissão: ${dataAtual} Rev. ${revisaoParaImprimir}

Ordem de Fabricação (OF)

${ofSelecionada}

Fase

${faseSelecionada}

PROCESSO

Corte
Solda
Pintura
Expedição
Legenda: Marca (Qtd) (S/M) = Sem Montagem (borda tracejada), (C/M) = Com Montagem (borda contínua). Os quadrados indicam o controle de peças (quadrados com número = lotes de 50, 10 ou 5 unidades; vazios = 1 unidade).
${itemsContent}
`; printWindow.document.write(printContent); printWindow.document.close(); toast.success('Relatório enviado para impressão'); } catch (error) { console.error('Erro ao imprimir:', error); toast.error('Erro ao imprimir o relatório'); } }; return (
{/* Filtros de Visualização */} {/* Header com resumo e ações */}
Total de Peças: {calcularTotalPecas()}
Peso Total: {calcularPesoTotal().toFixed(1)} kg
{versaoAtual && (
Revisão: {versaoAtual.revisao}
)}
{/* Componente Kanban */} {loading ? (
) : ofSelecionada && faseSelecionada ? ( ) : (

Selecione uma OF e Fase nos filtros acima para visualizar o Kanban de prioridades.

)} {/* Modais */} setShowPecaSelector(false)} onAddPecas={handleAddPecas} /> setShowPrioridadesPDF(false)} itensPorPrioridade={itensPorPrioridade} ofSelecionada={ofSelecionada} faseSelecionada={faseSelecionada} versaoAtual={versaoAtual} onIncrementarRevisao={incrementarRevisao} />
); }; export default PrioridadesFabricacao;