From d77ad55fbd5a37abfc962ba13faecbb6c6a8e74a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 1 Jul 2026 19:57:37 +0000 Subject: [PATCH] feat: modal consulta com busca (data/operador/turno) + filtro 2 dias + data-item nos tr --- src/index.html | 220 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 197 insertions(+), 23 deletions(-) diff --git a/src/index.html b/src/index.html index a571c35..83ef315 100644 --- a/src/index.html +++ b/src/index.html @@ -1872,9 +1872,12 @@ function buildReciboData() { const receberTotal = estado.receber.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0); const cancelTotal = estado.cancelamentos.reduce((s,r) => s+(parseNum(r.valor||0)||0), 0); - // Lê do DOM — mas se estiver vazio usa estado (registro anterior) + // Lê do DOM (campos do formulário principal — preenchidos pelo updateTotals após edição) + // Fallback: se DOM vazio, usa estado (registro anterior carregado mas updateTotals ainda não chamou) const trocoDom = parseNum(val('sys-troco')); const saldoTroco = trocoDom || estado.saldo_troco || 0; + // Os campos readonly sys-credito/sys-debito etc. só têm valor se updateTotals foi chamado + // — em edição sem confirmação, ficam vazios e,我们必须 usar cartDeb etc. do estado const saldoCred = parseNum(val('sys-credito')) || cartCred; const saldoDeb = parseNum(val('sys-debito')) || cartDeb; const saldoAli = parseNum(val('sys-alimentacao')) || cartAli; @@ -1889,7 +1892,7 @@ function buildReciboData() { const fechamentoCounted = fechamentoDinheiro + fechamentoCartoes + fechamentoReceber; const saldoEsperado = parseNum(val('f-saldo-esperado')) || estado.saldo_esperado || 0; - // Saldo de Caixa (Sistema) = troco + crédito + débito + alimentação + voucher pix + pixcnpj + vales + receber + // Saldo de Caixa (Sistema) = troco + crédito + débito + alimentação + pix cartão + pixcnpj + vales + receber const sysTotal = saldoTroco + cartCred + cartDeb + cartAli + cartPix + pixCnpjTotal + valesTotal + receberTotal; // Diferença = saldo de caixa (sistema) - saldo_esperado - cancelamentos const diferenca = sysTotal - saldoEsperado - cancelTotal; @@ -2203,32 +2206,130 @@ function buildConsultaModal(recentList) { }).join(''); overlay.innerHTML = ` -
+
-

📅 Consultar Fechamentos Anteriores

+

📅 Consultar Fechamentos

-

Clique em um registro para ver o relatório ou clique em Editar para abrir a janela de edição.

