-- Migration V38: TISS Bradesco — Integração em Minha Clínica
-- Data: 2026-03-25
-- Objetivo: Estender master_convenios, master_guias, master_tabela_precos e pacientes
--           para suportar o fluxo TISS 3.05.00 (elegibilidade, autorização, faturamento).

-- ============================================================
-- 1. CONFIGURAÇÃO TISS NO CONVÊNIO
-- ============================================================
ALTER TABLE master_convenios
  ADD COLUMN IF NOT EXISTS url_ws_homolog    VARCHAR(500) NULL COMMENT 'URL webservice homologação Bradesco',
  ADD COLUMN IF NOT EXISTS url_ws_producao   VARCHAR(500) NULL COMMENT 'URL webservice produção Bradesco',
  ADD COLUMN IF NOT EXISTS usuario_ws        VARCHAR(100) NULL COMMENT 'Usuário webservice',
  ADD COLUMN IF NOT EXISTS senha_ws_enc      TEXT         NULL COMMENT 'Senha webservice criptografada (AES-256-CBC)',
  ADD COLUMN IF NOT EXISTS codigo_prestador  VARCHAR(20)  NULL COMMENT 'Código do prestador na operadora',
  ADD COLUMN IF NOT EXISTS versao_tiss       VARCHAR(10)  NULL DEFAULT '3.05.00',
  ADD COLUMN IF NOT EXISTS ambiente_tiss     ENUM('homologacao','producao') NOT NULL DEFAULT 'homologacao',
  ADD COLUMN IF NOT EXISTS tiss_ativo        TINYINT(1)   NOT NULL DEFAULT 0;

-- ============================================================
-- 2. TABELA DE PREÇOS: FLAG DE AUTORIZAÇÃO
-- ============================================================
ALTER TABLE master_tabela_precos
  ADD COLUMN IF NOT EXISTS requer_autorizacao TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Exige autorização prévia da operadora',
  ADD COLUMN IF NOT EXISTS tipo_guia_tiss ENUM('consulta','sadt','internacao') NOT NULL DEFAULT 'consulta';

-- ============================================================
-- 3. CAMPOS TISS NAS GUIAS EXISTENTES
-- ============================================================
ALTER TABLE master_guias
  ADD COLUMN IF NOT EXISTS numero_guia_operadora VARCHAR(30)  NULL COMMENT 'Número retornado pela operadora',
  ADD COLUMN IF NOT EXISTS codigo_autorizacao    VARCHAR(30)  NULL,
  ADD COLUMN IF NOT EXISTS xml_enviado           LONGTEXT     NULL COMMENT 'XML TISS enviado (auditoria)',
  ADD COLUMN IF NOT EXISTS xml_resposta          LONGTEXT     NULL COMMENT 'XML resposta da operadora (auditoria)',
  ADD COLUMN IF NOT EXISTS tiss_status           ENUM('nao_aplicavel','pendente','enviado','em_analise','autorizado','negado')
                                                   NOT NULL DEFAULT 'nao_aplicavel',
  ADD COLUMN IF NOT EXISTS tentativas_polling    TINYINT      NOT NULL DEFAULT 0,
  ADD COLUMN IF NOT EXISTS ultima_consulta_em    DATETIME     NULL,
  ADD COLUMN IF NOT EXISTS seq_transacao         INT          NULL COMMENT 'Sequencial TISS da transação',
  ADD COLUMN IF NOT EXISTS lote_id               INT          NULL COMMENT 'Lote de faturamento';

-- ============================================================
-- 4. CARTEIRINHA DO PACIENTE (PLANO PRINCIPAL)
-- ============================================================
ALTER TABLE pacientes
  ADD COLUMN IF NOT EXISTS convenio_id         INT          NULL COMMENT 'Convênio principal (FK master_convenios)',
  ADD COLUMN IF NOT EXISTS num_carteirinha     VARCHAR(30)  NULL,
  ADD COLUMN IF NOT EXISTS validade_carteirinha DATE        NULL,
  ADD COLUMN IF NOT EXISTS plano_codigo        VARCHAR(20)  NULL,
  ADD COLUMN IF NOT EXISTS plano_descricao     VARCHAR(100) NULL;

