Monalisa
Modelo de dados

Parties

Pessoas e empresas: o cadastro civil compartilhado por todos os outros domínios.

Parties guarda quem existe no mundo real, sem saber de tenant: uma pessoa física ou jurídica, seus perfis, endereços, contatos e participações societárias. Usuários, corretores, contas do grupo e prospects apontam para uma party, então um mesmo documento é cadastrado uma vez só.

É o primeiro domínio da ordem de dependência: não referencia nenhum outro. A única ligação para fora, party_contacts → memberships, é criada pelo domínio Workforce, dono de memberships.

Tabelas (6)

TabelaPara quê
partiesRaiz do cadastro: uma pessoa ou empresa, com nome legal e documento.
person_profilesDados de pessoa física de uma party (1:1, a PK é a própria party_id).
company_profilesDados de pessoa jurídica de uma party (1:1, a PK é a própria party_id).
party_addressesEndereços de uma party; vários por party, distinguidos por kind.
party_contactsContatos (e-mail, telefone…) de uma party, opcionalmente no contexto de uma membership, com finalidade (purpose).
company_ownershipsParticipação societária: quem é sócio de uma empresa, com percentual e período.

Referência

parties

Raiz do cadastro: uma pessoa ou empresa, com nome legal e documento.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
kindtextnão
legal_nametextnão
document_typetextsim
document_numbertextsim
document_countrytextsim
created_attimestamptznãopadrão clock_timestamp()
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • nenhuma

Referenciada por: broker_prospects, brokers, company_ownerships, company_profiles, party_addresses, party_contacts, person_profiles.

Garantido pelo banco

TipoNomeDefinição
PKparties_pkeyPRIMARY KEY (id)
UNIQUEparties_document_keyUNIQUE (document_country, document_type, document_number)

Fora do banco

  • kind não tem CHECK no banco; o tipo de party é validado na aplicação.
  • Coerência entre kind e o perfil (person_profiles ou company_profiles) é regra da aplicação.

person_profiles

Dados de pessoa física de uma party (1:1, a PK é a própria party_id).

ColunaTipoNuloObservação
party_idbigintnão
birth_datedatesim
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • party_id → parties.id

Referenciada por: users.

Garantido pelo banco

TipoNomeDefinição
PKperson_profiles_pkeyPRIMARY KEY (party_id)

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

company_profiles

Dados de pessoa jurídica de uma party (1:1, a PK é a própria party_id).

ColunaTipoNuloObservação
party_idbigintnão
trade_nametextsim
incorporated_ondatesim
primary_activity_codetextsim
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • party_id → parties.id

Referenciada por: company_ownerships, tenant_accounts.

Garantido pelo banco

TipoNomeDefinição
PKcompany_profiles_pkeyPRIMARY KEY (party_id)

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

party_addresses

Endereços de uma party; vários por party, distinguidos por kind.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
party_idbigintnão
kindtextnão
country_codetextnão
postal_codetextsim
regiontextsim
citytextsim
districttextsim
streettextsim
street_numbertextsim
complementtextsim
created_attimestamptznãopadrão clock_timestamp()
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • party_id → parties.id

Garantido pelo banco

TipoNomeDefinição
PKparty_addresses_pkeyPRIMARY KEY (id)

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

party_contacts

Contatos (e-mail, telefone…) de uma party, opcionalmente no contexto de uma membership, com finalidade (purpose).

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
party_idbigintnão
membership_idbigintsim
kindtextnão
labeltextsim
valuetextnão
normalized_valuetextnão
is_preferredbooleannãopadrão false
notifications_enabledbooleannãopadrão false
metadatajsonbnãopadrão '{}'::jsonb
created_attimestamptznãopadrão clock_timestamp()
updated_attimestamptznãopadrão clock_timestamp()
purposetextsimadministrativo | financeiro | comercial | operacional | jurídico

Chaves estrangeiras

  • (membership_id, party_id) → memberships (id, party_id)
  • party_id → parties.id

Garantido pelo banco

TipoNomeDefinição
CHECKparty_contacts_purpose_checkCHECK ((purpose IN ('administrativo', 'financeiro', 'comercial', 'operacional', 'jurídico')))
PKparty_contacts_pkeyPRIMARY KEY (id)
UNIQUEparty_contacts_value_keyUNIQUE (party_id, membership_id, kind, normalized_value)

Fora do banco

  • Só um contato preferido por tipo não é garantido pelo banco.

company_ownerships

Participação societária: quem é sócio de uma empresa, com percentual e período.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
company_party_idbigintnão
owner_party_idbigintnão
ownership_percentnumericnão
started_ondatenão
ended_ondatesim
created_attimestamptznãopadrão clock_timestamp()
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • company_party_id → company_profiles.party_id
  • owner_party_id → parties.id

Garantido pelo banco

TipoNomeDefinição
PKcompany_ownerships_pkeyPRIMARY KEY (id)
UNIQUEcompany_ownerships_period_keyUNIQUE (company_party_id, owner_party_id, started_on)

Fora do banco

  • Soma de percentuais e sobreposição de períodos não são verificadas pelo banco; ended_on também não tem CHECK de ordem.

Nesta página