Files
Condominio_SeConectai/Schemas/02-schema-master.md
T
2026-09-29 12:12:31 -03:00

5.1 KiB

Prompt 02 — Migrations do db_master

Contexto

O Prompt 01 já entregou: projeto Java rodando em Docker, HttpServer no ar, MigrationRunner pronto pra rodar arquivos .sql, DataSourceProvider com conexão ao db_master. Leia o tracker (10-tracker-progresso.md) antes de começar para confirmar que o Prompt 01 está marcado como concluído.

Este prompt cria todo o schema do banco de catálogo (db_master): empresas, funcionários, planos, funcionalidades, financeiro (assinaturas/pagamentos), logs.

Objetivo

Criar os arquivos de migration SQL em src/main/resources/migrations/master/, rodá-los automaticamente na subida da aplicação (se db_master ainda não tiver as tabelas), e criar as classes Java de acesso a dados (DAO) básicas para essas tabelas — sem endpoints HTTP ainda (isso vem no Prompt 05).

Especificação

1. Migrations (uma tabela por arquivo, numeração sequencial)

Criar em src/main/resources/migrations/master/:

  • 001_empresas.sql
  • 002_funcionarios.sql
  • 003_api_keys.sql
  • 004_funcionalidades.sql
  • 005_empresa_funcionalidades.sql
  • 006_evolution_instancias.sql
  • 007_configuracoes_plataforma.sql
  • 008_planos.sql
  • 009_plano_funcionalidades.sql
  • 010_assinaturas.sql
  • 011_periodos_uso.sql
  • 012_pagamentos.sql
  • 013_logs_envio_avisos.sql
  • 014_lembretes_cobranca.sql
  • 015_seed_funcionalidades.sql (INSERT do catálogo — ver abaixo)

Usar exatamente o DDL do documento de arquitetura v3.0 (seção 1), tabela por tabela — não inventar colunas novas. Reproduzo aqui as tabelas que essa fase cria (copie fielmente, incluindo tipos e defaults):

  • empresas(id, nome, cnpj, slug, database_name, status, criado_em)
  • funcionarios(id, empresa_id, nome, email, senha_hash, cargo, status, criado_em)
  • api_keys(id, empresa_id, key_hash, descricao, ativa, criado_em, revogada_em)
  • funcionalidades(id, chave, nome, descricao)
  • empresa_funcionalidades(empresa_id, funcionalidade_id, ativa, liberado_em, liberado_por) — PK composta
  • evolution_instancias(id, empresa_id, instance_url, instance_token_enc, numero_whatsapp, status, solicitado_em, aprovado_em, aprovado_por)
  • configuracoes_plataforma(chave, valor, atualizado_em) — PK = chave
  • planos(id, nome, valor_mensal_centavos, descricao, ativo, criado_em)
  • plano_funcionalidades(plano_id, funcionalidade_id) — PK composta
  • assinaturas(id, empresa_id, plano_id, valor_mensal_centavos, dia_vencimento, status, criado_em)
  • periodos_uso(id, empresa_id, mes_referencia, status, data_liberacao, data_bloqueio) — UNIQUE(empresa_id, mes_referencia)
  • pagamentos(id, empresa_id, periodo_uso_id, valor_centavos, abacatepay_charge_id, qr_code_payload, qr_code_base64, status, criado_em, pago_em)
  • logs_envio_avisos(id, empresa_id, condominio_id, aviso_id, contato_id, contato_nome, canal, status, erro_detalhe, criado_em)
  • lembretes_cobranca(id, empresa_id, periodo_uso_id, canal, enviado_por, criado_em)

Seed (015_seed_funcionalidades.sql): usar o catálogo completo (MVP + Fase 2) da seção 6 do documento de arquitetura v3.0 — 24 chaves MVP + 6 chaves Fase 2. Copiar os INSERT INTO funcionalidades literalmente.

2. Índices recomendados

Adicionar (na própria migration de cada tabela, ou em um 016_indices.sql):

CREATE INDEX idx_funcionarios_empresa ON funcionarios(empresa_id);
CREATE INDEX idx_api_keys_empresa ON api_keys(empresa_id);
CREATE INDEX idx_evolution_empresa ON evolution_instancias(empresa_id);
CREATE INDEX idx_assinaturas_empresa ON assinaturas(empresa_id);
CREATE INDEX idx_periodos_uso_empresa ON periodos_uso(empresa_id);
CREATE INDEX idx_pagamentos_empresa ON pagamentos(empresa_id);
CREATE INDEX idx_pagamentos_periodo ON pagamentos(periodo_uso_id);
CREATE INDEX idx_logs_envio_empresa ON logs_envio_avisos(empresa_id, status);

3. Rodar migrations na subida

No Main.java, após confirmar conexão com db_master, chamar MigrationRunner.runMigrations(masterConnection, "migrations/master").

4. DAOs básicos (sem endpoints ainda)

Criar em com.seconectai.condocontab.master.dao:

  • EmpresaDao (métodos: inserir, buscarPorId, listarTodas, atualizarStatus)
  • FuncionarioDao (inserir, buscarPorEmail, listarPorEmpresa)
  • FuncionalidadeDao (listarTodas, buscarPorChave)

Usar JDBC puro (PreparedStatement), sem ORM. Todo valor monetário como long (centavos) no Java.

Critérios de aceite

  • docker compose up roda as 15 migrations em ordem, sem erro, na primeira subida.
  • Subir o container uma segunda vez NÃO tenta re-executar migrations já aplicadas (tabela schema_migrations funcionando).
  • SELECT * FROM funcionalidades retorna as 30 linhas do seed (24 MVP + 6 Fase 2).
  • EmpresaDao.inserir + EmpresaDao.buscarPorId funcionam via um teste manual (pode ser um main temporário ou teste JUnit simples).
  • Nenhuma tabela usa DELETE como estratégia de remoção — todas têm campo de status para inativação lógica onde fizer sentido (já está no DDL).

Ao concluir

Atualizar 10-tracker-progresso.md: Prompt 02 concluído, data, resumo. Confirmar que Prompt 01 segue marcado como concluído antes de finalizar.