|
|
|
@@ -1290,7 +1290,10 @@ function buildConfirmHTML(data) {
|
|
|
|
|
// ─── Print Preview Window ──────────────────────────────────────────────────
|
|
|
|
|
function buildPrintHTML(data) {
|
|
|
|
|
const fmt = v => 'R$ ' + (v || 0).toFixed(2).replace('.', ',');
|
|
|
|
|
const diferenca = (data.fechamento || 0) - (data.saldo_esperado || 0);
|
|
|
|
|
// Usa a diferenca ja calculada pelo tauriRecibo (sys_total - saldo_esperado),
|
|
|
|
|
// igual ao modal de confirmacao — nao recalcula de fechamento.
|
|
|
|
|
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');
|
|
|
|
|
|
|
|
|
@@ -1520,7 +1523,7 @@ async function tauriRecibo() {
|
|
|
|
|
|
|
|
|
|
// Tenta ESC/POS via Tauri primeiro; se falhar, abre preview
|
|
|
|
|
try {
|
|
|
|
|
return await window.__TAURI__.core.invoke('imprimir_recibo', { estado: JSON.stringify(data) });
|
|
|
|
|
return await window.__TAURI__.core.invoke('imprimir_recibo', { data: JSON.stringify(data) });
|
|
|
|
|
} catch(e) {
|
|
|
|
|
console.warn('ESC/POS falhou, abrindo preview:', e);
|
|
|
|
|
openPrintPreview(data);
|
|
|
|
@@ -1539,13 +1542,17 @@ async function tauriCarregarRascunho() {
|
|
|
|
|
|
|
|
|
|
// ─── Confirm Modal ────────────────────────────────────────────────────────
|
|
|
|
|
function openConfirmModal() {
|
|
|
|
|
console.log('[DEBUG] openConfirmModal chamado');
|
|
|
|
|
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');
|
|
|
|
|
alert('⚠️ Preencha Operador, Turno e Loja antes de enviar.');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
console.log('[DEBUG] openConfirmModal: campos OK, montando modal');
|
|
|
|
|
// Build summary
|
|
|
|
|
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);
|
|
|
|
@@ -1559,7 +1566,8 @@ function openConfirmModal() {
|
|
|
|
|
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 saldoEsp = parseNum(val('f-saldo-esperado'));
|
|
|
|
|
const diferenca = (parseNum(val('sys-troco')) || 0) - saldoEsp;
|
|
|
|
|
const sysTotal = (parseNum(val('sys-troco')) || 0) + cartCred + cartDeb + cartAli + cartPix + vales + receber + pixcnpj;
|
|
|
|
|
const diferenca = sysTotal - saldoEsp;
|
|
|
|
|
const diffClass = diferenca === 0 ? '#2e7d32' : (diferenca > 0 ? '#e65100' : '#c0272d');
|
|
|
|
|
document.getElementById('confirm-summary').innerHTML =
|
|
|
|
|
`<div style="margin-bottom:6px"><strong>📅 Data:</strong> ${estado.data} <strong>👤 Operador:</strong> ${operador} <strong>⏰ Turno:</strong> ${turno} <strong>🏪 Loja:</strong> ${loja}</div>
|
|
|
|
@@ -1573,11 +1581,13 @@ function openConfirmModal() {
|
|
|
|
|
<div>💳 Débito: <strong>${fmt(cartDeb)}</strong></div>
|
|
|
|
|
<div>💳 Alimentação: <strong>${fmt(cartAli)}</strong></div>
|
|
|
|
|
<div>❌ Cancelamentos: <strong>${fmt(cancelamentos)}</strong></div>
|
|
|
|
|
<div>📋 Fechamento: <strong>${fmt(fechamento)}</strong></div>
|
|
|
|
|
<div>📋 Fechamento (contado): <strong>${fmt(fechamento)}</strong></div>
|
|
|
|
|
<div>🖥️ Total Sistema: <strong>${fmt(sysTotal)}</strong></div>
|
|
|
|
|
<hr style="border:none;border-top:1px dashed #b3d9f7;margin:6px 0">
|
|
|
|
|
<div>🎯 Saldo Esperado: <strong>${fmt(saldoEsp)}</strong></div>
|
|
|
|
|
<div>🎯 Saldo Esperado (contado): <strong>${fmt(saldoEsp)}</strong></div>
|
|
|
|
|
<div style="margin-top:4px">📐 Diferença: <strong style="color:${diffClass}">${fmt(diferenca)}</strong></div>
|
|
|
|
|
<div style="margin-top:4px;font-size:10px;color:#888">ID: ${estado.loja}_${estado.data}_${estado.operador}</div>`;
|
|
|
|
|
console.log('[DEBUG] openConfirmModal: tentando abrir modal');
|
|
|
|
|
document.getElementById('modal-confirm').classList.add('open');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1646,6 +1656,11 @@ document.getElementById('confirm-send').addEventListener('click', async () => {
|
|
|
|
|
|
|
|
|
|
// ─── Buttons ───────────────────────────────────────────────────────────────
|
|
|
|
|
document.getElementById('btn-enviar').addEventListener('click', () => {
|
|
|
|
|
console.log('[DEBUG] btn-enviar clicado');
|
|
|
|
|
const operador = document.getElementById('f-operador')?.value;
|
|
|
|
|
const turno = document.getElementById('f-turno')?.value;
|
|
|
|
|
const loja = document.getElementById('f-loja')?.value;
|
|
|
|
|
console.log('[DEBUG] operador:', operador, 'turno:', turno, 'loja:', loja);
|
|
|
|
|
openConfirmModal();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@@ -1669,131 +1684,169 @@ document.getElementById('btn-limpar').addEventListener('click', () => {
|
|
|
|
|
if (!confirm('Limpar rascunho? Esta acção não pode ser revertida.')) return;
|
|
|
|
|
localStorage.removeItem(LS_KEY);
|
|
|
|
|
// Reseta estado e re-renderiza sem reload
|
|
|
|
|
estado = newEstado();
|
|
|
|
|
estado.loja = val('f-loja') || 'União';
|
|
|
|
|
estado.data = val('f-data') || new Date().toISOString().split('T')[0];
|
|
|
|
|
estado = {
|
|
|
|
|
uuid: crypto.randomUUID ? crypto.randomUUID() : Date.now().toString(),
|
|
|
|
|
loja: estado.loja, data: estado.data, operador: '', turno: '',
|
|
|
|
|
saldo_troco: 0, fechamento: 0, saldo_esperado: 0, diferenca: 0,
|
|
|
|
|
despesas: [], sangrias: [], pixcnpj: [], vales: [], receber: [], cancelamentos: [],
|
|
|
|
|
cartoes: { credito: [], debito: [], alimentacao: [], pix: [] },
|
|
|
|
|
fechamento_contado: { dinheiro: 0, cartoes: 0, receber: 0 },
|
|
|
|
|
observacoes: '', id_local: null, sync_status: 'local'
|
|
|
|
|
};
|
|
|
|
|
setVal('f-operador', ''); setVal('f-turno', '');
|
|
|
|
|
setVal('f-fech-dinheiro', ''); setVal('f-fech-cartoes', ''); setVal('f-fech-receber', '');
|
|
|
|
|
setVal('f-saldo-esperado', ''); setVal('f-obs', '');
|
|
|
|
|
setVal('sys-troco', '');
|
|
|
|
|
calcular();
|
|
|
|
|
renderAllTables();
|
|
|
|
|
syncUI();
|
|
|
|
|
showToast('Rascunho limpo.', 'info');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
document.getElementById('btn-anterior').addEventListener('click', async () => {
|
|
|
|
|
const loja = val('f-loja') || 'União';
|
|
|
|
|
const btnAnterior = document.getElementById('btn-anterior');
|
|
|
|
|
if (btnAnterior) {
|
|
|
|
|
btnAnterior.addEventListener('click', async () => {
|
|
|
|
|
console.log('[DEBUG] btn-anterior clicado');
|
|
|
|
|
const loja = val('f-loja') || 'União';
|
|
|
|
|
console.log('[DEBUG] btn-anterior loja:', loja);
|
|
|
|
|
|
|
|
|
|
// Carrega lista de fechamentos recentes do Supabase com uuid
|
|
|
|
|
let recentList = [];
|
|
|
|
|
try {
|
|
|
|
|
recentList = await window.__TAURI__.core.invoke('sb_listar_recentes', { loja, limite: 20 });
|
|
|
|
|
} catch(e) {
|
|
|
|
|
console.warn('sb_listar_recentes falhou:', e);
|
|
|
|
|
}
|
|
|
|
|
// Salva rascunho atual antes de tudo
|
|
|
|
|
await tauriSaveLocal();
|
|
|
|
|
|
|
|
|
|
// Extrai datas únicas ordenadas + mapeamento data→id
|
|
|
|
|
const dateIdMap = {};
|
|
|
|
|
const dateList = [];
|
|
|
|
|
if (recentList && recentList.length > 0) {
|
|
|
|
|
recentList.forEach(item => {
|
|
|
|
|
if (item.data && !dateIdMap[item.data]) {
|
|
|
|
|
dateIdMap[item.data] = item.id;
|
|
|
|
|
dateList.push(item.data);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
dateList.sort().reverse();
|
|
|
|
|
}
|
|
|
|
|
// Calcula dia anterior
|
|
|
|
|
const prevDate = new Date(estado.data);
|
|
|
|
|
prevDate.setDate(prevDate.getDate() - 1);
|
|
|
|
|
const prevDateStr = prevDate.toISOString().split('T')[0];
|
|
|
|
|
|
|
|
|
|
let selectedDate = null;
|
|
|
|
|
let selectedId = null;
|
|
|
|
|
if (dateList.length > 0) {
|
|
|
|
|
const msg = dateList.map((d, i) => `${i + 1}) ${d}`).join('\n');
|
|
|
|
|
const escolha = prompt(`Selecione o número do dia anterior:\n${msg}\n\n(Deixe em branco e clique Cancelar para ver só o dia anterior automático)`);
|
|
|
|
|
if (escolha !== null && escolha.trim() !== '') {
|
|
|
|
|
const idx = parseInt(escolha) - 1;
|
|
|
|
|
if (idx >= 0 && idx < dateList.length) {
|
|
|
|
|
selectedDate = dateList[idx];
|
|
|
|
|
selectedId = dateIdMap[selectedDate];
|
|
|
|
|
// Confirmação explícita antes de trocar de dia
|
|
|
|
|
const confirmMsg = `ATENÇÃO: vai carregar o fechamento de ${prevDateStr}.\n\nO formulário atual será LIMPO caso não tenha enviado.\n\nContinuar?`;
|
|
|
|
|
if (!confirm(confirmMsg)) {
|
|
|
|
|
console.log('[DEBUG] btn-anterior cancelado pelo usuário');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Carrega lista de fechamentos recentes do Supabase com uuid
|
|
|
|
|
let recentList = [];
|
|
|
|
|
try {
|
|
|
|
|
recentList = await window.__TAURI__.core.invoke('sb_listar_recentes', { loja, limite: 20 });
|
|
|
|
|
console.log('[DEBUG] sb_listar_recentes retornou:', recentList?.length, 'itens');
|
|
|
|
|
} catch(e) {
|
|
|
|
|
console.warn('sb_listar_recentes falhou:', e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Extrai datas únicas ordenadas + mapeamento data→id
|
|
|
|
|
const dateIdMap = {};
|
|
|
|
|
const dateList = [];
|
|
|
|
|
if (recentList && recentList.length > 0) {
|
|
|
|
|
recentList.forEach(item => {
|
|
|
|
|
if (item.data && !dateIdMap[item.data]) {
|
|
|
|
|
dateIdMap[item.data] = item.id;
|
|
|
|
|
dateList.push(item.data);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
dateList.sort().reverse();
|
|
|
|
|
}
|
|
|
|
|
console.log('[DEBUG] dateList:', dateList);
|
|
|
|
|
|
|
|
|
|
let selectedDate = null;
|
|
|
|
|
let selectedId = null;
|
|
|
|
|
if (dateList.length > 0) {
|
|
|
|
|
const msg = dateList.map((d, i) => `${i + 1}) ${d}`).join('\n');
|
|
|
|
|
const escolha = prompt(`Selecione o número do dia anterior:\n${msg}\n\n(Deixe em branco e clique Cancelar para ver só o dia anterior automático)`);
|
|
|
|
|
if (escolha !== null && escolha.trim() !== '') {
|
|
|
|
|
const idx = parseInt(escolha) - 1;
|
|
|
|
|
if (idx >= 0 && idx < dateList.length) {
|
|
|
|
|
selectedDate = dateList[idx];
|
|
|
|
|
selectedId = dateIdMap[selectedDate];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Se não escolheu data, usa dia anterior automático (sem id — carrega por data)
|
|
|
|
|
if (!selectedDate) {
|
|
|
|
|
const d = new Date(estado.data); d.setDate(d.getDate() - 1);
|
|
|
|
|
selectedDate = d.toISOString().split('T')[0];
|
|
|
|
|
}
|
|
|
|
|
// Se não escolheu data, usa dia anterior automático (sem id — carrega por data)
|
|
|
|
|
if (!selectedDate) {
|
|
|
|
|
selectedDate = prevDateStr;
|
|
|
|
|
}
|
|
|
|
|
console.log('[DEBUG] selectedDate:', selectedDate, 'selectedId:', selectedId);
|
|
|
|
|
|
|
|
|
|
await tauriSaveLocal();
|
|
|
|
|
setVal('f-data', selectedDate);
|
|
|
|
|
estado.data = selectedDate;
|
|
|
|
|
estado.uuid = crypto.randomUUID ? crypto.randomUUID() : Date.now().toString();
|
|
|
|
|
estado.id_local = null;
|
|
|
|
|
syncHeader();
|
|
|
|
|
setVal('f-data', selectedDate);
|
|
|
|
|
estado.data = selectedDate;
|
|
|
|
|
estado.uuid = crypto.randomUUID ? crypto.randomUUID() : Date.now().toString();
|
|
|
|
|
estado.id_local = null;
|
|
|
|
|
syncHeader();
|
|
|
|
|
|
|
|
|
|
// Tenta Supabase primeiro (com id se disponível), senão local
|
|
|
|
|
let rascunho = null;
|
|
|
|
|
if (selectedId) {
|
|
|
|
|
// Usa sb_buscar_por_id para buscar por id numérico do Supabase
|
|
|
|
|
try {
|
|
|
|
|
rascunho = await window.__TAURI__.core.invoke('sb_buscar_por_id', { id: selectedId });
|
|
|
|
|
} catch(e) { console.warn('sb_buscar_por_id falhou:', e); }
|
|
|
|
|
}
|
|
|
|
|
if (!rascunho) {
|
|
|
|
|
try {
|
|
|
|
|
rascunho = await window.__TAURI__.core.invoke('sb_carregar_rascunho', { loja, data: selectedDate });
|
|
|
|
|
} catch(e) { console.warn('sb_carregar_rascunho falhou:', e); }
|
|
|
|
|
}
|
|
|
|
|
// Tenta Supabase primeiro (com id se disponível), senão local
|
|
|
|
|
let rascunho = null;
|
|
|
|
|
if (selectedId) {
|
|
|
|
|
try {
|
|
|
|
|
rascunho = await window.__TAURI__.core.invoke('sb_buscar_por_id', { id: selectedId });
|
|
|
|
|
console.log('[DEBUG] sb_buscar_por_id retornou:', !!rascunho);
|
|
|
|
|
} catch(e) { console.warn('sb_buscar_por_id falhou:', e); }
|
|
|
|
|
}
|
|
|
|
|
if (!rascunho) {
|
|
|
|
|
try {
|
|
|
|
|
rascunho = await window.__TAURI__.core.invoke('sb_carregar_rascunho', { loja, data: selectedDate });
|
|
|
|
|
console.log('[DEBUG] sb_carregar_rascunho retornou:', !!rascunho);
|
|
|
|
|
} catch(e) { console.warn('sb_carregar_rascunho falhou:', e); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!rascunho) {
|
|
|
|
|
try {
|
|
|
|
|
rascunho = await window.__TAURI__.core.invoke('carregar_rascunho', { loja, data: selectedDate });
|
|
|
|
|
} catch(e) { console.warn('carregar_rascunho local falhou:', e); }
|
|
|
|
|
}
|
|
|
|
|
if (!rascunho) {
|
|
|
|
|
try {
|
|
|
|
|
rascunho = await window.__TAURI__.core.invoke('carregar_rascunho', { loja, data: selectedDate });
|
|
|
|
|
console.log('[DEBUG] carregar_rascunho local retornou:', !!rascunho);
|
|
|
|
|
} catch(e) { console.warn('carregar_rascunho local falhou:', e); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (rascunho) {
|
|
|
|
|
if (rascunho.operador) { setVal('f-operador', rascunho.operador); estado.operador = rascunho.operador; }
|
|
|
|
|
if (rascunho.turno) { setVal('f-turno', rascunho.turno); estado.turno = rascunho.turno; }
|
|
|
|
|
if (rascunho.saldo_troco) setVal('sys-troco', fmtNum(rascunho.saldo_troco));
|
|
|
|
|
if (rascunho.saldo_esperado) setVal('f-saldo-esperado', fmtNum(rascunho.saldo_esperado));
|
|
|
|
|
if (rascunho.observacoes) { setVal('f-obs', rascunho.observacoes); estado.observacoes = rascunho.observacoes; }
|
|
|
|
|
if (rascunho.despesas && Array.isArray(rascunho.despesas)) {
|
|
|
|
|
estado.despesas = rascunho.despesas.map(d => ({ desc: d.desc || d.descricao || '', obs: d.obs || '', valor: parseNum(d.valor) || 0 }));
|
|
|
|
|
if (rascunho) {
|
|
|
|
|
console.log('[DEBUG] rascunho carregado com sucesso');
|
|
|
|
|
if (rascunho.operador) { setVal('f-operador', rascunho.operador); estado.operador = rascunho.operador; }
|
|
|
|
|
if (rascunho.turno) { setVal('f-turno', rascunho.turno); estado.turno = rascunho.turno; }
|
|
|
|
|
if (rascunho.saldo_troco) setVal('sys-troco', fmtNum(rascunho.saldo_troco));
|
|
|
|
|
if (rascunho.saldo_esperado) setVal('f-saldo-esperado', fmtNum(rascunho.saldo_esperado));
|
|
|
|
|
if (rascunho.observacoes) { setVal('f-obs', rascunho.observacoes); estado.observacoes = rascunho.observacoes; }
|
|
|
|
|
if (rascunho.despesas && Array.isArray(rascunho.despesas)) {
|
|
|
|
|
estado.despesas = rascunho.despesas.map(d => ({ desc: d.desc || d.descricao || '', obs: d.obs || '', valor: parseNum(d.valor) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.sangrias && Array.isArray(rascunho.sangrias)) {
|
|
|
|
|
estado.sangrias = rascunho.sangrias.map(s => ({ hora: s.hora || '', retirada: parseNum(s.retirada) || 0, gerente: s.gerente || '' }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.pixcnpj && Array.isArray(rascunho.pixcnpj)) {
|
|
|
|
|
estado.pixcnpj = rascunho.pixcnpj.map(p => ({ nome: p.nome || '', valor: parseNum(p.valor) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.vales && Array.isArray(rascunho.vales)) {
|
|
|
|
|
estado.vales = rascunho.vales.map(v => ({ nome: v.nome || '', obs: v.obs || '', valor: parseNum(v.valor) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.receber && Array.isArray(rascunho.receber)) {
|
|
|
|
|
estado.receber = rascunho.receber.map(r => ({ nome: r.nome || '', valor: parseNum(r.valor) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.cancelamentos && Array.isArray(rascunho.cancelamentos)) {
|
|
|
|
|
estado.cancelamentos = rascunho.cancelamentos.map(c => ({ numero: c.numero || '', valor: parseNum(c.valor) || 0, motivo: c.motivo || '' }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.cartoes) {
|
|
|
|
|
const norm = (arr) => Array.isArray(arr) ? arr.map(v => ({ valor: (typeof v === 'object' && v !== null) ? (parseNum(v.valor) || 0) : (parseNum(v) || 0) })) : [];
|
|
|
|
|
estado.cartoes.credito = norm(rascunho.cartoes.credito);
|
|
|
|
|
estado.cartoes.debito = norm(rascunho.cartoes.debito);
|
|
|
|
|
estado.cartoes.alimentacao = norm(rascunho.cartoes.alimentacao);
|
|
|
|
|
estado.cartoes.pix = norm(rascunho.cartoes.pix);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
console.log('[DEBUG] nenhum rascunho encontrado para esta data');
|
|
|
|
|
estado.despesas = []; estado.sangrias = []; estado.pixcnpj = [];
|
|
|
|
|
estado.vales = []; estado.receber = []; estado.cancelamentos = [];
|
|
|
|
|
estado.cartoes = { credito: [], debito: [], alimentacao: [], pix: [] };
|
|
|
|
|
setVal('sys-troco', ''); setVal('f-saldo-esperado', ''); setVal('f-obs', '');
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.sangrias && Array.isArray(rascunho.sangrias)) {
|
|
|
|
|
estado.sangrias = rascunho.sangrias.map(s => ({ hora: s.hora || '', retirada: parseNum(s.retirada) || 0, gerente: s.gerente || '' }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.pixcnpj && Array.isArray(rascunho.pixcnpj)) {
|
|
|
|
|
estado.pixcnpj = rascunho.pixcnpj.map(p => ({ nome: p.nome || '', valor: parseNum(p.valor) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.vales && Array.isArray(rascunho.vales)) {
|
|
|
|
|
estado.vales = rascunho.vales.map(v => ({ nome: v.nome || '', obs: v.obs || '', valor: parseNum(v.valor) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.receber && Array.isArray(rascunho.receber)) {
|
|
|
|
|
estado.receber = rascunho.receber.map(r => ({ nome: r.nome || '', valor: parseNum(r.valor) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.cancelamentos && Array.isArray(rascunho.cancelamentos)) {
|
|
|
|
|
estado.cancelamentos = rascunho.cancelamentos.map(c => ({ numero: c.numero || '', valor: parseNum(c.valor) || 0, motivo: c.motivo || '' }));
|
|
|
|
|
}
|
|
|
|
|
if (rascunho.cartoes) {
|
|
|
|
|
estado.cartoes.credito = (rascunho.cartoes.credito || []).map(v => ({ valor: parseNum(v) || 0 }));
|
|
|
|
|
estado.cartoes.debito = (rascunho.cartoes.debito || []).map(v => ({ valor: parseNum(v) || 0 }));
|
|
|
|
|
estado.cartoes.alimentacao = (rascunho.cartoes.alimentacao || []).map(v => ({ valor: parseNum(v) || 0 }));
|
|
|
|
|
estado.cartoes.pix = (rascunho.cartoes.pix || []).map(v => ({ valor: parseNum(v) || 0 }));
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
estado.despesas = []; estado.sangrias = []; estado.pixcnpj = [];
|
|
|
|
|
estado.vales = []; estado.receber = []; estado.cancelamentos = [];
|
|
|
|
|
estado.cartoes = { credito: [], debito: [], alimentacao: [], pix: [] };
|
|
|
|
|
setVal('sys-troco', ''); setVal('f-saldo-esperado', ''); setVal('f-obs', '');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Marcar que este é um rascunho carregado (não novo)
|
|
|
|
|
estado.sync_status = rascunho ? 'loaded' : 'local';
|
|
|
|
|
estado.sync_status = rascunho ? 'loaded' : 'local';
|
|
|
|
|
|
|
|
|
|
PRE_FILL_TABLES.forEach(ensureOneRow);
|
|
|
|
|
Object.keys(TABLES).forEach(renderTable);
|
|
|
|
|
updateTotals();
|
|
|
|
|
scheduleSave();
|
|
|
|
|
});
|
|
|
|
|
PRE_FILL_TABLES.forEach(ensureOneRow);
|
|
|
|
|
Object.keys(TABLES).forEach(renderTable);
|
|
|
|
|
updateTotals();
|
|
|
|
|
scheduleSave();
|
|
|
|
|
console.log('[DEBUG] btn-anterior concluído');
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
console.error('[DEBUG] btn-anterior NÃO encontrado no DOM!');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
document.getElementById('f-obs').addEventListener('input', e => { estado.observacoes = e.target.value; scheduleSave(); });
|
|
|
|
|
|
|
|
|
|