-- ============================================================
-- Migration 022 — 4ª coluna no snapshot do pedido (agente_tabela_cod_snap)
-- ============================================================
--
-- AG#9 / PRD-0006-EXT / ADR-0008
--
-- Adiciona coluna `agente_tabela_cod_snap` em tbl_Pedido + tbl_Faturamento +
-- tbl_HistPedido para carimbar QUAL agente tem a tabela_preco vigente no momento
-- do INSERT do pedido. Necessário para Camada 2: quando há override de
-- tabela_preco em tbl_Representante (revenda aponta tabela de outro agente),
-- a referência precisa ir junto com o snapshot do pedido (D-03 imutabilidade).
--
-- Semântica:
--   agente_cod_snap        = quem RECEBE a comissão (= agente vinculado)
--   agente_tabela_cod_snap = de QUAL agente vamos LER agente_tabela_preco (default
--                            = igual a agente_cod_snap; quando override = aponta
--                            pra outro agente)
--
-- Pedidos pré-Camada 2 ficam com NULL e a apuração faz fallback `?? agente_cod_snap`.
--
-- Recria os triggers `trg_agente_snapshot_faturamento_bi` e
-- `trg_agente_snapshot_histpedido_bi` para também propagar a 4ª coluna.
-- Single-statement SET ... IFNULL(...) compatível com runner PDO (sem DELIMITER).
-- ============================================================

SET SESSION sql_mode = '';

-- ============ ALTERS aditivos (3 tabelas) ============

ALTER TABLE tbl_Pedido
  ADD COLUMN agente_tabela_cod_snap INT NULL DEFAULT NULL
    COMMENT 'Camada 2 / AG#9: snapshot de QUAL agente tem a agente_tabela_preco vigente neste pedido. Default eh igual a agente_cod_snap; quando ha override de tabela_preco na revenda, aponta para o agente da tabela escolhida. NULL em pedidos pre-Camada 2 (apuracao faz fallback).',
  ADD INDEX idx_pedido_agente_tab_snap (agente_tabela_cod_snap);

ALTER TABLE tbl_Faturamento
  ADD COLUMN agente_tabela_cod_snap INT NULL DEFAULT NULL
    COMMENT 'Camada 2 / AG#9: propagado de tbl_Pedido.agente_tabela_cod_snap via trigger trg_agente_snapshot_faturamento_bi.',
  ADD INDEX idx_fat_agente_tab_snap (agente_tabela_cod_snap);

ALTER TABLE tbl_HistPedido
  ADD COLUMN agente_tabela_cod_snap INT NULL DEFAULT NULL
    COMMENT 'Camada 2 / AG#9: propagado de tbl_Pedido.agente_tabela_cod_snap via trigger trg_agente_snapshot_histpedido_bi.';

-- ============ Recriacao dos triggers de snapshot ============
-- DROP IF EXISTS antes do CREATE para idempotencia. NAO toca triggers de protecao
-- (trg_agente_proteger_faturamento_bu, trg_agente_proteger_faturamento_bd) que sao
-- separados e cobrem AP#10.1.

DROP TRIGGER IF EXISTS trg_agente_snapshot_faturamento_bi;

CREATE TRIGGER trg_agente_snapshot_faturamento_bi
BEFORE INSERT ON tbl_Faturamento
FOR EACH ROW
SET NEW.agente_cod_snap = IFNULL(NEW.agente_cod_snap, (SELECT p.agente_cod_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.pedido_id LIMIT 1)),
    NEW.agente_pct_snap = IFNULL(NEW.agente_pct_snap, (SELECT p.agente_pct_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.pedido_id LIMIT 1)),
    NEW.agente_modalidade_snap = IFNULL(NEW.agente_modalidade_snap, (SELECT p.agente_modalidade_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.pedido_id LIMIT 1)),
    NEW.agente_tabela_cod_snap = IFNULL(NEW.agente_tabela_cod_snap, (SELECT p.agente_tabela_cod_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.pedido_id LIMIT 1));

DROP TRIGGER IF EXISTS trg_agente_snapshot_histpedido_bi;

CREATE TRIGGER trg_agente_snapshot_histpedido_bi
BEFORE INSERT ON tbl_HistPedido
FOR EACH ROW
SET NEW.agente_cod_snap = IFNULL(NEW.agente_cod_snap, (SELECT p.agente_cod_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.cod_Pedido LIMIT 1)),
    NEW.agente_pct_snap = IFNULL(NEW.agente_pct_snap, (SELECT p.agente_pct_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.cod_Pedido LIMIT 1)),
    NEW.agente_modalidade_snap = IFNULL(NEW.agente_modalidade_snap, (SELECT p.agente_modalidade_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.cod_Pedido LIMIT 1)),
    NEW.agente_tabela_cod_snap = IFNULL(NEW.agente_tabela_cod_snap, (SELECT p.agente_tabela_cod_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.cod_Pedido LIMIT 1));
