@lyxa.ai/marketing 1.0.40 → 1.0.42

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 (246) hide show
  1. package/dist/lib/event/event-initializations.d.ts.map +1 -1
  2. package/dist/lib/event/event-initializations.js +2 -0
  3. package/dist/lib/event/event-initializations.js.map +1 -1
  4. package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -1
  5. package/dist/lib/event/event-listeners/event-listeners.js.map +1 -1
  6. package/dist/lib/index.d.ts +652 -0
  7. package/dist/lib/index.d.ts.map +1 -1
  8. package/dist/lib/index.js +6 -6
  9. package/dist/lib/index.js.map +1 -1
  10. package/dist/lib/modules/coupon/routers/coupon.router.d.ts +4 -0
  11. package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  12. package/dist/lib/modules/coupon/services/coupon.service.d.ts +1 -0
  13. package/dist/lib/modules/coupon/services/coupon.service.d.ts.map +1 -1
  14. package/dist/lib/modules/coupon/services/coupon.service.js +74 -65
  15. package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
  16. package/dist/lib/modules/coupon/services/custom-coupon.service.d.ts +28 -2
  17. package/dist/lib/modules/coupon/services/custom-coupon.service.d.ts.map +1 -1
  18. package/dist/lib/modules/coupon/services/custom-coupon.service.js +13 -33
  19. package/dist/lib/modules/coupon/services/custom-coupon.service.js.map +1 -1
  20. package/dist/lib/modules/coupon/services/helper.service.d.ts +30 -2
  21. package/dist/lib/modules/coupon/services/helper.service.d.ts.map +1 -1
  22. package/dist/lib/modules/coupon/services/helper.service.js +121 -8
  23. package/dist/lib/modules/coupon/services/helper.service.js.map +1 -1
  24. package/dist/lib/modules/coupon/services/individual-store-coupon.service.d.ts +29 -3
  25. package/dist/lib/modules/coupon/services/individual-store-coupon.service.d.ts.map +1 -1
  26. package/dist/lib/modules/coupon/services/individual-store-coupon.service.js +10 -62
  27. package/dist/lib/modules/coupon/services/individual-store-coupon.service.js.map +1 -1
  28. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
  29. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js +117 -155
  30. package/dist/lib/modules/coupon/services/patterns/repository/CouponRepository.js.map +1 -1
  31. package/dist/lib/modules/coupon/services/referral-code-coupon.service.d.ts +9 -0
  32. package/dist/lib/modules/coupon/services/referral-code-coupon.service.d.ts.map +1 -1
  33. package/dist/lib/modules/coupon/services/referral-code-coupon.service.js +97 -30
  34. package/dist/lib/modules/coupon/services/referral-code-coupon.service.js.map +1 -1
  35. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
  36. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js +5 -1
  37. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js.map +1 -1
  38. package/dist/lib/modules/coupon/services/shops-categories-coupon.service.d.ts +29 -3
  39. package/dist/lib/modules/coupon/services/shops-categories-coupon.service.d.ts.map +1 -1
  40. package/dist/lib/modules/coupon/services/shops-categories-coupon.service.js +10 -63
  41. package/dist/lib/modules/coupon/services/shops-categories-coupon.service.js.map +1 -1
  42. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +13 -0
  43. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  44. package/dist/lib/modules/coupon/validations/coupon.validation.js +3 -2
  45. package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -1
  46. package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
  47. package/dist/lib/modules/deal-setting/services/deal-setting.service.d.ts.map +1 -1
  48. package/dist/lib/modules/deal-setting/services/deal-setting.service.js +4 -4
  49. package/dist/lib/modules/deal-setting/services/deal-setting.service.js.map +1 -1
  50. package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
  51. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts +339 -0
  52. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -0
  53. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js +77 -0
  54. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js.map +1 -0
  55. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.d.ts +4 -0
  56. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -0
  57. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js +24 -0
  58. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js.map +1 -0
  59. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts +12 -0
  60. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts.map +1 -0
  61. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.js +29 -0
  62. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.js.map +1 -0
  63. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +8 -0
  64. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -0
  65. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js +79 -0
  66. package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js.map +1 -0
  67. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +851 -0
  68. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -0
  69. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js +100 -0
  70. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js.map +1 -0
  71. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +11 -0
  72. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -0
  73. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js +75 -0
  74. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js.map +1 -0
  75. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +9 -0
  76. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -0
  77. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js +42 -0
  78. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js.map +1 -0
  79. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +78 -0
  80. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -0
  81. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js +308 -0
  82. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js.map +1 -0
  83. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts +12 -0
  84. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts.map +1 -0
  85. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.js +94 -0
  86. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.js.map +1 -0
  87. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts +189 -0
  88. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts.map +1 -0
  89. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.js +24 -0
  90. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.js.map +1 -0
  91. package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.d.ts +122 -0
  92. package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.d.ts.map +1 -0
  93. package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.js +37 -0
  94. package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.js.map +1 -0
  95. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts +644 -0
  96. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -0
  97. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.js +13 -0
  98. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.js.map +1 -0
  99. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +170 -0
  100. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -0
  101. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js +51 -0
  102. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js.map +1 -0
  103. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +603 -0
  104. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -0
  105. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js +85 -0
  106. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js.map +1 -0
  107. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +12 -0
  108. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -0
  109. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js +98 -0
  110. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js.map +1 -0
  111. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +21 -0
  112. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -0
  113. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js +133 -0
  114. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js.map +1 -0
  115. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +2 -1
  116. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
  117. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js +23 -15
  118. package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js.map +1 -1
  119. package/dist/lib/modules/marketing/routers/marketing.router.d.ts +5 -0
  120. package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  121. package/dist/lib/modules/marketing/routers/marketing.router.js +3 -0
  122. package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -1
  123. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts +0 -2
  124. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
  125. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js +18 -39
  126. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js.map +1 -1
  127. package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts +0 -3
  128. package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
  129. package/dist/lib/modules/marketing/services/discount-marketing.service.js +26 -52
  130. package/dist/lib/modules/marketing/services/discount-marketing.service.js.map +1 -1
  131. package/dist/lib/modules/marketing/services/marketing.service.d.ts +1 -0
  132. package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
  133. package/dist/lib/modules/marketing/services/marketing.service.js +55 -25
  134. package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
  135. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +9 -2
  136. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  137. package/dist/lib/modules/marketing/services/product-marketing.service.js +132 -7
  138. package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -1
  139. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  140. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js +58 -31
  141. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js.map +1 -1
  142. package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +3 -0
  143. package/dist/lib/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts.map +1 -1
  144. package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.d.ts +3 -0
  145. package/dist/lib/modules/marketing/transformers/discount-marketing.transformer.d.ts.map +1 -1
  146. package/dist/lib/modules/marketing/transformers/product-marketing.transformer.d.ts +1 -0
  147. package/dist/lib/modules/marketing/transformers/product-marketing.transformer.d.ts.map +1 -1
  148. package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +42 -12
  149. package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts.map +1 -1
  150. package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts +57 -21
  151. package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts.map +1 -1
  152. package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts +77 -0
  153. package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts.map +1 -1
  154. package/dist/lib/modules/marketing/validations/product-marketing.validation.js +20 -1
  155. package/dist/lib/modules/marketing/validations/product-marketing.validation.js.map +1 -1
  156. package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
  157. package/dist/types/event/event-initializations.d.ts.map +1 -1
  158. package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -1
  159. package/dist/types/index.d.ts +652 -0
  160. package/dist/types/index.d.ts.map +1 -1
  161. package/dist/types/modules/coupon/routers/coupon.router.d.ts +4 -0
  162. package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  163. package/dist/types/modules/coupon/services/coupon.service.d.ts +1 -0
  164. package/dist/types/modules/coupon/services/coupon.service.d.ts.map +1 -1
  165. package/dist/types/modules/coupon/services/custom-coupon.service.d.ts +28 -2
  166. package/dist/types/modules/coupon/services/custom-coupon.service.d.ts.map +1 -1
  167. package/dist/types/modules/coupon/services/helper.service.d.ts +30 -2
  168. package/dist/types/modules/coupon/services/helper.service.d.ts.map +1 -1
  169. package/dist/types/modules/coupon/services/individual-store-coupon.service.d.ts +29 -3
  170. package/dist/types/modules/coupon/services/individual-store-coupon.service.d.ts.map +1 -1
  171. package/dist/types/modules/coupon/services/patterns/repository/CouponRepository.d.ts.map +1 -1
  172. package/dist/types/modules/coupon/services/referral-code-coupon.service.d.ts +57 -0
  173. package/dist/types/modules/coupon/services/referral-code-coupon.service.d.ts.map +1 -1
  174. package/dist/types/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
  175. package/dist/types/modules/coupon/services/shops-categories-coupon.service.d.ts +29 -3
  176. package/dist/types/modules/coupon/services/shops-categories-coupon.service.d.ts.map +1 -1
  177. package/dist/types/modules/coupon/validations/coupon.validation.d.ts +13 -0
  178. package/dist/types/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  179. package/dist/types/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
  180. package/dist/types/modules/deal-setting/services/deal-setting.service.d.ts.map +1 -1
  181. package/dist/types/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
  182. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts +339 -0
  183. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -0
  184. package/dist/types/modules/limited-time-offer/campaign/jobs/index.d.ts +4 -0
  185. package/dist/types/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -0
  186. package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts +12 -0
  187. package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.producer.d.ts.map +1 -0
  188. package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +8 -0
  189. package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -0
  190. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +851 -0
  191. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -0
  192. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +11 -0
  193. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -0
  194. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +9 -0
  195. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -0
  196. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +78 -0
  197. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -0
  198. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts +12 -0
  199. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts.map +1 -0
  200. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts +189 -0
  201. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts.map +1 -0
  202. package/dist/types/modules/limited-time-offer/config/limited-time-offer.router.d.ts +122 -0
  203. package/dist/types/modules/limited-time-offer/config/limited-time-offer.router.d.ts.map +1 -0
  204. package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts +644 -0
  205. package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -0
  206. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +170 -0
  207. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -0
  208. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +1 -0
  209. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +1 -0
  210. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +603 -0
  211. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -0
  212. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +12 -0
  213. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -0
  214. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +21 -0
  215. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -0
  216. package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +2 -1
  217. package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
  218. package/dist/types/modules/marketing/routers/marketing.router.d.ts +5 -0
  219. package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  220. package/dist/types/modules/marketing/services/buy1-get1-marketing.service.d.ts +0 -2
  221. package/dist/types/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
  222. package/dist/types/modules/marketing/services/discount-marketing.service.d.ts +0 -3
  223. package/dist/types/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
  224. package/dist/types/modules/marketing/services/marketing.service.d.ts +1 -0
  225. package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
  226. package/dist/types/modules/marketing/services/product-marketing.service.d.ts +13 -2
  227. package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  228. package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  229. package/dist/types/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts +3 -0
  230. package/dist/types/modules/marketing/transformers/buy1-get1-marketing.transformer.d.ts.map +1 -1
  231. package/dist/types/modules/marketing/transformers/discount-marketing.transformer.d.ts +3 -0
  232. package/dist/types/modules/marketing/transformers/discount-marketing.transformer.d.ts.map +1 -1
  233. package/dist/types/modules/marketing/transformers/product-marketing.transformer.d.ts +1 -0
  234. package/dist/types/modules/marketing/transformers/product-marketing.transformer.d.ts.map +1 -1
  235. package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +42 -12
  236. package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts.map +1 -1
  237. package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts +57 -21
  238. package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts.map +1 -1
  239. package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts +77 -0
  240. package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts.map +1 -1
  241. package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
  242. package/package.json +2 -2
  243. package/dist/lib/events/event-initializations.d.ts +0 -2
  244. package/dist/lib/events/event-initializations.d.ts.map +0 -1
  245. package/dist/lib/events/event-initializations.js +0 -5
  246. package/dist/lib/events/event-initializations.js.map +0 -1
