-- Fluxo fiscal centralizado (NF-e 55 e NFC-e 65).
-- Os ALTER TABLE devem ser executados uma unica vez, na ordem abaixo.
-- A numeracao oficial permanece sob responsabilidade do emissor-api, conforme
-- o contrato atual. Esta base guarda configuracao, vinculo e rastreabilidade.

SET NAMES utf8mb4;

ALTER TABLE empresas
    ADD COLUMN emite_nfe CHAR(1) NOT NULL DEFAULT 'S' AFTER emite_nota,
    ADD COLUMN emite_nfce CHAR(1) NOT NULL DEFAULT 'S' AFTER emite_nfe,
    ADD COLUMN complemento VARCHAR(100) NULL AFTER numero,
    ADD COLUMN codigo_municipio VARCHAR(10) NULL AFTER cidade,
    ADD COLUMN codigo_uf VARCHAR(10) NULL AFTER uf,
    ADD COLUMN cnae VARCHAR(20) NULL AFTER crt,
    ADD COLUMN informacoes_complementares TEXT NULL AFTER cnae,
    ADD COLUMN certificado_status VARCHAR(20) NOT NULL DEFAULT 'NAO_TESTADO' AFTER certificado_nome,
    ADD COLUMN certificado_cnpj VARCHAR(14) NULL AFTER certificado_status,
    ADD COLUMN certificado_valido_de DATETIME NULL AFTER certificado_cnpj,
    ADD COLUMN certificado_valido_ate DATETIME NULL AFTER certificado_valido_de,
    ADD COLUMN certificado_testado_em DATETIME NULL AFTER certificado_valido_ate,
    ADD COLUMN certificado_erro VARCHAR(500) NULL AFTER certificado_testado_em;

ALTER TABLE operacoes
    ADD COLUMN emite_documento_fiscal CHAR(1) NOT NULL DEFAULT 'N' AFTER observacao_padrao,
    ADD COLUMN modelo_fiscal VARCHAR(10) NOT NULL DEFAULT 'NENHUM' AFTER emite_documento_fiscal,
    ADD COLUMN emitir_automaticamente CHAR(1) NOT NULL DEFAULT 'N' AFTER modelo_fiscal,
    ADD COLUMN ambiente_fiscal VARCHAR(10) NOT NULL DEFAULT 'EMPRESA' AFTER emitir_automaticamente,
    ADD COLUMN finalidade_nfe TINYINT UNSIGNED NOT NULL DEFAULT 1 AFTER ambiente_fiscal,
    ADD COLUMN indicador_presenca TINYINT UNSIGNED NOT NULL DEFAULT 1 AFTER finalidade_nfe,
    ADD COLUMN consumidor_final CHAR(1) NOT NULL DEFAULT 'S' AFTER indicador_presenca,
    ADD COLUMN exige_destinatario CHAR(1) NOT NULL DEFAULT 'N' AFTER consumidor_final,
    ADD COLUMN permite_destinatario_anonimo CHAR(1) NOT NULL DEFAULT 'S' AFTER exige_destinatario,
    ADD COLUMN cfop_interestadual VARCHAR(10) NULL AFTER cfop_estadual,
    ADD COLUMN cfop_exterior VARCHAR(10) NULL AFTER cfop_interestadual;

ALTER TABLE produtos
    ADD COLUMN cest VARCHAR(10) NULL AFTER ncm,
    ADD COLUMN unidade_tributavel VARCHAR(6) NULL AFTER unidade,
    ADD COLUMN ean_tributavel VARCHAR(20) NULL AFTER ean,
    ADD COLUMN quantidade_tributavel_fator DECIMAL(18,6) NOT NULL DEFAULT 1.000000 AFTER ean_tributavel,
    ADD COLUMN cst_icms VARCHAR(4) NULL AFTER origem,
    ADD COLUMN csosn VARCHAR(4) NULL AFTER cst_icms,
    ADD COLUMN cst_ipi VARCHAR(4) NULL AFTER csosn,
    ADD COLUMN cst_pis VARCHAR(4) NULL AFTER cst_ipi,
    ADD COLUMN cst_cofins VARCHAR(4) NULL AFTER cst_pis,
    ADD COLUMN icms_combustivel LONGTEXT NULL AFTER valor_partida;

ALTER TABLE clientes
    ADD COLUMN codigo_municipio VARCHAR(10) NULL AFTER cidade,
    ADD COLUMN codigo_pais VARCHAR(10) NOT NULL DEFAULT '1058' AFTER estado,
    ADD COLUMN nome_pais VARCHAR(60) NOT NULL DEFAULT 'BRASIL' AFTER codigo_pais,
    ADD COLUMN indicador_ie TINYINT UNSIGNED NOT NULL DEFAULT 9 AFTER tipo_icms;