-- ============================================================
-- 5. CACHE DE ELEGIBILIDADE (24H)
-- ============================================================
CREATE TABLE IF NOT EXISTS `tiss_elegibilidade_cache` (
  `id`            INT          NOT NULL AUTO_INCREMENT,
  `paciente_id`   INT          NOT NULL,
  `convenio_id`   INT          NOT NULL,
  `consultado_em` DATETIME     NOT NULL,
  `expira_em`     DATETIME     NOT NULL,
  `ativo`         TINYINT(1)   NOT NULL DEFAULT 0,
  `dados_json`    JSON         NULL COMMENT 'Resposta completa da operadora',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_pac_conv` (`paciente_id`, `convenio_id`),
  KEY `idx_expira` (`expira_em`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- 6. LOTES DE FATURAMENTO
-- ============================================================
CREATE TABLE IF NOT EXISTS `tiss_lotes` (
  `id`                INT           NOT NULL AUTO_INCREMENT,
  `convenio_id`       INT           NOT NULL,
  `numero_lote`       VARCHAR(20)   NOT NULL,
  `competencia`       CHAR(7)       NOT NULL COMMENT 'YYYY-MM',
  `status`            ENUM('aberto','enviado','processado','pago','glosado') NOT NULL DEFAULT 'aberto',
  `valor_solicitado`  DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  `valor_pago`        DECIMAL(12,2) NULL,
  `data_envio`        DATETIME      NULL,
  `xml_lote`          LONGTEXT      NULL,
  `xml_retorno`       LONGTEXT      NULL,
  `created_at`        DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`        DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_convenio_lote` (`convenio_id`, `numero_lote`),
  KEY `idx_competencia` (`competencia`),
  KEY `idx_status` (`status`),
  CONSTRAINT `fk_lote_convenio` FOREIGN KEY (`convenio_id`) REFERENCES `master_convenios` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Vínculo guia → lote (após criar tiss_lotes)
ALTER TABLE master_guias
  ADD CONSTRAINT `fk_guia_lote` FOREIGN KEY IF NOT EXISTS (`lote_id`) REFERENCES `tiss_lotes` (`id`);

-- ============================================================
-- 7. PERMISSÕES TISS
-- ============================================================
INSERT INTO `permissoes` (`nome`, `chave`, `descricao`) VALUES
('TISS - Dashboard',           'tiss_dashboard',    'Visualizar painel TISS')
ON DUPLICATE KEY UPDATE nome = nome;

INSERT INTO `permissoes` (`nome`, `chave`, `descricao`) VALUES
('TISS - Configurar Convênio', 'tiss_configurar',   'Configurar credenciais TISS nos convênios')
ON DUPLICATE KEY UPDATE nome = nome;

INSERT INTO `permissoes` (`nome`, `chave`, `descricao`) VALUES
('TISS - Elegibilidade',       'tiss_elegibilidade','Verificar elegibilidade de beneficiários')
ON DUPLICATE KEY UPDATE nome = nome;

INSERT INTO `permissoes` (`nome`, `chave`, `descricao`) VALUES
('TISS - Autorizar',           'tiss_autorizar',    'Solicitar e consultar autorizações')
ON DUPLICATE KEY UPDATE nome = nome;

INSERT INTO `permissoes` (`nome`, `chave`, `descricao`) VALUES
('TISS - Lotes',               'tiss_lotes',        'Criar e enviar lotes de faturamento')
ON DUPLICATE KEY UPDATE nome = nome;

-- ============================================================
-- 8. ATRIBUIR PERMISSÕES AO PERFIL ADMINISTRADOR (ID 1)
-- ============================================================
INSERT IGNORE INTO `perfil_permissoes` (`perfil_id`, `permissao_id`)
SELECT 1, id FROM `permissoes`
WHERE `chave` IN ('tiss_dashboard','tiss_configurar','tiss_elegibilidade','tiss_autorizar','tiss_lotes');