@@ -24,12 +24,15 @@ class CouponRepository {
24
24
  return this._coreUserModel;
25
25
  }
26
26
  async getUserCoupons(user, shop, itemType) {
27
- const exchangeRate = await (0, currency_1.getExchangeRate)();
28
- const referralSettings = await this.referralSettingsModel.findOne();
27
+ const [exchangeRate, referralSettings] = await Promise.all([
28
+ (0, currency_1.getExchangeRate)(),
29
+ this.referralSettingsModel.findOne(),
30
+ ]);
29
31
  const secondaryReferralReceiverValue = referralSettings?.receiver?.valueType == enum_1.ValueType.PERCENTAGE
30
32
  ? null
31
33
  : (0, shared_1.roundSecondaryCurrency)((referralSettings?.receiver?.value ?? 0) * exchangeRate);
32
34
  const secondaryReferralReceiverMinOrderAmount = (0, shared_1.roundSecondaryCurrency)((referralSettings?.receiver?.minimumOrderValue ?? 0) * exchangeRate);
35
+ const now = (0, dayjs_1.dayjs)().toDate();
33
36
  const pipeline = [
34
37
  {
35
38
  $match: { _id: user },
@@ -45,14 +48,33 @@ class CouponRepository {
45
48
  $match: {
46
49
  $expr: {
47
50
  $and: [
48
- {
49
- $eq: [{ $ifNull: ['$status', enum_1.Status.ACTIVE] }, enum_1.Status.ACTIVE],
50
- },
51
- {
52
- $lte: [{ $ifNull: ['$duration.start', (0, dayjs_1.dayjs)().toDate()] }, (0, dayjs_1.dayjs)().toDate()],
53
- },
51
+ { $eq: [{ $ifNull: ['$status', enum_1.Status.ACTIVE] }, enum_1.Status.ACTIVE] },
52
+ { $lte: [{ $ifNull: ['$duration.start', now] }, now] },
54
53
  ],
55
54
  },
55
+ ...(shop
56
+ ? {}
57
+ : {
58
+ $and: [
59
+ {
60
+ $nor: [
61
+ { couponType: enum_1.CouponType.INDIVIDUAL_STORE },
62
+ { couponType: enum_1.CouponType.SHOPS_CATEGORIES },
63
+ ],
64
+ },
65
+ {
66
+ $or: [
67
+ { couponType: { $ne: enum_1.CouponType.CUSTOM_COUPON } },
68
+ {
69
+ $and: [
70
+ { $or: [{ shops: { $exists: false } }, { shops: { $size: 0 } }] },
71
+ { $or: [{ itemTypes: { $exists: false } }, { itemTypes: { $size: 0 } }] },
72
+ ],
73
+ },
74
+ ],
75
+ },
76
+ ],
77
+ }),
56
78
  },
57
79
  },
58
80
  {
@@ -82,25 +104,15 @@ class CouponRepository {
82
104
  pipeline: [{ $project: { name: 1 } }],
83
105
  },
84
106
  },
85
- {
86
- $unwind: { path: '$shop', preserveNullAndEmptyArrays: true },
87
- },
88
- {
89
- $unwind: { path: '$referralUser', preserveNullAndEmptyArrays: true },
90
- },
91
- {
92
- $unwind: { path: '$influencer', preserveNullAndEmptyArrays: true },
93
- },
107
+ { $unwind: { path: '$shop', preserveNullAndEmptyArrays: true } },
108
+ { $unwind: { path: '$referralUser', preserveNullAndEmptyArrays: true } },
109
+ { $unwind: { path: '$influencer', preserveNullAndEmptyArrays: true } },
94
110
  {
95
111
  $addFields: {
96
- referringUser: {
97
- $ifNull: ['$referralUser.coreUser', '$influencer.coreUser'],
98
- },
112
+ referringUser: { $ifNull: ['$referralUser.coreUser', '$influencer.coreUser'] },
99
113
  },
100
114
  },
101
- {
102
- $project: { referralUser: 0, influencer: 0 },
103
- },
115
+ { $project: { referralUser: 0, influencer: 0 } },
104
116
  ],
105
117
  },
106
118
  },
