Modelo de dados
O TypeORM corre com synchronize: false. A fonte de verdade do schema é SQL em docs/sql/, não o auto-ddl.
Há duas bases PostgreSQL (ver ADR 0002).
erDiagram
TENANT ||--o{ COMPANY : possui
COMPANY ||--o{ COMPANY_ADDRESS : moradas
COMPANY ||--o{ COMPANY_DOCUMENT : documentos
COMPANY ||--o| COMPANY_BRANDING : branding
COMPANY ||--o{ COMPANY : subempresa
COMPANY ||--o{ ESTABELECIMENTO : operacional
ESTABELECIMENTO ||--o| ESTABELECIMENTO_CFG : financeira
ESTABELECIMENTO ||--o{ TRANSACAO_LOCAL : tpv
ESTABELECIMENTO ||--o{ PROPOSTA : propostas
ESTABELECIMENTO ||--o{ ENTREPAY_DISP : aluguel
AUTH_USER ||--o{ USER_ADDRESS : enderecos
AUTH_USER ||--o{ USER_DOCUMENT : docs
AUTH_USER ||--o| USER_BRANDING : media
AUTH_USER ||--o{ USER_PERMISSAO : grants
AUTH_USER ||--o| USER_PERSONAL : pii
AUTH_USER }o--o| ROLE : role_id
PERMISSAO ||--o{ USER_PERMISSAO : catalogo
BD principal (conexão default)
Variáveis POSTGRES_* / DATABASE_* / PG*. Uso: empresas, tenants, operacional, presença (tabela user deste BD para company_uuid), white labels, portal.
| Entidade TypeORM | Tabela | Papel |
|---|---|---|
CompanyEntity | company | Razão social, CNPJ, tenant_id, subcompany_tenantid, metadata (ex. parentCompanyId) |
CompanyAddressEntity | endereços do diretório | Moradas |
CompanyDocumentEntity | documentos do diretório | Documentos |
CompanyBrandingEntity | branding da company | Logo / visual |
CompanyUserEntity | ligação user↔company (domínio) | Contagens / listagens |
EstabelecimentoEntity | estabelecimentos | EC; user_uuid do representante |
EstabelecimentoConfigFinanceiraEntity | estabelecimento_config_financeira | Valores declarados |
TransacaoLocalEntity | transacoes_locais | TPV; métricas usam status = APPR |
PropostaEntity | propostas | company_id / estabelecimento_id |
EntrepayDispositivoEntity | entrepay_dispositivos | Aluguel; totais só status = ATIVO |
CardBrandEntity | card_brands | Join do dashboard porBandeira |
WhiteLabelEntity | white labels | Por tenant |
PortalTenantRecordEntity | tenants | Slug / portal / metadata.icon |
Scripts: company-table.sql, company-directory-tables.sql, todastabelas.sql.
company (campos principais)
| Coluna | Tipo | Notas |
|---|---|---|
id | uuid PK | |
tenant_id | uuid | Isolamento |
subcompany_tenantid | uuid? | Tenant da sub-empresa |
razao_social | varchar(255) | |
nome_fantasia | varchar(255)? | |
cnpj | varchar(18)? | Conflito → HTTP 409 |
email / telefone | varchar? | |
status | varchar(20) | default ativo |
metadata | jsonb | parentCompanyId, contacts, etc. |
created_at / updated_at | timestamptz |
BD auth (conexão USER_PROFILES)
Variáveis AUTH_DATABASE_*. Uso: login/registo, permissões, roles, templates, logs de reset.
| Entidade | Tabela | Papel |
|---|---|---|
AuthUserEntity | public."user" | uuid, email, password hash, role, metadata (sessoesAtivas, ultimoAcesso) |
UserAddressEntity | user_addresses | |
UserDocumentEntity | user_documents | |
UserBrandingEntity | user_branding | metadata.icon / banner |
UserPermissaoEntity | user_permissoes | Grants |
UserPersonalDataEntity | user_personal_data | PII |
UserSocialLinkEntity | user_social_links | |
PermissaoEntity | permissoes | Catálogo (chave) |
RoleEntity | roles | role_number |
GlobalEmailTemplatePasswordResetEntity | global_email_template_password_reset | Chave API lock_reset |
GlobalEmailTemplateWelcomeEntity | global_email_template_welcome | Chave API waving_hand |
GlobalGovernanceConfigScopeEntity | scope de templates | |
LogsPasswordResetEntity | logs_password_resets | Códigos reset / welcome |
Scripts: auth_user_table.sql, user_social_links_table.sql, seeds e migrations/.
Isolamento lógico
Não há FK entre AUTH_DATABASE e a BD principal. Ligações são por UUID (company.id, user.uuid, tenants.id). Serviços resolvem tenant no JWT/x-tenant-id antes de consultar.
Redis
Não é modelo relacional. Cache de branding (CACHE_BRANDING_TTL_SECONDS, default 300). Não armazena sessões de presença (ADR 0003).