diff --git a/src/index.html b/src/index.html index df9b85c..30f2346 100644 --- a/src/index.html +++ b/src/index.html @@ -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'); @@ -1700,132 +1703,137 @@ document.getElementById('btn-limpar').addEventListener('click', () => { showToast('Rascunho limpo.', 'info'); }); -document.getElementById('btn-anterior').addEventListener('click', async () => { - console.log('[DEBUG] btn-anterior clicado'); - const loja = val('f-loja') || 'União'; - console.log('[DEBUG] btn-anterior loja:', loja); +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 }); - console.log('[DEBUG] sb_listar_recentes retornou:', recentList?.length, 'itens'); - } catch(e) { - console.warn('sb_listar_recentes falhou:', e); - } + // 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); + // 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]; + 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]; - } - console.log('[DEBUG] selectedDate:', selectedDate, 'selectedId:', selectedId); + // 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]; + } + 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(); + await tauriSaveLocal(); + 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) { - 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); } - } + // 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 }); - console.log('[DEBUG] carregar_rascunho local retornou:', !!rascunho); - } 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) { - 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) { + 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) { - 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', ''); - } - estado.sync_status = rascunho ? 'loaded' : 'local'; + estado.sync_status = rascunho ? 'loaded' : 'local'; - PRE_FILL_TABLES.forEach(ensureOneRow); - Object.keys(TABLES).forEach(renderTable); - updateTotals(); - scheduleSave(); - console.log('[DEBUG] btn-anterior concluído'); -}); + 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(); });