-- ============================================================================
-- V95 — F-B2 취소·환불 규정 정교화: 다구간 취소수수료 + 예매수수료 별도 규정
-- 담당: kintex-visitor(VIS)·backend · 작성: 2026-07-23
-- ----------------------------------------------------------------------------
-- 목적: 현행 3구간(D-7 100% / D-3 50% / 당일 0%) → 다구간 취소수수료 규정을 서버 권위로 산정.
--   ① 티켓 금액(환불 대상)에는 구간별 환불율 적용.
--   ② 예매수수료(booking fee)는 별도 규정 — 취소 시점에 따라 환불/비환불 분리.
--   ③ 취소 관리수수료(cancel admin fee)는 환불액에서 공제.
-- 원칙: 코드가 아닌 데이터로 버전 관리(규정 개정 대응). 기본 정책(event_id NULL) + 행사별 오버라이드 여지.
--   tenant_id='KINTEX' 고정. 전부 멱등.
-- ============================================================================

-- ── 1) 취소 환불 구간(다구간) ────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS ticket_cancel_bracket (
    tenant_id            varchar(32)  NOT NULL DEFAULT 'KINTEX',
    id                   varchar(64)  NOT NULL,
    event_id             varchar(64),                         -- NULL=기본 정책(전 행사 적용)
    min_days_before      integer      NOT NULL,               -- 개막 D-일 이상 남으면 이 구간
    refund_rate_percent  numeric(5,1) NOT NULL DEFAULT 0,     -- 티켓액 환불율(%)
    label                varchar(80)  NOT NULL,
    sort_order           integer      NOT NULL DEFAULT 0,
    CONSTRAINT pk_ticket_cancel_bracket PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS ix_ticket_cancel_bracket_ev ON ticket_cancel_bracket (tenant_id, event_id, min_days_before);

-- ── 2) 수수료 정책(예매수수료 · 취소 관리수수료) ─────────────────────────────
CREATE TABLE IF NOT EXISTS ticket_fee_policy (
    tenant_id                   varchar(32)  NOT NULL DEFAULT 'KINTEX',
    event_id                    varchar(64)  NOT NULL DEFAULT '__default__',  -- '__default__'=기본
    booking_fee_per_ticket      numeric(10,0) NOT NULL DEFAULT 0,   -- 매당 예매수수료(원)
    booking_fee_refund_min_days integer      NOT NULL DEFAULT 7,    -- 이 D-일 이상 취소 시에만 예매수수료 환불
    cancel_admin_fee_percent    numeric(5,1) NOT NULL DEFAULT 0,    -- 환불액에서 공제하는 취소 관리수수료(%)
    version                     varchar(32)  NOT NULL DEFAULT 'cancel-v1.0',
    CONSTRAINT pk_ticket_fee_policy PRIMARY KEY (tenant_id, event_id)
);

-- ── 3) 취소 이력(감사·환불 산정 스냅샷) ──────────────────────────────────────
CREATE TABLE IF NOT EXISTS ticket_cancellation (
    tenant_id        varchar(32)  NOT NULL DEFAULT 'KINTEX',
    id               varchar(64)  NOT NULL,
    order_id         varchar(64)  NOT NULL,
    order_no         varchar(40)  NOT NULL,
    days_before      integer,
    ticket_amount    numeric(12,0) NOT NULL DEFAULT 0,   -- 환불 대상 티켓액(예매수수료 제외)
    booking_fee      numeric(12,0) NOT NULL DEFAULT 0,
    refund_rate      numeric(5,1) NOT NULL DEFAULT 0,
    admin_fee        numeric(12,0) NOT NULL DEFAULT 0,
    refund_amount    numeric(12,0) NOT NULL DEFAULT 0,   -- 최종 환불액
    forfeit_amount   numeric(12,0) NOT NULL DEFAULT 0,   -- 공제(위약)액
    policy_version   varchar(32),
    cancelled_at     timestamptz  NOT NULL DEFAULT now(),
    CONSTRAINT pk_ticket_cancellation PRIMARY KEY (tenant_id, id),
    CONSTRAINT uq_ticket_cancellation_order UNIQUE (order_id)
);

-- ============================================================================
-- 시드 — 기본 다구간 정책(멱등). D-일 큰 구간일수록 환불율 높음.
-- ============================================================================
INSERT INTO ticket_cancel_bracket (tenant_id, id, event_id, min_days_before, refund_rate_percent, label, sort_order) VALUES
  ('KINTEX','tcb-d10','__NULL__', 10, 100.0, '개막 10일 전까지 · 전액 환불', 0),
  ('KINTEX','tcb-d7', '__NULL__',  7,  90.0, '개막 7일 전까지 · 90% 환불',  1),
  ('KINTEX','tcb-d3', '__NULL__',  3,  70.0, '개막 3일 전까지 · 70% 환불',  2),
  ('KINTEX','tcb-d1', '__NULL__',  1,  50.0, '개막 1일 전까지 · 50% 환불',  3),
  ('KINTEX','tcb-d0', '__NULL__',  0,   0.0, '개막 당일·이후 · 환불 불가',  4)
ON CONFLICT (tenant_id, id) DO NOTHING;
-- event_id 는 기본 정책이므로 NULL 로 정정(문자 '__NULL__' 회피).
UPDATE ticket_cancel_bracket SET event_id = NULL WHERE event_id = '__NULL__';

INSERT INTO ticket_fee_policy
    (tenant_id, event_id, booking_fee_per_ticket, booking_fee_refund_min_days, cancel_admin_fee_percent, version) VALUES
  ('KINTEX','__default__', 1000, 7, 5.0, 'cancel-v1.0')
ON CONFLICT (tenant_id, event_id) DO NOTHING;
