SEMTRAS · Santarém · Modelagem
Um único banco PostgreSQL para todos os municípios. Toda tabela de dados leva tenant_id, e o próprio banco só devolve as linhas do município da conexão (Row-Level Security). Escolha uma tabela para ver suas colunas, com quem ela se liga e o SQL de isolamento. Cada módulo tem as suas tabelas e só aponta para o núcleo; os vínculos entre módulos passam por eventos, não por chave estrangeira.
Nenhuma tabela encontrada.
Quem aponta para ela
Para quem ela aponta
O tenant_id aponta para tenants em todas as tabelas e não entra neste desenho.
guarda o id de , mas sem chave estrangeira: é de outro módulo, e o vínculo é feito pelo evento.
| Coluna | Tipo | Marcas | Observação |
|---|---|---|---|
| PK único RLS |
Um ? depois do tipo indica coluna que aceita vazio.
Restrições no banco
Isolamento desta tabela
Conferência feita sobre as chaves estrangeiras acima: cada módulo só pode apontar para o núcleo e para os módulos de que declara depender. Se uma FK passar disso, a linha fica vermelha.
| Módulo | Declara depender de | FKs apontam para | Situação |
|---|---|---|---|
| dentro do declarado |
Estoque e Patrimônio não têm FK para Contratos, Pedidos nem Distribuição. As colunas referencia_tipo e referencia_id, e o bem_id de entrega_itens, guardam o vínculo sem constraint, preenchidas a partir dos eventos “item recebido” e “entrega confirmada”.
select set_config('app.tenant_id', ?, true).BelongsToTenant filtra pelo mesmo id. É a primeira barreira.app.tenant_id definido, a comparação resulta em nulo e nenhuma linha aparece.Jobs de fila e comandos do Artisan também precisam definir o tenant antes de tocar no banco.
BYPASSRLS e que não é dono das tabelas. Por isso o FORCE ROW LEVEL SECURITY.(tenant_id, pedido_id) referenciando um único (tenant_id, id).audits só aceita inserção: o usuário da aplicação perde UPDATE, DELETE e TRUNCATE.A aplicação valida primeiro, para dar uma mensagem clara. O banco fica como rede de segurança, caso algo escape. Clique em uma linha para abrir a tabela.
| Tabela | Tipo | Regra |
|---|---|---|
fluxo_etapas com uma linha e fluxo_etapa_aprovadores com duas. Cada decisão grava o usuário, o setor dele (setor_id, guardado porque o servidor pode mudar de setor depois), a data e a hora. Falta decidir como tratar dois servidores decidindo o mesmo pedido ao mesmo tempo: a chave única atual não impede, então a action precisa travar o pedido.entregas aceita recebedor_id ou recebedor_nome. Se for sempre servidor com login, o nome em texto sai.termos.forma_assinatura e arquivo_path cobrem o impresso com upload do escaneado. A assinatura eletrônica pode pedir outras colunas (data, IP, certificado).Modelo proposto, a validar na criação das migrations · nenhum dado real · fonte: docs/requisitos/analise-requisitos.md, seções 5, 7 e 9. Fluxo completo em docs/fluxos/01-fluxo-do-sistema.html.