Documento interno
Arquitetura Tecnica

Decisoes Tecnicas

Daterange de temporada, Pix dinamico, backups e outras decisoes de engenharia.

Versao
1.0
Atualizado
junho/2026
Status
rascunho
1

Resumo

Este documento registra decisoes tecnicas importantes do Romeo, com contexto e justificativa. Serve como referencia para entender por que certas escolhas foram feitas.

Formato
Cada decisao segue: Problema → Opcoes consideradas → Decisao → Consequencias.
2

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

OpcaoProsContras
Duas colunas DATESimplesOverlap check manual
DATERANGE nativoOperadores built-inMenos conhecido
Tabela de diasFlexivelMuitos 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.

3

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.

AspectoImplementacao
GeracaoAPI do gateway (Asaas/Pagar.me)
ValidadeConfiguravel por cobranca (padrao: 3 dias)
Identificacaotxid = contrato_id + mes
WebhookNotificacao de pagamento em tempo real
ConciliacaoAutomatica via txid

Pix estatico (chave fixa) nao serve para aluguel — nao tem como saber qual inquilino pagou.

4

Estrategia de backups

Problema

Como garantir recuperacao de dados em caso de desastre, sem custo excessivo?

Decisao

TipoFrequenciaRetencaoDestino
Point-in-time (WAL)Continuo7 diasS3 Brasil
Full backupDiario30 diasS3 Brasil
Snapshot mensalMensal1 anoS3 + Glacier

Testes

Restore automatizado testado semanalmente em ambiente de staging. Alerta se falhar.

5

Multitenancy

Problema

Como isolar dados entre organizacoes (imobiliarias) de forma segura e escalavel?

Opcoes consideradas

ModeloIsolamentoComplexidadeCusto
Banco por tenantTotalAltaAlto
Schema por tenantAltoMediaMedio
RLS (shared)LogicoBaixaBaixo

Decisao

RLS (Row Level Security) com organizacao_id em todas as tabelas. Menos overhead operacional, escala melhor, e o Supabase tem suporte nativo.

Trade-off
Isolamento logico, nao fisico. Bugs em RLS podem vazar dados. Mitigacao: testes automatizados de politicas + audit log.
6

Decisoes de stack

DecisaoEscolhaPor que
Framework webNext.js 15App Router, RSC, Vercel-friendly
Banco de dadosPostgres (Supabase)RLS nativo, self-hosted possivel
AuthSupabase AuthIntegrado, MFA, Magic Link
PagamentosGateway parceiroEvitar virar IP (BACEN)
HospedagemVPS BrasilLatencia, LGPD, custo
IAOpenAI + AnthropicMelhor qualidade, fallback
MonorepoTurborepoCaching, simplicidade

Para detalhes completos de stack, veja /docs/stack.