export default class Menu { menu: undefined } declare global { // 餐點 export interface IMenu { id: string version: number merchantId: string stepId: string // ex. Main Dish, Drinks categoryId: string // ex. Dinner Set 1 menuId?: string // 套餐才有,指向餐點的原始 IMenu.id menuCategoryId?: string shortName?: string name: string desc: string translations: IMenuTranslation[] image: string // url weekdays: number[] timerange: ITimeslot[] promotedTimerange: ITimeslot[] promotedDays?: number[] | null tags: IMenuTag[] price: number discount: number // 設定給餐點的固定折扣 prices?: IMenuPrice[] | null max?: number priceUndetermined: boolean nonTakeawayDisabled: boolean takeawayDisabled: boolean options: IMenuOptionGroup[] promoted: boolean promotedWeight: number defaultSelected: boolean defaultQuantity: number sold: boolean // 售完 disabled: boolean excludedDiscount: boolean excludedSurcharge: boolean required: boolean deleted: boolean step: string stepIndex: number weight: number openingPrompt: boolean code: string inventory: number stockAlertLevel: number printerSetting: string createdAt: string // UTC ISO string } // 套餐 export interface ISet extends IMenu { steps: ISetStep[] waiterOnly: boolean disabled: boolean } // 套餐餐點 export interface ISetMenu extends IMenu { min?: number // 套餐中最少需點幾份 } export interface IMenuTranslation { locale: string name: string desc: string } // 套餐步驟 export interface ISetStep { key: string // from db name: string desc: string locale?: string min: number max: number optional: boolean dependsOnSetMenuItem: string autoNextStep: boolean overrideMinMax: number } export interface IMenuTag { id?: string name: string locale?: string image?: string // url } export interface IMenuPrice { type: string price: number discount: number } // 餐點中的選項 export interface IMenuOptionGroup { id: string name: string options: IMenuOptionItem[] multiple: boolean min: number max: number } // 餐點中的選項項目 export interface IMenuOptionItem { id: string name: string price: number max: number hidden: boolean } export interface ITimeslot { hour: number minute: number second: number } export interface IGetCategorySetsQuery { tags: string[] promoted: boolean soldOut: boolean takeaway: boolean search: string time: Date } export interface ICreateCategoryRequestData { parentId: string name: string desc: string locale: string isSet: boolean days: number[] start: ITimeslot end: ITimeslot waiterOnly: boolean takeawayOnly: boolean excludedDiscount: boolean excludedSurcharge: boolean code: string type?: 'SINGLE' | 'SET' } export interface ICreateSetRequestData { name: string desc: string locale: string categoryID: string price: number discount: number priceUndetermined: boolean promoted: boolean excludedDiscount: boolean excludedSurcharge: boolean weight: number days: number [] start: ITimeslot end: ITimeslot code: string shortName: string promotedStart: ITimeslot promotedEnd: ITimeslot promotedDays: number [] } export interface IUpdateSetRequestData extends ICreateSetRequestData { openingPrompt: boolean inventory: number stockAlertLevel: number } export interface ICreateMenuRequestData { name: string desc: string locale: string categoryID: string price: number discount: number priceUndetermined: boolean promoted: boolean excludedDiscount: boolean excludedSurcharge: boolean weight: number days: number[] start: ITimeslot end: ITimeslot code: string shortName: string promotedStart: ITimeslot promotedEnd: ITimeslot promotedDays: number[] } export interface IUpdateTakeawayPriceRequestData { type: TDeliveryType price: number discount: number remove: boolean } export interface IUpdateSetMenuRequestData { categoryID: string setID: string price: number priceUndetermined: boolean min: number max: number promoted: boolean promotedStart: ITimeslot promotedEnd: ITimeslot defaultSelected: boolean defaultQuantity: number code: string shortName: string excludedDiscount: boolean excludedSurcharge: boolean required: boolean } }