diff --git a/src/components/producao/RelatorioPecasProcessoModal.tsx b/src/components/producao/RelatorioPecasProcessoModal.tsx index 83bd376..07f3ce0 100644 --- a/src/components/producao/RelatorioPecasProcessoModal.tsx +++ b/src/components/producao/RelatorioPecasProcessoModal.tsx @@ -26,18 +26,37 @@ export const RelatorioPecasProcessoModal: React.FC peca.etapa_fase === selectedFase); + const pecasFiltradas = useMemo(() => { + return selectedFase === 'todas' + ? pecasComStatus + : pecasComStatus.filter(peca => peca.etapa_fase === selectedFase); + }, [selectedFase, pecasComStatus]); - // Recalcular estatísticas para as peças filtradas - const estatisticasFiltradas = { - totalPecas: pecasFiltradas.length, - pesoTotalCorte: pecasFiltradas.filter(p => p.processos.corte).reduce((sum, p) => sum + p.peso_total, 0), - pesoTotalSolda: pecasFiltradas.filter(p => p.processos.solda).reduce((sum, p) => sum + p.peso_total, 0), - pesoTotalPintura: pecasFiltradas.filter(p => p.processos.pintura).reduce((sum, p) => sum + p.peso_total, 0), - pesoTotalExpedicao: pecasFiltradas.filter(p => p.processos.expedicao).reduce((sum, p) => sum + p.peso_total, 0) - }; + // Recalcular estatísticas para as peças filtradas com o peso real apontado + const estatisticasFiltradas = useMemo(() => { + if (selectedFase === 'todas' && dashboardData?.processos && dashboardData.processos.length > 0) { + const pCorte = dashboardData.processos.find(p => p.nome.toLowerCase().includes('corte')); + const pSolda = dashboardData.processos.find(p => p.nome.toLowerCase().includes('solda')); + const pPintura = dashboardData.processos.find(p => p.nome.toLowerCase().includes('pint') || p.nome.toLowerCase().includes('galv')); + const pExp = dashboardData.processos.find(p => p.nome.toLowerCase().includes('exped')); + + return { + totalPecas: pecasFiltradas.length, + pesoTotalCorte: pCorte?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.corte || 0), 0), + pesoTotalSolda: pSolda?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.solda || 0), 0), + pesoTotalPintura: pPintura?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.pintura || 0), 0), + pesoTotalExpedicao: pExp?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.expedicao || 0), 0) + }; + } + + return { + totalPecas: pecasFiltradas.length, + pesoTotalCorte: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.corte || 0), 0), + pesoTotalSolda: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.solda || 0), 0), + pesoTotalPintura: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.pintura || 0), 0), + pesoTotalExpedicao: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.expedicao || 0), 0) + }; + }, [selectedFase, dashboardData, pecasFiltradas]); // Calcular percentual de progresso conforme índices da tela de Dashboard de Produção const percentuais = useMemo(() => { diff --git a/src/hooks/useRelatorioPecasProcesso.tsx b/src/hooks/useRelatorioPecasProcesso.tsx index 180cafd..275f0d3 100644 --- a/src/hooks/useRelatorioPecasProcesso.tsx +++ b/src/hooks/useRelatorioPecasProcesso.tsx @@ -24,6 +24,12 @@ export interface PecaComStatus { pintura?: string | null; expedicao?: string | null; }; + pesoApontado?: { + corte: number; + solda: number; + pintura: number; + expedicao: number; + }; } export interface ResumoProcesso { @@ -154,9 +160,12 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => { console.log('Apontamentos encontrados:', apontamentosData.length); - // Mapear status dos processos por peça e guardar a ÚLTIMA data apontada de cada processo + // Mapear status dos processos por peça, guardar a ÚLTIMA data apontada e o PESO APONTADO REAL de cada processo const statusPorPeca = new Map>(); const datasPorPeca = new Map(); + const pesosPorPeca = new Map(); + + const mapaPecas = new Map(pecasData.map(p => [p.id, p])); apontamentosData.forEach(apt => { if (!statusPorPeca.has(apt.peca_id)) { @@ -168,20 +177,33 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => { if (!datasPorPeca.has(apt.peca_id)) { datasPorPeca.set(apt.peca_id, { corte: '', solda: '', pintura: '', expedicao: '' }); } + if (!pesosPorPeca.has(apt.peca_id)) { + pesosPorPeca.set(apt.peca_id, { corte: 0, solda: 0, pintura: 0, expedicao: 0 }); + } + const datas = datasPorPeca.get(apt.peca_id)!; + const pesos = pesosPorPeca.get(apt.peca_id)!; + + const pecaInfo = mapaPecas.get(apt.peca_id); + const pesoUnitario = Number(pecaInfo?.peso_unitario || 0); + const qtdApontada = Number(apt.quantidade_produzida || 0); + const pesoCalculado = pesoUnitario * qtdApontada; + const dataApt = apt.data_apontamento || apt.created_at || ''; const nomeLower = nomeProc.toLowerCase(); - if (dataApt) { - if (nomeLower.includes('corte')) { - if (!datas.corte || dataApt > datas.corte) datas.corte = dataApt; - } else if (nomeLower.includes('solda')) { - if (!datas.solda || dataApt > datas.solda) datas.solda = dataApt; - } else if (nomeLower.includes('pint') || nomeLower.includes('galv')) { - if (!datas.pintura || dataApt > datas.pintura) datas.pintura = dataApt; - } else if (nomeLower.includes('exped')) { - if (!datas.expedicao || dataApt > datas.expedicao) datas.expedicao = dataApt; - } + if (nomeLower.includes('corte')) { + pesos.corte += pesoCalculado; + if (dataApt && (!datas.corte || dataApt > datas.corte)) datas.corte = dataApt; + } else if (nomeLower.includes('solda')) { + pesos.solda += pesoCalculado; + if (dataApt && (!datas.solda || dataApt > datas.solda)) datas.solda = dataApt; + } else if (nomeLower.includes('pint') || nomeLower.includes('galv')) { + pesos.pintura += pesoCalculado; + if (dataApt && (!datas.pintura || dataApt > datas.pintura)) datas.pintura = dataApt; + } else if (nomeLower.includes('exped')) { + pesos.expedicao += pesoCalculado; + if (dataApt && (!datas.expedicao || dataApt > datas.expedicao)) datas.expedicao = dataApt; } }); @@ -197,7 +219,16 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => { if (!datasPorPeca.has(pecaAlvo.id)) { datasPorPeca.set(pecaAlvo.id, { corte: '', solda: '', pintura: '', expedicao: '' }); } + if (!pesosPorPeca.has(pecaAlvo.id)) { + pesosPorPeca.set(pecaAlvo.id, { corte: 0, solda: 0, pintura: 0, expedicao: 0 }); + } + const datas = datasPorPeca.get(pecaAlvo.id)!; + const pesos = pesosPorPeca.get(pecaAlvo.id)!; + const pesoUnitario = Number(pecaAlvo.peso_unitario || 0); + const qtdExp = Number(item.quantidade_expedida || 0); + pesos.expedicao += pesoUnitario * qtdExp; + const dataExp = item.romaneios_expedicao?.data_saida || item.romaneios_expedicao?.data_emissao || item.romaneios_expedicao?.created_at || @@ -208,10 +239,11 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => { } }); - // Construir array de peças com status e última data apontada + // Construir array de peças com status, última data apontada e peso apontado const pecasComStatusFormatadas: PecaComStatus[] = pecasData.map(peca => { const processosRealizados = statusPorPeca.get(peca.id) || new Set(); const datas = datasPorPeca.get(peca.id) || { corte: '', solda: '', pintura: '', expedicao: '' }; + const pesos = pesosPorPeca.get(peca.id) || { corte: 0, solda: 0, pintura: 0, expedicao: 0 }; return { id: peca.id, @@ -235,6 +267,12 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => { solda: formatarDiaMes(datas.solda), pintura: formatarDiaMes(datas.pintura), expedicao: formatarDiaMes(datas.expedicao) + }, + pesoApontado: { + corte: Number(pesos.corte.toFixed(2)), + solda: Number(pesos.solda.toFixed(2)), + pintura: Number(pesos.pintura.toFixed(2)), + expedicao: Number(pesos.expedicao.toFixed(2)) } }; });