@@ -112,37 +124,52 @@ class CouponRepository {
112
124
  {
113
125
  $match: {
114
126
  $expr: { $eq: ['$user', '$$userId'] },
115
- 'adjustedFinance.coupon': { $exists: true },
116
127
  status: { $ne: enum_1.RegularOrderStatus.CANCELLED },
117
128
  },
118
129
  },
119
130
  {
120
- $lookup: {
121
- from: 'coupons',
122
- localField: 'adjustedFinance.coupon.coupon',
123
- foreignField: '_id',
124
- as: 'couponInfo',
125
- },
126
- },
127
- {
128
- $unwind: '$couponInfo',
129
- },
130
- {
131
- $group: {
132
- _id: '$adjustedFinance.coupon.coupon',
133
- snap: { $first: '$couponInfo' },
134
- count: { $sum: 1 },
131
+ $facet: {
132
+ orderedShops: [
133
+ {
134
+ $group: {
135
+ _id: null,
136
+ shops: { $addToSet: '$shop' },
137
+ },
138
+ },
139
+ ],
140
+ couponUsage: [
141
+ {
142
+ $match: {
143
+ 'adjustedFinance.coupon': { $exists: true },
144
+ },
145
+ },
146
+ {
147
+ $group: {
148
+ _id: '$adjustedFinance.coupon.coupon',
149
+ snap: { $first: '$adjustedFinance.coupon' },
150
+ count: { $sum: 1 },
151
+ },
152
+ },
153
+ ],
135
154
  },
136
155
  },
137
156
  ],
138
- as: 'couponUsage',
157
+ as: 'orderStats',
139
158
  },
140
159
  },
141
160
  {
142
- $unwind: '$couponDocs',
161
+ $addFields: {
162
+ orderedShops: {
163
+ $ifNull: [{ $arrayElemAt: ['$orderStats.orderedShops.shops', 0] }, []],
164
+ },
165
+ couponUsage: {
166
+ $ifNull: [{ $arrayElemAt: ['$orderStats.couponUsage', 0] }, []],
167
+ },
168
+ },
143
169
  },
