diff --git a/db/migrations/010_delivery_charter.sql b/db/migrations/010_delivery_charter.sql new file mode 100644 index 0000000..bd59110 --- /dev/null +++ b/db/migrations/010_delivery_charter.sql @@ -0,0 +1,33 @@ +-- 010_delivery_charter.sql +-- v0.4 (2026-04-27) +-- 발주서에 택배비/용차비 라인 + 택배 전용 품목 자동 라인 지원 + +BEGIN; + +-- 1. momo_items: 택배 전용 플래그 +ALTER TABLE momo_items + ADD COLUMN IF NOT EXISTS requires_delivery CHAR(1) NOT NULL DEFAULT 'N'; +COMMENT ON COLUMN momo_items.requires_delivery + IS '택배 전용 품목 (Y) — 카트에 담기면 택배 라인이 자동으로 추가됨'; + +-- 2. momo_order_items: 라인 종류 + 라벨 +-- kind: 'ITEM'(품목) / 'DELIVERY'(택배비) / 'CHARTER'(용차비) +ALTER TABLE momo_order_items + ADD COLUMN IF NOT EXISTS kind VARCHAR(16) NOT NULL DEFAULT 'ITEM', + ADD COLUMN IF NOT EXISTS extra_label VARCHAR(100); +COMMENT ON COLUMN momo_order_items.kind + IS 'ITEM=품목 / DELIVERY=택배비 / CHARTER=용차비'; +COMMENT ON COLUMN momo_order_items.extra_label + IS '택배비/용차비 라인의 담당자명 또는 부가 메모'; + +-- 기존 가맹 데이터는 ITEM 으로 간주 +UPDATE momo_order_items SET kind = 'ITEM' WHERE kind IS NULL; + +-- 3. momo_orders: 택배비/용차비 합계 (집계 편의용) +ALTER TABLE momo_orders + ADD COLUMN IF NOT EXISTS total_delivery NUMERIC(15,2) DEFAULT 0, + ADD COLUMN IF NOT EXISTS total_charter NUMERIC(15,2) DEFAULT 0; +COMMENT ON COLUMN momo_orders.total_delivery IS '택배비 라인 합계'; +COMMENT ON COLUMN momo_orders.total_charter IS '용차비 라인 합계'; + +COMMIT; diff --git a/next.config.ts b/next.config.ts index c5058e1..5190f8d 100644 --- a/next.config.ts +++ b/next.config.ts @@ -6,6 +6,10 @@ const nextConfig: NextConfig = { output: "standalone", // 프로젝트 루트 강제 고정 (상위 디렉토리 오탐 방지) outputFileTracingRoot: path.join(__dirname), + // standalone 빌드 시 마이그레이션 SQL/스크립트도 함께 포함 (컨테이너에서 실행되도록) + outputFileTracingIncludes: { + "*": ["./db/migrations/**/*", "./scripts/migrate-momo.mjs"], + }, }; export default nextConfig; diff --git a/src/app/(mobile)/m/admin/items/page.tsx b/src/app/(mobile)/m/admin/items/page.tsx index 7e192dd..4a9c0da 100644 --- a/src/app/(mobile)/m/admin/items/page.tsx +++ b/src/app/(mobile)/m/admin/items/page.tsx @@ -21,6 +21,7 @@ interface Item { ATTRIBUTES: Record | null; MAX_ORDER_QTY: number | null; IS_HIDDEN: string; + REQUIRES_DELIVERY: string; } interface Maker { OBJID: string; MAKER_NAME: string } @@ -80,7 +81,7 @@ export default function AdminItemsPage() { }; const openNew = () => { - setEditing({ ITEM_NAME: "", UNIT: "EA", IS_TAX_FREE: "N", STATUS: "ACTIVE", IS_HIDDEN: "N", MAX_ORDER_QTY: null }); + setEditing({ ITEM_NAME: "", UNIT: "EA", IS_TAX_FREE: "N", STATUS: "ACTIVE", IS_HIDDEN: "N", MAX_ORDER_QTY: null, REQUIRES_DELIVERY: "N" }); setAttrs({}); }; @@ -103,6 +104,7 @@ export default function AdminItemsPage() { attributes: Object.keys(attrs).length > 0 ? attrs : null, maxOrderQty: editing.MAX_ORDER_QTY ?? null, isHidden: editing.IS_HIDDEN === "Y" ? "Y" : "N", + requiresDelivery: editing.REQUIRES_DELIVERY === "Y" ? "Y" : "N", }; const res = await fetch("/api/m/items/save", { method: "POST", @@ -260,6 +262,9 @@ export default function AdminItemsPage() { {it.MAX_ORDER_QTY != null && Number(it.MAX_ORDER_QTY) > 0 && ( ≤{it.MAX_ORDER_QTY} )} + {it.REQUIRES_DELIVERY === "Y" && ( + 택배 + )}