-- =====================================================================
-- V33 M8 물류 확장 — F041 지게차·부대장비 신청 / F042 부대물품 렌탈 주문 / F043 선입고 트래킹
-- 멱등: CREATE TABLE IF NOT EXISTS + 시드 ON CONFLICT DO NOTHING.
-- 기존 M8(V15 dock·dock_reservation) 불변 — 본 파일은 V33 단일 버전만 사용, V1~V32 및 타 팀 마이그레이션 변경 금지.
-- 멀티테넌시 표준(소유자 지시 2026-07-12): tenant_id varchar(40) NOT NULL DEFAULT 'KINTEX'
--   + PRIMARY KEY (tenant_id, id) (+ FK 대상은 UNIQUE(id) 보존).
-- 금액은 서버 권위: 장비=단가×수량×일수 / 렌탈=일단가×수량×기간(일). 카탈로그 단가는 마스터가 정본.
-- =====================================================================

-- ── ① 부대장비 품목 마스터(지게차·리프트·크레인·인력 등) — F041 ──────────────
CREATE TABLE IF NOT EXISTS logistics_equipment (
    tenant_id   varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id          varchar(40)  NOT NULL,
    code        varchar(40)  NOT NULL,                     -- 표시/조회용 품목코드
    name        varchar(120) NOT NULL,
    category    varchar(20)  NOT NULL DEFAULT 'forklift',  -- forklift|lift|crane|manpower|tool|other
    unit        varchar(20)  NOT NULL DEFAULT '대/일',      -- 과금 단위 표기
    unit_price  bigint       NOT NULL DEFAULT 0,           -- 단가(원) — 서버 금액 계산 정본
    spec        varchar(200),                              -- 규격/비고(예: 2.5t 지게차)
    active      boolean      NOT NULL DEFAULT true,
    created_at  timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    UNIQUE (tenant_id, code),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_logi_equip_scope ON logistics_equipment (tenant_id, category, active);

-- ── 장비 신청(부스별) — requested→approved/rejected(매니저)→done ──────────────
CREATE TABLE IF NOT EXISTS logistics_equipment_request (
    tenant_id    varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id           varchar(40)  NOT NULL,
    event_id     varchar(40)  NOT NULL REFERENCES event(id) ON DELETE CASCADE,
    equipment_id varchar(40)  NOT NULL,                    -- logistics_equipment.id 소프트 참조(스냅샷 병행)
    equipment_name varchar(120) NOT NULL,                  -- 신청 시점 품목명 스냅샷
    unit_price   bigint       NOT NULL DEFAULT 0,          -- 신청 시점 단가 스냅샷
    booth_no     varchar(40),
    quantity     integer      NOT NULL DEFAULT 1,
    use_date     date,                                     -- 사용 예정일
    days         integer      NOT NULL DEFAULT 1,          -- 사용 일수
    amount       bigint       NOT NULL DEFAULT 0,          -- 서버 계산 = unit_price×quantity×days
    status       varchar(20)  NOT NULL DEFAULT 'requested',-- requested|approved|rejected|done
    note         varchar(300),
    reject_reason varchar(300),
    requested_by varchar(40),
    decided_by   varchar(40),
    decided_at   timestamptz,
    created_at   timestamptz  NOT NULL DEFAULT now(),
    updated_at   timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_logi_equip_req_scope ON logistics_equipment_request (tenant_id, event_id, status);

-- ── ② 부대물품 렌탈 카탈로그 — F042 ─────────────────────────────────────────
CREATE TABLE IF NOT EXISTS logistics_rental_item (
    tenant_id   varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id          varchar(40)  NOT NULL,
    code        varchar(40)  NOT NULL,
    name        varchar(120) NOT NULL,
    category    varchar(20)  NOT NULL DEFAULT 'furniture', -- furniture|electric|display|av|decor|other
    unit        varchar(20)  NOT NULL DEFAULT '개/일',
    daily_price bigint       NOT NULL DEFAULT 0,           -- 1일 렌탈 단가(원)
    spec        varchar(200),
    active      boolean      NOT NULL DEFAULT true,
    created_at  timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    UNIQUE (tenant_id, code),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_logi_rental_item_scope ON logistics_rental_item (tenant_id, category, active);

-- ── 렌탈 주문 — ordered→confirmed/cancelled(매니저)→delivered ──────────────
CREATE TABLE IF NOT EXISTS logistics_rental_order (
    tenant_id   varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id          varchar(40)  NOT NULL,
    event_id    varchar(40)  NOT NULL REFERENCES event(id) ON DELETE CASCADE,
    item_id     varchar(40)  NOT NULL,                     -- logistics_rental_item.id 소프트 참조
    item_name   varchar(120) NOT NULL,                     -- 주문 시점 품목명 스냅샷
    daily_price bigint       NOT NULL DEFAULT 0,           -- 주문 시점 일단가 스냅샷
    booth_no    varchar(40),
    quantity    integer      NOT NULL DEFAULT 1,
    start_date  date,
    end_date    date,
    days        integer      NOT NULL DEFAULT 1,           -- 렌탈 기간(일) — 서버 산출
    amount      bigint       NOT NULL DEFAULT 0,           -- 서버 계산 = daily_price×quantity×days
    status      varchar(20)  NOT NULL DEFAULT 'ordered',   -- ordered|confirmed|cancelled|delivered
    note        varchar(300),
    ordered_by  varchar(40),
    decided_by  varchar(40),
    decided_at  timestamptz,
    created_at  timestamptz  NOT NULL DEFAULT now(),
    updated_at  timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_logi_rental_order_scope ON logistics_rental_order (tenant_id, event_id, status);

-- ── ③ 배송·창고 선입고 트래킹 — F043 ───────────────────────────────────────
-- 상태 전이: registered → inbound_scheduled → arrived_warehouse → delivered_booth
CREATE TABLE IF NOT EXISTS logistics_inbound (
    tenant_id   varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id          varchar(40)  NOT NULL,
    event_id    varchar(40)  NOT NULL REFERENCES event(id) ON DELETE CASCADE,
    tracking_no varchar(60)  NOT NULL,                     -- 운송장 번호
    carrier     varchar(80),                               -- 운송사
    booth_no    varchar(40),
    item_desc   varchar(200),                              -- 화물 내용
    quantity    integer      NOT NULL DEFAULT 1,
    status      varchar(24)  NOT NULL DEFAULT 'registered',-- registered|inbound_scheduled|arrived_warehouse|delivered_booth
    eta_date    date,                                      -- 입고 예정일
    warehouse_at timestamptz,                              -- 창고 도착 시각
    delivered_at timestamptz,                              -- 부스 전달 시각
    note        varchar(300),
    registered_by varchar(40),
    updated_by  varchar(40),
    created_at  timestamptz  NOT NULL DEFAULT now(),
    updated_at  timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (id),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_logi_inbound_scope ON logistics_inbound (tenant_id, event_id, status);
CREATE INDEX IF NOT EXISTS idx_logi_inbound_track ON logistics_inbound (tenant_id, event_id, tracking_no);

-- ── 시드: 부대장비 마스터 ──────────────────────────────────────────────────
INSERT INTO logistics_equipment (id, code, name, category, unit, unit_price, spec) VALUES
  ('leq-fork-25', 'FORK-2.5T', '지게차 2.5t', 'forklift', '대/일',  180000, '2.5t 디젤 지게차(기사 포함)'),
  ('leq-fork-05', 'FORK-5T',   '지게차 5t',   'forklift', '대/일',  260000, '5t 디젤 지게차(기사 포함)'),
  ('leq-lift-01', 'LIFT-1',    '고소작업 리프트', 'lift',   '대/일',  150000, '시저 리프트 최대 10m'),
  ('leq-crane-5', 'CRANE-5T',  '이동식 크레인 5t', 'crane', '대/일',  420000, '카고 크레인 5t'),
  ('leq-manp-01', 'MANPOWER',  '상하차 인력',  'manpower', '인/일',   90000, '숙련 상하차 인력 1인')
ON CONFLICT (id) DO NOTHING;

-- ── 시드: 렌탈 카탈로그 ────────────────────────────────────────────────────
INSERT INTO logistics_rental_item (id, code, name, category, unit, daily_price, spec) VALUES
  ('lri-table-01', 'TBL-STD',  '접이식 테이블', 'furniture', '개/일',  8000,  '1800×600 접이식'),
  ('lri-chair-01', 'CHR-STD',  '상담용 의자',   'furniture', '개/일',  3000,  '패브릭 상담 의자'),
  ('lri-info-01',  'INFO-DESK','인포메이션 데스크', 'furniture', '개/일', 25000, '곡면 안내 데스크'),
  ('lri-tv-55',    'TV-55',    '55인치 모니터', 'av',        '대/일',  60000, '55" UHD 거치형'),
  ('lri-spot-01',  'SPOT-LED', 'LED 스포트 조명', 'electric', '개/일',  5000,  '20W LED 스포트'),
  ('lri-shelf-01', 'SHELF',    '진열 선반',     'display',   '개/일',  12000, '4단 진열 선반')
ON CONFLICT (id) DO NOTHING;
