Pular para o conteúdo principal

Modelo de dados

O TypeORM corre com synchronize: false. A fonte de verdade do schema é SQL em docs/sql/, não o auto-ddl.

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 TypeORMTabelaPapel
CompanyEntitycompanyRazão social, CNPJ, tenant_id, subcompany_tenantid, metadata (ex. parentCompanyId)
CompanyAddressEntityendereços do diretórioMoradas
CompanyDocumentEntitydocumentos do diretórioDocumentos
CompanyBrandingEntitybranding da companyLogo / visual
CompanyUserEntityligação user↔company (domínio)Contagens / listagens
EstabelecimentoEntityestabelecimentosEC; user_uuid do representante
EstabelecimentoConfigFinanceiraEntityestabelecimento_config_financeiraValores declarados
TransacaoLocalEntitytransacoes_locaisTPV; métricas usam status = APPR
PropostaEntitypropostascompany_id / estabelecimento_id
EntrepayDispositivoEntityentrepay_dispositivosAluguel; totais só status = ATIVO
CardBrandEntitycard_brandsJoin do dashboard porBandeira
WhiteLabelEntitywhite labelsPor tenant
PortalTenantRecordEntitytenantsSlug / portal / metadata.icon

Scripts: company-table.sql, company-directory-tables.sql, todastabelas.sql.

company (campos principais)

ColunaTipoNotas
iduuid PK
tenant_iduuidIsolamento
subcompany_tenantiduuid?Tenant da sub-empresa
razao_socialvarchar(255)
nome_fantasiavarchar(255)?
cnpjvarchar(18)?Conflito → HTTP 409
email / telefonevarchar?
statusvarchar(20)default ativo
metadatajsonbparentCompanyId, contacts, etc.
created_at / updated_attimestamptz

BD auth (conexão USER_PROFILES)

Variáveis AUTH_DATABASE_*. Uso: login/registo, permissões, roles, templates, logs de reset.

EntidadeTabelaPapel
AuthUserEntitypublic."user"uuid, email, password hash, role, metadata (sessoesAtivas, ultimoAcesso)
UserAddressEntityuser_addresses
UserDocumentEntityuser_documents
UserBrandingEntityuser_brandingmetadata.icon / banner
UserPermissaoEntityuser_permissoesGrants
UserPersonalDataEntityuser_personal_dataPII
UserSocialLinkEntityuser_social_links
PermissaoEntitypermissoesCatálogo (chave)
RoleEntityrolesrole_number
GlobalEmailTemplatePasswordResetEntityglobal_email_template_password_resetChave API lock_reset
GlobalEmailTemplateWelcomeEntityglobal_email_template_welcomeChave API waving_hand
GlobalGovernanceConfigScopeEntityscope de templates
LogsPasswordResetEntitylogs_password_resetsCó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).