@lyxa.ai/marketing 1.0.68 → 1.0.69
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.js +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/modules/coupon/routers/coupon.router.d.ts +1194 -8087
- package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
- package/dist/lib/modules/coupon/routers/coupon.router.js +9 -22
- package/dist/lib/modules/coupon/routers/coupon.router.js.map +1 -1
- package/dist/lib/modules/coupon/services/coupon.service.d.ts +12 -2
- package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/coupon.service.js +271 -90
- package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js +1 -2
- package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +82 -52
- package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -1
- package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts +4 -2
- package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts.map +1 -1
- package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts +42 -3693
- package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts.map +1 -1
- package/dist/lib/modules/coupon/validations/all-coupons.validation.js +1 -2
- package/dist/lib/modules/coupon/validations/all-coupons.validation.js.map +1 -1
- package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts +18 -8
- package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
- package/dist/lib/modules/coupon/validations/global-coupon.validation.d.ts +18 -0
- package/dist/lib/modules/coupon/validations/global-coupon.validation.d.ts.map +1 -1
- package/dist/lib/modules/coupon/validations/global-coupon.validation.js +2 -0
- package/dist/lib/modules/coupon/validations/global-coupon.validation.js.map +1 -1
- package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.d.ts +18 -18
- package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.js +2 -2
- package/dist/lib/modules/coupon/validations/individual-store-coupon.validation.js.map +1 -1
- package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts +5 -5
- package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
- package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts +5 -5
- package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +1 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js +5 -0
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/routers/marketing.router.d.ts +5 -5
- package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/marketing.service.js +37 -20
- package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/validations/punch-marketing.validation.d.ts +4 -4
- package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +6 -6
- package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
- package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +2 -2
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts +5 -5
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -1
- package/dist/types/modules/coupon/routers/coupon.router.d.ts +1194 -8087
- package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
- package/dist/types/modules/coupon/services/coupon.service.d.ts +12 -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.map +1 -1
- package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
- package/dist/types/modules/coupon/transformers/coupon.transformer.d.ts +4 -2
- package/dist/types/modules/coupon/transformers/coupon.transformer.d.ts.map +1 -1
- package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts +42 -3693
- package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts.map +1 -1
- package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts +18 -8
- package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
- package/dist/types/modules/coupon/validations/global-coupon.validation.d.ts +18 -0
- package/dist/types/modules/coupon/validations/global-coupon.validation.d.ts.map +1 -1
- package/dist/types/modules/coupon/validations/individual-store-coupon.validation.d.ts +18 -18
- package/dist/types/modules/deal-setting/routers/deal-setting.router.d.ts +5 -5
- package/dist/types/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
- package/dist/types/modules/featured-setting/routers/featured-setting.router.d.ts +5 -5
- package/dist/types/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +1 -0
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/routers/marketing.router.d.ts +5 -5
- package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/punch-marketing.validation.d.ts +4 -4
- package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +6 -6
- package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
- package/dist/types/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +2 -2
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts +5 -5
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -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{\n\t\t\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.pricing.subtotal', 0] },\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.coupon.shopCut', 0] },\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{ $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{\n\t\t\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.pricing.subtotal', 0] },\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.coupon.shopCut', 0] },\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{ $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\tprofit: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$ifNull: ['$adjustedFinance.companyProfit.totalProfit', 0],\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\tprofit: 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 profit = Number(Math.max(0, roundBaseCurrency(result?.profit ?? 0)).toFixed(2));\n\t\tconst amountSpent = Number(Math.max(0, roundBaseCurrency(result?.amountSpent ?? 0)).toFixed(2));\n\t\tconst totalOrder = result?.totalOrder ?? 0;\n\n\t\tlet roi = 0;\n\t\tif (amountSpent > 0) {\n\t\t\tconst netProfit = roundBaseCurrency(profit - amountSpent);\n\t\t\troi = Number(Math.max(0, (netProfit / amountSpent) * 100).toFixed(2));\n\t\t}\n\n\t\treturn {\n\t\t\ttotalOrder,\n\t\t\ttotalRedemption: totalOrder,\n\t\t\tprofit,\n\t\t\tamountSpent,\n\t\t\tuserEngagement: result?.userEngagement ?? 0,\n\t\t\troi,\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{\n\t\t\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.pricing.subtotal', 0] },\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.coupon.shopCut', 0] },\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{ $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{\n\t\t\t\t\t\t\t\t\t$subtract: [\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.pricing.subtotal', 0] },\n\t\t\t\t\t\t\t\t\t\t{ $ifNull: ['$adjustedFinance.coupon.shopCut', 0] },\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{ $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\tprofit: {\n\t\t\t\t\t\t$sum: {\n\t\t\t\t\t\t\t$ifNull: ['$adjustedFinance.companyProfit.totalProfit', 0],\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\tprofit: 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 profit = Number(Math.max(0, roundBaseCurrency(result?.profit ?? 0)).toFixed(2));\n\t\tconst amountSpent = Number(Math.max(0, roundBaseCurrency(result?.amountSpent ?? 0)).toFixed(2));\n\t\tconst totalOrder = result?.totalOrder ?? 0;\n\n\t\tlet roi = 0;\n\t\t// if (amountSpent > 0) {\n\t\t// \tconst netProfit = roundBaseCurrency(profit - amountSpent);\n\t\t// \troi = Number(Math.max(0, (netProfit / amountSpent) * 100).toFixed(2));\n\t\t// }\n\t\tif (amountSpent > 0) {\n\t\t\troi = Number(Math.max(0, (profit / amountSpent) * 100).toFixed(2));\n\t\t}\n\n\t\treturn {\n\t\t\ttotalOrder,\n\t\t\ttotalRedemption: totalOrder,\n\t\t\tprofit,\n\t\t\tamountSpent,\n\t\t\tuserEngagement: result?.userEngagement ?? 0,\n\t\t\troi,\n\t\t};\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
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,EACN,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,iCAAiC,EAEjC,4BAA4B,EAC5B,MAAM,6BAA6B,CAAC;AAMrC,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;
|
|
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,EACN,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,iCAAiC,EAEjC,4BAA4B,EAC5B,MAAM,6BAA6B,CAAC;AAMrC,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;IAycR,qBAAqB,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG;IAQxC,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;IAwChD,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,uBAAuB;IAkE/B,OAAO,CAAC,2BAA2B;IAoF5B,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAInB,iBAAiB,CAAC,MAAM,EAAE,qBAAqB;;;;;;;;;IAgC5D,OAAO,CAAC,wBAAwB;YAkHlB,eAAe;IA8BhB,qBAAqB,CAAC,MAAM,EAAE,4BAA4B;;;;;;;;;YAiLzD,cAAc;IA0Bf,0BAA0B,CAAC,MAAM,EAAE,iCAAiC;;;;;;;;;IA4KjF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,iBAAiB;IA0BZ,qBAAqB,CAAC,OAAO,EAAE,aAAa;;;;;IA0G5C,qBAAqB,CAAC,OAAO,EAAE,YAAY;;;;;;;IAgF3C,uBAAuB,CAAC,OAAO,EAAE,aAAa;cAiDlD,MAAM;qBACC,MAAM;;CAStB"}
|
|
@@ -46,12 +46,31 @@ class CouponRepository {
|
|
|
46
46
|
{
|
|
47
47
|
$match: { _id: user },
|
|
48
48
|
},
|
|
49
|
+
{
|
|
50
|
+
$lookup: {
|
|
51
|
+
from: 'user-coupons',
|
|
52
|
+
let: { userId: '$_id' },
|
|
53
|
+
pipeline: [
|
|
54
|
+
{
|
|
55
|
+
$match: {
|
|
56
|
+
$expr: {
|
|
57
|
+
$eq: ['$user', '$$userId'],
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
as: 'userCoupons',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
$unwind: '$userCoupons',
|
|
67
|
+
},
|
|
49
68
|
{
|
|
50
69
|
$lookup: {
|
|
51
70
|
from: 'coupons',
|
|
52
|
-
localField: '
|
|
71
|
+
localField: 'userCoupons.coupon',
|
|
53
72
|
foreignField: '_id',
|
|
54
|
-
as: '
|
|
73
|
+
as: 'couponDetails',
|
|
55
74
|
pipeline: [
|
|
56
75
|
{
|
|
57
76
|
$match: {
|
|
@@ -136,6 +155,15 @@ class CouponRepository {
|
|
|
136
155
|
],
|
|
137
156
|
},
|
|
138
157
|
},
|
|
158
|
+
{ $unwind: '$couponDetails' },
|
|
159
|
+
{
|
|
160
|
+
$addFields: {
|
|
161
|
+
'couponDetails.duration': {
|
|
162
|
+
start: '$userCoupons.startDate',
|
|
163
|
+
end: '$userCoupons.endDate',
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
},
|
|
139
167
|
{
|
|
140
168
|
$lookup: {
|
|
141
169
|
from: 'orders',
|
|
@@ -234,7 +262,6 @@ class CouponRepository {
|
|
|
234
262
|
},
|
|
235
263
|
},
|
|
236
264
|
},
|
|
237
|
-
{ $unwind: '$couponDocs' },
|
|
238
265
|
...(shop || vendor ? this.filterShopVendorCoupons(shop, vendor, itemType) : []),
|
|
239
266
|
...this.filterFirstOrderOnlyCoupons({ shop, vendor }),
|
|
240
267
|
{
|
|
@@ -245,7 +272,7 @@ class CouponRepository {
|
|
|
245
272
|
$filter: {
|
|
246
273
|
input: '$couponUsage',
|
|
247
274
|
as: 'cu',
|
|
248
|
-
cond: { $eq: ['$$cu._id', '$
|
|
275
|
+
cond: { $eq: ['$$cu._id', '$couponDetails._id'] },
|
|
249
276
|
},
|
|
250
277
|
},
|
|
251
278
|
0,
|
|
@@ -262,7 +289,7 @@ class CouponRepository {
|
|
|
262
289
|
$filter: {
|
|
263
290
|
input: '$couponUsage',
|
|
264
291
|
as: 'cu',
|
|
265
|
-
cond: { $eq: ['$$cu._id', '$
|
|
292
|
+
cond: { $eq: ['$$cu._id', '$couponDetails._id'] },
|
|
266
293
|
},
|
|
267
294
|
},
|
|
268
295
|
as: 'cu',
|
|
@@ -276,80 +303,80 @@ class CouponRepository {
|
|
|
276
303
|
$addFields: {
|
|
277
304
|
isExpired: {
|
|
278
305
|
$or: [
|
|
279
|
-
{ $gt: [{ $strLenCP: { $ifNull: ['$
|
|
306
|
+
{ $gt: [{ $strLenCP: { $ifNull: ['$couponDetails.expirationReason', ''] } }, 0] },
|
|
280
307
|
{
|
|
281
308
|
$and: [
|
|
282
|
-
{ $ifNull: ['$
|
|
283
|
-
{ $lt: ['$
|
|
309
|
+
{ $ifNull: ['$couponDetails.duration.end', false] },
|
|
310
|
+
{ $lt: ['$couponDetails.duration.end', now] },
|
|
284
311
|
],
|
|
285
312
|
},
|
|
286
313
|
],
|
|
287
314
|
},
|
|
288
315
|
exchangeRate,
|
|
289
|
-
'
|
|
316
|
+
'couponDetails.value': {
|
|
290
317
|
$switch: {
|
|
291
318
|
branches: [
|
|
292
319
|
{
|
|
293
|
-
case: { $eq: ['$
|
|
320
|
+
case: { $eq: ['$couponDetails.couponType', enum_1.CouponType.REFERRAL_CODE] },
|
|
294
321
|
then: referralSettings?.receiver?.value ?? 0,
|
|
295
322
|
},
|
|
296
323
|
],
|
|
297
|
-
default: '$
|
|
324
|
+
default: '$couponDetails.value',
|
|
298
325
|
},
|
|
299
326
|
},
|
|
300
|
-
'
|
|
327
|
+
'couponDetails.valueType': {
|
|
301
328
|
$switch: {
|
|
302
329
|
branches: [
|
|
303
330
|
{
|
|
304
|
-
case: { $eq: ['$
|
|
331
|
+
case: { $eq: ['$couponDetails.couponType', enum_1.CouponType.REFERRAL_CODE] },
|
|
305
332
|
then: referralSettings?.receiver?.valueType ?? 0,
|
|
306
333
|
},
|
|
307
334
|
],
|
|
308
|
-
default: '$
|
|
335
|
+
default: '$couponDetails.valueType',
|
|
309
336
|
},
|
|
310
337
|
},
|
|
311
|
-
'
|
|
338
|
+
'couponDetails.secondaryCurrencyValue': {
|
|
312
339
|
$cond: [
|
|
313
|
-
{ $eq: ['$
|
|
340
|
+
{ $eq: ['$couponDetails.valueType', enum_1.ValueType.PERCENTAGE] },
|
|
314
341
|
null,
|
|
315
342
|
{
|
|
316
343
|
$switch: {
|
|
317
344
|
branches: [
|
|
318
345
|
{
|
|
319
|
-
case: { $eq: ['$
|
|
346
|
+
case: { $eq: ['$couponDetails.couponType', enum_1.CouponType.REFERRAL_CODE] },
|
|
320
347
|
then: secondaryReferralReceiverValue,
|
|
321
348
|
},
|
|
322
349
|
],
|
|
323
350
|
default: (0, common_pipeline_functions_1.getRoundSecondaryCurrencyStage)({
|
|
324
|
-
$multiply: ['$
|
|
351
|
+
$multiply: ['$couponDetails.value', exchangeRate],
|
|
325
352
|
}),
|
|
326
353
|
},
|
|
327
354
|
},
|
|
328
355
|
],
|
|
329
356
|
},
|
|
330
|
-
'
|
|
357
|
+
'couponDetails.secondaryCurrencyMaxDiscountLimit': {
|
|
331
358
|
$switch: {
|
|
332
359
|
branches: [
|
|
333
360
|
{
|
|
334
|
-
case: { $eq: ['$
|
|
361
|
+
case: { $eq: ['$couponDetails.couponType', enum_1.CouponType.REFERRAL_CODE] },
|
|
335
362
|
then: null,
|
|
336
363
|
},
|
|
337
364
|
],
|
|
338
365
|
default: (0, common_pipeline_functions_1.getRoundSecondaryCurrencyStage)({
|
|
339
|
-
$multiply: ['$
|
|
366
|
+
$multiply: ['$couponDetails.maxDiscountLimit', exchangeRate],
|
|
340
367
|
}),
|
|
341
368
|
},
|
|
342
369
|
},
|
|
343
|
-
'
|
|
370
|
+
'couponDetails.secondaryCurrencyMinOrderValue': {
|
|
344
371
|
$switch: {
|
|
345
372
|
branches: [
|
|
346
373
|
{
|
|
347
|
-
case: { $eq: ['$
|
|
374
|
+
case: { $eq: ['$couponDetails.couponType', enum_1.CouponType.REFERRAL_CODE] },
|
|
348
375
|
then: secondaryReferralReceiverMinOrderAmount,
|
|
349
376
|
},
|
|
350
377
|
],
|
|
351
378
|
default: (0, common_pipeline_functions_1.getRoundSecondaryCurrencyStage)({
|
|
352
|
-
$multiply: ['$
|
|
379
|
+
$multiply: ['$couponDetails.minOrderValue', exchangeRate],
|
|
353
380
|
}),
|
|
354
381
|
},
|
|
355
382
|
},
|
|
@@ -368,8 +395,8 @@ class CouponRepository {
|
|
|
368
395
|
$cond: [
|
|
369
396
|
{
|
|
370
397
|
$or: [
|
|
371
|
-
{ $not: ['$
|
|
372
|
-
{ $lt: ['$usedCount', '$
|
|
398
|
+
{ $not: ['$couponDetails.orderLimitPerUser'] },
|
|
399
|
+
{ $lt: ['$usedCount', '$couponDetails.orderLimitPerUser'] },
|
|
373
400
|
],
|
|
374
401
|
},
|
|
375
402
|
'available',
|
|
@@ -387,13 +414,13 @@ class CouponRepository {
|
|
|
387
414
|
$group: {
|
|
388
415
|
_id: '$_id',
|
|
389
416
|
available: {
|
|
390
|
-
$push: { $cond: [{ $eq: ['$category', 'available'] }, '$
|
|
417
|
+
$push: { $cond: [{ $eq: ['$category', 'available'] }, '$couponDetails', '$$REMOVE'] },
|
|
391
418
|
},
|
|
392
419
|
used: {
|
|
393
|
-
$push: { $cond: [{ $eq: ['$category', 'used'] }, '$
|
|
420
|
+
$push: { $cond: [{ $eq: ['$category', 'used'] }, '$couponDetails', '$$REMOVE'] },
|
|
394
421
|
},
|
|
395
422
|
expired: {
|
|
396
|
-
$push: { $cond: [{ $eq: ['$category', 'expired'] }, '$
|
|
423
|
+
$push: { $cond: [{ $eq: ['$category', 'expired'] }, '$couponDetails', '$$REMOVE'] },
|
|
397
424
|
},
|
|
398
425
|
},
|
|
399
426
|
},
|
|
@@ -467,37 +494,37 @@ class CouponRepository {
|
|
|
467
494
|
$or: [
|
|
468
495
|
{
|
|
469
496
|
$and: [
|
|
470
|
-
{ $eq: ['$
|
|
497
|
+
{ $eq: ['$couponDetails.couponType', enum_1.CouponType.INDIVIDUAL_STORE] },
|
|
471
498
|
shop
|
|
472
|
-
? { $eq: ['$
|
|
473
|
-
: { $eq: ['$
|
|
499
|
+
? { $eq: ['$couponDetails.shop._id', shop] }
|
|
500
|
+
: { $eq: ['$couponDetails.vendor._id', vendor] },
|
|
474
501
|
],
|
|
475
502
|
},
|
|
476
503
|
{
|
|
477
504
|
$and: [
|
|
478
|
-
{ $eq: ['$
|
|
505
|
+
{ $eq: ['$couponDetails.couponType', enum_1.CouponType.SHOPS_CATEGORIES] },
|
|
479
506
|
{
|
|
480
507
|
$or: [
|
|
481
|
-
{ $in: [itemType, { $ifNull: ['$
|
|
482
|
-
...(shop ? [{ $in: [shop, { $ifNull: ['$
|
|
483
|
-
...(vendor ? [{ $in: [vendor, { $ifNull: ['$
|
|
508
|
+
{ $in: [itemType, { $ifNull: ['$couponDetails.itemTypes', []] }] },
|
|
509
|
+
...(shop ? [{ $in: [shop, { $ifNull: ['$couponDetails.shops', []] }] }] : []),
|
|
510
|
+
...(vendor ? [{ $in: [vendor, { $ifNull: ['$couponDetails.vendors', []] }] }] : []),
|
|
484
511
|
],
|
|
485
512
|
},
|
|
486
513
|
],
|
|
487
514
|
},
|
|
488
515
|
{
|
|
489
516
|
$and: [
|
|
490
|
-
{ $eq: ['$
|
|
517
|
+
{ $eq: ['$couponDetails.couponType', enum_1.CouponType.INDIVIDUAL_USER] },
|
|
491
518
|
{
|
|
492
519
|
$or: [
|
|
493
|
-
{ $in: [itemType, { $ifNull: ['$
|
|
494
|
-
...(shop ? [{ $in: [shop, { $ifNull: ['$
|
|
495
|
-
...(vendor ? [{ $in: [vendor, { $ifNull: ['$
|
|
520
|
+
{ $in: [itemType, { $ifNull: ['$couponDetails.itemTypes', []] }] },
|
|
521
|
+
...(shop ? [{ $in: [shop, { $ifNull: ['$couponDetails.shops', []] }] }] : []),
|
|
522
|
+
...(vendor ? [{ $in: [vendor, { $ifNull: ['$couponDetails.vendors', []] }] }] : []),
|
|
496
523
|
{
|
|
497
524
|
$and: [
|
|
498
|
-
{ $eq: [{ $size: { $ifNull: ['$
|
|
499
|
-
{ $eq: [{ $size: { $ifNull: ['$
|
|
500
|
-
{ $eq: [{ $size: { $ifNull: ['$
|
|
525
|
+
{ $eq: [{ $size: { $ifNull: ['$couponDetails.shops', []] } }, 0] },
|
|
526
|
+
{ $eq: [{ $size: { $ifNull: ['$couponDetails.vendors', []] } }, 0] },
|
|
527
|
+
{ $eq: [{ $size: { $ifNull: ['$couponDetails.itemTypes', []] } }, 0] },
|
|
501
528
|
],
|
|
502
529
|
},
|
|
503
530
|
],
|
|
@@ -508,7 +535,7 @@ class CouponRepository {
|
|
|
508
535
|
$not: [
|
|
509
536
|
{
|
|
510
537
|
$in: [
|
|
511
|
-
'$
|
|
538
|
+
'$couponDetails.couponType',
|
|
512
539
|
[enum_1.CouponType.INDIVIDUAL_STORE, enum_1.CouponType.SHOPS_CATEGORIES, enum_1.CouponType.INDIVIDUAL_USER],
|
|
513
540
|
],
|
|
514
541
|
},
|
|
@@ -528,8 +555,8 @@ class CouponRepository {
|
|
|
528
555
|
? { $in: [shop, '$orderedShops'] }
|
|
529
556
|
: {
|
|
530
557
|
$or: [
|
|
531
|
-
{ $in: ['$
|
|
532
|
-
{ $in: ['$
|
|
558
|
+
{ $in: ['$couponDetails.shop._id', '$orderedShops'] },
|
|
559
|
+
{ $in: ['$couponDetails.vendor._id', '$orderedVendors'] },
|
|
533
560
|
],
|
|
534
561
|
};
|
|
535
562
|
const hasUnusedStoreInCategory = vendor
|
|
@@ -542,7 +569,7 @@ class CouponRepository {
|
|
|
542
569
|
$eq: [
|
|
543
570
|
{
|
|
544
571
|
$size: {
|
|
545
|
-
$setDifference: [{ $ifNull: ['$
|
|
572
|
+
$setDifference: [{ $ifNull: ['$couponDetails.shops', []] }, '$orderedShops'],
|
|
546
573
|
},
|
|
547
574
|
},
|
|
548
575
|
0,
|
|
@@ -552,7 +579,7 @@ class CouponRepository {
|
|
|
552
579
|
$eq: [
|
|
553
580
|
{
|
|
554
581
|
$size: {
|
|
555
|
-
$setDifference: [{ $ifNull: ['$
|
|
582
|
+
$setDifference: [{ $ifNull: ['$couponDetails.vendors', []] }, '$orderedVendors'],
|
|
556
583
|
},
|
|
557
584
|
},
|
|
558
585
|
0,
|
|
@@ -565,14 +592,14 @@ class CouponRepository {
|
|
|
565
592
|
$addFields: {
|
|
566
593
|
hasOrderedFromStore: {
|
|
567
594
|
$cond: [
|
|
568
|
-
{ $eq: ['$
|
|
595
|
+
{ $eq: ['$couponDetails.couponType', enum_1.CouponType.INDIVIDUAL_STORE] },
|
|
569
596
|
hasOrderedFromStore,
|
|
570
597
|
false,
|
|
571
598
|
],
|
|
572
599
|
},
|
|
573
600
|
hasUnusedShopInCategory: {
|
|
574
601
|
$cond: [
|
|
575
|
-
{ $eq: ['$
|
|
602
|
+
{ $eq: ['$couponDetails.couponType', enum_1.CouponType.SHOPS_CATEGORIES] },
|
|
576
603
|
hasUnusedStoreInCategory,
|
|
577
604
|
false,
|
|
578
605
|
],
|
|
@@ -585,9 +612,12 @@ class CouponRepository {
|
|
|
585
612
|
$not: {
|
|
586
613
|
$and: [
|
|
587
614
|
{
|
|
588
|
-
$in: [
|
|
615
|
+
$in: [
|
|
616
|
+
'$couponDetails.couponType',
|
|
617
|
+
[enum_1.CouponType.INDIVIDUAL_STORE, enum_1.CouponType.SHOPS_CATEGORIES],
|
|
618
|
+
],
|
|
589
619
|
},
|
|
590
|
-
{ $eq: ['$
|
|
620
|
+
{ $eq: ['$couponDetails.firstOrderOnly', true] },
|
|
591
621
|
{ $or: ['$hasOrderedFromStore', '$hasUnusedShopInCategory'] },
|
|
592
622
|
],
|
|
593
623
|
},
|