10 KiB
Arquitectura de Dados — O Frangão
Estado: em construção — 2026-07-10 Responsável: Filipe + Hermes Agent
1. Visão Geral
Dois sistemas a funcionar em paralelo durante a transição:
- Sistema antigo: SyncThing → N8N → Supabase → Google Sheets → Exportação → Meu Dinheiro
- Sistema novo (futuro): PDV Web → Supabase → (opcional) Google Sheets
Regra: manter ambos alimentados para não haver perda de dados.
2. Stack Tecnológica
| Componente | Tecnologia | Notas |
|---|---|---|
| Base de dados | Supabase (self-hosted) | VPS Hostinger |
| Automação | N8N | self-hosted |
| Ficheiros PDV | SyncThing | PC loja → VPS |
| Sheet de entrada | Google Sheets (VENDAS) | ~25k linhas desde 2021 |
| Gestão financeira | Meu Dinheiro (app) | Importação via CSV/Excel |
| Versionamento | Gitea (git.ofrangao.com.br) | Repos: fechamento-caixa, vault |
3. Base de Dados — Supabase
Tabela fechamentos_web
Tabela principal de fechamentos de caixa.
| Coluna | Tipo | Descrição |
|---|---|---|
id |
uuid | PK |
id_fechamento |
varchar(100) | ID único (ex: alianca_2026-07-08_sophia) |
data |
date | Data do fechamento |
loja |
varchar(20) | alianca ou uniao |
turno |
varchar(20) | manha / tarde / integral |
operador |
varchar(100) | Nome de quem fechou |
saldo_troco |
numeric(12,2) | Valor em troco |
saldo_credito |
numeric(12,2) | Cartão crédito |
saldo_debito |
numeric(12,2) | Cartão débito |
saldo_alimentacao |
numeric(12,2) | Ticket alimentação |
saldo_vales |
numeric(12,2) | Vales |
saldo_areceber |
numeric(12,2) | A receber |
saldo_pixcnpj |
numeric(12,2) | PIX |
fechamento_dinheiro |
numeric(12,2) | Dinheiro contado |
fechamento_cartoes |
numeric(12,2) | Cartões contados |
fechamento_areceber |
numeric(12,2) | A receber contado |
total_sangrias |
numeric(12,2) | Sangrias |
total_despesas |
numeric(12,2) | Despesas |
total_cancelamentos |
numeric(12,2) | Cancelamentos |
total_vales |
numeric(12,2) | Vales |
total_pixcnpj |
numeric(12,2) | PIX |
total_areceber |
numeric(12,2) | A receber |
total_cartao_credito |
numeric(12,2) | Crédito |
total_cartao_debito |
numeric(12,2) | Débito |
total_cartao_alimentacao |
numeric(12,2) | Alimentação |
total_cartao_pix |
numeric(12,2) | PIX cartão |
saldo_esperado |
numeric(12,2) | Total esperado |
diferenca |
numeric(12,2) | Diferença vs contado |
status_diferenca |
varchar(20) | ok ou divergente |
dados |
jsonb | Detalhe por transação |
clientes |
integer | Nº clientes |
frango |
integer | Nº frangos |
vendas |
numeric | Total vendas (do PDV) |
criado_em |
timestamptz | Data criação |
enviado_por |
varchar(100) | Origem do registo |
ip_origem |
inet | IP de origem |
user_agent |
text | Browser/cliente |
observacoes |
text | Notas |
atualizado_em |
timestamptz | Data última alteração |
Constraints:
UNIQUE (loja, data, turno, operador)loja IN ('alianca', 'uniao')turno IN ('manha', 'tarde', 'integral')
Tabela fechamento_web_log
Log de alterações — audit trail.
| Coluna | Tipo |
|---|---|
id |
bigint |
fechamento_id |
uuid → fechamentos_web.id |
acao |
varchar(20) |
dados |
jsonb |
criado_em |
timestamptz |
Tabela pdv_fechamento
Dados exportados do sistema PDV (legado).
| Coluna | Tipo | Descrição |
|---|---|---|
id |
bigint | PK |
data |
date | Data |
operador |
varchar(5) | Operador |
turno |
numeric | Turno |
pdv |
varchar(4) | Número PDV |
especie |
numeric(10,2) | Dinheiro |
cartao |
numeric(10,2) | Cartão |
aprazo |
numeric(10,2) | A prazo |
vale |
numeric(10,2) | Vale |
empresa |
varchar(10) | Empresa |
loja |
varchar(10) | alianca ou uniao |
fechado |
boolean | Se está fechado |
Nota: fechamentos_web.pdv_fechamento_id referencia pdv_fechamento.id
4. Google Sheets
Sheet "VENDAS"
URL: https://docs.google.com/spreadsheets/d/1OJZzDRTaU9Zh49QsgzAqNMxkn_7X7p7u_BiBBfStW3k/
Abas:
VENDAS— principal entrada de dadosVALESExportação— tratamento para importar no Meu DinheiroResumo— resumo para balançoDin_VendasCaixas Dias TrabRESUMO DESPESASDespTab AuxDias de Trablho CaixaDespesasResultado
Colunas da aba VENDAS (26 colunas):
| # | Header | Mapeamento Supabase | Notas |
|---|---|---|---|
| A | DATA | data |
Formato DD/MM/AAAA |
| B | EMPRESA | loja |
Aliança/Central/Minas/União |
| C | SANGRIAS | total_sangrias |
|
| D | DESPESAS | total_despesas |
|
| E | VALES | total_vales |
|
| F | DINHEIRO | fechamento_dinheiro |
|
| G | PIX TAV | total_pixcnpj |
PIX taxado (cobrado ao cliente) |
| H | PIX LOJA | saldo_pixcnpj |
PIX do cliente na loja |
| I | PRAZO | total_areceber |
|
| J | PZREC | saldo_areceber |
Valor a receber contado |
| K | CRÉDITO | total_cartao_credito |
|
| L | DÉBITO | total_cartao_debito |
|
| M | VOUCHER | total_cartao_alimentacao |
Ticket alimentação |
| N | CARTÃO | fechamento_cartoes |
|
| O | T. VENDA | vendas |
=SOMA(K7705:M7705) — total de vendas |
| P | TX CARTÃO | calculado | =SOMA(SEERRO(VENDAS!K*1,95%;0);SEERRO(VENDAS!L*1,2%;0);SEERRO(VENDAS!M*6%;0)) |
| Q | CLIENTES | clientes |
|
| R | Cancelamentos | total_cancelamentos |
|
| S | Sistema | pdv_fechamento |
Valor do PDV — referência |
| T | Diferença | diferenca |
|
| U | Caixa | operador |
Operador de caixa |
| V | PG | — | Descartar |
| W | Ano | — | Descartar |
| X | Mês | — | Descartar |
| Y | DiaSem | — | Descartar |
| Z | CredPix | — | Descartar |
Dados históricos:
- 25.000+ linhas (01/01/2021 — 31/12/2025)
- Lojas activas: Aliança, União
- Lojas fechadas: Central, Minas
5. Fluxos de Dados
Fluxo Actual (funciona)
PC PDV (ficheiros DBF)
↓ SyncThing
VPS (ficheiros)
↓ N8N ("PDV Sync - Syncthing para Supabase")
Supabase (tabela pdv_fechamento)
↓ N8N ("PDV → Google Sheets Sync")
Google Sheets (VENDAS)
↓
Sheet (Exportação) → CSV/Excel → Meu Dinheiro (app)
Fluxo App Fechamento Caixa → Sheet VENDAS (2026-07-10)
App Fechamento Caixa (Tauri)
↓ POST / rest/v1/fechamentos_web
Supabase (tabela fechamentos_web)
↓ N8N Workflow "Supabase → Sheet VENDAS" (20h BRT)
Google Sheets (VENDAS) ← última linha: 7729 (01/07/2026)
↓
Sheet (Exportação) → Meu Dinheiro
Nota: Os dois fluxos são independentes. O N8N do PDV não escreve na mesma Sheet que o App Fechamento Caixa — o App escreve em linha nova a partir da 7730.
6. Tarefas em Aberto
Alta Prioridade
-
Importar histórico Sheet → Supabase (~25k linhas, 2021-2025)
- Criar tabela
vendas_diariaspara dados agregados - Mapear colunas Sheet → Supabase
- Limpar dados de lojas fechadas (Central, Minas)
- Executar importação via script Python
- Criar tabela
-
Criar fluxo N8N: Supabase → Sheet VENDAS ✅ (2026-07-10)
- Workflow ID:
34cfbba7-b58a-4ba9-ac98-9c7755260722 - Trigger: schedule
0 20 * * *(20h BRT) - Nodes: Read Last Sync → Fetch Supabase → Filter+Map → Append VENDAS → Update Last Sync
- Credenciais:
SUPABASE_SHEETS_READER_KEYenv var + Google Sheets OAuth - Sheet "Sincronizacao" A1: guarda UTC timestamp do último sync
- ⚠️ Primeiro run: cells vazias na Sheet VENDAS (fórmulas T.VENDA, TX_CAIXA, SISTEMA ficam a 0)
- ⚠️ Necessário criar aba
Sincronizacaono spreadsheet com A1 vazio antes de activar
- Workflow ID:
Média Prioridade
-
Adicionar coluna
tx_cartaocalculada ao Supabase- Fórmula:
total_cartao_credito * 1.95% + total_cartao_debito * 1.2% + total_cartao_pix * 6%
- Fórmula:
-
Validar
Sistema(PDV) vsvendas— confirmar que girls estão a usar valor correcto -
Migrar
fechamento_web_logpara não bloquear DELETE
Baixa Prioridade
- Avaliar alternativa ao Meu Dinheiro (Falcon Finanças, etc.)
- Criar dashboard no Supabase para visualização directa
7. Notas Técnicas
Supabase (self-hosted)
-
Container IPs: podem mudar após
docker updateda Hostinger- ⚠️ IPs listados abaixo podem estar desactualizados — o cron
Kong DNS fixmantém okong.ymlactualizado - PostgREST (supabase-rest): ver cron
Kong DNS fix - Kong:
supabase-kong(mesmo host, porta 8000) - DB:
172.16.6.4 - Auth: ver cron
- Meta:
172.16.6.9 - Pooler:
172.16.6.10
- ⚠️ IPs listados abaixo podem estar desactualizados — o cron
-
Problema conhecido: IPs hardcoded no
kong.yml— corrigido automaticamente- Cron
Kong DNS fix(job ID:9a64e7b49ac6) corre a cada 15 min - Usa DNS names (
http://supabase-rest:3000/) em vez de IPs hardcoded - Compara IP actual do
supabase-restcom o emkong.yml - Se diferente: substitui e reinicia
supabase-kong
- Cron
Google Sheets API
- Service account:
n8n-integracao@n8n-automacao-filipetavares.iam.gserviceaccount.com - Credenciais:
/var/lib/docker/volumes/hermes-workspace-k9hd_hermes-agent-data/_data/google_service_account.json - Rate limit: 60 reads/minuto — evitar loops de polling
Gitea
- URL: https://git.ofrangao.com.br
- Token: (guardado em credentials-n8n-real.env)
- Repos:
filipe/fechamento-caixa,filipe/vault,filipe/ofrangao-ops - Atenção: token de git push NÃO funciona na API — usar token dedicado
8. Glossary
| Termo | Significado |
|---|---|
| PDV | Ponto de Venda — sistema de caixa |
| Sangria | Retirada de dinheiro do caixa |
| Troco | Diferença entregue ao cliente |
| Prazo / A prazo | Venda a pagar depois |
| Espécie | Dinheiro físico |
| TX Cartão | Taxa de cartão (1.95% crédito, 1.2% débito, 6% voucher) |
| PIX CNPJ | PIX feito pela loja |
| PDV Web | Nova versão do sistema PDV (em desenvolvimento) |
| SyncThing | Software de sincronização de ficheiros P2P |
Última actualização: 2026-07-10
9. N8N Workflows
| Workflow | ID | Trigger | Notas |
|---|---|---|---|
| PDV → Sheets Relatorios | VFIiOZK2ZV3a0956 |
0 */6 * * * |
Fetch PDV, clear+append Resumo_Diario, Top_Produtos, Resumo_Fechamento |
| Supabase → Sheet VENDAS | 34cfbba7-b58a-4ba9-ac98-9c7755260722 |
0 20 * * * |
Incremental por atualizado_em UTC. ⚠️ Requer aba Sincronizacao no spreadsheet |
10. Cron Jobs (Hermes Agent)
| Job | ID | Schedule | Notas |
|---|---|---|---|
| Kong DNS fix | 9a64e7b49ac6 |
*/15 * * * * |
Auto-fix PostgREST IP no kong.yml |