v1.3.13: fórmulas corrigidas — diferença=(fechamento-(saldo_esp-cancel)), sys_total sem troco, reportHTML separado
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-06-26 12:45:46 +00:00
parent fea957dfb9
commit 11abac8daf
+85 -15
View File
@@ -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 ? `<div class="obs">${data.observacoes}</div>` : ''}
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 ? `<div class="obs">${data.observacoes}</div>` : ''}
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 `<!DOCTYPE html>
<html><head>
<meta charset="UTF-8">
<title>Relatório de Fechamento</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Courier New', monospace; font-size: 13px; width: 80mm; margin: 0 auto; padding: 8px; }
.header { text-align: center; margin-bottom: 8px; }
hr { border: none; border-top: 1px dashed #000; margin: 6px 0; }
.row { display: flex; justify-content: space-between; padding: 2px 0; font-size: 12px; }
.row .val { font-weight: bold; }
.footer { text-align: center; font-size: 11px; color: #555; margin-top: 8px; }
@media print { body { margin: 0; } }
</style>
</head><body>
<div class="header">
<div>📅 Data: ${data.data} &nbsp; 👤 Operador: ${data.operador} &nbsp; ⏰ Turno: ${data.turno} &nbsp; 🏪 Loja: ${data.loja}</div>
</div>
<hr>
<div class="row"><span>💸 Sangrias:</span><span class="val">${fmt(sangrias)}</span></div>
<div class="row"><span>📝 Despesas:</span><span class="val">${fmt(despesas)}</span></div>
<div class="row"><span>💰 Vales:</span><span class="val">${fmt(vales)}</span></div>
<div class="row"><span>👥 À Receber:</span><span class="val">${fmt(receber)}</span></div>
<div class="row"><span>🔵 PIX CNPJ:</span><span class="val">${fmt(pixcnpj)}</span></div>
<div class="row"><span>💳 Crédito:</span><span class="val">${fmt(cartCred)}</span></div>
<div class="row"><span>💳 Débito:</span><span class="val">${fmt(cartDeb)}</span></div>
<div class="row"><span>💳 Alimentação:</span><span class="val">${fmt(cartAli)}</span></div>
<div class="row"><span>❌ Cancelamentos:</span><span class="val">${fmt(cancelamentos)}</span></div>
<hr>
<div class="row"><span>📋 Fechamento (contado):</span><span class="val">${fmt(fechamento)}</span></div>
<div class="row"><span>🖥️ Total Sistema:</span><span class="val">${fmt(sysTotal)}</span></div>
<hr>
<div class="row"><span>🎯 Saldo Esperado (contado):</span><span class="val">${fmt(saldoEsp)}</span></div>
<div class="row"><span>📐 Diferença:</span><span class="val" style="color:${diffColor}">${diffStr}</span></div>
<hr>
<div style="text-align:center;font-size:10px;color:#888">ID: ${data.loja}_${data.data}_${data.operador}</div>
<div class="footer">Gerado em ${new Date().toLocaleString('pt-BR')}</div>
</body></html>`;
}
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 =
`<div style="margin-bottom:6px"><strong>📅 Data:</strong> ${estado.data} &nbsp; <strong>👤 Operador:</strong> ${operador} &nbsp; <strong>⏰ Turno:</strong> ${turno} &nbsp; <strong>🏪 Loja:</strong> ${loja}</div>
@@ -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');