- - - - - - - - - - - - - - ${rows} -
DATAOPERADORTURNOSALDO CAIXAESPERADOSTATUSSYNCAÇÃO
-
- `; +
+ + +
+
+
+ + + + + + + + + + + + + +
DATAOPERADORTURNOSALDO CAIXAESPERADOSTATUSAÇÃO
+
+
`; + + // Store original list for filtering + window._consultaList = recentList; + window._consultaAll = recentList; + window._recentList = recentList; // keep for legacy openConsultaRegistro(idx) + + const fmtDate = d => { + if (!d) return ''; + const [y,m,day] = d.split('-'); + return `${day}/${m}/${y}`; + }; + const fmtMoney = v => v != null ? `R$ ${parseFloat(v).toFixed(2).replace('.', ',')}` : 'R$ 0,00'; + const statusBadge = s => { + if (s === 'ok') return '✓ OK'; + if (s === 'sobrando') return '⚠ SOBRANDO'; + if (s === 'faltando') return '⚠ FALTANDO'; + return s || '?'; + }; + const syncBadge = s => { + const colors = { synced: '#2e7d32', local: '#e65100', syncing: '#f57f17', error: '#c0272d' }; + const labels = { synced: '✓ Sync', local: '⚠ Local', syncing: '⏳ Sync', error: '✗ Erro' }; + return `${labels[s]||s||'?'}`; + }; + + function renderConsultaRows(list) { + const tbody = document.getElementById('consulta-tbody'); + if (!list || list.length === 0) { + tbody.innerHTML = `Nenhum fechamento encontrado.`; + document.getElementById('consulta-count').textContent = '0 registros'; + return; + } + const count = document.getElementById('consulta-count'); + if (count) count.textContent = `${list.length} registro${list.length !== 1 ? 's' : ''}`; + tbody.innerHTML = list.map((item, i) => { + const sysTotal = (parseFloat(item.saldo_troco)||0) + + (parseFloat(item.saldo_credito)||0) + + (parseFloat(item.saldo_debito)||0) + + (parseFloat(item.saldo_alimentacao)||0) + + (parseFloat(item.saldo_vales)||0) + + (parseFloat(item.saldo_areceber)||0) + + (parseFloat(item.total_pixcnpj)||0) + + (parseFloat(item.total_cartao_pix)||0); + return ` + ${fmtDate(item.data)} + ${item.operador||'?'} + ${item.turno||'?'} + ${fmtMoney(sysTotal)} + ${fmtMoney(item.saldo_esperado)} + ${statusBadge(item.status_diferenca)} + + + + `; + }).join(''); + } + + // Initial: filter to last 2 days + const today = new Date(); + const cutoff = new Date(today); + cutoff.setDate(today.getDate() - 2); + const cutoffStr = cutoff.toISOString().split('T')[0]; + const twoDays = recentList.filter(item => item.data >= cutoffStr); + renderConsultaRows(twoDays); + window._consultaFiltered = twoDays; + + // Search handler — filters by data, operador, or turno + document.getElementById('consulta-search').addEventListener('input', e => { + const q = e.target.value.toLowerCase().trim(); + const turno = (document.getElementById('consulta-turno')?.value || '').toLowerCase(); + const filtered = recentList.filter(item => { + const matchQ = !q || (item.data||'').includes(q) || (item.operador||'').toLowerCase().includes(q) || (item.turno||'').toLowerCase().includes(q); + const matchTurno = !turno || (item.turno||'').toLowerCase() === turno; + return matchQ && matchTurno; + }); + renderConsultaRows(filtered); + window._consultaFiltered = filtered; + }); + + document.getElementById('consulta-turno').addEventListener('change', e => { + const q = (document.getElementById('consulta-search')?.value || '').toLowerCase().trim(); + const turno = e.target.value.toLowerCase(); + const filtered = recentList.filter(item => { + const matchQ = !q || (item.data||'').includes(q) || (item.operador||'').toLowerCase().includes(q) || (item.turno||'').toLowerCase().includes(q); + const matchTurno = !turno || (item.turno||'').toLowerCase() === turno; + return matchQ && matchTurno; + }); + renderConsultaRows(filtered); + window._consultaFiltered = filtered; + }); document.body.appendChild(overlay); - window._recentList = recentList; + overlay.addEventListener('click', e => { if (e.target === overlay) closeConsultaModal(); }); } // Abre a janela de edição completa de um registro pelo índice na lista @@ -2272,6 +2373,79 @@ function closeConsultaModal() { window._currentConsulta = null; } +// Abre o relatório pelo elemento (evita dependência de índice) +window.openConsultaRegistroByItem = async function(tr) { + const dataAttr = tr ? tr.dataset.item : null; + let item = null; + if (dataAttr) { + try { item = JSON.parse(dataAttr); } catch(e) {} + } + if (!item) { + // Fallback: busca pelo texto da primeira célula (data) + const dataText = tr.cells[0]?.textContent?.trim(); + if (dataText) { + const [d,m,y] = dataText.split('/'); + const dataKey = `${y}-${m}-${d}`; + item = window._consultaAll?.find(it => it.data === dataKey); + } + } + if (!item) { alert('Registro não encontrado.'); return; } + closeConsultaModal(); + + const hasTauri = !!(window.__TAURI__ && window.__TAURI__.core); + if (!hasTauri) { alert('Tauri não disponível.'); return; } + + let full = null; + try { + if (item.id) { try { full = await window.__TAURI__.core.invoke('sb_buscar_por_id', { id: item.id }); } catch(e) {} } + if (!full && item.uuid) { try { full = await window.__TAURI__.core.invoke('sb_buscar_por_uuid', { uuid: item.uuid }); } catch(e) {} } + if (!full && item.id_fechamento) { try { full = await window.__TAURI__.core.invoke('sb_buscar_por_id_fechamento', { idFechamento: item.id_fechamento }); } catch(e) {} } + } catch(e) { console.warn('Erro buscando registro:', e); } + + if (!full) { alert('Registro não encontrado.'); return; } + window._currentConsulta = full; + buildRelatorioModal(full); +}; + +// Abre a edição pelo elemento (evita dependência de índice) +window.abrirEditaFechamentoByItem = async function(tr) { + const dataAttr = tr ? tr.dataset.item : null; + let item = null; + if (dataAttr) { + try { item = JSON.parse(dataAttr); } catch(e) {} + } + if (!item) { + const dataText = tr.cells[0]?.textContent?.trim(); + if (dataText) { + const [d,m,y] = dataText.split('/'); + const dataKey = `${y}-${m}-${d}`; + item = window._consultaAll?.find(it => it.data === dataKey); + } + } + if (!item) { alert('Registro não encontrado.'); return; } + + const hasTauri = !!(window.__TAURI__ && window.__TAURI__.core); + if (!hasTauri) { alert('Tauri não disponível.'); return; } + + let full = null; + try { + if (item.id) { try { full = await window.__TAURI__.core.invoke('sb_buscar_por_id', { id: item.id }); } catch(e) {} } + if (!full && item.uuid) { try { full = await window.__TAURI__.core.invoke('sb_buscar_por_uuid', { uuid: item.uuid }); } catch(e) {} } + if (!full && item.id_fechamento) { try { full = await window.__TAURI__.core.invoke('sb_buscar_por_id_fechamento', { idFechamento: item.id_fechamento }); } catch(e) {} } + } catch(e) { console.warn('Erro buscando registro:', e); } + + if (!full) { alert('Registro não encontrado.'); return; } + window._currentConsulta = full; + closeConsultaModal(); + closeRelatorioModal(); + + const pw = localStorage.getItem('admin_pw') || '1234'; + const granted = await askPassword(pw); + if (!granted) return; + + openEditModal(full); +}; + // Abre o relatório de um registro selecionado window.openConsultaRegistro = async function(idx) { const item = window._recentList[idx];