import { PaymentType } from './../enums/payment-type'; import { ServeType } from './../enums/serve-type'; import { PaymentServiceProvider } from './../enums/payment-service-provider'; import { InvoiceStatusType } from './../enums/invoice-status-type'; import { ReceiptStatusType } from '../enums/receipt'; import { InvoiceConfig, Tax } from './invoice-config'; import { InvoiceCarrierType } from './../enums/invoice-carrier-type'; import { OrderStatus } from '../enums/order-status'; import { DiscountModuleTypeEnum, OrderSourceType, CloseType, OrderItemPaidStatus, OrderItemStatus } from '../enums'; import { Receipt, Transaction } from './receipt'; import { Customer, CustomerPointDetail } from './customer'; import { Address, Operator } from './store'; import { OnlinePlatformType, OOReasonCode, OnlineOrderMappingWarningCode } from './online-integration'; import { SOEater, SOOperateParty } from './online-ordering'; import { DeliveryRecipient, DeliveryTask } from './delivery'; import { DiscountMethod } from './discount-module'; import { OrderBuffet } from './buffet'; export interface BaseOrder { id?: string; source: OrderSourceType; customerId?: string; customer?: Customer; /** 此訂單來自線上點餐XX平台 */ onlinePlatformType?: OnlinePlatformType; /** 外部線上點餐平台訂單ID */ onlinePlatformOrderId?: string; items: OrderItem[]; /** sigma(items.amount) */ subtotal: number; /** subtotal - sigma(discount.discountReferences.orderItemId === null) */ totalAmount: number; salesAmountExcludeTax: number; exemptTaxSalesAmount: number; zeroTaxSalesAmount: number; taxAmount: number; discount?: OrderDiscount; /** 由KIOSK、線上點餐、..端給定的序號 */ serialNumber: string; note?: string; createdAt: number; multipleReceipts?: Receipt[]; /** 接受時間 */ acceptedAt?: number; /** 拒絕時間 */ rejectedAt?: number; /** KIOSK, onlinePlatform 取消時間 */ canceledAt?: number; /** 拒絕外部訂單操作人 */ rejectedBy?: Operator; /** 取消外部訂單操作人,若第三方系統取消,則為undefined */ canceledBy?: Operator; /** 拒絕外部訂單理由 */ rejectedReasonCode?: string; /** 拒絕外部訂單理由 */ rejectedReason?: string; /** 取消外部訂單理由 */ canceledReasonCode?: string; /** 取消外部訂單理由 */ canceledReason?: string; /** * 線上訂單。 * 若消費者要打統編,會記錄在這裡 * @deprecated 一律記在 `onlineBuyer.buyerId` */ buyerId?: string; /** 線上訂購人 */ onlineBuyer?: SOEater; /** 訂單取消方 */ canceledByParty?: SOOperateParty; /** * 線上點餐、UberEats等等外送平台,線上成功收款後的 * Transaction會暫時存在這個Property,待POS接單後, * 再將這個Transaction包成Receipt */ externalPayment?: Transaction; } export interface Order extends BaseOrder { id?: string; /** * 標記此 `Order` 為吃到飽主單;非吃到飽訂單不出現。 * 吃到飽主單的 `items` 只保存開桌時的「方案商品 × 人數」,後續加點一律存在 `OrderAddition`。 */ orderingMode?: 'buffet'; /** 吃到飽主單的方案、時間與結束資訊摘要;只由開桌、送出加點與關桌 Use Case 寫入。 */ buffet?: OrderBuffet; source: OrderSourceType; status?: OrderStatus; numberOfCustomers?: number; customerCognitoId?: string; customerId?: string; customer?: Customer; /** * 顧客想套用、但本單未必已實際套用在 discount.discountReferences 的會員優惠券 ID * 例如櫃檯付款時,可交由 POS 重新驗證並套用 */ requestedMemberCouponId?: string; serveType: ServeType; tableName: string; /** If `serveConfig.hasTableEntity === true`, tableId should not be undefined */ tableId?: string; /** 此訂單來自線上點餐XX平台 */ onlinePlatformType?: OnlinePlatformType; /** 外部線上點餐平台訂單ID */ onlinePlatformOrderId?: string; /** 紀錄餐點預計完成時間 */ estimatedReadyForPickupAt?: number; /** 出單次數,初始為undefined,第一次出單為0,每出單一次+1 */ currentRound?: number; items: OrderItem[]; /** sigma(items.amount) */ subtotal: number; /** 外送費 */ deliveryCharge?: number; /** * 服務費 * undefined=沒有此收費名目 */ serviceCharge?: number; /** 服務費費率undefined=沒有此收費名目 */ serviceChargePercent?: number; /** subtotal - sigma(discount.discountReferences.orderItemId === null) + deliveryCharge */ totalAmount: number; salesAmountExcludeTax: number; exemptTaxSalesAmount: number; zeroTaxSalesAmount: number; taxAmount: number; discount?: OrderDiscount; /** 由KIOSK、線上點餐、..端給定的序號 */ serialNumber: string; /** 由POS端給定的序號 */ posSerialNumber?: string; note?: string; createdAt: number; multipleReceipts?: Receipt[]; /** Use attachPayment method to add this info */ /** @Deprecated */ payment?: OrderPayment; /** Use issueInvoice method to add this info */ /** @Deprecated */ invoice?: OrderInvoice; /** Created by attachPayment method */ /** @Deprecated */ receipt?: OrderReceipt; /** @Deprecated */ invoiceConfig: InvoiceConfig; /** Created by aggregateOrderData method */ aggregationInfo?: AggregationInfo; /** 接受時間 */ acceptedAt?: number; /** 拒絕時間 */ rejectedAt?: number; /** 廚房開始準備時間 */ preparingAt?: number; /** 廚房出餐時間 */ completedAt?: number; /** 出餐時間 */ confirmedAt?: number; /** POS刪除時間 */ deletedAt?: number; /** KIOSK, onlinePlatform 取消時間 */ canceledAt?: number; /** 顧客離開時間 */ leftAt?: number; createdBy?: Operator; deletedBy?: Operator; /** 拒絕外部訂單操作人 */ rejectedBy?: Operator; /** 取消外部訂單操作人,若第三方系統取消,則為undefined */ canceledBy?: Operator; /** 拒絕外部訂單理由 */ rejectedReasonCode?: OOReasonCode; /** 拒絕外部訂單理由 */ rejectedReason?: string; /** 取消外部訂單理由 */ canceledReasonCode?: OOReasonCode; /** 取消外部訂單理由 */ canceledReason?: string; onlineOrderMappingWarning?: { code: OnlineOrderMappingWarningCode; message: string; }[]; /** * 線上訂單。 * 若消費者要打統編,會記錄在這裡 * @deprecated 一律記在 `onlineBuyer.buyerId` */ buyerId?: string; /** 線上訂購人 */ onlineBuyer?: SOEater; /** 線上團購所有人 */ onlineBuyers?: SOEater[]; /** 包裝、免洗餐具 */ includeDisposableItems?: boolean; /** 購買人預期取餐時間 */ expectedPickupAt?: number; /** 訂單取消方 */ canceledByParty?: SOOperateParty; /** 消費者收件地址 */ deliveryAddress?: Address; /** 建立配送所需的收件人資料;店家 sender 由 SDIT 後端查詢。 */ deliveryRecipient?: DeliveryRecipient; /** * 米特建立後產生的完整配送任務。 * * 店家自行配送時不建立空物件,直接不提供此欄位。 */ deliveryTask?: DeliveryTask; /** * 線上點餐、UberEats等等外送平台,線上成功收款後的 * Transaction會暫時存在這個Property,待POS接單後, * 再將這個Transaction包成Receipt */ externalPayment?: Transaction; /** * 訂單使用的點數 */ points?: CustomerPointDetail[]; /** * Posky CRM memberNo */ memberNo?: string; } export interface OrderItem { id?: string; productCategoryId?: string; productId?: string; /** * 附餐時:自我關聯 id * 單品/套餐時:undefined */ parentId?: string; name: string; /** amount of single product */ productAmount: number; productTax: Tax; attributes: OrderItemAttr[]; /** * 經由註記調整價格後的一個品項金額 * 原價 `productAmount` + 註記總價 `Sum(attribute.additionalAmount)` */ subtotal?: number; /** * 一個品項的手動折扣方式 */ manualDiscountMethod?: DiscountMethod; /** * 一個品項的折扣金額,為`subtotal`與`discountMethod`計算後結果 */ discountAmount?: number; quantity: number; /** * (`subtotal` - `discountAmount`) * `quantity` */ amount: number; status?: OrderItemStatus; /** 所屬第x次出單的品項,初始為undefined,第一次出單為0,每出單一次+1 */ round?: number; changelogs?: OrderItemChangelog[]; paidStatus?: OrderItemPaidStatus; /** 建立時間 */ createdAt?: number; /** 廚房開始準備時間 */ preparingAt?: number; /** 廚房出餐時間 */ completedAt?: number; /** 出餐時間 */ confirmedAt?: number; /** POS刪除時間 */ deletedAt?: number; note?: string; createdBy?: Operator; deletedBy?: Operator; checkedOutBy?: Operator; /** 點這個orderItem的人的ID,對應到Order.onlineBuyers */ onlineBuyerId?: string; /** 全單折扣分攤 */ sharedOrdersDiscountPrice?: number; /** 品項折扣分攤 */ sharedItemDiscountAmount?: number; /** 是否贈品/加購品 */ isAddOn?: number; } export interface OrderItemChangelog { timestamp: number; quantity?: number; amount?: number; attributes?: OrderItemAttr[]; note?: string; manualDiscountMethod?: DiscountMethod; discountAmount?: number; modifiedBy?: Operator; } export interface OrderItemAttr { attributeId: string; name: string; /** attr單價 */ additionalAmount: number; /** 當舊資料此欄為undefined時,quantity應視為1 */ quantity?: number; /** * attr單價 * quantity * 舊資料此欄為undefined時,quantity應視為1,totalAmount為additionalAmount */ totalAmount?: number; } export interface OrderPayment { paymentServiceProvider: PaymentServiceProvider; paymentType: PaymentType; /** Transaction ID provided by third party payment vendor after payment. */ transactionId: string; /** PaidAt provided by third party payment vendor after payment. */ paidAt: number; cardBrand?: string; maskedCardNo?: string; terminalId?: string; merchantId?: string; /** Used to record the payment results provided by third-party payment vendor */ detail: any; /** Used to record info of refund. */ refundPayload?: RefundPayload; operator?: Operator; } /** @Deprecated */ export interface OrderInvoiceRequest { /** Get from User Input */ buyerId: string; /** Get from invoice service takeInvoiceNumber */ invoiceNumber: string; /** Get from User Input */ loveCode: string; /** Get from User Input */ carrierId: string; } export interface OrderInvoice { buyerId: string; loveCode: string; carrierId: string; invoiceNumber: string; randomNumber: string; carrierType: InvoiceCarrierType; /** * 是否列印紙本 * 若不填,會以「有捐贈->不印、有載具->不印、其餘->印」來推測是否列印 */ isPrint?: boolean; qrCodePassword: string; status: InvoiceStatusType; issuedAt: number; voidedAt: number; voidReason: string; remark?: string; /** * @Deprecated - addressed by event feature */ uploadStatus: null | 'uploaded' | 'uploadFailed' | 'voided' | 'voidFailed'; uploadAt: number; uploadDetail?: any; uploadVoidAt: number; uploadVoidDetail?: any; } export interface OrderReceipt { id: string; accountId?: string; status: ReceiptStatusType; issuedAt: number; voidedAt: number; } export interface RefundPayload { accountId?: string; operator?: Operator; operationTimestamp: number; transactionId: string; success: boolean; amount: number; payload: any; } export interface ShiftClosingResult { accountId?: string; operator?: Operator; operationTimestamp: number; startedAt: number; endedAt: number; paymentSummary: PaymentSummary[]; /** 淨營收額 (本期收據 收款金額 - 本期收據作廢金額 - 非本期收據作廢金額) */ totalSalesRevenue: number; /** 本期收據 收款數 */ currentIssuedCount: number; /** 本期收據 收款金額 */ currentIssuedAmount: number; /** 本期收據 作廢數 */ currentVoidedCount: number; /** 本期收據 作廢金額 */ currentVoidedAmount: number; /** 本期收據 作廢收據編號或發票號碼 */ currentVoidedInvoiceNumbers: string[]; /** 非本期收據 作廢數 */ nonCurrentVoidedCount: number; /** 非本期收據 作廢金額 */ nonCurrentVoidedAmount: number; /** 非本期收據 作廢收據編號或發票號碼 */ nonCurrentVoidedInvoiceNumbers: string[]; } export interface ClosingResult { id: string; type: CloseType; startedAt: number; endedAt: number; /** 帳區Id */ accountId: string; paymentSummary: PaymentSummary[]; /** 淨營收額 (本期收據 收款金額 - 本期收據作廢金額 - 非本期收據作廢金額) */ totalSalesRevenue: number; /** 本期收據 收款數 */ currentIssuedCount: number; /** 本期收據 收款金額 */ currentIssuedAmount: number; /** 本期收據 作廢數 */ currentVoidedCount: number; /** 本期收據 作廢金額 */ currentVoidedAmount: number; /** 本期收據 作廢收據編號或發票號碼 */ currentVoidedInvoiceNumbers: string[]; /** 非本期收據 作廢數 */ nonCurrentVoidedCount: number; /** 非本期收據 作廢金額 */ nonCurrentVoidedAmount: number; /** 非本期收據 作廢收據編號或發票號碼 */ nonCurrentVoidedInvoiceNumbers: string[]; /** 註銷品項數量 */ cancelledSalesCount?: number; /** 註銷品項金額 */ cancelledSalesAmount?: number; /** 註銷品項項目 */ cancelledSalesDetails?: ClosingSalesProductDetail[]; operationTimestamp: number; operator?: Operator; } export interface PaymentSummary { paymentServiceProvider: PaymentServiceProvider; paymentType: PaymentType; /** 自定義支付名稱 */ customName?: string; disableInventory?: boolean; /** 收款交易數 */ paymentCount?: number; /** 收款總金額(正數) */ paymentAmount?: number; /** 退款交易數 */ refundCount?: number; /** 退款總金額(正數) */ refundAmount?: number; /** 總交易數(收款交易數 + 退款交易數) */ count: number; /** 銷售淨額(收款總金額 - 退款總金額) */ amount: number; /** 實際金額 */ actualAmount?: number; /** * 短溢金額 (實際金額 - 應有金額) * 應有金額 = 銷售淨額 + 上期留存金額 - 臨時支出 */ varianceAmount?: number; /** 短溢原因 */ varianceReason?: string; } export interface CashSummary extends PaymentSummary { paymentServiceProvider: PaymentServiceProvider.none; paymentType: PaymentType.cash; /** 現金臨時支出 */ expenditureDetails: Expenditure[]; /** 現金匯出金額 */ withdrawal: number; /** 上期留存金額 */ initAmount: number; /** 現金留存金額 (現金實際金額 - 現金匯出金額) */ retained: number; } export interface Expenditure { /** 臨時支出名稱 */ name: string; /** 臨時支出金額(正數) */ amount: number; } export interface AggregationInfo { aggregatedAt: number; belongTimePeriod: number; } export interface OrderDiscount { discountReferences: DiscountReference[]; itemsDiscountDetail?: Record; } export interface DiscountReference { type: DiscountModuleTypeEnum; id: string; name: string; amount: number; quantity: number; discountStartedAt: number; discountEndedAt: number; /** 兌換的memberCouponId */ code?: string; /** 當兌換失敗時,此時間會是undefined */ redeemedAt?: number; orderItemId?: string; discountDetails?: DiscountDetails[]; } export interface DiscountDetails { productId: string; type: 0 | 1; quantity: number; } export interface ItemDiscountDetail { id: string; sharedItemDiscountAmount: number; sharedOrderDiscountAmount: number; addonType: number; } export interface ClosingSalesDetail { id: string; startedAt: number; endedAt: number; salesCount: number; salesAmount: number; /** exclude selected item discount */ salesDiscountAmount: number; numberOfCustomers: number; salesDetails: ClosingSalesProductDetail[]; } export interface ClosingSalesProductDetail { productId: string; name: string; amount: number; quantity: number; }