@lyxa.ai/marketing 1.0.55 → 1.0.57

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.
Files changed (77) hide show
  1. package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -1
  2. package/dist/lib/event/event-listeners/event-listeners.js +19 -2
  3. package/dist/lib/event/event-listeners/event-listeners.js.map +1 -1
  4. package/dist/lib/index.d.ts +1314 -0
  5. package/dist/lib/index.d.ts.map +1 -1
  6. package/dist/lib/index.js +6 -1
  7. package/dist/lib/index.js.map +1 -1
  8. package/dist/lib/modules/coupon/queues/coupon-notification.queue.d.ts +8 -0
  9. package/dist/lib/modules/coupon/queues/coupon-notification.queue.d.ts.map +1 -0
  10. package/dist/lib/modules/coupon/queues/coupon-notification.queue.js +54 -0
  11. package/dist/lib/modules/coupon/queues/coupon-notification.queue.js.map +1 -0
  12. package/dist/lib/modules/coupon/queues/coupon-notification.worker.d.ts +8 -0
  13. package/dist/lib/modules/coupon/queues/coupon-notification.worker.d.ts.map +1 -0
  14. package/dist/lib/modules/coupon/queues/coupon-notification.worker.js +83 -0
  15. package/dist/lib/modules/coupon/queues/coupon-notification.worker.js.map +1 -0
  16. package/dist/lib/modules/coupon/routers/coupon.router.d.ts +1314 -0
  17. package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  18. package/dist/lib/modules/coupon/routers/coupon.router.js +20 -0
  19. package/dist/lib/modules/coupon/routers/coupon.router.js.map +1 -1
  20. package/dist/lib/modules/coupon/services/coupon.service.d.ts +40 -3
  21. package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
  22. package/dist/lib/modules/coupon/services/coupon.service.js +49 -0
  23. package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
  24. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts +1 -0
  25. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -1
  26. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js +52 -0
  27. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js.map +1 -1
  28. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts +26 -0
  29. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
  30. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +322 -0
  31. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -1
  32. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +175 -0
  33. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  34. package/dist/lib/modules/coupon/validations/coupon.validation.js +53 -1
  35. package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -1
  36. package/dist/lib/modules/marketing/queues/marketing-product-sync.queue.d.ts +7 -0
  37. package/dist/lib/modules/marketing/queues/marketing-product-sync.queue.d.ts.map +1 -0
  38. package/dist/lib/modules/marketing/queues/marketing-product-sync.queue.js +62 -0
  39. package/dist/lib/modules/marketing/queues/marketing-product-sync.queue.js.map +1 -0
  40. package/dist/lib/modules/marketing/queues/marketing-product-sync.worker.d.ts +7 -0
  41. package/dist/lib/modules/marketing/queues/marketing-product-sync.worker.d.ts.map +1 -0
  42. package/dist/lib/modules/marketing/queues/marketing-product-sync.worker.js +94 -0
  43. package/dist/lib/modules/marketing/queues/marketing-product-sync.worker.js.map +1 -0
  44. package/dist/lib/modules/marketing/services/marketing.service.d.ts +2 -1
  45. package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
  46. package/dist/lib/modules/marketing/services/marketing.service.js +37 -29
  47. package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
  48. package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -1
  49. package/dist/types/index.d.ts +1314 -0
  50. package/dist/types/index.d.ts.map +1 -1
  51. package/dist/types/modules/coupon/queues/coupon-notification.queue.d.ts +8 -0
  52. package/dist/types/modules/coupon/queues/coupon-notification.queue.d.ts.map +1 -0
  53. package/dist/types/modules/coupon/queues/coupon-notification.worker.d.ts +8 -0
  54. package/dist/types/modules/coupon/queues/coupon-notification.worker.d.ts.map +1 -0
  55. package/dist/types/modules/coupon/routers/coupon.router.d.ts +1314 -0
  56. package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  57. package/dist/types/modules/coupon/services/coupon.service.d.ts +40 -3
  58. package/dist/types/modules/coupon/services/coupon.service.d.ts.map +1 -1
  59. package/dist/types/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts +1 -0
  60. package/dist/types/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -1
  61. package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts +26 -0
  62. package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
  63. package/dist/types/modules/coupon/validations/coupon.validation.d.ts +175 -0
  64. package/dist/types/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  65. package/dist/types/modules/marketing/queues/marketing-product-sync.queue.d.ts +7 -0
  66. package/dist/types/modules/marketing/queues/marketing-product-sync.queue.d.ts.map +1 -0
  67. package/dist/types/modules/marketing/queues/marketing-product-sync.worker.d.ts +7 -0
  68. package/dist/types/modules/marketing/queues/marketing-product-sync.worker.d.ts.map +1 -0
  69. package/dist/types/modules/marketing/services/marketing.service.d.ts +2 -1
  70. package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
  71. package/package.json +2 -2
  72. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +0 -1
  73. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +0 -1
  74. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js +0 -2
  75. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js.map +0 -1
  76. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +0 -1
  77. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +0 -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, SingleCouppnOrdersRequestDTO } 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,27 @@ 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
