import { Address, DayOfWeekTimePeriod, DeliveryFeeConfig, DeliveryMinutesRange, GalleryConfig, Operator, PointProvider } from '../models/store'; import { CustomerPointDetail, MultiLanguageText, OrderDiscount, SOOnlineClosedDate } from '../models'; import { PaymentServiceProvider, ServeType } from '../enums'; import { SOPublicMenu, SOPublicCategory, SOPublicProduct, SOPublicProductAttribute, SOPublicProductAttributeCategory, SOPaymentMethod, SOValidateCart, SOOrderState, SOOrder, SOEater, SOPublicDiscountRule, SOMemberCoupon } from '../models/online-ordering'; import { RoundingMode } from '../enums/rounding-mode.enum'; import { MultipleItems } from './response'; /** * SO = SDIT Online */ /*******************************/ /** SOGetStoreInfo */ /*******************************/ export interface SOGetStoreInfoRequest { storeId: string; /** * undefined: 非內用 */ tableId?: string; subscriptionCheck?: boolean; onlineDisabledCheck?: boolean; } export interface SOGetStoreInfoResponse { storeId: string; /** 地區代碼 ISO 3166-1 alpha-2 ex: TW, SG */ regionCode: string; /** 幣別 ISO 4217 ex: TWD, SGD */ currencyCode: string; /** 訂單金額小數位數 */ orderDecimalDigits: number; /** 品項、附加屬性、折扣...金額小數位數 */ itemDecimalDigits: number; /** 進位模式 */ roundingMode: RoundingMode; /** * 線上店名 * @Default 店內名稱 */ storeName: string; /** * 聯絡電話 */ phone?: string; /** * 店址 */ address?: Address; /** * 根據店址 `address` 取得經緯度 */ addressLonLat?: number[]; /** * 因應政府「網路銷售營業人新制」上路,營業人資訊揭露 */ businessEntity?: { name: string; idNumber: string; }; /** * 線上店營業時間 * @Default [] */ openingHours: DayOfWeekTimePeriod[]; /** * 橫幅 */ bannerConfig: GalleryConfig; /** * 點餐公告 * @Default {zh-TW: ''} */ orderAnnouncement: MultiLanguageText; /** * 結帳公告 * @Default {zh-TW: ''} */ checkoutAnnouncement: MultiLanguageText; /** * 關閉訂單備註輸入 * @Default false */ orderNoteHidden: boolean; /** 訂單備註是否必填 */ orderNoteRequired: boolean; /** 訂單備註 placeholder;未設定時由客端使用既有 i18n fallback。 */ orderNotePlaceholder?: MultiLanguageText; /** 顧客姓名是否顯示 */ customerNameDisplay: boolean; /** 顧客姓名是否必填 */ customerNameRequired: boolean; /** 顧客電話是否顯示 */ customerPhoneDisplay: boolean; /** 顧客電話是否必填 */ customerPhoneRequired: boolean; /** * 關閉訂單品項備註輸入 * @Default false */ orderItemNoteHidden: boolean; /** * 關閉統編/載具輸入 * 若沒啟用統一發票強制 false (KPOS) * @Default true */ buyerIdInputHidden: boolean; /** * 線上店到untilOpen之後可接單 * 設Infinity為永久停業 * @Default null */ untilOpen: number; /** * 是否使用線上點餐 * @Default false */ enabled: boolean; /** * 線上點餐支付方式 * @Default [現場付款] */ paymentMethods: SOPaymentMethod[]; /** * 線上點餐預計等待時間(分) * @Default 30 */ onlineEstimatedReadyForPickupTime: number; /** * 開啟預訂功能 * @Default false */ reserveEnabled: boolean; /** * 最多可提前預訂天數:可選日期上界 = 今天 + N 天(含當日)。 * 與 reserveMinDays 構成閉區間 [今天+reserveMinDays, 今天+availableReservedDays]。 * @Default 7 */ availableReservedDays?: number; /** * 是否停用立即取餐;undefined / false 均表示可立即取餐。 * @Default false */ immediatePickupDisabled?: boolean; /** * 最少需提前預訂天數:可選日期下界 = 今天 + N 天,該日可選(閉區間)。比較粒度為日曆日。 * 後端輸出時已夾為 min(availableReservedDays, soReserveMinDays)。 * undefined / 0 均表示今天起可預訂。 * @Default 0 */ reserveMinDays?: number; /** * 查詢範圍內的公休日。後端至少回傳「今天起 30 個日曆日」與可預訂區間的聯集。 */ closedDates: SOOnlineClosedDate[]; /** * 是否開啟店家外送功能 * @Default false */ storeDeliveryEnabled: boolean; /** * 外送費 @Default 0 */ storeDeliveryCharge: number; /** * 免外送費門檻 @Default 0 */ storeDeliveryFreeThresholdAmount: number; /** * 外送距離限制 @Default 0 * 0=沒有限制 */ storeDeliveryDistanceLimit: number; /** 新版外送費規則;未設定時仍依舊版三個 storeDelivery 欄位。 */ deliveryFeeConfig?: DeliveryFeeConfig; /** 外送預留時間(備餐完成後到送達的分鐘區間);未設定時不顯示預估送達時間。 */ storeDeliveryEta?: DeliveryMinutesRange | null; /** * 是否可使用地址定位與距離計算。 * 此值由後端依門市合約權限衍生,前端不得自行用方案 ID 推導。 */ deliveryLocationEnabled: boolean; /** * 內用桌ID */ tableId?: string; /** * 內用桌名稱 */ tableName?: string; /** * 此 table QR 是否成功解析到桌邊 profile。 * 僅供入口呈現使用;不包含 profile ID、名稱、桌號或原始設定。 */ isTableOrderProfile: boolean; /** * Cognito user pool 登入的 OIDC provider * @Default undefined * undefined: Line */ availableFederatedProvider?: string; /** * 是否開放訪客點餐 * @Default undefined * undefined/true: 開放 * false: 不開放 */ availableGuest?: boolean; /** * @deprecated Cognito專用,PoskyIdentity請改用 `userPoolWebClientIdV2` * * Cognito user pool web client id * @Default undefined */ userPoolWebClientId?: string; /** * PoskyIdentity web client id * 由Brand決定,如果沒有Brand,會給 Posky Default User Pool * @Default Posky Default User Pool client id */ userPoolWebClientIdV2: string; /** * 是否啟用集點 * @Default brand的設定 * undefined/true: 開啟 * false: 不開啟 */ storePointsEnabled?: boolean; /** * 點數供應商 */ storePointsProvider?: PointProvider; /** * 點數名稱 */ storePointsName?: string; /** * 品牌 */ brandNo?: string; brand?: any; /** * 會員功能 */ storeMemberEnabled?: boolean; /** * 優惠券功能 */ storeCouponsEnabled?: boolean; /** 加入購物車時,是否與相同品相合併 */ mergeSameItem?: boolean; /** 是否顯示商品剩餘可售數量 */ showRemainingQty?: boolean; /** 剩餘可售數量小於等於此值才顯示;null/undefined 代表有追蹤數量就顯示 */ remainingQtyThreshold?: number | null; /** 內用服務費 1~100(%) undefined為關閉 */ dineInServiceChargePercent?: number; /** 外帶服務費 1~100(%) undefined為關閉 */ takeoutServiceChargePercent?: number; /** * 服務費計算基準,無值時預設subtotal * "subtotal": serviceCharge = (subtotal * servicePercent) * "subtotal+discount": serviceCharge = ((subtotal+discount) * servicePercent) */ serviceBase?: 'subtotal' | 'subtotal+discount'; /** * LINE LIFF app id,用於 LIFF 初始化 * 由店家/品牌設定,無值時不初始化 LIFF */ liffId?: string; } /*******************************/ /*******************************/ export interface SOGetStoreMenuRequest { storeId: string; /** * undefined: 現在 */ when?: number; serveType?: ServeType; } export interface SOGetStoreMenuResponse { discountRules: SOPublicDiscountRule[]; menus: SOPublicMenu[]; categories: SOPublicCategory[]; products: SOPublicProduct[]; /** * 只顯示可見的註記 */ attributes: SOPublicProductAttribute[]; /** * 只顯示可見的註記類別 */ attributeCategories: SOPublicProductAttributeCategory[]; } export interface SOGetPopularProductsRequest { storeId: string; when?: number; serveType?: ServeType; } export interface SOGetPopularProductsResponse extends MultipleItems { } export interface SOGetBestPairingsRequest { storeId: string; productId: string; when?: number; serveType?: ServeType; } export interface SOGetBestPairingsResponse extends MultipleItems { } export interface SOGetMyMemberCouponsRequest { storeId: string; limit?: number; paginationToken?: string; } export interface SOGetMyMemberCouponsResponse extends MultipleItems { } /** * `GET /online-ordering/v4/private/member/overview` 的對外請求格式 */ export interface SOGetMyMemberOverviewRequest { } /** * 線上點餐對外會員概要 DTO * 目前欄位對齊 POSKY CRM overview */ export interface SOMemberOverview { memberNo: string; memberPoolNo: string; idpSub: string | null; name: string; birthday: string | null; gender: number | null; email: string | null; phoneNumber: string | null; address: string | null; carrier: string | null; totalPoints: number; expiringPoints: number; expirationDatetime: string | null; } /** * `GET /online-ordering/v4/private/member/overview` 的對外回傳格式 * 未入會時回 `{ isMember: false, member: null }` * 系統異常走既有 API 錯誤流程,不包成 200 回傳 */ export interface SOGetMyMemberOverviewResponse { /** 目前登入者是否已加入該品牌會員池 */ isMember: boolean; /** 已入會時回會員資料,否則為 null */ member: SOMemberOverview | null; } /*******************************/ /*******************************/ export interface SOValidateMutationRequest { storeId: string; /** table QR 的桌號;外送時也必須保留此值。 */ tableId?: string; traceId: string; serveType: ServeType; /** * 預計取餐時間 timestamp ms * 不給值 = 盡快 */ expectedPickupAt?: number; cart: SOValidateCart; isUsePoints?: boolean; /** 要套用的會員優惠券 ID */ memberCouponId?: string; /** 消費者填寫的結構化外送地址。 */ deliveryAddress?: Address; /** PROMAX 店家專用的道路距離 token;不接受瀏覽器自行傳入的距離或座標。 */ deliveryLocationRouteToken?: string; } export interface SOCreateDeliveryLocationQuoteRequest { storeId: string; deliveryAddress: Address; /** 後端簽發的目的地座標 token;可跨店重用,不包含店家道路距離。 */ deliveryLocationToken?: string; } /** 後端簽發的無時效目的地與道路距離 token;前端只保存與回傳。 */ export interface SOCreateDeliveryLocationQuoteResult { deliveryLocationToken: string; deliveryLocationRouteToken: string; distanceKm: number; } export declare type SOCreateDeliveryLocationQuoteResponse = SOCreateDeliveryLocationQuoteResult; /** * @throw `SOOrderError` */ export interface SOValidateMutationResponse { storeId: string; traceId: string; /** 目前套用的會員優惠券 ID */ memberCouponId?: string; /** * 小計 */ subtotal: number; /** * 折扣 */ discount: OrderDiscount; /** * 總折扣金額 */ totalDiscountAmount: number; /** * 外送費 * undefined=沒有此收費名目 */ deliveryCharge?: number; /** * 服務費 * undefined=沒有此收費名目 */ serviceCharge?: number; /** * 服務費費率 * undefined=沒有此收費名目 */ serviceChargePercent?: number; /** * 點數折抵前總金額=小計+折扣+外送費+服務費 */ totalBeforePoints: number; /** * 點數折抵後總金額=購物車總金額-本次折抵點數 */ totalAmount: number; /** * 剩餘總點數 */ pointsBalance?: number; /** * 本次折抵點數 */ usedPoints?: number; /** * 本次折抵金額 */ pointsDiscountAmount?: number; /** 點數異常訊息 */ pointsErrorMsg?: string; /** * 是否有折扣錯誤 */ discountErrorMsg?: string; /** 目前套用的會員優惠券套用失敗原因 */ memberCouponErrorMsg?: string; } /*******************************/ /*******************************/ export interface SOSendOrderRequest { storeId: string; serveType: ServeType; eater: SOEater; cart: SOValidateCart; /** 要套用的會員優惠券 ID */ memberCouponId?: string; /** * 是否為現場付款 * 選擇現場付款的訂單,會馬上成立無法再改付款方式。 */ isOnSitePayment: boolean; /** * 包裝、免洗餐具 */ includeDisposableItems: boolean; /** * 預計取餐時間 timestamp ms * 不給值 = 盡快 */ expectedPickupAt?: number; /** * 消費者收件地址。 * * serveType === deliveryByStore 時有效。 */ deliveryAddress?: Address; /** PROMAX 店家專用的道路距離 token。 */ deliveryLocationRouteToken?: string; /** * 桌邊 QR 的桌號。桌邊內用與由桌邊 profile 發起的店家外送都必須保留此值。 */ tableId?: string; /** 折抵點數 */ points?: CustomerPointDetail; /** 是否折抵點數 */ isUsePoints?: boolean; } /** * @throw `SOOrderError` */ export interface SOSendOrderResponse { /** online Order Id */ id: string; state: SOOrderState; /** 消費者識別用 id的末五碼 == Order.serialNumber */ displayId: string; isOnSitePayment: boolean; /** 取餐號碼 */ posSerialNumber?: string; } /*******************************/ /*******************************/ export interface SOGetPaymentUrlRequest { storeId: string; /** online Order Id */ id: string; /** 預設 MyPayPayPage */ provider?: PaymentServiceProvider; /** * 以MyPay為例 * 可在產生付款網址時,決定returnUrl * 若不填寫,則以MyPay特約店家後台設定的為主 */ successReturnUrl?: string; /** * 以MyPay為例 * 可在產生付款網址時,決定returnUrl * 若不填寫,則以MyPay特約店家後台設定的為主 */ failureReturnUrl?: string; } export interface SOGetPaymentUrlResponse { payUrl: string; } /*******************************/ /*******************************/ export interface SOCancelOrderRequest { storeId: string; /** online order id */ id: string; } export interface SOCancelOrderResponse { storeId: string; /** online order id */ id: string; state: SOOrderState; } /*******************************/ /*******************************/ export interface SOGetOrderRequest { storeId: string; /** online order id 二選一*/ id?: string; /** pos order id 二選一*/ orderId?: string; } export interface SOGetOrderResponse { storeId: string; order: SOOrder; } /*******************************/ /*******************************/ export interface SOChangeStoreStatusRequest { storeId: string; operator?: Operator; isOpen: boolean; enabled: boolean; } export declare type SOChangeStoreStatusResponse = null;