Pular para o conteúdo principal

Mapeamento de Banco de Dados — submission_types e submissions

Pilar: 04 — Banco de Dados / Tabelas
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-09
Módulos Conectados: gatein-server (app/models.py, alembic/versions/e9f8a1234567_create_submissions_tables.py)


1. Visão Geral do Modelo Relacional

O módulo de Envios é sustentado por duas tabelas relacionais no PostgreSQL:

  1. submission_types: Armazena os modelos de formulários e regras configurados pelas empresas (Tenants).
  2. submissions: Registra as submissões enviadas individualmente pelos motoristas no aplicativo mobile.

2. Atributos Físicos da Tabela submission_types

ColunaTipo SQLConstraintsDescrição / Regra
idBigIntegerPRIMARY KEY, autoincrement=TrueIdentificador único numérico
company_idBigIntegerFOREIGN KEY (companies.id), NOT NULL, INDEXEmpresa proprietária do tipo de envio
titleVARCHAR(100)NOT NULLTítulo do tipo exibido para o motorista
refVARCHAR(50)NOT NULLIdentificador de referência amigável (ex: dacte_comprovante)
allow_editBOOLEANNOT NULL, Default trueIndica se o motorista pode alterar a submissão pós-envio
accepts_attachmentBOOLEANNOT NULL, Default falseSe permite anexos no envio
multiple_attachmentsBOOLEANNOT NULL, Default falseSe aceita múltiplos arquivos
allowed_formatsJSONBDefault []Formatos autorizados. Ex: ["image", "pdf"]
attachment_requiredBOOLEANNOT NULL, Default falseSe ao menos 1 anexo é obrigatório
fieldsJSONBDefault []Estrutura de campos do formulário dinâmico
is_activeBOOLEANNOT NULL, Default trueStatus de ativação (usado para Soft-delete)
created_atTIMESTAMPTZNOT NULL, Default now()Timestamp de criação
updated_atTIMESTAMPTZNOT NULL, Default now()Timestamp de alteração

Estrutura do JSONB na Coluna fields:

[
{
"id": "numero_lacre",
"label": "Número do Lacre",
"type": "text",
"multiline": false,
"required": true,
"regex": null,
"placeholder": "Informe o lacre..."
}
]

3. Atributos Físicos da Tabela submissions

ColunaTipo SQLConstraintsDescrição / Regra
idBigIntegerPRIMARY KEY, autoincrement=TrueIdentificador do envio
company_idBigIntegerFOREIGN KEY (companies.id), NOT NULL, INDEXEmpresa destinatária do envio
submission_type_idBigIntegerFOREIGN KEY (submission_types.id), NULLABLEReferência ao tipo de envio (pode ser null se tipo for apagado ou tipo padrão)
user_tax_idVARCHAR(14)NOT NULL, INDEXCPF do motorista remetente
user_nameVARCHAR(100)NULLABLENome do motorista no momento do envio
type_titleVARCHAR(100)NOT NULLTítulo snapshot do tipo de envio
statusVARCHAR(20)NOT NULL, Default 'SENT'Estado do envio: 'SENT', 'EDITED', 'CANCELLED'
field_dataJSONBDefault {}Chave-valor das respostas dos campos
attachmentsJSONBDefault []Metadados e URLs dos anexos armazenados no R2
edited_atTIMESTAMPTZNULLABLEData da última edição realizada
cancelled_atTIMESTAMPTZNULLABLEData de cancelamento do envio
is_activeBOOLEANNOT NULL, Default trueStatus de visibilidade
created_atTIMESTAMPTZNOT NULL, Default now()Timestamp do envio
updated_atTIMESTAMPTZNOT NULL, Default now()Timestamp de atualização

Estrutura do JSONB na Coluna attachments:

[
{
"url": "https://pub-r2.gatein.app/submissions/3a7b9c1d-8f2e-4b9a.jpg",
"type": "image",
"name": "foto_comprovante.jpg"
}
]

4. Índices e Restrições de Integridade

  • unique_submission_type_ref_per_company: Restrição única composta (company_id, ref) que previne a criação de múltiplos tipos com a mesma referência para a mesma empresa.
  • idx_submission_type_lookup: Índice composto (company_id, ref) para buscas ultrarrápidas de tipo por empresa.
  • idx_submissions_company_tax_id: Índice composto (company_id, user_tax_id) otimizado para o painel web filtrar envios de um motorista específico em uma empresa.
  • idx_submissions_user_tax_id: Índice no campo user_tax_id acelerando a listagem de histórico no aplicativo mobile do motorista.