코어(필수) 테이블

1) ArtifactSnapshot

필드 타입 설명
id TEXT (PK, uuid) 스냅샷 식별자
domain TEXT cafe
manifestHash TEXT UNIQUE artifact_manifest.json의 해시
version TEXT cafe@0.1.0
createdAt DATETIME 기록 시각

주문 레코드에 artifactId를 FK로 연결해서 재현성 확보.


2) Order

필드 타입 제약
id TEXT (PK, uuid)
artifactId TEXT FK → ArtifactSnapshot(id)
sessionId TEXT FK → Session(id), NULL 대화 세션(없어도 됨)
orderType TEXT TAKE_OUT
status TEXT PENDING
totalPrice INTEGER 원 단위(옵션 합산 추정치)
currency TEXT KRW
notes TEXT 자유 메모(“시럽 없음” 등)
createdAt DATETIME
updatedAt DATETIME

CHECK 제약(SQLite): orderType IN ('TAKE_OUT','DINE_IN'), status IN (...).


3) OrderItem

필드 타입 제약/설명
id TEXT (PK, uuid)
orderId TEXT FK → Order(id)
sku TEXT AMERICANO
display TEXT “아메리카노” (당시 표시명 Snapshot)
qty INTEGER >=1
size TEXT NULL S/M/L (메뉴가 허용할 때만)
temp TEXT NULL ICE/HOT
ice TEXT NULL 권장: less/normal/more (slots.schema.json 기준)
shot INTEGER NULL >=0
sweetness TEXT NULL LESS/REGULAR/MORE
milk TEXT NULL WHOLE/LOWFAT/NONFAT/SOY/OAT/ALMOND
extrasJson TEXT NULL JSON blob(향후 옵션 확장용)

주의: ice 등 enum 표기는 앱의 slots.schema.json과 동일한 토큰으로 맞추세요(예: less|normal|more).


4) OrderItemSyrup (다대다 옵션용)

필드 타입 제약
itemId TEXT FK → OrderItem(id) 복합 PK( itemId, syrup )
syrup TEXT VANILLA/CARAMEL/HAZELNUT/MOCHA
amount INTEGER NULL (선택) 양 표기(+1, +2 등)