-- 기존 DB ALTER 누적 파일. 새 컬럼/변경은 이 파일에 계속 append 한다. -- 전부 IF NOT EXISTS 라 몇 번을 재실행해도 안전(돌리면 최신 상태로 맞춰짐). -- 신규/리셋 DB 는 01-schema*.sql 에 이미 반영돼 있어 이 파일이 필요 없다. -- ─────────────────────────────────────────────────────────── -- [2026-06-26] 견적 개편: 가격(매입/판매)·수수료율·앵커링가 + 견적/카드/협력사 분류 컬럼 -- ─────────────────────────────────────────────────────────── -- 상품: 인터넷최저가 실값 + 매입가 + 판매가 ALTER TABLE partner.items ADD COLUMN IF NOT EXISTS internet_lowest_price BIGINT, ADD COLUMN IF NOT EXISTS purchase_price BIGINT, ADD COLUMN IF NOT EXISTS selling_price BIGINT; -- 세션: 앵커링가 ALTER TABLE negotiation.sessions ADD COLUMN IF NOT EXISTS anchoring_price BIGINT; -- 견적: MD 제시가 + 협력사(공급채널) 유형 ALTER TABLE quotation.quotations ADD COLUMN IF NOT EXISTS md_price BIGINT, ADD COLUMN IF NOT EXISTS supplier_type SMALLINT; -- 카드: 사용 범위 구분(CardUsageType): 1=공통 2=신규견적전용 3=재견적전용 ALTER TABLE card.nego_cards ADD COLUMN IF NOT EXISTS usage_type SMALLINT NOT NULL DEFAULT 1; ALTER TABLE card.wild_cards ADD COLUMN IF NOT EXISTS usage_type SMALLINT NOT NULL DEFAULT 1; -- ─────────────────────────────────────────────────────────── -- [2026-06-29] 협상 초청 메일: 세션별 발송 시각(수동 발송 버튼이 채움) -- ─────────────────────────────────────────────────────────── ALTER TABLE negotiation.sessions ADD COLUMN IF NOT EXISTS email_sent_at TIMESTAMPTZ; -- ─────────────────────────────────────────────────────────── -- [2026-06-30] 알림(인박스): 협상 이벤트를 견적 작성자에게 통지 -- ─────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS company.notifications ( notification_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), user_id uuid NOT NULL, -- 수신자(company.users.user_id) = 견적 작성자 type SMALLINT NOT NULL, -- 알림 유형(NotificationType): 1=success(낙찰), 2=regenerated(재생성), 3=failure(결렬) ref_qt_id uuid NULL, -- 관련 견적(quotation.quotations.qt_id) ref_session_id uuid NULL, -- 관련 세션(negotiation.sessions.session_id) data JSONB NULL, -- 렌더 스냅샷(유형별) read_at TIMESTAMPTZ NULL, -- 읽은 시각(NULL=안읽음) created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), deleted BOOLEAN NOT NULL DEFAULT FALSE ); CREATE INDEX IF NOT EXISTS idx_notifications_user_id ON company.notifications (user_id); CREATE INDEX IF NOT EXISTS idx_notifications_user_unread ON company.notifications (user_id, created_at) WHERE deleted = FALSE AND read_at IS NULL; CREATE INDEX IF NOT EXISTS idx_notifications_ref_qt_id ON company.notifications (ref_qt_id); -- ───────────────────────────────────────────────────────────── -- [2026-07-02] 앵커링 v1.2 — sessions 판정·마킹 컬럼 3종 -- (신규 DB 는 01-schema*.sql 에 반영됨. anchoring 스키마 자체(adjustments·뷰)는 -- 모듈 소유 DDL schedules/anchoring/schema.sql 로 적용 — 여기엔 두지 않는다.) ALTER TABLE negotiation.sessions ADD COLUMN IF NOT EXISTS anchoring_value SMALLINT NULL, -- 제안 당시 앵커링 값(천분율‰) 박제 ADD COLUMN IF NOT EXISTS last_offer_price BIGINT NULL, -- 협력사 마지막 제시가(가격 흔적) ADD COLUMN IF NOT EXISTS used_by_adjustment_id BIGINT NULL; -- 앵커링 배치 소비 마킹 -- ───────────────────────────────────────────────────────────── -- [2026-07-02] 마감 close_reason 개편 — 견적 마감사유 + 가격정책 3구간 -- (신규 DB 는 01-schema*.sql 에 반영됨.) ALTER TABLE quotation.quotations ADD COLUMN IF NOT EXISTS close_reason SMALLINT NULL; -- 마감 사유(CloseReason 1~8), 미마감이면 NULL ALTER TABLE quotation.quotation_settings ADD COLUMN IF NOT EXISTS mid_action SMALLINT NOT NULL DEFAULT 1, -- 가격정책(PriceGateAction): 앵커링가<투찰가≤목표가 처리 ADD COLUMN IF NOT EXISTS over_action SMALLINT NOT NULL DEFAULT 1, -- 가격정책(PriceGateAction): 목표가<투찰가 처리 ADD COLUMN IF NOT EXISTS regen_limit SMALLINT NOT NULL DEFAULT 1; -- 재생성 최대 횟수(체인 전체 총합, 사유 무관)