Monalisa
Modelo de dados

Visão geral do modelo

Os 11 domínios, a ordem de dependência entre eles e a lista das 71 tabelas.

O modelo de dados descreve 71 tabelas em 11 domínios. Cada domínio é um pacote (packages/<domínio>) cujas entities geram o schema, e cada domínio tem a sua primeira migration, na ordem abaixo. A ordem é a direção das dependências: um domínio só referencia os anteriores. Quando uma FK precisa apontar para um domínio posterior, quem a cria é o domínio posterior (por exemplo, tenants → platform_tenant_blueprints é criada por Authorization).

#DomínioTabelasMigrationDepende de
1Parties60001_parties—
2Credentials20002_credentials—
3Tenancy20003_tenancyParties
4Identity60004_identity, 0014_identity-platform-loginsParties, Credentials, Tenancy
5Financial Institutions30005_financial-institutionsTenancy, Credentials
6Product Catalog50006_product-catalogFinancial Institutions
7Brokers60007_brokersParties, Tenancy, Financial Institutions
8Authorization190008_authorization, 0012, 0013, 0017 (teto de escopo)Identity, Tenancy, Brokers
9Workforce170009_workforceAuthorization e anteriores
10Onboarding10010_onboardingParties, Brokers, Workforce
11Bank Users40011_bank-usersIdentity, Workforce, Brokers, Financial Institutions, Credentials

Depois dos domínios vêm as migrations de infraestrutura, fora do modelo de dados: 0015_idempotency (2 tabelas, ver Idempotência) e 0016_work (8 tabelas, ver Background work).

Regras de fronteira

  • Parties, Credentials e Identity não conhecem tenant.
  • Toda tabela de tenant carrega tenant_id. Quando uma linha aponta para outra que também é de tenant, a FK é composta e inclui tenant_id dos dois lados, então as duas pontas ficam sempre no mesmo tenant (ver Garantias do banco).
  • Trabalho acima dos tenants (plataforma) mora em tabelas próprias platform_*, nunca em tenant_id nulo ou com valor sentinela.
  • Quando uma coluna só faria sentido para alguns casos, o modelo prefere uma tabela própria a uma coluna anulável (por exemplo, invitation_session_contexts).

Como ler as páginas de domínio

Cada página traz um diagrama ER pequeno com as relações principais e, para cada tabela:

  • colunas, com tipo, nulidade, padrão e as notas do modelo;
  • chaves estrangeiras, com as colunas dos dois lados (FKs compostas aparecem inteiras) e quem referencia a tabela;
  • garantido pelo banco: PK, UNIQUE, índices únicos parciais (as unicidades "uma ativa por vez"), CHECK, EXCLUDE, triggers e colunas geradas, exatamente como estão no schema migrado;
  • fora do banco: regras do modelo que o banco não impõe e que cabem à aplicação, ou que ainda não são garantidas.

Nenhuma FK é DEFERRABLE e nenhuma tem ação em cascata (ON DELETE/ON UPDATE são NO ACTION). FKs compostas com colunas anuláveis usam MATCH SIMPLE: a verificação é pulada enquanto alguma coluna da FK for nula.

Todas as tabelas