144
- this.filterShopCoupons(shop, itemType),
145
- ...this.filterFirstOrderOnlyCoupons(shop),
170
+ { $unwind: '$couponDocs' },
171
+ ...(shop ? [this.filterShopCoupons(shop, itemType)] : []),
172
+ ...(shop ? this.filterFirstOrderOnlyCoupons(shop) : this.filterFirstOrderOnlyCoupons()),
146
173
  {
147
174
  $addFields: {
148
175
  usageData: {
@@ -159,6 +186,11 @@ class CouponRepository {
159
186
  },
160
187
  },
161
188
  },
189
+ {
190
+ $addFields: {
191
+ usedCount: { $ifNull: ['$usageData.count', 0] },
192
+ },
193
+ },
162
194
  {
163
195
  $addFields: {
164
196
  isExpired: {
@@ -167,21 +199,12 @@ class CouponRepository {
167
199
  {
168
200
  $and: [
169
201
  { $ifNull: ['$couponDocs.duration.end', false] },
170
- { $lt: ['$couponDocs.duration.end', '$$NOW'] },
202
+ { $lt: ['$couponDocs.duration.end', now] },
171
203
  ],
172
204
  },
173
205
  ],
174
206
  },
175
- usedCount: { $ifNull: ['$usageData.count', 0] },
176
- },
177
- },
178
- {
179
- $addFields: {
180
- exchangeRate: exchangeRate,
181
- },
182
- },
183
- {
184
- $addFields: {
207
+ exchangeRate,
185
208
  'couponDocs.value': {
186
209
  $switch: {
187
210
  branches: [
@@ -259,21 +282,20 @@ class CouponRepository {
259
282
  'expired',
260
283
  {
261
284
  $cond: [
285
+ { $gt: ['$usedCount', 0] },
262
286
  {
263
- $and: [
264
- { $gt: ['$usedCount', 0] },
287
+ $cond: [
265
288
  {
266
289
  $or: [
267
290
  { $not: ['$couponDocs.orderLimitPerUser'] },
268
291
  { $lt: ['$usedCount', '$couponDocs.orderLimitPerUser'] },
269
292
  ],
270
293
  },
294
+ 'available',
295
+ 'used',
271
296
  ],
272
297
  },
273
298
  'available',
274
- {
275
- $cond: [{ $gt: ['$usedCount', 0] }, 'used', 'available'],
276
- },
277
299
  ],
278
300
  },
279
301
  ],
@@ -284,27 +306,17 @@ class CouponRepository {
284
306
  $group: {
285
307
  _id: '$_id',
286
308
  available: {
287
- $push: {
288
- $cond: [{ $eq: ['$category', 'available'] }, '$couponDocs', '$$REMOVE'],
289
- },
309
+ $push: { $cond: [{ $eq: ['$category', 'available'] }, '$couponDocs', '$$REMOVE'] },
290
310
  },
291
311
  used: {
292
- $push: {
293
- $cond: [{ $eq: ['$category', 'used'] }, '$usageData.snap', '$$REMOVE'],
294
- },
312
+ $push: { $cond: [{ $eq: ['$category', 'used'] }, '$couponDocs', '$$REMOVE'] },
295
313
  },
296
314
  expired: {
297
- $push: {
298
- $cond: [{ $eq: ['$category', 'expired'] }, '$couponDocs', '$$REMOVE'],
299
- },
315
+ $push: { $cond: [{ $eq: ['$category', 'expired'] }, '$couponDocs', '$$REMOVE'] },
300
316
  },
301
317
  },
302
318
  },
303
- {
304
- $project: {
305
- _id: 0,
306
- },
307
- },
319
+ { $project: { _id: 0 } },
308
320
  ];
309
321
  const [results] = await this.userModel.aggregate(pipeline);
310
322
  if (!results) {
@@ -339,15 +351,14 @@ class CouponRepository {
339
351
  const influencerPart = coupon.referringUser ? ` (Referred by ${coupon.referringUser.name})` : '';
340
352
  coupon.couponOfferLabel = `Save ${valuePart}${maxDiscountPart}${influencerPart}`;
341
353
  let validityParts = [];
342
- if (coupon.isMinOrderValueEnabled && coupon.minOrderValue > 0) {
354
+ if (coupon.couponType === enum_1.CouponType.REFERRAL_CODE) {
355
+ validityParts.push(`Minimum order ${this.formatCurrency(null, coupon.secondaryCurrencyMinOrderValue)}`);
356
+ }
357
+ else if (coupon.isMinOrderValueEnabled && coupon.minOrderValue > 0) {
343
358
  validityParts.push(`Minimum order ${this.formatCurrency(coupon.minOrderValue, coupon.secondaryCurrencyMinOrderValue)}`);
344
359
  }
345
360
  if (coupon.isOrderLimitPerUserEnabled && coupon.orderLimitPerUser > 0) {
346
- validityParts.push(`applied on ${coupon.orderLimitPerUser} order`);
347
- }
348
- if (coupon.couponType === enum_1.CouponType.REFERRAL_CODE || coupon.couponType === enum_1.CouponType.REFERRAL_REWARD) {
349
- validityParts = [];
350
- validityParts.push(`Applied on 1 Order`);
361
+ validityParts.push(`Applied on ${coupon.orderLimitPerUser} order`);
351
362
  }
352
363
  coupon.couponValidityLabel = validityParts.join('. ');
353
364
  return coupon;
@@ -355,48 +366,44 @@ class CouponRepository {
355
366
  return resultsWithLabels;
356
367
  }
357
368
  formatCurrency(value, secondaryCurrencyValue) {
369
+ const formatterUSD = new Intl.NumberFormat('en-US', {
370
+ minimumFractionDigits: 0,
371
+ maximumFractionDigits: 2,
372
+ });
373
+ const formatterLBP = new Intl.NumberFormat('en-US', {
374
+ minimumFractionDigits: 0,
375
+ });
358
376
  if (secondaryCurrencyValue !== null && secondaryCurrencyValue !== undefined) {
359
- return 'LBP ' + String(secondaryCurrencyValue);
377
+ return 'LBP ' + formatterLBP.format(Number(secondaryCurrencyValue));
360
378
  }
361
- return '$' + String(value ?? 0);
379
+ return '$' + formatterUSD.format(Number(value ?? 0));
362
380
  }
363
381
  filterShopCoupons(shop, itemType) {
364
382
  return {
365
383
  $match: {
366
384
  $expr: {
367
- $cond: [
368
- { $not: [shop] },
369
- true,
385
+ $or: [
370
386
  {
371
- $or: [
372
- {
373
- $and: [
374
- { $eq: ['$couponDocs.couponType', enum_1.CouponType.INDIVIDUAL_STORE] },
375
- { $eq: ['$couponDocs.shop._id', shop] },
376
- ],
377
- },
387
+ $and: [
388
+ { $eq: ['$couponDocs.couponType', enum_1.CouponType.INDIVIDUAL_STORE] },
389
+ { $eq: ['$couponDocs.shop._id', shop] },
390
+ ],
391
+ },
392
+ {
393
+ $and: [
394
+ { $eq: ['$couponDocs.couponType', enum_1.CouponType.SHOPS_CATEGORIES] },
378
395
  {
379
- $and: [
380
- { $eq: ['$couponDocs.couponType', enum_1.CouponType.SHOPS_CATEGORIES] },
381
- {
382
- $or: [
383
- { $eq: ['$couponDocs.itemType', itemType] },
384
- {
385
- $in: [shop, { $ifNull: ['$couponDocs.shops', []] }],
386
- },
387
- ],
388
- },
396
+ $or: [
397
+ { $eq: ['$couponDocs.itemType', itemType] },
398
+ { $in: [shop, { $ifNull: ['$couponDocs.shops', []] }] },
389
399
  ],
390
400
  },
401
+ ],
402
+ },
403
+ {
404
+ $not: [
391
405
  {
392
- $not: [
393
- {
394
- $in: [
395
- '$couponDocs.couponType',
396
- [enum_1.CouponType.INDIVIDUAL_STORE, enum_1.CouponType.SHOPS_CATEGORIES],
397
- ],
398
- },
399
- ],
406
+ $in: ['$couponDocs.couponType', [enum_1.CouponType.INDIVIDUAL_STORE, enum_1.CouponType.SHOPS_CATEGORIES]],
400
407
  },
401
408
  ],
402
409
  },
@@ -407,49 +414,6 @@ class CouponRepository {
407
414
  }
408
415
  filterFirstOrderOnlyCoupons(shop) {
409
416
  return [
410
- {
411
- $lookup: {
412
- from: 'orders',
413
- let: {
414
- userId: '$_id',
415
- shopId: shop ?? '$couponDocs.shop._id',
416
- couponShops: { $ifNull: ['$couponDocs.shops', []] },
417
- },
418
- pipeline: [
419
- {
420
- $match: {
421
- $expr: {
422
- $and: [
423
- { $eq: ['$user', '$$userId'] },
424
- { $ne: ['$status', enum_1.RegularOrderStatus.CANCELLED] },
425
- {
426
- $cond: [
427
- { $ne: ['$$shopId', null] },
428
- { $eq: ['$shop', '$$shopId'] },
429
- { $in: ['$shop', '$$couponShops'] },
430
- ],
431
- },
432
- ],
433
- },
434
- },
435
- },
436
- {
437
- $group: {
438
- _id: null,
439
- orderedShops: { $addToSet: '$shop' },
440
- },
441
- },
442
- ],
443
- as: 'orderStats',
444
- },
445
- },
446
- {
447
- $addFields: {
448
- orderedShops: {
449
- $ifNull: [{ $arrayElemAt: ['$orderStats.orderedShops', 0] }, []],
450
- },
451
- },
452
- },
453
417
  {
454
418
  $addFields: {
455
419
  hasOrderedFromStore: {
@@ -490,9 +454,7 @@ class CouponRepository {
490
454
  $in: ['$couponDocs.couponType', [enum_1.CouponType.INDIVIDUAL_STORE, enum_1.CouponType.SHOPS_CATEGORIES]],
491
455
  },
492
456
  { $eq: ['$couponDocs.firstOrderOnly', true] },
493
- {
494
- $or: ['$hasOrderedFromStore', '$hasUnusedShopInCategory'],
495
- },
457
+ { $or: ['$hasOrderedFromStore', '$hasUnusedShopInCategory'] },
496
458
  ],
497
459
  },
498
460
  },
@@ -1 +1 @@
1
- {"version":3,"file":"CouponRepository.js","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCoupon,\n\tCouponModel,\n\tgetCoreUserModel,\n\tReferralSetting,\n\tReferralSettingModel,\n\tUser,\n\tUserModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { mongoose } from '@typegoose/typegoose';\nimport { getRoundSecondaryCurrencyStage } from '@lyxa.ai/core/dist/utilities/pipelines/common-pipeline-functions';\nimport {\n\tCouponType,\n\tItemType,\n\tRegularOrderStatus,\n\tStatus,\n\tValueType,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { getExchangeRate } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\n\nexport class CouponRepository {\n\tprivate readonly model: typeof CouponModel & SoftDeleteModel<Coupon>;\n\tprivate readonly userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate readonly referralSettingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate _coreUserModel: ReturnType<typeof getCoreUserModel> | null = null;\n\n\tconstructor() {\n\t\tthis.model = CouponModel as typeof CouponModel & SoftDeleteModel<Coupon>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t\tthis.referralSettingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t}\n\n\tprivate get coreUserModel() {\n\t\tif (!this._coreUserModel) {\n\t\t\tthis._coreUserModel = getCoreUserModel();\n\t\t}\n\t\treturn this._coreUserModel;\n\t}\n\n\tpublic async getUserCoupons(\n\t\tuser: mongoose.Types.ObjectId | undefined,\n\t\tshop: mongoose.Types.ObjectId | undefined,\n\t\titemType: ItemType | undefined\n\t): Promise<any> {\n\t\tconst exchangeRate = await getExchangeRate();\n\n\t\tconst referralSettings = await this.referralSettingsModel.findOne();\n\n\t\tconst secondaryReferralReceiverValue =\n\t\t\treferralSettings?.receiver?.valueType == ValueType.PERCENTAGE\n\t\t\t\t? null\n\t\t\t\t: roundSecondaryCurrency((referralSettings?.receiver?.value ?? 0) * exchangeRate);\n\n\t\tconst secondaryReferralReceiverMinOrderAmount = roundSecondaryCurrency(\n\t\t\t(referralSettings?.receiver?.minimumOrderValue ?? 0) * exchangeRate\n\t\t);\n\n\t\tconst pipeline: mongoose.PipelineStage[] = [\n\t\t\t// Match the user\n\t\t\t{\n\t\t\t\t$match: { _id: user },\n\t\t\t},\n\n\t\t\t// Lookup coupon documents\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'coupons',\n\t\t\t\t\tlocalField: 'coupons',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'couponDocs',\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\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{\n\t\t\t\t\t\t\t\t\t\t\t$eq: [{ $ifNull: ['$status', Status.ACTIVE] }, Status.ACTIVE],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$lte: [{ $ifNull: ['$duration.start', dayjs().toDate()] }, dayjs().toDate()],\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{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'referralUser',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'referralUser',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'influencer',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'influencer',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'shops',\n\t\t\t\t\t\t\t\tlocalField: 'shop',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'shop',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { name: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$unwind: { path: '$shop', preserveNullAndEmptyArrays: true },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$unwind: { path: '$referralUser', preserveNullAndEmptyArrays: true },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$unwind: { path: '$influencer', preserveNullAndEmptyArrays: true },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$addFields: {\n\t\t\t\t\t\t\t\treferringUser: {\n\t\t\t\t\t\t\t\t\t$ifNull: ['$referralUser.coreUser', '$influencer.coreUser'],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$project: { referralUser: 0, influencer: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Lookup orders containing coupons for this user\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'orders',\n\t\t\t\t\tlet: { userId: '$_id' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: { $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\t'adjustedFinance.coupon': { $exists: true },\n\t\t\t\t\t\t\t\tstatus: { $ne: RegularOrderStatus.CANCELLED },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'coupons',\n\t\t\t\t\t\t\t\tlocalField: 'adjustedFinance.coupon.coupon',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'couponInfo',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$unwind: '$couponInfo',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t_id: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t\t\t\tsnap: { $first: '$couponInfo' },\n\t\t\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tas: 'couponUsage',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Unwind coupons to classify individually\n\t\t\t{\n\t\t\t\t$unwind: '$couponDocs',\n\t\t\t},\n\n\t\t\t// Filter individual shop and shops categories coupons\n\t\t\tthis.filterShopCoupons(shop, itemType),\n\n\t\t\t// Filter first order only coupons\n\t\t\t...this.filterFirstOrderOnlyCoupons(shop),\n\n\t\t\t// Join usage count for this coupon\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tusageData: {\n\t\t\t\t\t\t$arrayElemAt: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$filter: {\n\t\t\t\t\t\t\t\t\tinput: '$couponUsage',\n\t\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\t\tcond: { $eq: ['$$cu._id', '$couponDocs._id'] },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Classify expiration exactly like isCouponExpired()\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tisExpired: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t// true only if expirationReason is a non-empty string\n\t\t\t\t\t\t\t{ $gt: [{ $strLenCP: { $ifNull: ['$couponDocs.expirationReason', ''] } }, 0] },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $ifNull: ['$couponDocs.duration.end', false] },\n\t\t\t\t\t\t\t\t\t{ $lt: ['$couponDocs.duration.end', '$$NOW'] }, // consistent “now”\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\tusedCount: { $ifNull: ['$usageData.count', 0] },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Add exchange rate and secondary currency rounding factor\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\texchangeRate: exchangeRate,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Compute and add secondary currency values to coupon documents\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\t// base value\n\t\t\t\t\t'couponDocs.value': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.value ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.value',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\t// value type\n\t\t\t\t\t'couponDocs.valueType': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.valueType ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.valueType',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\t'couponDocs.secondaryCurrencyValue': {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t// If valueType is percentage => null always\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.valueType', ValueType.PERCENTAGE] },\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverValue,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.value', exchangeRate],\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\n\t\t\t\t\t'couponDocs.secondaryCurrencyMaxDiscountLimit': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: null,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.maxDiscountLimit', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyMinOrderValue': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverMinOrderAmount,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.minOrderValue', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Category logic\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tcategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t'$isExpired',\n\t\t\t\t\t\t\t'expired',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t{ $gt: ['$usedCount', 0] },\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $not: ['$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $lt: ['$usedCount', '$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'available',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$cond: [{ $gt: ['$usedCount', 0] }, 'used', 'available'],\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// Group into arrays\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tavailable: {\n\t\t\t\t\t\t$push: {\n\t\t\t\t\t\t\t$cond: [{ $eq: ['$category', 'available'] }, '$couponDocs', '$$REMOVE'],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tused: {\n\t\t\t\t\t\t$push: {\n\t\t\t\t\t\t\t$cond: [{ $eq: ['$category', 'used'] }, '$usageData.snap', '$$REMOVE'],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\texpired: {\n\t\t\t\t\t\t$push: {\n\t\t\t\t\t\t\t$cond: [{ $eq: ['$category', 'expired'] }, '$couponDocs', '$$REMOVE'],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$project: {\n\t\t\t\t\t_id: 0,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tconst [results] = await this.userModel.aggregate(pipeline);\n\n\t\tif (!results) {\n\t\t\treturn {\n\t\t\t\tavailable: [],\t\n\t\t\t\tused: [],\n\t\t\t\texpired: [],\n\t\t\t};\n\t\t}\n\n\t\tconst populatedResults = await this.userModel.populate(results, {\n\t\t\tpath: 'available.referringUser',\n\t\t\tmodel: this.coreUserModel,\n\t\t\tselect: { _id: 0, name: 1 },\n\t\t});\n\n\t\treturn populatedResults;\n\t}\n\n\tpublic addLabelsToAllCoupons(coupons: any): any {\n\t\treturn {\n\t\t\tavailable: this.addLabelsToCoupons(coupons.available).reverse(), // Just to make newly added coupon at the top\n\t\t\tused: this.addLabelsToCoupons(coupons.used).reverse(), // Just to make newly added coupon at the top\n\t\t\texpired: this.addLabelsToCoupons(coupons.expired).reverse(), // Just to make newly added coupon at the top\n\t\t};\n\t}\n\n\tpublic addLabelsToCoupons(coupons: any[]): any[] {\n\t\tconst resultsWithLabels = coupons.map(coupon => {\n\t\t\t// couponOfferLabel\n\t\t\tconst valuePart =\n\t\t\t\tcoupon.valueType === 'fixed'\n\t\t\t\t\t? this.formatCurrency(coupon.value, coupon.secondaryCurrencyValue)\n\t\t\t\t\t: `${coupon.value}%`;\n\n\t\t\tconst maxDiscountPart =\n\t\t\t\tcoupon.isMaxDiscountLimitEnabled && coupon.maxDiscountLimit > 0\n\t\t\t\t\t? ` up to ${this.formatCurrency(coupon.maxDiscountLimit, coupon.secondaryCurrencyMaxDiscountLimit)}`\n\t\t\t\t\t: '';\n\n\t\t\tconst influencerPart = coupon.referringUser ? ` (Referred by ${coupon.referringUser.name})` : '';\n\n\t\t\tcoupon.couponOfferLabel = `Save ${valuePart}${maxDiscountPart}${influencerPart}`;\n\n\t\t\t// couponValidityLabel\n\t\t\tlet validityParts: string[] = [];\n\n\t\t\t// 1. Minimum Order\n\t\t\tif (coupon.isMinOrderValueEnabled && coupon.minOrderValue > 0) {\n\t\t\t\tvalidityParts.push(\n\t\t\t\t\t`Minimum order ${this.formatCurrency(coupon.minOrderValue, coupon.secondaryCurrencyMinOrderValue)}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// 2. Order Limit\n\t\t\tif (coupon.isOrderLimitPerUserEnabled && coupon.orderLimitPerUser > 0) {\n\t\t\t\tvalidityParts.push(`applied on ${coupon.orderLimitPerUser} order`);\n\t\t\t}\n\n\t\t\tif(coupon.couponType === CouponType.REFERRAL_CODE || coupon.couponType === CouponType.REFERRAL_REWARD){\n\t\t\t\tvalidityParts = [];\n\t\t\t\tvalidityParts.push(`Applied on 1 Order`);\n\t\t\t}\n\n\t\t\tcoupon.couponValidityLabel = validityParts.join('. ');\n\n\t\t\treturn coupon;\n\t\t});\n\n\t\treturn resultsWithLabels;\n\t}\n\n\tprivate formatCurrency(value: any, secondaryCurrencyValue: any) {\n\t\tif (secondaryCurrencyValue !== null && secondaryCurrencyValue !== undefined) {\n\t\t\treturn 'LBP ' + String(secondaryCurrencyValue);\n\t\t}\n\t\treturn '$' + String(value ?? 0);\n\t}\n\n\tprivate filterShopCoupons(\n\t\tshop: mongoose.Types.ObjectId | undefined,\n\t\titemType: ItemType | undefined\n\t): mongoose.PipelineStage {\n\t\treturn {\n\t\t\t$match: {\n\t\t\t\t$expr: {\n\t\t\t\t\t// If shopId is undefined → skip filtering (always true)\n\t\t\t\t\t$cond: [\n\t\t\t\t\t\t{ $not: [shop] }, // means shopId is null/undefined\n\t\t\t\t\t\ttrue, // skip filtering\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t// Case 1: INDIVIDUAL_STORE → shop must match\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.shop._id', shop] },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Case 2: SHOP_CATEGORY\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t// itemType matches\n\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.itemType', itemType] },\n\n\t\t\t\t\t\t\t\t\t\t\t\t// or shopId is inside couponDocs.shops[]\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t$in: [shop, { $ifNull: ['$couponDocs.shops', []] }],\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\n\t\t\t\t\t\t\t\t// Case 3: All other coupon types → keep\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$not: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$in: [\n\t\t\t\t\t\t\t\t\t\t\t\t'$couponDocs.couponType',\n\t\t\t\t\t\t\t\t\t\t\t\t[CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES],\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],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate filterFirstOrderOnlyCoupons(shop?: mongoose.Types.ObjectId): mongoose.PipelineStage[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'orders',\n\t\t\t\t\tlet: {\n\t\t\t\t\t\tuserId: '$_id',\n\t\t\t\t\t\tshopId: shop ?? '$couponDocs.shop._id',\n\t\t\t\t\t\tcouponShops: { $ifNull: ['$couponDocs.shops', []] },\n\t\t\t\t\t},\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\n\t\t\t\t\t\t\t\t\t\t{ $ne: ['$status', RegularOrderStatus.CANCELLED] },\n\n\t\t\t\t\t\t\t\t\t\t// If shop is provided → only that shop\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t\t\t\t{ $ne: ['$$shopId', null] },\n\t\t\t\t\t\t\t\t\t\t\t\t{ $eq: ['$shop', '$$shopId'] },\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Else → any shop in coupon.shops\n\t\t\t\t\t\t\t\t\t\t\t\t{ $in: ['$shop', '$$couponShops'] },\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{\n\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\t\t\torderedShops: { $addToSet: '$shop' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tas: 'orderStats',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\torderedShops: {\n\t\t\t\t\t\t$ifNull: [{ $arrayElemAt: ['$orderStats.orderedShops', 0] }, []],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\t// Individual store logic\n\t\t\t\t\thasOrderedFromStore: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\t{ $in: [shop ?? '$couponDocs.shop._id', '$orderedShops'] },\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\n\t\t\t\t\t// Multiple store logic\n\t\t\t\t\thasUnusedShopInCategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t{ $ifNull: [shop, false] },\n\t\t\t\t\t\t\t\t\t// shop provided → hide if user has ordered from this shop\n\t\t\t\t\t\t\t\t\t{ $in: [shop, '$orderedShops'] },\n\t\t\t\t\t\t\t\t\t// no shop provided → hide if no unused shops\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$eq: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$size: { $setDifference: [{ $ifNull: ['$couponDocs.shops', []] }, '$orderedShops'] },\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t0,\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\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$expr: {\n\t\t\t\t\t\t$not: {\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$in: ['$couponDocs.couponType', [CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES]],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.firstOrderOnly', true] },\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$or: ['$hasOrderedFromStore', '$hasUnusedShopInCategory'],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n}\n"]}
1
+ {"version":3,"file":"CouponRepository.js","sourceRoot":"/","sources":["modules/coupon/services/patterns/repository/CouponRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCoupon,\n\tCouponModel,\n\tgetCoreUserModel,\n\tReferralSetting,\n\tReferralSettingModel,\n\tUser,\n\tUserModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { mongoose } from '@typegoose/typegoose';\nimport { getRoundSecondaryCurrencyStage } from '@lyxa.ai/core/dist/utilities/pipelines/common-pipeline-functions';\nimport {\n\tCouponType,\n\tItemType,\n\tRegularOrderStatus,\n\tStatus,\n\tValueType,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { getExchangeRate } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\n\nexport class CouponRepository {\n\tprivate readonly model: typeof CouponModel & SoftDeleteModel<Coupon>;\n\tprivate readonly userModel: typeof UserModel & SoftDeleteModel<User>;\n\tprivate readonly referralSettingsModel: typeof ReferralSettingModel & SoftDeleteModel<ReferralSetting>;\n\tprivate _coreUserModel: ReturnType<typeof getCoreUserModel> | null = null;\n\n\tconstructor() {\n\t\tthis.model = CouponModel as typeof CouponModel & SoftDeleteModel<Coupon>;\n\t\tthis.userModel = UserModel as typeof UserModel & SoftDeleteModel<User>;\n\t\tthis.referralSettingsModel = ReferralSettingModel as typeof ReferralSettingModel &\n\t\t\tSoftDeleteModel<ReferralSetting>;\n\t}\n\n\tprivate get coreUserModel() {\n\t\tif (!this._coreUserModel) {\n\t\t\tthis._coreUserModel = getCoreUserModel();\n\t\t}\n\t\treturn this._coreUserModel;\n\t}\n\n\tpublic async getUserCoupons(\n\t\tuser: mongoose.Types.ObjectId | undefined,\n\t\tshop: mongoose.Types.ObjectId | undefined,\n\t\titemType: ItemType | undefined\n\t): Promise<any> {\n\t\tconst [exchangeRate, referralSettings] = await Promise.all([\n\t\t\tgetExchangeRate(),\n\t\t\tthis.referralSettingsModel.findOne(),\n\t\t]);\n\n\t\tconst secondaryReferralReceiverValue =\n\t\t\treferralSettings?.receiver?.valueType == ValueType.PERCENTAGE\n\t\t\t\t? null\n\t\t\t\t: roundSecondaryCurrency((referralSettings?.receiver?.value ?? 0) * exchangeRate);\n\n\t\tconst secondaryReferralReceiverMinOrderAmount = roundSecondaryCurrency(\n\t\t\t(referralSettings?.receiver?.minimumOrderValue ?? 0) * exchangeRate\n\t\t);\n\n\t\tconst now = dayjs().toDate();\n\n\t\tconst pipeline: mongoose.PipelineStage[] = [\n\t\t\t// Match the user\n\t\t\t{\n\t\t\t\t$match: { _id: user },\n\t\t\t},\n\n\t\t\t// Lookup coupons with nested referral/influencer/shop\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'coupons',\n\t\t\t\t\tlocalField: 'coupons',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'couponDocs',\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t// Active and started\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: {\n\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: [{ $ifNull: ['$status', Status.ACTIVE] }, Status.ACTIVE] },\n\t\t\t\t\t\t\t\t\t\t{ $lte: [{ $ifNull: ['$duration.start', now] }, now] },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t...(shop\n\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t$nor: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: CouponType.INDIVIDUAL_STORE },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: CouponType.SHOPS_CATEGORIES },\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ couponType: { $ne: CouponType.CUSTOM_COUPON } },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ shops: { $exists: false } }, { shops: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ $or: [{ itemTypes: { $exists: false } }, { itemTypes: { $size: 0 } }] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup referralUser and influencer\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'referralUser',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'referralUser',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'users',\n\t\t\t\t\t\t\t\tlocalField: 'influencer',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'influencer',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { coreUser: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Lookup shop\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lookup: {\n\t\t\t\t\t\t\t\tfrom: 'shops',\n\t\t\t\t\t\t\t\tlocalField: 'shop',\n\t\t\t\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\t\t\t\tas: 'shop',\n\t\t\t\t\t\t\t\tpipeline: [{ $project: { name: 1 } }],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $unwind: { path: '$shop', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$referralUser', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{ $unwind: { path: '$influencer', preserveNullAndEmptyArrays: true } },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$addFields: {\n\t\t\t\t\t\t\t\treferringUser: { $ifNull: ['$referralUser.coreUser', '$influencer.coreUser'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $project: { referralUser: 0, influencer: 0 } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Lookup orders once and compute:\n\t\t\t// - total usage per coupon\n\t\t\t// - all shops user ordered from\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'orders',\n\t\t\t\t\tlet: { userId: '$_id' },\n\t\t\t\t\tpipeline: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t$expr: { $eq: ['$user', '$$userId'] },\n\t\t\t\t\t\t\t\tstatus: { $ne: RegularOrderStatus.CANCELLED },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$facet: {\n\t\t\t\t\t\t\t\t// ordered shops for first-order logic\n\t\t\t\t\t\t\t\torderedShops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\t\t\t\t\t\tshops: { $addToSet: '$shop' },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t\t// coupon usage WITH SNAPSHOT\n\t\t\t\t\t\t\t\tcouponUsage: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t\t\t\t'adjustedFinance.coupon': { $exists: true },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t\t\t\t_id: '$adjustedFinance.coupon.coupon',\n\t\t\t\t\t\t\t\t\t\t\tsnap: { $first: '$adjustedFinance.coupon' },\n\t\t\t\t\t\t\t\t\t\t\tcount: { $sum: 1 },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tas: 'orderStats',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\torderedShops: {\n\t\t\t\t\t\t$ifNull: [{ $arrayElemAt: ['$orderStats.orderedShops.shops', 0] }, []],\n\t\t\t\t\t},\n\t\t\t\t\tcouponUsage: {\n\t\t\t\t\t\t$ifNull: [{ $arrayElemAt: ['$orderStats.couponUsage', 0] }, []],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Unwind coupons to classify individually\n\t\t\t{ $unwind: '$couponDocs' },\n\n\t\t\t// Filter coupons by shop/itemType\n\t\t\t...(shop ? [this.filterShopCoupons(shop, itemType)] : []),\n\n\t\t\t// First-order-only coupon filter\n\t\t\t...(shop ? this.filterFirstOrderOnlyCoupons(shop) : this.filterFirstOrderOnlyCoupons()),\n\n\t\t\t// Compute usage count per coupon\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tusageData: {\n\t\t\t\t\t\t$arrayElemAt: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$filter: {\n\t\t\t\t\t\t\t\t\tinput: '$couponUsage',\n\t\t\t\t\t\t\t\t\tas: 'cu',\n\t\t\t\t\t\t\t\t\tcond: { $eq: ['$$cu._id', '$couponDocs._id'] },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tusedCount: { $ifNull: ['$usageData.count', 0] },\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Expiration & secondary currency\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tisExpired: {\n\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t{ $gt: [{ $strLenCP: { $ifNull: ['$couponDocs.expirationReason', ''] } }, 0] },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t\t{ $ifNull: ['$couponDocs.duration.end', false] },\n\t\t\t\t\t\t\t\t\t{ $lt: ['$couponDocs.duration.end', now] },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\texchangeRate,\n\t\t\t\t\t'couponDocs.value': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.value ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.value',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.valueType': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: referralSettings?.receiver?.valueType ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: '$couponDocs.valueType',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyValue': {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.valueType', ValueType.PERCENTAGE] },\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverValue,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.value', exchangeRate],\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyMaxDiscountLimit': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: null,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.maxDiscountLimit', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'couponDocs.secondaryCurrencyMinOrderValue': {\n\t\t\t\t\t\t$switch: {\n\t\t\t\t\t\t\tbranches: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase: { $eq: ['$couponDocs.couponType', CouponType.REFERRAL_CODE] },\n\t\t\t\t\t\t\t\t\tthen: secondaryReferralReceiverMinOrderAmount,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: getRoundSecondaryCurrencyStage({\n\t\t\t\t\t\t\t\t$multiply: ['$couponDocs.minOrderValue', exchangeRate],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Classify category\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\tcategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t'$isExpired',\n\t\t\t\t\t\t\t'expired',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t{ $gt: ['$usedCount', 0] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $not: ['$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ $lt: ['$usedCount', '$couponDocs.orderLimitPerUser'] },\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t'available',\n\t\t\t\t\t\t\t\t\t\t\t'used',\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'available',\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Group into arrays\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tavailable: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'available'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t\tused: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'used'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t\texpired: {\n\t\t\t\t\t\t$push: { $cond: [{ $eq: ['$category', 'expired'] }, '$couponDocs', '$$REMOVE'] },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t{ $project: { _id: 0 } },\n\t\t];\n\n\t\tconst [results] = await this.userModel.aggregate(pipeline);\n\n\t\tif (!results) {\n\t\t\treturn {\n\t\t\t\tavailable: [],\n\t\t\t\tused: [],\n\t\t\t\texpired: [],\n\t\t\t};\n\t\t}\n\n\t\tconst populatedResults = await this.userModel.populate(results, {\n\t\t\tpath: 'available.referringUser',\n\t\t\tmodel: this.coreUserModel,\n\t\t\tselect: { _id: 0, name: 1 },\n\t\t});\n\n\t\treturn populatedResults;\n\t}\n\n\tpublic addLabelsToAllCoupons(coupons: any): any {\n\t\treturn {\n\t\t\tavailable: this.addLabelsToCoupons(coupons.available).reverse(), // Just to make newly added coupon at the top\n\t\t\tused: this.addLabelsToCoupons(coupons.used).reverse(), // Just to make newly added coupon at the top\n\t\t\texpired: this.addLabelsToCoupons(coupons.expired).reverse(), // Just to make newly added coupon at the top\n\t\t};\n\t}\n\n\tpublic addLabelsToCoupons(coupons: any[]): any[] {\n\t\tconst resultsWithLabels = coupons.map(coupon => {\n\t\t\t// couponOfferLabel\n\t\t\tconst valuePart =\n\t\t\t\tcoupon.valueType === 'fixed'\n\t\t\t\t\t? this.formatCurrency(coupon.value, coupon.secondaryCurrencyValue)\n\t\t\t\t\t: `${coupon.value}%`;\n\n\t\t\tconst maxDiscountPart =\n\t\t\t\tcoupon.isMaxDiscountLimitEnabled && coupon.maxDiscountLimit > 0\n\t\t\t\t\t? ` up to ${this.formatCurrency(coupon.maxDiscountLimit, coupon.secondaryCurrencyMaxDiscountLimit)}`\n\t\t\t\t\t: '';\n\n\t\t\tconst influencerPart = coupon.referringUser ? ` (Referred by ${coupon.referringUser.name})` : '';\n\n\t\t\tcoupon.couponOfferLabel = `Save ${valuePart}${maxDiscountPart}${influencerPart}`;\n\n\t\t\t// couponValidityLabel\n\t\t\tlet validityParts: string[] = [];\n\n\t\t\t// 1. Minimum Order\n\t\t\tif (\n\t\t\t\tcoupon.couponType === CouponType.REFERRAL_CODE\n\t\t\t) {\n\t\t\t\tvalidityParts.push(\n\t\t\t\t\t`Minimum order ${this.formatCurrency(null, coupon.secondaryCurrencyMinOrderValue)}`\n\t\t\t\t);\n\t\t\t} else if (coupon.isMinOrderValueEnabled && coupon.minOrderValue > 0) {\n\t\t\t\tvalidityParts.push(\n\t\t\t\t\t`Minimum order ${this.formatCurrency(coupon.minOrderValue, coupon.secondaryCurrencyMinOrderValue)}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// 2. Order Limit\n\t\t\tif (coupon.isOrderLimitPerUserEnabled && coupon.orderLimitPerUser > 0) {\n\t\t\t\tvalidityParts.push(`Applied on ${coupon.orderLimitPerUser} order`);\n\t\t\t}\n\n\t\t\t// if(coupon.couponType === CouponType.REFERRAL_CODE || coupon.couponType === CouponType.REFERRAL_REWARD){\n\t\t\t// \tvalidityParts = [];\n\t\t\t// \tvalidityParts.push(`Applied on 1 Order`);\n\t\t\t// }\n\n\t\t\tcoupon.couponValidityLabel = validityParts.join('. ');\n\n\t\t\treturn coupon;\n\t\t});\n\n\t\treturn resultsWithLabels;\n\t}\n\n\tprivate formatCurrency(value: any, secondaryCurrencyValue: any) {\n\t\t// Use coma separator for thousands and round secondary currency value\n\t\tconst formatterUSD = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: 0,\n\t\t\tmaximumFractionDigits: 2,\n\t\t});\n\n\t\tconst formatterLBP = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: 0,\n\t\t});\n\n\t\tif (secondaryCurrencyValue !== null && secondaryCurrencyValue !== undefined) {\n\t\t\treturn 'LBP ' + formatterLBP.format(Number(secondaryCurrencyValue));\n\t\t}\n\n\t\treturn '$' + formatterUSD.format(Number(value ?? 0));\n\t}\n\n\tprivate filterShopCoupons(shop: mongoose.Types.ObjectId, itemType?: ItemType): mongoose.PipelineStage {\n\t\treturn {\n\t\t\t$match: {\n\t\t\t\t$expr: {\n\t\t\t\t\t$or: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.shop._id', shop] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.itemType', itemType] },\n\t\t\t\t\t\t\t\t\t\t{ $in: [shop, { $ifNull: ['$couponDocs.shops', []] }] },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$not: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$in: ['$couponDocs.couponType', [CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES]],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate filterFirstOrderOnlyCoupons(shop?: mongoose.Types.ObjectId): mongoose.PipelineStage[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\t$addFields: {\n\t\t\t\t\thasOrderedFromStore: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.INDIVIDUAL_STORE] },\n\t\t\t\t\t\t\t{ $in: [shop ?? '$couponDocs.shop._id', '$orderedShops'] },\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\thasUnusedShopInCategory: {\n\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t{ $eq: ['$couponDocs.couponType', CouponType.SHOPS_CATEGORIES] },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$cond: [\n\t\t\t\t\t\t\t\t\t{ $ifNull: [shop, false] },\n\t\t\t\t\t\t\t\t\t{ $in: [shop, '$orderedShops'] },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$eq: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t$size: { $setDifference: [{ $ifNull: ['$couponDocs.shops', []] }, '$orderedShops'] },\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t0,\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\tfalse,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$expr: {\n\t\t\t\t\t\t$not: {\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$in: ['$couponDocs.couponType', [CouponType.INDIVIDUAL_STORE, CouponType.SHOPS_CATEGORIES]],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{ $eq: ['$couponDocs.firstOrderOnly', true] },\n\t\t\t\t\t\t\t\t{ $or: ['$hasOrderedFromStore', '$hasUnusedShopInCategory'] },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n}\n"]}
@@ -5,9 +5,18 @@ export declare class ReferralCodeCouponService {
5
5
  private model;
6
6
  private settingsModel;
7
7
  private userModel;
8
+ private _coreUserModel;
8
9
  constructor();
10
+ private get coreUserModel();
9
11
  create(data: CreateDTO): Promise<DocumentType<Model>>;
10
12
  update(id: string, data: UpdateDTO): Promise<DocumentType<Model>>;
13
+ private normalizeName;
14
+ private padToThree;
15
+ private containsArabic;
16
+ private generateRandomAlphaNumeric;
17
+ private generateThreeDigits;
18
+ private generateCouponFromName;
19
+ private splitName;
11
20
  private generateCode;
12
21
  private generateCouponCode;
13
22
  createReferralCodeForUser(userId: mongoose.Types.ObjectId | undefined): Promise<DocumentType<Model>>;
@@ -1 +1 @@
1
- {"version":3,"file":"referral-code-coupon.service.d.ts","sourceRoot":"/","sources":["modules/coupon/services/referral-code-coupon.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAEN,kBAAkB,IAAI,KAAK,EAK3B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACN,yBAAyB,EACzB,2BAA2B,IAAI,SAAS,EACxC,6BAA6B,EAC7B,2BAA2B,IAAI,SAAS,EACxC,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;AAQrC,qBACa,yBAAyB;IACrC,OAAO,CAAC,KAAK,CAAC;IACd,OAAO,CAAC,aAAa,CAAiE;IACtF,OAAO,CAAC,SAAS,CAA2C;;IAa/C,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAuB9E,OAAO,CAAC,YAAY;YASN,kBAAkB;IAanB,yBAAyB,CACrC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,GACzC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAkClB,cAAc,CAC1B,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,GACzB,OAAO,CAAC,yBAAyB,CAAC;IAgExB,qBAAqB,CACjC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAC7B,OAAO,CAAC,6BAA6B,CAAC;YAc3B,mBAAmB;CAKjC;AAED,eAAO,MAAM,yBAAyB,2BAA2C,CAAC"}
1
+ {"version":3,"file":"referral-code-coupon.service.d.ts","sourceRoot":"/","sources":["modules/coupon/services/referral-code-coupon.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAEN,kBAAkB,IAAI,KAAK,EAM3B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACN,yBAAyB,EACzB,2BAA2B,IAAI,SAAS,EACxC,6BAA6B,EAC7B,2BAA2B,IAAI,SAAS,EACxC,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;AASrC,qBACa,yBAAyB;IACrC,OAAO,CAAC,KAAK,CAAC;IACd,OAAO,CAAC,aAAa,CAAiE;IACtF,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,cAAc,CAAoD;;IAS1E,OAAO,KAAK,aAAa,GAKxB;IAMY,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA8B9E,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,0BAA0B;IAgBlC,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,sBAAsB;IAmC9B,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,YAAY;YAqBN,kBAAkB;IAiBnB,yBAAyB,CACrC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,GACzC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAkClB,cAAc,CAC1B,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,GACzB,OAAO,CAAC,yBAAyB,CAAC;IA0ExB,qBAAqB,CACjC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAC7B,OAAO,CAAC,6BAA6B,CAAC;YAc3B,mBAAmB;CAKjC;AAED,eAAO,MAAM,yBAAyB,2BAA2C,CAAC"}