Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a93a30c22 | |||
| 230304e878 | |||
| d185f82bd5 | |||
| 2253d45d00 | |||
| 60e15dbed3 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+54
-16
@@ -1022,7 +1022,9 @@ function init() {
|
|||||||
const today = new Date().toISOString().split('T')[0];
|
const today = new Date().toISOString().split('T')[0];
|
||||||
setVal('f-data', today);
|
setVal('f-data', today);
|
||||||
estado.data = today;
|
estado.data = today;
|
||||||
setVal('f-loja', estado.loja);
|
setVal('f-loja', estado.loja || 'União');
|
||||||
|
setVal('f-operador', estado.operador || '');
|
||||||
|
setVal('f-turno', estado.turno || '');
|
||||||
syncHeader();
|
syncHeader();
|
||||||
PRE_FILL_TABLES.forEach(ensureOneRow);
|
PRE_FILL_TABLES.forEach(ensureOneRow);
|
||||||
Object.keys(TABLES).forEach(renderTable);
|
Object.keys(TABLES).forEach(renderTable);
|
||||||
@@ -1194,9 +1196,9 @@ 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 diff = (data.saldo_troco - data.saldo_esperado);
|
const diferenca = (data.fechamento || 0) - (data.saldo_esperado || 0);
|
||||||
const diffStr = diff >= 0 ? `+${fmt(diff)}` : fmt(diff);
|
const diffStr = diferenca >= 0 ? `+${fmt(diferenca)}` : fmt(diferenca);
|
||||||
const diffColor = diff === 0 ? '#2e7d32' : (diff > 0 ? '#e65100' : '#c0272d');
|
const diffColor = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
|
||||||
|
|
||||||
let rows = '';
|
let rows = '';
|
||||||
// Sangrias
|
// Sangrias
|
||||||
@@ -1284,11 +1286,37 @@ ${data.observacoes ? `<div class="obs">Obs: ${data.observacoes}</div>` : ''}
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openPrintPreview(data) {
|
function openPrintPreview(data) {
|
||||||
|
// Gera HTML e injeta no body de uma div temporária para window.print()
|
||||||
const html = buildPrintHTML(data);
|
const html = buildPrintHTML(data);
|
||||||
const win = window.open('', 'print_preview', 'width=400,height=700,scrollbars=yes,resizable=yes');
|
const style = document.createElement('style');
|
||||||
if (!win) { alert('Bloqueador de pop-up impediu abrir a pré-visualização.'); return; }
|
style.textContent = `
|
||||||
win.document.write(html);
|
@media print {
|
||||||
win.document.close();
|
body { width: 80mm; margin: 0 auto; font-family: 'Courier New', monospace; font-size: 13px; }
|
||||||
|
.no-print { display: none !important; }
|
||||||
|
}
|
||||||
|
.print-actions { position: fixed; top: 10px; right: 10px; z-index: 9999; }
|
||||||
|
.print-actions button { padding: 8px 16px; cursor: pointer; background: #2563eb; color: #fff; border: none; border-radius: 4px; font-size: 14px; }
|
||||||
|
.print-actions button:hover { background: #1d4ed8; }
|
||||||
|
`;
|
||||||
|
const actions = document.createElement('div');
|
||||||
|
actions.className = 'print-actions no-print';
|
||||||
|
actions.innerHTML = '<button onclick="window.print()">🖨️ Imprimir (Ctrl+P)</button>';
|
||||||
|
|
||||||
|
// Guarda conteúdo original
|
||||||
|
const originalBody = document.body.innerHTML;
|
||||||
|
|
||||||
|
document.body.innerHTML = html;
|
||||||
|
document.head.appendChild(style);
|
||||||
|
document.body.insertBefore(actions, document.body.firstChild);
|
||||||
|
|
||||||
|
// Quando fechar print dialog, restaura
|
||||||
|
const onAfterPrint = () => {
|
||||||
|
document.body.innerHTML = originalBody;
|
||||||
|
window.removeEventListener('afterprint', onAfterPrint);
|
||||||
|
// Re-carrega scripts essenciais
|
||||||
|
location.reload();
|
||||||
|
};
|
||||||
|
window.addEventListener('afterprint', onAfterPrint);
|
||||||
}
|
}
|
||||||
|
|
||||||
function triggerWindowPrint() {
|
function triggerWindowPrint() {
|
||||||
@@ -1312,7 +1340,7 @@ 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'));
|
||||||
|
const fechamentoCounted = parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber'));
|
||||||
const data = {
|
const data = {
|
||||||
uuid: estado.uuid,
|
uuid: estado.uuid,
|
||||||
id_local: estado.id_local,
|
id_local: estado.id_local,
|
||||||
@@ -1323,7 +1351,7 @@ async function tauriRecibo() {
|
|||||||
saldo_troco: sysTroco,
|
saldo_troco: sysTroco,
|
||||||
saldo_esperado: saldoEsp,
|
saldo_esperado: saldoEsp,
|
||||||
fechamento: fechamentoCounted,
|
fechamento: fechamentoCounted,
|
||||||
diferenca: sysTroco - saldoEsp,
|
diferenca: fechamentoCounted - saldoEsp, // CORRIGIDO: diferenca = fechamento - esperado
|
||||||
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 })),
|
||||||
@@ -1420,16 +1448,19 @@ document.getElementById('modal-confirm').addEventListener('click', e => { if (e.
|
|||||||
// Print from confirm modal — abre preview no navegador
|
// Print from confirm modal — abre preview no navegador
|
||||||
document.getElementById('confirm-print').addEventListener('click', async () => {
|
document.getElementById('confirm-print').addEventListener('click', async () => {
|
||||||
closeConfirmModal();
|
closeConfirmModal();
|
||||||
// Reconstrói os mesmos dados do tauriRecibo e abre preview
|
|
||||||
const cartCred = estado.cartoes.credito.reduce((s,r) => s+(r.valor||0), 0);
|
const cartCred = estado.cartoes.credito.reduce((s,r) => s+(r.valor||0), 0);
|
||||||
const cartDeb = estado.cartoes.debito.reduce((s,r) => s+(r.valor||0), 0);
|
const cartDeb = estado.cartoes.debito.reduce((s,r) => s+(r.valor||0), 0);
|
||||||
const cartAli = estado.cartoes.alimentacao.reduce((s,r) => s+(r.valor||0), 0);
|
const cartAli = estado.cartoes.alimentacao.reduce((s,r) => s+(r.valor||0), 0);
|
||||||
const cartPix = estado.cartoes.pix.reduce((s,r) => s+(r.valor||0), 0);
|
const cartPix = estado.cartoes.pix.reduce((s,r) => s+(r.valor||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 saldoEsp = parseNum(val('f-saldo-esperado'));
|
||||||
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: parseNum(val('f-saldo-esperado')) || 0,
|
saldo_esperado: saldoEsp,
|
||||||
fechamento: parseNum(val('f-fech-dinheiro')) + parseNum(val('f-fech-cartoes')) + parseNum(val('f-fech-receber')),
|
fechamento: fechamentoCounted,
|
||||||
|
diferenca: fechamentoCounted - saldoEsp,
|
||||||
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 })),
|
||||||
@@ -1437,7 +1468,7 @@ document.getElementById('confirm-print').addEventListener('click', async () => {
|
|||||||
receber: estado.receber.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),
|
receber: estado.receber.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),
|
||||||
cancelamentos: estado.cancelamentos.map(r => ({ numero: r.numero||'', valor: r.valor||0, motivo: r.motivo||'' })),
|
cancelamentos: estado.cancelamentos.map(r => ({ numero: r.numero||'', valor: r.valor||0, motivo: r.motivo||'' })),
|
||||||
credito: cartCred, debito: cartDeb, alimentacao: cartAli,
|
credito: cartCred, debito: cartDeb, alimentacao: cartAli,
|
||||||
cartoes: { pix: cartPix },
|
cartoes: { credito: estado.cartoes.credito, debito: estado.cartoes.debito, alimentacao: estado.cartoes.alimentacao, pix: estado.cartoes.pix },
|
||||||
observacoes: estado.observacoes,
|
observacoes: estado.observacoes,
|
||||||
};
|
};
|
||||||
openPrintPreview(data);
|
openPrintPreview(data);
|
||||||
@@ -1453,10 +1484,17 @@ document.getElementById('confirm-send').addEventListener('click', async () => {
|
|||||||
const r = await tauriEnviar();
|
const r = await tauriEnviar();
|
||||||
estado.sync_status = 'synced';
|
estado.sync_status = 'synced';
|
||||||
saveState();
|
saveState();
|
||||||
alert('✅ Enviado com sucesso!');
|
alert('✅ Enviado com sucesso!\n\n📋 Tabela: fechamentos_web\n🌐 Servidor: supabase.ofrangao.com.br\n\nAbra o Supabase Studio para verificar.');
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
await tauriSaveLocal();
|
await tauriSaveLocal();
|
||||||
alert('Erro ao enviar: ' + (e.message || e) + '\n(Dados salvos localmente)');
|
const msg = e?.message || e?.toString?.() || String(e);
|
||||||
|
alert(
|
||||||
|
'⚠️ Erro ao enviar para o Supabase.\n\n' +
|
||||||
|
'📋 Tabela: fechamentos_web\n' +
|
||||||
|
'🌐 Servidor: supabase.ofrangao.com.br\n\n' +
|
||||||
|
'O servidor pode estar offline. Dados salvos localmente.\n\n' +
|
||||||
|
'Erro: ' + msg
|
||||||
|
);
|
||||||
} finally {
|
} finally {
|
||||||
btn.disabled = false;
|
btn.disabled = false;
|
||||||
btn.textContent = '💾 Enviar Fechamento';
|
btn.textContent = '💾 Enviar Fechamento';
|
||||||
|
|||||||
Reference in New Issue
Block a user