From 11abac8daf34a774b65390a70e7db19cb16d206a Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Jun 2026 12:45:46 +0000 Subject: [PATCH] =?UTF-8?q?v1.3.13:=20f=C3=B3rmulas=20corrigidas=20?= =?UTF-8?q?=E2=80=94=20diferen=C3=A7a=3D(fechamento-(saldo=5Fesp-cancel)),?= =?UTF-8?q?=20sys=5Ftotal=20sem=20troco,=20reportHTML=20separado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.html | 100 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 85 insertions(+), 15 deletions(-) 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 + + +
+
📅 Data: ${data.data}   👤 Operador: ${data.operador}   ⏰ Turno: ${data.turno}   🏪 Loja: ${data.loja}
+
+
+
💸 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');