Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
36 lines
2.8 KiB
JavaScript
36 lines
2.8 KiB
JavaScript
/**
|
|
* portal/commerce/model.mjs — 상거래 영역 세부 표(§6·§27).
|
|
*
|
|
* 중심 표 orders·product_versions·settings 는 portal/core/model.mjs 에 있고, 여기서는 다음을 더한다.
|
|
* orders 추가 열 entitlement_ids_json(승인 때 부여한 권리 id — 재승인해도 중복 부여하지 않는 근거), terms_json(동의한 약관 버전), subscription_id
|
|
* subscriptions 활성 상품(그룹의 구독). 갱신 예정일·갱신 결제 대기·축소 예약·해지 예약을 가진다
|
|
* credits 환불·크레딧 원장(운영자만 기록)
|
|
* downsize_holds 축소 보류: 새 한도 안에 들어오지 않아 정리해야 할 항목 목록과 재검증 결과
|
|
* overage_optins 초과 사용 허용: 항목별 최대 금액/사용량·기간·철회
|
|
*/
|
|
export const MIGRATIONS = [{ id: 'commerce_0001', sql: `
|
|
ALTER TABLE orders ADD COLUMN entitlement_ids_json TEXT;
|
|
ALTER TABLE orders ADD COLUMN terms_json TEXT;
|
|
ALTER TABLE orders ADD COLUMN subscription_id TEXT;
|
|
CREATE TABLE IF NOT EXISTS subscriptions (
|
|
id TEXT PRIMARY KEY, group_id TEXT NOT NULL, product_version_id TEXT NOT NULL, order_id TEXT, items_json TEXT NOT NULL, billing_cycle TEXT NOT NULL,
|
|
amount INTEGER NOT NULL, tax INTEGER NOT NULL, total INTEGER NOT NULL, currency TEXT NOT NULL DEFAULT 'KRW',
|
|
status TEXT NOT NULL DEFAULT 'active', started_at TEXT NOT NULL, next_billing_at TEXT, renewal_order_id TEXT, renewal_notified_at TEXT,
|
|
payment_due_at TEXT, restrict_at TEXT, cancel_at TEXT, cancel_requested_at TEXT, cancelled_at TEXT, entitlement_ids_json TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
);
|
|
CREATE INDEX IF NOT EXISTS subscriptions_group ON subscriptions(group_id, status);
|
|
CREATE TABLE IF NOT EXISTS credits (
|
|
id TEXT PRIMARY KEY, group_id TEXT NOT NULL, kind TEXT NOT NULL, amount INTEGER NOT NULL, currency TEXT NOT NULL DEFAULT 'KRW', order_id TEXT, reason TEXT, created_by TEXT, created_at TEXT NOT NULL, applies_at TEXT, applied_order_id TEXT
|
|
);
|
|
CREATE INDEX IF NOT EXISTS credits_group ON credits(group_id, created_at);
|
|
CREATE TABLE IF NOT EXISTS downsize_holds (
|
|
id TEXT PRIMARY KEY, group_id TEXT NOT NULL, subscription_id TEXT, target_product_version_id TEXT NOT NULL, items_json TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'holding',
|
|
shortages_json TEXT NOT NULL, last_checked_at TEXT NOT NULL, order_id TEXT, created_by TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
);
|
|
CREATE TABLE IF NOT EXISTS overage_optins (
|
|
id TEXT PRIMARY KEY, group_id TEXT NOT NULL, resource TEXT NOT NULL, cap_amount INTEGER, cap_units INTEGER, unit_price_json TEXT, period_start TEXT NOT NULL, period_end TEXT NOT NULL,
|
|
created_by TEXT, created_at TEXT NOT NULL, revoked_at TEXT, revoked_by TEXT
|
|
);
|
|
CREATE INDEX IF NOT EXISTS overage_group ON overage_optins(group_id, resource);
|
|
` }];
|