v1.3.11: 3 bugs corrigidos — preview sempre abre, tabela cartoes com traços, variaveis ausentes
This commit is contained in:
+48
-54
@@ -1279,10 +1279,10 @@ function buildConfirmHTML(data) {
|
|||||||
const al = cartAli_arr[i] || 0;
|
const al = cartAli_arr[i] || 0;
|
||||||
const px = cartPix_arr[i] || 0;
|
const px = cartPix_arr[i] || 0;
|
||||||
cartTableRows += `<tr>
|
cartTableRows += `<tr>
|
||||||
<td>${cr > 0 ? fmt(cr) : ''}</td>
|
<td>${cr > 0 ? fmt(cr) : '-'}</td>
|
||||||
<td>${db > 0 ? fmt(db) : ''}</td>
|
<td>${db > 0 ? fmt(db) : '-'}</td>
|
||||||
<td>${al > 0 ? fmt(al) : ''}</td>
|
<td>${al > 0 ? fmt(al) : '-'}</td>
|
||||||
<td>${px > 0 ? fmt(px) : ''}</td>
|
<td>${px > 0 ? fmt(px) : '-'}</td>
|
||||||
</tr>`;
|
</tr>`;
|
||||||
}
|
}
|
||||||
cartTableRows += `<tr class="total-row">
|
cartTableRows += `<tr class="total-row">
|
||||||
@@ -1487,10 +1487,10 @@ function buildPrintHTML(data) {
|
|||||||
const al = cartAli_arr[i] || 0;
|
const al = cartAli_arr[i] || 0;
|
||||||
const px = cartPix_arr[i] || 0;
|
const px = cartPix_arr[i] || 0;
|
||||||
cartTableRows += `<tr>
|
cartTableRows += `<tr>
|
||||||
<td>${cr > 0 ? fmt(cr) : ''}</td>
|
<td>${cr > 0 ? fmt(cr) : '-'}</td>
|
||||||
<td>${db > 0 ? fmt(db) : ''}</td>
|
<td>${db > 0 ? fmt(db) : '-'}</td>
|
||||||
<td>${al > 0 ? fmt(al) : ''}</td>
|
<td>${al > 0 ? fmt(al) : '-'}</td>
|
||||||
<td>${px > 0 ? fmt(px) : ''}</td>
|
<td>${px > 0 ? fmt(px) : '-'}</td>
|
||||||
</tr>`;
|
</tr>`;
|
||||||
}
|
}
|
||||||
// Totals row
|
// Totals row
|
||||||
@@ -1687,8 +1687,9 @@ function triggerWindowPrint() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ─── Recibo 80mm via Tauri (ESC/POS USB) ─────────────────────────────────
|
// ─── Recibo 80mm via Tauri (ESC/POS USB) ─────────────────────────────────
|
||||||
async function tauriRecibo() {
|
// ─── Recibo 80mm via Tauri (ESC/POS USB) ─────────────────────────────────
|
||||||
// Build flat totals for the Rust ReciboData struct
|
// Build data object shared by both ESC/POS and preview
|
||||||
|
function buildReciboData() {
|
||||||
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);
|
||||||
@@ -1703,7 +1704,7 @@ async function tauriRecibo() {
|
|||||||
const saldoEsp = parseNum(val('f-saldo-esperado'));
|
const saldoEsp = parseNum(val('f-saldo-esperado'));
|
||||||
// SYS total = troco + crédito + débito + alimentação + vales + receber + pixCartão + pixCnpj
|
// 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;
|
const sysTotal = parseNum(val('sys-troco')) + cartCred + cartDeb + cartAli + valesTotal + receberTotal + cartPix + pixCnpjTotal;
|
||||||
const data = {
|
return {
|
||||||
uuid: estado.uuid,
|
uuid: estado.uuid,
|
||||||
id_local: estado.id_local,
|
id_local: estado.id_local,
|
||||||
loja: estado.loja,
|
loja: estado.loja,
|
||||||
@@ -1715,6 +1716,9 @@ async function tauriRecibo() {
|
|||||||
fechamento: fechamentoCounted,
|
fechamento: fechamentoCounted,
|
||||||
diferenca: sysTotal - saldoEsp,
|
diferenca: sysTotal - saldoEsp,
|
||||||
sys_total: sysTotal,
|
sys_total: sysTotal,
|
||||||
|
fechamento_dinheiro: parseNum(val('f-fech-dinheiro')),
|
||||||
|
fechamento_cartoes: parseNum(val('f-fech-cartoes')),
|
||||||
|
fechamento_receber: parseNum(val('f-fech-receber')),
|
||||||
// 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,
|
||||||
@@ -1726,25 +1730,31 @@ async function tauriRecibo() {
|
|||||||
vales: valesTotal,
|
vales: valesTotal,
|
||||||
areceber: receberTotal,
|
areceber: receberTotal,
|
||||||
cancelamentos: cancelTotal,
|
cancelamentos: cancelTotal,
|
||||||
// Full arrays for backend/storage
|
// Full arrays for preview
|
||||||
despesas_arr: estado.despesas.map(r => ({ desc: r.desc||'', obs: r.obs||'', valor: r.valor||0 })),
|
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||'' })),
|
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 })),
|
pixcnpj_arr: estado.pixcnpj.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),
|
||||||
vales_arr: estado.vales.map(r => ({ nome: r.nome||'', obs: r.obs||'', valor: r.valor||0 })),
|
vales_arr: estado.vales.map(r => ({ nome: r.nome||'', obs: r.obs||'', valor: r.valor||0 })),
|
||||||
receber_arr: estado.receber.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),
|
receber_arr: estado.receber.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),
|
||||||
cancelamentos_arr: estado.cancelamentos.map(r => ({ numero: r.numero||'', valor: r.valor||0, motivo: r.motivo||'' })),
|
cancelamentos_arr: estado.cancelamentos.map(r => ({ numero: r.numero||'', valor: r.valor||0, motivo: r.motivo||'' })),
|
||||||
cartoes: { credito: cartCred, debito: cartDeb, alimentacao: cartAli, pix: 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,
|
observacoes: estado.observacoes,
|
||||||
sync_status: estado.sync_status,
|
sync_status: estado.sync_status,
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// Tenta ESC/POS via Tauri primeiro; se falhar, abre preview
|
async function tauriRecibo() {
|
||||||
|
const data = buildReciboData();
|
||||||
|
|
||||||
|
// Tenta ESC/POS via Tauri primeiro; se falhar, so lanca erro (preview tratado pelo caller)
|
||||||
try {
|
try {
|
||||||
return await window.__TAURI__.core.invoke('imprimir_recibo', { data: JSON.stringify(data) });
|
return await window.__TAURI__.core.invoke('imprimir_recibo', { data: JSON.stringify(data) });
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.warn('ESC/POS falhou, abrindo preview:', e);
|
console.warn('ESC/POS falhou:', e);
|
||||||
openPrintPreview(data);
|
throw e; // re-lanca para o caller tratar o preview
|
||||||
throw e;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1818,39 +1828,17 @@ document.getElementById('modal-confirm').addEventListener('click', e => { if (e.
|
|||||||
|
|
||||||
// Print from confirm modal — abre preview idêntico ao modal de confirmação
|
// Print from confirm modal — abre preview idêntico ao modal de confirmação
|
||||||
document.getElementById('confirm-print').addEventListener('click', async () => {
|
document.getElementById('confirm-print').addEventListener('click', async () => {
|
||||||
|
// Usa buildReciboData para não duplicar lógica e ter todos os campos certos
|
||||||
|
let data;
|
||||||
|
try {
|
||||||
|
data = buildReciboData();
|
||||||
|
} catch(e) {
|
||||||
|
console.error('Erro ao montar dados do recibo:', e);
|
||||||
|
alert('Erro ao montar dados do recibo.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Fecha modal APÓS gerar preview (não antes)
|
||||||
closeConfirmModal();
|
closeConfirmModal();
|
||||||
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 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 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: 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 })),
|
|
||||||
vales_arr: estado.vales.map(r => ({ nome: r.nome||'', obs: r.obs||'', valor: r.valor||0 })),
|
|
||||||
receber_arr: estado.receber.map(r => ({ nome: r.nome||'', valor: r.valor||0 })),
|
|
||||||
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');
|
openPrintPreview(data, 'confirm');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1895,13 +1883,19 @@ document.getElementById('btn-recibo').addEventListener('click', async () => {
|
|||||||
const btn = document.getElementById('btn-recibo');
|
const btn = document.getElementById('btn-recibo');
|
||||||
btn.disabled = true;
|
btn.disabled = true;
|
||||||
try {
|
try {
|
||||||
// Tenta ESC/POS primeiro; se falhar, abre preview no navegador
|
// Tenta ESC/POS primeiro; se falhar, nada acontece visualmente
|
||||||
|
// — siempre abre preview depois para o usuário ver algo
|
||||||
await tauriRecibo();
|
await tauriRecibo();
|
||||||
// Se chegou aqui sem erro, ESC/POS funcionou
|
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
// ESC/POS falhou — openPrintPreview já foi chamado dentro de tauriRecibo
|
console.warn('ESC/POS falhou:', e);
|
||||||
// Só mostra alerta se nem o preview abriu
|
}
|
||||||
console.warn('Recibo:', e);
|
// Sempre abre preview depois da tentativa ESC/POS
|
||||||
|
try {
|
||||||
|
const data = buildReciboData();
|
||||||
|
openPrintPreview(data, 'recibo');
|
||||||
|
} catch(e2) {
|
||||||
|
console.error('Preview falhou:', e2);
|
||||||
|
alert('Erro ao gerar preview do recibo.');
|
||||||
} finally {
|
} finally {
|
||||||
btn.disabled = false;
|
btn.disabled = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user