ALTER TABLE fornecedores
    ADD COLUMN tipo_pessoa CHAR(2) NOT NULL DEFAULT 'PJ' AFTER id_conta,
    ADD COLUMN razao_social VARCHAR(255) NULL AFTER nome,
    ADD COLUMN inscricao_estadual VARCHAR(30) NULL AFTER documento,
    ADD COLUMN indicador_ie TINYINT UNSIGNED NOT NULL DEFAULT 9 AFTER inscricao_estadual,
    ADD COLUMN email VARCHAR(120) NULL AFTER indicador_ie,
    ADD COLUMN telefone VARCHAR(30) NULL AFTER email,
    ADD COLUMN cep VARCHAR(10) NULL AFTER telefone,
    ADD COLUMN logradouro VARCHAR(120) NULL AFTER cep,
    ADD COLUMN numero VARCHAR(20) NULL AFTER logradouro,
    ADD COLUMN complemento VARCHAR(100) NULL AFTER numero,
    ADD COLUMN bairro VARCHAR(80) NULL AFTER complemento,
    ADD COLUMN cidade VARCHAR(80) NULL AFTER bairro,
    ADD COLUMN codigo_municipio VARCHAR(10) NULL AFTER cidade,
    ADD COLUMN uf CHAR(2) NULL AFTER codigo_municipio;

CREATE TABLE fiscal_documentos (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    id_conta INT NOT NULL,
    id_empresa INT NOT NULL,
    id_operacao INT NOT NULL,
    origem_tipo VARCHAR(20) NOT NULL,
    origem_id BIGINT UNSIGNED NOT NULL,
    modelo TINYINT UNSIGNED NOT NULL,
    ambiente TINYINT UNSIGNED NOT NULL,
    serie VARCHAR(10) NULL,
    numero VARCHAR(20) NULL,
    idempotency_key VARCHAR(191) NOT NULL,
    payload_hash CHAR(64) NOT NULL,
    status VARCHAR(30) NOT NULL DEFAULT 'PENDENTE',
    etapa VARCHAR(50) NULL,
    chave VARCHAR(44) NULL,
    protocolo VARCHAR(100) NULL,
    codigo_status VARCHAR(20) NULL,
    mensagem_status VARCHAR(1000) NULL,
    avisos LONGTEXT NULL,
    link_documento TEXT NULL,
    xml LONGTEXT NULL,
    pdf_base64 LONGTEXT NULL,
    requisicao LONGTEXT NULL,
    resposta LONGTEXT NULL,
    tentativas INT UNSIGNED NOT NULL DEFAULT 0,
    solicitado_por INT NULL,
    solicitado_em DATETIME NULL,
    autorizado_em DATETIME NULL,
    cancelado_em DATETIME NULL,
    dthr_registro TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    dthr_atualizacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_fiscal_idempotencia (id_conta, idempotency_key),
    UNIQUE KEY uq_fiscal_origem_modelo (id_conta, origem_tipo, origem_id, modelo),
    UNIQUE KEY uq_fiscal_chave (chave),
    KEY idx_fiscal_lista (id_conta, status, modelo, dthr_registro),
    KEY idx_fiscal_empresa (id_empresa, ambiente),
    CONSTRAINT fk_fiscal_empresa FOREIGN KEY (id_empresa) REFERENCES empresas (id),
    CONSTRAINT fk_fiscal_operacao FOREIGN KEY (id_operacao) REFERENCES operacoes (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE fiscal_documentos_historico (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    id_documento BIGINT UNSIGNED NOT NULL,
    status_anterior VARCHAR(30) NULL,
    status_novo VARCHAR(30) NOT NULL,
    etapa VARCHAR(50) NULL,
    codigo_status VARCHAR(20) NULL,
    mensagem VARCHAR(1000) NULL,
    detalhes LONGTEXT NULL,
    id_usuario INT NULL,
    dthr_registro TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_fiscal_historico (id_documento, dthr_registro),
    CONSTRAINT fk_fiscal_historico_documento FOREIGN KEY (id_documento)
        REFERENCES fiscal_documentos (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE fiscal_eventos (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    id_documento BIGINT UNSIGNED NOT NULL,
    tipo VARCHAR(30) NOT NULL,
    status VARCHAR(30) NOT NULL DEFAULT 'PENDENTE',
    protocolo VARCHAR(100) NULL,
    codigo_status VARCHAR(20) NULL,
    justificativa VARCHAR(1000) NULL,
    xml LONGTEXT NULL,
    requisicao LONGTEXT NULL,
    resposta LONGTEXT NULL,
    solicitado_por INT NULL,
    solicitado_em DATETIME NULL,
    concluido_em DATETIME NULL,
    dthr_registro TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_fiscal_eventos (id_documento, tipo, dthr_registro),
    CONSTRAINT fk_fiscal_evento_documento FOREIGN KEY (id_documento)
        REFERENCES fiscal_documentos (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE fiscal_auditoria (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    id_conta INT NOT NULL,
    id_usuario INT NULL,
    entidade VARCHAR(40) NOT NULL,
    entidade_id BIGINT UNSIGNED NULL,
    acao VARCHAR(50) NOT NULL,
    detalhes LONGTEXT NULL,
    endereco_ip VARCHAR(45) NULL,
    dthr_registro TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_fiscal_auditoria (id_conta, entidade, entidade_id, dthr_registro)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
