BC-2 Product / DM-PRD-004 / ENT-010: Add-on 허용 3-Tier 규칙 (BD-016).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_product_idFK→integrated_products 대상 통합 상품 (FK integrated_products, ON DELETE CASCADE). | uuid | NOT NULL | |
| scope AddonPermissionScope(PRODUCT/PARTNER/CATEGORY/DENY). 평가 우선순위는 응용 레이어가 priorityOrder() 로 정렬. | varchar(20) | NOT NULL | |
| action AddonPermissionAction(ALLOW/DENY). | varchar(20) | NOT NULL | |
| target_item_product_idFK→item_products PRODUCT scope 의 대상 (FK item_products). | uuid | NULL | |
| target_partner_idFK→partners PARTNER scope 의 대상 (FK partners). | uuid | NULL | |
| target_category CATEGORY scope 의 대상 (PartnerCategory enum 문자열). | varchar(20) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-1 Identity / DM-ID-006: KARE 내부 관리자 계정 (Google Workspace SSO 전용, BD-024).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| email Google Workspace 이메일 (UNIQUE). | varchar(255) | NOT NULL | |
| google_sub Google Workspace SSO sub 클레임. NULL 이면 SSO 로그인 비활성 (password-only). V082 (2026-05) 에서 NULLABLE 로 완화 — BL-21 폴백 인프라. | varchar(255) | NULL | |
| name 관리자 표시 이름. | varchar(100) | NOT NULL | |
| status AdminStatus(ACTIVE/INACTIVE) — INACTIVE 는 로그인 차단. | varchar(20) | NOT NULL | 'ACTIVE'::character varying |
| last_login_at 마지막 SSO 로그인 일시 (감사·휴면 분석용). | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
| token_version BR-AUTH-010 — Refresh Token 무효화 카운터. JWT tv 클레임과 일치해야 통과. 로그아웃·강제 로그아웃·정지 시 +=1. | int | NOT NULL | 0 |
| password_hash BCrypt 해시 ($2a$12$… 60자). NULL 이면 password 로그인 비활성 (SSO-only). BL-21 — Admin 이메일/비밀번호 폴백 로그인 (2026-05). | varchar(60) | NULL | |
| lock_until BR-AUTH-006 — 로그인 5회 연속 실패 잠금 만료 시각. NULL 이면 미잠금. | timestamptz | NULL |
API-AUD-003 비동기 CSV export Job 메타. 24h presigned URL + AUD-030 자체 감사 연계.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| actor_admin_id | uuid | NOT NULL | |
| filter_snapshot 요청 필터 + 컬럼 화이트리스트 (PHR sanitize 통과 후 적재). | jsonb | NOT NULL | '{}'::jsonb |
| estimated_rows enqueue 시점 추정 행 수. 100,000 초과 시 AUDIT_EXPORT_TOO_LARGE (413) 거부. | bigint | NOT NULL | |
| status QUEUED → RUNNING → SUCCEEDED | FAILED. | varchar(20) | NOT NULL | 'QUEUED'::character varying |
| actor_ip | inet | NULL | |
| user_agent | varchar(500) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| completed_at | timestamptz | NULL | |
| download_url Worker 가 발급한 24h presigned URL (Azure Blob SAS 등). | varchar(2000) | NULL | |
| download_expires_at | timestamptz | NULL | |
| error_code FAILED 시 사유 코드 (예: AUDIT_EXPORT_FAILED). | varchar(80) | NULL |
— DB 코멘트 없음 —
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| audit_code | varchar(50) | NOT NULL | |
| bc_code | varchar(10) | NOT NULL | |
| severity | varchar(20) | NOT NULL | |
| actor_type | varchar(20) | NOT NULL | |
| actor_id | uuid | NULL | |
| actor_ip | inet | NULL | |
| user_agent | varchar(500) | NULL | |
| target_type | varchar(50) | NULL | |
| target_id | uuid | NULL | |
| payload | jsonb | NOT NULL | '{}'::jsonb |
| occurred_atPK | timestamptz | NOT NULL | now() |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
SYS / DM-SYS-005: Refresh Token 영속 세션 SSoT. 평문 미저장 — refresh_token_hash 는 SHA-256 hex(64). BR-AUTH-010 / AUTH-KARE §8.4.1.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| subject_type USER / PARTNER_ACCOUNT / ADMIN — 인증 주체 유형. | varchar(20) | NOT NULL | |
| subject_id users.id / partner_accounts.id / admins.id — actor 폴리모픽 참조 (FK 없음). | uuid | NOT NULL | |
| refresh_token_hash SHA-256 hex(64). 평문 Refresh Token 절대 저장 금지 — §2.2.18 비고. | varchar(64) | NOT NULL | |
| device_label 디바이스 표시명 (감사용, 사용자 노출 가능). | varchar(200) | NULL | |
| ip_address | inet | NULL | |
| user_agent | varchar(500) | NULL | |
| status AuthSessionStatus(ACTIVE/REVOKED/EXPIRED). 회전 시 기존 행은 REVOKED + revoke_reason=ROTATED. | varchar(20) | NOT NULL | 'ACTIVE'::character varying |
| issued_at | timestamptz | NOT NULL | now() |
| last_used_at | timestamptz | NOT NULL | now() |
| expires_at Refresh Token TTL 만료 시각. 배치가 ACTIVE & expires_at < NOW() 행을 EXPIRED 로 전환. | timestamptz | NOT NULL | |
| revoked_at | timestamptz | NULL | |
| revoke_reason LOGOUT / ROTATED / PASSWORD_RESET / ACCOUNT_SUSPENDED / ADMIN_FORCE — REVOKED 시 사유 코드. | varchar(100) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-6 Service / DM-SVC-002: 파트너별 묶음 예약 (BD-029 IV × Partner = 1).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_id 소속 Integrated Voucher (FK 는 BC-4 마이그레이션에서 강제). | uuid | NOT NULL | |
| partner_idFK→partners 예약 대상 파트너사 (FK partners(id), ON DELETE RESTRICT). | uuid | NOT NULL | |
| category BookingCategory(MEDICAL/AESTHETIC/MOBILITY/ACCOMMODATION). | varchar(20) | NOT NULL | |
| headcount 인원수 (BD-029 묶음 헤드카운트). | int | NOT NULL | 1 |
| status BookingStatus REQUESTED→CONFIRMED|REJECTED→IN_MEDIATION→COMPLETED|CANCELLED. | varchar(20) | NOT NULL | 'REQUESTED'::character varying |
| scheduled_at 예정 시각 (UTC). | timestamptz | NULL | |
| location_metadata 픽업/체크인 좌표·주소 등 비PHR 메타 (BD-003). | jsonb | NULL | |
| rejection_reason 거절 사유 (REJECTED 전환 시 채워짐). | varchar(500) | NULL | |
| confirmed_at | timestamptz | NULL | |
| rejected_at | timestamptz | NULL | |
| completed_at | timestamptz | NULL | |
| cancelled_at | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-3 Order / DM-ORD-006: 장바구니 라인 (BD-003 PHR 비취급 — product_snapshot 화이트리스트만 보존).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| cart_idFK→carts | uuid | NOT NULL | |
| integrated_product_id | uuid | NOT NULL | |
| product_snapshot IntegratedProduct 스냅샷 (name·category·partnerId·priceUsd·usagePeriodHours). PHR 컬럼 일절 포함 금지. | jsonb | NOT NULL | |
| quantity | int | NOT NULL | |
| addon_item_product_ids | jsonb | NOT NULL | '{"ids": []}'::jsonb |
| member_option | jsonb | NULL | |
| unit_price_usd | numeric(12,2) | NOT NULL | |
| addon_total_usd | numeric(12,2) | NOT NULL | 0 |
| line_total_usd (unit_price_usd + addon_total_usd) * quantity 계산 결과의 정합 보존. | numeric(12,2) | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-3 Order / DM-ORD-005: 장바구니 헤더. 사용자 1인당 1행 (uq_carts_user).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| user_idFK→users 소유 사용자 (FK users.id, RLS-USR 격리 컬럼). | uuid | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-7 Channel / DM-CHN-003 / ENT-046: PASS 등록 코드 (BD-022 PREFIX-XXXX-XXXX).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| channel_contract_idFK→channel_contracts | uuid | NOT NULL | |
| code BD-022 형식 PREFIX-XXXX-XXXX (UNIQUE). | varchar(30) | NOT NULL | |
| integrated_voucher_id 발행된 PASS 연결 — FK 강제는 BC-4 voucher 테이블 도입 후 별도 ALTER. | uuid | NULL | |
| redeemed_by_user_id | uuid | NULL | |
| status ChannelCodeStatus(AVAILABLE/REGISTERED/EXPIRED/REVOKED). REVOKED 는 BD-030 부분취소·해지에서 사용. | varchar(20) | NOT NULL | 'AVAILABLE'::character varying |
| reserved_at | timestamptz | NULL | |
| redeemed_at | timestamptz | NULL | |
| valid_until | timestamptz | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-7 Channel / DM-CHN-004 / ENT-047: 계약 변경 이력 (BD-030 append-only).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| channel_contract_idFK→channel_contracts | uuid | NOT NULL | |
| change_type ChannelContractChangeType(PARTIAL_CANCEL/ADDITIONAL_ISSUE/TERMINATE). | varchar(30) | NOT NULL | |
| quantity_delta 증감 수량 (음수=취소/해지, 양수=추가발행). | int | NOT NULL | |
| reason | varchar(500) | NULL | |
| admin_idFK→admins | uuid | NOT NULL | |
| snapshot 변경 전·후 스냅샷 JSONB (계약 상태, 코드 식별자, 환불액 등). PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | '{}'::jsonb |
| occurred_at | timestamptz | NOT NULL | now() |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-7 Channel / DM-CHN-001 / ENT-023: B2B 채널사 단체 구매 계약 헤더.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| channel_company_name 채널사명 (BD-020 — 시스템 외부 액터). | varchar(200) | NOT NULL | |
| integrated_product_id 대상 통합 상품 ID. FK 강제는 BC-2 product 테이블 도입 후 별도 ALTER. | uuid | NOT NULL | |
| contract_quantity 계약 수량 (>=1, BD-030 추가 발행/부분 취소 시 증감). | int | NOT NULL | |
| validity_period_hours PASS 유효 기간(시간) — 사용 시작 후 만료까지의 길이 (BR-VCH-EXP). | int | NOT NULL | 24 |
| contract_memo | varchar(1000) | NULL | |
| status ChannelContractStatus(DRAFT/AWAITING_PAYMENT/ACTIVE/PARTIALLY_CANCELLED/TERMINATED/EXPIRED). | varchar(30) | NOT NULL | 'DRAFT'::character varying |
| created_by_admin_idFK→admins | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-7 Channel: QR 배포 비동기 Job (API-CHN-007/008/009 — SIM-002-M03).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| channel_contract_idFK→channel_contracts | uuid | NOT NULL | |
| job_type ChannelDistributionJobType(PRINT/DIGITAL). | varchar(20) | NOT NULL | |
| format PRINT 이면 PDF/PNG, DIGITAL 이면 EMAIL/SMS. | varchar(20) | NOT NULL | |
| status ChannelDistributionJobStatus 5상태 — 워커가 진행률 업데이트. | varchar(20) | NOT NULL | 'QUEUED'::character varying |
| total_count | int | NOT NULL | 0 |
| success_count | int | NOT NULL | 0 |
| failed_count | int | NOT NULL | 0 |
| paper_size | varchar(20) | NULL | |
| batch_size | int | NULL | |
| document_url PRINT 완료 시 Blob Storage 다운로드 URL. | varchar(1000) | NULL | |
| failed_recipients 실패한 수신자 목록 JSONB (디지털만, [{codeId,email/phone,reason}]). | jsonb | NOT NULL | '[]'::jsonb |
| estimated_completion_at | timestamptz | NULL | |
| queued_at | timestamptz | NOT NULL | now() |
| started_at | timestamptz | NULL | |
| completed_at | timestamptz | NULL | |
| requested_by_admin_idFK→admins | uuid | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-7 Channel / DM-CHN-005: Channel 임계치 도달 통보 큐. PENDING→NOTIFIED→ACKNOWLEDGED 상태 머신 (BR-NTF-CHN-004).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| channel_contract_id 계약 ID (FK channel_contracts.id, V075 에서 강제). 본 시점에는 어플리케이션 레벨 참조. | uuid | NOT NULL | |
| threshold_type ChannelNotificationThresholdType (THRESHOLD_80/THRESHOLD_100/MANUAL). 자동 트리거는 unique partial index 로 멱등성 보장. | varchar(20) | NOT NULL | |
| status ChannelNotificationTaskStatus (PENDING/NOTIFIED/ACKNOWLEDGED) — BR-NTF-CHN-004 상태 머신. | varchar(20) | NOT NULL | 'PENDING'::character varying |
| detected_at 임계치 감지 시각 — ChannelExhaustionMonitor 가 INSERT 시 NOW() 로 채움. | timestamptz | NOT NULL | now() |
| notified_at BC-12 알림 발송 성공 시각 — markNotified() 가 채움. | timestamptz | NULL | |
| acknowledged_at 관리자 확인 시각 — acknowledge(adminId) 가 채움. | timestamptz | NULL | |
| handled_by_admin_idFK→admins 확인한 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| assigned_admin_idFK→admins 담당 관리자 (FK admins, ON DELETE SET NULL) — 없으면 BC-12 라우팅 정책으로 결정. | uuid | NULL | |
| notes | varchar(500) | NULL | |
| last_reminder_at 마지막 리마인더 발송 시각 (BR-NTF-CHN-005). 별도 ChannelNotificationReminderScheduler 가 갱신. | timestamptz | NULL | |
| reminder_count 누적 리마인더 발송 횟수 (>=0). | int | NOT NULL | 0 |
| channel_contact_info 기업 담당자 스냅샷 JSONB (이름/이메일/전화) — 임계치 도달 시점 값으로 보존. PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | '{}'::jsonb |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-7 Channel / DM-CHN-002: B2B 결제 (관리자 직접 등록, BD-020). USD 고정 (BD-001).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| channel_contract_idFK→channel_contracts | uuid | NOT NULL | |
| amount_usd 총액 USD (>0). | numeric(14,2) | NOT NULL | |
| paid_at | timestamptz | NOT NULL | |
| payment_method_note 외부 결제 수단 노트 (WIRE_TRANSFER 등 운영 메모). | varchar(500) | NULL | |
| registered_by_admin_idFK→admins | uuid | NOT NULL | |
| issuance_triggered_at IntegratedVoucher 일괄 발행 outbox 적재 시각. | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-11 Promotion / DM-PRM-002: 사용자별 쿠폰 발급 인스턴스 (BR-PRM-002 중복 발급 차단, BR-PRM-003 만료 산출).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| coupon_idFK→coupons 발급된 쿠폰 정의 (FK coupons.id, ON DELETE RESTRICT). | uuid | NOT NULL | |
| user_idFK→users 발급 대상 사용자 (FK users.id, ON DELETE RESTRICT). | uuid | NOT NULL | |
| is_used TRUE 면 주문에 적용·소진. used_at / order_id 와 동시 갱신 (CHECK 제약). | boolean | NOT NULL | false |
| used_at 주문 적용 시각 (markUsed 시 갱신). | timestamptz | NULL | |
| order_idFK→orders 적용된 주문 ID. V030 (orders) 추가 후 FK ALTER 예정. | uuid | NULL | |
| issued_at 발급 시각 (DEFAULT NOW()). | timestamptz | NOT NULL | now() |
| expires_at 발급분 만료 시각. expires_at <= NOW() AND is_used = FALSE → EXPIRED (BR-PRM-003). | timestamptz | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-11 Promotion / DM-PRM-001: KARE 자체 쿠폰 정의 (BR-PRM-001).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| name 관리자 화면에 노출되는 쿠폰명. | varchar(200) | NOT NULL | |
| discount_type CouponDiscountType (PERCENTAGE/FIXED_AMOUNT). | varchar(20) | NOT NULL | |
| discount_value PERCENTAGE 는 0~1 비율, FIXED_AMOUNT 는 USD 정액 (NUMERIC(10,4)). | numeric(10,4) | NOT NULL | |
| min_order_amount_usd 쿠폰 적용 가능 최소 주문 금액 (NULL = 제한 없음). | numeric(12,2) | NULL | |
| max_discount_amount_usd PERCENTAGE 할인 시 상한 금액 (NULL = 제한 없음, FIXED_AMOUNT 시 무시). | numeric(12,2) | NULL | |
| valid_from 쿠폰 유효기간 시작. | timestamptz | NOT NULL | |
| valid_to 쿠폰 유효기간 종료. valid_to 경과 시 발급분은 BR-PRM-003 에 따라 EXPIRED 로 노출된다. | timestamptz | NOT NULL | |
| total_issue_limit 누적 발급 한도 (NULL = 무제한). issued_count 와 동시 발급 가드의 입력. | int | NULL | |
| issued_count 누적 발급 건수 (UPDATE 시 1씩 증가, BR-PRM-002 동시 발급 가드). | int | NOT NULL | 0 |
| status CouponStatus(ACTIVE/INACTIVE) — INACTIVE 는 신규 발급 및 주문 적용 차단. | varchar(20) | NOT NULL | 'ACTIVE'::character varying |
| created_by_admin_idFK→admins 쿠폰을 생성한 관리자 (FK admins, ON DELETE RESTRICT). | uuid | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-9 Fulfillment / DM-FLF-002 / ENT-036: 배송 추적 + 수령 QR 페이로드 (1:1 with fulfillment_orders).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| fulfillment_order_idFK→fulfillment_orders | uuid | NOT NULL | |
| qr_code_payload 단발 사용 수령 페이로드 (BR-FLF-RCV-002). 위·변조 시 400 QR_PAYLOAD_MISMATCH. | varchar(100) | NOT NULL | |
| status DeliveryStatus(PENDING/SHIPPED/DELIVERED/RETURNED). DELIVERED = PA 수령 완료. | varchar(20) | NOT NULL | 'PENDING'::character varying |
| tracking_number | varchar(100) | NULL | |
| carrier | varchar(100) | NULL | |
| shipped_at | timestamptz | NULL | |
| delivered_at | timestamptz | NULL | |
| received_by_partner_account_id PA 수령자 (BR-FLF-RCV-001 소유권 검증 통과 후 기록). FK 강제는 partner_accounts 도입 후 별도 ALTER. | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-6 Service / DM-SVC-001 / ENT-020: 사용자가 IV 에 등록한 항공편 정보.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_id 소속 Integrated Voucher (FK 는 BC-4 IV 마이그레이션에서 강제). UNIQUE = IV 당 1 eTicket (BR-SVC-001). | uuid | NOT NULL | |
| user_id IV 소유자 (RLS-USR-001 빠른 필터). FK 는 BC-1 users 마이그레이션에서 강제. | uuid | NOT NULL | |
| flight_number 항공편명 (예: OZ123). 직접 입력은 NOT NULL 이지만 파싱 실패(FAILED) 흐름은 NULL 허용. | varchar(20) | NULL | |
| arrival_kst 도착 시각 (KST). 자동 예약(숙박) 의 체크인 일자 산출 기준. | timestamptz | NULL | |
| airline_code IATA 항공사 코드 (옵션, 파싱 시 채워짐). | varchar(3) | NULL | |
| source_type 입력 방식 (MANUAL_INPUT / FILE_UPLOAD). | varchar(20) | NOT NULL | |
| blob_url FILE_UPLOAD 흐름에서 Azure Blob URL. CHECK ck_et_file_blob_required 가 강제. | varchar(500) | NULL | |
| parse_status 파싱 결과 (FILE_UPLOAD 만 의미 — MANUAL_INPUT 은 NULL). | varchar(20) | NULL | |
| parsed_at 파싱 결과 확정 시각. PARSE_STATUS 와 1:1 동기화. | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-10 Support / DM-SUP-004 / ENT-037: FAQ 카테고리 (접속 유형 + 표출 플랫폼 CSV).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| name 카테고리 표시 이름 (단일 언어, ≤100자). 다국어는 향후 i18n_key 도입 시 분리 가능. | varchar(100) | NOT NULL | |
| target_audience FaqAudience (USER/PARTNER). DOMAIN faq_audience (V002). | varchar(20) | NOT NULL | |
| display_platforms 표출 플랫폼 CSV (예: "UA" / "PW,PA"). BR-SUP-007~009. CHECK ck_fcat_display_platforms_format. | varchar(50) | NOT NULL | |
| display_order 카테고리 정렬 순서 (오름차순). | int | NOT NULL | 0 |
| is_active 활성화 여부 — FALSE 면 소속 FAQ 도 노출되지 않음 (BR-FAQ-002). | boolean | NOT NULL | true |
| created_by_admin_idFK→admins 작성 관리자 (FK admins, ON DELETE RESTRICT). | uuid | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-10 Support / DM-SUP-003 / ENT-036: FAQ 본문 (다국어 question/answer JSONB, BD-018).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| faq_category_idFK→faq_categories 소속 카테고리 (FK faq_categories, ON DELETE RESTRICT — 활성 카테고리 삭제 차단, BR-FQC-002). | uuid | NOT NULL | |
| questions 질문 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | |
| answers 답변 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | |
| display_order 카테고리 내 정렬 순서 (오름차순). | int | NOT NULL | 0 |
| is_published 게시 여부 — FALSE 면 노출 제외 (BR-FAQ-002). | boolean | NOT NULL | true |
| created_by_admin_idFK→admins 작성 관리자 (FK admins, ON DELETE RESTRICT). | uuid | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-9 Fulfillment / DM-FLF-001 / ENT-035: giftbox/관광상품권 실물 발주 헤더 (API-FLF-001~005).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| partner_idFK→partners 발주 대상 파트너사 (호텔·여행사 등) — APPROVED 상태 검증은 application 레이어. | uuid | NOT NULL | |
| item_product_id 발주 대상 ItemProduct PK. FK 강제는 BC-2 product 테이블 도입 후 별도 ALTER. | uuid | NOT NULL | |
| quantity 발주 수량 (>=1). | int | NOT NULL | |
| destination_accommodation 도착지 숙소 표기 (호텔명·주소). | varchar(500) | NOT NULL | |
| expected_ship_date 예상 출고일 — 운영 SLA 추적용. | timestamptz | NOT NULL | |
| note | varchar(1000) | NULL | |
| status FulfillmentOrderStatus(PENDING/SHIPPED/RECEIVED/CANCELLED). | varchar(20) | NOT NULL | 'PENDING'::character varying |
| shipped_at PENDING → SHIPPED 전이 시각 (관리자 발송 처리). | timestamptz | NULL | |
| received_at SHIPPED → RECEIVED 전이 시각 (FulfillmentSvc 단독 — DR-PA-003). | timestamptz | NULL | |
| created_by_admin_idFK→admins | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
SYS / DM-SYS-003: BR-IDM-001 Idempotency-Key 상태 머신. 5개 적용 라우트의 중복 실행 방어.
| Column | Type | Null | Default |
|---|---|---|---|
| scopePK 라우트 기반 스코프 (예: 'payments.confirm') — TTL 정책·메트릭 라벨에 사용. | varchar(64) | NOT NULL | |
| idem_keyPK 클라이언트 제공 UUIDv4/ULID. 영숫자·하이픈·언더스코어 화이트리스트, ≤128자. | varchar(128) | NOT NULL | |
| request_hash SHA-256(method + path + canonical body) hex 64자. hash 일치 시 응답 재생, 불일치 시 409 CONFLICT. | varchar(64) | NOT NULL | |
| status IN_PROGRESS → COMPLETED 단방향 전이. FAILED 는 동일 hash 재시도 허용. | varchar(20) | NOT NULL | 'IN_PROGRESS'::character varying |
| response_status COMPLETED 시 응답 HTTP 상태. IN_PROGRESS 시 NULL. | int | NULL | |
| response_headers COMPLETED 응답 헤더 스냅샷 (jsonb, PHR 비포함). | jsonb | NULL | |
| response_body COMPLETED 응답 본문 스냅샷 (jsonb, BD-003 sanitize 적용). | jsonb | NULL | |
| ttl_expires_at scope별 TTL — payments/transfers/checkout 24h, admin 발급 72h. 만료 행은 스케줄러가 정리. | timestamptz | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-10 Support / DM-SUP-001 / ENT-034: 1:1 문의 (UA + PW 통합).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| inquirer_type 작성자 유형 (BR-SUP-003). GENERAL_USER → user_id / PARTNER_ADMIN → partner_account_id (XOR). | varchar(30) | NOT NULL | |
| user_idFK→users inquirer_type=GENERAL_USER 시 NOT NULL (FK users, ON DELETE RESTRICT). | uuid | NULL | |
| partner_account_idFK→partner_accounts inquirer_type=PARTNER_ADMIN 시 NOT NULL (FK partner_accounts, ON DELETE RESTRICT). | uuid | NULL | |
| inquiry_type InquiryType (CANCELLATION/REFUND/GENERAL/TECHNICAL/COMPLAINT). DOMAIN inquiry_type (V002). | varchar(20) | NOT NULL | |
| subject 제목 (≤200자, BD-003 PHR 사전 필터링 대상). | varchar(200) | NOT NULL | |
| content 본문 TEXT (BD-003 PHR 사전 필터링 대상 — Application 레이어 PhrSanitizer). | text | NOT NULL | |
| context_type 진입경로 (BR-SUP-PREFILL-001). EXPIRED_PASS/QR_REISSUE/ORDER_ORPHAN/GENERAL. | varchar(30) | NOT NULL | |
| related_integrated_voucher_id EXPIRED_PASS / QR_REISSUE 진입 시 동반된 IntegratedVoucher.id (소프트 참조). | uuid | NULL | |
| related_order_id ORDER_ORPHAN 진입 시 동반된 Order.id (소프트 참조). | uuid | NULL | |
| status InquiryStatus (OPEN/IN_PROGRESS/CLOSED). DOMAIN inquiry_status (V002). | varchar(20) | NOT NULL | 'OPEN'::character varying |
| assigned_admin_idFK→admins 담당 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| admin_response 관리자 답변 본문 (BD-003 PHR 사전 필터링 대상). | text | NULL | |
| closed_at CLOSED 전환 시각 (status=CLOSED 시 NOT NULL). | timestamptz | NULL | |
| refund_status 환불 보조 상태 (BR-SUP-REF-001~003). DOMAIN inquiry_refund_status. | varchar(30) | NOT NULL | 'NONE'::character varying |
| refund_requested_at REFUND_PROCESSING 진입 시각 (refund_status=REFUND_PROCESSING 시 NOT NULL). | timestamptz | NULL | |
| refund_expected_by 환불 예상 완료일 (refund_requested_at + 14 영업일). | timestamptz | NULL | |
| refund_confirmed_at REFUNDED 확정 시각 (refund_status=REFUNDED 시 NOT NULL). | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-2 Product / DM-PRD-003 / ENT-009: IntegratedProduct ↔ ItemProduct M:N 연결.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_product_idFK→integrated_products 상위 통합 상품 (FK integrated_products, ON DELETE CASCADE). | uuid | NOT NULL | |
| item_product_idFK→item_products 구성 세부 상품 (FK item_products, ON DELETE RESTRICT). | uuid | NOT NULL | |
| display_order 화면 표시 순서 (>=0). 동일 통합 상품 내 중복 허용. | int | NOT NULL | 0 |
| quantity 1 IntegratedVoucher 발행 당 ItemVoucher 발행 수량 (>0). | int | NOT NULL | 1 |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-2 Product / DM-PRD-002 / ENT-008: KARE PASS 카탈로그 (결제 전 객체).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| name KARE PASS 명 (200자 제한). | varchar(200) | NOT NULL | |
| description 상품 설명 (선택). PHR 키 금지 (BD-003). | text | NULL | |
| price_usd B2C USD 가격 (NUMERIC(12,2), CHECK >= 0). | numeric(12,2) | NOT NULL | |
| member_type MemberType(FIXED/VARIABLE). FIXED 는 fixed_member_count, VARIABLE 은 max_addon_count 필수 (ck_ipc_member_shape). | varchar(20) | NOT NULL | |
| fixed_member_count FIXED 시 고정 인원 수 (>=1). VARIABLE 시 NULL. | int | NULL | |
| max_addon_count VARIABLE 시 최대 Add-on 인원 수 (>=0). FIXED 시 NULL. | int | NULL | |
| expiry_period_type ExpiryPeriodType(2Y/3Y). 발행일 기준 유효 기간. | varchar(20) | NOT NULL | '2Y'::character varying |
| usage_period_hours 최초 사용(ACTIVE 전환) 후 이용 가능 시간 (>0). | int | NOT NULL | |
| addon_enabled Add-on 추가구매 활성화 — VARIABLE 한정 (BR-IPC-003 / ck_ipc_addon_requires_variable). | boolean | NOT NULL | false |
| status ProductStatus(DRAFT/ACTIVE/ARCHIVED). | varchar(20) | NOT NULL | 'DRAFT'::character varying |
| is_visible UA 노출 여부 — status=ACTIVE 한정 (ck_ipc_visibility_active). | boolean | NOT NULL | false |
| created_by_admin_idFK→admins 등록 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-4 Voucher / DM-VCH-001 / ENT-014: KARE PASS 통합 바우처 8상태 머신.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| user_idFK→users 현재 소유자 (Transfer 시 user_id 갱신). FK users, ON DELETE RESTRICT. | uuid | NOT NULL | |
| order_idFK→orders B2C 발행 출처 (channel_payment_id 와 XOR). FK orders, ON DELETE RESTRICT. | uuid | NULL | |
| channel_payment_idFK→channel_payments B2B 발행 출처 (order_id 와 XOR). FK channel_payments, ON DELETE RESTRICT. | uuid | NULL | |
| integrated_product_idFK→integrated_products 발행 상품 (FK integrated_products, ON DELETE RESTRICT). | uuid | NOT NULL | |
| status V002 integrated_voucher_status 도메인 — 8상태 머신. | varchar(20) | NOT NULL | 'PENDING_CREATION'::character varying |
| member_count 동반자 포함 총 인원 (>= 1). | int | NOT NULL | |
| expiry_date 발행일 + expiry_period_type 기준 만료 시각 (스케줄러 후보). | timestamptz | NOT NULL | |
| usage_period_hours IntegratedProduct.usage_period_hours 스냅샷 — 첫 사용 후 사용기한 산정용. | int | NOT NULL | |
| first_activated_at 최초 ACTIVE 전이 시각. 이후 usage_deadline = first_activated_at + usage_period_hours. | timestamptz | NULL | |
| usage_deadline MIN(expiry_date, first_activated_at + usage_period_hours) 적용된 절대 만료 시각. | timestamptz | NULL | |
| cancelled_at | timestamptz | NULL | |
| cancelled_by_admin_idFK→admins 관리자 단일 통제 — CANCELLED 전환 시 NOT NULL (ck_ivch_cancel_completeness). | uuid | NULL | |
| cancel_reason | text | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-2 Product / DM-PRD-001 / ENT-007: 파트너사별 단일 서비스 카탈로그 (6개 카테고리).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| partner_idFK→partners 서비스 제공 파트너 (FK partners, ON DELETE RESTRICT). | uuid | NOT NULL | |
| category PartnerCategory (MEDICAL/AESTHETIC/MOBILITY/ACCOMMODATION/GIFTBOX/TOUR_VOUCHER). | varchar(20) | NOT NULL | |
| name 상품명 (200자 제한). | varchar(200) | NOT NULL | |
| description 상품 설명 (선택). | text | NULL | |
| price_usd USD 단가 (NUMERIC(12,2), CHECK >= 0). | numeric(12,2) | NOT NULL | |
| status ProductStatus(DRAFT/ACTIVE/ARCHIVED). DRAFT 진입 시 초기값. | varchar(20) | NOT NULL | 'DRAFT'::character varying |
| is_visible 사용자 앱 노출 여부. status=ACTIVE 한정 (BR-IPD-002, ck_item_products_visibility_active). | boolean | NOT NULL | false |
| usage_period_hours 최초 사용(ACTIVE 전환) 후 이용 가능 시간 (NULL 허용 — 카테고리별 정책). | int | NULL | |
| category_metadata 카테고리별 메타데이터 (clinic_name·pickup_type·room_type 등). PHR 키 금지 (BD-003). | jsonb | NULL | |
| created_by_admin_idFK→admins 등록 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-4 Voucher / DM-VCH-003 / ENT-016: BD-029 Add-on 동반자 정보 — IntegratedVoucher 단위 슬롯 순번 식별. PHR 비취급 (BD-003).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_idFK→integrated_vouchers 상위 PASS (FK integrated_vouchers, ON DELETE RESTRICT). | uuid | NOT NULL | |
| category 동반자가 사용 권한을 가진 카테고리 (V002 partner_category). | varchar(20) | NOT NULL | |
| slot_index 동일 (IV, category) 내부 순번 — uq_ivc_pass_category_slot 으로 중복 방지. | int | NOT NULL | |
| owner_idFK→users Transfer 시 변경되는 슬롯 소유자 (FK users, ON DELETE SET NULL — soft 보존). | uuid | NULL | |
| full_name | varchar(200) | NULL | |
| passport_number_masked 마스킹된 여권번호 (예: A12*****34) — 평문 저장 금지. | varchar(50) | NULL | |
| birth_date | date | NULL | |
| gender | varchar(10) | NULL | |
| nationality ISO-3166-1 alpha-3 국가 코드. | varchar(3) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-4 Voucher / DM-VCH-007 / ENT-020: ItemVoucher 상태 전이 감사 (Layer 2, append-only). BC-8 Settlement 정산 정본.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| item_voucher_idFK→item_vouchers 대상 ItemVoucher (FK item_vouchers, ON DELETE RESTRICT). | uuid | NOT NULL | |
| integrated_voucher_idFK→integrated_vouchers 상위 IntegratedVoucher (denormalized, 감사·집계 효율). | uuid | NOT NULL | |
| partner_idFK→partners 제공 파트너 (denormalized, BR-PFS-005 정산 집계 인덱스). | uuid | NOT NULL | |
| category | varchar(20) | NOT NULL | |
| from_status | varchar(20) | NULL | |
| to_status | varchar(20) | NOT NULL | |
| quantity_delta 차감 수량 — REDEMPTION 시 음수, 신규 발행 시 양수, 단순 상태 전이 시 0. | int | NOT NULL | |
| remaining_after 본 트랜잭션 적용 후 ItemVoucher.remaining_quantity (>= 0). | int | NOT NULL | |
| face_value_usd 차감 시점 권면 금액 — 정산 집계 정본. | numeric(12,2) | NOT NULL | |
| redeemed_amount_usd face_value_usd × |quantity_delta| — REDEMPTION 라인의 즉시 정산액. | numeric(12,2) | NULL | |
| redemption_record_id BC-5 redemption_records.id (polymorphic — V050 시점 BC-5 부재로 FK 미부여). | uuid | NULL | |
| actor_type | varchar(20) | NOT NULL | |
| actor_id | uuid | NULL | |
| trigger_type | varchar(40) | NOT NULL | |
| event_id Outbox 멱등성 키 (uq_ivsl_event_id 부분 유니크). | uuid | NULL | |
| occurred_at | timestamptz | NOT NULL | now() |
| created_at | timestamptz | NOT NULL | now() |
BC-4 Voucher / DM-VCH-002 / ENT-015: IntegratedVoucher 종속 세부 바우처 — 독립 5상태 머신.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_idFK→integrated_vouchers 상위 PASS (FK integrated_vouchers, ON DELETE RESTRICT — 감사 이력 보호). | uuid | NOT NULL | |
| item_product_idFK→item_products | uuid | NOT NULL | |
| partner_idFK→partners 제공 파트너 (denormalized for 정산 집계 — BC-8 idx_ivh_partner_status). | uuid | NOT NULL | |
| category 파트너 카테고리 스냅샷 (V002 partner_category 도메인). | varchar(20) | NOT NULL | |
| status | varchar(20) | NOT NULL | 'ISSUED'::character varying |
| initial_quantity 발행 수량 (>= 1). | int | NOT NULL | |
| remaining_quantity 잔여 수량 — 단방향 차감 (trg_ivh_monotonic_decrement + ck_ivh_remaining_in_range). | int | NOT NULL | |
| face_value_usd 권면 금액 USD — 정산 집계 기준 (BR-PFS-005). | numeric(12,2) | NOT NULL | |
| activated_at | timestamptz | NULL | |
| fully_used_at | timestamptz | NULL | |
| expired_at | timestamptz | NULL | |
| cancelled_at | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-6 Service / DM-SVC-003: 모빌리티 Booking 기사 배정 (Booking 1:1, RLS-PTN-006/007).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| booking_idFK→bookings 배정 대상 Booking (UNIQUE 1:1). | uuid | NOT NULL | |
| driver_partner_account_id 배정된 기사 PartnerAccount (NULL = 미배정 풀, RLS-PTN-006 Tier-2 가시 대상). | uuid | NULL | |
| assignment_type AUTO = DRIVER 자가 승인 자동 배정 / MANUAL = STAFF·ADMIN 명시 지정 (RLS-PTN-007). MANUAL 건은 DRIVER 재할당 차단. | varchar(20) | NOT NULL | 'AUTO'::character varying |
| status PENDING(미배정 풀)·ACCEPTED·REASSIGNED 상태 머신. | varchar(20) | NOT NULL | 'PENDING'::character varying |
| assigned_at 실제 driver 가 배정된 시각. 미배정 풀 행은 NULL. | timestamptz | NULL | |
| reassigned_from 재배정 시 이전 driver_partner_account_id (BR-SVC-007-005). | uuid | NULL | |
| reassignment_reason | varchar(500) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-10 Support / DM-SUP-002 / ENT-035: 공지사항 (다국어 본문 JSONB, BD-018).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| titles 제목 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | |
| contents 본문 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | |
| target_audience NoticeAudience (USER/PARTNER/ALL). DOMAIN notice_audience (V002). | varchar(20) | NOT NULL | |
| priority NoticePriority (NORMAL/HIGH). DOMAIN notice_priority (V002). | varchar(20) | NOT NULL | 'NORMAL'::character varying |
| is_published 게시 여부 — FALSE 면 모든 노출 채널에서 제외. | boolean | NOT NULL | false |
| display_from 노출 시작 시각 (BR-NTC-002). | timestamptz | NOT NULL | |
| display_to 노출 종료 시각 (NULL=영구 노출). display_to > display_from 강제. | timestamptz | NULL | |
| created_by_admin_idFK→admins 작성 관리자 (FK admins, ON DELETE RESTRICT — 감사 추적 보존). | uuid | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-12 Notification / DM-NTF-002: 만료 임박 N일·PENDING_TRANSFER 자동 Recall 등 알림 정책 SSoT.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| policy_key 정책 키 (UNIQUE) — EXPIRY_REMINDER_DAYS / PENDING_TRANSFER_NOTIFY_ENABLED 등. | varchar(100) | NOT NULL | |
| policy_value 정책 본문 JSONB — 키별 자유 구조. 예: {"days":[30,7,1]} / {"enabled":true}. PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | |
| is_active 정책 활성화 여부 — FALSE 면 알림 발송 로직에서 무시. | boolean | NOT NULL | true |
| updated_by_admin_idFK→admins 마지막 변경 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-12 Notification / DM-NTF-001 / ENT-033: 도메인 이벤트 기반 발송 이력 + 사용자 인박스 단일 테이블. Outbox(write) ↔ Inbox(read) 양면.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| recipient_user_id 폴리모픽 수신자 ID (USR→users.id / PTN→partner_accounts.id / ADM→admins.id). trg_notifications_recipient_fk 트리거 검증. | uuid | NOT NULL | |
| recipient_type NotificationRecipientType (USR/PTN/ADM). CHECK ck_ntf_recipient_type. | varchar(20) | NOT NULL | |
| channel NotificationChannel (PUSH/SMS/EMAIL/IN_APP). 도메인 notification_channel. | varchar(20) | NOT NULL | |
| event_type NotificationEventType (29종). 도메인 notification_event_type (V002 + V015~V024 보강). | varchar(40) | NOT NULL | |
| locale BCP-47 로케일 (en/ar/ko/mn). i18n 템플릿 출력 시점에 결정. | varchar(10) | NOT NULL | 'en'::character varying |
| subject 제목 — UA 인박스 title. PUSH/EMAIL 채널은 외부 어댑터로 그대로 전달. PHR 비취급 (BD-003). | varchar(255) | NULL | |
| body_text 본문 — 모든 채널 공통. PHR 비취급 (BD-003) — PhrSanitizer 가 적재 단계에서 차단. | text | NOT NULL | |
| send_status NotificationStatus (PENDING/SENT/FAILED/READ). 운영 dispatcher 상태 머신 — 사용자 응답에는 read_at 기준만 노출한다 (READ 값 직접 노출 금지). | varchar(20) | NOT NULL | 'PENDING'::character varying |
| attempt_count 누적 발송 시도 횟수 (>=0). NotificationRetryPolicy 가 markFailed 시점에 +1. | int | NOT NULL | 0 |
| next_retry_at 다음 재시도 예정 시각 (BR-NTF-RTRY 지수 백오프). NULL = 재시도 없음 (DLQ 또는 SENT). | timestamptz | NULL | |
| sent_at 외부 어댑터 발송 성공 시각 — markSent() 시점. NULL = 미발송. | timestamptz | NULL | |
| read_at 사용자 읽음 시각 (UC-NTF-002/003). NULL = 미읽음. 읽음 표현은 본 컬럼 단일 SSoT (NotificationStatus.READ 는 dispatcher 운용 전용). | timestamptz | NULL | |
| provider_message_id 외부 게이트웨이 메시지 ID (FCM/APNs/SMS/EMAIL provider). 운영 디버깅용. | varchar(255) | NULL | |
| failure_reason 발송 실패 사유 (예외 클래스 + 메시지). markFailed() 시점에 기록. | varchar(500) | NULL | |
| source_event_id 도메인 이벤트 ID — 멱등 키 합성 + 추적. NotificationMessage.sourceEventId 와 매핑. | uuid | NULL | |
| related_booking_id 관련 예약 ID (BC-6) — 인박스 deeplink 용. 물리 FK 미적용 (cross-BC 참조). | uuid | NULL | |
| related_integrated_voucher_id 관련 IntegratedVoucher ID (BC-4) — 인박스 deeplink 용. 물리 FK 미적용 (cross-BC 참조). | uuid | NULL | |
| metadata NotificationMessage.metadata JSONB (deeplink·식별자 등 비-PHR 메타). trg_notifications_metadata_phr_filter 가 PHR 키 차단 (BD-003). | jsonb | NOT NULL | '{}'::jsonb |
| idempotency_key 발송 멱등 키 — uq_ntf_idempotency_key 부분 UNIQUE. NULL 키는 sourceEventId+channel 합성으로 별도 가드. | varchar(150) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-3 Order / DM-ORD-002: 주문 라인 스냅샷 (BD-003 PHR 비취급).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| order_idFK→orders | uuid | NOT NULL | |
| integrated_product_id | uuid | NOT NULL | |
| product_snapshot 주문 시점 IntegratedProduct 화이트리스트 스냅샷. 진단명·처방·검사결과 일절 미포함. | jsonb | NOT NULL | |
| quantity | int | NOT NULL | |
| addon_item_product_ids | jsonb | NOT NULL | '{"ids": []}'::jsonb |
| member_option | jsonb | NULL | |
| unit_price_usd | numeric(12,2) | NOT NULL | |
| addon_total_usd | numeric(12,2) | NOT NULL | 0 |
| line_total_usd | numeric(12,2) | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-3 Order / DM-ORD-001: 주문 헤더 (BR-ORD-신규-002 PENDING → PAID 단방향).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| user_idFK→users | uuid | NOT NULL | |
| integrated_product_id | uuid | NULL | |
| order_type | varchar(20) | NOT NULL | 'B2C'::character varying |
| subtotal_usd | numeric(12,2) | NOT NULL | |
| discount_usd | numeric(12,2) | NOT NULL | 0 |
| total_amount_usd | numeric(12,2) | NOT NULL | |
| coupon_issuance_idFK→coupon_issuances 적용된 쿠폰 발급분 (FK coupon_issuances.id). 본 task 는 nullable 만 채운다 — 결제 승인 트랜잭션이 markUsed 호출. | uuid | NULL | |
| status order_status 도메인 (V002, V012, V013). | varchar(20) | NOT NULL | 'PENDING'::character varying |
| expires_at 결제 만료 시각 (created_at + SystemConfig order.paymentTtlMinutes, 기본 30분). | timestamptz | NOT NULL | |
| paid_at | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
| parent_order_idFK→orders Add-on 추가구매(B2C_ADDON) 의 원본 주문 (FK orders.id, ON DELETE RESTRICT). B2C 는 NULL (ck_orders_parent_addon_consistency). | uuid | NULL |
DM-SYS-003 — Transactional Outbox (R04-H-02). Polling Relay → Azure Service Bus.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| event_id 발행 멱등성 키 (UUID). At-least-once delivery 의 dedup ID. | uuid | NOT NULL | gen_random_uuid() |
| event_type | varchar(100) | NOT NULL | |
| aggregate_type | varchar(50) | NOT NULL | |
| aggregate_id | uuid | NOT NULL | |
| payload | jsonb | NOT NULL | '{}'::jsonb |
| headers | jsonb | NOT NULL | '{}'::jsonb |
| status | varchar(20) | NOT NULL | 'PENDING'::character varying |
| retry_count | int | NOT NULL | 0 |
| next_retry_at | timestamptz | NULL | |
| published_at | timestamptz | NULL | |
| last_attempt_at | timestamptz | NULL | |
| last_error | text | NULL | |
| attempts API-OBX-002 재시도 이력 — JSONB 배열. {attemptNo, attemptedAt, errorCode, errorMessage, durationMs}. | jsonb | NOT NULL | '[]'::jsonb |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
API-OBX-004 — Outbox 이벤트 폐기 보관 테이블 (DLQ → archive 이관).
| Column | Type | Null | Default |
|---|---|---|---|
| archive_idPK | uuid | NOT NULL | gen_random_uuid() |
| original_id 폐기 직전 outbox_events.id (원본 행은 단일 트랜잭션에서 DELETE). | uuid | NOT NULL | |
| event_id | uuid | NOT NULL | |
| event_type | varchar(100) | NOT NULL | |
| aggregate_type | varchar(50) | NOT NULL | |
| aggregate_id | uuid | NOT NULL | |
| payload | jsonb | NOT NULL | |
| headers | jsonb | NOT NULL | '{}'::jsonb |
| last_status | varchar(20) | NOT NULL | |
| retry_count | int | NOT NULL | 0 |
| last_error | text | NULL | |
| attempts | jsonb | NOT NULL | '[]'::jsonb |
| original_created_at | timestamptz | NOT NULL | |
| discarded_at | timestamptz | NOT NULL | now() |
| discarded_by | uuid | NOT NULL | |
| discard_reason 관리자 입력 폐기 사유 (BR-AUD-029 감사 trail 의 사유 컬럼과 동일). | varchar(500) | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
BC-1 Identity / DM-ID-004: 파트너사 로그인 계정 (ADMIN/STAFF/DRIVER).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| partner_idFK→partners FK partners(id) ON DELETE CASCADE — 파트너사 삭제 시 소속 계정 일괄 제거. | uuid | NOT NULL | |
| email 로그인 이메일 (UNIQUE, 소문자 정규화). | varchar(255) | NOT NULL | |
| password_hash bcrypt 해시 — 추후 SSO 도입 가능성 대비 NULLABLE. | text | NULL | |
| name 담당자 표시 이름. | varchar(100) | NOT NULL | |
| role partner_account_role 도메인 (ADMIN/STAFF/DRIVER). | varchar(20) | NOT NULL | 'STAFF'::character varying |
| status partner_account_status 도메인 (ACTIVE/INACTIVE) — INACTIVE 는 로그인 차단. | varchar(20) | NOT NULL | 'ACTIVE'::character varying |
| last_login_at 마지막 로그인 일시 (감사·휴면 분석용). | timestamptz | NULL | |
| token_version BR-AUTH-010 — Refresh Token 무효화 카운터 (V025 정책의 partner_accounts 적용분). | int | NOT NULL | 0 |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
| lock_until BR-AUTH-006 — 로그인 5회 연속 실패 잠금 만료 시각. NULL 이면 미잠금. | timestamptz | NULL |
BC-1 Identity / DM-ID-005: 파트너별 기능 설정 + EXPIRED 정산율 SSoT (BR-PFS-002, BD-010).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| partner_idFK→partners FK partners(id) ON DELETE CASCADE — Partner 1:1 (uq_pfs_partner). | uuid | NOT NULL | |
| manual_redemption_enabled 수동 사용처리(현장 코드 입력) 활성화 — 기본 false, 관리자 토글. | boolean | NOT NULL | false |
| expired_settlement_ratio EXPIRED 상태 정산 비율 (0.0000~0.5000, BR-PFS-002 / BD-010). 정산 집계 시 본 SSoT 의 현재 값이 스냅샷된다. | numeric(5,4) | NOT NULL | 0.0000 |
| previous_manual_redemption_enabled 직전 수동 사용처리 토글 값 — AUD-026 Triple Timestamp 직전값 스냅샷. | boolean | NULL | |
| previous_expired_settlement_ratio 직전 EXPIRED 정산율 — 정산 집계가 변경 직전 값을 참조해야 할 때 1회 INSERT 만으로 추적. | numeric(5,4) | NULL | |
| last_change_reason 마지막 변경 사유 (관리자 입력, 최대 500자). | varchar(500) | NULL | |
| updated_by_admin_idFK→admins 마지막 수정자 — FK admins(id) ON DELETE SET NULL (계정 정리 후에도 본 행 유지). | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-1 Identity / DM-ID-003: 서비스 제공 파트너사. PartnerStatus 2값 (BD-009).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| company_name 상호명. | varchar(200) | NOT NULL | |
| category PartnerCategory (MEDICAL/AESTHETIC/MOBILITY/ACCOMMODATION/GIFTBOX/TOUR_VOUCHER). | varchar(20) | NOT NULL | |
| status PartnerStatus(APPROVED/SUSPENDED) — 운영 중지 시 SUSPENDED + suspension_reason 필수 (BR-ID-017-001). | varchar(20) | NOT NULL | 'APPROVED'::character varying |
| representative_name 대표자 이름. | varchar(100) | NOT NULL | |
| contact_email 대표 연락 이메일. | varchar(255) | NOT NULL | |
| contact_phone 대표 연락처 (선택). | varchar(50) | NULL | |
| business_registration_number 사업자등록번호 (선택, 국가별 포맷). | varchar(50) | NULL | |
| suspension_reason 운영 중지 사유 — SUSPENDED 전환 시 필수 (CHECK ck_partners_suspension_reason). | text | NULL | |
| suspended_at 운영 중지 일시. | timestamptz | NULL | |
| suspended_by_admin_idFK→admins 운영 중지 처리 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| unsuspended_at 운영 재개 일시. | timestamptz | NULL | |
| unsuspended_by_admin_idFK→admins 운영 재개 처리 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-3 Order / DM-ORD-003 / ENT-013: PG 결제 승인·실패·환불 이력 (USD 단일 통화).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| order_idFK→orders 결제 대상 주문 (FK orders.id, UNIQUE — Order 1:1). | uuid | NOT NULL | |
| pg_provider PG사 식별자 (V002 pg_provider 도메인). MVP: STRIPE. | varchar(20) | NOT NULL | |
| pg_transaction_id PG 측 거래 식별자 (uq_payments_pg_tx — 글로벌 멱등 보장). | varchar(255) | NOT NULL | |
| amount_usd 결제 승인 금액 (USD). CHECK >= 0. | numeric(12,2) | NOT NULL | |
| status | varchar(20) | NOT NULL | 'PENDING'::character varying |
| approved_at | timestamptz | NULL | |
| failed_at | timestamptz | NULL | |
| cancelled_at | timestamptz | NULL | |
| refund_amount_usd 누적 환불 금액. CHECK refund_amount_usd <= amount_usd (BR-PAY-002). | numeric(12,2) | NULL | |
| refunded_at | timestamptz | NULL | |
| pg_raw_response PG 응답 원문 JSONB (감사용). PHR 포함 금지 (BD-003). | jsonb | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-4 Voucher / DM-VCH-004 / ENT-017: IntegratedVoucher 식별 QR — 1:ACTIVE+ N:REVOKED 누적.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_idFK→integrated_vouchers 대상 PASS (FK integrated_vouchers, ON DELETE RESTRICT). | uuid | NOT NULL | |
| code QR 페이로드 (QR_VERSION + IV id + HMAC signature). uq_qr_code GLOBAL UNIQUE. | varchar(255) | NOT NULL | |
| version 재발급 버전 — 1부터 단조 증가. | int | NOT NULL | 1 |
| is_active true = 현재 유효 / false = 무효화. uq_qr_active_iv 로 IV당 ACTIVE 1행 보장. | boolean | NOT NULL | true |
| issued_at | timestamptz | NOT NULL | now() |
| invalidated_at | timestamptz | NULL | |
| invalidation_reason REISSUED / VOUCHER_CANCELLED / SECURITY_COMPROMISE — is_active=false 시 NOT NULL. | varchar(50) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-5 Redemption / DM-RDM-001 / ENT-021: ItemVoucher 차감 정본 이력 — QR 스캔 / 수동 사용처리 / 실물 수령. BD-017 Lock 순서 후행 INSERT.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| item_voucher_idFK→item_vouchers 차감 대상 ItemVoucher (FK item_vouchers, ON DELETE RESTRICT — 감사 보존). | uuid | NOT NULL | |
| integrated_voucher_idFK→integrated_vouchers 상위 IntegratedVoucher (denormalized, BD-017 Lock 진단·이력 조회 효율). | uuid | NOT NULL | |
| partner_idFK→partners 제공 파트너 (denormalized, BC-8 정산 집계·idx_redemption_partner_processed). | uuid | NOT NULL | |
| partner_account_idFK→partner_accounts 처리 파트너 계정 (PA STAFF/DRIVER, PW PARTNER_ADMIN, 실물 수령 시 숙박 STAFF). FK partner_accounts, ON DELETE RESTRICT. | uuid | NOT NULL | |
| redemption_type V002 redemption_type 도메인 (QR/MANUAL). BR-RDM-002 — 실물 수령 QR 스캔도 'QR' 로 기록. | varchar(20) | NOT NULL | |
| item_count BD-031 일괄 차감 묶음 크기 — 본인 1 + Add-on N. 단일 ItemVoucher 차감이라도 >= 1. | int | NOT NULL | 1 |
| quantity_redeemed 차감 수량 (>= 1) — ItemVoucher.remaining_quantity 차감액과 동기. | int | NOT NULL | |
| remaining_after 차감 후 ItemVoucher.remaining_quantity 스냅샷 (>= 0) — item_voucher_state_logs 와 동기 검증용. | int | NOT NULL | |
| idempotency_key SYS idempotency_keys.idem_key (scope='REDEMPTION') 와 동일 문자열. FK 아님 — append-only 추적용. | varchar(128) | NULL | |
| notes 처리 메모 (수동 처리 사유 등). BD-003 sanitizer 통과 후 저장 — PHR 키워드 금지. | varchar(500) | NULL | |
| processed_at 차감 트랜잭션 확정 시각 (NOW() 기본). BD-013 Grace Period 진단 기준. | timestamptz | NOT NULL | now() |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
— DB 코멘트 없음 —
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| item_voucher_id | uuid | NOT NULL | |
| integrated_voucher_id | uuid | NOT NULL | |
| partner_id | uuid | NOT NULL | |
| partner_account_id | uuid | NOT NULL | |
| redemption_type | varchar(20) | NOT NULL | |
| item_count | int | NOT NULL | 1 |
| quantity_redeemed | int | NOT NULL | |
| remaining_after | int | NOT NULL | |
| idempotency_key | varchar(128) | NULL | |
| notes | varchar(500) | NULL | |
| processed_atPK | timestamptz | NOT NULL | now() |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-8 Settlement / SettlementBatchJob: 월별 정산 배치 Job 실행 이력 (1 row = 1 시도).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| settlement_month YYYY-MM 형식 정산 월. CHECK 정규식 강제. | char(7) | NOT NULL | |
| status BatchJobStatus(PENDING/RUNNING/SUCCESS/FAILED). PENDING→RUNNING→SUCCESS|FAILED. | varchar(20) | NOT NULL | 'PENDING'::character varying |
| trigger_type BatchTriggerType(SCHEDULED/MANUAL/RETRY). RETRY 는 parent_job_id 필수. | varchar(20) | NOT NULL | |
| retry_count 재실행 횟수 [0,3]. 한계 초과 시 BATCH_RETRY_LIMIT_EXCEEDED. | int | NOT NULL | 0 |
| parent_job_idFK→settlement_batch_jobs RETRY 시 원본 Job PK. SCHEDULED/MANUAL 은 NULL. | uuid | NULL | |
| triggered_by_admin_idFK→admins MANUAL/RETRY 트리거 관리자. SCHEDULED 는 NULL. FK admins ON DELETE SET NULL. | uuid | NULL | |
| started_at | timestamptz | NULL | |
| completed_at | timestamptz | NULL | |
| processed_partner_count 집계된 파트너 수 (진행 또는 완료 시점 기준). | int | NOT NULL | 0 |
| error_details FAILED 시 에러 메타 JSONB. {code, message, stackTraceSummary, failedPartnerIds[]}. | jsonb | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-8 Settlement / DM-STL-002 / ENT-028: 정산 명세서 (Settlement 0..1, B2C/B2B 공통).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| settlement_idFK→settlements 대상 정산 (FK settlements, UNIQUE — Settlement 0..1). | uuid | NOT NULL | |
| document_url Azure Blob 객체 키 (PDF 등 명세서 파일). 평문 URL/SAS 가 아닌 객체 키만 보관. | text | NOT NULL | |
| status SettlementStatementStatus(DRAFT/PUBLISHED/REVOKED). DOMAIN settlement_statement_status (V002). | varchar(20) | NOT NULL | 'DRAFT'::character varying |
| issued_at PUBLISHED 전환 시각 (status=PUBLISHED 시 NOT NULL — ck_..._published_requires_issued_at). | timestamptz | NULL | |
| revoked_at REVOKED 전환 시각 (status=REVOKED 시 NOT NULL). | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-8 Settlement / DM-STL-001 / ENT-027: 월별 정산 집계 헤더. B2C/B2B 공통(BD-015).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| partner_idFK→partners 정산 대상 파트너 (FK partners, ON DELETE RESTRICT). | uuid | NOT NULL | |
| settlement_month YYYY-MM 형식 (CHAR(7), CHECK ck_settlements_month_format). | char(7) | NOT NULL | |
| total_redemption_count FULLY_USED 차감 건수 누적. | int | NOT NULL | 0 |
| total_redemption_amount_usd FULLY_USED 차감액 누적 (NUMERIC(12,2), CHECK >= 0). | numeric(12,2) | NOT NULL | 0.00 |
| expired_voucher_count EXPIRED 전환 Voucher 수. | int | NOT NULL | 0 |
| expired_settlement_ratio 집계 시점 PartnerFeatureSetting.expired_settlement_ratio 스냅샷 (BR-PFS-004 / BR-STL-012). CHECK 0.0000 ≤ x ≤ 0.5000. | numeric(5,4) | NOT NULL | 0.0000 |
| expired_settlement_amount_usd EXPIRED × ratio 정산 금액. | numeric(12,2) | NOT NULL | 0.00 |
| total_settlement_amount_usd NORMAL 라인 총 정산액 (FULLY_USED + EXPIRED × ratio). | numeric(12,2) | NOT NULL | 0.00 |
| status SettlementStatus(PENDING/CONFIRMED). DOMAIN settlement_status (V002). | varchar(20) | NOT NULL | 'PENDING'::character varying |
| record_type NORMAL=월별 본 집계, REVERSAL=강제 CANCELLED 차감 라인 (BR-STL-CALC-001). | varchar(20) | NOT NULL | 'NORMAL'::character varying |
| batch_type MONTHLY=월별 자동 배치, CHANNEL_TERMINATION=Channel 종료 30일 배치 (BR-STL-B2B-002). | varchar(30) | NOT NULL | 'MONTHLY'::character varying |
| reversal_amount REVERSAL 라인의 차감액 (음수). NORMAL 라인은 NULL. | numeric(12,2) | NULL | |
| original_item_id REVERSAL 라인이 참조하는 원본 ItemVoucher.id. | uuid | NULL | |
| reversal_status ReversalDisputeStatus(DISPUTED/RESOLVED_REJECTED/RESOLVED_ACCEPTED). NORMAL 라인은 NULL. | varchar(20) | NULL | |
| reversal_notified_at | timestamptz | NULL | |
| reversal_grace_deadline | timestamptz | NULL | |
| confirmed_at AW가 PENDING→CONFIRMED 전환한 시각 (UC-NTF-006). | timestamptz | NULL | |
| confirmed_by_admin_idFK→admins 확정 처리 관리자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| statement_document_url API-STL-005 발행된 명세서 URL (캐시). 정규화된 행은 settlement_statements 테이블 참조. | varchar(1024) | NULL | |
| statement_issued_at 명세서 발행 시각. | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
SYS / DM-SYS-002: NotificationPolicy + SystemConfig KV 변경 이력 (append-only). UC-NTF-007/008 정책 감사.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| config_key 변경된 정책 키 (NotificationPolicy.policy_key 또는 SystemConfig.config_key). | varchar(100) | NOT NULL | |
| old_value 변경 직전 값 (JSONB). 첫 변경(legacy 미존재) 인 경우 정책 카탈로그 기본값. | jsonb | NOT NULL | |
| new_value 변경 후 값 (JSONB). PHR 키 저장 금지 (BD-003). | jsonb | NOT NULL | |
| admin_idFK→admins 변경 수행자 (FK admins, ON DELETE SET NULL). | uuid | NULL | |
| changed_at 변경 시각 (감사 SSoT). | timestamptz | NOT NULL | now() |
| value_before SYS / R04-IND-20: SystemConfig 변경 직전 스칼라 값 (TEXT). NotificationPolicy 경로에서는 NULL. | text | NULL | |
| value_after SYS / R04-IND-20: SystemConfig 변경 후 스칼라 값 (TEXT). NotificationPolicy 경로에서는 NULL. | text | NULL | |
| change_reason SYS / BR-SCL-002 / R04-IND-20: 변경 사유 (1~500자). API-CFG-002 필수 필드. | varchar(500) | NULL | |
| actor_ip SYS / R04-IND-20: 변경 행위자 IP (INET, 감사 4요소). | inet | NULL | |
| user_agent SYS / R04-IND-20: 변경 행위자 User-Agent 헤더 (감사 4요소). | varchar(500) | NULL |
SYS / DM-SYS-001: 글로벌 런타임 파라미터 KV (R04-IND-20). BD-013 Grace Period·BD-017 statement_timeout 등 운영 파라미터 정본.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| config_key 파라미터 키 (UNIQUE) — GRACE_PERIOD_SECONDS / STATEMENT_TIMEOUT_MS / ADDON_MAX_COUNT 등. | varchar(100) | NOT NULL | |
| config_value 파라미터 값 (문자열 표현). 숫자·JSON·Boolean 도 모두 TEXT 로 저장 후 value_type 기반 파싱. | text | NOT NULL | |
| value_type SystemConfigValueType (STRING/INTEGER/DECIMAL/BOOLEAN/DURATION/JSON) — 애플리케이션 측 파싱 단서. | varchar(20) | NOT NULL | |
| is_sensitive 민감 파라미터 여부 — TRUE 면 변경 시 재인증 요구·로그 마스킹 (BD-024 / R04-H-04). | boolean | NOT NULL | false |
| description 파라미터 설명 (운영자 가이드). | varchar(500) | NULL | |
| updated_by_admin_idFK→admins 마지막 변경 관리자 (FK admins, ON DELETE SET NULL). 상세 이력은 V016 system_config_logs. | uuid | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
| category SYS / R04-IND-20: 운영 파라미터 분류 (VOUCHER/ORDER/DB/AUTH/NOTIFICATION). API-CFG-001 카테고리 필터. | varchar(20) | NULL | |
| min_value SYS / R04-IND-20: value_type=INTEGER 시 허용 하한값 (BIGINT). NULL 허용. | bigint | NULL | |
| max_value SYS / R04-IND-20: value_type=INTEGER 시 허용 상한값 (BIGINT). NULL 허용. | bigint | NULL |
SYS / 파일 업로드 통합 자산. FileUploadValidator → UploadStorageService → ClamAvScanWorker 파이프라인의 영속 상태. PHR 비취급(BD-003).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| owner_type 업로드 자산 소유 도메인 (예: ETICKET, SETTLEMENT_STATEMENT, INQUIRY_ATTACHMENT). FK 없음 — Polymorphic. | varchar(50) | NOT NULL | |
| owner_id 소유 도메인 row PK (UUID). owner_type 에 따라 e_tickets.id / inquiry_attachments.id 등. | uuid | NULL | |
| bucket Azure Blob Storage 컨테이너 명. 격리 시 ${bucket}-quarantine 으로 이동. | varchar(120) | NOT NULL | |
| object_key Blob 키: {policy}/{yyyy}/{MM}/{dd}/{uuid}.{ext}. UNIQUE — 워커가 blobKey 로 단일 row 식별. | varchar(500) | NOT NULL | |
| original_filename BD-003 sanitize 처리된 안전 파일명 (PHR 키워드 제거 + ASCII 정규화). 원문 PHR 차단. | varchar(255) | NOT NULL | |
| mime_type Magic Number 로 detect 된 실제 MIME (검증기 통과 후). | varchar(120) | NOT NULL | |
| size_bytes 파일 크기(byte). policy.maxSizeBytes 검증 통과 후 영속. | bigint | NOT NULL | |
| sha256 업로드 byte 의 SHA-256 hex (소문자 64). 무결성·중복 식별·감사. | char(64) | NOT NULL | |
| policy_name UploadPolicy enum 명 (ETICKET / PROFILE_IMAGE / INQUIRY_DOC / ...). 라우트 그룹 식별. | varchar(40) | NOT NULL | |
| scan_status PENDING → CLEAN | INFECTED | FAILED 단방향 ClamAV 스캔 상태. | varchar(20) | NOT NULL | 'PENDING'::character varying |
| scan_requested_at PENDING 상태로 row 가 생성되어 스캔 큐에 적재된 시각. | timestamptz | NOT NULL | now() |
| scan_completed_at 워커가 종단 상태(CLEAN/INFECTED/FAILED) 로 갱신한 시각. | timestamptz | NULL | |
| quarantine_key INFECTED 시 격리 컨테이너의 키(quarantine/원본 키). PENDING/CLEAN 시 NULL. | varchar(500) | NULL | |
| infection_signature ClamAV 가 보고한 위협명 (예: Eicar-Test-Signature). PENDING/CLEAN/FAILED 시 NULL. | varchar(255) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-1 Identity / DM-ID-002: Google/Apple/Facebook OAuth 연동 계정 (User 1:N).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| user_idFK→users FK users(id) ON DELETE CASCADE — 사용자 삭제 시 연동 정보도 함께 제거. | uuid | NOT NULL | |
| provider social_provider 도메인 (GOOGLE/APPLE/FACEBOOK). | varchar(20) | NOT NULL | |
| provider_user_id 공급자 측 안정 식별자 (Google sub / Apple sub / Facebook id). | varchar(255) | NOT NULL | |
| provider_email 공급자 제공 이메일 — 가입·연동 시 스냅샷 (NOT synced thereafter, BR-ID-002-001). | varchar(255) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-1 Identity / DM-ID-001: 외국인 의료관광 사용자 계정. status=DELETED 가 soft delete (BR-USR-003).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| email 로그인 이메일 (UNIQUE, 소문자 정규화). | varchar(255) | NOT NULL | |
| password_hash bcrypt 해시. 소셜 전용 계정은 NULL. | text | NULL | |
| name 사용자 표시 이름. | varchar(100) | NOT NULL | |
| status UserStatus(ACTIVE/SUSPENDED/DELETED) — DELETED 는 soft delete. | varchar(20) | NOT NULL | 'ACTIVE'::character varying |
| preferred_language BCP-47 언어 코드 (en/ar/ko/mn 등). UA 기본 en, AW/PW/PA 기본 ko (애플리케이션 결정). | varchar(10) | NOT NULL | |
| last_login_at 마지막 로그인 일시 (휴면 계정 분석·감사용). | timestamptz | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
| token_version BR-AUTH-010 — Refresh Token 무효화 카운터. JWT tv 클레임과 일치해야 통과. 로그아웃·비밀번호 재설정·정지 시 +=1. | int | NOT NULL | 0 |
| deletion_requested_at BR-AUTH-005 사전 검증 통과 시점. status=DELETION_PENDING 진입 시 채워지며, 관리자 승인 후 status=DELETED 로 전이되어도 보존된다. | timestamptz | NULL | |
| nationality 사용자 국적 (ISO 3166-1 alpha-2 또는 자연어, BD-003 비-PHR). | varchar(50) | NULL | |
| phone 사용자 연락처 (PII — AW reveal 시 X-Reauth-Token, BD-003 비-PHR). | varchar(20) | NULL | |
| deletion_reason 계정 삭제 요청 사유 (사용자 입력, AW 검토 큐 표시). | text | NULL | |
| lock_until BR-AUTH-006 — 로그인 5회 연속 실패 잠금 만료 시각. NULL 이면 미잠금. LoginAttemptService 가 SSoT 로 갱신. | timestamptz | NULL |
BC-4 / API-VCH-016~019 — Voucher Cancel SoD 잠금 행. PARTNER_ADMIN 요청 → ADM 승인/반려 2단계 워크플로우. IV/Item 5상태 머신과 분리.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| voucher_id Polymorphic 참조 (FK 없음) — IV 마이그레이션(V040+) 부착 후에도 cascade 영향 회피. | uuid | NOT NULL | |
| partner_idFK→partners 요청 주체 파트너사 PK. PARTNER_ADMIN 본사 범위(✅*) 검증의 기준. | uuid | NOT NULL | |
| requested_by_account_id Polymorphic 참조 (FK 없음) — 요청을 제출한 PartnerAccount PK. AUD-030 요청자 4필드 1호. | uuid | NOT NULL | |
| requested_at 요청 제출 시각 — AUD-030 요청자 4필드 2호 (이벤트 발생 시각). | timestamptz | NOT NULL | |
| reason_code UX 카피 카탈로그 매핑용 사유 코드 (PARTNER_OPERATIONAL / CUSTOMER_DISPUTE / DUPLICATE_PURCHASE / PRODUCT_UNAVAILABLE / FRAUD_SUSPECTED / OTHER). | varchar(40) | NOT NULL | |
| reason_detail 자유 텍스트 사유(2000자 이내). PHR 비취급(BD-003) — 진단명·처방·검사결과 저장 금지. | varchar(2000) | NULL | |
| status REQUESTED → APPROVED | REJECTED | WITHDRAWN 단방향 전이. | varchar(20) | NOT NULL | 'REQUESTED'::character varying |
| approved_or_rejected_by_admin_idFK→admins 결정을 내린 ADM PK (APPROVED/REJECTED 시 필수). admin 삭제 시 SET NULL. | uuid | NULL | |
| decision_at APPROVED/REJECTED 처리 시각. WITHDRAWN/REQUESTED 시 NULL. | timestamptz | NULL | |
| decision_note 관리자 결정 메모(반려 사유 등). 2000자 이내, PHR 비취급. | varchar(2000) | NULL | |
| request_ip AUD-030 요청자 4필드 3호 — 요청 발생 IP (INET). | inet | NULL | |
| request_user_agent AUD-030 요청자 4필드 4호 — 요청 발생 User-Agent. | varchar(500) | NULL | |
| decision_ip AUD-030 승인자 감사 필드 — 결정 발생 IP (INET). | inet | NULL | |
| decision_user_agent AUD-030 승인자 감사 필드 — 결정 발생 User-Agent. | varchar(500) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |
BC-4 / BR-IVC-015 — 1h 배치가 적재한 Voucher invariant 위반 잠금 행. LOCKED → RESOLVED 단방향. 상태 머신은 IV/IVI 와 분리.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_id Polymorphic 참조 (FK 없음). cascade 삭제 / archive 영향 회피. | uuid | NOT NULL | |
| item_voucher_id NULL = IntegratedVoucher 레벨 invariant. 비-NULL = 특정 Item 레벨. | uuid | NULL | |
| drift_type BR-IVC-015 invariant 카테고리 (QUANTITY_MISMATCH / STATE_INVARIANT_VIOLATION / EXPIRY_DRIFT / SETTLEMENT_AMOUNT_DRIFT). | varchar(40) | NOT NULL | |
| detected_at | timestamptz | NOT NULL | |
| expected_snapshot invariant 검출 당시 expected 값 JSONB. drift_type 별 자유 형식. | jsonb | NOT NULL | '{}'::jsonb |
| actual_snapshot invariant 검출 당시 actual 값 JSONB. | jsonb | NOT NULL | '{}'::jsonb |
| status LOCKED → RESOLVED 단방향 운영 상태. IntegratedVoucher 의 5개 상태와 무관. | varchar(20) | NOT NULL | 'LOCKED'::character varying |
| locked_at | timestamptz | NOT NULL | |
| resolved_at | timestamptz | NULL | |
| resolved_by | uuid | NULL | |
| resolution_note 관리자가 잠금 해제 시 입력한 자유 텍스트 (1~2000자, RESOLVED 단계 필수). | varchar(2000) | NULL | |
| root_cause DATA_RACE / MIGRATION_GAP / EXTERNAL_SYNC / OTHER 중 1개. RESOLVED 단계 필수. | varchar(30) | NULL | |
| batch_run_id 1h 배치 실행 ID (UUID). 운영 디버깅/메트릭 라벨에 사용. | uuid | NOT NULL | |
| created_at | timestamptz | NOT NULL | now() |
BC-4 Voucher / DM-VCH-006 / ENT-019: IntegratedVoucher 상태 전이 감사 (Layer 1, append-only).
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_idFK→integrated_vouchers 대상 PASS (FK integrated_vouchers, ON DELETE RESTRICT — 감사 보존). | uuid | NOT NULL | |
| from_status 직전 상태 (최초 INSERT 는 NULL, 이후 행은 NOT NULL 권장). | varchar(30) | NULL | |
| to_status 전환 후 상태 (8상태 머신 enum 값). | varchar(30) | NOT NULL | |
| trigger_type V002 voucher_state_trigger_type — 13개 세부 트리거 (PAYMENT_APPROVED 등). | varchar(40) | NOT NULL | |
| actor_type SYSTEM/USER/PARTNER/ADMIN — ck_vsl_actor_type. | varchar(20) | NOT NULL | |
| actor_id | uuid | NULL | |
| reason | varchar(500) | NULL | |
| event_id Outbox 멱등성 키 (uq_vsl_event_id 부분 유니크 — 동일 이벤트 중복 INSERT 차단). | uuid | NULL | |
| occurred_at | timestamptz | NOT NULL | now() |
| created_at | timestamptz | NOT NULL | now() |
BC-4 Voucher / DM-VCH-005 / ENT-018: PASS Transfer(선물하기) 요청 이력 — PENDING/ACCEPTED/CANCELLED.
| Column | Type | Null | Default |
|---|---|---|---|
| idPK | uuid | NOT NULL | gen_random_uuid() |
| integrated_voucher_idFK→integrated_vouchers 대상 PASS (FK integrated_vouchers, ON DELETE RESTRICT). | uuid | NOT NULL | |
| sender_user_idFK→users 발신자 — 요청 시점 IV 소유자. | uuid | NOT NULL | |
| receiver_email 수신자 이메일 (계정 미가입 상태에서도 발송 가능). | varchar(255) | NOT NULL | |
| receiver_user_idFK→users 수락 후 매칭된 수신자 User PK (ACCEPTED 시 NOT NULL). | uuid | NULL | |
| status V002 voucher_transfer_status (PENDING/ACCEPTED/CANCELLED). PENDING 동안 uq_vt_pending_iv 단일성. | varchar(20) | NOT NULL | 'PENDING'::character varying |
| requested_at | timestamptz | NOT NULL | now() |
| accepted_at | timestamptz | NULL | |
| cancelled_at | timestamptz | NULL | |
| cancel_reason | varchar(255) | NULL | |
| created_at | timestamptz | NOT NULL | now() |
| updated_at | timestamptz | NOT NULL | now() |