diff --git a/README.md b/README.md index 37e03a0..c36b394 100644 --- a/README.md +++ b/README.md @@ -87,11 +87,13 @@ fechamento-caixa/ O mesmo código gera 3 binários diferentes conforme a variável de ambiente `DOBRADO_LOJA`: -| Binário | Loja | Como buildar | -|---------|------|-------------| -| `fc-uniao.exe` | **Travada: UNIÃO** | `DOBRADO_LOJA=Uniao cargo build --release --target x86_64-pc-windows-gnu` | -| `fc-alianca.exe` | **Travada: ALIANÇA** | `DOBRADO_LOJA=Alianca cargo build --release --target x86_64-pc-windows-gnu` | -| `fc-ambos.exe` | **Livre (União / Aliança)** | `cargo build --release --target x86_64-pc-windows-gnu` (sem env) | +## Downloads + +| Binário | Loja | Download | +|---------|------|----------| +| `fc-uniao.exe` | **Travada: UNIÃO** | [Baixar](https://git.ofrangao.com.br/filipe/fechamento-caixa/releases/download/v2.0.0-uniao/fc-uniao.exe) | +| `fc-alianca.exe` | **Travada: ALIANÇA** | [Baixar](https://git.ofrangao.com.br/filipe/fechamento-caixa/releases/download/v2.0.0-alianca/fc-alianca.exe) | +| `fc-ambos.exe` | **Seletor livre** | [Baixar](https://git.ofrangao.com.br/filipe/fechamento-caixa/releases/download/v2.0.0-ambos/fc-ambos.exe) | Quando a loja é fixa, o seletor de loja no formulário é **escondido via JavaScript** e tentativas de mudar via API retornam erro. @@ -129,6 +131,60 @@ Quando a loja é fixa, o seletor de loja no formulário é **escondido via JavaS --- +## Tauri — o runtime desktop + +O app roda como **Tauri 2**, um runtime que embute um navegador WebView2 (Windows) dentro de um processo Rust. + +### O que o Tauri fornece + +| Recurso | Como é usado | +|---------|-------------| +| **Janela nativa** | A janela do app com barra de título, controls de redimensionar, ícone | +| **Sistema de arquivos** | Lê/escreve `config.json` e `fechamento.db` em `%LOCALAPPDATA%/FechamentoCaixa/` | +| **Invocação de comandos Rust** | Frontend JS chama `invoke('nome_comando', args)` → Rust executa e retorna | +| **HTTP client** | Plugin `supabase.rs` usa `reqwest` para falar com o Supabase | +| **Shell** | Abre diálogo de impressoras, executa `cmd /C copy` para impressão | +| **Diálogos nativos** | `tauri_plugin_dialog` para escolher arquivos, pastas, impressora | + +### Comandos Tauri (Rust → JS) + +O frontend **nunca acessa** Supabase, SQLite ou impressora diretamente. Tudo passa por `invoke`: + +```javascript +// Salvar fechamento (SQLite + Supabase) +await invoke('salvar_fechamento', { estado }); + +// Sync com Supabase +await invoke('sb_salvar_fechamento', { estado }); + +// Detectar impressora +await invoke('detectar_impressora'); + +// Imprimir +await invoke('imprimir_recibo', { html: reciboHTML }); +``` + +### Estrutura dos plugins Rust + +``` +src-tauri/src/plugins/ +├── app.rs — Config da app (loja, operador default, sync) +├── storage.rs — SQLite local (fonte primária offline) +├── supabase.rs — Cliente HTTP para Supabase (service_role JWT) +├── printer.rs — Detecção EPSON TM-T20, fallback para window.print() +└── escpos.rs — Helpers ESCPOS (alinhamento, negrito, corte) +``` + +### Onde os dados ficam + +| Dado | Local | +|------|-------| +| Config (SUPABASE keys, loja default) | `%LOCALAPPDATA%/FechamentoCaixa/config.json` | +| Banco SQLite (fechamentos) | `%LOCALAPPDATA%/FechamentoCaixa/fechamento.db` | +| Rascunho auto-save | `%LOCALAPPDATA%/FechamentoCaixa/fechamento_rascunho.db` | + +--- + ## Autores & Contexto - **Desenvolvedor:** Filipe.Tavares