TabelaDomínioPara quê
partiesPartiesRaiz do cadastro: uma pessoa ou empresa, com nome legal e documento.
person_profilesPartiesDados de pessoa física de uma party (1:1, a PK é a própria party_id).
company_profilesPartiesDados de pessoa jurídica de uma party (1:1, a PK é a própria party_id).
party_addressesPartiesEndereços de uma party; vários por party, distinguidos por kind.
party_contactsPartiesContatos (e-mail, telefone…) de uma party, opcionalmente no contexto de uma membership, com finalidade (purpose).
company_ownershipsPartiesParticipação societária: quem é sócio de uma empresa, com percentual e período.
credentialsCredentialsA credencial em si: método (method), identificador externo e ciclo de vida (expiração, último uso, revogação).
credential_versionsCredentialsCada versão do segredo: hash ou texto cifrado, quem criou e por quê, e o estado da versão.
tenantsTenancyO tenant: identificador público (uid), slug, nome da operação e o blueprint de origem.
tenant_accountsTenancyUm CNPJ do grupo dentro do tenant (party de empresa), com rótulo opcional.
usersIdentityIdentidade global de uma pessoa; no máximo um usuário por party.
user_loginsIdentityIdentificadores de login no namespace de um tenant (CPF, CNPJ, e-mail, código, username).
platform_loginsIdentityIdentificadores de login do operador de plataforma (username ou e-mail), sem tenant; únicos globalmente enquanto ativos.
user_credentialsIdentityLiga um usuário às suas credenciais de login; uma credencial pertence a um único usuário.
sessionsIdentitySessão autenticada: usuário, login e credencial usados, dados do cliente, expiração e revogação.
refresh_tokensIdentityTokens de renovação de uma sessão: só o SHA-256 é guardado, com uso único e encadeamento (replaced_by).
financial_institutionsFinancial InstitutionsCatálogo global de IFs, com código opcional e único.
financial_institution_accountsFinancial InstitutionsVínculo de um CNPJ do tenant com uma IF; único por par (CNPJ, IF).
financial_institution_credentialsFinancial InstitutionsCredencial técnica de um vínculo CNPJ × IF, por ambiente, no mesmo tenant do vínculo.
product_groupsProduct CatalogAgrupamento opcional de produtos.
productsProduct CatalogProduto do catálogo global, com grupo opcional.
operation_typesProduct CatalogTipos de operação, catálogo independente com código único.
financial_institution_productsProduct CatalogOferta de um produto por uma IF; única por (IF, produto).
financial_institution_account_productsProduct CatalogHabilitação de uma oferta para um vínculo CNPJ × IF; única por (vínculo, oferta).
brokersBrokersIdentidade global do corretor (party), com identificador público.
tenant_brokersBrokersO corretor dentro de um tenant, com código no tenant e desativação.
broker_affiliationsBrokersHistórico da hierarquia entre corretores do mesmo tenant (corretor e corretor-pai), com início e fim; uma afiliação aberta por corretor.
tenant_broker_accountsBrokersCom quais CNPJs do grupo o corretor tem termo assinado (N:N), com vigência.
store_codesBrokersRegistro dos códigos de loja e de seu dono: a conta do grupo na IF ou o corretor.
broker_store_codesBrokersQual código de loja o corretor usa em cada IF e em qual regime, com vigência [valid_from, valid_until) sem sobreposição.
permissionsAuthorizationProjeção do registry de permissões gerado pelos @Requires dos use cases: código <domínio>.<recurso>.<ação>, escopo e descrição.
permission_use_casesAuthorizationQuais use cases exigem cada permissão; sincronizado no deploy.
permission_changesAuthorizationAuditoria prevista de mudanças no catálogo de permissões (commit, autor, aprovador, quem fez o deploy).
access_profilesAuthorizationPerfil de acesso do tenant (broker_id nulo) ou de um corretor.
access_profile_permissionsAuthorizationPermissões de um perfil.
access_profile_templatesAuthorizationTemplate de perfil do tenant, versionado: perfis ligados herdam as permissões ao vivo.
access_profile_template_permissionsAuthorizationPermissões da versão atual de um template de tenant.
access_profile_template_changesAuthorizationCada edição confirmada de um template: versões de origem e destino, permissões adicionadas e removidas, motivo e autor.
access_profile_template_change_decisionsAuthorizationPara cada perfil afetado por uma edição de template: acompanhou (followed) ou desvinculou (detached), e quantos usuários foram afetados.
platform_tenant_blueprintsAuthorizationFormato de tenant mantido pela plataforma; criar um tenant é escolher um blueprint.
platform_access_profile_templatesAuthorizationTemplates de perfil de um blueprint, copiados para access_profile_templates quando o tenant é criado.
platform_access_profile_template_permissionsAuthorizationPermissões de um template de plataforma.
platform_access_profilesAuthorizationPerfis acima dos tenants (por exemplo, suporte ou administração da plataforma).
platform_access_profile_permissionsAuthorizationPermissões de um perfil de plataforma; só permissões de escopo platform.
platform_grantsAuthorizationOperador de plataforma: usuário, perfil de plataforma, quem concedeu e por quê.
platform_invitationsAuthorizationConvite para operar a plataforma.
platform_invitation_deliveriesAuthorizationCada tentativa de envio de um convite de plataforma; reenvio é uma linha nova.
platform_invitation_delivery_eventsAuthorizationLinha do tempo bruta do provedor de envio; um webhook repetido não duplica (dedup_key).
session_contextsAuthorizationOperador de plataforma atuando dentro de um tenant, com motivo.
membershipsWorkforcePessoa × tenant: usuário, party e quem concedeu ou removeu.
membership_access_profilesWorkforcePerfil do tenant concedido à membership para o tenant inteiro, com vigência.
membership_brokersWorkforceAtuar como usuário de um corretor, com um perfil daquele corretor.
teamsWorkforceTime do tenant (agrupamento comercial ou organizacional).
membership_teamsWorkforcePessoa no time, com um perfil do tenant e vigência [valid_from, valid_until) sem sobreposição para o mesmo par (time, membership).
membership_portfoliosWorkforceCarteira: um corretor atendido por uma pessoa num time, coberta por uma membership_teams da mesma pessoa, time e tenant.
team_financial_institution_accountsWorkforceContextos que um time atende: time → vínculo CNPJ × IF existente, com vigência sem sobreposição para o mesmo par.
team_hierarchiesWorkforceAresta organizacional temporal entre duas participações em time (subordinado e superior), com motivo.
portfolio_transfersWorkforceCabeçalho imutável de uma transferência manual de carteiras, com ator, motivo e data efetiva; uid identifica a operação idempotente.
portfolio_transfer_itemsWorkforceCada corretor transferido: carteira de origem e de destino do mesmo corretor e tenant; uma carteira só aparece uma vez como origem e uma vez como destino.
invitationsWorkforceConvite para um tenant: canal, destino, SHA-256 do token, estado e validade.
invitation_grantsWorkforceO que o aceite do convite vai criar: perfil do tenant, atuação em corretor, time ou carteira.
invitation_session_contextsWorkforceExiste só quando um operador de plataforma, dentro de um session_context, emite o convite.
invitation_deliveriesWorkforceCada tentativa de envio de um convite de tenant; reenvio é uma linha nova; exatamente um solicitante.
invitation_delivery_eventsWorkforceLinha do tempo bruta do provedor de envio; webhook repetido não duplica.
session_membershipsWorkforceEm qual tenant uma sessão está atuando; fonte do contexto de tenant da transação.
session_membership_brokersWorkforceExiste só quando a sessão atua como usuário de um corretor; trocar de corretor abre uma nova session_memberships.
broker_prospectsOnboardingProspect de corretor no tenant: documento, contato, quem captou e quem digitou, e o corretor resultante da conversão.
user_banksBank UsersO login de uma pessoa numa IF, com sua credencial; um aberto por (usuário, IF).
bank_user_assignmentsBank UsersAtribuição de um usuário bancário a um corretor do tenant, com vigência por dia [valid_from, valid_until), o código de loja sob o qual foi criado e a atuação de origem (origin_membership_broker_id).
bank_user_transfersBank UsersRegistro da transferência de um usuário bancário entre corretores do mesmo tenant: atribuição de origem e de destino, data efetiva, ator e motivo.
bank_credential_deliveriesBank UsersRevelação da senha bancária no portal: uma por versão da credencial (a PK é credential_version_id), com quem viu e quando (clock_timestamp()).

Nesta página