diff --git a/src/index.html b/src/index.html
index 85cbd4a..6c47e30 100644
--- a/src/index.html
+++ b/src/index.html
@@ -832,8 +832,8 @@ function updateTotals() {
const receberTotal = estado.receber.reduce((s, r) => s + (parseNum(r['valor'] || 0) || 0), 0);
document.getElementById('sys-receber').value = receberTotal > 0 ? fmtNum(receberTotal) : '';
- // SYS total = troco + crédito + débito + alimentação + vales + receber + pixCartão + pixCnpj
- const sysTotal = parseNum(val('sys-troco')) + cartCred + cartDeb + cartAli + valesTotal + receberTotal + cartPix + pixCnpjTotal;
+ // SYS total = crédito + débito + alimentação + vales + receber + pixCartão + pixCnpj (NÃO inclui troco)
+ const sysTotal = cartCred + cartDeb + cartAli + valesTotal + receberTotal + cartPix + pixCnpjTotal;
setText('sys-total', fmt(sysTotal));
// ── Fechamento Contado — auto-populate (readonly, filled from tables) ──
@@ -850,9 +850,10 @@ function updateTotals() {
const fr = receberTotal;
setText('fech-total', fmt(fd + fc + fr));
- // Diferença = Saldo Caixa − Saldo Esperado
- const saldoCaixa = sysTotal;
- const diff = saldoCaixa - parseNum(val('f-saldo-esperado'));
+ // Diferença = fechamento - (saldo_esperado - cancelamentos)
+ const fechamentoTotal = fd + fc + fr;
+ const cancelTotal = estado.cancelamentos.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0);
+ const diff = fechamentoTotal - (parseNum(val('f-saldo-esperado')) - cancelTotal);
const difEl = document.getElementById('diferenca');
const badgeEl = document.getElementById('dif-badge');
if (difEl) {
@@ -1233,8 +1234,9 @@ 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('.', ',');
+ // Diferença = fechamento - (saldo_esperado - cancelamentos)
const diferenca = data.diferenca !== undefined ? data.diferenca
- : ((data.sys_total || 0) - (data.saldo_esperado || 0));
+ : ((data.fechamento || 0) - ((data.saldo_esperado || 0) - (data.cancelamentos || 0)));
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
const diffOk = diferenca === 0;
@@ -1394,8 +1396,9 @@ ${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('.', ',');
+ // Diferença = fechamento - (saldo_esperado - cancelamentos)
const diferenca = data.diferenca !== undefined ? data.diferenca
- : ((data.sys_total || 0) - (data.saldo_esperado || 0));
+ : ((data.fechamento || 0) - ((data.saldo_esperado || 0) - (data.cancelamentos || 0)));
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
@@ -1606,8 +1609,73 @@ ${data.observacoes ? `${data.observacoes}
` : ''}
return html;
}
+// ─── Relatório de Impressão (layout exato do usuário) ──────────────────────
+function buildReportHTML(data) {
+ const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ',');
+ const fmtNeg = v => (v < 0 ? '-' : '') + 'R$ ' + Math.abs(v || 0).toFixed(2).replace('.', ',');
+
+ const cartCred = data.credito || 0;
+ const cartDeb = data.debito || 0;
+ const cartAli = data.alimentacao || 0;
+ const cartPix = data.voucher || 0;
+ const sangrias = data.sangrias || 0;
+ const despesas = data.despesas || 0;
+ const vales = data.vales || 0;
+ const receber = data.areceber || 0;
+ const pixcnpj = data.pixcnpj || 0;
+ const cancelamentos = data.cancelamentos || 0;
+ const fechamento = data.fechamento || 0;
+ const sysTotal = data.sys_total || 0;
+ const saldoEsp = data.saldo_esperado || 0;
+ const diferenca = data.diferenca !== undefined ? data.diferenca
+ : (fechamento - (saldoEsp - cancelamentos));
+ const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
+ const diffColor = diferenca === 0 ? '#2e7d32' : '#c0272d';
+
+ return `
+
+
+Relatório de Fechamento
+
+
+
+
+💸 Sangrias:${fmt(sangrias)}
+📝 Despesas:${fmt(despesas)}
+💰 Vales:${fmt(vales)}
+👥 À Receber:${fmt(receber)}
+🔵 PIX CNPJ:${fmt(pixcnpj)}
+💳 Crédito:${fmt(cartCred)}
+💳 Débito:${fmt(cartDeb)}
+💳 Alimentação:${fmt(cartAli)}
+❌ Cancelamentos:${fmt(cancelamentos)}
+
+📋 Fechamento (contado):${fmt(fechamento)}
+🖥️ Total Sistema:${fmt(sysTotal)}
+
+🎯 Saldo Esperado (contado):${fmt(saldoEsp)}
+📐 Diferença:${diffStr}
+
+ID: ${data.loja}_${data.data}_${data.operador}
+
+`;
+}
+
function openPrintPreview(data, mode) {
- const html = mode === 'confirm' ? buildConfirmHTML(data) : buildPrintHTML(data);
+ const html = mode === 'confirm' ? buildConfirmHTML(data)
+ : mode === 'report' ? buildReportHTML(data)
+ : buildPrintHTML(data);
// Remove preview anterior se existir
const existing = document.getElementById('print-preview-overlay');
if (existing) document.body.removeChild(existing);
@@ -1702,8 +1770,10 @@ function buildReciboData() {
const cancelTotal = estado.cancelamentos.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0);
const fechamentoCounted = parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber'));
const saldoEsp = parseNum(val('f-saldo-esperado'));
- // SYS total = troco + crédito + débito + alimentação + vales + receber + pixCartão + pixCnpj
- const sysTotal = parseNum(val('sys-troco')) + cartCred + cartDeb + cartAli + valesTotal + receberTotal + cartPix + pixCnpjTotal;
+ // SYS total = crédito + débito + alimentação + voucher pix + pixcnpj + vales + receber (NÃO inclui troco)
+ const sysTotal = cartCred + cartDeb + cartAli + cartPix + pixCnpjTotal + valesTotal + receberTotal;
+ // Diferença = fechamento - (saldo_esperado - cancelamentos)
+ const diferenca = fechamentoCounted - (saldoEsp - cancelTotal);
return {
uuid: estado.uuid,
id_local: estado.id_local,
@@ -1714,7 +1784,7 @@ function buildReciboData() {
saldo_troco: parseNum(val('sys-troco')),
saldo_esperado: saldoEsp,
fechamento: fechamentoCounted,
- diferenca: sysTotal - saldoEsp,
+ diferenca: diferenca,
sys_total: sysTotal,
fechamento_dinheiro: parseNum(val('f-fech-dinheiro')),
fechamento_cartoes: parseNum(val('f-fech-cartoes')),
@@ -1793,8 +1863,8 @@ function openConfirmModal() {
const pixcnpj = estado.pixcnpj.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0);
const fechamento = parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber'));
const saldoEsp = parseNum(val('f-saldo-esperado'));
- const sysTotal = (parseNum(val('sys-troco')) || 0) + cartCred + cartDeb + cartAli + cartPix + vales + receber + pixcnpj;
- const diferenca = sysTotal - saldoEsp;
+ const sysTotal = cartCred + cartDeb + cartAli + cartPix + vales + receber + pixcnpj;
+ const diferenca = fechamento - (saldoEsp - cancelamentos);
const diffClass = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
document.getElementById('confirm-summary').innerHTML =
`📅 Data: ${estado.data} 👤 Operador: ${operador} ⏰ Turno: ${turno} 🏪 Loja: ${loja}
@@ -1839,7 +1909,7 @@ document.getElementById('confirm-print').addEventListener('click', async () => {
}
// Fecha modal APÓS gerar preview (não antes)
closeConfirmModal();
- openPrintPreview(data, 'confirm');
+ openPrintPreview(data, 'report');
});
// Confirm send
@@ -1918,7 +1988,7 @@ document.getElementById('btn-limpar').addEventListener('click', () => {
setVal('f-fech-dinheiro', ''); setVal('f-fech-cartoes', ''); setVal('f-fech-receber', '');
setVal('f-saldo-esperado', ''); setVal('f-obs', '');
setVal('sys-troco', '');
- calcular();
+ updateTotals();
renderAllTables();
syncUI();
showToast('Rascunho limpo.', 'info');