@lyxa.ai/marketing 1.0.55 → 1.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/index.d.ts +1285 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/modules/coupon/routers/coupon.router.d.ts +1285 -0
- package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
- package/dist/lib/modules/coupon/routers/coupon.router.js +14 -0
- package/dist/lib/modules/coupon/routers/coupon.router.js.map +1 -1
- package/dist/lib/modules/coupon/services/coupon.service.d.ts +30 -2
- package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/coupon.service.js +30 -0
- package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts +1 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js +52 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts +17 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +135 -0
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -1
- package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +58 -0
- package/dist/lib/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
- package/dist/lib/modules/coupon/validations/coupon.validation.js +21 -1
- package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -1
- package/dist/types/index.d.ts +1285 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modules/coupon/routers/coupon.router.d.ts +1285 -0
- package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/coupon.service.d.ts +30 -2
- package/dist/types/modules/coupon/services/coupon.service.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts +1 -0
- package/dist/types/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts +17 -0
- package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
- package/dist/types/modules/coupon/validations/coupon.validation.d.ts +58 -0
- package/dist/types/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CouponMetricsRepository.js","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponMetricsRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { Coupon, CouponModel, OrderModel } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { Duration } from '@lyxa.ai/core/dist/libraries/mongo/models/shared/duration.model';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport {\n\tCouponType,\n\tGraphType,\n\tItemType,\n\tOrderType,\n\tRegularOrderStatus,\n\tStatus,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { roundBaseCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { LyxaTimezone } from '@lyxa.ai/core/dist/utilities/time';\nimport {\n\tCouponMetricsByTypeDTO,\n\tCouponMetricsOutputDTO,\n\tDateInputDTO,\n\tGraphDTO,\n\tGraphInputDTO,\n\tTotalProfitGraphDTO,\n} from '@modules/coupon/validations/coupon.validation';\nimport { mongoose } from '@typegoose/typegoose';\nimport { fillMissingPeriods } from '@utility/utils';\n\nexport class CouponMetricsRepository {\n\tprivate readonly model: typeof CouponModel;\n\tprivate orderModel: typeof OrderModel;\n\n\tconstructor() {\n\t\tthis.model = CouponModel as typeof CouponModel;\n\t\tthis.orderModel = OrderModel as typeof OrderModel;\n\t}\n\n\tprivate getBaseCouponFilter(): mongoose.FilterQuery<Coupon> {\n\t\treturn {\n\t\t\tupdatedVersion: { $exists: false },\n\t\t\tcouponType: { $nin: [CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD] },\n\t\t\tdeletedAt: null,\n\t\t};\n\t}\n\n\tprivate getCouponCreatedWithinDateRangeFilter(\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): mongoose.FilterQuery<Coupon> {\n\t\treturn {\n\t\t\t...this.getBaseCouponFilter(),\n\t\t\tcreatedAt: {\n\t\t\t\t$gte: startDate,\n\t\t\t\t$lte: endDate,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate getCouponOrderMatch(startDate: Date, endDate: Date): mongoose.PipelineStage.Match['$match'] {\n\t\treturn {\n\t\t\tplacedAt: {\n\t\t\t\t$gte: startDate,\n\t\t\t\t$lte: endDate,\n\t\t\t},\n\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t\t'adjustedFinance.coupon.coupon': { $ne: null },\n\t\t};\n\t}\n\n\tprivate async getActiveCouponsCount(now: Date): Promise<number> {\n\t\treturn this.model.countDocuments({\n\t\t\tupdatedVersion: { $exists: false },\n\n\t\t\tcouponType: {\n\t\t\t\t$nin: [CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD],\n\t\t\t},\n\n\t\t\tstatus: Status.ACTIVE,\n\n\t\t\tdeletedAt: null,\n\n\t\t\t'duration.start': { $lte: now },\n\n\t\t\t$or: [\n\t\t\t\t{ 'duration.end': { $exists: false } },\n\t\t\t\t{ 'duration.end': null },\n\t\t\t\t{ 'duration.end': { $gte: now } },\n\t\t\t],\n\t\t});\n\t}\n\tprivate async getTotalCreatedCoupons(startDate: Date, endDate: Date) {\n\t\treturn this.model\n\t\t\t.find({\n\t\t\t\t...this.getCouponCreatedWithinDateRangeFilter(startDate, endDate),\n\t\t\t})\n\t\t\t.select('_id');\n\t}\n\n\tprivate async getCouponUsageMetrics(\n\t\tstartDate: Date,\n\t\tendDate: Date,\n\t\tcoupons: mongoose.Types.ObjectId[] = []\n\t) {\n\t\tconst match = {\n\t\t\t...this.getCouponOrderMatch(startDate, endDate),\n\t\t\t'adjustedFinance.coupon.coupon': { $in: coupons },\n\t\t};\n\n\t\tconst [result] = await this.orderModel.aggregate<{\n\t\t\ttotalCouponOrders: number;\n\t\t\ttotalRevenue: number;\n\t\t\ttotalProfit: number;\n\t\t\tredeemedCoupons: number;\n\t\t}>([\n\t\t\t{\n\t\t\t\t$match: match,\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: null,\n\n\t\t\t\t\ttotalCouponOrders: { $sum: 1 },\n\n\t\t\t\t\ttotalRevenue: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t'$adjustedFinance.pricing.subtotal',\n\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.shopProfit.totalProfit', 0] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\ttotalProfit: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.companyProfit.profitFromItem',\n\t\t\t\t\t},\n\n\t\t\t\t\tuniqueCoupons: {\n\t\t\t\t\t\t$addToSet: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\ttotalCouponOrders: 1,\n\t\t\t\t\ttotalRevenue: 1,\n\t\t\t\t\ttotalProfit: 1,\n\t\t\t\t\tredeemedCoupons: {\n\t\t\t\t\t\t$size: '$uniqueCoupons',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\treturn (\n\t\t\tresult ?? {\n\t\t\t\ttotalCouponOrders: 0,\n\t\t\t\ttotalRevenue: 0,\n\t\t\t\ttotalProfit: 0,\n\t\t\t\tredeemedCoupons: 0,\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate getEffectiveGraphType(type: GraphType | undefined, startDate: Date, endDate: Date): GraphType {\n\t\tif (type !== undefined && type !== null) {\n\t\t\treturn type;\n\t\t}\n\n\t\tconst durationDays = dayjs(endDate).endOf('day').diff(dayjs(startDate).startOf('day'), 'day') + 1;\n\t\treturn durationDays > 31 ? GraphType.MONTHLY : GraphType.DAILY;\n\t}\n\n\tprivate getMongoDateFormat(type: GraphType): string {\n\t\tif (type === GraphType.YEARLY) return '%Y';\n\t\tif (type === GraphType.MONTHLY) return '%Y-%m';\n\t\treturn '%Y-%m-%d';\n\t}\n\n\tprivate getPeriodKeys(startDate: Date, endDate: Date, type: GraphType): string[] {\n\t\tconst unit = type === GraphType.YEARLY ? 'year' : type === GraphType.MONTHLY ? 'month' : 'day';\n\t\tconst format = type === GraphType.YEARLY ? 'YYYY' : type === GraphType.MONTHLY ? 'YYYY-MM' : 'YYYY-MM-DD';\n\t\tconst keys: string[] = [];\n\t\tlet current = dayjs(startDate).startOf(unit);\n\t\tconst end = dayjs(endDate).startOf(unit);\n\n\t\twhile (current.isBefore(end) || current.isSame(end)) {\n\t\t\tkeys.push(current.format(format));\n\t\t\tcurrent = current.add(1, unit);\n\t\t}\n\n\t\treturn keys;\n\t}\n\n\tprivate formatPeriodLabel(dateKey: string, type: GraphType): string {\n\t\tif (type === GraphType.YEARLY) {\n\t\t\treturn new Date(dateKey).toLocaleString('default', { year: 'numeric' });\n\t\t}\n\n\t\tif (type === GraphType.MONTHLY) {\n\t\t\treturn new Date(dateKey).toLocaleString('default', { month: 'short' });\n\t\t}\n\n\t\treturn new Date(dateKey).toLocaleString('default', { day: 'numeric', month: 'short' });\n\t}\n\n\tpublic async getCouponMetricsByType(duration: DateInputDTO) {\n\t\tconst startDate = dayjs(duration.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(duration.endDate).endOf('day').toDate();\n\n\t\tconst [totalOrders, activeCouponsCount] = await Promise.all([\n\t\t\tthis.orderModel.countDocuments({\n\t\t\t\tplacedAt: {\n\t\t\t\t\t$gte: startDate,\n\t\t\t\t\t$lte: endDate,\n\t\t\t\t},\n\t\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t\t}),\n\t\t\tthis.model.aggregate([\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t...this.getBaseCouponFilter(),\n\t\t\t\t\t\tstatus: Status.ACTIVE,\n\t\t\t\t\t\t'duration.start': { $lte: dayjs().toDate() },\n\t\t\t\t\t\t'duration.end': { $gte: dayjs().toDate() },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: '$couponType',\n\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]),\n\t\t]);\n\n\t\tconst activeCouponsMap = activeCouponsCount.reduce(\n\t\t\t(acc, curr) => {\n\t\t\t\tacc[curr._id] = curr.count;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, number>\n\t\t);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getCouponOrderMatch(startDate, endDate),\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'coupons',\n\t\t\t\t\tlocalField: 'adjustedFinance.coupon.coupon',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'couponDetails',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$unwind: '$couponDetails',\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t'couponDetails.couponType': { $nin: [CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD] },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$couponDetails.couponType',\n\n\t\t\t\t\tcouponType: { $first: '$couponDetails.couponType' },\n\n\t\t\t\t\ttotalCouponOrders: { $sum: 1 },\n\n\t\t\t\t\ttotalOrderAmount: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.pricing.total',\n\t\t\t\t\t},\n\n\t\t\t\t\ttotalRevenue: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t'$adjustedFinance.pricing.total',\n\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.shopProfit.totalProfit', 0] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\tamountSpent: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.pricing.couponDiscount',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\taverageOrderValue: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$totalCouponOrders', 0] },\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$round: [{ $divide: ['$totalOrderAmount', '$totalCouponOrders'] }, 2],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\n\t\t\t\t\tusage: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: [totalOrders, 0] },\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$multiply: [\n\t\t\t\t\t\t\t\t\t100,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$round: [{ $divide: ['$totalCouponOrders', totalOrders] }, 2],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tcouponType: 1,\n\t\t\t\t\ttotalCouponOrders: 1,\n\t\t\t\t\ttotalRevenue: { $round: ['$totalRevenue', 2] },\n\t\t\t\t\taverageOrderValue: 1,\n\t\t\t\t\tusage: 1,\n\t\t\t\t\tamountSpent: { $round: ['$amountSpent', 2] },\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tthis.fillMissingRows(result);\n\n\t\tconst tableData = result.map(item => ({\n\t\t\t...item,\n\t\t\tcouponTypeTitle: this.getCouponTypeTitle(item.couponType),\n\t\t\tongoing: activeCouponsMap[item.couponType] ?? 0,\n\t\t\tredemptionRate: 0, // calculate after business discussion on how to define redemption rate by coupon type\n\t\t}));\n\n\t\treturn tableData;\n\t}\n\n\tprivate getCouponTypeTitle(couponType: CouponType) {\n\t\tconst couponTypeTitles: Record<CouponType, string> = {\n\t\t\t[CouponType.GLOBAL]: 'Global',\n\t\t\t[CouponType.SHOPS_CATEGORIES]: 'Shop/Category',\n\t\t\t[CouponType.INDIVIDUAL_STORE]: 'Single Shop',\n\t\t\t[CouponType.INDIVIDUAL_USER]: 'Individual User',\n\t\t\t[CouponType.CUSTOM_COUPON]: 'Customized Coupon',\n\t\t\t[CouponType.REFERRAL_CODE]: 'Referral Code',\n\t\t\t[CouponType.REFERRAL_REWARD]: 'Referral Reward',\n\t\t};\n\t\treturn couponTypeTitles[couponType] || 'Unknown';\n\t}\n\n\tprivate fillMissingRows(data: CouponMetricsByTypeDTO[]) {\n\t\tconst missingTypes = Object.values(CouponType).filter(\n\t\t\ttype =>\n\t\t\t\t![CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD].includes(type) &&\n\t\t\t\t!data.some(row => row.couponType === type)\n\t\t);\n\n\t\tmissingTypes.forEach(type => {\n\t\t\tdata.push({\n\t\t\t\tcouponType: type,\n\t\t\t\tcouponTypeTitle: this.getCouponTypeTitle(type),\n\t\t\t\ttotalCouponOrders: 0,\n\t\t\t\ttotalRevenue: 0,\n\t\t\t\taverageOrderValue: 0,\n\t\t\t\tusage: 0,\n\t\t\t\tongoing: 0,\n\t\t\t\tredemptionRate: 0,\n\t\t\t\tamountSpent: 0,\n\t\t\t});\n\t\t});\n\n\t\tdata.sort((a, b) => this.compareCouponTypes(a.couponType, b.couponType));\n\t}\n\n\tprivate compareCouponTypes(a: CouponType, b: CouponType) {\n\t\tconst order = [\n\t\t\tCouponType.GLOBAL,\n\t\t\tCouponType.SHOPS_CATEGORIES,\n\t\t\tCouponType.INDIVIDUAL_STORE,\n\t\t\tCouponType.INDIVIDUAL_USER,\n\t\t\tCouponType.CUSTOM_COUPON,\n\t\t];\n\t\treturn order.indexOf(a) - order.indexOf(b);\n\t}\n\n\tprivate calculateRedemptionRate(totalCreated: number, redeemedCoupons: number) {\n\t\tif (totalCreated <= 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn Number(((redeemedCoupons / totalCreated) * 100).toFixed(2));\n\t}\n\n\tpublic async getCouponMetrics(duration: DateInputDTO): Promise<CouponMetricsOutputDTO> {\n\t\tconst startDate = dayjs(duration.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(duration.endDate).endOf('day').toDate();\n\t\tconst now = new Date();\n\n\t\tconst [activeCoupons, createdCoupons] = await Promise.all([\n\t\t\tthis.getActiveCouponsCount(now),\n\t\t\tthis.getTotalCreatedCoupons(startDate, endDate),\n\t\t]);\n\n\t\tconst createdCouponIds = createdCoupons.map(coupon => coupon._id);\n\n\t\tconst usageMetrics = await this.getCouponUsageMetrics(startDate, endDate, createdCouponIds);\n\n\t\tconst redemptionRate = this.calculateRedemptionRate(\n\t\t\tcreatedCouponIds.length,\n\t\t\tusageMetrics.redeemedCoupons\n\t\t);\n\n\t\treturn {\n\t\t\tactiveCoupons,\n\n\t\t\ttotalCreated: createdCouponIds.length,\n\t\t\ttotalRedeemedCoupons: usageMetrics.totalCouponOrders,\n\t\t\tredemptionRate,\n\n\t\t\ttotalCouponOrders: usageMetrics.totalCouponOrders,\n\t\t\ttotalRevenue: roundBaseCurrency(usageMetrics.totalRevenue),\n\t\t\ttotalProfit: roundBaseCurrency(usageMetrics.totalProfit),\n\t\t};\n\t}\n\n\tpublic getOrderGraphMatchStage(startDate: Date, endDate: Date, itemType?: ItemType) {\n\t\treturn {\n\t\t\tplacedAt: {\n\t\t\t\t$gte: startDate,\n\t\t\t\t$lte: endDate,\n\t\t\t},\n\t\t\torderType: OrderType.REGULAR,\n\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t\t...(itemType\n\t\t\t\t? {\n\t\t\t\t\t\titemType,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t};\n\t}\n\n\tpublic async getCouponOrdersGraphData(data: GraphInputDTO): Promise<GraphDTO> {\n\t\tconst startDate = dayjs(data.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(data.endDate).endOf('day').toDate();\n\n\t\tconst graphType = this.getEffectiveGraphType(data.graphType, data.startDate, data.endDate);\n\t\tconst dateFormat = this.getMongoDateFormat(graphType);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getOrderGraphMatchStage(startDate, endDate, data.itemType),\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\thasCoupon: {\n\t\t\t\t\t\t$cond: [{ $ifNull: ['$adjustedFinance.coupon.coupon', false] }, 1, 0],\n\t\t\t\t\t},\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: {\n\t\t\t\t\t\t\tformat: dateFormat,\n\t\t\t\t\t\t\tdate: '$placedAt',\n\t\t\t\t\t\t\ttimezone: LyxaTimezone,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$date',\n\n\t\t\t\t\ttotalOrders: { $sum: 1 },\n\n\t\t\t\t\tordersWithCoupon: {\n\t\t\t\t\t\t$sum: '$hasCoupon',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tdate: '$_id',\n\t\t\t\t\ttotalOrders: 1,\n\t\t\t\t\tordersWithCoupon: 1,\n\t\t\t\t\tordersWithoutCoupon: { $subtract: ['$totalOrders', '$ordersWithCoupon'] },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$sort: { date: 1 },\n\t\t\t},\n\t\t]);\n\n\t\t// Fill in missing dates with zero for graph continuity\n\t\tconst graphData = fillMissingPeriods(result, data.startDate, data.endDate, graphType, {\n\t\t\ttotalOrders: 0,\n\t\t\tordersWithCoupon: 0,\n\t\t\tordersWithoutCoupon: 0,\n\t\t});\n\n\t\treturn this.convertToCouponOrdersGraphFormat(graphData, graphType, data.startDate, data.endDate);\n\t}\n\n\tprivate convertToCouponOrdersGraphFormat(\n\t\tdata: Array<{ date: string; totalOrders: number; ordersWithCoupon: number; ordersWithoutCoupon: number }>,\n\t\tgraphType: GraphType,\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): GraphDTO {\n\t\tconst periodKeys = this.getPeriodKeys(startDate, endDate, graphType);\n\t\tconst categories = periodKeys.map(key => this.formatPeriodLabel(key, graphType));\n\n\t\tconst series = [\n\t\t\t{\n\t\t\t\tname: 'Coupon',\n\t\t\t\tdata: data.map(item => item.ordersWithCoupon),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'No Coupon',\n\t\t\t\tdata: data.map(item => item.ordersWithoutCoupon),\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\tcategories,\n\t\t\tseries,\n\t\t};\n\t}\n\n\tpublic async getUsersNewVsReturningGraphData(data: GraphInputDTO): Promise<GraphDTO> {\n\t\tconst startDate = dayjs(data.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(data.endDate).endOf('day').toDate();\n\n\t\tconst graphType = this.getEffectiveGraphType(data.graphType, data.startDate, data.endDate);\n\t\tconst dateFormat = this.getMongoDateFormat(graphType);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t// Orders in selected period\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getOrderGraphMatchStage(startDate, endDate, data.itemType),\n\t\t\t\t\t'adjustedFinance.coupon.coupon': { $ne: null },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Build graph bucket\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: {\n\t\t\t\t\t\t\tformat: dateFormat,\n\t\t\t\t\t\t\tdate: '$placedAt',\n\t\t\t\t\t\t\ttimezone: LyxaTimezone,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Unique user per period bucket\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: {\n\t\t\t\t\t\tuser: '$user',\n\t\t\t\t\t\tdate: '$date',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Lookup prior order (existence check)\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'orders',\n\t\t\t\t\tlet: { userId: '$_id.user' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: {\n\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$status', RegularOrderStatus.DELIVERED] },\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$expr: {\n\t\t\t\t\t\t\t\t\t\t\t\t$lt: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ifNull: ['$placedAt', '$createdAt'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate,\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $limit: 1 },\n\t\t\t\t\t],\n\t\t\t\t\tas: 'previousOrders',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Classify\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tisReturning: {\n\t\t\t\t\t\t$gt: [{ $size: '$previousOrders' }, 0],\n\t\t\t\t\t},\n\t\t\t\t\tdate: '$_id.date',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Aggregate graph metrics\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$date',\n\n\t\t\t\t\ttotalUsers: { $sum: 1 },\n\n\t\t\t\t\treturningUsers: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$cond: ['$isReturning', 1, 0],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\tnewUsers: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$cond: ['$isReturning', 0, 1],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tdate: '$_id',\n\t\t\t\t\ttotalUsers: 1,\n\t\t\t\t\tnewUsers: 1,\n\t\t\t\t\treturningUsers: 1,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{ $sort: { date: 1 } },\n\t\t]);\n\n\t\tconst graphData = fillMissingPeriods(result, data.startDate, data.endDate, graphType, {\n\t\t\ttotalUsers: 0,\n\t\t\tnewUsers: 0,\n\t\t\treturningUsers: 0,\n\t\t});\n\n\t\treturn this.convertToUsersNewVsReturningGraphFormat(graphData, graphType, data.startDate, data.endDate);\n\t}\n\n\tprivate convertToUsersNewVsReturningGraphFormat(\n\t\tdata: Array<{ date: string; totalUsers: number; newUsers: number; returningUsers: number }>,\n\t\tgraphType: GraphType,\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): GraphDTO {\n\t\tconst periodKeys = this.getPeriodKeys(startDate, endDate, graphType);\n\t\tconst categories = periodKeys.map(key => this.formatPeriodLabel(key, graphType));\n\n\t\tconst series = [\n\t\t\t{\n\t\t\t\tname: 'New Users',\n\t\t\t\tdata: data.map(item => item.newUsers),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Returning Users',\n\t\t\t\tdata: data.map(item => item.returningUsers),\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\tcategories,\n\t\t\tseries,\n\t\t};\n\t}\n\n\tpublic async getCouponProfitGraphData(data: GraphInputDTO): Promise<TotalProfitGraphDTO> {\n\t\tconst startDate = dayjs(data.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(data.endDate).endOf('day').toDate();\n\n\t\tconst graphType = this.getEffectiveGraphType(data.graphType, data.startDate, data.endDate);\n\t\tconst dateFormat = this.getMongoDateFormat(graphType);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getOrderGraphMatchStage(startDate, endDate, data.itemType),\n\t\t\t\t\t'adjustedFinance.coupon.coupon': { $ne: null },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: {\n\t\t\t\t\t\t\tformat: dateFormat,\n\t\t\t\t\t\t\tdate: '$placedAt',\n\t\t\t\t\t\t\ttimezone: LyxaTimezone,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$date',\n\n\t\t\t\t\ttotalProfit: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.companyProfit.totalProfit',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tdate: '$_id',\n\t\t\t\t\ttotalProfit: 1,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$sort: { date: 1 },\n\t\t\t},\n\t\t]);\n\n\t\t// Fill in missing dates with zero for graph continuity\n\t\tconst graphData = fillMissingPeriods(result, data.startDate, data.endDate, graphType, {\n\t\t\ttotalProfit: 0,\n\t\t});\n\n\t\treturn this.convertToCouponProfitGraphFormat(graphData, graphType, data.startDate, data.endDate);\n\t}\n\n\tprivate convertToCouponProfitGraphFormat(\n\t\tdata: Array<{ date: string; totalProfit: number }>,\n\t\tgraphType: GraphType,\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): TotalProfitGraphDTO {\n\t\tconst periodKeys = this.getPeriodKeys(startDate, endDate, graphType);\n\t\tconst categories = periodKeys.map(key => this.formatPeriodLabel(key, graphType));\n\n\t\tconst series = [\n\t\t\t{\n\t\t\t\tname: 'Profit',\n\t\t\t\tdata: data.map(item => item.totalProfit),\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\tcategories,\n\t\t\tseries,\n\t\t\ttotalProfit: data.reduce((sum, item) => sum + item.totalProfit, 0),\n\t\t};\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CouponMetricsRepository.js","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponMetricsRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { Coupon, CouponModel, OrderModel } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { Duration } from '@lyxa.ai/core/dist/libraries/mongo/models/shared/duration.model';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport {\n\tCouponType,\n\tGraphType,\n\tItemType,\n\tOrderType,\n\tRegularOrderStatus,\n\tStatus,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { roundBaseCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { LyxaTimezone } from '@lyxa.ai/core/dist/utilities/time';\nimport {\n\tCouponMetricsByTypeDTO,\n\tCouponMetricsOutputDTO,\n\tDateInputDTO,\n\tGraphDTO,\n\tGraphInputDTO,\n\tTotalProfitGraphDTO,\n} from '@modules/coupon/validations/coupon.validation';\nimport { mongoose } from '@typegoose/typegoose';\nimport { fillMissingPeriods } from '@utility/utils';\n\nexport class CouponMetricsRepository {\n\tprivate readonly model: typeof CouponModel;\n\tprivate orderModel: typeof OrderModel;\n\n\tconstructor() {\n\t\tthis.model = CouponModel as typeof CouponModel;\n\t\tthis.orderModel = OrderModel as typeof OrderModel;\n\t}\n\n\tprivate getBaseCouponFilter(): mongoose.FilterQuery<Coupon> {\n\t\treturn {\n\t\t\tupdatedVersion: { $exists: false },\n\t\t\tcouponType: { $nin: [CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD] },\n\t\t\tdeletedAt: null,\n\t\t};\n\t}\n\n\tprivate getCouponCreatedWithinDateRangeFilter(\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): mongoose.FilterQuery<Coupon> {\n\t\treturn {\n\t\t\t...this.getBaseCouponFilter(),\n\t\t\tcreatedAt: {\n\t\t\t\t$gte: startDate,\n\t\t\t\t$lte: endDate,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate getCouponOrderMatch(startDate: Date, endDate: Date): mongoose.PipelineStage.Match['$match'] {\n\t\treturn {\n\t\t\tplacedAt: {\n\t\t\t\t$gte: startDate,\n\t\t\t\t$lte: endDate,\n\t\t\t},\n\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t\t'adjustedFinance.coupon.coupon': { $ne: null },\n\t\t};\n\t}\n\n\tprivate async getActiveCouponsCount(now: Date): Promise<number> {\n\t\treturn this.model.countDocuments({\n\t\t\tupdatedVersion: { $exists: false },\n\n\t\t\tcouponType: {\n\t\t\t\t$nin: [CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD],\n\t\t\t},\n\n\t\t\tstatus: Status.ACTIVE,\n\n\t\t\tdeletedAt: null,\n\n\t\t\t'duration.start': { $lte: now },\n\n\t\t\t$or: [\n\t\t\t\t{ 'duration.end': { $exists: false } },\n\t\t\t\t{ 'duration.end': null },\n\t\t\t\t{ 'duration.end': { $gte: now } },\n\t\t\t],\n\t\t});\n\t}\n\tprivate async getTotalCreatedCoupons(startDate: Date, endDate: Date) {\n\t\treturn this.model\n\t\t\t.find({\n\t\t\t\t...this.getCouponCreatedWithinDateRangeFilter(startDate, endDate),\n\t\t\t})\n\t\t\t.select('_id');\n\t}\n\n\tprivate async getCouponUsageMetrics(\n\t\tstartDate: Date,\n\t\tendDate: Date,\n\t\tcoupons: mongoose.Types.ObjectId[] = []\n\t) {\n\t\tconst match = {\n\t\t\t...this.getCouponOrderMatch(startDate, endDate),\n\t\t\t'adjustedFinance.coupon.coupon': { $in: coupons },\n\t\t};\n\n\t\tconst [result] = await this.orderModel.aggregate<{\n\t\t\ttotalCouponOrders: number;\n\t\t\ttotalRevenue: number;\n\t\t\ttotalProfit: number;\n\t\t\tredeemedCoupons: number;\n\t\t}>([\n\t\t\t{\n\t\t\t\t$match: match,\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: null,\n\n\t\t\t\t\ttotalCouponOrders: { $sum: 1 },\n\n\t\t\t\t\ttotalRevenue: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t'$adjustedFinance.pricing.subtotal',\n\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.shopProfit.totalProfit', 0] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\ttotalProfit: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.companyProfit.profitFromItem',\n\t\t\t\t\t},\n\n\t\t\t\t\tuniqueCoupons: {\n\t\t\t\t\t\t$addToSet: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\ttotalCouponOrders: 1,\n\t\t\t\t\ttotalRevenue: 1,\n\t\t\t\t\ttotalProfit: 1,\n\t\t\t\t\tredeemedCoupons: {\n\t\t\t\t\t\t$size: '$uniqueCoupons',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\treturn (\n\t\t\tresult ?? {\n\t\t\t\ttotalCouponOrders: 0,\n\t\t\t\ttotalRevenue: 0,\n\t\t\t\ttotalProfit: 0,\n\t\t\t\tredeemedCoupons: 0,\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate getEffectiveGraphType(type: GraphType | undefined, startDate: Date, endDate: Date): GraphType {\n\t\tif (type !== undefined && type !== null) {\n\t\t\treturn type;\n\t\t}\n\n\t\tconst durationDays = dayjs(endDate).endOf('day').diff(dayjs(startDate).startOf('day'), 'day') + 1;\n\t\treturn durationDays > 31 ? GraphType.MONTHLY : GraphType.DAILY;\n\t}\n\n\tprivate getMongoDateFormat(type: GraphType): string {\n\t\tif (type === GraphType.YEARLY) return '%Y';\n\t\tif (type === GraphType.MONTHLY) return '%Y-%m';\n\t\treturn '%Y-%m-%d';\n\t}\n\n\tprivate getPeriodKeys(startDate: Date, endDate: Date, type: GraphType): string[] {\n\t\tconst unit = type === GraphType.YEARLY ? 'year' : type === GraphType.MONTHLY ? 'month' : 'day';\n\t\tconst format = type === GraphType.YEARLY ? 'YYYY' : type === GraphType.MONTHLY ? 'YYYY-MM' : 'YYYY-MM-DD';\n\t\tconst keys: string[] = [];\n\t\tlet current = dayjs(startDate).startOf(unit);\n\t\tconst end = dayjs(endDate).startOf(unit);\n\n\t\twhile (current.isBefore(end) || current.isSame(end)) {\n\t\t\tkeys.push(current.format(format));\n\t\t\tcurrent = current.add(1, unit);\n\t\t}\n\n\t\treturn keys;\n\t}\n\n\tprivate formatPeriodLabel(dateKey: string, type: GraphType): string {\n\t\tif (type === GraphType.YEARLY) {\n\t\t\treturn new Date(dateKey).toLocaleString('default', { year: 'numeric' });\n\t\t}\n\n\t\tif (type === GraphType.MONTHLY) {\n\t\t\treturn new Date(dateKey).toLocaleString('default', { month: 'short' });\n\t\t}\n\n\t\treturn new Date(dateKey).toLocaleString('default', { day: 'numeric', month: 'short' });\n\t}\n\n\tpublic async getCouponMetricsByType(duration: DateInputDTO) {\n\t\tconst startDate = dayjs(duration.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(duration.endDate).endOf('day').toDate();\n\n\t\tconst [totalOrders, activeCouponsCount] = await Promise.all([\n\t\t\tthis.orderModel.countDocuments({\n\t\t\t\tplacedAt: {\n\t\t\t\t\t$gte: startDate,\n\t\t\t\t\t$lte: endDate,\n\t\t\t\t},\n\t\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t\t}),\n\t\t\tthis.model.aggregate([\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t...this.getBaseCouponFilter(),\n\t\t\t\t\t\tstatus: Status.ACTIVE,\n\t\t\t\t\t\t'duration.start': { $lte: dayjs().toDate() },\n\t\t\t\t\t\t'duration.end': { $gte: dayjs().toDate() },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: '$couponType',\n\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]),\n\t\t]);\n\n\t\tconst activeCouponsMap = activeCouponsCount.reduce(\n\t\t\t(acc, curr) => {\n\t\t\t\tacc[curr._id] = curr.count;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, number>\n\t\t);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getCouponOrderMatch(startDate, endDate),\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'coupons',\n\t\t\t\t\tlocalField: 'adjustedFinance.coupon.coupon',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'couponDetails',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$unwind: '$couponDetails',\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t'couponDetails.couponType': { $nin: [CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD] },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$couponDetails.couponType',\n\n\t\t\t\t\tcouponType: { $first: '$couponDetails.couponType' },\n\n\t\t\t\t\ttotalCouponOrders: { $sum: 1 },\n\n\t\t\t\t\ttotalOrderAmount: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.pricing.total',\n\t\t\t\t\t},\n\n\t\t\t\t\ttotalRevenue: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t'$adjustedFinance.pricing.total',\n\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.shopProfit.totalProfit', 0] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\tamountSpent: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.pricing.couponDiscount',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\taverageOrderValue: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$totalCouponOrders', 0] },\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$round: [{ $divide: ['$totalOrderAmount', '$totalCouponOrders'] }, 2],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\n\t\t\t\t\tusage: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: [totalOrders, 0] },\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$multiply: [\n\t\t\t\t\t\t\t\t\t100,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$round: [{ $divide: ['$totalCouponOrders', totalOrders] }, 2],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tcouponType: 1,\n\t\t\t\t\ttotalCouponOrders: 1,\n\t\t\t\t\ttotalRevenue: { $round: ['$totalRevenue', 2] },\n\t\t\t\t\taverageOrderValue: 1,\n\t\t\t\t\tusage: 1,\n\t\t\t\t\tamountSpent: { $round: ['$amountSpent', 2] },\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tthis.fillMissingRows(result);\n\n\t\tconst tableData = result.map(item => ({\n\t\t\t...item,\n\t\t\tcouponTypeTitle: this.getCouponTypeTitle(item.couponType),\n\t\t\tongoing: activeCouponsMap[item.couponType] ?? 0,\n\t\t\tredemptionRate: 0, // calculate after business discussion on how to define redemption rate by coupon type\n\t\t}));\n\n\t\treturn tableData;\n\t}\n\n\tprivate getCouponTypeTitle(couponType: CouponType) {\n\t\tconst couponTypeTitles: Record<CouponType, string> = {\n\t\t\t[CouponType.GLOBAL]: 'Global',\n\t\t\t[CouponType.SHOPS_CATEGORIES]: 'Shop/Category',\n\t\t\t[CouponType.INDIVIDUAL_STORE]: 'Single Shop',\n\t\t\t[CouponType.INDIVIDUAL_USER]: 'Individual User',\n\t\t\t[CouponType.CUSTOM_COUPON]: 'Customized Coupon',\n\t\t\t[CouponType.REFERRAL_CODE]: 'Referral Code',\n\t\t\t[CouponType.REFERRAL_REWARD]: 'Referral Reward',\n\t\t};\n\t\treturn couponTypeTitles[couponType] || 'Unknown';\n\t}\n\n\tprivate fillMissingRows(data: CouponMetricsByTypeDTO[]) {\n\t\tconst missingTypes = Object.values(CouponType).filter(\n\t\t\ttype =>\n\t\t\t\t![CouponType.REFERRAL_CODE, CouponType.REFERRAL_REWARD].includes(type) &&\n\t\t\t\t!data.some(row => row.couponType === type)\n\t\t);\n\n\t\tmissingTypes.forEach(type => {\n\t\t\tdata.push({\n\t\t\t\tcouponType: type,\n\t\t\t\tcouponTypeTitle: this.getCouponTypeTitle(type),\n\t\t\t\ttotalCouponOrders: 0,\n\t\t\t\ttotalRevenue: 0,\n\t\t\t\taverageOrderValue: 0,\n\t\t\t\tusage: 0,\n\t\t\t\tongoing: 0,\n\t\t\t\tredemptionRate: 0,\n\t\t\t\tamountSpent: 0,\n\t\t\t});\n\t\t});\n\n\t\tdata.sort((a, b) => this.compareCouponTypes(a.couponType, b.couponType));\n\t}\n\n\tprivate compareCouponTypes(a: CouponType, b: CouponType) {\n\t\tconst order = [\n\t\t\tCouponType.GLOBAL,\n\t\t\tCouponType.SHOPS_CATEGORIES,\n\t\t\tCouponType.INDIVIDUAL_STORE,\n\t\t\tCouponType.INDIVIDUAL_USER,\n\t\t\tCouponType.CUSTOM_COUPON,\n\t\t];\n\t\treturn order.indexOf(a) - order.indexOf(b);\n\t}\n\n\tprivate calculateRedemptionRate(totalCreated: number, redeemedCoupons: number) {\n\t\tif (totalCreated <= 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn Number(((redeemedCoupons / totalCreated) * 100).toFixed(2));\n\t}\n\n\tpublic async getCouponMetrics(duration: DateInputDTO): Promise<CouponMetricsOutputDTO> {\n\t\tconst startDate = dayjs(duration.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(duration.endDate).endOf('day').toDate();\n\t\tconst now = new Date();\n\n\t\tconst [activeCoupons, createdCoupons] = await Promise.all([\n\t\t\tthis.getActiveCouponsCount(now),\n\t\t\tthis.getTotalCreatedCoupons(startDate, endDate),\n\t\t]);\n\n\t\tconst createdCouponIds = createdCoupons.map(coupon => coupon._id);\n\n\t\tconst usageMetrics = await this.getCouponUsageMetrics(startDate, endDate, createdCouponIds);\n\n\t\tconst redemptionRate = this.calculateRedemptionRate(\n\t\t\tcreatedCouponIds.length,\n\t\t\tusageMetrics.redeemedCoupons\n\t\t);\n\n\t\treturn {\n\t\t\tactiveCoupons,\n\n\t\t\ttotalCreated: createdCouponIds.length,\n\t\t\ttotalRedeemedCoupons: usageMetrics.totalCouponOrders,\n\t\t\tredemptionRate,\n\n\t\t\ttotalCouponOrders: usageMetrics.totalCouponOrders,\n\t\t\ttotalRevenue: roundBaseCurrency(usageMetrics.totalRevenue),\n\t\t\ttotalProfit: roundBaseCurrency(usageMetrics.totalProfit),\n\t\t};\n\t}\n\n\tpublic getOrderGraphMatchStage(startDate: Date, endDate: Date, itemType?: ItemType) {\n\t\treturn {\n\t\t\tplacedAt: {\n\t\t\t\t$gte: startDate,\n\t\t\t\t$lte: endDate,\n\t\t\t},\n\t\t\torderType: OrderType.REGULAR,\n\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t\t...(itemType\n\t\t\t\t? {\n\t\t\t\t\t\titemType,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t};\n\t}\n\n\tpublic async getCouponOrdersGraphData(data: GraphInputDTO): Promise<GraphDTO> {\n\t\tconst startDate = dayjs(data.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(data.endDate).endOf('day').toDate();\n\n\t\tconst graphType = this.getEffectiveGraphType(data.graphType, data.startDate, data.endDate);\n\t\tconst dateFormat = this.getMongoDateFormat(graphType);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getOrderGraphMatchStage(startDate, endDate, data.itemType),\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\thasCoupon: {\n\t\t\t\t\t\t$cond: [{ $ifNull: ['$adjustedFinance.coupon.coupon', false] }, 1, 0],\n\t\t\t\t\t},\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: {\n\t\t\t\t\t\t\tformat: dateFormat,\n\t\t\t\t\t\t\tdate: '$placedAt',\n\t\t\t\t\t\t\ttimezone: LyxaTimezone,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$date',\n\n\t\t\t\t\ttotalOrders: { $sum: 1 },\n\n\t\t\t\t\tordersWithCoupon: {\n\t\t\t\t\t\t$sum: '$hasCoupon',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tdate: '$_id',\n\t\t\t\t\ttotalOrders: 1,\n\t\t\t\t\tordersWithCoupon: 1,\n\t\t\t\t\tordersWithoutCoupon: { $subtract: ['$totalOrders', '$ordersWithCoupon'] },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$sort: { date: 1 },\n\t\t\t},\n\t\t]);\n\n\t\t// Fill in missing dates with zero for graph continuity\n\t\tconst graphData = fillMissingPeriods(result, data.startDate, data.endDate, graphType, {\n\t\t\ttotalOrders: 0,\n\t\t\tordersWithCoupon: 0,\n\t\t\tordersWithoutCoupon: 0,\n\t\t});\n\n\t\treturn this.convertToCouponOrdersGraphFormat(graphData, graphType, data.startDate, data.endDate);\n\t}\n\n\tprivate convertToCouponOrdersGraphFormat(\n\t\tdata: Array<{ date: string; totalOrders: number; ordersWithCoupon: number; ordersWithoutCoupon: number }>,\n\t\tgraphType: GraphType,\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): GraphDTO {\n\t\tconst periodKeys = this.getPeriodKeys(startDate, endDate, graphType);\n\t\tconst categories = periodKeys.map(key => this.formatPeriodLabel(key, graphType));\n\n\t\tconst series = [\n\t\t\t{\n\t\t\t\tname: 'Coupon',\n\t\t\t\tdata: data.map(item => item.ordersWithCoupon),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'No Coupon',\n\t\t\t\tdata: data.map(item => item.ordersWithoutCoupon),\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\tcategories,\n\t\t\tseries,\n\t\t};\n\t}\n\n\tpublic async getUsersNewVsReturningGraphData(data: GraphInputDTO): Promise<GraphDTO> {\n\t\tconst startDate = dayjs(data.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(data.endDate).endOf('day').toDate();\n\n\t\tconst graphType = this.getEffectiveGraphType(data.graphType, data.startDate, data.endDate);\n\t\tconst dateFormat = this.getMongoDateFormat(graphType);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t// Orders in selected period\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getOrderGraphMatchStage(startDate, endDate, data.itemType),\n\t\t\t\t\t'adjustedFinance.coupon.coupon': { $ne: null },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Build graph bucket\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: {\n\t\t\t\t\t\t\tformat: dateFormat,\n\t\t\t\t\t\t\tdate: '$placedAt',\n\t\t\t\t\t\t\ttimezone: LyxaTimezone,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Unique user per period bucket\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: {\n\t\t\t\t\t\tuser: '$user',\n\t\t\t\t\t\tdate: '$date',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Lookup prior order (existence check)\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'orders',\n\t\t\t\t\tlet: { userId: '$_id.user' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: {\n\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$status', RegularOrderStatus.DELIVERED] },\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$expr: {\n\t\t\t\t\t\t\t\t\t\t\t\t$lt: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ifNull: ['$placedAt', '$createdAt'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate,\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $limit: 1 },\n\t\t\t\t\t],\n\t\t\t\t\tas: 'previousOrders',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Classify\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tisReturning: {\n\t\t\t\t\t\t$gt: [{ $size: '$previousOrders' }, 0],\n\t\t\t\t\t},\n\t\t\t\t\tdate: '$_id.date',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Aggregate graph metrics\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$date',\n\n\t\t\t\t\ttotalUsers: { $sum: 1 },\n\n\t\t\t\t\treturningUsers: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$cond: ['$isReturning', 1, 0],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\tnewUsers: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$cond: ['$isReturning', 0, 1],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tdate: '$_id',\n\t\t\t\t\ttotalUsers: 1,\n\t\t\t\t\tnewUsers: 1,\n\t\t\t\t\treturningUsers: 1,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{ $sort: { date: 1 } },\n\t\t]);\n\n\t\tconst graphData = fillMissingPeriods(result, data.startDate, data.endDate, graphType, {\n\t\t\ttotalUsers: 0,\n\t\t\tnewUsers: 0,\n\t\t\treturningUsers: 0,\n\t\t});\n\n\t\treturn this.convertToUsersNewVsReturningGraphFormat(graphData, graphType, data.startDate, data.endDate);\n\t}\n\n\tprivate convertToUsersNewVsReturningGraphFormat(\n\t\tdata: Array<{ date: string; totalUsers: number; newUsers: number; returningUsers: number }>,\n\t\tgraphType: GraphType,\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): GraphDTO {\n\t\tconst periodKeys = this.getPeriodKeys(startDate, endDate, graphType);\n\t\tconst categories = periodKeys.map(key => this.formatPeriodLabel(key, graphType));\n\n\t\tconst series = [\n\t\t\t{\n\t\t\t\tname: 'New Users',\n\t\t\t\tdata: data.map(item => item.newUsers),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Returning Users',\n\t\t\t\tdata: data.map(item => item.returningUsers),\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\tcategories,\n\t\t\tseries,\n\t\t};\n\t}\n\n\tpublic async getCouponProfitGraphData(data: GraphInputDTO): Promise<TotalProfitGraphDTO> {\n\t\tconst startDate = dayjs(data.startDate).startOf('day').toDate();\n\t\tconst endDate = dayjs(data.endDate).endOf('day').toDate();\n\n\t\tconst graphType = this.getEffectiveGraphType(data.graphType, data.startDate, data.endDate);\n\t\tconst dateFormat = this.getMongoDateFormat(graphType);\n\n\t\tconst result = await this.orderModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t...this.getOrderGraphMatchStage(startDate, endDate, data.itemType),\n\t\t\t\t\t'adjustedFinance.coupon.coupon': { $ne: null },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: {\n\t\t\t\t\t\t\tformat: dateFormat,\n\t\t\t\t\t\t\tdate: '$placedAt',\n\t\t\t\t\t\t\ttimezone: LyxaTimezone,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$date',\n\n\t\t\t\t\ttotalProfit: {\n\t\t\t\t\t\t$sum: '$adjustedFinance.companyProfit.totalProfit',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tdate: '$_id',\n\t\t\t\t\ttotalProfit: 1,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$sort: { date: 1 },\n\t\t\t},\n\t\t]);\n\n\t\t// Fill in missing dates with zero for graph continuity\n\t\tconst graphData = fillMissingPeriods(result, data.startDate, data.endDate, graphType, {\n\t\t\ttotalProfit: 0,\n\t\t});\n\n\t\treturn this.convertToCouponProfitGraphFormat(graphData, graphType, data.startDate, data.endDate);\n\t}\n\n\tprivate convertToCouponProfitGraphFormat(\n\t\tdata: Array<{ date: string; totalProfit: number }>,\n\t\tgraphType: GraphType,\n\t\tstartDate: Date,\n\t\tendDate: Date\n\t): TotalProfitGraphDTO {\n\t\tconst periodKeys = this.getPeriodKeys(startDate, endDate, graphType);\n\t\tconst categories = periodKeys.map(key => this.formatPeriodLabel(key, graphType));\n\n\t\tconst series = [\n\t\t\t{\n\t\t\t\tname: 'Profit',\n\t\t\t\tdata: data.map(item => item.totalProfit),\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\tcategories,\n\t\t\tseries,\n\t\t\ttotalProfit: data.reduce((sum, item) => sum + item.totalProfit, 0),\n\t\t};\n\t}\n\n\tpublic async getMetricsForCoupon(couponId: string, duration?: DateInputDTO): Promise<any> {\n\t\tconst match: mongoose.PipelineStage.Match['$match'] = {\n\t\t\t'adjustedFinance.coupon.coupon': new mongoose.Types.ObjectId(couponId),\n\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t};\n\t\tif (duration?.startDate && duration?.endDate) {\n\t\t\tmatch.placedAt = {\n\t\t\t\t$gte: dayjs(duration.startDate).startOf('day').toDate(),\n\t\t\t\t$lte: dayjs(duration.endDate).endOf('day').toDate(),\n\t\t\t};\n\t\t}\n\n\t\tconst [result] = await this.orderModel.aggregate([\n\t\t\t{ $match: match },\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: null,\n\t\t\t\t\ttotalOrder: { $sum: 1 },\n\t\t\t\t\trevenue: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t'$adjustedFinance.pricing.total',\n\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.shopProfit.totalProfit', 0] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tamountSpent: { $sum: '$adjustedFinance.pricing.couponDiscount' },\n\t\t\t\t\tusers: { $addToSet: '$user' },\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t\ttotalOrder: 1,\n\t\t\t\t\trevenue: 1,\n\t\t\t\t\tamountSpent: 1,\n\t\t\t\t\tuserEngagement: { $size: '$users' },\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tconst revenue = roundBaseCurrency(result?.revenue ?? 0);\n\t\tconst amountSpent = roundBaseCurrency(result?.amountSpent ?? 0);\n\t\tconst totalOrder = result?.totalOrder ?? 0;\n\n\t\treturn {\n\t\t\ttotalOrder,\n\t\t\ttotalRedemption: totalOrder,\n\t\t\trevenue,\n\t\t\tamountSpent,\n\t\t\tuserEngagement: result?.userEngagement ?? 0,\n\t\t\troi: amountSpent > 0 ? roundBaseCurrency(revenue / amountSpent) : 0,\n\t\t};\n\t}\n}\n"]}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { BaseCoupon } from '@lyxa.ai/core/dist/libraries/mongo/models';
|
|
1
2
|
import { mongoose } from '@typegoose/typegoose';
|
|
2
3
|
import { ItemType } from '@lyxa.ai/core/dist/utilities/enum';
|
|
4
|
+
import { CouponUsersRequestDTO } from '../../../../coupon/validations';
|
|
3
5
|
export declare class CouponRepository {
|
|
4
6
|
private readonly model;
|
|
5
7
|
private readonly userModel;
|
|
6
8
|
private readonly referralSettingsModel;
|
|
9
|
+
private readonly zoneModel;
|
|
7
10
|
private _coreUserModel;
|
|
11
|
+
private orderModel;
|
|
8
12
|
constructor();
|
|
9
13
|
private get coreUserModel();
|
|
10
14
|
getUserCoupons(user: mongoose.Types.ObjectId | undefined, shop: mongoose.Types.ObjectId | undefined, vendor: mongoose.Types.ObjectId | undefined, itemType: ItemType | undefined): Promise<any>;
|
|
@@ -13,5 +17,18 @@ export declare class CouponRepository {
|
|
|
13
17
|
private formatCurrency;
|
|
14
18
|
private filterShopVendorCoupons;
|
|
15
19
|
private filterFirstOrderOnlyCoupons;
|
|
20
|
+
findById(couponId: string): Promise<BaseCoupon | null>;
|
|
21
|
+
singleCouponUsers(params: CouponUsersRequestDTO): Promise<{
|
|
22
|
+
metadata: {
|
|
23
|
+
page: number;
|
|
24
|
+
size: number;
|
|
25
|
+
totalElements: any;
|
|
26
|
+
totalPages: number;
|
|
27
|
+
};
|
|
28
|
+
documents: any;
|
|
29
|
+
}>;
|
|
30
|
+
private buildCouponUsersPipeline;
|
|
31
|
+
private attachCoreUsers;
|
|
32
|
+
private attachZones;
|
|
16
33
|
}
|
|
17
34
|
//# sourceMappingURL=CouponRepository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CouponRepository.d.ts","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponRepository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CouponRepository.d.ts","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EAUV,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAEN,QAAQ,EAKR,MAAM,mCAAmC,CAAC;AAI3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGpE,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiE;IACvG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,cAAc,CAAoD;IAC1E,OAAO,CAAC,UAAU,CAAoB;;IAWtC,OAAO,KAAK,aAAa,GAKxB;IAEY,cAAc,CAC1B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,EACzC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,EACzC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,EAC3C,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC5B,OAAO,CAAC,GAAG,CAAC;IAwaR,qBAAqB,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG;IAQxC,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;IAiDhD,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,uBAAuB;IAkE/B,OAAO,CAAC,2BAA2B;IAgF5B,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAInB,iBAAiB,CAAC,MAAM,EAAE,qBAAqB;;;;;;;;;IAmB5D,OAAO,CAAC,wBAAwB;YAyFlB,eAAe;YAsCf,WAAW;CA0CzB"}
|
|
@@ -2,20 +2,26 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CouponRepository = void 0;
|
|
4
4
|
const models_1 = require("@lyxa.ai/core/dist/libraries/mongo/models");
|
|
5
|
+
const typegoose_1 = require("@typegoose/typegoose");
|
|
5
6
|
const common_pipeline_functions_1 = require("@lyxa.ai/core/dist/utilities/pipelines/common-pipeline-functions");
|
|
6
7
|
const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
|
|
7
8
|
const currency_1 = require("@lyxa.ai/core/dist/utilities/currency");
|
|
8
9
|
const shared_1 = require("@lyxa.ai/core/dist/utilities/shared");
|
|
9
10
|
const dayjs_1 = require("@lyxa.ai/core/dist/utilities/dayjs");
|
|
11
|
+
const pagination_1 = require("@lyxa.ai/core/dist/utilities/pagination");
|
|
10
12
|
class CouponRepository {
|
|
11
13
|
model;
|
|
12
14
|
userModel;
|
|
13
15
|
referralSettingsModel;
|
|
16
|
+
zoneModel;
|
|
14
17
|
_coreUserModel = null;
|
|
18
|
+
orderModel;
|
|
15
19
|
constructor() {
|
|
16
20
|
this.model = models_1.CouponModel;
|
|
17
21
|
this.userModel = models_1.UserModel;
|
|
18
22
|
this.referralSettingsModel = models_1.ReferralSettingModel;
|
|
23
|
+
this.zoneModel = models_1.ZoneModel;
|
|
24
|
+
this.orderModel = models_1.OrderModel;
|
|
19
25
|
}
|
|
20
26
|
get coreUserModel() {
|
|
21
27
|
if (!this._coreUserModel) {
|
|
@@ -587,6 +593,135 @@ class CouponRepository {
|
|
|
587
593
|
},
|
|
588
594
|
];
|
|
589
595
|
}
|
|
596
|
+
findById(couponId) {
|
|
597
|
+
return this.model.findOne({ _id: couponId, deletedAt: null }).lean().exec();
|
|
598
|
+
}
|
|
599
|
+
async singleCouponUsers(params) {
|
|
600
|
+
const { page = 1, size = 10, sort } = params;
|
|
601
|
+
const pipeline = this.buildCouponUsersPipeline(params);
|
|
602
|
+
const result = await (0, pagination_1.paginateAggregation)(this.orderModel, pipeline, page, size, sort ?? { creationDate: -1 });
|
|
603
|
+
await this.attachCoreUsers(result.documents);
|
|
604
|
+
await this.attachZones(result.documents);
|
|
605
|
+
return result;
|
|
606
|
+
}
|
|
607
|
+
buildCouponUsersPipeline(params) {
|
|
608
|
+
const { couponId, search } = params;
|
|
609
|
+
const pipeline = [
|
|
610
|
+
{
|
|
611
|
+
$match: {
|
|
612
|
+
'adjustedFinance.coupon.coupon': new typegoose_1.mongoose.Types.ObjectId(couponId),
|
|
613
|
+
status: enum_1.RegularOrderStatus.DELIVERED,
|
|
614
|
+
},
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
$group: {
|
|
618
|
+
_id: '$user',
|
|
619
|
+
orders: {
|
|
620
|
+
$sum: 1,
|
|
621
|
+
},
|
|
622
|
+
},
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
$lookup: {
|
|
626
|
+
from: this.userModel.collection.name,
|
|
627
|
+
localField: '_id',
|
|
628
|
+
foreignField: '_id',
|
|
629
|
+
as: 'user',
|
|
630
|
+
pipeline: [
|
|
631
|
+
{
|
|
632
|
+
$project: {
|
|
633
|
+
coreUser: 1,
|
|
634
|
+
phoneNumber: 1,
|
|
635
|
+
location: 1,
|
|
636
|
+
createdAt: 1,
|
|
637
|
+
},
|
|
638
|
+
},
|
|
639
|
+
],
|
|
640
|
+
},
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
$unwind: '$user',
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
$project: {
|
|
647
|
+
_id: 0,
|
|
648
|
+
id: {
|
|
649
|
+
$toString: '$user._id',
|
|
650
|
+
},
|
|
651
|
+
coreUserId: {
|
|
652
|
+
$toString: '$user.coreUser',
|
|
653
|
+
},
|
|
654
|
+
mobile: '$user.phoneNumber',
|
|
655
|
+
location: '$user.location',
|
|
656
|
+
orders: 1,
|
|
657
|
+
creationDate: '$user.createdAt',
|
|
658
|
+
},
|
|
659
|
+
},
|
|
660
|
+
];
|
|
661
|
+
if (search) {
|
|
662
|
+
pipeline.push({
|
|
663
|
+
$match: {
|
|
664
|
+
mobile: {
|
|
665
|
+
$regex: search,
|
|
666
|
+
$options: 'i',
|
|
667
|
+
},
|
|
668
|
+
},
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
return pipeline;
|
|
672
|
+
}
|
|
673
|
+
async attachCoreUsers(documents) {
|
|
674
|
+
const coreUserIds = [...new Set(documents.map(doc => doc.coreUserId).filter(Boolean))];
|
|
675
|
+
const coreUsers = await this.coreUserModel
|
|
676
|
+
.find({
|
|
677
|
+
_id: {
|
|
678
|
+
$in: coreUserIds,
|
|
679
|
+
},
|
|
680
|
+
}, {
|
|
681
|
+
name: 1,
|
|
682
|
+
email: 1,
|
|
683
|
+
profilePhoto: 1,
|
|
684
|
+
status: 1,
|
|
685
|
+
})
|
|
686
|
+
.lean();
|
|
687
|
+
const map = new Map(coreUsers.map(user => [user._id.toString(), user]));
|
|
688
|
+
documents.forEach(doc => {
|
|
689
|
+
const coreUser = map.get(doc.coreUserId);
|
|
690
|
+
doc.name = coreUser?.name;
|
|
691
|
+
doc.avatar = coreUser?.profilePhoto;
|
|
692
|
+
doc.email = coreUser?.email;
|
|
693
|
+
doc.status = coreUser?.status;
|
|
694
|
+
delete doc.coreUserId;
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
async attachZones(documents) {
|
|
698
|
+
await Promise.all(documents.map(async (doc) => {
|
|
699
|
+
const coordinates = doc.location?.coordinates;
|
|
700
|
+
if (!coordinates?.length) {
|
|
701
|
+
doc.zone = null;
|
|
702
|
+
doc.zoneId = null;
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
const zone = await this.zoneModel
|
|
706
|
+
.findOne({
|
|
707
|
+
geometry: {
|
|
708
|
+
$geoIntersects: {
|
|
709
|
+
$geometry: {
|
|
710
|
+
type: 'Point',
|
|
711
|
+
coordinates,
|
|
712
|
+
},
|
|
713
|
+
},
|
|
714
|
+
},
|
|
715
|
+
}, {
|
|
716
|
+
_id: 1,
|
|
717
|
+
name: 1,
|
|
718
|
+
})
|
|
719
|
+
.lean();
|
|
720
|
+
doc.zone = zone?.name ?? null;
|
|
721
|
+
doc.zoneId = zone?._id?.toString() ?? null;
|
|
722
|
+
delete doc.location;
|
|
723
|
+
}));
|
|
724
|
+
}
|
|
590
725
|
}
|
|
591
726
|
exports.CouponRepository = CouponRepository;
|
|
592
727
|
//# sourceMappingURL=CouponRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CouponRepository.js","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCoupon,\n\tCouponModel,\n\tgetCoreUserModel,\n\tReferralSetting,\n\tReferralSettingModel,\n\tUser,\n\tUserModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { mongoose } from '@typegoose/typegoose';\nimport { getRoundSecondaryCurrencyStage } from '@lyxa.ai/core/dist/utilities/pipelines/common-pipeline-functions';\nimport {\n\tCouponType,\n\tItemType,\n\tRegularOrderStatus,\n\tServiceBookingStatus,\n\tStatus,\n\tValueType,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { getExchangeRate } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\n\nexport class CouponRepository {\n\tprivate readonly model: typeof CouponModel & SoftDeleteModel<Coupon>;\n\tprivate readonly userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate readonly referralSettingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate _coreUserModel: ReturnType<typeof getCoreUserModel> | null = null;\n\n\tconstructor() {\n\t\tthis.model = CouponModel as typeof CouponModel & SoftDeleteModel<Coupon>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t\tthis.referralSettingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t}\n\n\tprivate get coreUserModel() {\n\t\tif (!this._coreUserModel) {\n\t\t\tthis._coreUserModel = getCoreUserModel();\n\t\t}\n\t\treturn this._coreUserModel;\n\t}\n\n\tpublic async getUserCoupons(\n\t\tuser: mongoose.Types.ObjectId | undefined,\n\t\tshop: mongoose.Types.ObjectId | undefined,\n\t\tvendor: mongoose.Types.ObjectId | undefined,\n\t\titemType: ItemType | undefined\n\t): Promise<any> {\n\t\tconst [exchangeRate, referralSettings] = await Promise.all([\n\t\t\tgetExchangeRate(),\n\t\t\tthis.referralSettingsModel.findOne(),\n\t\t]);\n\n\t\tconst secondaryReferralReceiverValue =\n\t\t\treferralSettings?.receiver?.valueType == ValueType.PERCENTAGE\n\t\t\t\t? null\n\t\t\t\t: roundSecondaryCurrency((referralSettings?.receiver?.value ?? 0) * exchangeRate);\n\n\t\tconst secondaryReferralReceiverMinOrderAmount = roundSecondaryCurrency(\n\t\t\t(referralSettings?.receiver?.minimumOrderValue ?? 0) * exchangeRate\n\t\t);\n\n\t\tconst now = dayjs().toDate();\n\n\t\tconst pipeline: mongoose.PipelineStage[] = [\n\t\t\t// Match the user\n\t\t\t{\n\t\t\t\t$match: { _id: user },\n\t\t\t},\n\n\t\t\t// Lookup coupons with nested referral/influencer/shop\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'coupons',\n\t\t\t\t\tlocalField: 'coupons',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'couponDocs',\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t// Active and started\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: {\n\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $ifNull: ['$status', Status.ACTIVE] }, Status.ACTIVE] },\n\t\t\t\t\t\t\t\t\t\t{ $lte: [{ $ifNull: ['$duration.start', now] }, now] },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t...(shop || vendor\n\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t$nor: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: CouponType.INDIVIDUAL_STORE },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: CouponType.SHOPS_CATEGORIES },\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: { $ne: CouponType.CUSTOM_COUPON } },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ shops: { $exists: false } }, { shops: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ vendors: { $exists: false } }, { vendors: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ itemTypes: { $exists: false } }, { itemTypes: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup referralUser and influencer\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'referralUser',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'referralUser',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'influencer',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'influencer',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup shop\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'shops',\n\t\t\t\t\t\t\t\tlocalField: 'shop',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'shop',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { name: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup vendor\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'vendors',\n\t\t\t\t\t\t\t\tlocalField: 'vendor',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'vendor',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { name: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $unwind: { path: '$shop', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$vendor', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$referralUser', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$influencer', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$addFields: {\n\t\t\t\t\t\t\t\treferringUser: { $ifNull: ['$referralUser.coreUser', '$influencer.coreUser'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $project: { referralUser: 0, influencer: 0 } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Lookup orders once and compute:\n\t\t\t// - total usage per coupon\n\t\t\t// - all shops user ordered from\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'orders',\n\t\t\t\t\tlet: { userId: '$_id' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: { $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\tstatus: { $ne: RegularOrderStatus.CANCELLED },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$facet: {\n\t\t\t\t\t\t\t\t// ordered shops for first-order logic\n\t\t\t\t\t\t\t\torderedShops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\t\t\t\t\t\tshops: { $addToSet: '$shop' },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t\t// coupon usage WITH SNAPSHOT\n\t\t\t\t\t\t\t\tcouponUsage: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t\t\t\t'adjustedFinance.coupon.coupon': { $exists: true },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t\t\t\t\t\t\tsnap: { $first: '$adjustedFinance.coupon' },\n\t\t\t\t\t\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tas: 'orderStats',\n\t\t\t\t},\n\t\t\t},\n\t\t\t// Lookup service bookings once and compute vendor-side first-order/usage data.\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'serviceBookings',\n\t\t\t\t\tlet: { userId: '$_id' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: { $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\tstatus: { $ne: ServiceBookingStatus.CANCELLED },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$facet: {\n\t\t\t\t\t\t\t\torderedVendors: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\t\t\t\t\t\tvendors: { $addToSet: '$vendor' },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tcouponUsage: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t\t\t\t'adjustedFinance.coupon.coupon': { $exists: true },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t\t\t\t\t\t\tsnap: { $first: '$adjustedFinance.coupon' },\n\t\t\t\t\t\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tas: 'serviceBookingStats',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\torderedShops: {\n\t\t\t\t\t\t$ifNull: [{ $arrayElemAt: ['$orderStats.orderedShops.shops', 0] }, []],\n\t\t\t\t\t},\n\t\t\t\t\torderedVendors: {\n\t\t\t\t\t\t$ifNull: [{ $arrayElemAt: ['$serviceBookingStats.orderedVendors.vendors', 0] }, []],\n\t\t\t\t\t},\n\t\t\t\t\tcouponUsage: {\n\t\t\t\t\t\t$concatArrays: [\n\t\t\t\t\t\t\t{ $ifNull: [{ $arrayElemAt: ['$orderStats.couponUsage', 0] }, []] },\n\t\t\t\t\t\t\t{ $ifNull: [{ $arrayElemAt: ['$serviceBookingStats.couponUsage', 0] }, []] },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Unwind coupons to classify individually\n\t\t\t{ $unwind: '$couponDocs' },\n\n\t\t\t// Filter coupons by shop/vendor/itemType\n\t\t\t...(shop || vendor ? this.filterShopVendorCoupons(shop, vendor, itemType) : []),\n\n\t\t\t// First-order-only coupon filter\n\t\t\t...this.filterFirstOrderOnlyCoupons({ shop, vendor }),\n\n\t\t\t// Compute usage count per coupon\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tusageData: {\n\t\t\t\t\t\t$arrayElemAt: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$filter: {\n\t\t\t\t\t\t\t\t\tinput: '$couponUsage',\n\t\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\t\tcond: { $eq: ['$$cu._id', '$couponDocs._id'] },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tusedCount: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$map: {\n\t\t\t\t\t\t\t\tinput: {\n\t\t\t\t\t\t\t\t\t$filter: {\n\t\t\t\t\t\t\t\t\t\tinput: '$couponUsage',\n\t\t\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\t\t\tcond: { $eq: ['$$cu._id', '$couponDocs._id'] },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\tin: { $ifNull: ['$$cu.count', 0] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Expiration & secondary currency\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tisExpired: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t{ $gt: [{ $strLenCP: { $ifNull: ['$couponDocs.expirationReason', ''] } }, 0] },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $ifNull: ['$couponDocs.duration.end', false] },\n\t\t\t\t\t\t\t\t\t{ $lt: ['$couponDocs.duration.end', now] },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\texchangeRate,\n\t\t\t\t\t'couponDocs.value': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.value ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.value',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.valueType': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.valueType ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.valueType',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyValue': {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.valueType', ValueType.PERCENTAGE] },\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverValue,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.value', exchangeRate],\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyMaxDiscountLimit': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: null,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.maxDiscountLimit', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyMinOrderValue': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverMinOrderAmount,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.minOrderValue', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Classify category\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tcategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t'$isExpired',\n\t\t\t\t\t\t\t'expired',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t{ $gt: ['$usedCount', 0] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $not: ['$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $lt: ['$usedCount', '$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t'available',\n\t\t\t\t\t\t\t\t\t\t\t'used',\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'available',\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Group into arrays\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tavailable: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'available'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t\tused: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'used'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t\texpired: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'expired'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{ $project: { _id: 0 } },\n\t\t];\n\n\t\tconst [results] = await this.userModel.aggregate(pipeline);\n\n\t\tif (!results) {\n\t\t\treturn {\n\t\t\t\tavailable: [],\n\t\t\t\tused: [],\n\t\t\t\texpired: [],\n\t\t\t};\n\t\t}\n\n\t\tconst populatedResults = await this.userModel.populate(results, {\n\t\t\tpath: 'available.referringUser',\n\t\t\tmodel: this.coreUserModel,\n\t\t\tselect: { _id: 0, name: 1 },\n\t\t});\n\n\t\treturn populatedResults;\n\t}\n\n\tpublic addLabelsToAllCoupons(coupons: any): any {\n\t\treturn {\n\t\t\tavailable: this.addLabelsToCoupons(coupons.available).reverse(), // Just to make newly added coupon at the top\n\t\t\tused: this.addLabelsToCoupons(coupons.used).reverse(), // Just to make newly added coupon at the top\n\t\t\texpired: this.addLabelsToCoupons(coupons.expired).reverse(), // Just to make newly added coupon at the top\n\t\t};\n\t}\n\n\tpublic addLabelsToCoupons(coupons: any[]): any[] {\n\t\tconst resultsWithLabels = coupons.map(coupon => {\n\t\t\t// couponOfferLabel\n\t\t\tconst valuePart =\n\t\t\t\tcoupon.valueType === 'fixed'\n\t\t\t\t\t? this.formatCurrency(coupon.value, coupon.secondaryCurrencyValue)\n\t\t\t\t\t: `${coupon.value}%`;\n\n\t\t\tconst maxDiscountPart =\n\t\t\t\tcoupon.isMaxDiscountLimitEnabled && coupon.maxDiscountLimit > 0\n\t\t\t\t\t? ` up to ${this.formatCurrency(coupon.maxDiscountLimit, coupon.secondaryCurrencyMaxDiscountLimit)}`\n\t\t\t\t\t: '';\n\n\t\t\tconst influencerPart = coupon.referringUser ? ` (Referred by ${coupon.referringUser.name})` : '';\n\n\t\t\tcoupon.couponOfferLabel = `Save ${valuePart}${maxDiscountPart}${influencerPart}`;\n\n\t\t\t// couponValidityLabel\n\t\t\tlet validityParts: string[] = [];\n\n\t\t\t// 1. Minimum Order\n\t\t\tif (coupon.couponType === CouponType.REFERRAL_CODE) {\n\t\t\t\tvalidityParts.push(\n\t\t\t\t\t`Minimum order ${this.formatCurrency(null, coupon.secondaryCurrencyMinOrderValue)}`\n\t\t\t\t);\n\t\t\t} else if (coupon.isMinOrderValueEnabled && coupon.minOrderValue > 0) {\n\t\t\t\tvalidityParts.push(\n\t\t\t\t\t`Minimum order ${this.formatCurrency(coupon.minOrderValue, coupon.secondaryCurrencyMinOrderValue)}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// 2. Order Limit\n\t\t\tif (coupon.isOrderLimitPerUserEnabled && coupon.orderLimitPerUser > 0) {\n\t\t\t\tvalidityParts.push(`Applied on ${coupon.orderLimitPerUser} order`);\n\t\t\t}\n\n\t\t\t// if(coupon.couponType === CouponType.REFERRAL_CODE || coupon.couponType === CouponType.REFERRAL_REWARD){\n\t\t\t// \tvalidityParts = [];\n\t\t\t// \tvalidityParts.push(`Applied on 1 Order`);\n\t\t\t// }\n\n\t\t\tcoupon.couponValidityLabel = validityParts.join('. ');\n\n\t\t\treturn coupon;\n\t\t});\n\n\t\treturn resultsWithLabels;\n\t}\n\n\tprivate formatCurrency(value: any, secondaryCurrencyValue: any) {\n\t\t// Use coma separator for thousands and round secondary currency value\n\t\tconst formatterUSD = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: 0,\n\t\t\tmaximumFractionDigits: 2,\n\t\t});\n\n\t\tconst formatterLBP = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: 0,\n\t\t});\n\n\t\tif (secondaryCurrencyValue !== null && secondaryCurrencyValue !== undefined) {\n\t\t\treturn 'LBP ' + formatterLBP.format(Number(secondaryCurrencyValue));\n\t\t}\n\n\t\treturn '$' + formatterUSD.format(Number(value ?? 0));\n\t}\n\n\tprivate filterShopVendorCoupons(\n\t\tshop?: mongoose.Types.ObjectId,\n\t\tvendor?: mongoose.Types.ObjectId,\n\t\titemType?: ItemType\n\t): mongoose.PipelineStage[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$expr: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\t\t\tshop\n\t\t\t\t\t\t\t\t\t\t? { $eq: ['$couponDocs.shop._id', shop] }\n\t\t\t\t\t\t\t\t\t\t: { $eq: ['$couponDocs.vendor._id', vendor] },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{ $in: [itemType, { $ifNull: ['$couponDocs.itemTypes', []] }] },\n\t\t\t\t\t\t\t\t\t\t\t...(shop ? [{ $in: [shop, { $ifNull: ['$couponDocs.shops', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t\t...(vendor ? [{ $in: [vendor, { $ifNull: ['$couponDocs.vendors', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_USER] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{ $in: [itemType, { $ifNull: ['$couponDocs.itemTypes', []] }] },\n\t\t\t\t\t\t\t\t\t\t\t...(shop ? [{ $in: [shop, { $ifNull: ['$couponDocs.shops', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t\t...(vendor ? [{ $in: [vendor, { $ifNull: ['$couponDocs.vendors', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $size: { $ifNull: ['$couponDocs.shops', []] } }, 0] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $size: { $ifNull: ['$couponDocs.vendors', []] } }, 0] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $size: { $ifNull: ['$couponDocs.itemTypes', []] } }, 0] },\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$not: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$in: [\n\t\t\t\t\t\t\t\t\t\t\t'$couponDocs.couponType',\n\t\t\t\t\t\t\t\t\t\t\t[CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES, CouponType.INDIVIDUAL_USER],\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate filterFirstOrderOnlyCoupons(data: {\n\t\tshop?: mongoose.Types.ObjectId;\n\t\tvendor?: mongoose.Types.ObjectId;\n\t}): mongoose.PipelineStage[] {\n\t\tconst { shop, vendor } = data;\n\t\tconst hasOrderedFromStore = vendor\n\t\t\t? { $in: [vendor, '$orderedVendors'] }\n\t\t\t: shop\n\t\t\t\t? { $in: [shop, '$orderedShops'] }\n\t\t\t\t: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t{ $in: ['$couponDocs.shop._id', '$orderedShops'] },\n\t\t\t\t\t\t\t{ $in: ['$couponDocs.vendor._id', '$orderedVendors'] },\n\t\t\t\t\t\t],\n\t\t\t\t\t};\n\t\tconst hasUnusedStoreInCategory = vendor\n\t\t\t? { $in: [vendor, '$orderedVendors'] }\n\t\t\t: shop\n\t\t\t\t? { $in: [shop, '$orderedShops'] }\n\t\t\t\t: {\n\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$eq: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$size: {\n\t\t\t\t\t\t\t\t\t\t\t$setDifference: [{ $ifNull: ['$couponDocs.shops', []] }, '$orderedShops'],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$eq: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$size: {\n\t\t\t\t\t\t\t\t\t\t\t$setDifference: [{ $ifNull: ['$couponDocs.vendors', []] }, '$orderedVendors'],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t};\n\n\t\treturn [\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\thasOrderedFromStore: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\thasOrderedFromStore,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\thasUnusedShopInCategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\thasUnusedStoreInCategory,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$expr: {\n\t\t\t\t\t\t$not: {\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$in: ['$couponDocs.couponType', [CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES]],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.firstOrderOnly', true] },\n\t\t\t\t\t\t\t\t{ $or: ['$hasOrderedFromStore', '$hasUnusedShopInCategory'] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CouponRepository.js","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponRepository.ts"],"names":[],"mappings":";;;AAAA,sEAWmD;AAEnD,oDAAgD;AAChD,gHAAkH;AAClH,4DAO2C;AAC3C,oEAAwE;AACxE,gEAA6E;AAC7E,8DAA2D;AAE3D,wEAAkG;AAElG,MAAa,gBAAgB;IACX,KAAK,CAA+C;IACpD,SAAS,CAA2C;IACpD,qBAAqB,CAAiE;IACtF,SAAS,CAAmB;IACrC,cAAc,GAA+C,IAAI,CAAC;IAClE,UAAU,CAAoB;IAEtC;QACC,IAAI,CAAC,KAAK,GAAG,oBAA2D,CAAC;QACzE,IAAI,CAAC,SAAS,GAAG,kBAAqD,CAAC;QACvE,IAAI,CAAC,qBAAqB,GAAG,6BACI,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,kBAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,mBAA+B,CAAC;IACnD,CAAC;IAED,IAAY,aAAa;QACxB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,GAAG,IAAA,yBAAgB,GAAE,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAEM,KAAK,CAAC,cAAc,CAC1B,IAAyC,EACzC,IAAyC,EACzC,MAA2C,EAC3C,QAA8B;QAE9B,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,IAAA,0BAAe,GAAE;YACjB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;SACpC,CAAC,CAAC;QAEH,MAAM,8BAA8B,GACnC,gBAAgB,EAAE,QAAQ,EAAE,SAAS,IAAI,gBAAS,CAAC,UAAU;YAC5D,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAA,+BAAsB,EAAC,CAAC,gBAAgB,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;QAEpF,MAAM,uCAAuC,GAAG,IAAA,+BAAsB,EACrE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,IAAI,CAAC,CAAC,GAAG,YAAY,CACnE,CAAC;QAEF,MAAM,GAAG,GAAG,IAAA,aAAK,GAAE,CAAC,MAAM,EAAE,CAAC;QAE7B,MAAM,QAAQ,GAA6B;YAE1C;gBACC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;aACrB;YAGD;gBACC,OAAO,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,SAAS;oBACrB,YAAY,EAAE,KAAK;oBACnB,EAAE,EAAE,YAAY;oBAChB,QAAQ,EAAE;wBAET;4BACC,MAAM,EAAE;gCACP,KAAK,EAAE;oCACN,IAAI,EAAE;wCACL,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,aAAM,CAAC,MAAM,CAAC,EAAE,EAAE,aAAM,CAAC,MAAM,CAAC,EAAE;wCACjE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE;qCACtD;iCACD;gCACD,GAAG,CAAC,IAAI,IAAI,MAAM;oCACjB,CAAC,CAAC,EAAE;oCACJ,CAAC,CAAC;wCACA,IAAI,EAAE;4CACL;gDACC,IAAI,EAAE;oDACL,EAAE,UAAU,EAAE,iBAAU,CAAC,gBAAgB,EAAE;oDAC3C,EAAE,UAAU,EAAE,iBAAU,CAAC,gBAAgB,EAAE;iDAC3C;6CACD;4CACD;gDACC,GAAG,EAAE;oDACJ,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,iBAAU,CAAC,aAAa,EAAE,EAAE;oDACjD;wDACC,IAAI,EAAE;4DACL,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;4DACjE,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;4DACrE,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;yDACzE;qDACD;iDACD;6CACD;yCACD;qCACD,CAAC;6BACJ;yBACD;wBAED;4BACC,OAAO,EAAE;gCACR,IAAI,EAAE,OAAO;gCACb,UAAU,EAAE,cAAc;gCAC1B,YAAY,EAAE,KAAK;gCACnB,EAAE,EAAE,cAAc;gCAClB,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;6BACzC;yBACD;wBACD;4BACC,OAAO,EAAE;gCACR,IAAI,EAAE,OAAO;gCACb,UAAU,EAAE,YAAY;gCACxB,YAAY,EAAE,KAAK;gCACnB,EAAE,EAAE,YAAY;gCAChB,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;6BACzC;yBACD;wBAED;4BACC,OAAO,EAAE;gCACR,IAAI,EAAE,OAAO;gCACb,UAAU,EAAE,MAAM;gCAClB,YAAY,EAAE,KAAK;gCACnB,EAAE,EAAE,MAAM;gCACV,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;6BACrC;yBACD;wBAED;4BACC,OAAO,EAAE;gCACR,IAAI,EAAE,SAAS;gCACf,UAAU,EAAE,QAAQ;gCACpB,YAAY,EAAE,KAAK;gCACnB,EAAE,EAAE,QAAQ;gCACZ,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;6BACrC;yBACD;wBACD,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE,EAAE;wBAChE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,0BAA0B,EAAE,IAAI,EAAE,EAAE;wBAClE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,0BAA0B,EAAE,IAAI,EAAE,EAAE;wBACxE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,0BAA0B,EAAE,IAAI,EAAE,EAAE;wBACtE;4BACC,UAAU,EAAE;gCACX,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,wBAAwB,EAAE,sBAAsB,CAAC,EAAE;6BAC9E;yBACD;wBACD,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE;qBAChD;iBACD;aACD;YAKD;gBACC,OAAO,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;oBACvB,QAAQ,EAAE;wBACT;4BACC,MAAM,EAAE;gCACP,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;gCACrC,MAAM,EAAE,EAAE,GAAG,EAAE,yBAAkB,CAAC,SAAS,EAAE;6BAC7C;yBACD;wBACD;4BACC,MAAM,EAAE;gCAEP,YAAY,EAAE;oCACb;wCACC,MAAM,EAAE;4CACP,GAAG,EAAE,IAAI;4CACT,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE;yCAC7B;qCACD;iCACD;gCAGD,WAAW,EAAE;oCACZ;wCACC,MAAM,EAAE;4CACP,+BAA+B,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;yCAClD;qCACD;oCACD;wCACC,MAAM,EAAE;4CACP,GAAG,EAAE,gCAAgC;4CACrC,IAAI,EAAE,EAAE,MAAM,EAAE,yBAAyB,EAAE;4CAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;yCAClB;qCACD;iCACD;6BACD;yBACD;qBACD;oBACD,EAAE,EAAE,YAAY;iBAChB;aACD;YAED;gBACC,OAAO,EAAE;oBACR,IAAI,EAAE,iBAAiB;oBACvB,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;oBACvB,QAAQ,EAAE;wBACT;4BACC,MAAM,EAAE;gCACP,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;gCACrC,MAAM,EAAE,EAAE,GAAG,EAAE,2BAAoB,CAAC,SAAS,EAAE;6BAC/C;yBACD;wBACD;4BACC,MAAM,EAAE;gCACP,cAAc,EAAE;oCACf;wCACC,MAAM,EAAE;4CACP,GAAG,EAAE,IAAI;4CACT,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;yCACjC;qCACD;iCACD;gCACD,WAAW,EAAE;oCACZ;wCACC,MAAM,EAAE;4CACP,+BAA+B,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;yCAClD;qCACD;oCACD;wCACC,MAAM,EAAE;4CACP,GAAG,EAAE,gCAAgC;4CACrC,IAAI,EAAE,EAAE,MAAM,EAAE,yBAAyB,EAAE;4CAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;yCAClB;qCACD;iCACD;6BACD;yBACD;qBACD;oBACD,EAAE,EAAE,qBAAqB;iBACzB;aACD;YACD;gBACC,UAAU,EAAE;oBACX,YAAY,EAAE;wBACb,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,gCAAgC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;qBACtE;oBACD,cAAc,EAAE;wBACf,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,6CAA6C,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;qBACnF;oBACD,WAAW,EAAE;wBACZ,aAAa,EAAE;4BACd,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;4BACnE,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,kCAAkC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;yBAC5E;qBACD;iBACD;aACD;YAGD,EAAE,OAAO,EAAE,aAAa,EAAE;YAG1B,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAG/E,GAAG,IAAI,CAAC,2BAA2B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAGrD;gBACC,UAAU,EAAE;oBACX,SAAS,EAAE;wBACV,YAAY,EAAE;4BACb;gCACC,OAAO,EAAE;oCACR,KAAK,EAAE,cAAc;oCACrB,EAAE,EAAE,IAAI;oCACR,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE;iCAC9C;6BACD;4BACD,CAAC;yBACD;qBACD;iBACD;aACD;YACD;gBACC,UAAU,EAAE;oBACX,SAAS,EAAE;wBACV,IAAI,EAAE;4BACL,IAAI,EAAE;gCACL,KAAK,EAAE;oCACN,OAAO,EAAE;wCACR,KAAK,EAAE,cAAc;wCACrB,EAAE,EAAE,IAAI;wCACR,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE;qCAC9C;iCACD;gCACD,EAAE,EAAE,IAAI;gCACR,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;6BAClC;yBACD;qBACD;iBACD;aACD;YAGD;gBACC,UAAU,EAAE;oBACX,SAAS,EAAE;wBACV,GAAG,EAAE;4BACJ,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,8BAA8B,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;4BAC9E;gCACC,IAAI,EAAE;oCACL,EAAE,OAAO,EAAE,CAAC,0BAA0B,EAAE,KAAK,CAAC,EAAE;oCAChD,EAAE,GAAG,EAAE,CAAC,0BAA0B,EAAE,GAAG,CAAC,EAAE;iCAC1C;6BACD;yBACD;qBACD;oBACD,YAAY;oBACZ,kBAAkB,EAAE;wBACnB,OAAO,EAAE;4BACR,QAAQ,EAAE;gCACT;oCACC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,aAAa,CAAC,EAAE;oCACnE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;iCAC5C;6BACD;4BACD,OAAO,EAAE,mBAAmB;yBAC5B;qBACD;oBACD,sBAAsB,EAAE;wBACvB,OAAO,EAAE;4BACR,QAAQ,EAAE;gCACT;oCACC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,aAAa,CAAC,EAAE;oCACnE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,IAAI,CAAC;iCAChD;6BACD;4BACD,OAAO,EAAE,uBAAuB;yBAChC;qBACD;oBACD,mCAAmC,EAAE;wBACpC,KAAK,EAAE;4BACN,EAAE,GAAG,EAAE,CAAC,uBAAuB,EAAE,gBAAS,CAAC,UAAU,CAAC,EAAE;4BACxD,IAAI;4BACJ;gCACC,OAAO,EAAE;oCACR,QAAQ,EAAE;wCACT;4CACC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,aAAa,CAAC,EAAE;4CACnE,IAAI,EAAE,8BAA8B;yCACpC;qCACD;oCACD,OAAO,EAAE,IAAA,0DAA8B,EAAC;wCACvC,SAAS,EAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;qCAC9C,CAAC;iCACF;6BACD;yBACD;qBACD;oBACD,8CAA8C,EAAE;wBAC/C,OAAO,EAAE;4BACR,QAAQ,EAAE;gCACT;oCACC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,aAAa,CAAC,EAAE;oCACnE,IAAI,EAAE,IAAI;iCACV;6BACD;4BACD,OAAO,EAAE,IAAA,0DAA8B,EAAC;gCACvC,SAAS,EAAE,CAAC,8BAA8B,EAAE,YAAY,CAAC;6BACzD,CAAC;yBACF;qBACD;oBACD,2CAA2C,EAAE;wBAC5C,OAAO,EAAE;4BACR,QAAQ,EAAE;gCACT;oCACC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,aAAa,CAAC,EAAE;oCACnE,IAAI,EAAE,uCAAuC;iCAC7C;6BACD;4BACD,OAAO,EAAE,IAAA,0DAA8B,EAAC;gCACvC,SAAS,EAAE,CAAC,2BAA2B,EAAE,YAAY,CAAC;6BACtD,CAAC;yBACF;qBACD;iBACD;aACD;YAGD;gBACC,UAAU,EAAE;oBACX,QAAQ,EAAE;wBACT,KAAK,EAAE;4BACN,YAAY;4BACZ,SAAS;4BACT;gCACC,KAAK,EAAE;oCACN,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;oCAC1B;wCACC,KAAK,EAAE;4CACN;gDACC,GAAG,EAAE;oDACJ,EAAE,IAAI,EAAE,CAAC,+BAA+B,CAAC,EAAE;oDAC3C,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,+BAA+B,CAAC,EAAE;iDACxD;6CACD;4CACD,WAAW;4CACX,MAAM;yCACN;qCACD;oCACD,WAAW;iCACX;6BACD;yBACD;qBACD;iBACD;aACD;YAGD;gBACC,MAAM,EAAE;oBACP,GAAG,EAAE,MAAM;oBACX,SAAS,EAAE;wBACV,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE;qBAClF;oBACD,IAAI,EAAE;wBACL,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE;qBAC7E;oBACD,OAAO,EAAE;wBACR,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE;qBAChF;iBACD;aACD;YAED,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;SACxB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO;gBACN,SAAS,EAAE,EAAE;gBACb,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;aACX,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC/D,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,IAAI,CAAC,aAAa;YACzB,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;SAC3B,CAAC,CAAC;QAEH,OAAO,gBAAgB,CAAC;IACzB,CAAC;IAEM,qBAAqB,CAAC,OAAY;QACxC,OAAO;YACN,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;YAC/D,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE;YACrD,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;SAC3D,CAAC;IACH,CAAC;IAEM,kBAAkB,CAAC,OAAc;QACvC,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAE9C,MAAM,SAAS,GACd,MAAM,CAAC,SAAS,KAAK,OAAO;gBAC3B,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC;gBAClE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC;YAEvB,MAAM,eAAe,GACpB,MAAM,CAAC,yBAAyB,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC;gBAC9D,CAAC,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,iCAAiC,CAAC,EAAE;gBACpG,CAAC,CAAC,EAAE,CAAC;YAEP,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAEjG,MAAM,CAAC,gBAAgB,GAAG,QAAQ,SAAS,GAAG,eAAe,GAAG,cAAc,EAAE,CAAC;YAGjF,IAAI,aAAa,GAAa,EAAE,CAAC;YAGjC,IAAI,MAAM,CAAC,UAAU,KAAK,iBAAU,CAAC,aAAa,EAAE,CAAC;gBACpD,aAAa,CAAC,IAAI,CACjB,iBAAiB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,8BAA8B,CAAC,EAAE,CACnF,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,sBAAsB,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtE,aAAa,CAAC,IAAI,CACjB,iBAAiB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,8BAA8B,CAAC,EAAE,CACnG,CAAC;YACH,CAAC;YAGD,IAAI,MAAM,CAAC,0BAA0B,IAAI,MAAM,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;gBACvE,aAAa,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,iBAAiB,QAAQ,CAAC,CAAC;YACpE,CAAC;YAOD,MAAM,CAAC,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEtD,OAAO,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IAEO,cAAc,CAAC,KAAU,EAAE,sBAA2B;QAE7D,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACnD,qBAAqB,EAAE,CAAC;YACxB,qBAAqB,EAAE,CAAC;SACxB,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACnD,qBAAqB,EAAE,CAAC;SACxB,CAAC,CAAC;QAEH,IAAI,sBAAsB,KAAK,IAAI,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;YAC7E,OAAO,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAEO,uBAAuB,CAC9B,IAA8B,EAC9B,MAAgC,EAChC,QAAmB;QAEnB,OAAO;YACN;gBACC,MAAM,EAAE;oBACP,KAAK,EAAE;wBACN,GAAG,EAAE;4BACJ;gCACC,IAAI,EAAE;oCACL,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,gBAAgB,CAAC,EAAE;oCAChE,IAAI;wCACH,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE;wCACzC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAAE;iCAC9C;6BACD;4BACD;gCACC,IAAI,EAAE;oCACL,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,gBAAgB,CAAC,EAAE;oCAChE;wCACC,GAAG,EAAE;4CACJ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;4CAC/D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4CAC1E,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;yCAChF;qCACD;iCACD;6BACD;4BACD;gCACC,IAAI,EAAE;oCACL,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,eAAe,CAAC,EAAE;oCAC/D;wCACC,GAAG,EAAE;4CACJ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;4CAC/D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4CAC1E,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4CAChF;gDACC,IAAI,EAAE;oDACL,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;oDAC/D,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;oDACjE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;iDACnE;6CACD;yCACD;qCACD;iCACD;6BACD;4BACD;gCACC,IAAI,EAAE;oCACL;wCACC,GAAG,EAAE;4CACJ,wBAAwB;4CACxB,CAAC,iBAAU,CAAC,gBAAgB,EAAE,iBAAU,CAAC,gBAAgB,EAAE,iBAAU,CAAC,eAAe,CAAC;yCACtF;qCACD;iCACD;6BACD;yBACD;qBACD;iBACD;aACD;SACD,CAAC;IACH,CAAC;IAEO,2BAA2B,CAAC,IAGnC;QACA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC9B,MAAM,mBAAmB,GAAG,MAAM;YACjC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE;YACtC,CAAC,CAAC,IAAI;gBACL,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE;gBAClC,CAAC,CAAC;oBACA,GAAG,EAAE;wBACJ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE,eAAe,CAAC,EAAE;wBAClD,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,EAAE;qBACtD;iBACD,CAAC;QACL,MAAM,wBAAwB,GAAG,MAAM;YACtC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE;YACtC,CAAC,CAAC,IAAI;gBACL,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE;gBAClC,CAAC,CAAC;oBACA,IAAI,EAAE;wBACL;4BACC,GAAG,EAAE;gCACJ;oCACC,KAAK,EAAE;wCACN,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC;qCACzE;iCACD;gCACD,CAAC;6BACD;yBACD;wBACD;4BACC,GAAG,EAAE;gCACJ;oCACC,KAAK,EAAE;wCACN,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,CAAC;qCAC7E;iCACD;gCACD,CAAC;6BACD;yBACD;qBACD;iBACD,CAAC;QAEL,OAAO;YACN;gBACC,UAAU,EAAE;oBACX,mBAAmB,EAAE;wBACpB,KAAK,EAAE;4BACN,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,gBAAgB,CAAC,EAAE;4BAChE,mBAAmB;4BACnB,KAAK;yBACL;qBACD;oBACD,uBAAuB,EAAE;wBACxB,KAAK,EAAE;4BACN,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,iBAAU,CAAC,gBAAgB,CAAC,EAAE;4BAChE,wBAAwB;4BACxB,KAAK;yBACL;qBACD;iBACD;aACD;YACD;gBACC,MAAM,EAAE;oBACP,KAAK,EAAE;wBACN,IAAI,EAAE;4BACL,IAAI,EAAE;gCACL;oCACC,GAAG,EAAE,CAAC,wBAAwB,EAAE,CAAC,iBAAU,CAAC,gBAAgB,EAAE,iBAAU,CAAC,gBAAgB,CAAC,CAAC;iCAC3F;gCACD,EAAE,GAAG,EAAE,CAAC,4BAA4B,EAAE,IAAI,CAAC,EAAE;gCAC7C,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE,0BAA0B,CAAC,EAAE;6BAC7D;yBACD;qBACD;iBACD;aACD;SACD,CAAC;IACH,CAAC;IACM,QAAQ,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAc,CAAC,IAAI,EAAE,CAAC;IACzF,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,MAA6B;QAC3D,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAmB,EACvC,IAAI,CAAC,UAAU,EACf,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAC5B,CAAC;QAEF,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC;IACf,CAAC;IACO,wBAAwB,CAAC,MAA6B;QAC7D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAEpC,MAAM,QAAQ,GAA6B;YAC1C;gBACC,MAAM,EAAE;oBACP,+BAA+B,EAAE,IAAI,oBAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAEtE,MAAM,EAAE,yBAAkB,CAAC,SAAS;iBACpC;aACD;YAED;gBACC,MAAM,EAAE;oBACP,GAAG,EAAE,OAAO;oBAEZ,MAAM,EAAE;wBACP,IAAI,EAAE,CAAC;qBACP;iBACD;aACD;YAED;gBACC,OAAO,EAAE;oBACR,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI;oBAEpC,UAAU,EAAE,KAAK;oBAEjB,YAAY,EAAE,KAAK;oBAEnB,EAAE,EAAE,MAAM;oBAEV,QAAQ,EAAE;wBACT;4BACC,QAAQ,EAAE;gCACT,QAAQ,EAAE,CAAC;gCAEX,WAAW,EAAE,CAAC;gCAEd,QAAQ,EAAE,CAAC;gCAEX,SAAS,EAAE,CAAC;6BACZ;yBACD;qBACD;iBACD;aACD;YAED;gBACC,OAAO,EAAE,OAAO;aAChB;YAED;gBACC,QAAQ,EAAE;oBACT,GAAG,EAAE,CAAC;oBAEN,EAAE,EAAE;wBACH,SAAS,EAAE,WAAW;qBACtB;oBAED,UAAU,EAAE;wBACX,SAAS,EAAE,gBAAgB;qBAC3B;oBAED,MAAM,EAAE,mBAAmB;oBAE3B,QAAQ,EAAE,gBAAgB;oBAE1B,MAAM,EAAE,CAAC;oBAET,YAAY,EAAE,iBAAiB;iBAC/B;aACD;SACD,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC;gBACb,MAAM,EAAE;oBACP,MAAM,EAAE;wBACP,MAAM,EAAE,MAAM;wBAEd,QAAQ,EAAE,GAAG;qBACb;iBACD;aACD,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC;IACO,KAAK,CAAC,eAAe,CAAC,SAAgB;QAC7C,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEvF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa;aACxC,IAAI,CACJ;YACC,GAAG,EAAE;gBACJ,GAAG,EAAE,WAAW;aAChB;SACD,EACD;YACC,IAAI,EAAE,CAAC;YAEP,KAAK,EAAE,CAAC;YAER,YAAY,EAAE,CAAC;YAEf,MAAM,EAAE,CAAC;SACT,CACD;aACA,IAAI,EAAE,CAAC;QAET,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAExE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAEzC,GAAG,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC;YAE1B,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,YAAY,CAAC;YAEpC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,KAAK,CAAC;YAE5B,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC;YAE9B,OAAO,GAAG,CAAC,UAAU,CAAC;QACvB,CAAC,CAAC,CAAC;IACJ,CAAC;IACO,KAAK,CAAC,WAAW,CAAC,SAAgB;QACzC,MAAM,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YACzB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC;YAE9C,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;gBAEhB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;gBAElB,OAAO;YACR,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS;iBAC/B,OAAO,CACP;gBACC,QAAQ,EAAE;oBACT,cAAc,EAAE;wBACf,SAAS,EAAE;4BACV,IAAI,EAAE,OAAO;4BAEb,WAAW;yBACX;qBACD;iBACD;aACD,EACD;gBACC,GAAG,EAAE,CAAC;gBAEN,IAAI,EAAE,CAAC;aACP,CACD;iBACA,IAAI,EAAE,CAAC;YAET,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;YAE9B,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC;YAE3C,OAAO,GAAG,CAAC,QAAQ,CAAC;QACrB,CAAC,CAAC,CACF,CAAC;IACH,CAAC;CACD;AAl2BD,4CAk2BC","sourcesContent":["import {\n\tBaseCoupon,\n\tCoupon,\n\tCouponModel,\n\tgetCoreUserModel,\n\tOrderModel,\n\tReferralSetting,\n\tReferralSettingModel,\n\tUser,\n\tUserModel,\n\tZoneModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { mongoose } from '@typegoose/typegoose';\nimport { getRoundSecondaryCurrencyStage } from '@lyxa.ai/core/dist/utilities/pipelines/common-pipeline-functions';\nimport {\n\tCouponType,\n\tItemType,\n\tRegularOrderStatus,\n\tServiceBookingStatus,\n\tStatus,\n\tValueType,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { getExchangeRate } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport { CouponUsersRequestDTO } from '@modules/coupon/validations';\nimport { paginateAggregation, RawPaginatedResult } from '@lyxa.ai/core/dist/utilities/pagination';\n\nexport class CouponRepository {\n\tprivate readonly model: typeof CouponModel & SoftDeleteModel<Coupon>;\n\tprivate readonly userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate readonly referralSettingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate readonly zoneModel: typeof ZoneModel;\n\tprivate _coreUserModel: ReturnType<typeof getCoreUserModel> | null = null;\n\tprivate orderModel: typeof OrderModel;\n\n\tconstructor() {\n\t\tthis.model = CouponModel as typeof CouponModel & SoftDeleteModel<Coupon>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t\tthis.referralSettingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t\tthis.zoneModel = ZoneModel;\n\t\tthis.orderModel = OrderModel as typeof OrderModel;\n\t}\n\n\tprivate get coreUserModel() {\n\t\tif (!this._coreUserModel) {\n\t\t\tthis._coreUserModel = getCoreUserModel();\n\t\t}\n\t\treturn this._coreUserModel;\n\t}\n\n\tpublic async getUserCoupons(\n\t\tuser: mongoose.Types.ObjectId | undefined,\n\t\tshop: mongoose.Types.ObjectId | undefined,\n\t\tvendor: mongoose.Types.ObjectId | undefined,\n\t\titemType: ItemType | undefined\n\t): Promise<any> {\n\t\tconst [exchangeRate, referralSettings] = await Promise.all([\n\t\t\tgetExchangeRate(),\n\t\t\tthis.referralSettingsModel.findOne(),\n\t\t]);\n\n\t\tconst secondaryReferralReceiverValue =\n\t\t\treferralSettings?.receiver?.valueType == ValueType.PERCENTAGE\n\t\t\t\t? null\n\t\t\t\t: roundSecondaryCurrency((referralSettings?.receiver?.value ?? 0) * exchangeRate);\n\n\t\tconst secondaryReferralReceiverMinOrderAmount = roundSecondaryCurrency(\n\t\t\t(referralSettings?.receiver?.minimumOrderValue ?? 0) * exchangeRate\n\t\t);\n\n\t\tconst now = dayjs().toDate();\n\n\t\tconst pipeline: mongoose.PipelineStage[] = [\n\t\t\t// Match the user\n\t\t\t{\n\t\t\t\t$match: { _id: user },\n\t\t\t},\n\n\t\t\t// Lookup coupons with nested referral/influencer/shop\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'coupons',\n\t\t\t\t\tlocalField: 'coupons',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'couponDocs',\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t// Active and started\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: {\n\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $ifNull: ['$status', Status.ACTIVE] }, Status.ACTIVE] },\n\t\t\t\t\t\t\t\t\t\t{ $lte: [{ $ifNull: ['$duration.start', now] }, now] },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t...(shop || vendor\n\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t$nor: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: CouponType.INDIVIDUAL_STORE },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: CouponType.SHOPS_CATEGORIES },\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: { $ne: CouponType.CUSTOM_COUPON } },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ shops: { $exists: false } }, { shops: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ vendors: { $exists: false } }, { vendors: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ itemTypes: { $exists: false } }, { itemTypes: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup referralUser and influencer\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'referralUser',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'referralUser',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'influencer',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'influencer',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup shop\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'shops',\n\t\t\t\t\t\t\t\tlocalField: 'shop',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'shop',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { name: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup vendor\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'vendors',\n\t\t\t\t\t\t\t\tlocalField: 'vendor',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'vendor',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { name: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $unwind: { path: '$shop', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$vendor', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$referralUser', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$influencer', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$addFields: {\n\t\t\t\t\t\t\t\treferringUser: { $ifNull: ['$referralUser.coreUser', '$influencer.coreUser'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $project: { referralUser: 0, influencer: 0 } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Lookup orders once and compute:\n\t\t\t// - total usage per coupon\n\t\t\t// - all shops user ordered from\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'orders',\n\t\t\t\t\tlet: { userId: '$_id' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: { $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\tstatus: { $ne: RegularOrderStatus.CANCELLED },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$facet: {\n\t\t\t\t\t\t\t\t// ordered shops for first-order logic\n\t\t\t\t\t\t\t\torderedShops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\t\t\t\t\t\tshops: { $addToSet: '$shop' },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t\t// coupon usage WITH SNAPSHOT\n\t\t\t\t\t\t\t\tcouponUsage: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t\t\t\t'adjustedFinance.coupon.coupon': { $exists: true },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t\t\t\t\t\t\tsnap: { $first: '$adjustedFinance.coupon' },\n\t\t\t\t\t\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tas: 'orderStats',\n\t\t\t\t},\n\t\t\t},\n\t\t\t// Lookup service bookings once and compute vendor-side first-order/usage data.\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'serviceBookings',\n\t\t\t\t\tlet: { userId: '$_id' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: { $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\tstatus: { $ne: ServiceBookingStatus.CANCELLED },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$facet: {\n\t\t\t\t\t\t\t\torderedVendors: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\t\t\t\t\t\tvendors: { $addToSet: '$vendor' },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tcouponUsage: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t\t\t\t'adjustedFinance.coupon.coupon': { $exists: true },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t\t\t\t\t\t\tsnap: { $first: '$adjustedFinance.coupon' },\n\t\t\t\t\t\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tas: 'serviceBookingStats',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\torderedShops: {\n\t\t\t\t\t\t$ifNull: [{ $arrayElemAt: ['$orderStats.orderedShops.shops', 0] }, []],\n\t\t\t\t\t},\n\t\t\t\t\torderedVendors: {\n\t\t\t\t\t\t$ifNull: [{ $arrayElemAt: ['$serviceBookingStats.orderedVendors.vendors', 0] }, []],\n\t\t\t\t\t},\n\t\t\t\t\tcouponUsage: {\n\t\t\t\t\t\t$concatArrays: [\n\t\t\t\t\t\t\t{ $ifNull: [{ $arrayElemAt: ['$orderStats.couponUsage', 0] }, []] },\n\t\t\t\t\t\t\t{ $ifNull: [{ $arrayElemAt: ['$serviceBookingStats.couponUsage', 0] }, []] },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Unwind coupons to classify individually\n\t\t\t{ $unwind: '$couponDocs' },\n\n\t\t\t// Filter coupons by shop/vendor/itemType\n\t\t\t...(shop || vendor ? this.filterShopVendorCoupons(shop, vendor, itemType) : []),\n\n\t\t\t// First-order-only coupon filter\n\t\t\t...this.filterFirstOrderOnlyCoupons({ shop, vendor }),\n\n\t\t\t// Compute usage count per coupon\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tusageData: {\n\t\t\t\t\t\t$arrayElemAt: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$filter: {\n\t\t\t\t\t\t\t\t\tinput: '$couponUsage',\n\t\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\t\tcond: { $eq: ['$$cu._id', '$couponDocs._id'] },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tusedCount: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$map: {\n\t\t\t\t\t\t\t\tinput: {\n\t\t\t\t\t\t\t\t\t$filter: {\n\t\t\t\t\t\t\t\t\t\tinput: '$couponUsage',\n\t\t\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\t\t\tcond: { $eq: ['$$cu._id', '$couponDocs._id'] },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\tin: { $ifNull: ['$$cu.count', 0] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Expiration & secondary currency\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tisExpired: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t{ $gt: [{ $strLenCP: { $ifNull: ['$couponDocs.expirationReason', ''] } }, 0] },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $ifNull: ['$couponDocs.duration.end', false] },\n\t\t\t\t\t\t\t\t\t{ $lt: ['$couponDocs.duration.end', now] },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\texchangeRate,\n\t\t\t\t\t'couponDocs.value': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.value ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.value',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.valueType': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.valueType ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.valueType',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyValue': {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.valueType', ValueType.PERCENTAGE] },\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverValue,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.value', exchangeRate],\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyMaxDiscountLimit': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: null,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.maxDiscountLimit', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyMinOrderValue': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverMinOrderAmount,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.minOrderValue', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Classify category\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tcategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t'$isExpired',\n\t\t\t\t\t\t\t'expired',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t{ $gt: ['$usedCount', 0] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $not: ['$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $lt: ['$usedCount', '$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t'available',\n\t\t\t\t\t\t\t\t\t\t\t'used',\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'available',\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Group into arrays\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tavailable: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'available'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t\tused: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'used'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t\texpired: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'expired'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{ $project: { _id: 0 } },\n\t\t];\n\n\t\tconst [results] = await this.userModel.aggregate(pipeline);\n\n\t\tif (!results) {\n\t\t\treturn {\n\t\t\t\tavailable: [],\n\t\t\t\tused: [],\n\t\t\t\texpired: [],\n\t\t\t};\n\t\t}\n\n\t\tconst populatedResults = await this.userModel.populate(results, {\n\t\t\tpath: 'available.referringUser',\n\t\t\tmodel: this.coreUserModel,\n\t\t\tselect: { _id: 0, name: 1 },\n\t\t});\n\n\t\treturn populatedResults;\n\t}\n\n\tpublic addLabelsToAllCoupons(coupons: any): any {\n\t\treturn {\n\t\t\tavailable: this.addLabelsToCoupons(coupons.available).reverse(), // Just to make newly added coupon at the top\n\t\t\tused: this.addLabelsToCoupons(coupons.used).reverse(), // Just to make newly added coupon at the top\n\t\t\texpired: this.addLabelsToCoupons(coupons.expired).reverse(), // Just to make newly added coupon at the top\n\t\t};\n\t}\n\n\tpublic addLabelsToCoupons(coupons: any[]): any[] {\n\t\tconst resultsWithLabels = coupons.map(coupon => {\n\t\t\t// couponOfferLabel\n\t\t\tconst valuePart =\n\t\t\t\tcoupon.valueType === 'fixed'\n\t\t\t\t\t? this.formatCurrency(coupon.value, coupon.secondaryCurrencyValue)\n\t\t\t\t\t: `${coupon.value}%`;\n\n\t\t\tconst maxDiscountPart =\n\t\t\t\tcoupon.isMaxDiscountLimitEnabled && coupon.maxDiscountLimit > 0\n\t\t\t\t\t? ` up to ${this.formatCurrency(coupon.maxDiscountLimit, coupon.secondaryCurrencyMaxDiscountLimit)}`\n\t\t\t\t\t: '';\n\n\t\t\tconst influencerPart = coupon.referringUser ? ` (Referred by ${coupon.referringUser.name})` : '';\n\n\t\t\tcoupon.couponOfferLabel = `Save ${valuePart}${maxDiscountPart}${influencerPart}`;\n\n\t\t\t// couponValidityLabel\n\t\t\tlet validityParts: string[] = [];\n\n\t\t\t// 1. Minimum Order\n\t\t\tif (coupon.couponType === CouponType.REFERRAL_CODE) {\n\t\t\t\tvalidityParts.push(\n\t\t\t\t\t`Minimum order ${this.formatCurrency(null, coupon.secondaryCurrencyMinOrderValue)}`\n\t\t\t\t);\n\t\t\t} else if (coupon.isMinOrderValueEnabled && coupon.minOrderValue > 0) {\n\t\t\t\tvalidityParts.push(\n\t\t\t\t\t`Minimum order ${this.formatCurrency(coupon.minOrderValue, coupon.secondaryCurrencyMinOrderValue)}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// 2. Order Limit\n\t\t\tif (coupon.isOrderLimitPerUserEnabled && coupon.orderLimitPerUser > 0) {\n\t\t\t\tvalidityParts.push(`Applied on ${coupon.orderLimitPerUser} order`);\n\t\t\t}\n\n\t\t\t// if(coupon.couponType === CouponType.REFERRAL_CODE || coupon.couponType === CouponType.REFERRAL_REWARD){\n\t\t\t// \tvalidityParts = [];\n\t\t\t// \tvalidityParts.push(`Applied on 1 Order`);\n\t\t\t// }\n\n\t\t\tcoupon.couponValidityLabel = validityParts.join('. ');\n\n\t\t\treturn coupon;\n\t\t});\n\n\t\treturn resultsWithLabels;\n\t}\n\n\tprivate formatCurrency(value: any, secondaryCurrencyValue: any) {\n\t\t// Use coma separator for thousands and round secondary currency value\n\t\tconst formatterUSD = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: 0,\n\t\t\tmaximumFractionDigits: 2,\n\t\t});\n\n\t\tconst formatterLBP = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: 0,\n\t\t});\n\n\t\tif (secondaryCurrencyValue !== null && secondaryCurrencyValue !== undefined) {\n\t\t\treturn 'LBP ' + formatterLBP.format(Number(secondaryCurrencyValue));\n\t\t}\n\n\t\treturn '$' + formatterUSD.format(Number(value ?? 0));\n\t}\n\n\tprivate filterShopVendorCoupons(\n\t\tshop?: mongoose.Types.ObjectId,\n\t\tvendor?: mongoose.Types.ObjectId,\n\t\titemType?: ItemType\n\t): mongoose.PipelineStage[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$expr: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\t\t\tshop\n\t\t\t\t\t\t\t\t\t\t? { $eq: ['$couponDocs.shop._id', shop] }\n\t\t\t\t\t\t\t\t\t\t: { $eq: ['$couponDocs.vendor._id', vendor] },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{ $in: [itemType, { $ifNull: ['$couponDocs.itemTypes', []] }] },\n\t\t\t\t\t\t\t\t\t\t\t...(shop ? [{ $in: [shop, { $ifNull: ['$couponDocs.shops', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t\t...(vendor ? [{ $in: [vendor, { $ifNull: ['$couponDocs.vendors', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_USER] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{ $in: [itemType, { $ifNull: ['$couponDocs.itemTypes', []] }] },\n\t\t\t\t\t\t\t\t\t\t\t...(shop ? [{ $in: [shop, { $ifNull: ['$couponDocs.shops', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t\t...(vendor ? [{ $in: [vendor, { $ifNull: ['$couponDocs.vendors', []] }] }] : []),\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $size: { $ifNull: ['$couponDocs.shops', []] } }, 0] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $size: { $ifNull: ['$couponDocs.vendors', []] } }, 0] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $size: { $ifNull: ['$couponDocs.itemTypes', []] } }, 0] },\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$not: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$in: [\n\t\t\t\t\t\t\t\t\t\t\t'$couponDocs.couponType',\n\t\t\t\t\t\t\t\t\t\t\t[CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES, CouponType.INDIVIDUAL_USER],\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate filterFirstOrderOnlyCoupons(data: {\n\t\tshop?: mongoose.Types.ObjectId;\n\t\tvendor?: mongoose.Types.ObjectId;\n\t}): mongoose.PipelineStage[] {\n\t\tconst { shop, vendor } = data;\n\t\tconst hasOrderedFromStore = vendor\n\t\t\t? { $in: [vendor, '$orderedVendors'] }\n\t\t\t: shop\n\t\t\t\t? { $in: [shop, '$orderedShops'] }\n\t\t\t\t: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t{ $in: ['$couponDocs.shop._id', '$orderedShops'] },\n\t\t\t\t\t\t\t{ $in: ['$couponDocs.vendor._id', '$orderedVendors'] },\n\t\t\t\t\t\t],\n\t\t\t\t\t};\n\t\tconst hasUnusedStoreInCategory = vendor\n\t\t\t? { $in: [vendor, '$orderedVendors'] }\n\t\t\t: shop\n\t\t\t\t? { $in: [shop, '$orderedShops'] }\n\t\t\t\t: {\n\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$eq: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$size: {\n\t\t\t\t\t\t\t\t\t\t\t$setDifference: [{ $ifNull: ['$couponDocs.shops', []] }, '$orderedShops'],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$eq: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$size: {\n\t\t\t\t\t\t\t\t\t\t\t$setDifference: [{ $ifNull: ['$couponDocs.vendors', []] }, '$orderedVendors'],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t};\n\n\t\treturn [\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\thasOrderedFromStore: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\thasOrderedFromStore,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\thasUnusedShopInCategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\thasUnusedStoreInCategory,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$expr: {\n\t\t\t\t\t\t$not: {\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$in: ['$couponDocs.couponType', [CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES]],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.firstOrderOnly', true] },\n\t\t\t\t\t\t\t\t{ $or: ['$hasOrderedFromStore', '$hasUnusedShopInCategory'] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\tpublic findById(couponId: string) {\n\t\treturn this.model.findOne({ _id: couponId, deletedAt: null }).lean<BaseCoupon>().exec();\n\t}\n\n\tpublic async singleCouponUsers(params: CouponUsersRequestDTO) {\n\t\tconst { page = 1, size = 10, sort } = params;\n\n\t\tconst pipeline = this.buildCouponUsersPipeline(params);\n\n\t\tconst result = await paginateAggregation(\n\t\t\tthis.orderModel,\n\t\t\tpipeline,\n\t\t\tpage,\n\t\t\tsize,\n\t\t\tsort ?? { creationDate: -1 }\n\t\t);\n\n\t\tawait this.attachCoreUsers(result.documents);\n\n\t\tawait this.attachZones(result.documents);\n\n\t\treturn result;\n\t}\n\tprivate buildCouponUsersPipeline(params: CouponUsersRequestDTO): mongoose.PipelineStage[] {\n\t\tconst { couponId, search } = params;\n\n\t\tconst pipeline: mongoose.PipelineStage[] = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t'adjustedFinance.coupon.coupon': new mongoose.Types.ObjectId(couponId),\n\n\t\t\t\t\tstatus: RegularOrderStatus.DELIVERED,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$user',\n\n\t\t\t\t\torders: {\n\t\t\t\t\t\t$sum: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: this.userModel.collection.name,\n\n\t\t\t\t\tlocalField: '_id',\n\n\t\t\t\t\tforeignField: '_id',\n\n\t\t\t\t\tas: 'user',\n\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$project: {\n\t\t\t\t\t\t\t\tcoreUser: 1,\n\n\t\t\t\t\t\t\t\tphoneNumber: 1,\n\n\t\t\t\t\t\t\t\tlocation: 1,\n\n\t\t\t\t\t\t\t\tcreatedAt: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$unwind: '$user',\n\t\t\t},\n\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\n\t\t\t\t\tid: {\n\t\t\t\t\t\t$toString: '$user._id',\n\t\t\t\t\t},\n\n\t\t\t\t\tcoreUserId: {\n\t\t\t\t\t\t$toString: '$user.coreUser',\n\t\t\t\t\t},\n\n\t\t\t\t\tmobile: '$user.phoneNumber',\n\n\t\t\t\t\tlocation: '$user.location',\n\n\t\t\t\t\torders: 1,\n\n\t\t\t\t\tcreationDate: '$user.createdAt',\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tif (search) {\n\t\t\tpipeline.push({\n\t\t\t\t$match: {\n\t\t\t\t\tmobile: {\n\t\t\t\t\t\t$regex: search,\n\n\t\t\t\t\t\t$options: 'i',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn pipeline;\n\t}\n\tprivate async attachCoreUsers(documents: any[]) {\n\t\tconst coreUserIds = [...new Set(documents.map(doc => doc.coreUserId).filter(Boolean))];\n\n\t\tconst coreUsers = await this.coreUserModel\n\t\t\t.find(\n\t\t\t\t{\n\t\t\t\t\t_id: {\n\t\t\t\t\t\t$in: coreUserIds,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 1,\n\n\t\t\t\t\temail: 1,\n\n\t\t\t\t\tprofilePhoto: 1,\n\n\t\t\t\t\tstatus: 1,\n\t\t\t\t}\n\t\t\t)\n\t\t\t.lean();\n\n\t\tconst map = new Map(coreUsers.map(user => [user._id.toString(), user]));\n\n\t\tdocuments.forEach(doc => {\n\t\t\tconst coreUser = map.get(doc.coreUserId);\n\n\t\t\tdoc.name = coreUser?.name;\n\n\t\t\tdoc.avatar = coreUser?.profilePhoto;\n\n\t\t\tdoc.email = coreUser?.email;\n\n\t\t\tdoc.status = coreUser?.status;\n\n\t\t\tdelete doc.coreUserId;\n\t\t});\n\t}\n\tprivate async attachZones(documents: any[]) {\n\t\tawait Promise.all(\n\t\t\tdocuments.map(async doc => {\n\t\t\t\tconst coordinates = doc.location?.coordinates;\n\n\t\t\t\tif (!coordinates?.length) {\n\t\t\t\t\tdoc.zone = null;\n\n\t\t\t\t\tdoc.zoneId = null;\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst zone = await this.zoneModel\n\t\t\t\t\t.findOne(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgeometry: {\n\t\t\t\t\t\t\t\t$geoIntersects: {\n\t\t\t\t\t\t\t\t\t$geometry: {\n\t\t\t\t\t\t\t\t\t\ttype: 'Point',\n\n\t\t\t\t\t\t\t\t\t\tcoordinates,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_id: 1,\n\n\t\t\t\t\t\t\tname: 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t\t.lean();\n\n\t\t\t\tdoc.zone = zone?.name ?? null;\n\n\t\t\t\tdoc.zoneId = zone?._id?.toString() ?? null;\n\n\t\t\t\tdelete doc.location;\n\t\t\t})\n\t\t);\n\t}\n}\n"]}
|