Compare commits

..

1 Commits

Author SHA1 Message Date
root 1848c1aa35 fix: diferenca no recibo - TOTAL agora usa total_operado, diferenca = fechamento - saldo_esperado
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
- Adicionado campo total_operado (credito+debito+alimentacao+voucher+pixcnpj)
- WHITE section: Fechamento mostra total_operado (era fechamento contado)
- BLACK section: diferenca usa fechamento - saldo_esperado (nao mais self.diferenca)
- Confirm modal: diferenca usava sysTroco - saldoEsp (errado), corrigido
- buildPrintHTML: diferenca usa total_operado
2026-06-25 13:22:03 +00:00
2 changed files with 17 additions and 6 deletions
+9 -3
View File
@@ -82,9 +82,14 @@ pub struct ReciboData {
pub operador: String, pub operador: String,
pub turno: String, pub turno: String,
pub saldo_troco: f64, pub saldo_troco: f64,
/// Valor contado no fechamento (dinheiro + cartões + receber)
pub fechamento: f64, pub fechamento: f64,
/// Saldo esperado = total operações sangrias despesas
pub saldo_esperado: f64, pub saldo_esperado: f64,
/// Diferença = fechamento saldo_esperado
pub diferenca: f64, pub diferenca: f64,
/// Soma de todas operações creditadas (crédito + débito + alimentação + voucher + pixcnpj)
pub total_operado: f64,
// Totais de cartões // Totais de cartões
pub credito: f64, pub credito: f64,
pub debito: f64, pub debito: f64,
@@ -275,10 +280,11 @@ impl ReciboData {
// ── DIFERENÇA ── // ── DIFERENÇA ──
out.extend(escpos::line_bold("DIFERENCA")); out.extend(escpos::line_bold("DIFERENCA"));
let diff_str = if self.diferenca >= 0.0 { let diff = self.fechamento - self.saldo_esperado;
format!("+{}", self.fmt_money(self.diferenca)) let diff_str = if diff >= 0.0 {
format!("+{}", self.fmt_money(diff))
} else { } else {
self.fmt_money(self.diferenca) self.fmt_money(diff)
}; };
out.extend(escpos::title(&diff_str)); out.extend(escpos::title(&diff_str));
+8 -3
View File
@@ -1232,7 +1232,7 @@ async function tauriEnviar() {
// ─── Print Preview Window ────────────────────────────────────────────────── // ─── Print Preview Window ──────────────────────────────────────────────────
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 diferenca = (data.fechamento || 0) - (data.saldo_esperado || 0); const diferenca = (data.fechamento || 0) - (data.total_operado || 0);
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmt(diferenca); const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmt(diferenca);
const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d'); const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
@@ -1307,7 +1307,7 @@ function buildPrintHTML(data) {
<div class="section-title">ENTRADAS</div> <div class="section-title">ENTRADAS</div>
<div class="row"><span>Saldo Troco:</span><span>${fmt(data.saldo_troco)}</span></div> <div class="row"><span>Saldo Troco:</span><span>${fmt(data.saldo_troco)}</span></div>
<div class="row"><span>Fechamento:</span><span>${fmt(data.fechamento)}</span></div> <div class="row"><span>Fechamento:</span><span>${fmt(data.total_operado || 0)}</span></div>
<div class="row"><span>Saldo Esperado:</span><span>${fmt(data.saldo_esperado)}</span></div> <div class="row"><span>Saldo Esperado:</span><span>${fmt(data.saldo_esperado)}</span></div>
${rows ? `<div class="section-title">DETALHES</div><table><tbody>${rows}</tbody></table>` : ''} ${rows ? `<div class="section-title">DETALHES</div><table><tbody>${rows}</tbody></table>` : ''}
@@ -1424,6 +1424,8 @@ async function tauriRecibo() {
const fechamentoCounted = parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber')); const fechamentoCounted = parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber'));
const saldoEsp = parseNum(val('f-saldo-esperado')); const saldoEsp = parseNum(val('f-saldo-esperado'));
const sysTroco = parseNum(val('sys-troco')); const sysTroco = parseNum(val('sys-troco'));
// total_operado = soma de todas operações creditadas (não é o fechamento contado)
const totalOperado = cartCred + cartDeb + cartAli + cartPix + pixCnpjTotal;
const data = { const data = {
uuid: estado.uuid, uuid: estado.uuid,
id_local: estado.id_local, id_local: estado.id_local,
@@ -1435,6 +1437,7 @@ async function tauriRecibo() {
saldo_esperado: saldoEsp, saldo_esperado: saldoEsp,
fechamento: fechamentoCounted, fechamento: fechamentoCounted,
diferenca: fechamentoCounted - saldoEsp, diferenca: fechamentoCounted - saldoEsp,
total_operado: totalOperado,
// Flat totals for ReciboData struct (Rust) — must be numbers // Flat totals for ReciboData struct (Rust) — must be numbers
credito: cartCred, credito: cartCred,
debito: cartDeb, debito: cartDeb,
@@ -1499,7 +1502,7 @@ function openConfirmModal() {
const pixcnpj = estado.pixcnpj.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0); 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 fechamento = parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber'));
const saldoEsp = parseNum(val('f-saldo-esperado')); const saldoEsp = parseNum(val('f-saldo-esperado'));
const diferenca = (parseNum(val('sys-troco')) || 0) - saldoEsp; const diferenca = fechamento - saldoEsp;
const diffClass = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d'); const diffClass = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
document.getElementById('confirm-summary').innerHTML = 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> `<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>
@@ -1539,12 +1542,14 @@ document.getElementById('confirm-print').addEventListener('click', async () => {
const cancelTotal = estado.cancelamentos.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0); 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 fechamentoCounted = parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber'));
const saldoEsp = parseNum(val('f-saldo-esperado')); const saldoEsp = parseNum(val('f-saldo-esperado'));
const totalOperado = cartCred + cartDeb + cartAli + cartPix + (estado.pixcnpj.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0));
const data = { const data = {
loja: estado.loja, data: estado.data, operador: estado.operador, turno: estado.turno, loja: estado.loja, data: estado.data, operador: estado.operador, turno: estado.turno,
saldo_troco: parseNum(val('sys-troco')) || 0, saldo_troco: parseNum(val('sys-troco')) || 0,
saldo_esperado: saldoEsp, saldo_esperado: saldoEsp,
fechamento: fechamentoCounted, fechamento: fechamentoCounted,
diferenca: fechamentoCounted - saldoEsp, diferenca: fechamentoCounted - saldoEsp,
total_operado: totalOperado,
despesas: estado.despesas.map(r => ({ desc: r.desc||'', obs: r.obs||'', valor: r.valor||0 })), despesas: estado.despesas.map(r => ({ desc: r.desc||'', obs: r.obs||'', valor: r.valor||0 })),
sangrias: estado.sangrias.map(r => ({ hora: r.hora||'', retirada: parseNum(r.retirada)||0, gerente: r.gerente||'' })), sangrias: estado.sangrias.map(r => ({ hora: r.hora||'', retirada: parseNum(r.retirada)||0, gerente: r.gerente||'' })),
pixcnpj: estado.pixcnpj.map(r => ({ nome: r.nome||'', valor: r.valor||0 })), pixcnpj: estado.pixcnpj.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),