Decisoes Tecnicas
Daterange de temporada, Pix dinamico, backups e outras decisoes de engenharia.
- Versao
- 1.0
- Atualizado
- junho/2026
- Status
- rascunho
Resumo
Este documento registra decisoes tecnicas importantes do Romeo, com contexto e justificativa. Serve como referencia para entender por que certas escolhas foram feitas.
FormatoCada decisao segue: Problema → Opcoes consideradas → Decisao → Consequencias.
Daterange de temporada
Problema
Como representar periodos de temporada (alta, baixa, feriados) no banco de dados, permitindo consultas eficientes de disponibilidade e tarifacao?
Opcoes consideradas
| Opcao | Pros | Contras |
|---|---|---|
| Duas colunas DATE | Simples | Overlap check manual |
| DATERANGE nativo | Operadores built-in | Menos conhecido |
| Tabela de dias | Flexivel | Muitos registros |
Decisao
Usar DATERANGE nativo do Postgres com constraint EXCLUDE USING GISTpara garantir nao-overlap no nivel do banco.
CREATE TABLE temporadas ( id UUID PRIMARY KEY, imovel_id UUID REFERENCES imoveis(id), periodo DATERANGE NOT NULL, tipo TEXT NOT NULL, -- 'alta', 'baixa', 'feriado' tarifa_diaria DECIMAL(10,2), EXCLUDE USING GIST (imovel_id WITH =, periodo WITH &&) );
Consequencias
Operador && (overlap) e @> (contains) funcionam nativamente. Queries de disponibilidade ficam simples e performaticas com indice GiST.
Pix dinamico
Problema
Como gerar Pix com valor, vencimento e identificacao unicos para cada cobranca de aluguel?
Decisao
Integrar com gateway que suporta Pix Cobranca (QR code dinamico) via API. Nao armazenar chaves Pix no nosso banco — usar tokenizacao do parceiro.
| Aspecto | Implementacao |
|---|---|
| Geracao | API do gateway (Asaas/Pagar.me) |
| Validade | Configuravel por cobranca (padrao: 3 dias) |
| Identificacao | txid = contrato_id + mes |
| Webhook | Notificacao de pagamento em tempo real |
| Conciliacao | Automatica via txid |
Pix estatico (chave fixa) nao serve para aluguel — nao tem como saber qual inquilino pagou.
Estrategia de backups
Problema
Como garantir recuperacao de dados em caso de desastre, sem custo excessivo?
Decisao
| Tipo | Frequencia | Retencao | Destino |
|---|---|---|---|
| Point-in-time (WAL) | Continuo | 7 dias | S3 Brasil |
| Full backup | Diario | 30 dias | S3 Brasil |
| Snapshot mensal | Mensal | 1 ano | S3 + Glacier |
Testes
Restore automatizado testado semanalmente em ambiente de staging. Alerta se falhar.
Multitenancy
Problema
Como isolar dados entre organizacoes (imobiliarias) de forma segura e escalavel?
Opcoes consideradas
| Modelo | Isolamento | Complexidade | Custo |
|---|---|---|---|
| Banco por tenant | Total | Alta | Alto |
| Schema por tenant | Alto | Media | Medio |
| RLS (shared) | Logico | Baixa | Baixo |
Decisao
RLS (Row Level Security) com organizacao_id em todas as tabelas. Menos overhead operacional, escala melhor, e o Supabase tem suporte nativo.
Trade-offIsolamento logico, nao fisico. Bugs em RLS podem vazar dados. Mitigacao: testes automatizados de politicas + audit log.
Decisoes de stack
| Decisao | Escolha | Por que |
|---|---|---|
| Framework web | Next.js 15 | App Router, RSC, Vercel-friendly |
| Banco de dados | Postgres (Supabase) | RLS nativo, self-hosted possivel |
| Auth | Supabase Auth | Integrado, MFA, Magic Link |
| Pagamentos | Gateway parceiro | Evitar virar IP (BACEN) |
| Hospedagem | VPS Brasil | Latencia, LGPD, custo |
| IA | OpenAI + Anthropic | Melhor qualidade, fallback |
| Monorepo | Turborepo | Caching, simplicidade |
Para detalhes completos de stack, veja /docs/stack.