-- Migration V46: Módulo ERP Financeiro Hospitalar Completo (DRE, Titulos, Livro Razão)
-- Data: 2026-03-31
-- Descrição: Integração avançada estruturada para substituição de Caixa Simples por ERP Contábil e RBAC isolado.

-- 1. Tabela Auxiliar: Centros de Custo (Setores: Ex: Diretoria, UTI, Recepção)
CREATE TABLE IF NOT EXISTS financeiro_centros_custo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clinica_id INT NOT NULL,
    nome VARCHAR(100) NOT NULL,
    ativo TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at TIMESTAMP NULL,
    created_by INT NULL,
    updated_by INT NULL,
    INDEX idx_clinica_ativo (clinica_id, ativo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 2. Tabela Auxiliar: Plano de Contas (Árvore Contábil: 1.0 Receitas, 2.0 Despesas)
CREATE TABLE IF NOT EXISTS financeiro_planos_conta (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clinica_id INT NOT NULL,
    codigo VARCHAR(20) NOT NULL COMMENT 'Ex: 1.0 ou 1.1.2',
    descricao VARCHAR(150) NOT NULL,
    tipo ENUM('receita', 'despesa') NOT NULL,
    ativo TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at TIMESTAMP NULL,
    created_by INT NULL,
    updated_by INT NULL,
    INDEX idx_clinica_tipo (clinica_id, tipo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 3. Tabela Auxiliar: Formas de Pagamento Normalizadas
CREATE TABLE IF NOT EXISTS financeiro_formas_pagamento (
    id INT AUTO_INCREMENT PRIMARY KEY,
    descricao VARCHAR(50) NOT NULL UNIQUE,
    ativo TINYINT(1) DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Inserindo matriz basal de formas de pagamento
INSERT IGNORE INTO financeiro_formas_pagamento (id, descricao) VALUES 
(1, 'Dinheiro (Espécie)'), 
(2, 'PIX'), 
(3, 'Cartão de Crédito'), 
(4, 'Cartão de Débito'), 
(5, 'Boleto Bancário'), 
(6, 'Transferência (TED/DOC)');

-- 4. Tabela: Contas Bancárias / Cofres Físicos
CREATE TABLE IF NOT EXISTS financeiro_contas_bancarias (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clinica_id INT NOT NULL,
    nome_banco VARCHAR(100) NOT NULL,
    agencia VARCHAR(20) NULL,
    conta VARCHAR(30) NULL,
    saldo_inicial DECIMAL(12,2) DEFAULT 0.00,
    ativo TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at TIMESTAMP NULL,
    created_by INT NULL,
    updated_by INT NULL,
    INDEX idx_clinica_banco (clinica_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 5. Tabela Core: Títulos (Contas a Pagar / Contas a Receber Base)
CREATE TABLE IF NOT EXISTS financeiro_titulos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clinica_id INT NOT NULL,
    plano_conta_id INT NOT NULL,
    centro_custo_id INT NULL,
    
    -- Entidade Relacional (Polimórfica)
    pessoa_id INT NULL COMMENT 'ID do Fornecedor, Paciente, Médico ou Convênio',
    tipo_pessoa ENUM('fornecedor', 'paciente', 'medico', 'convenio') NULL,
    
    -- Controle de Parcelamento
    grupo_parcelamento_id VARCHAR(36) NULL COMMENT 'Hash Único para agrupar faturas',
    parcela_numero INT DEFAULT 1,
    parcela_total INT DEFAULT 1,
    
    -- Dados Financeiros
    tipo ENUM('pagar', 'receber') NOT NULL,
    valor_total DECIMAL(12,2) NOT NULL,
    data_emissao DATE NOT NULL,
    data_vencimento DATE NOT NULL,
    data_pagamento DATE NULL COMMENT 'Apenas como flag visual de quitação',
    
    -- Ciclo de Vida da Fatura
    status ENUM('aberto', 'vencido', 'pago', 'parcialmente_pago', 'negociado', 'cancelado') DEFAULT 'aberto',
    observacao TEXT NULL,
    
    -- Auditoria Robusta
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at TIMESTAMP NULL,
    created_by INT NULL,
    updated_by INT NULL,
    
    -- Índices de Alta Performance (Arquitetura para 1M+ Registros)
    INDEX idx_titulos_clinica (clinica_id),
    INDEX idx_titulos_vencimento (data_vencimento),
    INDEX idx_titulos_status (status),
    INDEX idx_titulos_pessoa (tipo_pessoa, pessoa_id),
    
    FOREIGN KEY (plano_conta_id) REFERENCES financeiro_planos_conta(id) ON DELETE RESTRICT,
    FOREIGN KEY (centro_custo_id) REFERENCES financeiro_centros_custo(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 6. Tabela Core: Movimentações (Extrato Genuíno de Caixa e Conciliação)
CREATE TABLE IF NOT EXISTS financeiro_movimentacoes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clinica_id INT NOT NULL,
    titulo_id INT NULL COMMENT 'Se NULL, é movimento avulso',
    conta_bancaria_id INT NOT NULL,
    forma_pagamento_id INT NOT NULL,
    
    data_movimento DATE NOT NULL,
    tipo ENUM('entrada', 'saida') NOT NULL,
    valor DECIMAL(12,2) NOT NULL,
    observacao VARCHAR(255) NULL,
    
    -- Módulo de Conciliação
    conciliado TINYINT(1) DEFAULT 0,
    data_conciliacao TIMESTAMP NULL,
    usuario_conciliador_id INT NULL,
    
    -- Auditoria
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at TIMESTAMP NULL,
    created_by INT NULL,
    updated_by INT NULL,
    
    INDEX idx_mov_clinica_data (clinica_id, data_movimento),
    INDEX idx_mov_conta (conta_bancaria_id),
    
    FOREIGN KEY (titulo_id) REFERENCES financeiro_titulos(id) ON DELETE RESTRICT,
    FOREIGN KEY (conta_bancaria_id) REFERENCES financeiro_contas_bancarias(id) ON DELETE RESTRICT,
    FOREIGN KEY (forma_pagamento_id) REFERENCES financeiro_formas_pagamento(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 7. RBAC (Perfís de Acesso e Permissões do Módulo Financeiro ERP)
INSERT IGNORE INTO permissoes (nome, chave, descricao) VALUES
('Visualizar Financeiro ERP', 'financeiro_view', 'Acesso ao Dashboard e consultas DRE'),
('Lançar Títulos e Movimentações', 'financeiro_lancar', 'Pode dar baixa e gerar contas a pagar/receber'),
('Módulo de Conciliação', 'financeiro_conciliar', 'Permite clicar no botão conciliar comparando com o extrato real'),
('Administrador Financeiro', 'financeiro_admin', 'Status master para retroativos, cancelamentos e estornos financeiros');

-- Associando ao Perfil 1 (Super Admin C-Level / Master da Clinica)
INSERT IGNORE INTO perfil_permissoes (perfil_id, permissao_id)
SELECT 1, id FROM permissoes WHERE chave IN ('financeiro_view', 'financeiro_lancar', 'financeiro_conciliar', 'financeiro_admin');

-- Associando ao Perfil 4 (Faturamento/Tesouraria)
INSERT IGNORE INTO perfil_permissoes (perfil_id, permissao_id)
SELECT 4, id FROM permissoes WHERE chave IN ('financeiro_view', 'financeiro_lancar', 'financeiro_conciliar');
