feat: blindagem de peso em dashboards e kit completo de corte para solda

This commit is contained in:
2026-10-16 19:13:24 -03:00
parent 400be62a0e
commit 9745964837
9 changed files with 173 additions and 87 deletions
+95
View File
@@ -378,6 +378,101 @@ interface InsertApontamentoData {
throw error;
}
// REGRA DO KIT COMPLETO (Passo 3 + Opção 1):
// Se apontou componente no processo de Corte, verificar se todos os componentes da peça pai completaram o kit.
// Se completou, cria automaticamente o apontamento da Peça Principal no Corte (tipo_apontamento = 'peca'),
// computando o peso integral da peça mestre no Corte e liberando-a para a Solda!
if (insertData.tipo_apontamento === 'componente' && insertData.peca_id) {
try {
const procAtual = processos.find(p => p.id === insertData.processo_id);
const isProcessoCorte = procAtual
? (procAtual.nome.toLowerCase().includes('corte') || procAtual.nome.toLowerCase().includes('prepar') || procAtual.ordem === 1)
: true;
if (isProcessoCorte) {
const pecaId = insertData.peca_id;
// 1. Buscar todos os componentes requeridos da peça pai
const { data: compsPeca } = await supabase
.from('componentes_peca')
.select('id, quantidade_por_peca')
.eq('peca_id', pecaId);
// 2. Buscar a peça pai
const { data: pecaPai } = await supabase
.from('pecas')
.select('id, marca, quantidade, of_number')
.eq('id', pecaId)
.single();
if (pecaPai && compsPeca && compsPeca.length > 0) {
// 3. Buscar todos os apontamentos de componentes já feitos para essa peça pai neste processo de corte
const { data: todosAptsComp } = await supabase
.from('apontamentos_producao')
.select('componente_id, quantidade_produzida')
.eq('peca_id', pecaId)
.eq('processo_id', insertData.processo_id)
.eq('tipo_apontamento', 'componente');
const cortadoPorComp = new Map<string, number>();
(todosAptsComp || []).forEach(a => {
if (a.componente_id) {
cortadoPorComp.set(a.componente_id, (cortadoPorComp.get(a.componente_id) || 0) + Number(a.quantidade_produzida || 0));
}
});
let kitsCompletos = Number(pecaPai.quantidade) || 0;
for (const comp of compsPeca) {
const cortado = cortadoPorComp.get(comp.id) || 0;
const porPeca = Number(comp.quantidade_por_peca) || 1;
const kitsDeste = Math.floor(cortado / porPeca);
if (kitsDeste < kitsCompletos) {
kitsCompletos = kitsDeste;
}
}
// 4. Verificar quanto já foi apontado como 'peca' mestre no corte
const { data: aptsPecaJaRegistrados } = await supabase
.from('apontamentos_producao')
.select('quantidade_produzida')
.eq('peca_id', pecaId)
.eq('processo_id', insertData.processo_id)
.eq('tipo_apontamento', 'peca');
const totalPecaJaApontada = (aptsPecaJaRegistrados || []).reduce(
(sum, a) => sum + Number(a.quantidade_produzida || 0), 0
);
// 5. Se há novos kits completos, registrar apontamento da peça mestre no Corte
const qtdLiberar = kitsCompletos - totalPecaJaApontada;
if (qtdLiberar > 0) {
const { error: errPeca } = await supabase
.from('apontamentos_producao')
.insert({
of_number: pecaPai.of_number,
peca_id: pecaPai.id,
processo_id: insertData.processo_id,
tipo_apontamento: 'peca',
quantidade_produzida: qtdLiberar,
data_apontamento: insertData.data_apontamento,
observacoes: `Liberação automática de Kit 100% cortado (${kitsCompletos}/${pecaPai.quantidade} un)`,
created_by: user.id
});
if (!errPeca) {
console.log(`✅ Kit 100% completo! ${qtdLiberar} un da peça mestre ${pecaPai.marca} registradas no Corte.`);
toast.success(`Kit 100% cortado! ${qtdLiberar} un da peça ${pecaPai.marca} liberada(s) para Solda.`);
} else {
console.warn('Aviso ao registrar liberação automática de peça:', errPeca);
}
}
}
}
} catch (kitError) {
console.error('Erro ao verificar regra de kit completo:', kitError);
}
}
console.log('✅ Apontamento criado com sucesso, forçando atualização completa...');
// FORÇA ATUALIZAÇÃO COMPLETA DOS DADOS