diff --git a/src/components/apontamento/kits/MapaTermicoKitsView.tsx b/src/components/apontamento/kits/MapaTermicoKitsView.tsx index 339b752..8cb651b 100644 --- a/src/components/apontamento/kits/MapaTermicoKitsView.tsx +++ b/src/components/apontamento/kits/MapaTermicoKitsView.tsx @@ -20,7 +20,7 @@ import { Scissors } from 'lucide-react'; import { useKitsProducao, PecaKitInfo } from '@/hooks/useKitsProducao'; -import { useOFs } from '@/hooks/useOFs'; +import { useOFsAtivas, OFAtiva } from '@/hooks/useOFsAtivas'; interface MapaTermicoKitsViewProps { initialOF?: string; @@ -35,8 +35,8 @@ export const MapaTermicoKitsView: React.FC = ({ readOnlyOF = false, onSelectPecaParaApontar, }) => { - const { ofs, loading: loadingOFs } = useOFs(); - const [selectedOF, setSelectedOF] = useState(initialOF || (ofs[0]?.of_number || '')); + const { ofsAtivas, isLoading: loadingOFs } = useOFsAtivas(); + const [selectedOF, setSelectedOF] = useState(initialOF || ''); const [selectedFase, setSelectedFase] = useState(initialFase); const [busca, setBusca] = useState(''); const [filtroStatus, setFiltroStatus] = useState<'todos' | 'liberados' | 'parciais' | 'travados'>('todos'); @@ -44,18 +44,20 @@ export const MapaTermicoKitsView: React.FC = ({ // Atualizar OF padrão se carregar depois React.useEffect(() => { - if (!selectedOF && ofs.length > 0) { - setSelectedOF(ofs[0].of_number); + if (initialOF) { + setSelectedOF(initialOF); + } else if (!selectedOF && ofsAtivas.length > 0) { + setSelectedOF(ofsAtivas[0].of_number); } - }, [ofs, selectedOF]); + }, [initialOF, ofsAtivas, selectedOF]); - const { listaKits, resumoKits, loading, refetch } = useKitsProducao(selectedOF, selectedFase); + const { listaKits, resumoKits, loading, refetch } = useKitsProducao(selectedOF); - // Extrair fases únicas da lista de kits carregada + // Extrair fases únicas da lista de kits carregada de toda a OF const fasesDisponiveis = useMemo(() => { const s = new Set(); listaKits.forEach((k) => { - if (k.etapa_fase) s.add(k.etapa_fase); + if (k.etapa_fase && k.etapa_fase.trim()) s.add(k.etapa_fase.trim()); }); return Array.from(s).sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' })); }, [listaKits]); @@ -81,9 +83,14 @@ export const MapaTermicoKitsView: React.FC = ({ setPecasExpandidas(new Set()); }; - // Filtragem + // Filtragem combinada (Fase + Status + Busca textual) const pecasFiltradas = useMemo(() => { return listaKits.filter((item) => { + // Filtro de fase + if (selectedFase && selectedFase !== 'all' && selectedFase !== 'todas') { + if (item.etapa_fase !== selectedFase) return false; + } + // Filtro de status if (filtroStatus === 'liberados') { if (item.kits_completos_cortados <= 0) return false; @@ -111,7 +118,41 @@ export const MapaTermicoKitsView: React.FC = ({ return true; }); - }, [listaKits, filtroStatus, busca]); + }, [listaKits, selectedFase, filtroStatus, busca]); + + // KPIs calculados com base nas peças filtradas + const resumoExibido = useMemo(() => { + let total100 = 0; + let totalParciais = 0; + let totalTravados = 0; + let pesoTot = 0; + let pesoCort = 0; + let unTot = 0; + let unLib = 0; + + pecasFiltradas.forEach((item) => { + unTot += item.quantidade_total; + unLib += item.kits_completos_cortados; + pesoTot += item.peso_total_componentes; + pesoCort += item.peso_cortado_componentes; + + if (item.status_termico === 'verde') total100++; + else if (item.status_termico === 'verde_parcial' || item.status_termico === 'amarelo') totalParciais++; + else totalTravados++; + }); + + return { + totalPecas: pecasFiltradas.length, + totalKits100Porcento: total100, + totalKitsParciais: totalParciais, + totalKitsNaoIniciados: totalTravados, + pesoTotalOFKg: pesoTot, + pesoCortadoTotalKg: pesoCort, + percentualGeralOF: pesoTot > 0 ? Math.min(100, Math.round((pesoCort / pesoTot) * 100)) : 0, + totalUnidadesTotal: unTot, + totalUnidadesLiberadasSolda: unLib, + }; + }, [pecasFiltradas]); return (
@@ -159,14 +200,23 @@ export const MapaTermicoKitsView: React.FC = ({ OF {selectedOF}
) : ( - { + setSelectedOF(val); + setSelectedFase('all'); + }} + disabled={loadingOFs} + > - + + {selectedOF ? `OF ${selectedOF}` : undefined} + - - {ofs.map((o) => ( - - OF {o.of_number} {o.cliente ? `• ${o.cliente}` : ''} + + {ofsAtivas.map((o) => ( + + OF {o.of_number} {o.cliente ? `• ${o.cliente}` : o.descricao_resumida ? `• ${o.descricao_resumida}` : ''} ))} @@ -214,7 +264,7 @@ export const MapaTermicoKitsView: React.FC = ({ {/* ──────────────── Cards de KPIs do Mapa Térmico ──────────────── */} - {resumoKits && ( + {resumoExibido && (
{/* KPI 1: 100% Liberadas */}
@@ -223,7 +273,7 @@ export const MapaTermicoKitsView: React.FC = ({ 100% Liberadas
- {resumoKits.totalKits100Porcento} + {resumoExibido.totalKits100Porcento}
peças com todos os kits cortados @@ -241,7 +291,7 @@ export const MapaTermicoKitsView: React.FC = ({ Unidades Liberadas
- {resumoKits.totalUnidadesLiberadasSolda} / {resumoKits.totalUnidadesTotal} un + {resumoExibido.totalUnidadesLiberadasSolda} / {resumoExibido.totalUnidadesTotal} un
kits prontos na bancada de solda @@ -259,7 +309,7 @@ export const MapaTermicoKitsView: React.FC = ({ Corte em Andamento
- {resumoKits.totalKitsParciais} + {resumoExibido.totalKitsParciais}
kits parciais (prioridade de corte) @@ -277,7 +327,7 @@ export const MapaTermicoKitsView: React.FC = ({ Não Iniciados
- {resumoKits.totalKitsNaoIniciados} + {resumoExibido.totalKitsNaoIniciados}
sem nenhum componente cortado