diff --git a/src/index.html b/src/index.html
index 3740db3..1339780 100644
--- a/src/index.html
+++ b/src/index.html
@@ -1323,12 +1323,13 @@ function buildConfirmHTML(data) {
// Relatório completo — mesmo layout do PDF
const fmt = v => 'R$ ' + (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
// ⚠️ 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 saldoEsperadoCalc = (data.saldo_esperado || 0);
- const cancelamentosCalc = (data.total_cancelamentos || data.cancelamentos || 0);
const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc;
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
const diffOk = diferenca === 0;
@@ -1493,16 +1494,21 @@ ${data.observacoes ? `
${data.observacoes}
` : ''}
function buildPrintHTML(data) {
const fmt = v => 'R$ ' + (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
// ⚠️ buildReciboData retorna snake_case (sys_total, total_cancelamentos)
const sysTotalCalc = (data.sys_total || data.sysTotal || 0);
const saldoEsperadoCalc = (data.saldo_esperado || 0);
- const cancelamentosCalc = (data.total_cancelamentos || data.cancelamentos || 0);
const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc;
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
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 despesas_arr = Array.isArray(data.despesas_arr) ? data.despesas_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 : [];
// Cartoes arrays from estado
- 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 : [];
+ // (cartCred_arr etc. already declared above)
// Flat totals
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 receber = data.areceber || 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 sysTotal = data.sys_total || 0;
const saldoEsp = data.saldo_esperado || 0;
// Diferença = Total Sistema - Saldo Esperado - Cancelamentos
- // Sempre recalcula para garantir consistência
const sysTotalCalc = (data.sys_total || data.sysTotal || 0);
const saldoEspCalc = (data.saldo_esperado || 0);
- const cancelamentosCalc = (data.total_cancelamentos || data.cancelamentos || 0);
const diferenca = sysTotalCalc - saldoEspCalc - cancelamentosCalc;
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
const diffColor = diferenca === 0 ? '#2e7d32' : '#c0272d';