fix: cancelamentos — sempre recalcular da array em buildReportHTML/buildPrintHTML/buildConfirmHTML
Build Fechamento de Caixa / build (macos-14, app) (push) Has been cancelled
Build Fechamento de Caixa / build (ubuntu-22.04, deb) (push) Has been cancelled
Build Fechamento de Caixa / build (windows-2022, msi) (push) Has been cancelled

This commit is contained in:
root
2026-07-04 14:35:39 +00:00
parent 5a0126417c
commit 6eb08b6bd4
+14 -11
View File
@@ -1323,12 +1323,13 @@ function buildConfirmHTML(data) {
// Relatório completo — mesmo layout do PDF // Relatório completo — mesmo layout do PDF
const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ','); const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ',');
const fmtNeg = v => (v < 0 ? '-' : '') + 'R$ ' + Math.abs(v || 0).toFixed(2).replace('.', ','); const fmtNeg = v => (v < 0 ? '-' : '') + 'R$ ' + Math.abs(v || 0).toFixed(2).replace('.', ',');
// Cancelamentos: SEMPRE recalcular da array — nunca usar o campo escalar
const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : [];
const cancelamentosCalc = cancelamentos_arr.reduce((s, r) => s + (r.valor || 0), 0);
// Diferença = Total Sistema - Saldo Esperado - Cancelamentos // Diferença = Total Sistema - Saldo Esperado - Cancelamentos
// ⚠️ buildReciboData retorna snake_case (sys_total, total_cancelamentos) // ⚠️ buildReciboData retorna snake_case (sys_total, total_cancelamentos)
// Sempre recalcula para garantir consistência — ignora data.diferenca
const sysTotalCalc = (data.sys_total || data.sysTotal || 0); const sysTotalCalc = (data.sys_total || data.sysTotal || 0);
const saldoEsperadoCalc = (data.saldo_esperado || 0); const saldoEsperadoCalc = (data.saldo_esperado || 0);
const cancelamentosCalc = (data.total_cancelamentos || data.cancelamentos || 0);
const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc; const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc;
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca); const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
const diffOk = diferenca === 0; const diffOk = diferenca === 0;
@@ -1493,16 +1494,21 @@ ${data.observacoes ? `<div class="obs">${data.observacoes}</div>` : ''}
function buildPrintHTML(data) { function buildPrintHTML(data) {
const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ','); const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ',');
const fmtNeg = v => (v < 0 ? '-' : '') + 'R$ ' + Math.abs(v || 0).toFixed(2).replace('.', ','); const fmtNeg = v => (v < 0 ? '-' : '') + 'R$ ' + Math.abs(v || 0).toFixed(2).replace('.', ',');
// Cancelamentos: SEMPRE recalcular da array — nunca usar o campo escalar
const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : [];
const cancelamentosCalc = cancelamentos_arr.reduce((s, r) => s + (r.valor || 0), 0);
// Diferença = Total Sistema - Saldo Esperado - Cancelamentos // Diferença = Total Sistema - Saldo Esperado - Cancelamentos
// ⚠️ buildReciboData retorna snake_case (sys_total, total_cancelamentos) // ⚠️ buildReciboData retorna snake_case (sys_total, total_cancelamentos)
const sysTotalCalc = (data.sys_total || data.sysTotal || 0); const sysTotalCalc = (data.sys_total || data.sysTotal || 0);
const saldoEsperadoCalc = (data.saldo_esperado || 0); const saldoEsperadoCalc = (data.saldo_esperado || 0);
const cancelamentosCalc = (data.total_cancelamentos || data.cancelamentos || 0);
const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc; const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc;
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca); const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d'); const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
// Arrays — support both array-of-objects and flat totals const cartCred_arr = Array.isArray(data.cartoes_credito) ? data.cartoes_credito : [];
const cartDeb_arr = Array.isArray(data.cartoes_debito) ? data.cartoes_debito : [];
const cartAli_arr = Array.isArray(data.cartoes_alimentacao) ? data.cartoes_alimentacao : [];
const cartPix_arr = Array.isArray(data.cartoes_pix) ? data.cartoes_pix : [];
const sangrias_arr = Array.isArray(data.sangrias_arr) ? data.sangrias_arr : []; const sangrias_arr = Array.isArray(data.sangrias_arr) ? data.sangrias_arr : [];
const despesas_arr = Array.isArray(data.despesas_arr) ? data.despesas_arr : []; const despesas_arr = Array.isArray(data.despesas_arr) ? data.despesas_arr : [];
const pixcnpj_arr = Array.isArray(data.pixcnpj_arr) ? data.pixcnpj_arr : []; const pixcnpj_arr = Array.isArray(data.pixcnpj_arr) ? data.pixcnpj_arr : [];
@@ -1511,10 +1517,7 @@ function buildPrintHTML(data) {
const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : []; const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : [];
// Cartoes arrays from estado // Cartoes arrays from estado
const cartCred_arr = Array.isArray(data.cartoes_credito) ? data.cartoes_credito : []; // (cartCred_arr etc. already declared above)
const cartDeb_arr = Array.isArray(data.cartoes_debito) ? data.cartoes_debito : [];
const cartAli_arr = Array.isArray(data.cartoes_alimentacao) ? data.cartoes_alimentacao : [];
const cartPix_arr = Array.isArray(data.cartoes_pix) ? data.cartoes_pix : [];
// Flat totals // Flat totals
const totalSangrias = sangrias_arr.reduce((s,r) => s+(r.retirada||0)+(r.valor||0), 0); const totalSangrias = sangrias_arr.reduce((s,r) => s+(r.retirada||0)+(r.valor||0), 0);
@@ -1728,15 +1731,15 @@ function buildReportHTML(data) {
const vales = data.vales || 0; const vales = data.vales || 0;
const receber = data.areceber || 0; const receber = data.areceber || 0;
const pixcnpj = data.pixcnpj || 0; const pixcnpj = data.pixcnpj || 0;
const cancelamentos = data.cancelamentos || 0; // Cancelamentos: SEMPRE recalcular da array — nunca usar o campo escalar (pode estar corrompido de bug anterior)
const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : [];
const cancelamentosCalc = cancelamentos_arr.reduce((s, r) => s + (r.valor || 0), 0);
const fechamento = data.fechamento || 0; const fechamento = data.fechamento || 0;
const sysTotal = data.sys_total || 0; const sysTotal = data.sys_total || 0;
const saldoEsp = data.saldo_esperado || 0; const saldoEsp = data.saldo_esperado || 0;
// Diferença = Total Sistema - Saldo Esperado - Cancelamentos // Diferença = Total Sistema - Saldo Esperado - Cancelamentos
// Sempre recalcula para garantir consistência
const sysTotalCalc = (data.sys_total || data.sysTotal || 0); const sysTotalCalc = (data.sys_total || data.sysTotal || 0);
const saldoEspCalc = (data.saldo_esperado || 0); const saldoEspCalc = (data.saldo_esperado || 0);
const cancelamentosCalc = (data.total_cancelamentos || data.cancelamentos || 0);
const diferenca = sysTotalCalc - saldoEspCalc - cancelamentosCalc; const diferenca = sysTotalCalc - saldoEspCalc - cancelamentosCalc;
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca); const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
const diffColor = diferenca === 0 ? '#2e7d32' : '#c0272d'; const diffColor = diferenca === 0 ? '#2e7d32' : '#c0272d';