+ getSingleCouponOrders(params: SingleCouppnOrdersRequestDTO): Promise<{
33
+ metadata: {
34
+ page: number;
35
+ size: number;
36
+ totalElements: any;
37
+ totalPages: number;
38
+ };
39
+ documents: any;
40
+ }>;
41
+ private getCoreUserIds;
16
42
  }
17
43
  //# 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":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAEN,QAAQ,EAKR,MAAM,mCAAmC,CAAC;AAK3C,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,cAAc,CAAoD;;IAS1E,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;CAgFnC"}
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,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAIlG,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;IAwChD,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,uBAAuB;IAkE/B,OAAO,CAAC,2BAA2B;IAiF5B,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAInB,iBAAiB,CAAC,MAAM,EAAE,qBAAqB;;;;;;;;;IAmC5D,OAAO,CAAC,wBAAwB;YAkHlB,eAAe;IA8BhB,qBAAqB,CAAC,MAAM,EAAE,4BAA4B;;;;;;;;;YAiLzD,cAAc;CAyB5B"}
@@ -2,20 +2,27 @@
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");
12
+ const search_1 = require("@lyxa.ai/core/dist/utilities/search");
10
13
  class CouponRepository {
11
14
  model;
12
15
  userModel;
13
16
  referralSettingsModel;
17
+ zoneModel;
14
18
  _coreUserModel = null;
19
+ orderModel;
15
20
  constructor() {
16
21
  this.model = models_1.CouponModel;
17
22
  this.userModel = models_1.UserModel;
18
23
  this.referralSettingsModel = models_1.ReferralSettingModel;
24
+ this.zoneModel = models_1.ZoneModel;
25
+ this.orderModel = models_1.OrderModel;
19
26
  }
20
27
  get coreUserModel() {
21
28
  if (!this._coreUserModel) {
@@ -587,6 +594,321 @@ class CouponRepository {
587
594
  },
588
595
  ];
589
596
  }
597
+ findById(couponId) {
598
+ return this.model.findOne({ _id: couponId, deletedAt: null }).lean().exec();
599
+ }
600
+ async singleCouponUsers(params) {
601
+ const { page = 1, size = 10, sort, search } = params;
602
+ const pipeline = this.buildCouponUsersPipeline(params);
603
+ const result = await (0, pagination_1.paginateAggregation)(this.orderModel, pipeline, page, size, sort ?? { creationDate: -1 });
604
+ await this.attachCoreUsers(result.documents);
605
+ if (search) {
606
+ const keyword = search.toLowerCase();
607
+ result.documents = result.documents.filter((doc) => {
608
+ const searchableFields = ['name', 'email', 'mobile', 'zone', 'id', 'status'];
609
+ return searchableFields.some(field => String(doc[field] ?? '')
610
+ .toLowerCase()
611
+ .includes(keyword));
612
+ });
613
+ }
614
+ result.metadata.totalElements = result.documents.length;
615
+ result.metadata.totalPages = Math.ceil(result.documents.length / size);
616
+ return result;
617
+ }
618
+ buildCouponUsersPipeline(params) {
619
+ const { couponId, zone, startDate, endDate } = params;
620
+ const match = {
621
+ 'adjustedFinance.coupon.coupon': new typegoose_1.mongoose.Types.ObjectId(couponId),
622
+ status: enum_1.RegularOrderStatus.DELIVERED,
623
+ };
624
+ if (zone) {
625
+ match['deliveryAddress.zone'] = new typegoose_1.mongoose.Types.ObjectId(zone);
626
+ }
627
+ if (startDate || endDate) {
628
+ match.processedAt = {};
629
+ if (startDate) {
630
+ match.processedAt.$gte = startDate;
631
+ }
632
+ if (endDate) {
633
+ match.processedAt.$lte = endDate;
634
+ }
635
+ }
636
+ return [
637
+ {
638
+ $match: match,
639
+ },
640
+ {
641
+ $group: {
642
+ _id: '$users',
643
+ orders: {
644
+ $sum: 1,
645
+ },
646
+ zone: {
647
+ $first: '$deliveryAddress.zone',
648
+ },
649
+ },
650
+ },
651
+ {
652
+ $lookup: {
653
+ from: this.userModel.collection.name,
654
+ localField: '_id',
655
+ foreignField: '_id',
656
+ as: 'user',
657
+ pipeline: [
658
+ {
659
+ $project: {
660
+ coreUser: 1,
661
+ phoneNumber: 1,
662
+ createdAt: 1,
663
+ },
664
+ },
665
+ ],
666
+ },
667
+ },
668
+ {
669
+ $unwind: '$user',
670
+ },
671
+ {
672
+ $lookup: {
673
+ from: this.zoneModel.collection.name,
674
+ localField: 'zone',
675
+ foreignField: '_id',
676
+ as: 'zoneDoc',
677
+ pipeline: [
678
+ {
679
+ $project: {
680
+ name: 1,
681
+ },
682
+ },
683
+ ],
684
+ },
685
+ },
686
+ {
687
+ $unwind: {
688
+ path: '$zoneDoc',
689
+ preserveNullAndEmptyArrays: true,
690
+ },
691
+ },
692
+ {
693
+ $project: {
694
+ _id: 0,
695
+ id: {
696
+ $toString: '$user._id',
697
+ },
698
+ coreUserId: {
699
+ $toString: '$user.coreUser',
700
+ },
701
+ mobile: '$user.phoneNumber',
702
+ orders: 1,
703
+ creationDate: '$user.createdAt',
704
+ zone: '$zoneDoc.name',
705
+ zoneId: {
706
+ $toString: '$zoneDoc._id',
707
+ },
708
+ },
709
+ },
710
+ ];
711
+ }
712
+ async attachCoreUsers(documents) {
713
+ const coreUserIds = [...new Set(documents.map(doc => doc.coreUserId).filter(Boolean))];
714
+ const coreUsers = await this.coreUserModel
715
+ .find({
716
+ _id: { $in: coreUserIds },
717
+ status: enum_1.Status.ACTIVE,
718
+ }, {
719
+ name: 1,
720
+ email: 1,
721
+ profilePhoto: 1,
722
+ status: 1,
723
+ })
724
+ .lean();
725
+ const map = new Map(coreUsers.map(user => [user._id.toString(), user]));
726
+ documents.forEach(doc => {
727
+ const coreUser = map.get(doc.coreUserId);
728
+ doc.name = coreUser?.name;
729
+ doc.avatar = coreUser?.profilePhoto;
730
+ doc.email = coreUser?.email;
731
+ doc.status = coreUser?.status;
732
+ delete doc.coreUserId;
733
+ });
734
+ }
735
+ async getSingleCouponOrders(params) {
736
+ const { couponId, page = 1, size = 10, sort, search, userId, zone, startDate, endDate } = params;
737
+ const match = {
738
+ 'adjustedFinance.coupon.coupon': new typegoose_1.mongoose.Types.ObjectId(couponId),
739
+ status: enum_1.RegularOrderStatus.DELIVERED,
740
+ };
741
+ if (userId) {
742
+ match.users = new typegoose_1.mongoose.Types.ObjectId(userId);
743
+ }
744
+ if (zone) {
745
+ match['deliveryAddress.zone'] = new typegoose_1.mongoose.Types.ObjectId(zone);
746
+ }
747
+ if (startDate || endDate) {
748
+ match.processedAt = {};
749
+ if (startDate) {
750
+ match.processedAt.$gte = new Date(startDate);
751
+ }
752
+ if (endDate) {
753
+ match.processedAt.$lte = new Date(endDate);
754
+ }
755
+ }
756
+ const pipeline = [
757
+ {
758
+ $match: match,
759
+ },
760
+ {
761
+ $lookup: {
762
+ from: 'shops',
763
+ localField: 'shop',
764
+ foreignField: '_id',
765
+ as: 'shopDoc',
766
+ pipeline: [
767
+ {
768
+ $project: {
769
+ name: 1,
770
+ logo: 1,
771
+ },
772
+ },
773
+ ],
774
+ },
775
+ },
776
+ {
777
+ $unwind: {
778
+ path: '$shopDoc',
779
+ preserveNullAndEmptyArrays: true,
780
+ },
781
+ },
782
+ {
783
+ $lookup: {
784
+ from: 'users',
785
+ localField: 'users',
786
+ foreignField: '_id',
787
+ as: 'userDoc',
788
+ pipeline: [
789
+ {
790
+ $project: {
791
+ coreUser: 1,
792
+ },
793
+ },
794
+ ],
795
+ },
796
+ },
797
+ {
798
+ $unwind: {
799
+ path: '$userDoc',
800
+ preserveNullAndEmptyArrays: true,
801
+ },
802
+ },
803
+ {
804
+ $lookup: {
805
+ from: 'zones',
806
+ localField: 'deliveryAddress.zone',
807
+ foreignField: '_id',
808
+ as: 'zoneDoc',
809
+ pipeline: [
810
+ {
811
+ $project: {
812
+ name: 1,
813
+ },
814
+ },
815
+ ],
816
+ },
817
+ },
818
+ {
819
+ $unwind: {
820
+ path: '$zoneDoc',
821
+ preserveNullAndEmptyArrays: true,
822
+ },
823
+ },
824
+ {
825
+ $project: {
826
+ order: {
827
+ _id: { $toString: '$_id' },
828
+ orderId: { $toString: '$_id' },
829
+ orderAmount: {
830
+ $ifNull: ['$adjustedFinance.pricing.total', 0],
831
+ },
832
+ },
833
+ userDoc: {
834
+ _id: '$userDoc._id',
835
+ coreUser: '$userDoc.coreUser',
836
+ },
837
+ shop: {
838
+ _id: { $toString: '$shopDoc._id' },
839
+ name: '$shopDoc.name',
840
+ logo: '$shopDoc.logo',
841
+ },
842
+ zone: {
843
+ _id: {
844
+ $toString: '$zoneDoc._id',
845
+ },
846
+ name: '$zoneDoc.name',
847
+ },
848
+ creationDate: '$createdAt',
849
+ },
850
+ },
851
+ ];
852
+ if (search) {
853
+ const userIds = await this.getCoreUserIds(search);
854
+ pipeline.push({
855
+ $match: {
856
+ $or: [
857
+ (0, search_1.buildSearchQuery)(search, ['shop.name', 'zone.name']),
858
+ {
859
+ 'userDoc.coreUser': {
860
+ $in: userIds,
861
+ },
862
+ },
863
+ ],
864
+ },
865
+ });
866
+ }
867
+ const result = await (0, pagination_1.paginateAggregation)(this.orderModel, pipeline, page, size, sort ?? { createdAt: -1 }, {
868
+ path: 'userDoc.coreUser',
869
+ model: this.coreUserModel,
870
+ select: {
871
+ _id: 0,
872
+ name: 1,
873
+ profilePhoto: 1,
874
+ },
875
+ });
876
+ for (const doc of result.documents) {
877
+ const coreUser = doc.userDoc?.coreUser;
878
+ doc.user = {
879
+ _id: String(doc.userDoc?._id ?? ''),
880
+ name: coreUser?.name ?? null,
881
+ photo: coreUser?.profilePhoto ?? null,
882
+ };
883
+ delete doc.userDoc;
884
+ }
885
+ return result;
886
+ }
887
+ async getCoreUserIds(searchKey) {
888
+ return this.coreUserModel.distinct('_id', {
889
+ status: enum_1.Status.ACTIVE,
890
+ $or: [
891
+ {
892
+ name: {
893
+ $regex: searchKey,
894
+ $options: 'i',
895
+ },
896
+ },
897
+ {
898
+ email: {
899
+ $regex: searchKey,
900
+ $options: 'i',
901
+ },
902
+ },
903
+ {
904
+ userId: {
905
+ $regex: searchKey,
906
+ $options: 'i',
907
+ },
908
+ },
909
+ ],
910
+ });
911
+ }
590
912
  }
591
913
  exports.CouponRepository = CouponRepository;
592
914
  //# sourceMappingURL=CouponRepository.js.map