-- Template: create_tenant_tables
-- __CODIGO_TENANT__: sufixo fisico SIAFI + ambiente + perfil.
-- Exemplo: 7107_producao_municipio cria as tres tabelas isoladas do tenant.

CREATE TABLE IF NOT EXISTS nfse_documentos___CODIGO_TENANT__ (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  ambiente ENUM('producao_restrita', 'producao') NOT NULL DEFAULT 'producao_restrita',
  nsu BIGINT UNSIGNED NOT NULL,
  chave_acesso VARCHAR(60) NULL,
  tipo_documento VARCHAR(50) NOT NULL,
  numero_nfse VARCHAR(40) NULL,
  numero_dfse VARCHAR(40) NULL,
  serie_dps VARCHAR(20) NULL,
  numero_dps VARCHAR(40) NULL,
  municipio_emissor_codigo CHAR(7) NULL,
  municipio_incidencia_codigo CHAR(7) NULL,
  municipio_prestacao_codigo CHAR(7) NULL,
  prestador_documento VARCHAR(14) NULL,
  prestador_nome VARCHAR(255) NULL,
  tomador_documento VARCHAR(14) NULL,
  tomador_nome VARCHAR(255) NULL,
  intermediario_documento VARCHAR(14) NULL,
  intermediario_nome VARCHAR(255) NULL,
  data_emissao DATETIME NULL,
  data_competencia DATE NULL,
  data_processamento DATETIME NULL,
  status_documento VARCHAR(50) NULL,
  codigo_tributacao_nacional VARCHAR(20) NULL,
  descricao_tributacao_nacional VARCHAR(500) NULL,
  descricao_servico VARCHAR(1000) NULL,
  codigo_nbs VARCHAR(20) NULL,
  descricao_nbs VARCHAR(500) NULL,
  valor_servico DECIMAL(15,2) NULL,
  valor_base_calculo DECIMAL(15,2) NULL,
  aliquota DECIMAL(7,4) NULL,
  valor_issqn DECIMAL(15,2) NULL,
  valor_total_retido DECIMAL(15,2) NULL,
  valor_liquido DECIMAL(15,2) NULL,
  xml_bruto LONGTEXT NOT NULL,
  dados_principais LONGTEXT NULL,
  recebido_at DATETIME NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uk_ambiente_nsu (ambiente, nsu),
  UNIQUE KEY uk_chave_acesso (chave_acesso),
  KEY idx_data_emissao (data_emissao),
  KEY idx_competencia (data_competencia),
  KEY idx_prestador (prestador_documento),
  KEY idx_tomador (tomador_documento),
  KEY idx_municipio_emissor (municipio_emissor_codigo),
  KEY idx_numero_nfse (numero_nfse),
  KEY idx_status_data (status_documento, data_emissao),
  KEY idx_prestador_data (prestador_documento, data_emissao),
  KEY idx_tomador_data (tomador_documento, data_emissao),
  KEY idx_competencia_numero (data_competencia, numero_nfse),
  KEY idx_servico_data (codigo_tributacao_nacional, data_emissao)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS nfse_eventos___CODIGO_TENANT__ (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_id BIGINT UNSIGNED NULL,
  ambiente ENUM('producao_restrita', 'producao') NOT NULL DEFAULT 'producao_restrita',
  nsu BIGINT UNSIGNED NULL,
  chave_acesso_nfse VARCHAR(60) NOT NULL,
  tipo_evento VARCHAR(80) NOT NULL,
  numero_sequencial INT UNSIGNED NOT NULL DEFAULT 1,
  data_evento DATETIME NULL,
  xml_bruto LONGTEXT NOT NULL,
  dados_principais LONGTEXT NULL,
  recebido_at DATETIME NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uk_chave_tipo_seq (chave_acesso_nfse, tipo_evento, numero_sequencial),
  KEY idx_documento (documento_id),
  KEY idx_ambiente_nsu (ambiente, nsu),
  KEY idx_data_evento (data_evento),
  CONSTRAINT fk_evt_doc___CODIGO_TENANT__
    FOREIGN KEY (documento_id) REFERENCES nfse_documentos___CODIGO_TENANT__ (id)
    ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS nfse_documento_partes___CODIGO_TENANT__ (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_id BIGINT UNSIGNED NOT NULL,
  papel ENUM('prestador', 'tomador', 'intermediario') NOT NULL,
  documento_federal VARCHAR(14) NOT NULL,
  nome_razao VARCHAR(255) NULL,
  municipio_codigo CHAR(7) NULL,
  uf CHAR(2) NULL,
  dados_principais LONGTEXT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uk_documento_papel (documento_id, papel),
  KEY idx_documento_federal (documento_federal),
  KEY idx_municipio (municipio_codigo),
  KEY idx_papel_documento (papel, documento_federal),
  CONSTRAINT fk_part_doc___CODIGO_TENANT__
    FOREIGN KEY (documento_id) REFERENCES nfse_documentos___CODIGO_TENANT__ (id)
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO nfse_tenant_table_versions (codigo_siafi, ambiente, perfil, table_version)
VALUES ('__CODIGO_SIAFI__', '__AMBIENTE__', '__PERFIL__', '003')
ON DUPLICATE KEY UPDATE applied_at = VALUES(applied_at);
