Pular para o conteúdo principal

Mapeamento de Banco de Dados — companies

Pilar: 04 — Banco de Dados / Tabelas
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados: gatein-server (app/models.py, app/api/web/auth.py, app/api/admin/system.py)


1. Propósito da Tabela companies

A tabela companies é a entidade central multi-tenant do ecossistema Gatein. Ela armazena o cadastro básico de todas as empresas clientes (Terminais Marítimos/Retroportuários e Empresas Transportadoras de Carga). Atua como tabela pai para a herança polimórfica das tabelas terminals e trucking_companies.


2. Atributos Físicos da Tabela companies

ColunaTipo SQLConstraintsDescrição / Regra
idBigIntegerPRIMARY KEY, autoincrement=TrueChave primária física interna do banco
typeVARCHAR(20)NOT NULL, Discriminador Polimórfico'terminal' ou 'trucking_company'
usernameVARCHAR(50)NOT NULL, UNIQUEIdentificador amigável de login/tenant
nameVARCHAR(100)NOT NULLRazão Social ou Nome Fantasia principal
branch_nameVARCHAR(100)NULLABLENome da Filial/Unidade (ex: "Terminal Macaé")
unit_codeVARCHAR(50)NULLABLE, INDEXCódigo interno de unidade (ex: "MAC-01")
tax_idVARCHAR(20)NOT NULL, UNIQUECNPJ da empresa (apenas números)
phoneVARCHAR(20)NOT NULLTelefone principal de contato
emailVARCHAR(100)NOT NULLE-mail corporativo principal
api_key_hashVARCHAR(255)NULLABLEHash bcrypt da API Key Primária
api_key_prefixVARCHAR(50)NULLABLE, UNIQUE, INDEXPrefixo de 8 caracteres da API Key Primária
api_key_secondary_hashVARCHAR(255)NULLABLEHash bcrypt da API Key Secundária
api_key_secondary_prefixVARCHAR(50)NULLABLE, UNIQUE, INDEXPrefixo de 8 caracteres da API Key Secundária
configJSONBDefault {}Configurações customizadas da empresa (módulos ativos, URLs de formulários de segurança, etc.)
address_streetVARCHAR(150)NULLABLELogradouro da empresa
address_numberVARCHAR(20)NULLABLENúmero do endereço
address_cityVARCHAR(100)NULLABLECidade
address_stateVARCHAR(50)NULLABLEEstado (UF)
address_countryVARCHAR(50)NULLABLEPaís
address_zipVARCHAR(20)NULLABLECEP
address_latFLOATNULLABLELatitude das instalações físicas
address_lngFLOATNULLABLELongitude das instalações físicas
is_activeBOOLEANNOT NULL, Default true, INDEXFlag de exclusão lógica/desativação de tenant
created_atTIMESTAMPTZNOT NULL, Default now()Data de cadastro
updated_atTIMESTAMPTZNOT NULL, Default now()Data de atualização

3. Estrutura Polimórfica: terminals e trucking_companies

3.1 Tabela terminals (Herança de companies)

Armazena dados específicos para empresas do tipo terminal:

  • id: BigInteger, PRIMARY KEY, FOREIGN KEY (companies.id)
  • geofence: JSONB contendo o polígono/raio da zona virtual de check-in remoto.
  • use_remote_checkin: Boolean, default False (habilita o check-in por GPS no app mobile).
  • appointment_layouts / ticket_layouts: JSONB de configurações.

3.2 Tabela trucking_companies (Herança de companies)

Armazena dados específicos para transportadoras:

  • id: BigInteger, PRIMARY KEY, FOREIGN KEY (companies.id)
  • trip_layouts: JSONB contendo os templates de card de viagens.

4. Regras de Negócio de Empresa (RN-CO-XXX)

RN-CO-001: Unicidade de CNPJ e Username

Não podem existir duas empresas cadastradas com o mesmo tax_id (CNPJ) ou username. O banco de dados aplica UniqueConstraint em ambas as colunas.

RN-CO-002: Efeito Cascata da Desativação (is_active = False)

Se o campo companies.is_active for alterado para False, todos os operadores (CompanyUser), agendamentos ativos e chaves de API vinculados àquela empresa são automaticamente bloqueados nos middlewares de autorização do backend.