Histórico do Projeto — Fechamento de Caixa O Frangão
Contexto
Dono: Filipe.Tavares — O Frangão (lojas União e Aliança)
Problema original: Planilhas manuais + webhooks n8n frágeis para registrar fechamento de caixa
Solução: App desktop Tauri 2 + SQLite offline + Supabase cloud + impressão térmica 80mm
Repositório
Stack Técnica
| Camada |
Tecnologia |
| Frontend |
HTML5 + CSS + JavaScript vanilla (single-file src/index.html) |
| Runtime |
Tauri 2 (Rust + WebView2) |
| Dados local |
SQLite via rusqlite |
| Dados cloud |
Supabase — PostgreSQL + REST API |
| Impressão |
HTML → window.print() com CSS @media print (80mm) |
| Build |
Cross-compile Linux → Windows (x86_64-pc-windows-gnu) |
Releases
| Tag |
Data |
Descrição |
v2.0.4-alianca |
2026-07-05 |
Fix preview modal re-open + sys_total recalc |
v2.0.3-uniao |
2026-07-05 |
Fix diferença cálculo from array |
v2.0.2-uniao |
2026-07-05 |
Fix buildPrintHTML sys_total |
v2.0.1-uniao |
2026-07-05 |
Builds separadas + docs |
v2.0.0-uniao/alianca/ambos |
2026-07-04 |
Lançamento — app completo com Tauri 2 |
Bugs Corrigidos (desde v2.0.0)
Preview + Modal (v2.0.4)
237ceab — confirm-print não fechava mais o modal antes de abrir o preview; openPrintPreview reabria o modal ao fechar se ele ainda estava aberto
73c2027 — closeConfirmModal() era chamada antes de openPrintPreview() — preview cobria o modal, mas ao fechar voltava pro form
56a2ed5 — buildPrintHTML usava data.diferenca (precomputado, stale) em vez de recalcular sys_total - saldo_esperado - cancelamentos inline
Cálculo da Diferença (v2.0.3)
acb90f0 — diferenca sempre recalculada da array de cancelamentos (não do escalar total_cancelamentos)
6eb08b6 — mesmo fix em buildReportHTML, buildPrintHTML, buildConfirmHTML
5a01264 — ignora data.diferenca pré-computado, recalcula sempre de sys_total
Rust ESCPOS (v2.0.3)
733519e — Rust to_escpos: diferença = sys_total - saldo_esperado - total_cancelamentos (não mais fechamento)
CSS / Layout (v2.0.2)
6440b26 — buildReportHTML: diferença = sysTotal - saldoEsp - cancelamentos
420e104 — buildConfirmHTML e buildPrintHTML usavam sysTotal/total_cancelamentos em vez de sys_total/cancelamentos
b04e5ac — .main min-height:0 (footer invisível em resoluções pequenas)
65c444a — seletor loja escondia errado (caracteres asiáticos no DOM)
2bfbf29 — values das options de loja sem acento (Uniao/Alianca) — alinhado com LOJA_FIXA do Rust
Impressão (v2.0.1)
Builds (v2.0.0)
659d977 — DOBRADO_LOJA injetado via env no build — 3 binários: fc-uniao.exe, fc-alianca.exe, fc-ambos.exe
Bugs Pendentes (conhecidos)
| # |
Bug |
Prioridade |
Status |
| #6 |
salvarEdicaoModal reconstrói id_fechamento dos inputs em vez de usar full.id_fechamento — PATCH pode errar se operador mudar loja/data/operador |
Média |
Pendente |
Arquitetura de Dados
SQLite local (offline-first)
Supabase cloud
Fluxo de sync
Comandos Tauri (frontend chama via invoke)
| Comando |
Descrição |
salvar_fechamento |
Salva estado no SQLite local |
carregar_rascunho |
Carrega rascunho por loja+data |
sb_salvar_fechamento |
POST para Supabase |
sb_listar_recentes |
Lista fechamentos recentes |
sb_buscar_por_id |
Busca por ID numérico |
sb_buscar_por_uuid |
Busca por UUID |
detectar_impressora |
Detecta EPSON TM-T20 |
imprimir_recibo |
Imprime via ESCPOS ou fallback window.print() |
Builds — 3 versões
| Binário |
Loja |
Seletor |
fc-uniao.exe |
Fixa: UNIÃO |
Escondido |
fc-alianca.exe |
Fixa: ALIANÇA |
Escondido |
fc-ambos.exe |
Livre |
Dropdown visível |
Como buildar
Lições Aprendidas
- Cálculos sempre inline — nunca usar valores pré-computados (
data.diferenca, data.total_cancelamentos) que podem estar stale. Sempre recalcular da fonte.
- Fechar modal ANTES de abrir overlay — se um modal vai ser coberto por outro, fechar primeiro e reabrir depois (salvar estado).
- Cross-compile Linux→Windows — funciona perfeitamente com
x86_64-pc-windows-gnu target.
- Gitea API —
Authorization: token {TOKEN} (minúsculo token) funciona; Token {TOKEN} não. Upload de assets funciona; DELETE de assets retorna 404 (bug do Gitea?).
Autores
- Filipe.Tavares — dono das lojas / demandante
- Hermes Agent — desenvolvimento + debugging