import { Ref } from '@typegoose/typegoose'; import { Business, Restaurant } from '~backend/business/business.model'; import { RawEffect } from '~core/modules/order/definitions'; import { AdjustmentAmount } from '~core/helper/number'; import { Types } from 'mongoose'; import { DineroObject } from 'dinero.js'; import { Member } from './membership/membership.interface'; import { ORDER_TYPE } from '~backend/order/order.interface'; export declare enum VoucherType { afterSales = "AFTER_SALES", simpleClaim = "SIMPLE_CLAIM", memberReward = "MEMBER_REWARD", feedbackReward = "FEEDBACK_REWARD" } export interface FrontendInfo { hide: boolean; disable: boolean; reason: string; } export declare enum Target { bill = "BILL", item = "ITEM" } export declare const RedeemValidDuration: number; export interface AfterSalesClaimOpts { type: VoucherType.afterSales; minPurchase: AdjustmentAmount; maxPurchase: AdjustmentAmount; productIds?: string[] | null; minProductCount?: number; quantityMultiplier?: string | null; } export interface SimpleClaimOpts { type: VoucherType.simpleClaim; maxClaim: number; start: Date; end: Date; } export interface MultipleUseVoucherOptions { maxUse: number; cooldown: number; } export interface FeedbackRewardOpts { type: VoucherType.feedbackReward; } export interface MemberRewardOpts { type: VoucherType.memberReward; } export interface CreateVoucherPayload { name: string; description?: string; targetRestaurant?: string[]; effect: RawEffect; validSince?: string | null; hideInApp?: boolean; enableTransfer?: boolean; maxClaimsPerUser?: number; validity: number; options: SimpleClaimOpts | AfterSalesClaimOpts | MemberRewardOpts | FeedbackRewardOpts; multipleUse?: MultipleUseVoucherOptions; verticalImage?: string; horizontalImage?: string; } export interface UpdateVoucherPayload { voucher: Voucher; updateClaim: boolean; } export interface Voucher { id: string; name: string; description?: string; business: Ref; targetRestaurant?: Ref[]; effect: RawEffect; validSince?: Date | null; validity: number; currentClaim: number; currentRedeem: number; options: SimpleClaimOpts | AfterSalesClaimOpts | FeedbackRewardOpts | MemberRewardOpts; publicClaimLink: string; hideInApp?: boolean; enableTransfer?: boolean; maxClaimsPerUser?: number; disable?: boolean; multipleUse?: MultipleUseVoucherOptions; verticalImage?: string; horizontalImage?: string; } export interface VoucherRef extends Voucher { _id: Types.ObjectId; } export interface VoucherClaimHistory { appliedAt: Date; restaurant: Ref | null; billId: string | null; } export interface VoucherTransferHistory { transferAt: Date; from: string; to: string; } export interface VoucherClaim { _id: Types.ObjectId; id: string; user: string; voucher: VoucherRef; transferExpiredAt?: Date; transferHistory?: VoucherTransferHistory[]; expiredAt: Date; claimedAt: Date; redeemedAt: Date | null; redeemCode: string | null; appliedAt: Date | null; restaurant: Ref | null; billId: string | null; frontend?: FrontendInfo; history?: VoucherClaimHistory[]; code?: string | null; } export interface CreateBatchVoucherClaims { voucher: Voucher; count: number; codeConfig: CodeConfig; code?: string | null; } export interface TransferClaim { voucherClaim: VoucherClaim; phoneNumber: string; } export interface CreateClaim { phoneNumber: string; } export interface BillItemCount { productId: string; count: number; } export interface GetAvailableVoucher { billTotal: DineroObject; items: BillItemCount[]; } export interface IssueAfterSalesVoucher { phoneNumber: string; userId: string; voucherIds: string[]; } export interface ChangeVoucherClaimOwner { fromUserId: string; toPhoneNumber: string; claimIds: string[]; } /** @deprecated */ export interface MemberClaim { member: Member.Member; claim: VoucherClaim; } export interface FreeCreditOption { day: number; amount: number; remark?: string; } export interface DeductCreditOption { amount: number; remark?: string; } export declare function isAvailableOnlineOrder(type: ORDER_TYPE, availableOnlineOrder?: ORDER_TYPE[]): boolean | undefined; export declare function inTargetRestaurant(restaurantId: string, targetRestaurant?: string[]): boolean; export interface CodeConfig { length?: number; charset: string; prefix?: string; suffix?: string; pattern?: string; }