talk / backend /sql /050_gift_dispatch.sql
user
Deploy StyleVoiceChat backend
aa9892b
Raw History Blame Contribute Delete
3.21 kB
-- 카페 μŒμ„± 선물쿠폰 β€” 단체 λ°œμ†‘ + λ°›λŠ”μ΄ 식별 (2026-05-28, P1a 전솑 2경둜)
--
-- μš”μ²­μ„œ: doc/runbook/req_cafe_gift_mvp.md Β§5
-- 섀계: doc/runbook/cafe_gift_p1a.md (Phase B-2 / 전솑 2경둜)
--
-- λ³€κ²½:
-- 1) gift_orders 에 order_kind/company_name/company_contact μΆ”κ°€ (단체 λΆ„κΈ°)
-- 2) gift_coupons 의 order_id UNIQUE 제거 (corporate=1 order β†’ N coupons)
-- 3) gift_coupons 에 recipient_phone_e164/recipient_name μΆ”κ°€ (λ°›λŠ”μ΄ unique 링크 νŠΈλž˜ν‚Ή)
--
-- β›” νšŒκ·€ κ°€λ“œ (sql/043 데이터 손싀 사고 κ΅ν›ˆ):
-- - λͺ¨λ“  μ‹ κ·œ 컬럼 nullable + default β€” κΈ°μ‘΄ 데이터 μœ„λ°˜ 0
-- - CHECK λŠ” μ‹ κ·œ μ»¬λŸΌμ—λ§Œ (κΈ°μ‘΄ CHECK λ¬΄μˆ˜μ •)
-- - order_id UNIQUE μ œκ±°λŠ” idempotent (DROP CONSTRAINT IF EXISTS)
-- - order_kind λ―Έμ§€μ • 행은 'personal' 둜 해석 β€” κΈ°μ‘΄ mock_paid 흐름 νšŒκ·€ 0
-- - μ•Œλ¦Όν†‘ 호좜 μ½”λ“œ 0건 (μš”μ²­μ„œ Β§5-3 λ°•μ œ)
-- ───────── gift_orders ν™•μž₯ ─────────
ALTER TABLE public.gift_orders
ADD COLUMN IF NOT EXISTS order_kind TEXT NOT NULL DEFAULT 'personal'
CHECK (order_kind IN ('personal','corporate')),
ADD COLUMN IF NOT EXISTS company_name TEXT,
ADD COLUMN IF NOT EXISTS company_contact TEXT;
CREATE INDEX IF NOT EXISTS idx_gift_orders_kind
ON public.gift_orders (order_kind, status, created_at DESC);
COMMENT ON COLUMN public.gift_orders.order_kind IS
'personal: 1 order β†’ 1 coupon, Kakao Share. corporate: 1 order β†’ N coupons, SMS 일괄.';
COMMENT ON COLUMN public.gift_orders.company_name IS
'corporate μ „μš© β€” νšŒμ‚¬λͺ…. SMS λ³Έλ¬Έ [νšŒμ‚¬λͺ…] 머리에 μ‚¬μš©.';
COMMENT ON COLUMN public.gift_orders.company_contact IS
'corporate μ „μš© β€” λ‹΄λ‹Ήμž 이름/μ—°λ½μ²˜(자유 ν…μŠ€νŠΈ). ν™˜λΆˆΒ·λ¬Έμ˜ μ‘λŒ€μš©.';
-- ───────── gift_coupons ν™•μž₯ (1 order β†’ N coupons) ─────────
-- order_id UNIQUE 제거 (corporate λΆ„κΈ° μœ„ν•΄). sql/049 μ—μ„œ 인라인 UNIQUE β†’ μ œμ•½ 이름 = gift_coupons_order_id_key
ALTER TABLE public.gift_coupons
DROP CONSTRAINT IF EXISTS gift_coupons_order_id_key;
-- λ°›λŠ”μ΄ 식별 (corporate λ°œμ†‘ μ‹œ μ±„μ›Œμ§). personal 흐름은 NULL = gift_orders.recipient_name μ‚¬μš©.
ALTER TABLE public.gift_coupons
ADD COLUMN IF NOT EXISTS recipient_phone_e164 TEXT,
ADD COLUMN IF NOT EXISTS recipient_name TEXT,
ADD COLUMN IF NOT EXISTS dispatched_at TIMESTAMPTZ, -- SMS λ°œμ†‘ μ‹œκ°
ADD COLUMN IF NOT EXISTS dispatch_status TEXT NOT NULL DEFAULT 'pending'
CHECK (dispatch_status IN ('pending','sent','failed','skipped')),
ADD COLUMN IF NOT EXISTS dispatch_error TEXT;
-- order 별 + λ°›λŠ”μ΄λ³„ 쑰회 (λŒ€μ‹œλ³΄λ“œ)
CREATE INDEX IF NOT EXISTS idx_gift_coupons_order_dispatch
ON public.gift_coupons (order_id, dispatch_status);
COMMENT ON COLUMN public.gift_coupons.recipient_phone_e164 IS
'corporate λ°œμ†‘ λ°›λŠ”μ΄ 번호. personal=NULL (gift_orders.recipient_name μ‚¬μš©).';
COMMENT ON COLUMN public.gift_coupons.dispatch_status IS
'pending: λ°œκΈ‰λ§Œ / sent: SMS λ°œμ†‘ OK / failed: λ°œμ†‘ μ‹€νŒ¨(번호 무효 λ“±) / skipped: λ°œμ†‘ μ•ˆ 함(personal 흐름).';