diff --git a/src/index.html b/src/index.html
index c4c2dce..82463c5 100644
--- a/src/index.html
+++ b/src/index.html
@@ -1230,128 +1230,90 @@ async function tauriEnviar() {
}
function buildConfirmHTML(data) {
+ // Relatório completo — mesmo layout do PDF
const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ',');
- const sangrias = (data.sangrias_arr || data.sangrias || []).reduce((s,r) => s+(parseNum(r.retirada||r.valor||0)||0), 0);
- const despesas = (data.despesas_arr || data.despesas || []).reduce((s,r) => s+(parseNum(r.valor||0)||0), 0);
- const vales = (data.vales_arr || data.vales || []).reduce((s,r) => s+(parseNum(r.valor||0)||0), 0);
- const receber = (data.receber_arr || data.receber || []).reduce((s,r) => s+(parseNum(r.valor||0)||0), 0);
- const pixcnpj = (data.pixcnpj_arr || data.pixcnpj || []).reduce((s,r) => s+(parseNum(r.valor||0)||0), 0);
- const cancelamentos = (data.cancelamentos_arr || data.cancelamentos || []).reduce((s,c) => s+(parseNum(c.valor||0)||0), 0);
- const cartCred = data.credito || 0;
- const cartDeb = data.debito || 0;
- const cartAli = data.alimentacao || 0;
- const cartPix = data.voucher || data.pix || 0;
- const fechamento = data.fechamento || 0;
- const saldoEsp = data.saldo_esperado || 0;
- const diferenca = fechamento - saldoEsp;
- const diffClass = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
-
- return `
-
-
-Relatório de Fechamento
-
-
-
-📅 Data: ${data.data} 👤 Operador: ${data.operador} ⏰ Turno: ${data.turno}
-
-💸 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: ${fmt(fechamento)}
-
-🎯 Saldo Esperado: ${fmt(saldoEsp)}
-📐 Diferença: ${fmt(diferenca)}
-ID: ${data.loja}_${data.data}_${data.operador}
-
-`;
-}
-
-// ─── Print Preview Window ──────────────────────────────────────────────────
-function buildPrintHTML(data) {
- const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ',');
- // Usa a diferenca ja calculada pelo tauriRecibo (sys_total - saldo_esperado),
- // igual ao modal de confirmacao — nao recalcula de fechamento.
+ const fmtNeg = v => (v < 0 ? '-' : '') + 'R$ ' + Math.abs(v || 0).toFixed(2).replace('.', ',');
const diferenca = data.diferenca !== undefined ? data.diferenca
: ((data.sys_total || 0) - (data.saldo_esperado || 0));
- const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmt(diferenca);
- const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
+ const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmtNeg(diferenca);
+ const diffOk = diferenca === 0;
- let rows = '';
- // Cancelamentos (sum the array first — single cancelamentos is a float total, array is from confirm-print)
- const cancelTotal = Array.isArray(data.cancelamentos)
- ? data.cancelamentos.reduce((s, c) => s + (parseNum(c.valor || 0) || 0), 0)
- : (data.cancelamentos || 0);
- // PIX total (flat number from tauriRecibo; pixcnpj is also flat total)
- const pixTotal = data.pix || data.voucher || 0;
- const pixCnpjTotal = typeof data.pixcnpj === 'number' ? data.pixcnpj : 0;
- // Sangrias
- if (data.sangrias && data.sangrias.length > 0) {
- data.sangrias.forEach(s => { if (s.hora || s.retirada) rows += `| ${s.hora||''} | ${fmt(s.retirada)} | ${s.gerente||''} |
`; });
- }
- // Despesas
- if (data.despesas && data.despesas.length > 0) {
- data.despesas.forEach(d => { if (d.desc || d.valor) rows += `| ${d.desc||''} | ${fmt(d.valor)} | ${d.obs||''} |
`; });
- }
- // Vales
- if (data.vales && data.vales.length > 0) {
- data.vales.forEach(v => { if (v.nome || v.valor) rows += `| ${v.nome||''} | ${fmt(v.valor)} | ${v.obs||''} |
`; });
- }
- // Receber
- if (data.receber && data.receber.length > 0) {
- data.receber.forEach(r => { if (r.nome || r.valor) rows += `| ${r.nome||''} | ${fmt(r.valor)} | |
`; });
- }
- // PIX CNPJ (flat total, not array)
- if (pixCnpjTotal > 0) {
- rows += `| PIX CNPJ | ${fmt(pixCnpjTotal)} | |
`;
- }
- // Cancelamentos
- if (cancelTotal > 0) {
- rows += `| Cancelamentos | ${fmt(cancelTotal)} | |
`;
+ 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 : [];
+
+ 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 : [];
+
+ const totalSangrias = sangrias_arr.reduce((s,r) => s+(r.retirada||0)+(r.valor||0), 0);
+ const totalDespesas = despesas_arr.reduce((s,r) => s+(r.valor||0), 0);
+ const totalPixCnpj = pixcnpj_arr.reduce((s,r) => s+(r.valor||0), 0);
+ const totalVales = vales_arr.reduce((s,r) => s+(r.valor||0), 0);
+ const totalReceber = receber_arr.reduce((s,r) => s+(r.valor||0), 0);
+ const totalCancel = cancelamentos_arr.reduce((s,r) => s+(r.valor||0), 0);
+
+ const cartCred = cartCred_arr.reduce((s,v) => s+(v||0), 0);
+ const cartDeb = cartDeb_arr.reduce((s,v) => s+(v||0), 0);
+ const cartAli = cartAli_arr.reduce((s,v) => s+(v||0), 0);
+ const cartPix = cartPix_arr.reduce((s,v) => s+(v||0), 0);
+ const totalCartoes = cartCred + cartDeb + cartAli + cartPix;
+
+ const fdin = data.fechamento_dinheiro || 0;
+ const fcarts = data.fechamento_cartoes || 0;
+ const frec = data.fechamento_receber || 0;
+ const ftotal = data.fechamento || (fdin + fcarts + frec);
+ const sysTotal = data.sys_total || 0;
+ const saldoEsperado = data.saldo_esperado || 0;
+
+ // Cartoes table
+ const maxRows = Math.max(cartCred_arr.length, cartDeb_arr.length, cartAli_arr.length, cartPix_arr.length);
+ let cartTableRows = '';
+ for (let i = 0; i < maxRows; i++) {
+ const cr = cartCred_arr[i] || 0;
+ const db = cartDeb_arr[i] || 0;
+ const al = cartAli_arr[i] || 0;
+ const px = cartPix_arr[i] || 0;
+ cartTableRows += `
+ | ${cr > 0 ? fmt(cr) : ''} |
+ ${db > 0 ? fmt(db) : ''} |
+ ${al > 0 ? fmt(al) : ''} |
+ ${px > 0 ? fmt(px) : ''} |
+
`;
}
+ cartTableRows += `
+ | ${cartCred > 0 ? fmt(cartCred) : '-'} |
+ ${cartDeb > 0 ? fmt(cartDeb) : '-'} |
+ ${cartAli > 0 ? fmt(cartAli) : '-'} |
+ ${cartPix > 0 ? fmt(cartPix) : '-'} |
+
`;
return `
-Relatório de Fechamento
+Fechamento de Caixa
+
+
+
+Data:${data.data}
+Operador:${data.operador}
+Turno:${data.turno}
+
+${sangriaLines.length > 0 ? `SANGRIAS
+${sangriaLines.map(l => `${l.label}${fmt(l.valor)}
`).join('')}
+TOTAL SANGRIAS:${fmt(totalSangrias)}
` : ''}
+
+${despLines.length > 0 ? `DESPESAS
+${despLines.map(l => `${l.label}${fmt(l.valor)}
`).join('')}
+TOTAL DESPESAS:${fmt(totalDespesas)}
` : ''}
+
+${pixLines.length > 0 ? `PIX CNPJ
+${pixLines.map(l => `${l.label}${fmt(l.valor)}
`).join('')}
+TOTAL PIX CNPJ:${fmt(totalPixCnpj)}
` : ''}
+
+${valesLines.length > 0 ? `VALES
+${valesLines.map(l => `${l.label}${fmt(l.valor)}
`).join('')}
+TOTAL VALES:${fmt(totalVales)}
` : ''}
+
+${recLines.length > 0 ? `A RECEBER
+${recLines.map(l => `${l.label}${fmt(l.valor)}
`).join('')}
+TOTAL A RECEBER:${fmt(totalReceber)}
` : ''}
+
+${cancLines.length > 0 ? `CANCELAMENTOS
+${cancLines.map(l => `${l.label}${fmt(l.valor)}
`).join('')}
+TOTAL:${fmt(totalCancel)}
` : ''}
+
+DETALHAMENTO DE CARTÕES
+
+
+
+ | CRÉDITO | DÉBITO | ALIMENT. | PIX |
+
+
+
+ ${cartTableRows}
+
+
+Soma Cartões:${fmt(totalCartoes)}
+
+SALDO DE CAIXA (SISTEMA) — RESUMO
+Troco${fmt(data.saldo_troco||0)}
+Crédito${fmt(cartCred)}
+Débito${fmt(cartDeb)}
+Alimentação${fmt(cartAli)}
+Vales${fmt(totalVales)}
+À Receber${fmt(totalReceber)}
+PIX Cartão${fmt(cartPix)}
+PIX CNPJ${fmt(totalPixCnpj)}
+TOTAL SISTEMA${fmt(sysTotal)}
+Saldo Esperado${fmt(saldoEsperado)}
+DIFERENÇA${diffStr}${diffOk ? ' ✓ OK' : ''}
+
+FECHAMENTO (CONTADO)
+Dinheiro:${fmt(fdin)}
+Cartões:${fmt(fcarts)}
+À Receber:${fmt(frec)}
+TOTAL:${fmt(ftotal)}
+
+${data.observacoes ? `${data.observacoes}
` : ''}
+
+
+`;
+
+ return html;
+}
+
function openPrintPreview(data, mode) {
const html = mode === 'confirm' ? buildConfirmHTML(data) : buildPrintHTML(data);
// Remove preview anterior se existir
@@ -1608,12 +1825,18 @@ document.getElementById('confirm-print').addEventListener('click', async () => {
const cartPix = estado.cartoes.pix.reduce((s,r) => s+(r.valor||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'));
+ const sysTotal = (parseNum(val('sys-troco')) || 0) + cartCred + cartDeb + cartAli + cartPix + vales + receber + pixcnpj;
+ const diferenca = sysTotal - saldoEsp;
const data = {
loja: estado.loja, data: estado.data, operador: estado.operador, turno: estado.turno,
saldo_troco: parseNum(val('sys-troco')) || 0,
saldo_esperado: saldoEsp,
+ fechamento_dinheiro: parseNum(val('f-fech-dinheiro')),
+ fechamento_cartoes: parseNum(val('f-fech-cartoes')),
+ fechamento_receber: parseNum(val('f-fech-receber')),
fechamento: fechamentoCounted,
- diferenca: fechamentoCounted - saldoEsp,
+ diferenca: diferenca,
+ sys_total: sysTotal,
despesas_arr: estado.despesas.map(r => ({ desc: r.desc||'', obs: r.obs||'', valor: r.valor||0 })),
sangrias_arr: estado.sangrias.map(r => ({ hora: r.hora||'', retirada: parseNum(r.retirada)||0, gerente: r.gerente||'' })),
pixcnpj_arr: estado.pixcnpj.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),
@@ -1622,6 +1845,10 @@ document.getElementById('confirm-print').addEventListener('click', async () => {
cancelamentos_arr: estado.cancelamentos.map(r => ({ numero: r.numero||'', valor: r.valor||0, motivo: r.motivo||'' })),
credito: cartCred, debito: cartDeb, alimentacao: cartAli,
voucher: cartPix,
+ cartoes_credito: estado.cartoes.credito.map(r => r.valor || 0),
+ cartoes_debito: estado.cartoes.debito.map(r => r.valor || 0),
+ cartoes_alimentacao: estado.cartoes.alimentacao.map(r => r.valor || 0),
+ cartoes_pix: estado.cartoes.pix.map(r => r.valor || 0),
observacoes: estado.observacoes,
};
openPrintPreview(data, 'confirm');