Pular para conteúdo

Database

O ERP usa Django ORM sobre PostgreSQL. A maioria dos agregados herda apps.core.models.BaseModel, com UUID, timestamps e is_active; usuários, perfis e políticas têm ciclo próprio. O catálogo foi conferido nos models.py do repositório coreflow-erp.

Diagrama entidade-relacionamento

erDiagram ROLE ||--o{ PERMISSION_POLICY : define COMPANY ||--o{ COMPANY_ADDRESS : possui CATEGORY o|--o{ CATEGORY : pai CATEGORY o|--o{ PRODUCT : classifica UNIT ||--o{ PRODUCT : mede CLIENT ||--o{ SALES_ORDER : compra COMPANY ||--o{ SALES_ORDER : fatura SALES_ORDER ||--o{ SALES_ITEM : contem PRODUCT ||--o{ SALES_ITEM : vendido SUPPLIER ||--o{ PURCHASE_ORDER : fornece COMPANY ||--o{ PURCHASE_ORDER : recebe PURCHASE_ORDER ||--o{ PURCHASE_ITEM : contem PRODUCT ||--o{ PURCHASE_ITEM : comprado PRODUCT ||--o{ STOCK_BALANCE : saldo COMPANY ||--o{ STOCK_BALANCE : armazena CLIENT o|--o{ FINANCIAL_TITLE : devedor SUPPLIER o|--o{ FINANCIAL_TITLE : credor FINANCIAL_TITLE ||--o{ PAYMENT : recebe COST_CENTER o|--o{ FINANCIAL_TITLE : classifica ACCOUNT_PLAN o|--o{ FINANCIAL_TITLE : classifica USER o|--o{ AUDIT_LOG : registra

PedidoVenda e PedidoCompra são documentos independentes, com itens próprios. TituloFinanceiro aceita cliente ou fornecedor conforme o tipo; origem/origem_id preservam referência textual para documentos de outros módulos.

Dicionário de dados

Modelo / tabela Campos persistidos (tipo; nulo; default) FK, índices e restrições
User / users id: uuid; name: varchar(255); email: varchar; avatar: image (sim); campos de autenticação PK UUID; e-mail UNIQUE e identificador de login
Role / roles id: uuid; name: varchar(120); code: slug UNIQUE; description: text=""; timestamps; M2M users tabela intermediária Django para usuários/perfis
PermissionPolicy / permission_policies id: uuid; role: uuid; module: varchar(80); seis flags booleanas default false role → Role; UNIQUE (role, module)
Company / companies id: uuid; legal_name; trade_name/state_registration/municipal_registration/email/phone; document; is_headquarters=true; timestamps; is_active=true documento e nomes validados no model
CompanyAddress / company_addresses id: uuid; company: uuid; zipcode/street/number/complement/district/city/state company → Company CASCADE
Cliente / clientes id: uuid; tipo=PF; nome; email/telefone/documento; base comum usado por vendas e financeiro
ContatoCliente / contatos_cliente id: uuid; cliente; nome, e-mail, telefone e cargo FK para cliente
Fornecedor / fornecedores id: uuid; razão/nome; documento; e-mail; telefone; contatos origem de compras e títulos
UnidadeMedida / unidades_medida id: uuid; codigo: varchar(10); nome: varchar(60); casas_decimais: smallint codigo UNIQUE
CategoriaProduto / categorias_produto id: uuid; nome: varchar(120); categoria_pai: uuid (sim) auto-FK para categoria pai, SET_NULL
Produto / produtos id: uuid; sku: varchar(40) UNIQUE; nome: varchar(255); descricao: text=""; categoria: uuid (sim); unidade: uuid; codigo_barras (sim); preco_custo/preco_venda: numeric(12,2); controla_estoque=true; estoque_minimo: numeric(12,3)=0 categoria SET_NULL; unidade PROTECT; índices por SKU/código/nome
SaldoEstoque / saldos_estoque id: uuid; produto; empresa; quantidades e saldos FKs produto/empresa; combinação produto/empresa única
MovimentoEstoque / movimentos_estoque id: uuid; produto/empresa; tipo; quantidade; custo; documento; data histórico de entradas/saídas
PedidoVenda / pedidos_venda id: uuid; numero: varchar(20) UNIQUE; cliente; empresa; status=rascunho; emissão/vencimento; valor_total/valor_desconto/valor_liquido: numeric(14,2)=0; vendedor (sim); observações cliente/empresa PROTECT; vendedor SET_NULL
ItemPedidoVenda / itens_pedido_venda id: uuid; pedido; produto; quantidade/preco_unitario/desconto/total: numeric pedido CASCADE; produto PROTECT
PedidoCompra / pedidos_compra id: uuid; numero; fornecedor; empresa; status=rascunho; emissão/previsão; valor_total=0; comprador (sim); observações fornecedor/empresa PROTECT; comprador SET_NULL
ItemPedidoCompra / itens_pedido_compra id: uuid; pedido; produto; quantidade/custo_unitario/total: numeric pedido CASCADE; produto PROTECT
CentroCusto / centros_custo id: uuid; codigo; nome; descricao: text=""; base comum classificação financeira
PlanoContas / planos_contas id: uuid; codigo; nome; natureza; base comum classificação contábil
TituloFinanceiro / titulos_financeiros id: uuid; tipo; cliente/fornecedor (nulos); descrição/documento; emissão/vencimento; valor/valor_pago: numeric (valor_pago=0); status=aberto; centro/plano (nulos); observações; origem/origem_id cliente/fornecedor/classificadores SET_NULL
Pagamento / pagamentos_financeiros id: uuid; titulo: uuid; data (data atual); valor: numeric; forma; observações titulo → TituloFinanceiro CASCADE
LogAuditoria / logs_auditoria id: uuid; usuário (sim); módulo/ação; entidade/id; descrição; dados_antes/dados_depois: jsonb (sim); IP (sim); user-agent; base comum usuário SET_NULL; índices por módulo/ação/data

Regras de nulo e defaults

Campos textuais opcionais são normalmente NOT NULL com default vazio quando o model declara blank=True, default="". null=True é usado para relações e valores realmente ausentes. Os nomes de tabela refletem o db_table dos models quando explicitado; esta página documenta o schema implementado, não funcionalidades futuras.