feat: blindagem de peso em dashboards e kit completo de corte para solda
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user