-- Migration 043 — RES#2 (11/05/2026).
--
-- Cria tabela agente_liberacao_resgate_extra para tickets de liberacao
-- manual da Tef.Net.
--
-- Cada linha = 1 ticket. Quando o parceiro atinge o limite automatico
-- (limite_configurado_no_agente) na competencia, novos resgates so
-- liberam se houver ticket disponivel.
--
-- Workflow:
--   1. Tef.Net cria ticket via UI Bandeja Tef.Net (POST
--      tef_net_liberacao_extra_conceder.php) — status='disponivel'.
--   2. Proximo POST de painel_resgate.php / resgate_anexar.php naquela
--      competencia consome o ticket — UPDATE status='consumido',
--      consumido_lote_id, consumido_em.
--   3. Tef.Net pode revogar antes de consumir — UPDATE status='revogado',
--      revogado_em, revogado_por_user_id.
--
-- Cada ticket vale 1 resgate. Nao "abre comportas" — premissa do dono.
--
-- Trilha AUDIT#1: cada transicao (conceder/consumir/revogar) dispara
-- log_acao() com payload incluindo motivo + agente + competencia.
--
-- Card: RES#2 / PRD-0010.

SET SESSION sql_mode = '';

CREATE TABLE IF NOT EXISTS agente_liberacao_resgate_extra (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  agente_cod_snap INT UNSIGNED NOT NULL
    COMMENT 'cod_Representante do agente (snapshot ao conceder)',
  competencia VARCHAR(7) NOT NULL
    COMMENT 'AAAA-MM',
  liberado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    COMMENT 'momento da concessao',
  liberado_por_user_id INT UNSIGNED NULL
    COMMENT 'user_id Tef.Net que liberou (NULL em CLI/CRON emergencial)',
  motivo TEXT NOT NULL
    COMMENT 'justificativa obrigatoria',
  consumido_lote_id BIGINT UNSIGNED NULL
    COMMENT 'lote_id que consumiu este ticket (preenche no INSERT do lote)',
  consumido_em DATETIME NULL
    COMMENT 'momento do consumo',
  revogado_em DATETIME NULL
    COMMENT 'momento da revogacao (Tef.Net cancelou antes de ser consumido)',
  revogado_por_user_id INT UNSIGNED NULL,
  revogacao_motivo TEXT NULL
    COMMENT 'motivo da revogacao',
  status ENUM('disponivel','consumido','revogado') NOT NULL DEFAULT 'disponivel',
  situacao TINYINT(1) NOT NULL DEFAULT 1
    COMMENT 'soft delete: 1=ativo, 0=apagado',
  PRIMARY KEY (id),
  KEY idx_libextra_agente_comp_status (agente_cod_snap, competencia, status),
  KEY idx_libextra_status (status),
  KEY idx_libextra_consumido_lote (consumido_lote_id),
  KEY idx_libextra_liberado_em (liberado_em)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='RES#2: tickets de liberacao manual Tef.Net pra resgates alem do limite';
