From aea6825de6b9695db10bc152d4bd752d30563f14 Mon Sep 17 00:00:00 2001 From: Claudecio Martins Date: Wed, 9 Sep 2026 18:13:31 -0300 Subject: [PATCH] first commit --- GUIA_DB.md | 333 ++++++++++ install_database.sql | 1422 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1755 insertions(+) create mode 100644 GUIA_DB.md create mode 100644 install_database.sql diff --git a/GUIA_DB.md b/GUIA_DB.md new file mode 100644 index 0000000..3b229c3 --- /dev/null +++ b/GUIA_DB.md @@ -0,0 +1,333 @@ +# Guia de Arquitetura e Fluxo do Banco de Dados - Workbloom ERP + +Este documento descreve a arquitetura completa, a modelagem das **40 tabelas** em **PostgreSQL** e os fluxos de dados do sistema de emissão fiscal **Workbloom ERP**. + +O script de instalação correspondente está disponível em [`install_database.sql`](./install_database.sql). + +--- + +## 1. Módulos do Sistema e Documentos Fiscais Suportados + +| Módulo Fiscal | Modelo | Descrição | +| :--- | :--- | :--- | +| **NF-e** | Modelo 55 | Nota Fiscal Eletrônica de Mercadorias (vendas, compras, devoluções, transferências, importação/exportação). | +| **NFC-e** | Modelo 65 | Nota Fiscal de Consumidor Eletrônica (frente de caixa, varejo, contingência off-line e QR-Code). | +| **NFS-e** | Serviços | Nota Fiscal de Serviços Eletrônica (compatível com **Padrão Nacional DPS / Receita Federal** e **Padrão Municipal ABRASF**). | +| **CT-e** | Modelo 57 | Conhecimento de Transporte Eletrônico (fretes rodoviários, tomadores e componentes tarifários). | +| **MDF-e** | Modelo 58 | Manifesto Eletrônico de Documentos Fiscais (transporte de cargas, veículos, condutores, seguro e manifesto de NFe/CTe). | + +--- + +## 2. Visão Macro da Arquitetura + +```mermaid +flowchart TD + subgraph CAMADA_1 ["1. Camada de Acesso & Multi-Tenant"] + U["👤 usuario & usuario_empresa
(Autenticação, Perfis de Acesso e Filiais)"] + end + + subgraph CAMADA_2 ["2. Camada de Governança & Multi-Empresas"] + EMP["🏢 empresa (Matriz & Filiais via matriz_id)"] + CFG["⚙️ empresa_configuracao_fiscal (Ambientes SEFAZ, Certificados A1 & Tokens)"] + SER["🔢 serie_fiscal (Séries Dinâmicas 55, 65, 57, 58, NFS)"] + end + + subgraph CAMADA_3 ["3. Camada de Cadastros & Catálogo Tributário"] + CAD["👥 Clientes, Fornecedores, Transportadoras, Veículos & Condutores"] + CAT["📦 Produtos (GTIN 'SEM GTIN', NCM, IBS/CBS/IS) & Serviços (LC 116, cTribNac)"] + end + + subgraph CAMADA_4 ["4. Camada de Motores de Emissão Fiscal (DF-e)"] + NFE["📑 NF-e 55 & NFC-e 65 (Mercadorias & PDV)"] + NFSE["📝 NFS-e Nacional / DPS (Serviços & ADN)"] + CTE["🚛 CT-e 57 (Transporte de Carga & Frete)"] + MDFE["🚚 MDF-e 58 (Manifesto de Carga & Viagem)"] + end + + CAMADA_1 --> CAMADA_2 + CAMADA_2 --> CAMADA_3 + CAMADA_3 --> CAMADA_4 + CAMADA_2 --> CAMADA_4 +``` + +--- + +## 3. Diagramas Modulares de Relacionamento + +Para garantir máxima legibilidade, clareza e espaçamento, os relacionamentos foram organizados por domínio funcional: + +### 3.1. Governança, Matriz/Filiais, Usuários e Séries Fiscais + +```mermaid +flowchart TD + CONT["📊 contador
(CRC / Dados Contábeis)"] -->|assessoria| EMP["🏢 empresa
(Matriz / Filiais)"] + CERT["🔑 certificado
(ICP-Brasil A1)"] -->|assinatura digital| EMP + + USU["👤 usuario
(Operadores / Administradores)"] -->|autenticação| UE["🔐 usuario_empresa
(Permissões por Filial)"] + EMP -->|concede acesso| UE + + EMP -->|ambientes SEFAZ / tokens| ECF["⚙️ empresa_configuracao_fiscal"] + EMP -->|numeração e modelos| SF["🔢 serie_fiscal"] +``` + +--- + +### 3.2. Cadastros Base, Logística e Catálogo Tributário + +```mermaid +flowchart TD + EMP["🏢 empresa"] --> CLI["👥 cliente
(Destinatários / Tomadores)"] + EMP --> FORN["🏭 fornecedor
(Compras / Insumos)"] + EMP --> TRANS["🚚 transportadora
(Parceiros de Frete)"] + EMP --> VEIC["🚛 veiculo
(Tração / Reboques)"] + EMP --> COND["🪪 condutor
(Motoristas / CNH)"] + + EMP --> PROD["📦 produto
(GTIN 'SEM GTIN' / NCM / CEST / Reforma IBS-CBS-IS)"] + UNID["📐 unidade
(UN, KG, LT, CX, M2)"] -->|unidade comercial & tributável| PROD + + EMP --> SERV["🛠️ servico
(LC 116 / cTribNac / ISS / IBS-CBS)"] +``` + +--- + +### 3.3. Emissão de Mercadorias (NF-e Modelo 55 & NFC-e Modelo 65) + +```mermaid +flowchart TD + EMP["🏢 empresa (Emitente)"] --> DF["📑 documento_fiscal
(Cabeçalho, Totais & Status DF-e)"] + SF["🔢 serie_fiscal"] -.->|reserva número| DF + CLI["👥 cliente"] -->|destinatário / consumidor| DF + TRANS["🚚 transportadora"] -.->|dados do frete| DF + + DF --> DFI["📦 documento_fiscal_item
(Produtos, Valores & Impostos Analíticos)"] + PROD["🏷️ produto"] -->|herança de tributação| DFI + + DF --> DFP["💳 documento_fiscal_pagamento
(Meios de Pagamento / Troco / TEF)"] + DF --> DFD["📅 documento_fiscal_duplicata
(Faturas & Parcelas a Receber)"] + DF --> DFE["⚡ documento_fiscal_evento
(Cancelamento, CC-e & Inutilização)"] +``` + +--- + +### 3.4. Emissão de Serviços (NFS-e Padrão Nacional & Municipal) + +```mermaid +flowchart TD + EMP["🏢 empresa (Prestadora)"] --> NFSE["📝 nfse
(DPS, Chave 50 dígitos, DANFSe ADN)"] + SF["🔢 serie_fiscal"] -.->|série RPS / DPS| NFSE + CLI["👥 cliente"] -->|tomador do serviço| NFSE + + NFSE --> NFSE_I["🛠️ nfse_item
(Discriminação Analítica dos Serviços)"] + SERV["📋 servico"] -->|LC 116, cTribNac & Alíquotas| NFSE_I + + NFSE --> NFSE_E["⚡ nfse_evento
(Cancelamento & Substituição)"] +``` + +--- + +### 3.5. Emissão de Transporte (CT-e Modelo 57) + +```mermaid +flowchart TD + EMP["🏢 empresa (Transportador Emitente)"] --> CTE["🚛 cte
(Cabeçalho, Origem/Destino IBGE, Tomador)"] + SF["🔢 serie_fiscal"] -.->|série CT-e| CTE + CLI["👥 cliente"] -->|tomador do serviço de frete| CTE + + CTE --> CTE_CV["💰 cte_componente_valor
(Frete Peso, Frete Valor, Pedágio, GRIS)"] + CTE --> CTE_DR["📑 cte_documento_referenciado
(Chaves das NF-e transportadas)"] + CTE --> CTE_C["⚖️ cte_carga
(Peso Bruto, Cubagem, Qtd Volumes)"] + CTE --> CTE_V["🛞 cte_veiculo_rodoviario
(Veículo e Motorista vinculados)"] + CTE --> CTE_E["⚡ cte_evento
(Cancelamento & CC-e)"] +``` + +--- + +### 3.6. Manifesto Eletrônico de Documentos Fiscais (MDF-e Modelo 58) + +```mermaid +flowchart TD + EMP["🏢 empresa (Emitente do Manifesto)"] --> MDFE["🚚 mdfe
(Viagem, Modal Rodoviário, Seguro de Carga)"] + SF["🔢 serie_fiscal"] -.->|série MDF-e| MDFE + + MDFE --> MDFE_MC["📍 mdfe_municipio_carregamento
(Cidades de Carregamento IBGE)"] + MDFE --> MDFE_MD["🏁 mdfe_municipio_descarregamento
(Cidades de Descarregamento IBGE)"] + MDFE --> MDFE_PU["🗺️ mdfe_percurso_uf
(UFs de Trânsito / Passagem)"] + + MDFE --> MDFE_T["🚛 mdfe_veiculo_tracao
(Caminhão / Cavalo Mecânico)"] + MDFE --> MDFE_R["🚜 mdfe_veiculo_reboque
(Carretas e Semirreboques)"] + MDFE --> MDFE_C["🪪 mdfe_condutor
(Motoristas da Viagem)"] + + MDFE --> MDFE_DR["📑 mdfe_documento_referenciado
(Relação de NF-es e CT-es manifestados)"] + MDFE --> MDFE_E["⚡ mdfe_evento
(Encerramento, Cancelamento & Incl. Condutor)"] +``` + +--- + +### 3.7. Rastreabilidade e Integração Logística (NF-e ➔ CT-e ➔ MDF-e) + +```mermaid +flowchart TD + NFE["📦 NF-e (Mercadorias Faturadas)"] -->|Chave NF-e em cte_documento_referenciado| CTE["🚛 CT-e (Prestação do Frete Rodoviário)"] + CTE -->|Chave CT-e em mdfe_documento_referenciado| MDFE["🚚 MDF-e (Manifesto da Viagem com Veículos e Condutor)"] + NFE -.->|Carga Própria / Transporte Próprio| MDFE +``` + +--- + +## 4. Catálogo Completo das 40 Tabelas + +### 4.1. Autenticação & Multi-Tenant +1. **`usuario`**: Operadores, administradores e credenciais (hash de senha). +2. **`usuario_empresa`**: Permissões de usuários por filial ou acesso global. + +### 4.2. Contabilidade, Empresas & Configurações Fiscais +3. **`contador`**: Cadastro do escritório de contabilidade (CRC, e-mail, telefone). +4. **`certificado`**: Certificados digitais ICP-Brasil A1 (arquivo binário e senha). +5. **`empresa`**: Matriz e Filiais (hierarquia via auto-relacionamento `matriz_id`), CNPJ, Inscrição Estadual e dados cadastrais. +6. **`empresa_configuracao_fiscal`**: Desacoplamento de ambientes SEFAZ (Produção / Produção Restrita), contingência, tokens CSC (NFC-e) e credenciais de prefeituras/Receita Federal (NFS-e Nacional). +7. **`serie_fiscal`**: Séries fiscais dinâmicas por filial e por modelo de documento (`55`, `65`, `57`, `58`, `NFS`), controlando a numeração sequencial. + +### 4.3. Cadastros Base & Apoio Logístico +8. **`unidade`**: Unidades de medida fiscais (UN, CX, KG, LT, SERV, HORA, etc.). +9. **`cliente`**: Destinatários de notas de mercadorias, tomadores de serviços e consumidores. +10. **`fornecedor`**: Fornecedores de insumos e compras. +11. **`transportadora`**: Transportadoras parceiras para frete de mercadorias. +12. **`veiculo`**: Veículos de tração e reboques (placa, renavam, tara, capacidade, tipo de rodado/carroceria). +13. **`condutor`**: Motoristas (nome, CPF, CNH). + +### 4.4. Catálogo de Itens & Tributação +14. **`produto`**: Mercadorias com código GTIN (`DEFAULT 'SEM GTIN'`), NCM, CEST, CFOPs, regras de ICMS (CST/CSOSN, MVA, FCP, ST, Redução de Base), PIS, COFINS, IPI e campos da **Reforma Tributária** (**IBS**, **CBS**, **Imposto Seletivo**, `c_classif_trib`, `cBenef`). +15. **`servico`**: Catálogo de serviços com código da **LC 116/2003** (`item_lista_servico`), CNAE, código tributário municipal, `cTribNac` (Padrão Nacional), alíquotas de ISS, retenções federais (PIS, COFINS, INSS, IRRF, CSLL) e Reforma Tributária (IBS/CBS). + +### 4.5. Emissão de Mercadorias (NF-e 55 & NFC-e 65) +16. **`documento_fiscal`**: Cabeçalho, totais de produtos, impostos vigentes e totais da Reforma Tributária. +17. **`documento_fiscal_item`**: Itens com quantidades, rateios de frete/desconto/seguro e tributação analítica por item. +18. **`documento_fiscal_pagamento`**: Meios de pagamento (PIX, Cartão, Dinheiro, Boleto, troco e TEF). +19. **`documento_fiscal_duplicata`**: Faturas e parcelas de cobrança. +20. **`documento_fiscal_evento`**: Cancelamento, Carta de Correção (CC-e) e Inutilização. + +### 4.6. Emissão de Serviços (NFS-e Padrão Nacional & Municipal) +21. **`nfse`**: Cabeçalho da NFS-e com dados da DPS/RPS, chave de acesso de **50 dígitos**, link do DANFSe oficial do ADN (`link_danfse_pdf`), QR-Code, deduções, retenções e valor líquido. +22. **`nfse_item`**: Discriminação analítica dos serviços prestados. +23. **`nfse_evento`**: Cancelamento e substituição de NFS-e. + +### 4.7. Emissão de Transporte (CT-e Modelo 57) +24. **`cte`**: Conhecimento de Transporte Eletrônico (tomador do frete, cidades início/fim com IBGE, tributação). +25. **`cte_componente_valor`**: Componentes tarifários (Frete Valor, Frete Peso, Pedágio, GRIS, Taxa de Despacho). +26. **`cte_documento_referenciado`**: Relação de notas fiscais (NF-e) transportadas. +27. **`cte_carga`**: Pesagens, volumes e unidades de medida da carga. +28. **`cte_veiculo_rodoviario`**: Vínculo do frete com veículo e motorista. +29. **`cte_evento`**: Cancelamento e Cartas de Correção (CC-e) do frete. + +### 4.8. Emissão de Manifesto de Carga (MDF-e Modelo 58) +30. **`mdfe`**: Manifesto Eletrônico de Documentos Fiscais (modal, seguro de carga, averbações e totais consolidados). +31. **`mdfe_municipio_carregamento`**: Pontos de carregamento (código IBGE). +32. **`mdfe_municipio_descarregamento`**: Pontos de descarregamento (código IBGE). +33. **`mdfe_percurso_uf`**: UFs de trânsito em transporte interestadual. +34. **`mdfe_veiculo_tracao`**: Caminhão/veículo de tração. +35. **`mdfe_veiculo_reboque`**: Carretas e reboques acoplados. +36. **`mdfe_condutor`**: Motoristas vinculados à viagem. +37. **`mdfe_documento_referenciado`**: Relação de NF-es e CT-es manifestados. +38. **`mdfe_evento`**: Encerramento de MDF-e, cancelamento e inclusão de condutor. + +### 4.9. Administração do ERP +39. **`configuracao`**: Parâmetros gerais do software. +40. **`pagamento_empresa`**: Controle de faturamento e mensalidades das empresas clientes. + +--- + +## 5. Fluxos Operacionais Passo a Passo + +### 5.1. Fluxo de Emissão de Mercadorias (NF-e / NFC-e) + +```mermaid +sequenceDiagram + autonumber + actor Operador as Operador / PDV + participant API as Workbloom API + participant DB as Banco PostgreSQL + participant SEFAZ as SEFAZ (DF-e) + + Operador->>API: Inicia venda de produtos + API->>DB: Consulta produto (NCM, CEST, GTIN 'SEM GTIN', CFOP, Impostos) + API->>DB: Obtém próximo número sequencial em serie_fiscal + API->>DB: Insere documento_fiscal (Status: DIGITACAO) + API->>DB: Insere documento_fiscal_item (Cálculo analítico dos tributos) + API->>DB: Insere documento_fiscal_pagamento (Formas de pagamento + Troco) + API->>DB: Insere documento_fiscal_duplicata (se parcelado) + API->>API: Assina XML com certificado digital A1 + API->>SEFAZ: Transmite Lote DF-e + SEFAZ-->>API: Retorno Autorizado (cStat 100 + Protocolo + Chave 44 dígitos) + API->>DB: Atualiza documento_fiscal (Status: AUTORIZADA, Protocolo, XML) + API->>DB: Incrementa ultimo_numero em serie_fiscal + API-->>Operador: Venda concluída e DANFE/Cupom emitido +``` + +--- + +### 5.2. Fluxo de Emissão de Serviços (NFS-e Nacional & Municipal) + +```mermaid +sequenceDiagram + autonumber + actor Prestador as Prestador de Serviço + participant API as Workbloom API + participant DB as Banco PostgreSQL + participant ADN as ADN / Receita Federal (NFS-e) + + Prestador->>API: Emite serviço para Tomador (cliente_id) + API->>DB: Consulta servico (item_lista_servico LC 116, cTribNac, alíquotas) + API->>DB: Insere nfse (Gera id_dps, Status: DIGITACAO) + API->>DB: Insere nfse_item (Discriminação detalhada do serviço) + API->>API: Gera XML da DPS assinado + API->>ADN: Envia DPS via API REST + ADN-->>API: Autorizado (Chave de 50 dígitos, link_danfse_pdf, qrcode_url_nfse) + API->>DB: Atualiza nfse (Status: EMITIDA, chave_acesso 50 dig, link_danfse_pdf) + API-->>Prestador: NFS-e Autorizada e DANFSe disponível +``` + +--- + +### 5.3. Fluxo de Logística Integrada (CT-e 57 + MDF-e 58) + +```mermaid +flowchart TD + subgraph ETAPA_1 ["1️⃣ Emissão do CT-e (Modelo 57 - Frete Rodoviário)"] + C1["Definir Tomador do Frete (Remetente, Destinatário ou Terceiro)"] + C2["Informar Cidades de Início e Término da Prestação (Códigos IBGE)"] + C3["Vincular Chaves das NF-e transportadas em cte_documento_referenciado"] + C4["Compor Valores do Frete (Frete Peso, Frete Valor, Pedágio, GRIS)"] + C5["Vincular Veículo e Motorista em cte_veiculo_rodoviario"] + C6["Transmitir e Autorizar na SEFAZ ➔ Gera Chave CT-e (44 dígitos)"] + + C1 --> C2 --> C3 --> C4 --> C5 --> C6 + end + + subgraph ETAPA_2 ["2️⃣ Emissão do MDF-e (Modelo 58 - Manifesto de Carga)"] + M1["Criar Manifesto com UFs de Carregamento e Descarregamento"] + M2["Informar Rota e UFs de Passagem em mdfe_percurso_uf"] + M3["Vincular Chaves dos CT-e e NF-e em mdfe_documento_referenciado"] + M4["Definir Veículo de Tração, Reboques Acoplados e Condutores"] + M5["Informar Apólice e Averbação do Seguro de Carga"] + M6["Transmitir e Autorizar na SEFAZ ➔ DAMDFE de Trânsito Liberado"] + M7["Chegada ao Destino Final: Registrar Evento de ENCERRAMENTO"] + + M1 --> M2 --> M3 --> M4 --> M5 --> M6 --> M7 + end + + C6 ==>|Chave CT-e Referenciada| M3 +``` + +--- + +## 6. Boas Práticas para o Desenvolvimento da API + +1. **UUIDs Controlados pelo Software (Recomendado UUID v7)**: + - Todas as tabelas principais possuem coluna `"uuid" UUID NOT NULL` sem valor padrão no banco. A sua API/Backend deve gerar o UUID (preferencialmente **UUID v7** por ser ordenado cronologicamente, otimizando os índices B-Tree do PostgreSQL) antes do `INSERT`. +2. **Transações Atômicas (`BEGIN ... COMMIT`)**: + - Emita os documentos fiscais (cabeçalho, itens, pagamentos e incremento de série) dentro de uma mesma transação para garantir integridade absoluta. +3. **Padrão de Precisão Numérica**: + - Valores monetários (R$): `NUMERIC(15, 2)`. + - Quantidades, pesos, alíquotas e fatores de conversão: `NUMERIC(15, 4)` (exigência técnica da SEFAZ e Receita Federal). +4. **Tratamento do GTIN**: + - Se o produto não tiver código de barras EAN/GTIN cadastrado, o campo no banco já adota o padrão oficial `SEM GTIN` para evitar rejeições 883 e 888 na SEFAZ. \ No newline at end of file diff --git a/install_database.sql b/install_database.sql new file mode 100644 index 0000000..5202921 --- /dev/null +++ b/install_database.sql @@ -0,0 +1,1422 @@ +-- ============================================================================ +-- WORKBLOOM ERP - ESQUEMA DE BANCO DE DADOS (POSTGRESQL) +-- Sistema Completo de Emissão Fiscal: +-- NF-e (55), NFC-e (65), CT-e (57), MDF-e (58) e NFS-e (Serviços ABRASF / Nacional) +-- Multi-empresa (Matriz e Filiais), Séries Dinâmicas e Reforma Tributária (EC 132/2023) +-- ============================================================================ + +-- Extensão para geração nativa de UUIDs +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; + +-- ============================================================================ +-- 1. AUTENTICAÇÃO E CONTROLE DE ACESSO +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "usuario" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "nome_completo" VARCHAR(128) NOT NULL, + "cpf" CHAR(11) DEFAULT NULL, + "email" VARCHAR(255) NOT NULL, + "nome_usuario" VARCHAR(50) NOT NULL, + "senha_hash" VARCHAR(255) NOT NULL, + "ativo" BOOLEAN NOT NULL DEFAULT TRUE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- ============================================================================ +-- 2. CONTABILIDADE, EMPRESAS, CONFIGURAÇÕES FISCAIS E SÉRIES +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "contador" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "nome_empresarial" VARCHAR(128) NOT NULL, + "nome_fantasia" VARCHAR(128) DEFAULT NULL, + "cnpj" CHAR(14) DEFAULT NULL, + "cpf" CHAR(11) DEFAULT NULL, + "crc" VARCHAR(20) DEFAULT NULL, + "email" VARCHAR(255) NOT NULL, + "telefone" VARCHAR(20) DEFAULT NULL, + "end_cep" CHAR(8) DEFAULT NULL, + "end_codigo_ibge" CHAR(7) DEFAULT NULL, + "end_logradouro" VARCHAR(255) DEFAULT NULL, + "end_numero" VARCHAR(10) DEFAULT NULL, + "end_complemento" VARCHAR(255) DEFAULT NULL, + "end_bairro" VARCHAR(255) DEFAULT NULL, + "end_cidade" VARCHAR(255) DEFAULT NULL, + "end_uf" CHAR(2) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +CREATE TABLE IF NOT EXISTS "certificado" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "nome_arquivo" VARCHAR(255) NOT NULL, + "arquivo_binario" BYTEA DEFAULT NULL, + "senha" TEXT NOT NULL, + "data_emissao" DATE NOT NULL, + "data_validade" DATE NOT NULL, + "tp_certificado" VARCHAR(10) NOT NULL DEFAULT 'A1', + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +CREATE TABLE IF NOT EXISTS "empresa" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "matriz_id" BIGINT DEFAULT NULL, -- NULL se for Matriz; ID da Matriz se for Filial + "tipo_estabelecimento" VARCHAR(10) NOT NULL DEFAULT 'MATRIZ', -- 'MATRIZ', 'FILIAL' + "contador_id" BIGINT DEFAULT NULL, + "certificado_id" BIGINT DEFAULT NULL, + "status" VARCHAR(20) NOT NULL DEFAULT 'ATIVO', -- ATIVO, INATIVO, BLOQUEADO + "nome_empresarial" VARCHAR(128) NOT NULL, + "nome_fantasia" VARCHAR(128) DEFAULT NULL, + "cnpj" CHAR(14) NOT NULL, + "inscricao_estadual" VARCHAR(30) DEFAULT NULL, + "inscricao_municipal" VARCHAR(30) DEFAULT NULL, + "cnae_principal" CHAR(7) DEFAULT NULL, + "regime_tributario" SMALLINT NOT NULL DEFAULT 1, -- 1: Simples Nacional, 2: Simples com Excesso, 3: Regime Normal, 4: MEI - Microempreendedor Individual + "dia_do_pagamento" SMALLINT DEFAULT NULL, + -- Endereço + "end_cep" CHAR(8) DEFAULT NULL, + "end_codigo_ibge" CHAR(7) DEFAULT NULL, + "end_logradouro" VARCHAR(255) DEFAULT NULL, + "end_numero" VARCHAR(10) DEFAULT NULL, + "end_complemento" VARCHAR(255) DEFAULT NULL, + "end_bairro" VARCHAR(255) DEFAULT NULL, + "end_cidade" VARCHAR(255) DEFAULT NULL, + "end_uf" CHAR(2) DEFAULT NULL, + -- Contato + "email" VARCHAR(255) DEFAULT NULL, + "email_nfe" VARCHAR(255) DEFAULT NULL, + "telefone" VARCHAR(20) DEFAULT NULL, + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- Configurações Fiscais e Ambientes SEFAZ/Prefeituras desacoplados por Empresa e Modelo +CREATE TABLE IF NOT EXISTS "empresa_configuracao_fiscal" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "modelo_documento" VARCHAR(5) NOT NULL, -- '55': NF-e, '65': NFC-e, '57': CT-e, '58': MDF-e, 'NFS': NFS-e + "ambiente_sefaz" SMALLINT NOT NULL DEFAULT 2, -- 1: Produção, 2: Homologação + "tipo_emissao" SMALLINT NOT NULL DEFAULT 1, -- 1: Normal, 9: Contingência Off-line + "versao_layout" VARCHAR(10) NOT NULL DEFAULT '4.00', + -- Tokens de Segurança NFC-e (quando modelo = 65) + "csc_id" VARCHAR(10) DEFAULT NULL, + "csc_token" VARCHAR(128) DEFAULT NULL, + -- Provedores e Acesso NFS-e (quando modelo = NFS) + "provedor_nfse" VARCHAR(50) DEFAULT NULL, -- ABRASF, NACIONAL, GINFES, BETHA, IPM, NOTACONTROL, ISSNET, etc. + "login_prefeitura" VARCHAR(60) DEFAULT NULL, + "senha_prefeitura" TEXT DEFAULT NULL, + "token_prefeitura" VARCHAR(255) DEFAULT NULL, + "client_id_nacional" VARCHAR(128) DEFAULT NULL, + "client_secret_nacional" VARCHAR(128) DEFAULT NULL, + -- Configurações visuais do DANFE/DANFSE + "orientacao_danfe" VARCHAR(10) NOT NULL DEFAULT 'RETRATO', -- RETRATO, PAISAGEM + "imprimir_mensagem_tributos" BOOLEAN NOT NULL DEFAULT TRUE, + "ativo" BOOLEAN NOT NULL DEFAULT TRUE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL +); + +-- Gerenciamento de Séries Fiscais Dinâmicas e Customizáveis +CREATE TABLE IF NOT EXISTS "serie_fiscal" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "modelo_documento" VARCHAR(5) NOT NULL, -- '55': NF-e, '65': NFC-e, '57': CT-e, '58': MDF-e, 'NFS': NFS-e (RPS) + "serie" VARCHAR(5) NOT NULL DEFAULT '1', + "ambiente_sefaz" SMALLINT NOT NULL DEFAULT 2, -- 1: Produção, 2: Homologação + "ultimo_numero" INTEGER NOT NULL DEFAULT 0, + "descricao" VARCHAR(128) DEFAULT NULL, -- Ex: "Série Balcão 1", "Série RPS Principal", "Série E-Commerce" + "padrao" BOOLEAN NOT NULL DEFAULT FALSE, + "ativo" BOOLEAN NOT NULL DEFAULT TRUE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL +); + +-- Tabela associativa de Usuários com Empresas/Filiais (Multi-tenant) +CREATE TABLE IF NOT EXISTS "usuario_empresa" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "usuario_id" BIGINT NOT NULL, + "empresa_id" BIGINT NOT NULL, + "perfil" VARCHAR(20) NOT NULL DEFAULT 'OPERADOR', -- ADMIN, OPERADOR, CONSULTA, EMISSOR + "acesso_todas_filiais" BOOLEAN NOT NULL DEFAULT FALSE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL +); + +-- ============================================================================ +-- 3. CADASTROS BASE (UNIDADES, CLIENTES, FORNECEDORES, TRANSPORTADORAS, VEÍCULOS, CONDUTORES) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "unidade" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "sigla" VARCHAR(10) NOT NULL, + "descricao" VARCHAR(128) NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +CREATE TABLE IF NOT EXISTS "cliente" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "tipo_pessoa" SMALLINT NOT NULL DEFAULT 1, -- 1: Física, 2: Jurídica, 3: Estrangeiro + "nome_razao_social" VARCHAR(128) NOT NULL, + "nome_fantasia" VARCHAR(128) DEFAULT NULL, + "cpf" CHAR(11) DEFAULT NULL, + "cnpj" CHAR(14) DEFAULT NULL, + "id_estrangeiro" VARCHAR(20) DEFAULT NULL, + "indicador_ie" SMALLINT NOT NULL DEFAULT 9, -- 1: Contribuinte ICMS, 2: Isento, 9: Não Contribuinte + "inscricao_estadual" VARCHAR(30) DEFAULT NULL, + "inscricao_municipal" VARCHAR(30) DEFAULT NULL, + "suframa" VARCHAR(9) DEFAULT NULL, + "email" VARCHAR(255) DEFAULT NULL, + "telefone" VARCHAR(20) DEFAULT NULL, + -- Endereço + "end_cep" CHAR(8) DEFAULT NULL, + "end_codigo_ibge" CHAR(7) DEFAULT NULL, + "end_logradouro" VARCHAR(255) DEFAULT NULL, + "end_numero" VARCHAR(10) DEFAULT NULL, + "end_complemento" VARCHAR(255) DEFAULT NULL, + "end_bairro" VARCHAR(255) DEFAULT NULL, + "end_cidade" VARCHAR(255) DEFAULT NULL, + "end_uf" CHAR(2) DEFAULT NULL, + "end_pais_codigo" CHAR(4) DEFAULT '1058', + "end_pais_nome" VARCHAR(60) DEFAULT 'BRASIL', + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +CREATE TABLE IF NOT EXISTS "fornecedor" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "tipo_pessoa" SMALLINT NOT NULL DEFAULT 2, -- 1: Física, 2: Jurídica + "nome_razao_social" VARCHAR(128) NOT NULL, + "nome_fantasia" VARCHAR(128) DEFAULT NULL, + "cpf" CHAR(11) DEFAULT NULL, + "cnpj" CHAR(14) DEFAULT NULL, + "indicador_ie" SMALLINT NOT NULL DEFAULT 1, + "inscricao_estadual" VARCHAR(30) DEFAULT NULL, + "inscricao_municipal" VARCHAR(30) DEFAULT NULL, + "email" VARCHAR(255) DEFAULT NULL, + "telefone" VARCHAR(20) DEFAULT NULL, + -- Endereço + "end_cep" CHAR(8) DEFAULT NULL, + "end_codigo_ibge" CHAR(7) DEFAULT NULL, + "end_logradouro" VARCHAR(255) DEFAULT NULL, + "end_numero" VARCHAR(10) DEFAULT NULL, + "end_complemento" VARCHAR(255) DEFAULT NULL, + "end_bairro" VARCHAR(255) DEFAULT NULL, + "end_cidade" VARCHAR(255) DEFAULT NULL, + "end_uf" CHAR(2) DEFAULT NULL, + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +CREATE TABLE IF NOT EXISTS "transportadora" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "nome_razao_social" VARCHAR(128) NOT NULL, + "cnpj" CHAR(14) DEFAULT NULL, + "cpf" CHAR(11) DEFAULT NULL, + "inscricao_estadual" VARCHAR(30) DEFAULT NULL, + "isento_ie" BOOLEAN NOT NULL DEFAULT FALSE, + "endereco_completo" VARCHAR(255) DEFAULT NULL, + "end_cidade" VARCHAR(255) DEFAULT NULL, + "end_uf" CHAR(2) DEFAULT NULL, + "end_codigo_ibge" CHAR(7) DEFAULT NULL, + "placa_veiculo" VARCHAR(10) DEFAULT NULL, + "uf_veiculo" CHAR(2) DEFAULT NULL, + "rntrc" VARCHAR(20) DEFAULT NULL, + "telefone" VARCHAR(20) DEFAULT NULL, + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- Cadastro de Veículos (utilizado por Transportadoras, CT-e e MDF-e) +CREATE TABLE IF NOT EXISTS "veiculo" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "placa" VARCHAR(10) NOT NULL, + "renavam" VARCHAR(20) DEFAULT NULL, + "uf_licenciamento" CHAR(2) NOT NULL, + "tipo_veiculo" VARCHAR(20) NOT NULL DEFAULT 'TRACAO', -- 'TRACAO', 'REBOQUE' + "tipo_rodado" VARCHAR(2) DEFAULT '01', -- 01: Truck, 02: Toco, 03: Cavalo Mecânico, 04: VAN, 05: Utilitário, 06: Outros + "tipo_carroceria" VARCHAR(2) DEFAULT '00', -- 00: Não aplicável, 01: Aberta, 02: Fechada/Baú, 03: Granelera, 04: Porta-contêiner, 05: Sider + "tara_kg" INTEGER DEFAULT 0, + "capacidade_kg" INTEGER DEFAULT 0, + "capacidade_m3" INTEGER DEFAULT 0, + "rntrc" VARCHAR(20) DEFAULT NULL, + "proprietario_tipo_pessoa" SMALLINT DEFAULT 1, -- 1: Próprio/Empresa, 2: Terceiro PF, 3: Terceiro PJ + "proprietario_cpf_cnpj" VARCHAR(14) DEFAULT NULL, + "proprietario_nome" VARCHAR(128) DEFAULT NULL, + "proprietario_ie" VARCHAR(30) DEFAULT NULL, + "proprietario_uf" CHAR(2) DEFAULT NULL, + "ativo" BOOLEAN NOT NULL DEFAULT TRUE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- Cadastro de Condutores / Motoristas (utilizado em CT-e e MDF-e) +CREATE TABLE IF NOT EXISTS "condutor" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "nome" VARCHAR(128) NOT NULL, + "cpf" CHAR(11) NOT NULL, + "cnh" VARCHAR(20) DEFAULT NULL, + "telefone" VARCHAR(20) DEFAULT NULL, + "ativo" BOOLEAN NOT NULL DEFAULT TRUE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- ============================================================================ +-- 4. PRODUTOS E REGRAS TRIBUTÁRIAS (VIGENTE + REFORMA TRIBUTÁRIA EC 132/2023) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "produto" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "codigo_interno" VARCHAR(60) NOT NULL, + "nome" VARCHAR(128) NOT NULL, + -- GTIN / Código de Barras (SEFAZ exige 'SEM GTIN' quando inexistente) + "codigo_barras_ean" VARCHAR(14) NOT NULL DEFAULT 'SEM GTIN', + "codigo_barras_ean_trib" VARCHAR(14) NOT NULL DEFAULT 'SEM GTIN', + "unidade_comercial_id" BIGINT NOT NULL, + "unidade_tributavel_id" BIGINT DEFAULT NULL, + "fator_conversao_tributaria" NUMERIC(15, 4) NOT NULL DEFAULT 1.0000, + "valor_unitario" NUMERIC(15, 4) NOT NULL DEFAULT 0.0000, + "valor_custo" NUMERIC(15, 4) NOT NULL DEFAULT 0.0000, + "peso_liquido_kg" NUMERIC(15, 4) DEFAULT NULL, + "peso_bruto_kg" NUMERIC(15, 4) DEFAULT NULL, + + -- Classificação Fiscal Geral + "ncm" CHAR(8) NOT NULL, + "cest" CHAR(7) DEFAULT NULL, + "ex_tipi" VARCHAR(3) DEFAULT NULL, + "cfop_padrao_nfe_interno" CHAR(4) NOT NULL DEFAULT '5102', + "cfop_padrao_nfe_externo" CHAR(4) NOT NULL DEFAULT '6102', + "cfop_padrao_nfce" CHAR(4) NOT NULL DEFAULT '5102', + "origem_mercadoria" SMALLINT NOT NULL DEFAULT 0, + + -- Tributação Vigente: ICMS / Simples Nacional + "cst_icms" CHAR(3) DEFAULT NULL, + "csosn" CHAR(4) DEFAULT NULL, + "modalidade_bc_icms" SMALLINT DEFAULT 3, + "aliquota_icms" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_reducao_bc_icms" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_icms_st" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_mva_st" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_reducao_bc_icms_st" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_fcp" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_fcp_st" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + + -- Tributação Vigente: PIS / COFINS / IPI + "cst_pis" CHAR(2) NOT NULL DEFAULT '07', + "aliquota_pis" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "cst_cofins" CHAR(2) NOT NULL DEFAULT '07', + "aliquota_cofins" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "cst_ipi" CHAR(2) DEFAULT NULL, + "codigo_enquadramento_ipi" CHAR(3) DEFAULT '999', + "aliquota_ipi" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + + -- ======================================================================== + -- PREPARAÇÃO PARA A REFORMA TRIBUTÁRIA (EC 132/2023 - IBS / CBS / IS) + -- ======================================================================== + "c_classif_trib" VARCHAR(20) DEFAULT NULL, -- Código de Classificação Tributária Nacional + "c_prod_anp" VARCHAR(10) DEFAULT NULL, -- Código ANP de Combustíveis e Derivados + "codigo_beneficio_fiscal" VARCHAR(10) DEFAULT NULL, -- cBenef + -- IBS (Imposto sobre Bens e Serviços) + "cst_ibs" VARCHAR(3) DEFAULT NULL, + "aliquota_ibs_estadual" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_ibs_municipal" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_diferimento_ibs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_reducao_ibs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + -- CBS (Contribuição sobre Bens e Serviços) + "cst_cbs" VARCHAR(3) DEFAULT NULL, + "aliquota_cbs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_diferimento_cbs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_reducao_cbs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + -- Imposto Seletivo (IS) + "tributado_imposto_seletivo" BOOLEAN NOT NULL DEFAULT FALSE, + "cst_is" VARCHAR(3) DEFAULT NULL, + "aliquota_is" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + + -- Controle + "ativo" BOOLEAN NOT NULL DEFAULT TRUE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- ============================================================================ +-- 5. CATÁLOGO DE SERVIÇOS (PARA EMPRESAS PRESTADORAS DE SERVIÇOS - NFS-e) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "servico" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "codigo_interno" VARCHAR(60) NOT NULL, + "nome" VARCHAR(128) NOT NULL, + "discriminacao_padrao" TEXT DEFAULT NULL, + + -- Classificação do Serviço conforme LC 116/2003 e Prefeituras + "item_lista_servico" VARCHAR(10) NOT NULL, -- Ex: '01.01', '07.02', '14.01', '17.01' + "codigo_cnae" CHAR(7) DEFAULT NULL, + "codigo_tributacao_municipio" VARCHAR(30) DEFAULT NULL, + "codigo_tributacao_nacional" VARCHAR(10) DEFAULT NULL, -- cTribNac (Padrão Nacional NFS-e) + "c_classif_trib" VARCHAR(20) DEFAULT NULL, -- Reforma Tributária + + -- Valores e Regras do ISS + "valor_unitario" NUMERIC(15, 4) NOT NULL DEFAULT 0.0000, + "aliquota_iss" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "iss_retido_padrao" BOOLEAN NOT NULL DEFAULT FALSE, + "exigibilidade_iss" SMALLINT NOT NULL DEFAULT 1, -- 1: Exigível, 2: Não incidência, 3: Isenção, 4: Exportação, 5: Imunidade, 6: Suspensa por Decisão Judicial, 7: Suspensa por Processo Administrativo + + -- Retenções Federais Padrão + "aliquota_pis" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_cofins" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_inss" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_ir" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_csll" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + + -- Reforma Tributária no Serviço (IBS / CBS) + "aliquota_ibs_estadual" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_ibs_municipal" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "aliquota_cbs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + + -- Controle + "ativo" BOOLEAN NOT NULL DEFAULT TRUE, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- ============================================================================ +-- 6. DOCUMENTOS FISCAIS DE MERCADORIAS (NF-e MOD 55 / NFC-e MOD 65) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "documento_fiscal" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, -- Filial emissora + "serie_fiscal_id" BIGINT DEFAULT NULL, -- Série fiscal dinâmica utilizada + "cliente_id" BIGINT DEFAULT NULL, -- Opcional em NFC-e (consumidor) + "transportadora_id" BIGINT DEFAULT NULL, + + -- Identificação do DF-e + "modelo" CHAR(2) NOT NULL DEFAULT '55', -- '55': NF-e, '65': NFC-e + "serie" VARCHAR(5) NOT NULL DEFAULT '1', + "numero" INTEGER NOT NULL, + "codigo_numerico" CHAR(8) DEFAULT NULL, -- cNF (código aleatório de 8 dígitos) + "natureza_operacao" VARCHAR(128) NOT NULL DEFAULT 'VENDA DE MERCADORIAS', + "tipo_documento" SMALLINT NOT NULL DEFAULT 1, -- 0: Entrada, 1: Saída + "destino_operacao" SMALLINT NOT NULL DEFAULT 1, -- 1: Interna, 2: Interestadual, 3: Exterior + "tipo_emissao" SMALLINT NOT NULL DEFAULT 1, -- 1: Normal, 9: Contingência Off-line + "finalidade_emissao" SMALLINT NOT NULL DEFAULT 1, -- 1: Normal, 2: Complementar, 3: Ajuste, 4: Devolução + "consumidor_final" SMALLINT NOT NULL DEFAULT 1, -- 0: Normal, 1: Consumidor Final + "presenca_comprador" SMALLINT NOT NULL DEFAULT 1, -- 1: Presencial, 2: Internet, etc. + "ambiente_sefaz" SMALLINT NOT NULL DEFAULT 2, -- 1: Produção, 2: Homologação + + -- Datas e Status + "data_emissao" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "data_saida_entrada" TIMESTAMP DEFAULT NULL, + "status" VARCHAR(20) NOT NULL DEFAULT 'DIGITACAO', -- DIGITACAO, TRANSMITIDA, AUTORIZADA, CANCELADA, DENEGADA, REJEITADA, INUTILIZADA + "chave_acesso" CHAR(44) DEFAULT NULL, + "protocolo_autorizacao" VARCHAR(60) DEFAULT NULL, + "data_autorizacao" TIMESTAMP DEFAULT NULL, + "motivo_status_sefaz" VARCHAR(512) DEFAULT NULL, + "codigo_status_sefaz" VARCHAR(10) DEFAULT NULL, + + -- Transporte / Frete + "modalidade_frete" SMALLINT NOT NULL DEFAULT 9, -- 0: CIF, 1: FOB, 2: Terceiros, 9: Sem Frete + "valor_frete" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_seguro" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_desconto" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_outras_despesas" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "placa_veiculo" VARCHAR(10) DEFAULT NULL, + "uf_veiculo" CHAR(2) DEFAULT NULL, + "quantidade_volumes" NUMERIC(10, 2) DEFAULT NULL, + "especie_volumes" VARCHAR(60) DEFAULT NULL, + "peso_liquido" NUMERIC(15, 3) DEFAULT NULL, + "peso_bruto" NUMERIC(15, 3) DEFAULT NULL, + + -- Totais de Produtos e Tributação Vigente + "valor_total_produtos" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_bc_icms" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_icms" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_icms_desonerado" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_bc_icms_st" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_icms_st" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_fcp" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_fcp_st" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_fcp_retido_st" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_ipi" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_ipi_devolvido" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_pis" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_cofins" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_tributos_aproximado" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_documento" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- ======================================================================== + -- TOTAIS DA REFORMA TRIBUTÁRIA (EC 132/2023 - IBS / CBS / IS) + -- ======================================================================== + "valor_bc_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_ibs_estadual" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_ibs_municipal" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_bc_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_bc_is" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_is" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Informações Adicionais + "informacoes_complementares" TEXT DEFAULT NULL, + "informacoes_fisco" TEXT DEFAULT NULL, + + -- Armazenamento SEFAZ e NFC-e + "xml_envio" TEXT DEFAULT NULL, + "xml_autorizado" TEXT DEFAULT NULL, + "xml_cancelamento" TEXT DEFAULT NULL, + "retorno_sefaz_json" JSONB DEFAULT NULL, + "qrcode_url_nfce" TEXT DEFAULT NULL, + + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- Itens do Documento Fiscal +CREATE TABLE IF NOT EXISTS "documento_fiscal_item" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "documento_fiscal_id" BIGINT NOT NULL, + "numero_item" INTEGER NOT NULL, + "produto_id" BIGINT DEFAULT NULL, + "codigo_produto" VARCHAR(60) NOT NULL, + "descricao_produto" VARCHAR(128) NOT NULL, + "ncm" CHAR(8) NOT NULL, + "cest" CHAR(7) DEFAULT NULL, + "cfop" CHAR(4) NOT NULL, + "codigo_barras_ean" VARCHAR(14) NOT NULL DEFAULT 'SEM GTIN', + "codigo_barras_ean_trib" VARCHAR(14) NOT NULL DEFAULT 'SEM GTIN', + + -- Unidades e Quantidades + "unidade_comercial" VARCHAR(10) NOT NULL, + "quantidade_comercial" NUMERIC(15, 4) NOT NULL, + "valor_unitario_comercial" NUMERIC(15, 4) NOT NULL, + "valor_total_bruto" NUMERIC(15, 2) NOT NULL, + "unidade_tributavel" VARCHAR(10) NOT NULL, + "quantidade_tributavel" NUMERIC(15, 4) NOT NULL, + "valor_unitario_tributavel" NUMERIC(15, 4) NOT NULL, + + -- Rateios no Item + "valor_desconto" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_frete" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_seguro" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_outras_despesas" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "ind_total" SMALLINT NOT NULL DEFAULT 1, + + -- Detalhamento Tributação Vigente: ICMS / Simples Nacional + "origem_mercadoria" SMALLINT NOT NULL DEFAULT 0, + "cst_icms" CHAR(3) DEFAULT NULL, + "csosn" CHAR(4) DEFAULT NULL, + "modalidade_bc_icms" SMALLINT DEFAULT 3, + "base_icms" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_icms" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_icms" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "percentual_reducao_bc_icms" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "base_icms_st" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_icms_st" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_icms_st" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "percentual_mva_st" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "percentual_reducao_bc_icms_st" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "base_fcp" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_fcp" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_fcp" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Detalhamento Tributação Vigente: PIS / COFINS / IPI + "cst_pis" CHAR(2) NOT NULL DEFAULT '07', + "base_pis" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_pis" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_pis" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "cst_cofins" CHAR(2) NOT NULL DEFAULT '07', + "base_cofins" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_cofins" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_cofins" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "cst_ipi" CHAR(2) DEFAULT NULL, + "codigo_enquadramento_ipi" CHAR(3) DEFAULT '999', + "base_ipi" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_ipi" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_ipi" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- ======================================================================== + -- DETALHAMENTO REFORMA TRIBUTÁRIA POR ITEM (EC 132/2023 - IBS / CBS / IS) + -- ======================================================================== + "c_classif_trib" VARCHAR(20) DEFAULT NULL, + "c_prod_anp" VARCHAR(10) DEFAULT NULL, + "c_benef" VARCHAR(10) DEFAULT NULL, + -- IBS Item + "cst_ibs" VARCHAR(3) DEFAULT NULL, + "base_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_ibs_estadual" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_ibs_estadual" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_ibs_municipal" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_ibs_municipal" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + -- CBS Item + "cst_cbs" VARCHAR(3) DEFAULT NULL, + "base_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_cbs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + -- Imposto Seletivo Item + "cst_is" VARCHAR(3) DEFAULT NULL, + "base_is" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_is" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_is" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + "valor_total_tributos_item" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "informacoes_adicionais" TEXT DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Formas de Pagamento do Documento Fiscal +CREATE TABLE IF NOT EXISTS "documento_fiscal_pagamento" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "documento_fiscal_id" BIGINT NOT NULL, + "forma_pagamento" CHAR(2) NOT NULL DEFAULT '01', -- 01: Dinheiro, 02: Cheque, 03: Cartão de Crédito, 04: Cartão de Débito, 15: Boleto, 17: PIX, 90: Sem Pagamento, 99: Outros + "valor_pagamento" NUMERIC(15, 2) NOT NULL, + "tipo_integracao" SMALLINT NOT NULL DEFAULT 2, -- 1: Integrado TEF, 2: Não Integrado + "cnpj_credenciadora" CHAR(14) DEFAULT NULL, + "bandeira_operadora" CHAR(2) DEFAULT NULL, -- 01: Visa, 02: Mastercard, 03: Amex, 04: Sorocred, 05: Elo, 99: Outras + "numero_autorizacao" VARCHAR(20) DEFAULT NULL, + "valor_troco" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Duplicatas / Parcelas de Cobrança (NF-e) +CREATE TABLE IF NOT EXISTS "documento_fiscal_duplicata" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "documento_fiscal_id" BIGINT NOT NULL, + "numero_duplicata" VARCHAR(60) NOT NULL, + "data_vencimento" DATE NOT NULL, + "valor_duplicata" NUMERIC(15, 2) NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Eventos SEFAZ (Cancelamento, Carta de Correção - CCe, Inutilização) +CREATE TABLE IF NOT EXISTS "documento_fiscal_evento" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "documento_fiscal_id" BIGINT NOT NULL, + "tipo_evento" VARCHAR(30) NOT NULL, -- 'CANCELAMENTO', 'CCE', 'INUTILIZACAO' + "codigo_evento" CHAR(6) NOT NULL, -- 110111: Cancelamento, 110110: CC-e + "sequencial_evento" INTEGER NOT NULL DEFAULT 1, + "data_evento" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "protocolo" VARCHAR(60) DEFAULT NULL, + "justificativa" TEXT NOT NULL, + "xml_evento" TEXT DEFAULT NULL, + "xml_retorno" TEXT DEFAULT NULL, + "status_sefaz" VARCHAR(10) DEFAULT NULL, + "motivo_sefaz" VARCHAR(512) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- ============================================================================ +-- 7. MÓDULO DE NFS-e (NOTA FISCAL DE SERVIÇOS ELETRÔNICA - ABRASF / NACIONAL) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "nfse" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, -- Filial prestadora do serviço + "serie_fiscal_id" BIGINT DEFAULT NULL, -- Série do RPS / DPS + "cliente_id" BIGINT DEFAULT NULL, -- Tomador do serviço + "intermediario_id" BIGINT DEFAULT NULL, -- Intermediário do serviço (opcional) + + -- Identificação da NFS-e Nacional (ADN / Receita Federal) e Prefeituras + "chave_acesso" CHAR(50) DEFAULT NULL, -- Chave de acesso oficial de 50 dígitos da NFS-e Nacional + "numero_nfse" VARCHAR(30) DEFAULT NULL, + "codigo_verificacao" VARCHAR(30) DEFAULT NULL, + "data_emissao_nfse" TIMESTAMP DEFAULT NULL, + "link_url_nfse" TEXT DEFAULT NULL, + "link_danfse_pdf" TEXT DEFAULT NULL, -- Link para download direto do DANFSe no ADN (Receita Federal) + "qrcode_url_nfse" TEXT DEFAULT NULL, -- URL do QR-Code da NFS-e Nacional + + -- Dados da DPS (Declaração de Prestação de Serviços) / RPS + "tipo_documento" VARCHAR(10) NOT NULL DEFAULT 'DPS', -- 'DPS' (Padrão Nacional), 'RPS' (ABRASF/Municipal) + "id_dps" VARCHAR(50) DEFAULT NULL, -- Identificador da DPS (ex: DPS3550308...) + "numero_rps" INTEGER NOT NULL, + "serie_rps" VARCHAR(5) NOT NULL DEFAULT '1', + "tipo_rps" SMALLINT NOT NULL DEFAULT 1, -- 1: RPS, 2: Nota Fiscal Conjugada Mista, 3: Cupom + "data_emissao_rps" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "ambiente_sefaz" SMALLINT NOT NULL DEFAULT 2, -- 1: Produção, 2: Produção Restrita (Homologação) + + -- Local de Prestação do Serviço + "end_codigo_ibge_prestacao" CHAR(7) NOT NULL, + "end_cidade_prestacao" VARCHAR(128) NOT NULL, + "end_uf_prestacao" CHAR(2) NOT NULL, + "end_pais_codigo" CHAR(4) DEFAULT '1058', + "pais_resultado_prestacao" CHAR(4) DEFAULT '1058', + + -- Regime e Tributação do ISS (Padrão Nacional / LC 116) + "regime_especial_tributacao" SMALLINT DEFAULT 0, -- 0: Nenhum, 1: Microempresa Municipal, 2: Estimativa, 3: Sociedade de Profissionais, 4: Cooperativa, 5: MEI, 6: Simples Nacional / ME / EPP + "optante_simples_nacional" BOOLEAN NOT NULL DEFAULT TRUE, + "incentivo_fiscal" BOOLEAN NOT NULL DEFAULT FALSE, + "tp_tributacao_iss" SMALLINT NOT NULL DEFAULT 1, -- 1: Tributável no município, 2: Tributável fora do município, 3: Isenção, 4: Imunidade, 5: Exigibilidade suspensa judicial, 6: Exigibilidade suspensa administrativo, 7: Não incidência + "tp_retencao_iss" SMALLINT NOT NULL DEFAULT 1, -- 1: Não Retido, 2: Retido pelo Tomador, 3: Retido pelo Intermediário + + -- Valores do Serviço + "valor_servicos" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_deducoes" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_desconto_incondicionado" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_desconto_condicionado" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_outras_retencoes" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- ISS + "base_calculo_iss" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_iss" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_iss" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "iss_retido" BOOLEAN NOT NULL DEFAULT FALSE, + "valor_iss_retido" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "responsavel_retencao_iss" SMALLINT DEFAULT 1, -- 1: Tomador, 2: Intermediário + + -- Retenções Federais + "valor_pis" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_cofins" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_inss" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_ir" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_csll" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Reforma Tributária na NFS-e (EC 132/2023 - IBS / CBS) + "valor_bc_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_ibs_estadual" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_ibs_municipal" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_bc_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Valor Líquido Final da NFS-e + "valor_liquido_nfse" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Status e Integração Web Service ADN (Nacional) / Prefeitura (ABRASF) + "status" VARCHAR(20) NOT NULL DEFAULT 'DIGITACAO', -- DIGITACAO, ENVIADO_LOTE, PROCESSANDO, EMITIDA, CANCELADA, REJEITADA, SUBSTITUIDA + "numero_lote_rps" VARCHAR(30) DEFAULT NULL, + "protocolo_lote" VARCHAR(60) DEFAULT NULL, + "motivo_status" VARCHAR(512) DEFAULT NULL, + "codigo_status" VARCHAR(10) DEFAULT NULL, + "xml_rps_envio" TEXT DEFAULT NULL, + "xml_nfse_autorizada" TEXT DEFAULT NULL, + "xml_cancelamento" TEXT DEFAULT NULL, + "retorno_prefeitura_json" JSONB DEFAULT NULL, + + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- Itens / Discriminação do Serviço na NFS-e +CREATE TABLE IF NOT EXISTS "nfse_item" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "nfse_id" BIGINT NOT NULL, + "numero_item" INTEGER NOT NULL, + "servico_id" BIGINT DEFAULT NULL, + "discriminacao_servico" TEXT NOT NULL, + + -- Códigos Fiscais do Item + "item_lista_servico" VARCHAR(10) NOT NULL, + "codigo_cnae" CHAR(7) DEFAULT NULL, + "codigo_tributacao_municipio" VARCHAR(30) DEFAULT NULL, + "codigo_tributacao_nacional" VARCHAR(10) DEFAULT NULL, + "c_classif_trib" VARCHAR(20) DEFAULT NULL, + + -- Quantidades e Valores + "quantidade" NUMERIC(15, 4) NOT NULL DEFAULT 1.0000, + "valor_unitario" NUMERIC(15, 4) NOT NULL DEFAULT 0.0000, + "valor_total_servico" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_deducao" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_desconto" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Tributação do Item + "aliquota_iss" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_iss" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "iss_retido" BOOLEAN NOT NULL DEFAULT FALSE, + "aliquota_ibs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_cbs" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Eventos e Cancelamento de NFS-e +CREATE TABLE IF NOT EXISTS "nfse_evento" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "nfse_id" BIGINT NOT NULL, + "tipo_evento" VARCHAR(30) NOT NULL, -- 'CANCELAMENTO', 'SUBSTITUICAO' + "codigo_motivo_cancelamento" VARCHAR(5) DEFAULT NULL, -- 1: Erro emissão, 2: Serviço não prestado, 3: Erro assinatura, 4: Duplicidade, 9: Outros + "justificativa" TEXT NOT NULL, + "data_evento" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "protocolo" VARCHAR(60) DEFAULT NULL, + "xml_evento" TEXT DEFAULT NULL, + "xml_retorno" TEXT DEFAULT NULL, + "status_prefeitura" VARCHAR(10) DEFAULT NULL, + "motivo_prefeitura" VARCHAR(512) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- ============================================================================ +-- 8. MÓDULO DE CT-e (CONHECIMENTO DE TRANSPORTE ELETRÔNICO - MODELO 57) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "cte" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, -- Filial emissora do frete + "serie_fiscal_id" BIGINT DEFAULT NULL, -- Série fiscal do CT-e + "serie" VARCHAR(5) NOT NULL DEFAULT '1', + "numero" INTEGER NOT NULL, + "codigo_numerico" CHAR(8) DEFAULT NULL, -- cCT + "natureza_operacao" VARCHAR(128) NOT NULL DEFAULT 'PRESTACAO DE SERVICO DE TRANSPORTE', + "cfop" CHAR(4) NOT NULL, + "tipo_cte" SMALLINT NOT NULL DEFAULT 0, -- 0: Normal, 1: Complementar, 2: Anulação, 3: Substituto + "tipo_servico" SMALLINT NOT NULL DEFAULT 0, -- 0: Normal, 1: Subcontratação, 2: Redespacho, 3: Redespacho Intermediário, 4: Multimodal + "modal" VARCHAR(2) NOT NULL DEFAULT '01', -- 01: Rodoviário, 02: Aéreo, 03: Aquaviário, 04: Ferroviário, 05: Dutoviário, 06: Multimodal + "ambiente_sefaz" SMALLINT NOT NULL DEFAULT 2, -- 1: Produção, 2: Homologação + "tipo_emissao" SMALLINT NOT NULL DEFAULT 1, -- 1: Normal, 7: EPEC, 8: Contingência FSDA + + -- Datas e Status + "data_emissao" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "status" VARCHAR(20) NOT NULL DEFAULT 'DIGITACAO', + "chave_acesso" CHAR(44) DEFAULT NULL, + "protocolo_autorizacao" VARCHAR(60) DEFAULT NULL, + "data_autorizacao" TIMESTAMP DEFAULT NULL, + "motivo_status_sefaz" VARCHAR(512) DEFAULT NULL, + "codigo_status_sefaz" VARCHAR(10) DEFAULT NULL, + + -- Localidade da Prestação + "end_codigo_ibge_inicio" CHAR(7) NOT NULL, + "end_cidade_inicio" VARCHAR(128) NOT NULL, + "end_uf_inicio" CHAR(2) NOT NULL, + "end_codigo_ibge_fim" CHAR(7) NOT NULL, + "end_cidade_fim" VARCHAR(128) NOT NULL, + "end_uf_fim" CHAR(2) NOT NULL, + + -- Atores do Frete (Tomador do Serviço) + "tomador_servico" SMALLINT NOT NULL DEFAULT 0, -- 0: Remetente, 1: Expedidor, 2: Recebedor, 3: Destinatário, 4: Outros + "remetente_id" BIGINT DEFAULT NULL, -- FK cliente/fornecedor + "destinatario_id" BIGINT DEFAULT NULL, + "expedidor_id" BIGINT DEFAULT NULL, + "recebedor_id" BIGINT DEFAULT NULL, + "tomador_id" BIGINT DEFAULT NULL, + + -- Valores do Frete e Tributação + "valor_total_prestacao" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_receber" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Tributação ICMS + "cst_icms" CHAR(3) DEFAULT NULL, + "base_icms" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "aliquota_icms" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_icms" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "percentual_reducao_bc_icms" NUMERIC(5, 2) NOT NULL DEFAULT 0.00, + "valor_icms_outra_uf" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Reforma Tributária no CT-e + "c_classif_trib" VARCHAR(20) DEFAULT NULL, + "valor_bc_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_ibs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_bc_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "valor_total_cbs" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Informações da Carga + "produto_predominante" VARCHAR(128) DEFAULT NULL, + "outras_caracteristicas_carga" VARCHAR(60) DEFAULT NULL, + "valor_total_carga" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + + -- Informações Adicionais e Arquivos + "informacoes_complementares" TEXT DEFAULT NULL, + "xml_envio" TEXT DEFAULT NULL, + "xml_autorizado" TEXT DEFAULT NULL, + "xml_cancelamento" TEXT DEFAULT NULL, + "retorno_sefaz_json" JSONB DEFAULT NULL, + "qrcode_url_cte" TEXT DEFAULT NULL, + + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- Componentes Tarifários do Valor da Prestação do Frete +CREATE TABLE IF NOT EXISTS "cte_componente_valor" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "cte_id" BIGINT NOT NULL, + "nome_componente" VARCHAR(60) NOT NULL, -- 'FRETE VALOR', 'FRETE PESO', 'PEDAGIO', 'GRIS', 'TAXA DESPACHO', 'OUTROS' + "valor" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Documentos Originários Referenciados no CT-e (ex: NF-e transportadas) +CREATE TABLE IF NOT EXISTS "cte_documento_referenciado" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "cte_id" BIGINT NOT NULL, + "tipo_documento" VARCHAR(10) NOT NULL DEFAULT 'NFE', -- 'NFE', 'NF_PAPEL', 'OUTROS' + "chave_acesso_nfe" CHAR(44) DEFAULT NULL, + "numero_documento" VARCHAR(30) DEFAULT NULL, + "serie_documento" VARCHAR(5) DEFAULT NULL, + "data_emissao" DATE DEFAULT NULL, + "valor_documento" NUMERIC(15, 2) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Informações de Quantidades da Carga no CT-e +CREATE TABLE IF NOT EXISTS "cte_carga" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "cte_id" BIGINT NOT NULL, + "codigo_unidade_medida" VARCHAR(2) NOT NULL DEFAULT '01', -- 00: M3, 01: KG, 02: TON, 03: UNID, 04: LITROS, 05: MMBTU + "tipo_medida" VARCHAR(60) NOT NULL, -- 'PESO BRUTO', 'PESO DECLARADO', 'PESO LIQUIDO', 'VOLUME', 'LITRAGEM' + "quantidade" NUMERIC(15, 4) NOT NULL DEFAULT 0.0000, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Informações do Veículo Rodoviário e Condutores no CT-e +CREATE TABLE IF NOT EXISTS "cte_veiculo_rodoviario" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "cte_id" BIGINT NOT NULL, + "veiculo_id" BIGINT DEFAULT NULL, + "rntrc" VARCHAR(20) DEFAULT NULL, + "condutor_id" BIGINT DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Eventos do CT-e (Cancelamento, Carta de Correção - CC-e) +CREATE TABLE IF NOT EXISTS "cte_evento" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "cte_id" BIGINT NOT NULL, + "tipo_evento" VARCHAR(30) NOT NULL, -- 'CANCELAMENTO', 'CCE' + "codigo_evento" CHAR(6) NOT NULL, -- 110111: Cancelamento, 110110: CC-e + "sequencial_evento" INTEGER NOT NULL DEFAULT 1, + "data_evento" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "protocolo" VARCHAR(60) DEFAULT NULL, + "justificativa" TEXT NOT NULL, + "xml_evento" TEXT DEFAULT NULL, + "xml_retorno" TEXT DEFAULT NULL, + "status_sefaz" VARCHAR(10) DEFAULT NULL, + "motivo_sefaz" VARCHAR(512) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- ============================================================================ +-- 9. MÓDULO DE MDF-e (MANIFESTO ELETRÔNICO DE DOCUMENTOS FISCAIS - MODELO 58) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "mdfe" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, -- Filial emissora do manifesto + "serie_fiscal_id" BIGINT DEFAULT NULL, -- Série fiscal do MDF-e + "serie" VARCHAR(5) NOT NULL DEFAULT '1', + "numero" INTEGER NOT NULL, + "codigo_numerico" CHAR(8) DEFAULT NULL, -- cMDF + "tipo_emissao" SMALLINT NOT NULL DEFAULT 1, -- 1: Normal, 2: Contingência + "tipo_transportador" SMALLINT NOT NULL DEFAULT 1, -- 1: ETC, 2: TAC, 3: CTC + "modal" SMALLINT NOT NULL DEFAULT 1, -- 1: Rodoviário, 2: Aéreo, 3: Aquaviário, 4: Ferroviário + "ambiente_sefaz" SMALLINT NOT NULL DEFAULT 2, -- 1: Produção, 2: Homologação + + -- Datas e Status + "data_emissao" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "data_inicio_viagem" TIMESTAMP DEFAULT NULL, + "status" VARCHAR(20) NOT NULL DEFAULT 'DIGITACAO', -- DIGITACAO, TRANSMITIDO, AUTORIZADO, ENCERRADO, CANCELADO, REJEITADO + "chave_acesso" CHAR(44) DEFAULT NULL, + "protocolo_autorizacao" VARCHAR(60) DEFAULT NULL, + "data_autorizacao" TIMESTAMP DEFAULT NULL, + "motivo_status_sefaz" VARCHAR(512) DEFAULT NULL, + "codigo_status_sefaz" VARCHAR(10) DEFAULT NULL, + + -- Rota do Transporte + "uf_carregamento" CHAR(2) NOT NULL, + "uf_descarregamento" CHAR(2) NOT NULL, + + -- Totais Consolidados da Carga + "valor_total_carga" NUMERIC(15, 2) NOT NULL DEFAULT 0.00, + "codigo_unidade_peso" VARCHAR(2) NOT NULL DEFAULT '01', -- 01: KG, 02: TON + "peso_bruto_total" NUMERIC(15, 4) NOT NULL DEFAULT 0.0000, + "quantidade_total_dfe" INTEGER NOT NULL DEFAULT 0, -- Total de CT-e / NF-e manifestados + + -- Seguro de Carga + "responsavel_seguro" SMALLINT DEFAULT 1, -- 1: Emitente do MDF-e, 2: Contratante do Serviço + "seguradora_cnpj" CHAR(14) DEFAULT NULL, + "seguradora_nome" VARCHAR(128) DEFAULT NULL, + "numero_apolice" VARCHAR(60) DEFAULT NULL, + "numero_averbacao" VARCHAR(60) DEFAULT NULL, + + -- Arquivos e Informações + "informacoes_complementares" TEXT DEFAULT NULL, + "informacoes_fisco" TEXT DEFAULT NULL, + "xml_envio" TEXT DEFAULT NULL, + "xml_autorizado" TEXT DEFAULT NULL, + "xml_encerramento" TEXT DEFAULT NULL, + "xml_cancelamento" TEXT DEFAULT NULL, + "retorno_sefaz_json" JSONB DEFAULT NULL, + "qrcode_url_mdfe" TEXT DEFAULT NULL, + + -- Timestamps + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- Municípios de Carregamento do MDF-e +CREATE TABLE IF NOT EXISTS "mdfe_municipio_carregamento" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "mdfe_id" BIGINT NOT NULL, + "end_codigo_ibge" CHAR(7) NOT NULL, + "end_cidade" VARCHAR(128) NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Municípios de Descarregamento do MDF-e +CREATE TABLE IF NOT EXISTS "mdfe_municipio_descarregamento" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "mdfe_id" BIGINT NOT NULL, + "end_codigo_ibge" CHAR(7) NOT NULL, + "end_cidade" VARCHAR(128) NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- UFs de Percurso do Transporte (quando interestadual) +CREATE TABLE IF NOT EXISTS "mdfe_percurso_uf" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "mdfe_id" BIGINT NOT NULL, + "ordem" SMALLINT NOT NULL DEFAULT 1, + "uf_percurso" CHAR(2) NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Veículo de Tração do MDF-e +CREATE TABLE IF NOT EXISTS "mdfe_veiculo_tracao" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "mdfe_id" BIGINT NOT NULL, + "veiculo_id" BIGINT DEFAULT NULL, + "placa" VARCHAR(10) NOT NULL, + "renavam" VARCHAR(20) DEFAULT NULL, + "uf_licenciamento" CHAR(2) NOT NULL, + "tara_kg" INTEGER NOT NULL DEFAULT 0, + "capacidade_kg" INTEGER DEFAULT 0, + "capacidade_m3" INTEGER DEFAULT 0, + "tipo_rodado" VARCHAR(2) DEFAULT '01', + "tipo_carroceria" VARCHAR(2) DEFAULT '00', + "rntrc" VARCHAR(20) DEFAULT NULL, + "proprietario_tipo_pessoa" SMALLINT DEFAULT 1, + "proprietario_cpf_cnpj" VARCHAR(14) DEFAULT NULL, + "proprietario_nome" VARCHAR(128) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Reboques Acoplados no MDF-e +CREATE TABLE IF NOT EXISTS "mdfe_veiculo_reboque" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "mdfe_id" BIGINT NOT NULL, + "veiculo_id" BIGINT DEFAULT NULL, + "placa" VARCHAR(10) NOT NULL, + "renavam" VARCHAR(20) DEFAULT NULL, + "uf_licenciamento" CHAR(2) NOT NULL, + "tara_kg" INTEGER NOT NULL DEFAULT 0, + "capacidade_kg" INTEGER DEFAULT 0, + "capacidade_m3" INTEGER DEFAULT 0, + "tipo_carroceria" VARCHAR(2) DEFAULT '00', + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Condutores / Motoristas Vinculados ao MDF-e +CREATE TABLE IF NOT EXISTS "mdfe_condutor" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "mdfe_id" BIGINT NOT NULL, + "condutor_id" BIGINT DEFAULT NULL, + "nome_condutor" VARCHAR(128) NOT NULL, + "cpf_condutor" CHAR(11) NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Documentos Fiscais Manifestados no MDF-e (NF-e ou CT-e) +CREATE TABLE IF NOT EXISTS "mdfe_documento_referenciado" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "mdfe_id" BIGINT NOT NULL, + "tipo_documento" VARCHAR(10) NOT NULL DEFAULT 'NFE', -- 'NFE', 'CTE' + "chave_acesso" CHAR(44) NOT NULL, + "end_codigo_ibge_descarregamento" CHAR(7) NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Eventos do MDF-e (Cancelamento, Encerramento, Inclusão de Condutor) +CREATE TABLE IF NOT EXISTS "mdfe_evento" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "mdfe_id" BIGINT NOT NULL, + "tipo_evento" VARCHAR(30) NOT NULL, -- 'ENCERRAMENTO', 'CANCELAMENTO', 'INCLUSAO_CONDUTOR' + "codigo_evento" CHAR(6) NOT NULL, -- 110112: Encerramento, 110111: Cancelamento, 110114: Inclusão Condutor + "sequencial_evento" INTEGER NOT NULL DEFAULT 1, + "data_evento" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "protocolo" VARCHAR(60) DEFAULT NULL, + "justificativa" TEXT DEFAULT NULL, + -- Dados específicos do encerramento (UF e Município de Encerramento) + "end_codigo_ibge_encerramento" CHAR(7) DEFAULT NULL, + "end_uf_encerramento" CHAR(2) DEFAULT NULL, + "xml_evento" TEXT DEFAULT NULL, + "xml_retorno" TEXT DEFAULT NULL, + "status_sefaz" VARCHAR(10) DEFAULT NULL, + "motivo_sefaz" VARCHAR(512) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- ============================================================================ +-- 10. CONFIGURAÇÕES & MENSALIDADES DA EMPRESA +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS "configuracao" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "nome_app" VARCHAR(128) NOT NULL DEFAULT 'Workbloom ERP', + "mensagem_suporte" VARCHAR(512) DEFAULT NULL, + "contato_suporte" VARCHAR(32) DEFAULT NULL, + "contato_suporte_formatado" VARCHAR(32) DEFAULT NULL, + "info_pagamento_pix" TEXT DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL +); + +CREATE TABLE IF NOT EXISTS "pagamento_empresa" ( + "id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "uuid" UUID NOT NULL, + "empresa_id" BIGINT NOT NULL, + "contador_id" BIGINT DEFAULT NULL, + "data_vencimento" DATE NOT NULL, + "data_pagamento" DATE DEFAULT NULL, + "valor" NUMERIC(15, 2) NOT NULL, + "status" VARCHAR(20) NOT NULL DEFAULT 'PENDENTE', -- PENDENTE, PAGO, CANCELADO, VENCIDO + "observacoes" VARCHAR(512) DEFAULT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP DEFAULT NULL, + "deleted_at" TIMESTAMP DEFAULT NULL +); + +-- ============================================================================ +-- 11. CONSTRAINTS (CHAVES ESTRANGEIRAS E UNICIDADES) +-- ============================================================================ + +-- Usuario +ALTER TABLE "usuario" + ADD CONSTRAINT "usuario_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "usuario_email_unique" UNIQUE ("email"), + ADD CONSTRAINT "usuario_nome_usuario_unique" UNIQUE ("nome_usuario"); + +-- Contador +ALTER TABLE "contador" + ADD CONSTRAINT "contador_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "contador_email_unique" UNIQUE ("email"); + +-- Certificado +ALTER TABLE "certificado" + ADD CONSTRAINT "certificado_uuid_unique" UNIQUE ("uuid"); + +-- Empresa +ALTER TABLE "empresa" + ADD CONSTRAINT "empresa_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "empresa_cnpj_unique" UNIQUE ("cnpj"), + ADD CONSTRAINT "fk_empresa_matriz" FOREIGN KEY ("matriz_id") REFERENCES "empresa" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_empresa_contador" FOREIGN KEY ("contador_id") REFERENCES "contador" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_empresa_certificado" FOREIGN KEY ("certificado_id") REFERENCES "certificado" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- Empresa Configuração Fiscal +ALTER TABLE "empresa_configuracao_fiscal" + ADD CONSTRAINT "empresa_config_fiscal_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "empresa_config_fiscal_mod_unique" UNIQUE ("empresa_id", "modelo_documento"), + ADD CONSTRAINT "fk_empresa_config_fiscal_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Série Fiscal +ALTER TABLE "serie_fiscal" + ADD CONSTRAINT "serie_fiscal_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "serie_fiscal_empresa_mod_serie_amb_unique" UNIQUE ("empresa_id", "modelo_documento", "serie", "ambiente_sefaz"), + ADD CONSTRAINT "fk_serie_fiscal_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Usuario Empresa +ALTER TABLE "usuario_empresa" + ADD CONSTRAINT "usuario_empresa_unique" UNIQUE ("usuario_id", "empresa_id"), + ADD CONSTRAINT "fk_usuario_empresa_usuario" FOREIGN KEY ("usuario_id") REFERENCES "usuario" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_usuario_empresa_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Unidade +ALTER TABLE "unidade" + ADD CONSTRAINT "unidade_sigla_unique" UNIQUE ("sigla"); + +-- Cliente +ALTER TABLE "cliente" + ADD CONSTRAINT "cliente_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_cliente_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Fornecedor +ALTER TABLE "fornecedor" + ADD CONSTRAINT "fornecedor_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_fornecedor_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Transportadora +ALTER TABLE "transportadora" + ADD CONSTRAINT "transportadora_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_transportadora_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Veiculo +ALTER TABLE "veiculo" + ADD CONSTRAINT "veiculo_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_veiculo_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Condutor +ALTER TABLE "condutor" + ADD CONSTRAINT "condutor_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_condutor_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Produto +ALTER TABLE "produto" + ADD CONSTRAINT "produto_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "produto_empresa_codigo_unique" UNIQUE ("empresa_id", "codigo_interno"), + ADD CONSTRAINT "fk_produto_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_produto_unidade_comercial" FOREIGN KEY ("unidade_comercial_id") REFERENCES "unidade" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + ADD CONSTRAINT "fk_produto_unidade_tributavel" FOREIGN KEY ("unidade_tributavel_id") REFERENCES "unidade" ("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- Serviço (NFS-e) +ALTER TABLE "servico" + ADD CONSTRAINT "servico_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "servico_empresa_codigo_unique" UNIQUE ("empresa_id", "codigo_interno"), + ADD CONSTRAINT "fk_servico_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Documento Fiscal (NF-e / NFC-e) +ALTER TABLE "documento_fiscal" + ADD CONSTRAINT "documento_fiscal_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "documento_fiscal_chave_unique" UNIQUE ("chave_acesso"), + ADD CONSTRAINT "documento_fiscal_empresa_mod_serie_num_amb_unique" UNIQUE ("empresa_id", "modelo", "serie", "numero", "ambiente_sefaz"), + ADD CONSTRAINT "fk_doc_fiscal_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + ADD CONSTRAINT "fk_doc_fiscal_serie" FOREIGN KEY ("serie_fiscal_id") REFERENCES "serie_fiscal" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_doc_fiscal_cliente" FOREIGN KEY ("cliente_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_doc_fiscal_transportadora" FOREIGN KEY ("transportadora_id") REFERENCES "transportadora" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- Documento Fiscal Item +ALTER TABLE "documento_fiscal_item" + ADD CONSTRAINT "doc_fiscal_item_num_unique" UNIQUE ("documento_fiscal_id", "numero_item"), + ADD CONSTRAINT "fk_doc_fiscal_item_doc" FOREIGN KEY ("documento_fiscal_id") REFERENCES "documento_fiscal" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_doc_fiscal_item_produto" FOREIGN KEY ("produto_id") REFERENCES "produto" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- Documento Fiscal Pagamento +ALTER TABLE "documento_fiscal_pagamento" + ADD CONSTRAINT "fk_doc_fiscal_pagamento_doc" FOREIGN KEY ("documento_fiscal_id") REFERENCES "documento_fiscal" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Documento Fiscal Duplicata +ALTER TABLE "documento_fiscal_duplicata" + ADD CONSTRAINT "fk_doc_fiscal_duplicata_doc" FOREIGN KEY ("documento_fiscal_id") REFERENCES "documento_fiscal" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Documento Fiscal Evento +ALTER TABLE "documento_fiscal_evento" + ADD CONSTRAINT "doc_fiscal_evento_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_doc_fiscal_evento_doc" FOREIGN KEY ("documento_fiscal_id") REFERENCES "documento_fiscal" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- NFS-e +ALTER TABLE "nfse" + ADD CONSTRAINT "nfse_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "nfse_empresa_serie_num_amb_unique" UNIQUE ("empresa_id", "serie_rps", "numero_rps", "ambiente_sefaz"), + ADD CONSTRAINT "fk_nfse_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + ADD CONSTRAINT "fk_nfse_serie" FOREIGN KEY ("serie_fiscal_id") REFERENCES "serie_fiscal" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_nfse_cliente" FOREIGN KEY ("cliente_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_nfse_intermediario" FOREIGN KEY ("intermediario_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- NFS-e Item +ALTER TABLE "nfse_item" + ADD CONSTRAINT "nfse_item_num_unique" UNIQUE ("nfse_id", "numero_item"), + ADD CONSTRAINT "fk_nfse_item_nfse" FOREIGN KEY ("nfse_id") REFERENCES "nfse" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_nfse_item_servico" FOREIGN KEY ("servico_id") REFERENCES "servico" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- NFS-e Evento +ALTER TABLE "nfse_evento" + ADD CONSTRAINT "nfse_evento_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_nfse_evento_nfse" FOREIGN KEY ("nfse_id") REFERENCES "nfse" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- CT-e +ALTER TABLE "cte" + ADD CONSTRAINT "cte_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "cte_chave_unique" UNIQUE ("chave_acesso"), + ADD CONSTRAINT "cte_empresa_serie_num_amb_unique" UNIQUE ("empresa_id", "serie", "numero", "ambiente_sefaz"), + ADD CONSTRAINT "fk_cte_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_serie" FOREIGN KEY ("serie_fiscal_id") REFERENCES "serie_fiscal" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_remetente" FOREIGN KEY ("remetente_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_destinatario" FOREIGN KEY ("destinatario_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_expedidor" FOREIGN KEY ("expedidor_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_recebedor" FOREIGN KEY ("recebedor_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_tomador" FOREIGN KEY ("tomador_id") REFERENCES "cliente" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- CT-e Componentes +ALTER TABLE "cte_componente_valor" + ADD CONSTRAINT "fk_cte_componente_cte" FOREIGN KEY ("cte_id") REFERENCES "cte" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- CT-e Documentos Referenciados +ALTER TABLE "cte_documento_referenciado" + ADD CONSTRAINT "fk_cte_doc_ref_cte" FOREIGN KEY ("cte_id") REFERENCES "cte" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- CT-e Carga +ALTER TABLE "cte_carga" + ADD CONSTRAINT "fk_cte_carga_cte" FOREIGN KEY ("cte_id") REFERENCES "cte" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- CT-e Veículo Rodoviário +ALTER TABLE "cte_veiculo_rodoviario" + ADD CONSTRAINT "fk_cte_veiculo_cte" FOREIGN KEY ("cte_id") REFERENCES "cte" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_veiculo_veiculo" FOREIGN KEY ("veiculo_id") REFERENCES "veiculo" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT "fk_cte_veiculo_condutor" FOREIGN KEY ("condutor_id") REFERENCES "condutor" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- CT-e Eventos +ALTER TABLE "cte_evento" + ADD CONSTRAINT "cte_evento_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_cte_evento_cte" FOREIGN KEY ("cte_id") REFERENCES "cte" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- MDF-e +ALTER TABLE "mdfe" + ADD CONSTRAINT "mdfe_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "mdfe_chave_unique" UNIQUE ("chave_acesso"), + ADD CONSTRAINT "mdfe_empresa_serie_num_amb_unique" UNIQUE ("empresa_id", "serie", "numero", "ambiente_sefaz"), + ADD CONSTRAINT "fk_mdfe_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + ADD CONSTRAINT "fk_mdfe_serie" FOREIGN KEY ("serie_fiscal_id") REFERENCES "serie_fiscal" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- MDF-e Municípios Carregamento +ALTER TABLE "mdfe_municipio_carregamento" + ADD CONSTRAINT "fk_mdfe_mun_carr_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- MDF-e Municípios Descarregamento +ALTER TABLE "mdfe_municipio_descarregamento" + ADD CONSTRAINT "fk_mdfe_mun_desc_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- MDF-e Percurso UFs +ALTER TABLE "mdfe_percurso_uf" + ADD CONSTRAINT "fk_mdfe_percurso_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- MDF-e Veículo Tração +ALTER TABLE "mdfe_veiculo_tracao" + ADD CONSTRAINT "fk_mdfe_veic_tracao_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_mdfe_veic_tracao_veiculo" FOREIGN KEY ("veiculo_id") REFERENCES "veiculo" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- MDF-e Reboques +ALTER TABLE "mdfe_veiculo_reboque" + ADD CONSTRAINT "fk_mdfe_veic_reboque_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_mdfe_veic_reboque_veiculo" FOREIGN KEY ("veiculo_id") REFERENCES "veiculo" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- MDF-e Condutores +ALTER TABLE "mdfe_condutor" + ADD CONSTRAINT "fk_mdfe_condutor_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_mdfe_condutor_condutor" FOREIGN KEY ("condutor_id") REFERENCES "condutor" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- MDF-e Documentos Referenciados +ALTER TABLE "mdfe_documento_referenciado" + ADD CONSTRAINT "fk_mdfe_doc_ref_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- MDF-e Eventos +ALTER TABLE "mdfe_evento" + ADD CONSTRAINT "mdfe_evento_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_mdfe_evento_mdfe" FOREIGN KEY ("mdfe_id") REFERENCES "mdfe" ("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Pagamento Empresa +ALTER TABLE "pagamento_empresa" + ADD CONSTRAINT "pagamento_empresa_uuid_unique" UNIQUE ("uuid"), + ADD CONSTRAINT "fk_pagamento_empresa_empresa" FOREIGN KEY ("empresa_id") REFERENCES "empresa" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT "fk_pagamento_empresa_contador" FOREIGN KEY ("contador_id") REFERENCES "contador" ("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- ============================================================================ +-- 12. ÍNDICES DE PERFORMANCE E BUSCA RÁPIDA +-- ============================================================================ + +CREATE INDEX IF NOT EXISTS "idx_empresa_matriz_id" ON "empresa" ("matriz_id"); +CREATE INDEX IF NOT EXISTS "idx_empresa_cnpj" ON "empresa" ("cnpj"); +CREATE INDEX IF NOT EXISTS "idx_empresa_config_fiscal_empresa" ON "empresa_configuracao_fiscal" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_serie_fiscal_empresa_mod" ON "serie_fiscal" ("empresa_id", "modelo_documento"); +CREATE INDEX IF NOT EXISTS "idx_cliente_empresa_id" ON "cliente" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_cliente_cpf_cnpj" ON "cliente" ("cpf", "cnpj"); +CREATE INDEX IF NOT EXISTS "idx_fornecedor_empresa_id" ON "fornecedor" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_veiculo_empresa_placa" ON "veiculo" ("empresa_id", "placa"); +CREATE INDEX IF NOT EXISTS "idx_condutor_empresa_cpf" ON "condutor" ("empresa_id", "cpf"); +CREATE INDEX IF NOT EXISTS "idx_produto_empresa_id" ON "produto" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_produto_codigo_interno" ON "produto" ("codigo_interno"); +CREATE INDEX IF NOT EXISTS "idx_produto_ncm" ON "produto" ("ncm"); +CREATE INDEX IF NOT EXISTS "idx_produto_c_classif_trib" ON "produto" ("c_classif_trib"); +CREATE INDEX IF NOT EXISTS "idx_produto_ean" ON "produto" ("codigo_barras_ean"); +CREATE INDEX IF NOT EXISTS "idx_servico_empresa_id" ON "servico" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_servico_codigo_interno" ON "servico" ("codigo_interno"); +CREATE INDEX IF NOT EXISTS "idx_servico_item_lc116" ON "servico" ("item_lista_servico"); +CREATE INDEX IF NOT EXISTS "idx_doc_fiscal_empresa_id" ON "documento_fiscal" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_doc_fiscal_status" ON "documento_fiscal" ("status"); +CREATE INDEX IF NOT EXISTS "idx_doc_fiscal_data_emissao" ON "documento_fiscal" ("data_emissao"); +CREATE INDEX IF NOT EXISTS "idx_doc_fiscal_chave_acesso" ON "documento_fiscal" ("chave_acesso"); +CREATE INDEX IF NOT EXISTS "idx_doc_fiscal_item_doc_id" ON "documento_fiscal_item" ("documento_fiscal_id"); +CREATE INDEX IF NOT EXISTS "idx_nfse_empresa_id" ON "nfse" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_nfse_status" ON "nfse" ("status"); +CREATE INDEX IF NOT EXISTS "idx_nfse_numero_nfse" ON "nfse" ("numero_nfse"); +CREATE INDEX IF NOT EXISTS "idx_nfse_chave_acesso" ON "nfse" ("chave_acesso"); +CREATE INDEX IF NOT EXISTS "idx_nfse_id_dps" ON "nfse" ("id_dps"); +CREATE INDEX IF NOT EXISTS "idx_nfse_item_nfse_id" ON "nfse_item" ("nfse_id"); +CREATE INDEX IF NOT EXISTS "idx_cte_empresa_id" ON "cte" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_cte_status" ON "cte" ("status"); +CREATE INDEX IF NOT EXISTS "idx_cte_chave_acesso" ON "cte" ("chave_acesso"); +CREATE INDEX IF NOT EXISTS "idx_mdfe_empresa_id" ON "mdfe" ("empresa_id"); +CREATE INDEX IF NOT EXISTS "idx_mdfe_status" ON "mdfe" ("status"); +CREATE INDEX IF NOT EXISTS "idx_mdfe_chave_acesso" ON "mdfe" ("chave_acesso"); + +-- ============================================================================ +-- 13. DADOS INICIAIS DE APOIO (SEEDS DE UNIDADES E CONFIGURAÇÃO) +-- ============================================================================ + +INSERT INTO "unidade" ("sigla", "descricao") VALUES +('UN', 'UNIDADE'), +('CX', 'CAIXA'), +('KG', 'QUILOGRAMA'), +('KIT', 'KIT'), +('PC', 'PEÇA'), +('PCT', 'PACOTE'), +('LT', 'LITRO'), +('M', 'METRO'), +('M2', 'METRO QUADRADO'), +('M3', 'METRO CÚBICO'), +('PAR', 'PAR'), +('DZ', 'DUZIA'), +('FD', 'FARDO'), +('TON', 'TONELADA'), +('G', 'GRAMA'), +('ML', 'MILILITRO'), +('SERV', 'SERVIÇO'), +('HORA', 'HORA') +ON CONFLICT ("sigla") DO NOTHING; + +INSERT INTO "configuracao" ("id", "nome_app", "mensagem_suporte") VALUES +(1, 'Workbloom ERP', 'Suporte ao emissor fiscal disponível de segunda a sexta.') +ON CONFLICT ("id") DO NOTHING; \ No newline at end of file