Pular para o conteúdo principal

Modelo de Dados (entidades e relações)

Modelo de dados do backend do H1 Tech (HSBR-Gestao-Ativos-Back), banco ga6. A fonte da verdade é o prisma/schema.prisma — mesmo schema roda em Postgres ou SQL Server (ver Bancos Suportados). Esta página é um mapa de leitura; ao mudar o schema, regenere o entendimento a partir do Prisma.

Convenção do schema

Nomes de tabelas/colunas estão em português, minúsculo com _ (ex.: ordem_separacao). Quase tudo usa id Int @id @default(autoincrement()); exceções: produto (produto_id), zpl (zpl_id), users (user_id), lotes (lote_id) e agrupamento_pacote (PK é o epc, string).

Diagrama ER

O EPC (código RFID de 24/64 chars) costura o modelo: ativo.epc é único e é o que aparece em movimentacao, inventario_itens, agrupamento_item, etc.

Relações polimórficas (sem FK)

Duas referências são intencionalmente sem foreign key:

  • alerta.ref_id → aponta para inventario.id, movimentacao.id, … conforme tipo_alerta.
  • campo_personalizado_alvo.alvo_id → aponta para processo.id ou produto.produto_id conforme alvo_tipo.

Por não terem FK, não aparecem como linhas sólidas no diagrama — a integridade é responsabilidade da aplicação.

Entidades por domínio

Catálogo / Ativos

EntidadeO que éRelações principais
ativoTabela central: um registro por ativo etiquetado (EPC único). Valores de campos custom em campos (JSON).zpl (etiqueta_id, cascade), produto, processo, ativo_status; ← agrupamento_item
ativo_statusLookup de status (status único) referenciado por ativo.status.ativo
produtoCatálogo de produtos (codigo_barras único). Valores custom em campos.ativo, ordem_separacao_*, inventario_itens_2d, produto_processo_quantidade
zplTemplates de etiqueta (ZPL). owner_idusers.ativo, campo_personalizado
campo_personalizadoDefinições de campos custom, escopadas por entidade (e etiqueta_id p/ ativos). Valores vivem nos campos JSON da entidade dona.zpl; ← campo_personalizado_alvo, processo_regra
campo_personalizado_alvoAssocia um campo custom a alvos específicos. alvo_id é polimórfico (sem FK).campo_personalizado (cascade)
lotesLista simples de lotes.— (sem FK)
mapasMapas/plantas com pontos (JSON).— (sem FK)

Processos / Movimentação

EntidadeO que éRelações principais
processoPonto de leitura / etapa do fluxo.nivel; ← movimentacao (origem/destino), ordem_separacao, processo_regra, integracao, produto_processo_quantidade, ativo
nivelHierarquia de locais (auto-relação via parent_id).nivel (self); ← processo, inventario, inventario_recorrencia
movimentacaoEvento de movimentação de um EPC entre processos. campos JSON capturados no move.processo (origem/destino), users
processo_regraRegras do "documento de movimentação" no processo destino (origem permitida / campo obrigatório).processo (×2), campo_personalizado
produto_processo_quantidadeQuantidade esperada por produto×processo (unique).produto, processo

Inventário

EntidadeO que éRelações principais
inventarioContagem de inventário (status, esperado/encontrado).nivel, users (leitor/criador), inventario_recorrencia; ← inventario_itens, inventario_itens_2d
inventario_itensItens lidos por EPC numa contagem.inventario, users
inventario_itens_2dItens por código de barras/2D (por produto + qtd).inventario, produto, users
inventario_recorrenciaAgendamento de inventário recorrente (frequência, próxima execução).nivel, users; ← inventario

Separação (picking)

EntidadeO que éRelações principais
ordem_separacaoOrdem de separação. 3 papéis de usuário (solicitante/criador/receptor).processo, users (×3); ← ordem_separacao_epcs, ordem_separacao_produtos
ordem_separacao_epcsEPCs individuais da ordem.ordem_separacao (cascade), produto
ordem_separacao_produtosLinhas por produto (qtd esperada/separada).ordem_separacao (cascade), produto

Agrupamento (caixas / pacotes)

EntidadeO que éRelações principais
agrupamento_pacotePacote/caixa. PK é o epc (string). parent_id faz a árvore caixa→caixa (auto-relação, SetNull).agrupamento_pacote (self), pacote_tipos (FK composta empresa+tipo); ← agrupamento_item
agrupamento_itemQuais ativos (item_epc) estão em qual caixa (pacote_epc). FKs reais (cascade).agrupamento_pacote, ativo
pacote_tiposTipos de pacote por empresa + template ZPL. PK composta (empresa,tipo).agrupamento_pacote

Integrações (Integration Hub)

EntidadeO que éRelações principais
integracaoRegra: ao mover itens PARA um processo, faz POST a uma API externa (async, pós-commit). auth_secret cifrado.processo (cascade); ← integracao_envio
integracao_envioLog de cada tentativa de entrega (auditoria + reenvio).integracao (cascade)

Usuários / Auth / Config / Alertas

EntidadeO que éRelações principais
usersUsuários (user_id PK). permissoes JSON, nivel_ids Int[].← praticamente tudo (movimentação, inventário, ordens, logs, alertas, zpl, refresh_tokens)
refresh_tokensTokens de refresh por usuário (token único, revoked).users (cascade)
logsTrilha de auditoria de rotas.users
alertaNotificações/alertas. ref_id polimórfico (sem FK). Estado visto/visto_em.users
configuracoesConfiguração de UI (cores, logo, lote de impressão) + flags.feature_flags
feature_flagsFlags por configuração (configuracao_id+feature_key unique).configuracoes

Notas de integridade

  • Cascades reais: ativozpl (apagar template apaga seus ativos), agrupamento_itemagrupamento_pacote/ativo, ordem_separacao_*ordem_separacao, integracao_enviointegracao, refresh_tokensusers, campo_personalizado_alvocampo_personalizado.
  • Maioria das FKs é NoAction (não apaga em cascata) — apagar um produto/processo/users referenciado falha se houver filhos, por design.
  • campos (JSON) em ativo, produto e movimentacao guarda os valores de campos personalizados (chaveados pelo slug de campo_personalizado). Isso substituiu as tabelas/colunas dinâmicas criadas via DDL em runtime (refactor da camada de dados).