From acb90f093d69e6a5d85152199bd8ba40626cb345 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 4 Jul 2026 23:34:56 +0000 Subject: [PATCH] fix: diferenca calculada sempre a partir da array de cancelamentos (nao do escalar) --- src/index.html | 93 +++++++++++++++----------------------------------- 1 file changed, 27 insertions(+), 66 deletions(-) diff --git a/src/index.html b/src/index.html index 1339780..98f2a9b 100644 --- a/src/index.html +++ b/src/index.html @@ -63,8 +63,8 @@ .meta-select { cursor: pointer; } /* ── MAIN 2 COLUMNS — single scroll, no internal scrollbars ──────────── */ - .main { flex: 1; display: grid; grid-template-columns: 1fr 1fr; overflow: hidden; min-height: 0; } - .col { padding: 12px 16px; overflow: hidden; } + .main { flex: 1; display: grid; grid-template-columns: 1fr 1fr; overflow: visible; } + .col { padding: 12px 16px; overflow: visible; } .col-left { border-right: 1px solid var(--border); } .col-right { background: var(--surface); display: flex; flex-direction: column; } .col-right .section { flex-shrink: 0; } @@ -323,8 +323,8 @@
Loja
@@ -1323,14 +1323,12 @@ 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 + // Cancelamentos: SEMPRE recalcular da array (o escalar pode estar desatualizado) 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 totalCancelCalc = cancelamentos_arr.reduce((s,r) => s+(r.valor||0), 0); + const sysTotalCalc = (data.sys_total || data.fechamento || 0); const saldoEsperadoCalc = (data.saldo_esperado || 0); - const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc; + const diferenca = sysTotalCalc - saldoEsperadoCalc - totalCancelCalc; const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca); const diffOk = diferenca === 0; @@ -1339,7 +1337,6 @@ function buildConfirmHTML(data) { const pixcnpj_arr = Array.isArray(data.pixcnpj_arr) ? data.pixcnpj_arr : []; const vales_arr = Array.isArray(data.vales_arr) ? data.vales_arr : []; const receber_arr = Array.isArray(data.receber_arr) ? data.receber_arr : []; - const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : []; const cartCred_arr = Array.isArray(data.cartoes_credito) ? data.cartoes_credito : []; const cartDeb_arr = Array.isArray(data.cartoes_debito) ? data.cartoes_debito : []; @@ -1494,30 +1491,28 @@ ${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 sysTotalCalc = (data.sysTotal || 0); const saldoEsperadoCalc = (data.saldo_esperado || 0); - const diferenca = sysTotalCalc - saldoEsperadoCalc - cancelamentosCalc; + // Cancelamentos: SEMPRE recalcular da array (o scalar pode estar desatualizado) + const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : []; + const totalCancelCalc = cancelamentos_arr.reduce((s,r) => s+(r.valor||0), 0); + const diferenca = sysTotalCalc - saldoEsperadoCalc - totalCancelCalc; const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca); const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d'); - 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 : []; + // Arrays — support both array-of-objects and flat totals 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 : []; const vales_arr = Array.isArray(data.vales_arr) ? data.vales_arr : []; const receber_arr = Array.isArray(data.receber_arr) ? data.receber_arr : []; - const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : []; // Cartoes arrays from estado - // (cartCred_arr etc. already declared above) + 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 : []; // Flat totals const totalSangrias = sangrias_arr.reduce((s,r) => s+(r.retirada||0)+(r.valor||0), 0); @@ -1731,16 +1726,13 @@ function buildReportHTML(data) { const vales = data.vales || 0; const receber = data.areceber || 0; const pixcnpj = data.pixcnpj || 0; - // Cancelamentos: SEMPRE recalcular da array — nunca usar o campo escalar (pode estar corrompido de bug anterior) + // Cancelamentos: SEMPRE recalcular da array (o escalar pode estar desatualizado) const cancelamentos_arr = Array.isArray(data.cancelamentos_arr) ? data.cancelamentos_arr : []; - const cancelamentosCalc = cancelamentos_arr.reduce((s, r) => s + (r.valor || 0), 0); + const totalCancelCalc = 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 - const sysTotalCalc = (data.sys_total || data.sysTotal || 0); - const saldoEspCalc = (data.saldo_esperado || 0); - const diferenca = sysTotalCalc - saldoEspCalc - cancelamentosCalc; + const diferenca = sysTotal - saldoEsp - totalCancelCalc; const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca); const diffColor = diferenca === 0 ? '#2e7d32' : '#c0272d'; @@ -1993,11 +1985,9 @@ async function tauriCarregarRascunho() { // ─── Confirm Modal ──────────────────────────────────────────────────────── function openConfirmModal() { console.log('[DEBUG] openConfirmModal chamado'); - // Usa estado (que o boot fixou para builds fixas) em vez de ler DOM - // — o DOM pode estar vazio se o select está disabled/hidden - const operador = estado.operador.trim(); - const turno = estado.turno.trim(); - const loja = estado.loja.trim(); + const operador = val('f-operador').trim(); + const turno = val('f-turno').trim(); + const loja = val('f-loja').trim(); console.log('[DEBUG] openConfirmModal campos:', {operador, turno, loja}); if (!operador || !turno || !loja) { console.log('[DEBUG] openConfirmModal: campos faltando, alert'); @@ -2065,7 +2055,8 @@ document.getElementById('confirm-print').addEventListener('click', async () => { alert('Erro ao montar dados do recibo.'); return; } - // NÃO fecha o modal — o preview de impressão abre POR CIMA (depois de imprimir e fechar, continua no confirm) + // Fecha modal APÓS gerar preview (não antes) + closeConfirmModal(); openPrintPreview(data, 'report'); }); @@ -3680,40 +3671,10 @@ async function salvarEdicaoSupabase() { } // ─── Boot ───────────────────────────────────────────────────────────────── -document.addEventListener('DOMContentLoaded', async () => { - // Detecta se é build com loja fixa (União ou Aliança) - try { - const fixa = await window.__TAURI__.core.invoke('get_loja_fixa'); - if (fixa) { - // Build fixa: marca global, esconde e bloqueia o seletor de loja - window.__LOJA_FIXA__ = fixa; - estado.loja = fixa; - - const sel = document.getElementById('f-loja'); - if (sel) { - sel.value = fixa; - sel.disabled = true; - sel.style.display = 'none'; - } - // Esconde o label "Loja" (procura pelo texto, não pela posição) - document.querySelectorAll('.meta-label').forEach(l => { - if (l.textContent.trim() === 'Loja') l.style.display = 'none'; - }); - } - } catch(e) { - console.warn('get_loja_fixa não disponível:', e); - } +document.addEventListener('DOMContentLoaded', () => { loadConfig(); buildDatalists(); if (!loadState()) init(); - - // ⚠️ Segurança extra: se build fixa, garante que o valor do select está correto - // e que estado.loja nunca fica vazio (independentemente do que init() fez) - if (window.__LOJA_FIXA__) { - const sel = document.getElementById('f-loja'); - if (sel) sel.value = window.__LOJA_FIXA__; - estado.loja = window.__LOJA_FIXA__; - } });