@lyxa.ai/marketing 1.0.64 → 1.0.65

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 (311) hide show
  1. package/dist/lib/event/event-initializations.d.ts.map +1 -1
  2. package/dist/lib/event/event-initializations.js +0 -1
  3. package/dist/lib/event/event-initializations.js.map +1 -1
  4. package/dist/lib/event/event-listeners/event-listeners.d.ts +0 -1
  5. package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -1
  6. package/dist/lib/event/event-listeners/event-listeners.js +12 -62
  7. package/dist/lib/event/event-listeners/event-listeners.js.map +1 -1
  8. package/dist/lib/event/events/marketing-product-seed.event.d.ts +2 -1
  9. package/dist/lib/event/events/marketing-product-seed.event.d.ts.map +1 -1
  10. package/dist/lib/event/events/marketing-product-seed.event.js.map +1 -1
  11. package/dist/lib/index.d.ts +21 -12030
  12. package/dist/lib/index.d.ts.map +1 -1
  13. package/dist/lib/index.js.map +1 -1
  14. package/dist/lib/modules/coupon/routers/coupon.router.d.ts +1101 -27
  15. package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  16. package/dist/lib/modules/coupon/services/coupon.service.d.ts +1 -1
  17. package/dist/lib/modules/coupon/services/coupon.service.js +1 -1
  18. package/dist/lib/modules/coupon/services/coupon.service.js.map +1 -1
  19. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -1
  20. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js +21 -6
  21. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js.map +1 -1
  22. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
  23. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js +1 -0
  24. package/dist/lib/modules/coupon/services/referral-reward-coupon.service.js.map +1 -1
  25. package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts +50 -0
  26. package/dist/lib/modules/coupon/transformers/coupon.transformer.d.ts.map +1 -1
  27. package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts +828 -6
  28. package/dist/lib/modules/coupon/validations/all-coupons.validation.d.ts.map +1 -1
  29. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +30 -30
  30. package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts +98 -0
  31. package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
  32. package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.d.ts +374 -0
  33. package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.d.ts.map +1 -1
  34. package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.js +2 -0
  35. package/dist/lib/modules/coupon/validations/referral-reward-coupon.validation.js.map +1 -1
  36. package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts +9 -9
  37. package/dist/lib/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
  38. package/dist/lib/modules/deal-setting/validations/deal-setting.validation.d.ts +6 -6
  39. package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts +8 -8
  40. package/dist/lib/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
  41. package/dist/lib/modules/featured-setting/validations/featured-setting.validation.d.ts +6 -6
  42. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts +7 -7
  43. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
  44. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js +2 -0
  45. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js.map +1 -1
  46. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -1
  47. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js +4 -1
  48. package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js.map +1 -1
  49. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +36 -36
  50. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
  51. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js +7 -2
  52. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js.map +1 -1
  53. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +1 -0
  54. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -1
  55. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js +13 -2
  56. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js.map +1 -1
  57. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
  58. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js +7 -2
  59. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js.map +1 -1
  60. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts +6 -6
  61. package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.d.ts +3 -3
  62. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts +18 -18
  63. package/dist/lib/modules/limited-time-offer/limited-time-offer.service.d.ts.map +1 -1
  64. package/dist/lib/modules/limited-time-offer/limited-time-offer.service.js +3 -0
  65. package/dist/lib/modules/limited-time-offer/limited-time-offer.service.js.map +1 -1
  66. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +7 -7
  67. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
  68. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js +5 -0
  69. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js.map +1 -1
  70. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +1 -0
  71. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +1 -0
  72. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js +2 -0
  73. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js.map +1 -0
  74. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +19 -19
  75. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +1 -0
  76. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
  77. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js +18 -1
  78. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js.map +1 -1
  79. package/dist/lib/modules/marketing/routers/marketing.router.d.ts +14 -3
  80. package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  81. package/dist/lib/modules/marketing/routers/marketing.router.js +4 -0
  82. package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -1
  83. package/dist/lib/modules/marketing/services/marketing.service.d.ts +1 -2
  84. package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
  85. package/dist/lib/modules/marketing/services/marketing.service.js +85 -77
  86. package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
  87. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +3 -1
  88. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  89. package/dist/lib/modules/marketing/services/product-marketing.service.js +13 -10
  90. package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -1
  91. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.d.ts +13 -0
  92. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.d.ts.map +1 -1
  93. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.js +24 -0
  94. package/dist/lib/modules/marketing/services/spend-to-get-progress.service.js.map +1 -1
  95. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  96. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js +27 -95
  97. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js.map +1 -1
  98. package/dist/lib/modules/marketing/validations/all-marketings.validation.d.ts +4 -4
  99. package/dist/lib/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +3 -3
  100. package/dist/lib/modules/marketing/validations/discount-marketing.validation.d.ts +3 -3
  101. package/dist/lib/modules/marketing/validations/marketing.validation.d.ts +8 -0
  102. package/dist/lib/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
  103. package/dist/lib/modules/marketing/validations/marketing.validation.js +4 -1
  104. package/dist/lib/modules/marketing/validations/marketing.validation.js.map +1 -1
  105. package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts +2 -2
  106. package/dist/lib/modules/marketing/validations/punch-marketing.validation.d.ts +4 -4
  107. package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +12 -12
  108. package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
  109. package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +8 -8
  110. package/dist/lib/modules/referral-setting/routers/referral-setting.router.d.ts +4 -4
  111. package/dist/lib/modules/referral-setting/validations/referral-setting.validation.d.ts +6 -6
  112. package/dist/lib/modules/referral-setting/validations/referral-setting.validation.d.ts.map +1 -1
  113. package/dist/lib/modules/referral-setting/validations/referral-setting.validation.js.map +1 -1
  114. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.d.ts +3 -2
  115. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.d.ts.map +1 -1
  116. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.js +11 -3
  117. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.js.map +1 -1
  118. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts +26 -10
  119. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -1
  120. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.d.ts +2 -2
  121. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.d.ts.map +1 -1
  122. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.js.map +1 -1
  123. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.d.ts +25 -6
  124. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.d.ts.map +1 -1
  125. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.js +1 -0
  126. package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.js.map +1 -1
  127. package/dist/lib/modules/tournament/config/config.router.d.ts +4 -4
  128. package/dist/lib/modules/tournament/config/config.validation.d.ts +12 -12
  129. package/dist/lib/modules/tournament/match/match.router.d.ts +5 -5
  130. package/dist/lib/modules/tournament/match/match.validation.d.ts +12 -12
  131. package/dist/lib/modules/tournament/participant/participant.router.d.ts +3 -3
  132. package/dist/lib/modules/tournament/participant/participant.validation.d.ts +24 -24
  133. package/dist/lib/modules/tournament/prediction/prediction.router.d.ts +3 -3
  134. package/dist/lib/modules/tournament/prediction/prediction.validation.d.ts +18 -18
  135. package/dist/lib/modules/tournament/score/score.router.d.ts +1 -1
  136. package/dist/lib/modules/tournament/score/score.validation.d.ts +6 -6
  137. package/dist/lib/modules/tournament/statistics/statistics.router.d.ts +1 -1
  138. package/dist/lib/modules/tournament/statistics/statistics.validation.d.ts +6 -6
  139. package/dist/lib/modules/tournament/team/team.router.d.ts +3 -3
  140. package/dist/lib/modules/tournament/team/team.validation.d.ts +18 -18
  141. package/dist/lib/modules/tournament/tournament.router.d.ts +21 -21
  142. package/dist/lib/modules/tournament/tournament.validation.d.ts +6 -6
  143. package/dist/lib/utility/feature-flags.d.ts +3 -0
  144. package/dist/lib/utility/feature-flags.d.ts.map +1 -0
  145. package/dist/lib/utility/feature-flags.js +16 -0
  146. package/dist/lib/utility/feature-flags.js.map +1 -0
  147. package/dist/types/event/event-initializations.d.ts.map +1 -1
  148. package/dist/types/event/event-listeners/event-listeners.d.ts +0 -1
  149. package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -1
  150. package/dist/types/event/events/marketing-product-seed.event.d.ts +2 -1
  151. package/dist/types/event/events/marketing-product-seed.event.d.ts.map +1 -1
  152. package/dist/types/index.d.ts +21 -12030
  153. package/dist/types/index.d.ts.map +1 -1
  154. package/dist/types/modules/coupon/routers/coupon.router.d.ts +1101 -27
  155. package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  156. package/dist/types/modules/coupon/services/coupon.service.d.ts +1 -1
  157. package/dist/types/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -1
  158. package/dist/types/modules/coupon/services/referral-reward-coupon.service.d.ts.map +1 -1
  159. package/dist/types/modules/coupon/transformers/coupon.transformer.d.ts +50 -0
  160. package/dist/types/modules/coupon/transformers/coupon.transformer.d.ts.map +1 -1
  161. package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts +828 -6
  162. package/dist/types/modules/coupon/validations/all-coupons.validation.d.ts.map +1 -1
  163. package/dist/types/modules/coupon/validations/coupon.validation.d.ts +30 -30
  164. package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts +98 -0
  165. package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
  166. package/dist/types/modules/coupon/validations/referral-reward-coupon.validation.d.ts +374 -0
  167. package/dist/types/modules/coupon/validations/referral-reward-coupon.validation.d.ts.map +1 -1
  168. package/dist/types/modules/deal-setting/routers/deal-setting.router.d.ts +9 -9
  169. package/dist/types/modules/deal-setting/routers/deal-setting.router.d.ts.map +1 -1
  170. package/dist/types/modules/deal-setting/validations/deal-setting.validation.d.ts +6 -6
  171. package/dist/types/modules/featured-setting/routers/featured-setting.router.d.ts +8 -8
  172. package/dist/types/modules/featured-setting/routers/featured-setting.router.d.ts.map +1 -1
  173. package/dist/types/modules/featured-setting/validations/featured-setting.validation.d.ts +6 -6
  174. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts +7 -7
  175. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
  176. package/dist/types/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -1
  177. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +36 -36
  178. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
  179. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +1 -0
  180. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -1
  181. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
  182. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.validation.d.ts +6 -6
  183. package/dist/types/modules/limited-time-offer/config/limited-time-offer.router.d.ts +3 -3
  184. package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts +18 -18
  185. package/dist/types/modules/limited-time-offer/limited-time-offer.service.d.ts.map +1 -1
  186. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +7 -7
  187. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
  188. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +19 -19
  189. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +1 -0
  190. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
  191. package/dist/types/modules/marketing/routers/marketing.router.d.ts +14 -3
  192. package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  193. package/dist/types/modules/marketing/services/marketing.service.d.ts +1 -2
  194. package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
  195. package/dist/types/modules/marketing/services/product-marketing.service.d.ts +3 -1
  196. package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  197. package/dist/types/modules/marketing/services/spend-to-get-progress.service.d.ts +18 -0
  198. package/dist/types/modules/marketing/services/spend-to-get-progress.service.d.ts.map +1 -1
  199. package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  200. package/dist/types/modules/marketing/validations/all-marketings.validation.d.ts +4 -4
  201. package/dist/types/modules/marketing/validations/buy1-get1-marketing.validation.d.ts +3 -3
  202. package/dist/types/modules/marketing/validations/discount-marketing.validation.d.ts +3 -3
  203. package/dist/types/modules/marketing/validations/marketing.validation.d.ts +8 -0
  204. package/dist/types/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
  205. package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts +2 -2
  206. package/dist/types/modules/marketing/validations/punch-marketing.validation.d.ts +4 -4
  207. package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +12 -12
  208. package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts.map +1 -1
  209. package/dist/types/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +8 -8
  210. package/dist/types/modules/referral-setting/routers/referral-setting.router.d.ts +4 -4
  211. package/dist/types/modules/referral-setting/validations/referral-setting.validation.d.ts +6 -6
  212. package/dist/types/modules/referral-setting/validations/referral-setting.validation.d.ts.map +1 -1
  213. package/dist/types/modules/spend-to-get-history/spend-to-get-history.repository.d.ts +3 -2
  214. package/dist/types/modules/spend-to-get-history/spend-to-get-history.repository.d.ts.map +1 -1
  215. package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts +26 -10
  216. package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -1
  217. package/dist/types/modules/spend-to-get-history/spend-to-get-history.service.d.ts +2 -2
  218. package/dist/types/modules/spend-to-get-history/spend-to-get-history.service.d.ts.map +1 -1
  219. package/dist/types/modules/spend-to-get-history/spend-to-get-history.validation.d.ts +25 -6
  220. package/dist/types/modules/spend-to-get-history/spend-to-get-history.validation.d.ts.map +1 -1
  221. package/dist/types/modules/tournament/config/config.router.d.ts +4 -4
  222. package/dist/types/modules/tournament/config/config.validation.d.ts +12 -12
  223. package/dist/types/modules/tournament/match/match.router.d.ts +5 -5
  224. package/dist/types/modules/tournament/match/match.validation.d.ts +12 -12
  225. package/dist/types/modules/tournament/participant/participant.router.d.ts +3 -3
  226. package/dist/types/modules/tournament/participant/participant.validation.d.ts +24 -24
  227. package/dist/types/modules/tournament/prediction/prediction.router.d.ts +3 -3
  228. package/dist/types/modules/tournament/prediction/prediction.validation.d.ts +18 -18
  229. package/dist/types/modules/tournament/score/score.router.d.ts +1 -1
  230. package/dist/types/modules/tournament/score/score.validation.d.ts +6 -6
  231. package/dist/types/modules/tournament/statistics/statistics.router.d.ts +1 -1
  232. package/dist/types/modules/tournament/statistics/statistics.validation.d.ts +6 -6
  233. package/dist/types/modules/tournament/team/team.router.d.ts +3 -3
  234. package/dist/types/modules/tournament/team/team.validation.d.ts +18 -18
  235. package/dist/types/modules/tournament/tournament.router.d.ts +21 -21
  236. package/dist/types/modules/tournament/tournament.validation.d.ts +6 -6
  237. package/dist/types/utility/feature-flags.d.ts +12 -0
  238. package/dist/types/utility/feature-flags.d.ts.map +1 -0
  239. package/package.json +2 -2
  240. package/dist/lib/modules/spend-to-get-history/routers/index.d.ts +0 -2
  241. package/dist/lib/modules/spend-to-get-history/routers/index.d.ts.map +0 -1
  242. package/dist/lib/modules/spend-to-get-history/routers/index.js +0 -18
  243. package/dist/lib/modules/spend-to-get-history/routers/index.js.map +0 -1
  244. package/dist/lib/modules/spend-to-get-history/routers/spend-to-get-history.router.js +0 -62
  245. package/dist/lib/modules/spend-to-get-history/routers/spend-to-get-history.router.js.map +0 -1
  246. package/dist/lib/modules/spend-to-get-history/services/index.d.ts +0 -2
  247. package/dist/lib/modules/spend-to-get-history/services/index.d.ts.map +0 -1
  248. package/dist/lib/modules/spend-to-get-history/services/index.js +0 -18
  249. package/dist/lib/modules/spend-to-get-history/services/index.js.map +0 -1
  250. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts +0 -24
  251. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts.map +0 -1
  252. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.js +0 -136
  253. package/dist/lib/modules/spend-to-get-history/services/spend-to-get-history.service.js.map +0 -1
  254. package/dist/lib/modules/spend-to-get-history/validations/index.d.ts +0 -2
  255. package/dist/lib/modules/spend-to-get-history/validations/index.d.ts.map +0 -1
  256. package/dist/lib/modules/spend-to-get-history/validations/index.js +0 -18
  257. package/dist/lib/modules/spend-to-get-history/validations/index.js.map +0 -1
  258. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts +0 -232
  259. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts.map +0 -1
  260. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.js +0 -30
  261. package/dist/lib/modules/spend-to-get-history/validations/spend-to-get-history.validation.js.map +0 -1
  262. package/dist/lib/modules/tournament/match/events/match-ended.consumer.d.ts +0 -2
  263. package/dist/lib/modules/tournament/match/events/match-ended.consumer.d.ts.map +0 -1
  264. package/dist/lib/modules/tournament/match/events/match-ended.consumer.js +0 -15
  265. package/dist/lib/modules/tournament/match/events/match-ended.consumer.js.map +0 -1
  266. package/dist/lib/modules/tournament/match/events/match-ended.event.d.ts +0 -14
  267. package/dist/lib/modules/tournament/match/events/match-ended.event.d.ts.map +0 -1
  268. package/dist/lib/modules/tournament/match/events/match-ended.event.js +0 -12
  269. package/dist/lib/modules/tournament/match/events/match-ended.event.js.map +0 -1
  270. package/dist/lib/modules/tournament/notification/jobs/notification.producer.d.ts +0 -10
  271. package/dist/lib/modules/tournament/notification/jobs/notification.producer.d.ts.map +0 -1
  272. package/dist/lib/modules/tournament/notification/jobs/notification.producer.js +0 -23
  273. package/dist/lib/modules/tournament/notification/jobs/notification.producer.js.map +0 -1
  274. package/dist/lib/modules/tournament/notification/jobs/notification.worker.d.ts +0 -9
  275. package/dist/lib/modules/tournament/notification/jobs/notification.worker.d.ts.map +0 -1
  276. package/dist/lib/modules/tournament/notification/jobs/notification.worker.js +0 -82
  277. package/dist/lib/modules/tournament/notification/jobs/notification.worker.js.map +0 -1
  278. package/dist/lib/modules/tournament/notification/notification.schedule.config.d.ts +0 -10
  279. package/dist/lib/modules/tournament/notification/notification.schedule.config.d.ts.map +0 -1
  280. package/dist/lib/modules/tournament/notification/notification.schedule.config.js +0 -15
  281. package/dist/lib/modules/tournament/notification/notification.schedule.config.js.map +0 -1
  282. package/dist/lib/modules/tournament/notification/notification.scheduler.service.d.ts +0 -10
  283. package/dist/lib/modules/tournament/notification/notification.scheduler.service.d.ts.map +0 -1
  284. package/dist/lib/modules/tournament/notification/notification.scheduler.service.js +0 -73
  285. package/dist/lib/modules/tournament/notification/notification.scheduler.service.js.map +0 -1
  286. package/dist/types/events/event-initializations.d.ts +0 -2
  287. package/dist/types/events/event-initializations.d.ts.map +0 -1
  288. package/dist/types/modules/spend-to-get-history/routers/index.d.ts +0 -2
  289. package/dist/types/modules/spend-to-get-history/routers/index.d.ts.map +0 -1
  290. package/dist/types/modules/spend-to-get-history/services/index.d.ts +0 -2
  291. package/dist/types/modules/spend-to-get-history/services/index.d.ts.map +0 -1
  292. package/dist/types/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts +0 -56
  293. package/dist/types/modules/spend-to-get-history/services/spend-to-get-history.service.d.ts.map +0 -1
  294. package/dist/types/modules/spend-to-get-history/validations/index.d.ts +0 -2
  295. package/dist/types/modules/spend-to-get-history/validations/index.d.ts.map +0 -1
  296. package/dist/types/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts +0 -241
  297. package/dist/types/modules/spend-to-get-history/validations/spend-to-get-history.validation.d.ts.map +0 -1
  298. package/dist/types/modules/tournament/config/tournament-config.validation.d.ts +0 -201
  299. package/dist/types/modules/tournament/config/tournament-config.validation.d.ts.map +0 -1
  300. package/dist/types/modules/tournament/match/events/match-ended.consumer.d.ts +0 -2
  301. package/dist/types/modules/tournament/match/events/match-ended.consumer.d.ts.map +0 -1
  302. package/dist/types/modules/tournament/match/events/match-ended.event.d.ts +0 -14
  303. package/dist/types/modules/tournament/match/events/match-ended.event.d.ts.map +0 -1
  304. package/dist/types/modules/tournament/notification/jobs/notification.producer.d.ts +0 -10
  305. package/dist/types/modules/tournament/notification/jobs/notification.producer.d.ts.map +0 -1
  306. package/dist/types/modules/tournament/notification/jobs/notification.worker.d.ts +0 -9
  307. package/dist/types/modules/tournament/notification/jobs/notification.worker.d.ts.map +0 -1
  308. package/dist/types/modules/tournament/notification/notification.schedule.config.d.ts +0 -10
  309. package/dist/types/modules/tournament/notification/notification.schedule.config.d.ts.map +0 -1
  310. package/dist/types/modules/tournament/notification/notification.scheduler.service.d.ts +0 -10
  311. package/dist/types/modules/tournament/notification/notification.scheduler.service.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport {\n\tBuy1Get1Marketing,\n\tDiscountMarketing,\n\tLimitedTimeOfferParticipant,\n\tLimitedTimeOfferParticipantModel,\n\tLineItem,\n\tMarketing,\n\tMarketingModel,\n\tMarketing as Model,\n\tProductModel,\n\tProductMarketingModel,\n\tRegularOrder,\n\tRegularOrderModel,\n\tShop,\n\tShopModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tAllMarketingsDTO,\n\tAllMarketingsValidationDTO,\n\tCreateProductMarketingDTO,\n\tProductEntireMenuMarketingHandlerDTO,\n\tUpdateMarketingDTO as UpdateDTO,\n} from '@modules/marketing/validations';\nimport {\n\tFilterDTO,\n\tPaginatedResponse,\n\tDeleteDTO,\n\tGetByIdInputDTO,\n} from '@lyxa.ai/core/dist/utilities/validation';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { createRawDocumentPaginatorObject, PaginatorOptions } from '@lyxa.ai/core/dist/utilities/pagination';\nimport { ModelType } from '@typegoose/typegoose/lib/types';\nimport {\n\tfilterRelevantChanges,\n\tgetChangedFields,\n\tpublishSyncSingleShopSectionsInCacheProcessEvent,\n} from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport { AdminActivityLogsEvent } from '@lyxa.ai/core/dist/libraries/event/events/admin-logs-event';\nimport {\n\tAdminLogsUpdatedFieldsType, MarketingCampaignType,\n\tMarketingStatus,\n\tRegularOrderStatus,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { publishEvent } from '@lyxa.ai/core/dist/libraries/event';\nimport { BaseEvent } from '@lyxa.ai/core/dist/libraries/event/BaseEvent';\nimport {\n\tMarketingEntireMenuSeedEvent,\n\tMarketingProductSeedPayload,\n} from '@events/events/marketing-product-seed.event';\nimport { MarketingProductSyncEvent } from '@events/events/marketing-product-sync.event';\nimport {\n\tbuy1Get1MarketingService,\n\tdiscountMarketingService,\n\tfeaturedMarketingService,\n\tfreeDeliveryMarketingService,\n\tproductMarketingService,\n\tpunchMarketingService,\n\tspendToGetMarketingService,\n\tsynchronizeProductMarketingService,\n\tmarketingConflictService,\n\tCONFLICT_CHECK_MARKETING_TYPES,\n} from '.';\nimport { MarketingType } from '@lyxa.ai/core/dist/utilities/enum';\nimport {\n\tconflictError,\n\tforbiddenError,\n\tinternalServerError,\n\tnotFoundError,\n\tunauthorizedError,\n} from '@lyxa.ai/core/dist/utilities/error-common';\nimport { ChangeStreamOperationTypes } from '@lyxa.ai/core/dist/libraries/event/events/mongo-stream-changes-batch-process-shops-event';\nimport {\n\tMarketingMetricsRepository,\n\tmarketingMetricsRepository,\n} from '../patterns/repository/MarketingMetricsRepository';\nimport { scheduleMarketingProductSync } from '../queues/marketing-product-sync.queue';\nimport { ltoParticipantService } from '@modules/limited-time-offer/participant/services/limited-time-offer-participant.service';\n\n@Service()\nexport class MarketingService {\n\tprivate model: typeof MarketingModel & SoftDeleteModel<Model>;\n\tprivate shopModel: typeof ShopModel & SoftDeleteModel<Shop>;\n\tprivate orderModel: typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\tprivate marketingMetricsRepository: MarketingMetricsRepository;\n\tprivate limitedTimeOfferParticipantModel: typeof LimitedTimeOfferParticipantModel &\n\t\tSoftDeleteModel<LimitedTimeOfferParticipant>;\n\n\tconstructor() {\n\t\tthis.model = MarketingModel as typeof MarketingModel & SoftDeleteModel<Model>;\n\t\tthis.shopModel = ShopModel as typeof ShopModel & SoftDeleteModel<Shop>;\n\t\tthis.orderModel = RegularOrderModel as typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\t\tthis.marketingMetricsRepository = marketingMetricsRepository;\n\t\tthis.limitedTimeOfferParticipantModel =\n\t\t\tLimitedTimeOfferParticipantModel as typeof LimitedTimeOfferParticipantModel &\n\t\t\t\tSoftDeleteModel<LimitedTimeOfferParticipant>;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(\n\t\tdata: AllMarketingsValidationDTO,\n\t\tadmin?: mongoose.Types.ObjectId,\n\t\toptions?: { skipLimitedTimeOfferGuard?: boolean }\n\t): Promise<DocumentType<Model>> {\n\t\tconst now = dayjs().toDate();\n\n\t\tif (\n\t\t\t!options?.skipLimitedTimeOfferGuard &&\n\t\t\tdata.marketingType === MarketingType.DISCOUNT &&\n\t\t\t(await ltoParticipantService.isActiveParticipant(data.shop))\n\t\t) {\n\t\t\tforbiddenError(\n\t\t\t\t'You are currently participating in a Limited Time Offer. Please manage your discount from the Limited Time Offer section or withdraw first.'\n\t\t\t);\n\t\t}\n\n\t\tconst existingRecord = await this.model.findOne({\n\t\t\tshop: data.shop,\n\t\t\tmarketingType: data.marketingType,\n\t\t\t'duration.end': { $gt: now },\n\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\tisAppliedByCompany: data.isAppliedByCompany,\n\t\t\tcampaignType: data.campaignType,\n\t\t\tadmin: admin ? { $ne: null } : null,\n\t\t});\n\n\t\tif (existingRecord) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'CONFLICT',\n\t\t\t\tmessage: `This shop already has a ${data.marketingType} marketing`,\n\t\t\t});\n\t\t}\n\n\t\tif (CONFLICT_CHECK_MARKETING_TYPES.includes(data.marketingType)) {\n\t\t\tawait marketingConflictService.assertNoConflict({\n\t\t\t\tshop: data.shop,\n\t\t\t\tmarketingType: data.marketingType,\n\t\t\t\tduration: data.duration,\n\t\t\t\trewardTypeGroups: marketingConflictService.getRewardTypeGroups(data.marketingType, data.tiers),\n\t\t\t});\n\t\t}\n\n\t\tif (data.isEntireMenu) {\n\t\t\tconst existingMarketing = await this.model.findOne({\n\t\t\t\tshop: data.shop,\n\t\t\t\t'duration.start': { $lt: now },\n\t\t\t\t'duration.end': { $gt: now },\n\t\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\t\tmarketingType: { $in: [MarketingType.BUY1GET1, MarketingType.DISCOUNT], $ne: data.marketingType },\n\t\t\t});\n\n\t\t\tif (existingMarketing) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'CONFLICT',\n\t\t\t\t\tmessage: `Cannot create marketing for entire menu while another product based marketing exists for the shop`,\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (data.products && data.products.length > 0) {\n\t\t\tconst productIds = data.products.map((product: CreateProductMarketingDTO) => product.product);\n\n\t\t\tconst hasDuplicates = new Set(productIds.map(String)).size !== productIds.length;\n\n\t\t\tif (hasDuplicates) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\t\tmessage: `Product list contains duplicate products`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.campaignType === MarketingCampaignType.LIMITED_TIME_OFFER) {\n\t\t\t\tawait productMarketingService.pauseConflictingMarketings(productIds);\n\t\t\t} else {\n\t\t\t\tconst isAvailable = await productMarketingService.checkProductMarketingAvailability(\n\t\t\t\t\tproductIds,\n\t\t\t\t\tdata.isAppliedByCompany\n\t\t\t\t);\n\n\t\t\t\tif (!isAvailable) {\n\t\t\t\t\tthrow new TRPCError({\n\t\t\t\t\t\tcode: 'CONFLICT',\n\t\t\t\t\t\tmessage: `Product list contains products which already have marketing applied`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (admin) {\n\t\t\tdata.admin = admin;\n\t\t}\n\n\t\tlet marketing: AllMarketingsDTO;\n\n\t\tswitch (data.marketingType) {\n\t\t\tcase MarketingType.DISCOUNT: {\n\t\t\t\tmarketing = await discountMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.BUY1GET1: {\n\t\t\t\tmarketing = await buy1Get1MarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FEATURED: {\n\t\t\t\tif (!admin) {\n\t\t\t\t\tthrow new TRPCError({\n\t\t\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\t\t\tmessage: `Only admin is allowed to create ${data.marketingType} marketing`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tmarketing = await featuredMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FREE_DELIVERY: {\n\t\t\t\tmarketing = await freeDeliveryMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.PUNCH_MARKETING: {\n\t\t\t\tmarketing = await punchMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.SPEND_TO_GET: {\n\t\t\t\tmarketing = await spendToGetMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tmarketing = await this.model.create(data, admin);\n\t\t\t}\n\t\t}\n\n\t\tawait this.assignMarketingToProducts(marketing);\n\n\t\tawait this.model.populate(marketing, {\n\t\t\tpath: 'shop',\n\t\t\tmodel: this.shopModel,\n\t\t\tselect: '_id name shopId',\n\t\t});\n\n\t\tif (admin) {\n\t\t\tthis.logMarketingAdminAction(\n\t\t\t\tadmin,\n\t\t\t\tAdminLogsUpdatedFieldsType.ACTIVATED_MARKETING_PROMOTIONS,\n\t\t\t\t'',\n\t\t\t\tmarketing\n\t\t\t);\n\t\t}\n\t\tif (marketing && !data.isEntireMenu)\n\t\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\t\tshopId: data.shop,\n\t\t\t\toperation: ChangeStreamOperationTypes.UPDATE,\n\t\t\t});\n\t\treturn marketing;\n\t}\n\n\t/**\n\t * Get record by ID\n\t * @param id ID of the record\n\t */\n\tpublic async findById(data: GetByIdInputDTO): Promise<DocumentType<Model>> {\n\t\tconst select = data.select || '';\n\t\tconst populate = data.populate || [];\n\t\tconst result = await this.model\n\t\t\t.findOne({\n\t\t\t\t_id: data._id,\n\t\t\t})\n\t\t\t.select(select)\n\t\t\t.populate(populate);\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get records\n\t * @param query Query to find records\n\t */\n\tpublic async find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>> {\n\t\ttry {\n\t\t\tconst paginate = createRawDocumentPaginatorObject(this.model as ReturnModelType<typeof this.model>);\n\t\t\tconst options: PaginatorOptions<typeof Model> = {\n\t\t\t\tpage: data?.page,\n\t\t\t\tsize: data?.size,\n\t\t\t\tsort: data?.sort,\n\t\t\t\tquery: data?.query,\n\t\t\t\tselect: data?.select,\n\t\t\t\tpopulate: data?.populate,\n\t\t\t};\n\t\t\tconst paginatedResult = await paginate(options);\n\t\t\treturn paginatedResult;\n\t\t} catch (err) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `err: ${err}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(\n\t\t_id: mongoose.Types.ObjectId,\n\t\tdata: UpdateDTO,\n\t\tadmin?: mongoose.Types.ObjectId\n\t): Promise<DocumentType<Model>> {\n\t\tlet marketing: AllMarketingsDTO;\n\n\t\tconst partOfLimitedTimeOffer = await this.limitedTimeOfferParticipantModel.exists({\n\t\t\tmarketing: _id,\n\t\t});\n\n\t\tif (partOfLimitedTimeOffer) {\n\t\t\tforbiddenError(\n\t\t\t\t'You are currently participating in a Limited Time Offer. Please make your edits from the Limited Time Offer section.'\n\t\t\t);\n\t\t}\n\n\t\tconst oldMarketing = await this.model.findById(_id).populate({\n\t\t\tpath: 'shop',\n\t\t\tselect: '_id name shopId',\n\t\t});\n\n\t\tif (!oldMarketing) {\n\t\t\tnotFoundError('Could not find marketing');\n\t\t}\n\n\t\tif (\n\t\t\tdata.status &&\n\t\t\tdata.status === MarketingStatus.ACTIVE &&\n\t\t\toldMarketing.status === MarketingStatus.PAUSED\n\t\t) {\n\t\t\tif (\n\t\t\t\toldMarketing.marketingType === MarketingType.DISCOUNT &&\n\t\t\t\t(await ltoParticipantService.isActiveParticipant(oldMarketing.shop._id))\n\t\t\t) {\n\t\t\t\tforbiddenError(\n\t\t\t\t\t'You are currently participating in a Limited Time Offer. Please manage your discount from the Limited Time Offer section or withdraw first.'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.verifyUnpauseConditions(_id);\n\t\t}\n\n\t\tswitch (oldMarketing.marketingType) {\n\t\t\tcase MarketingType.DISCOUNT: {\n\t\t\t\tmarketing = await discountMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.BUY1GET1: {\n\t\t\t\tmarketing = await buy1Get1MarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FEATURED: {\n\t\t\t\tif (!admin) {\n\t\t\t\t\tunauthorizedError(`Only admin is allowed to update ${data.marketingType} marketing`);\n\t\t\t\t}\n\t\t\t\tmarketing = await featuredMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FREE_DELIVERY: {\n\t\t\t\tmarketing = await freeDeliveryMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.PUNCH_MARKETING: {\n\t\t\t\tmarketing = await punchMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.SPEND_TO_GET: {\n\t\t\t\tmarketing = await spendToGetMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tmarketing = await this.model\n\t\t\t\t\t.findOneAndUpdate(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_id: _id,\n\t\t\t\t\t\t\tdeletedAt: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnew: true,\n\t\t\t\t\t\t\trunValidators: true,\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t\t.populate({\n\t\t\t\t\t\tpath: 'shop',\n\t\t\t\t\t\tselect: '_id name shopId',\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (!marketing) {\n\t\t\tinternalServerError('Could not update marketing');\n\t\t}\n\n\t\tif (admin) {\n\t\t\tconst allChanges = getChangedFields(oldMarketing, marketing);\n\t\t\tconst relevantChanges = filterRelevantChanges(allChanges, data);\n\n\t\t\tif (Object.keys(relevantChanges).includes('status')) {\n\t\t\t\tif (data.status == MarketingStatus.ACTIVE) {\n\t\t\t\t\tthis.logMarketingAdminAction(\n\t\t\t\t\t\tadmin,\n\t\t\t\t\t\tAdminLogsUpdatedFieldsType.CONTINUED_MARKETING_PROMOTIONS,\n\t\t\t\t\t\toldMarketing,\n\t\t\t\t\t\tmarketing\n\t\t\t\t\t);\n\t\t\t\t} else if (data.status == MarketingStatus.PAUSED) {\n\t\t\t\t\tthis.logMarketingAdminAction(\n\t\t\t\t\t\tadmin,\n\t\t\t\t\t\tAdminLogsUpdatedFieldsType.PAUSED_MARKETING_PROMOTIONS,\n\t\t\t\t\t\toldMarketing,\n\t\t\t\t\t\tmarketing\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.logMarketingAdminAction(\n\t\t\t\tadmin,\n\t\t\t\tAdminLogsUpdatedFieldsType.EDITED_MARKETING_PROMOTIONS,\n\t\t\t\toldMarketing,\n\t\t\t\tmarketing\n\t\t\t);\n\t\t}\n\n\t\tawait this.assignMarketingToProducts(marketing);\n\n\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\tshopId: marketing.shop,\n\t\t\toperation: ChangeStreamOperationTypes.UPDATE,\n\t\t});\n\n\t\treturn marketing;\n\t}\n\n\tprivate async verifyUnpauseConditions(marketingId: mongoose.Types.ObjectId): Promise<void> {\n\t\tconst marketing = await this.model.findOne({ _id: marketingId, deletedAt: null }).populate('products');\n\t\tif (!marketing) return;\n\n\t\tconst hasActiveLto = await this.model.exists({\n\t\t\tshop: marketing.shop,\n\t\t\tcampaignType: MarketingCampaignType.LIMITED_TIME_OFFER,\n\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\tdeletedAt: null,\n\t\t});\n\t\tif (hasActiveLto) {\n\t\t\tconflictError(\"Can't resume this discount while a limited time offer is active\");\n\t\t}\n\n\t\tif ([MarketingType.BUY1GET1, MarketingType.DISCOUNT].includes(marketing.marketingType)) {\n\t\t\tconst typedMarketing = marketing as DocumentType<DiscountMarketing | Buy1Get1Marketing>;\n\t\t\tconst productIds = typedMarketing.products.map((product: any) => product.product);\n\t\t\tconst isAvailable = await productMarketingService.checkProductMarketingAvailability(\n\t\t\t\tproductIds,\n\t\t\t\tmarketing.isAppliedByCompany\n\t\t\t);\n\n\t\t\tif (!isAvailable) {\n\t\t\t\tconflictError(\"You can't activate discount and B1G1 on the same items at the same time\");\n\t\t\t}\n\t\t}\n\n\t\tif (CONFLICT_CHECK_MARKETING_TYPES.includes(marketing.marketingType)) {\n\t\t\tawait marketingConflictService.assertNoConflict({\n\t\t\t\tshop: marketing.shop as mongoose.Types.ObjectId,\n\t\t\t\tmarketingType: marketing.marketingType,\n\t\t\t\tduration: marketing.duration,\n\t\t\t\trewardTypeGroups: marketingConflictService.getRewardTypeGroups(\n\t\t\t\t\tmarketing.marketingType,\n\t\t\t\t\t(marketing as any).tiers\n\t\t\t\t),\n\t\t\t\texcludeMarketingId: marketingId,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async logMarketingAdminAction(\n\t\tadmin: mongoose.Types.ObjectId,\n\t\tactionType: AdminLogsUpdatedFieldsType,\n\t\toldDocument?: any,\n\t\tnewDocument?: any\n\t) {\n\t\tconst adminActivityLogsEvent: BaseEvent<Record<string, unknown>> = new AdminActivityLogsEvent({\n\t\t\tadmin,\n\t\t\tupdatedField: actionType,\n\t\t\toldDocument: oldDocument ?? '',\n\t\t\tnewDocument: newDocument ?? '',\n\t\t});\n\t\tawait publishEvent(adminActivityLogsEvent);\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteById(\n\t\tdata: DeleteDTO,\n\t\tadmin?: mongoose.Types.ObjectId,\n\t\toptions?: { skipLimitedTimeOfferGuard?: boolean }\n\t): Promise<string> {\n\t\tconst { _id, softDelete } = data;\n\n\t\tif (!options?.skipLimitedTimeOfferGuard) {\n\t\t\tconst partOfLimitedTimeOffer = await this.limitedTimeOfferParticipantModel.exists({\n\t\t\t\tmarketing: _id,\n\t\t\t});\n\n\t\t\tif (partOfLimitedTimeOffer) {\n\t\t\t\tforbiddenError(\n\t\t\t\t\t'You are currently participating in a Limited Time Offer. Please make your edits from the Limited Time Offer section.'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst record = await this.model.findById(_id).populate({\n\t\t\tpath: 'shop',\n\t\t\tselect: '_id name shopId',\n\t\t});\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\n\t\trecord.status = MarketingStatus.DELETED;\n\t\tawait record.save();\n\n\t\tconst result = await this.model.deleteRecord({ _id, deletedAt: null }, softDelete);\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Unable to delete marketing',\n\t\t\t});\n\t\t}\n\n\t\tif (admin) {\n\t\t\tthis.logMarketingAdminAction(admin, AdminLogsUpdatedFieldsType.DELETED_MARKETING_PROMOTIONS, record);\n\t\t}\n\n\t\tproductMarketingService.deleteMany({ marketing: data._id }, data.softDelete);\n\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\tshopId: record.shop._id,\n\t\t\toperation: ChangeStreamOperationTypes.DELETE,\n\t\t});\n\t\treturn 'Record deleted successfully';\n\t}\n\n\tpublic async deleteManyByIds(marketingIds: mongoose.Types.ObjectId[], softDelete = true): Promise<void> {\n\t\tif (marketingIds.length === 0) return;\n\n\t\tconst marketings = await this.model\n\t\t\t.find({ _id: { $in: marketingIds } })\n\t\t\t.select('shop')\n\t\t\t.lean();\n\n\t\tawait this.model.updateMany(\n\t\t\t{ _id: { $in: marketingIds } },\n\t\t\t{ $set: { status: MarketingStatus.DELETED } }\n\t\t);\n\t\tawait this.model.deleteRecords({ _id: { $in: marketingIds } }, softDelete);\n\n\t\tawait productMarketingService.deleteManyByMarketingIds(marketingIds, softDelete);\n\n\t\tconst uniqueShopIds = [\n\t\t\t...new Map(\n\t\t\t\tmarketings\n\t\t\t\t\t.map((m: any) => m.shop)\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s: any) => {\n\t\t\t\t\t\tconst id = s instanceof mongoose.Types.ObjectId ? s : new mongoose.Types.ObjectId(s);\n\t\t\t\t\t\treturn [id.toString(), id] as [string, mongoose.Types.ObjectId];\n\t\t\t\t\t})\n\t\t\t).values(),\n\t\t];\n\n\t\tfor (const shopId of uniqueShopIds) {\n\t\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\t\tshopId,\n\t\t\t\toperation: ChangeStreamOperationTypes.DELETE,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic async handleNewProductForEntireMenuMarketing(data: ProductEntireMenuMarketingHandlerDTO) {\n\t\tconst existingMarketing = await this.model.findOne({\n\t\t\tshop: data.shop,\n\t\t\tmarketingType: { $in: [MarketingType.BUY1GET1, MarketingType.DISCOUNT] },\n\t\t\t'duration.end': { $gt: new Date() },\n\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\tisEntireMenu: true,\n\t\t});\n\n\t\t// check if existing marketing\n\t\tif (existingMarketing) {\n\t\t\tconst productMarketingData: CreateProductMarketingDTO = {\n\t\t\t\tproduct: data.product,\n\t\t\t\tmarketing: existingMarketing._id,\n\t\t\t};\n\t\t\tif (existingMarketing.marketingType == MarketingType.BUY1GET1) {\n\t\t\t\tproductMarketingData.isBuy1Get1 = true;\n\t\t\t}\n\t\t\tif (existingMarketing.marketingType == MarketingType.DISCOUNT) {\n\t\t\t\tproductMarketingData.value = (existingMarketing as DocumentType<DiscountMarketing>).value;\n\t\t\t\tproductMarketingData.valueType = (existingMarketing as DocumentType<DiscountMarketing>).valueType;\n\t\t\t}\n\n\t\t\tawait productMarketingService.create(productMarketingData);\n\t\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByProductId(data.product);\n\t\t}\n\n\t\treturn 'Product handled successfully';\n\t}\n\n\tpublic async incrementMarketingSpentFromOrder(orderId: mongoose.Types.ObjectId): Promise<any> {\n\t\tconst order = (await this.orderModel\n\t\t\t.findById(orderId)\n\t\t\t.populate([\n\t\t\t\t{ path: 'lineItems' },\n\t\t\t\t{ path: 'marketings', select: 'isAppliedByCompany' },\n\t\t\t])) as DocumentType<RegularOrder> & {\n\t\t\tlineItems: DocumentType<LineItem>[];\n\t\t\tmarketings: DocumentType<Marketing>[];\n\t\t};\n\n\t\tif (!order || !order.marketings?.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst marketingSpendMap = this.marketingMetricsRepository.calculateMarketingSpendPerOrder(order);\n\n\t\tconst bulkOps = [...marketingSpendMap.entries()].map(([marketingId, amountSpent]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { _id: marketingId },\n\t\t\t\tupdate: { $inc: { amountSpent } },\n\t\t\t},\n\t\t}));\n\n\t\tif (bulkOps.length) {\n\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t}\n\n\t\tawait this.expireMarketingsExceedingSpendLimits(Array.from(marketingSpendMap.keys()));\n\n\t\treturn 'Marketing amount spent incremented successfully';\n\t}\n\n\tpublic async decrementMarketingSpentFromOrder(orderId: mongoose.Types.ObjectId): Promise<any> {\n\t\tconst order = (await this.orderModel\n\t\t\t.findById(orderId)\n\t\t\t.populate([\n\t\t\t\t{ path: 'lineItems' },\n\t\t\t\t{ path: 'marketings', select: 'isAppliedByCompany' },\n\t\t\t])) as DocumentType<RegularOrder> & {\n\t\t\tlineItems: DocumentType<LineItem>[];\n\t\t\tmarketings: DocumentType<Marketing>[];\n\t\t};\n\n\t\tif (!order || !order.marketings?.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst marketingSpendMap = this.marketingMetricsRepository.calculateMarketingSpendPerOrder(order);\n\n\t\tconst bulkOps = [...marketingSpendMap.entries()].map(([marketingId, amountSpent]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { _id: marketingId },\n\t\t\t\tupdate: { $inc: { amountSpent: -amountSpent } },\n\t\t\t},\n\t\t}));\n\n\t\tif (bulkOps.length) {\n\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t}\n\n\t\tawait this.unExpireMarketingsBelowSpendLimits(Array.from(marketingSpendMap.keys()));\n\n\t\treturn 'Marketing amount spent decremented successfully';\n\t}\n\n\tprivate async expireMarketingsExceedingSpendLimits(marketingIds: mongoose.Types.ObjectId[]) {\n\t\tconst update = await this.model.updateMany(\n\t\t\t{\n\t\t\t\t_id: { $in: marketingIds },\n\t\t\t\tisSpendLimitEnabled: true,\n\t\t\t\tstatus: { $ne: MarketingStatus.EXPIRED },\n\t\t\t\t$expr: { $gte: ['$amountSpent', '$spendLimit'] },\n\t\t\t},\n\t\t\t{ $set: { status: MarketingStatus.EXPIRED, expiredAt: dayjs().toDate() } }\n\t\t);\n\n\t\tif (update.modifiedCount > 0) {\n\t\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(marketingIds);\n\t\t}\n\t}\n\n\tprivate async unExpireMarketingsBelowSpendLimits(marketingIds: mongoose.Types.ObjectId[]) {\n\t\tconst update = await this.model.updateMany(\n\t\t\t{\n\t\t\t\t_id: { $in: marketingIds },\n\t\t\t\tisSpendLimitEnabled: true,\n\t\t\t\tstatus: MarketingStatus.EXPIRED,\n\t\t\t\t$expr: { $lt: ['$amountSpent', '$spendLimit'] },\n\t\t\t},\n\t\t\t{ $set: { status: MarketingStatus.ACTIVE }, $unset: { expiredAt: 1 } }\n\t\t);\n\n\t\tif (update.modifiedCount > 0) {\n\t\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(marketingIds);\n\t\t}\n\t}\n\n\tpublic async recomputeAndSyncAllMarketingSpent(): Promise<void> {\n\t\tconst cursor = this.model\n\t\t\t.find({ marketingType: { $ne: MarketingType.FEATURED } }, { _id: 1 })\n\t\t\t.lean()\n\t\t\t.cursor();\n\n\t\tconst bulkOps: mongoose.AnyBulkWriteOperation[] = [];\n\t\tconst marketingIds: mongoose.Types.ObjectId[] = [];\n\n\t\tfor await (const marketing of cursor) {\n\t\t\tconst { amount } = await this.marketingMetricsRepository.calculateMarketingSpent(marketing._id);\n\n\t\t\tbulkOps.push({\n\t\t\t\tupdateOne: {\n\t\t\t\t\tfilter: { _id: marketing._id },\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\t$set: { amountSpent: amount },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tmarketingIds.push(marketing._id);\n\n\t\t\tif (bulkOps.length >= 500) {\n\t\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t\t\tbulkOps.length = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (bulkOps.length) {\n\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t}\n\n\t\tawait this.expireMarketingsExceedingSpendLimits(marketingIds);\n\t\tawait this.unExpireMarketingsBelowSpendLimits(marketingIds);\n\t}\n\n\tprivate async publishEntireMenuSeedEvents(\n\t\tmarketing: DocumentType<Buy1Get1Marketing | DiscountMarketing>\n\t): Promise<number> {\n\t\tconst PAGE_SIZE = 500;\n\t\tconst marketingId = marketing._id.toString();\n\t\tconst shopId = ((marketing.shop as any)?._id ?? marketing.shop).toString();\n\n\t\tconst products = await ProductModel.find({ shop: marketing.shop }).select('_id').lean();\n\t\tconst productIds = products.map((p: any) => p._id.toString());\n\n\t\tfor (let i = 0; i < productIds.length; i += PAGE_SIZE) {\n\t\t\tawait publishEvent(\n\t\t\t\tnew MarketingEntireMenuSeedEvent({\n\t\t\t\t\tmarketingId,\n\t\t\t\t\tshopId,\n\t\t\t\t\tisAppliedByCompany: marketing.isAppliedByCompany ?? false,\n\t\t\t\t\tisBuy1Get1: marketing.marketingType === MarketingType.BUY1GET1,\n\t\t\t\t\tvalue: (marketing as any).value,\n\t\t\t\t\tvalueType: (marketing as any).valueType,\n\t\t\t\t\tproductIds: productIds.slice(i, i + PAGE_SIZE),\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\n\t\treturn productIds.length;\n\t}\n\n\tpublic async reseedEntireMenuMarketing(marketingId: mongoose.Types.ObjectId): Promise<void> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tconst marketing = await this.model.findOne({ _id: marketingId, deletedAt: null });\n\t\tif (!marketing) internalServerError('Marketing not found');\n\n\t\tconst productCount = await this.publishEntireMenuSeedEvents(\n\t\t\tmarketing as DocumentType<Buy1Get1Marketing | DiscountMarketing>\n\t\t);\n\n\t\tlogger.debug(`entire-menu reseed dispatched — ${productCount} products`, {\n\t\t\ttag: 'marketing.seed.entire-menu',\n\t\t\tdata: { marketingId: marketingId.toString(), productCount },\n\t\t});\n\t}\n\n\tpublic async assignMarketingToProducts(marketing: DocumentType<Buy1Get1Marketing | DiscountMarketing>) {\n\t\tconst diffStartTime = dayjs(marketing.duration.start).diff(dayjs(), 'milliseconds');\n\t\tif (diffStartTime > 0) {\n\t\t\treturn await scheduleMarketingProductSync(marketing._id.toString(), diffStartTime);\n\t\t}\n\n\t\tif (marketing.isEntireMenu) {\n\t\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\t\tconst productCount = await this.publishEntireMenuSeedEvents(marketing);\n\n\t\t\tlogger.debug(`entire-menu marketing seed dispatched — ${productCount} products`, {\n\t\t\t\ttag: 'marketing.seed.entire-menu',\n\t\t\t\tdata: { marketingId: marketing._id.toString(), productCount },\n\t\t\t});\n\t\t} else {\n\t\t\t// Non-entire-menu: the productMarketings were already created synchronously. The product-doc\n\t\t\t// sync is linear in product count (thousands → seconds), so page it into background events\n\t\t\t// instead of blocking the request — same pattern as the entire-menu branch above.\n\t\t\tconst shopId = ((marketing.shop as any)?._id ?? marketing.shop).toString();\n\t\t\tconst pms = await ProductMarketingModel.find({ marketing: marketing._id, deletedAt: null })\n\t\t\t\t.select('product')\n\t\t\t\t.lean();\n\t\t\tconst productIds = pms.map((p: any) => p.product.toString());\n\n\t\t\tconst PAGE_SIZE = 500;\n\t\t\tfor (let i = 0; i < productIds.length; i += PAGE_SIZE) {\n\t\t\t\tawait publishEvent(\n\t\t\t\t\tnew MarketingProductSyncEvent({\n\t\t\t\t\t\tmarketingId: marketing._id.toString(),\n\t\t\t\t\t\tshopId,\n\t\t\t\t\t\tproductIds: productIds.slice(i, i + PAGE_SIZE),\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const marketingService = Container.get(MarketingService);\n"]}
1
+ {"version":3,"file":"marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport {\n\tBuy1Get1Marketing,\n\tDiscountMarketing,\n\tLimitedTimeOfferParticipant,\n\tLimitedTimeOfferParticipantModel,\n\tLineItem,\n\tMarketing,\n\tMarketing as Model,\n\tMarketingModel,\n\tProductModel,\n\tRegularOrder,\n\tRegularOrderModel,\n\tShop,\n\tShopModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tAllMarketingsDTO,\n\tAllMarketingsValidationDTO,\n\tCreateProductMarketingDTO,\n\tProductEntireMenuMarketingHandlerDTO,\n\tUpdateMarketingDTO as UpdateDTO,\n} from '@modules/marketing/validations';\nimport {\n\tDeleteDTO,\n\tFilterDTO,\n\tGetByIdInputDTO,\n\tPaginatedResponse,\n} from '@lyxa.ai/core/dist/utilities/validation';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { createRawDocumentPaginatorObject, PaginatorOptions } from '@lyxa.ai/core/dist/utilities/pagination';\nimport { ModelType } from '@typegoose/typegoose/lib/types';\nimport {\n\tfilterRelevantChanges,\n\tgetChangedFields,\n\tpublishSyncSingleShopSectionsInCacheProcessEvent,\n} from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport { AdminActivityLogsEvent } from '@lyxa.ai/core/dist/libraries/event/events/admin-logs-event';\nimport {\n\tAdminLogsUpdatedFieldsType,\n\tMarketingCampaignType,\n\tMarketingStatus,\n\tMarketingType,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { publishEvent } from '@lyxa.ai/core/dist/libraries/event';\nimport { BaseEvent } from '@lyxa.ai/core/dist/libraries/event/BaseEvent';\nimport { MarketingEntireMenuSeedEvent } from '@events/events/marketing-product-seed.event';\nimport {\n\tbuy1Get1MarketingService,\n\tCONFLICT_CHECK_MARKETING_TYPES,\n\tdiscountMarketingService,\n\tfeaturedMarketingService,\n\tfreeDeliveryMarketingService,\n\tmarketingConflictService,\n\tproductMarketingService,\n\tpunchMarketingService,\n\tspendToGetMarketingService,\n\tsynchronizeProductMarketingService,\n} from '.';\nimport {\n\tconflictError,\n\tforbiddenError,\n\tinternalServerError,\n\tnotFoundError,\n\tunauthorizedError,\n} from '@lyxa.ai/core/dist/utilities/error-common';\nimport { ChangeStreamOperationTypes } from '@lyxa.ai/core/dist/libraries/event/events/mongo-stream-changes-batch-process-shops-event';\nimport {\n\tMarketingMetricsRepository,\n\tmarketingMetricsRepository,\n} from '../patterns/repository/MarketingMetricsRepository';\nimport { scheduleMarketingProductSync } from '../queues/marketing-product-sync.queue';\nimport { ltoParticipantService } from '@modules/limited-time-offer/participant/services/limited-time-offer-participant.service';\nimport { isLtoScheduleEnabled } from '@utility/feature-flags';\n\n@Service()\nexport class MarketingService {\n\tprivate model: typeof MarketingModel & SoftDeleteModel<Model>;\n\tprivate shopModel: typeof ShopModel & SoftDeleteModel<Shop>;\n\tprivate orderModel: typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\tprivate marketingMetricsRepository: MarketingMetricsRepository;\n\tprivate limitedTimeOfferParticipantModel: typeof LimitedTimeOfferParticipantModel &\n\t\tSoftDeleteModel<LimitedTimeOfferParticipant>;\n\n\tconstructor() {\n\t\tthis.model = MarketingModel as typeof MarketingModel & SoftDeleteModel<Model>;\n\t\tthis.shopModel = ShopModel as typeof ShopModel & SoftDeleteModel<Shop>;\n\t\tthis.orderModel = RegularOrderModel as typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\t\tthis.marketingMetricsRepository = marketingMetricsRepository;\n\t\tthis.limitedTimeOfferParticipantModel =\n\t\t\tLimitedTimeOfferParticipantModel as typeof LimitedTimeOfferParticipantModel &\n\t\t\t\tSoftDeleteModel<LimitedTimeOfferParticipant>;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(\n\t\tdata: AllMarketingsValidationDTO,\n\t\tadmin?: mongoose.Types.ObjectId,\n\t\toptions?: { skipLimitedTimeOfferGuard?: boolean }\n\t): Promise<DocumentType<Model>> {\n\t\tconst now = dayjs().toDate();\n\n\t\tconst ltoScheduleEnabled = await isLtoScheduleEnabled();\n\n\t\tif (\n\t\t\tltoScheduleEnabled &&\n\t\t\t!options?.skipLimitedTimeOfferGuard &&\n\t\t\tdata.marketingType === MarketingType.DISCOUNT &&\n\t\t\t(await ltoParticipantService.isActiveParticipant(data.shop))\n\t\t) {\n\t\t\tforbiddenError(\n\t\t\t\t'You are currently participating in a Limited Time Offer. Please manage your discount from the Limited Time Offer section or withdraw first.'\n\t\t\t);\n\t\t}\n\n\t\tconst existingRecordQuery: mongoose.FilterQuery<Model> = {\n\t\t\tshop: data.shop,\n\t\t\tmarketingType: data.marketingType,\n\t\t\t'duration.end': { $gt: now },\n\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\tisAppliedByCompany: data.isAppliedByCompany,\n\t\t};\n\n\t\tif (ltoScheduleEnabled) {\n\t\t\texistingRecordQuery.campaignType = data.campaignType;\n\t\t\texistingRecordQuery.admin = admin ? { $ne: null } : null;\n\t\t}\n\n\t\tconst existingRecord = await this.model.findOne(existingRecordQuery);\n\n\t\tif (existingRecord) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'CONFLICT',\n\t\t\t\tmessage: `This shop already has a ${data.marketingType} marketing`,\n\t\t\t});\n\t\t}\n\n\t\tif (CONFLICT_CHECK_MARKETING_TYPES.includes(data.marketingType)) {\n\t\t\tawait marketingConflictService.assertNoConflict({\n\t\t\t\tshop: data.shop,\n\t\t\t\tmarketingType: data.marketingType,\n\t\t\t\tduration: data.duration,\n\t\t\t\trewardTypeGroups: marketingConflictService.getRewardTypeGroups(data.marketingType, data.tiers),\n\t\t\t});\n\t\t}\n\n\t\tif (data.isEntireMenu) {\n\t\t\tconst existingMarketing = await this.model.findOne({\n\t\t\t\tshop: data.shop,\n\t\t\t\t'duration.start': { $lt: now },\n\t\t\t\t'duration.end': { $gt: now },\n\t\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\t\tmarketingType: { $in: [MarketingType.BUY1GET1, MarketingType.DISCOUNT], $ne: data.marketingType },\n\t\t\t});\n\n\t\t\tif (existingMarketing) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'CONFLICT',\n\t\t\t\t\tmessage: `Cannot create marketing for entire menu while another product based marketing exists for the shop`,\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (data.products && data.products.length > 0) {\n\t\t\tconst productIds = data.products.map((product: CreateProductMarketingDTO) => product.product);\n\n\t\t\tconst hasDuplicates = new Set(productIds.map(String)).size !== productIds.length;\n\n\t\t\tif (hasDuplicates) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\t\tmessage: `Product list contains duplicate products`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (ltoScheduleEnabled && data.campaignType === MarketingCampaignType.LIMITED_TIME_OFFER) {\n\t\t\t\tawait productMarketingService.pauseConflictingMarketings(productIds);\n\t\t\t} else {\n\t\t\t\tconst isAvailable = await productMarketingService.checkProductMarketingAvailability(\n\t\t\t\t\tproductIds,\n\t\t\t\t\tdata.isAppliedByCompany\n\t\t\t\t);\n\n\t\t\t\tif (!isAvailable) {\n\t\t\t\t\tthrow new TRPCError({\n\t\t\t\t\t\tcode: 'CONFLICT',\n\t\t\t\t\t\tmessage: `Product list contains products which already have marketing applied`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (admin) {\n\t\t\tdata.admin = admin;\n\t\t}\n\n\t\tlet marketing: AllMarketingsDTO;\n\n\t\tswitch (data.marketingType) {\n\t\t\tcase MarketingType.DISCOUNT: {\n\t\t\t\tmarketing = await discountMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.BUY1GET1: {\n\t\t\t\tmarketing = await buy1Get1MarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FEATURED: {\n\t\t\t\tif (!admin) {\n\t\t\t\t\tthrow new TRPCError({\n\t\t\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\t\t\tmessage: `Only admin is allowed to create ${data.marketingType} marketing`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tmarketing = await featuredMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FREE_DELIVERY: {\n\t\t\t\tmarketing = await freeDeliveryMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.PUNCH_MARKETING: {\n\t\t\t\tmarketing = await punchMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.SPEND_TO_GET: {\n\t\t\t\tmarketing = await spendToGetMarketingService.create(data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tmarketing = await this.model.create(data, admin);\n\t\t\t}\n\t\t}\n\n\t\tawait this.assignMarketingToProducts(marketing);\n\n\t\tawait this.model.populate(marketing, {\n\t\t\tpath: 'shop',\n\t\t\tmodel: this.shopModel,\n\t\t\tselect: '_id name shopId',\n\t\t});\n\n\t\tif (admin) {\n\t\t\tthis.logMarketingAdminAction(\n\t\t\t\tadmin,\n\t\t\t\tAdminLogsUpdatedFieldsType.ACTIVATED_MARKETING_PROMOTIONS,\n\t\t\t\t'',\n\t\t\t\tmarketing\n\t\t\t);\n\t\t}\n\t\tif (marketing && !data.isEntireMenu)\n\t\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\t\tshopId: data.shop,\n\t\t\t\toperation: ChangeStreamOperationTypes.UPDATE,\n\t\t\t});\n\t\treturn marketing;\n\t}\n\n\t/**\n\t * Get record by ID\n\t * @param id ID of the record\n\t */\n\tpublic async findById(data: GetByIdInputDTO): Promise<DocumentType<Model>> {\n\t\tconst select = data.select || '';\n\t\tconst populate = data.populate || [];\n\t\tconst result = await this.model\n\t\t\t.findOne({\n\t\t\t\t_id: data._id,\n\t\t\t})\n\t\t\t.select(select)\n\t\t\t.populate(populate);\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get records\n\t * @param query Query to find records\n\t */\n\tpublic async find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>> {\n\t\ttry {\n\t\t\tconst paginate = createRawDocumentPaginatorObject(this.model as ReturnModelType<typeof this.model>);\n\t\t\tconst options: PaginatorOptions<typeof Model> = {\n\t\t\t\tpage: data?.page,\n\t\t\t\tsize: data?.size,\n\t\t\t\tsort: data?.sort,\n\t\t\t\tquery: data?.query,\n\t\t\t\tselect: data?.select,\n\t\t\t\tpopulate: data?.populate,\n\t\t\t};\n\t\t\tconst paginatedResult = await paginate(options);\n\t\t\treturn paginatedResult;\n\t\t} catch (err) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `err: ${err}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Update record\n\t * @param id ID of the record\n\t * @param data Data to update\n\t */\n\tpublic async update(\n\t\t_id: mongoose.Types.ObjectId,\n\t\tdata: UpdateDTO,\n\t\tadmin?: mongoose.Types.ObjectId\n\t): Promise<DocumentType<Model>> {\n\t\tlet marketing: AllMarketingsDTO;\n\n\t\tconst partOfLimitedTimeOffer = await this.limitedTimeOfferParticipantModel.exists({\n\t\t\tmarketing: _id,\n\t\t});\n\n\t\tif (partOfLimitedTimeOffer) {\n\t\t\tforbiddenError(\n\t\t\t\t'You are currently participating in a Limited Time Offer. Please make your edits from the Limited Time Offer section.'\n\t\t\t);\n\t\t}\n\n\t\tconst oldMarketing = await this.model.findById(_id).populate({\n\t\t\tpath: 'shop',\n\t\t\tselect: '_id name shopId',\n\t\t});\n\n\t\tif (!oldMarketing) {\n\t\t\tnotFoundError('Could not find marketing');\n\t\t}\n\n\t\tif (\n\t\t\tdata.status &&\n\t\t\tdata.status === MarketingStatus.ACTIVE &&\n\t\t\toldMarketing.status !== MarketingStatus.ACTIVE\n\t\t) {\n\t\t\tif (\n\t\t\t\t(await isLtoScheduleEnabled()) &&\n\t\t\t\toldMarketing.marketingType === MarketingType.DISCOUNT &&\n\t\t\t\t(await ltoParticipantService.isActiveParticipant(oldMarketing.shop._id))\n\t\t\t) {\n\t\t\t\tforbiddenError(\n\t\t\t\t\t'You are currently participating in a Limited Time Offer. Please manage your discount from the Limited Time Offer section or withdraw first.'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.verifyUnpauseConditions(_id);\n\t\t}\n\n\t\tswitch (oldMarketing.marketingType) {\n\t\t\tcase MarketingType.DISCOUNT: {\n\t\t\t\tmarketing = await discountMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.BUY1GET1: {\n\t\t\t\tmarketing = await buy1Get1MarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FEATURED: {\n\t\t\t\tif (!admin) {\n\t\t\t\t\tunauthorizedError(`Only admin is allowed to update ${data.marketingType} marketing`);\n\t\t\t\t}\n\t\t\t\tmarketing = await featuredMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.FREE_DELIVERY: {\n\t\t\t\tmarketing = await freeDeliveryMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.PUNCH_MARKETING: {\n\t\t\t\tmarketing = await punchMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase MarketingType.SPEND_TO_GET: {\n\t\t\t\tmarketing = await spendToGetMarketingService.update(_id, data);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tmarketing = await this.model\n\t\t\t\t\t.findOneAndUpdate(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_id: _id,\n\t\t\t\t\t\t\tdeletedAt: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnew: true,\n\t\t\t\t\t\t\trunValidators: true,\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t\t.populate({\n\t\t\t\t\t\tpath: 'shop',\n\t\t\t\t\t\tselect: '_id name shopId',\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (!marketing) {\n\t\t\tinternalServerError('Could not update marketing');\n\t\t}\n\n\t\tif (admin) {\n\t\t\tconst allChanges = getChangedFields(oldMarketing, marketing);\n\t\t\tconst relevantChanges = filterRelevantChanges(allChanges, data);\n\n\t\t\tif (Object.keys(relevantChanges).includes('status')) {\n\t\t\t\tif (data.status == MarketingStatus.ACTIVE) {\n\t\t\t\t\tthis.logMarketingAdminAction(\n\t\t\t\t\t\tadmin,\n\t\t\t\t\t\tAdminLogsUpdatedFieldsType.CONTINUED_MARKETING_PROMOTIONS,\n\t\t\t\t\t\toldMarketing,\n\t\t\t\t\t\tmarketing\n\t\t\t\t\t);\n\t\t\t\t} else if (data.status == MarketingStatus.PAUSED) {\n\t\t\t\t\tthis.logMarketingAdminAction(\n\t\t\t\t\t\tadmin,\n\t\t\t\t\t\tAdminLogsUpdatedFieldsType.PAUSED_MARKETING_PROMOTIONS,\n\t\t\t\t\t\toldMarketing,\n\t\t\t\t\t\tmarketing\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.logMarketingAdminAction(\n\t\t\t\tadmin,\n\t\t\t\tAdminLogsUpdatedFieldsType.EDITED_MARKETING_PROMOTIONS,\n\t\t\t\toldMarketing,\n\t\t\t\tmarketing\n\t\t\t);\n\t\t}\n\n\t\tawait this.assignMarketingToProducts(marketing);\n\n\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\tshopId: marketing.shop,\n\t\t\toperation: ChangeStreamOperationTypes.UPDATE,\n\t\t});\n\n\t\treturn marketing;\n\t}\n\n\tprivate async verifyUnpauseConditions(marketingId: mongoose.Types.ObjectId): Promise<void> {\n\t\tconst marketing = await this.model.findOne({ _id: marketingId, deletedAt: null }).populate('products');\n\t\tif (!marketing) return;\n\n\t\tif (await isLtoScheduleEnabled()) {\n\t\t\tconst hasActiveLto = await this.model.exists({\n\t\t\t\tshop: marketing.shop,\n\t\t\t\tcampaignType: MarketingCampaignType.LIMITED_TIME_OFFER,\n\t\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\t\tdeletedAt: null,\n\t\t\t});\n\t\t\tif (hasActiveLto) {\n\t\t\t\tconflictError(\"Can't resume this discount while a limited time offer is active\");\n\t\t\t}\n\t\t}\n\n\t\tif ([MarketingType.BUY1GET1, MarketingType.DISCOUNT].includes(marketing.marketingType)) {\n\t\t\tconst typedMarketing = marketing as DocumentType<DiscountMarketing | Buy1Get1Marketing>;\n\t\t\tconst productIds = typedMarketing.products.map((product: any) => product.product);\n\t\t\tconst isAvailable = await productMarketingService.checkProductMarketingAvailability(\n\t\t\t\tproductIds,\n\t\t\t\tmarketing.isAppliedByCompany\n\t\t\t);\n\n\t\t\tif (!isAvailable) {\n\t\t\t\tconflictError(\"You can't activate discount and B1G1 on the same items at the same time\");\n\t\t\t}\n\t\t}\n\n\t\tif (CONFLICT_CHECK_MARKETING_TYPES.includes(marketing.marketingType)) {\n\t\t\tawait marketingConflictService.assertNoConflict({\n\t\t\t\tshop: marketing.shop as mongoose.Types.ObjectId,\n\t\t\t\tmarketingType: marketing.marketingType,\n\t\t\t\tduration: marketing.duration,\n\t\t\t\trewardTypeGroups: marketingConflictService.getRewardTypeGroups(\n\t\t\t\t\tmarketing.marketingType,\n\t\t\t\t\t(marketing as any).tiers\n\t\t\t\t),\n\t\t\t\texcludeMarketingId: marketingId,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async logMarketingAdminAction(\n\t\tadmin: mongoose.Types.ObjectId,\n\t\tactionType: AdminLogsUpdatedFieldsType,\n\t\toldDocument?: any,\n\t\tnewDocument?: any\n\t) {\n\t\tconst adminActivityLogsEvent: BaseEvent<Record<string, unknown>> = new AdminActivityLogsEvent({\n\t\t\tadmin,\n\t\t\tupdatedField: actionType,\n\t\t\toldDocument: oldDocument ?? '',\n\t\t\tnewDocument: newDocument ?? '',\n\t\t});\n\t\tawait publishEvent(adminActivityLogsEvent);\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteById(\n\t\tdata: DeleteDTO,\n\t\tadmin?: mongoose.Types.ObjectId,\n\t\toptions?: { skipLimitedTimeOfferGuard?: boolean }\n\t): Promise<string> {\n\t\tconst { _id, softDelete } = data;\n\n\t\tif ((await isLtoScheduleEnabled()) && !options?.skipLimitedTimeOfferGuard) {\n\t\t\tconst partOfLimitedTimeOffer = await this.limitedTimeOfferParticipantModel.exists({\n\t\t\t\tmarketing: _id,\n\t\t\t});\n\n\t\t\tif (partOfLimitedTimeOffer) {\n\t\t\t\tforbiddenError(\n\t\t\t\t\t'You are currently participating in a Limited Time Offer. Please make your edits from the Limited Time Offer section.'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst record = await this.model.findById(_id).populate({\n\t\t\tpath: 'shop',\n\t\t\tselect: '_id name shopId',\n\t\t});\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\n\t\trecord.status = MarketingStatus.DELETED;\n\t\tawait record.save();\n\n\t\tconst result = await this.model.deleteRecord({ _id, deletedAt: null }, softDelete);\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Unable to delete marketing',\n\t\t\t});\n\t\t}\n\n\t\tif (admin) {\n\t\t\tthis.logMarketingAdminAction(admin, AdminLogsUpdatedFieldsType.DELETED_MARKETING_PROMOTIONS, record);\n\t\t}\n\n\t\tproductMarketingService.deleteMany({ marketing: data._id }, data.softDelete);\n\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\tshopId: record.shop._id,\n\t\t\toperation: ChangeStreamOperationTypes.DELETE,\n\t\t});\n\t\treturn 'Record deleted successfully';\n\t}\n\n\tpublic async deleteManyByIds(marketingIds: mongoose.Types.ObjectId[], softDelete = true): Promise<void> {\n\t\tif (marketingIds.length === 0) return;\n\n\t\tconst marketings = await this.model\n\t\t\t.find({ _id: { $in: marketingIds } })\n\t\t\t.select('shop')\n\t\t\t.lean();\n\n\t\tawait this.model.updateMany(\n\t\t\t{ _id: { $in: marketingIds } },\n\t\t\t{ $set: { status: MarketingStatus.DELETED } }\n\t\t);\n\t\tawait this.model.deleteRecords({ _id: { $in: marketingIds } }, softDelete);\n\n\t\tawait productMarketingService.deleteManyByMarketingIds(marketingIds, softDelete);\n\n\t\tconst uniqueShopIds = [\n\t\t\t...new Map(\n\t\t\t\tmarketings\n\t\t\t\t\t.map((m: any) => m.shop)\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s: any) => {\n\t\t\t\t\t\tconst id = s instanceof mongoose.Types.ObjectId ? s : new mongoose.Types.ObjectId(s);\n\t\t\t\t\t\treturn [id.toString(), id] as [string, mongoose.Types.ObjectId];\n\t\t\t\t\t})\n\t\t\t).values(),\n\t\t];\n\n\t\tfor (const shopId of uniqueShopIds) {\n\t\t\tpublishSyncSingleShopSectionsInCacheProcessEvent({\n\t\t\t\tshopId,\n\t\t\t\toperation: ChangeStreamOperationTypes.DELETE,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic async handleNewProductForEntireMenuMarketing(data: ProductEntireMenuMarketingHandlerDTO) {\n\t\tconst existingMarketing = await this.model.findOne({\n\t\t\tshop: data.shop,\n\t\t\tmarketingType: { $in: [MarketingType.BUY1GET1, MarketingType.DISCOUNT] },\n\t\t\t'duration.end': { $gt: new Date() },\n\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\tisEntireMenu: true,\n\t\t});\n\n\t\t// check if existing marketing\n\t\tif (existingMarketing) {\n\t\t\tconst productMarketingData: CreateProductMarketingDTO = {\n\t\t\t\tproduct: data.product,\n\t\t\t\tmarketing: existingMarketing._id,\n\t\t\t};\n\t\t\tif (existingMarketing.marketingType == MarketingType.BUY1GET1) {\n\t\t\t\tproductMarketingData.isBuy1Get1 = true;\n\t\t\t}\n\t\t\tif (existingMarketing.marketingType == MarketingType.DISCOUNT) {\n\t\t\t\tproductMarketingData.value = (existingMarketing as DocumentType<DiscountMarketing>).value;\n\t\t\t\tproductMarketingData.valueType = (existingMarketing as DocumentType<DiscountMarketing>).valueType;\n\t\t\t}\n\n\t\t\tawait productMarketingService.create(productMarketingData);\n\t\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByProductId(data.product);\n\t\t}\n\n\t\treturn 'Product handled successfully';\n\t}\n\n\tpublic async incrementMarketingSpentFromOrder(orderId: mongoose.Types.ObjectId): Promise<any> {\n\t\tconst order = (await this.orderModel\n\t\t\t.findById(orderId)\n\t\t\t.populate([\n\t\t\t\t{ path: 'lineItems' },\n\t\t\t\t{ path: 'marketings', select: 'isAppliedByCompany' },\n\t\t\t])) as DocumentType<RegularOrder> & {\n\t\t\tlineItems: DocumentType<LineItem>[];\n\t\t\tmarketings: DocumentType<Marketing>[];\n\t\t};\n\n\t\tif (!order || !order.marketings?.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst marketingSpendMap = this.marketingMetricsRepository.calculateMarketingSpendPerOrder(order);\n\n\t\tconst bulkOps = [...marketingSpendMap.entries()].map(([marketingId, amountSpent]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { _id: marketingId },\n\t\t\t\tupdate: { $inc: { amountSpent } },\n\t\t\t},\n\t\t}));\n\n\t\tif (bulkOps.length) {\n\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t}\n\n\t\tawait this.expireMarketingsExceedingSpendLimits(Array.from(marketingSpendMap.keys()));\n\n\t\treturn 'Marketing amount spent incremented successfully';\n\t}\n\n\tpublic async decrementMarketingSpentFromOrder(orderId: mongoose.Types.ObjectId): Promise<any> {\n\t\tconst order = (await this.orderModel\n\t\t\t.findById(orderId)\n\t\t\t.populate([\n\t\t\t\t{ path: 'lineItems' },\n\t\t\t\t{ path: 'marketings', select: 'isAppliedByCompany' },\n\t\t\t])) as DocumentType<RegularOrder> & {\n\t\t\tlineItems: DocumentType<LineItem>[];\n\t\t\tmarketings: DocumentType<Marketing>[];\n\t\t};\n\n\t\tif (!order || !order.marketings?.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst marketingSpendMap = this.marketingMetricsRepository.calculateMarketingSpendPerOrder(order);\n\n\t\tconst bulkOps = [...marketingSpendMap.entries()].map(([marketingId, amountSpent]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { _id: marketingId },\n\t\t\t\tupdate: { $inc: { amountSpent: -amountSpent } },\n\t\t\t},\n\t\t}));\n\n\t\tif (bulkOps.length) {\n\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t}\n\n\t\tawait this.unExpireMarketingsBelowSpendLimits(Array.from(marketingSpendMap.keys()));\n\n\t\treturn 'Marketing amount spent decremented successfully';\n\t}\n\n\tprivate async expireMarketingsExceedingSpendLimits(marketingIds: mongoose.Types.ObjectId[]) {\n\t\tconst update = await this.model.updateMany(\n\t\t\t{\n\t\t\t\t_id: { $in: marketingIds },\n\t\t\t\tisSpendLimitEnabled: true,\n\t\t\t\tstatus: { $ne: MarketingStatus.EXPIRED },\n\t\t\t\t$expr: { $gte: ['$amountSpent', '$spendLimit'] },\n\t\t\t},\n\t\t\t{ $set: { status: MarketingStatus.EXPIRED, expiredAt: dayjs().toDate() } }\n\t\t);\n\n\t\tif (update.modifiedCount > 0) {\n\t\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(marketingIds);\n\t\t}\n\t}\n\n\tprivate async unExpireMarketingsBelowSpendLimits(marketingIds: mongoose.Types.ObjectId[]) {\n\t\tconst update = await this.model.updateMany(\n\t\t\t{\n\t\t\t\t_id: { $in: marketingIds },\n\t\t\t\tisSpendLimitEnabled: true,\n\t\t\t\tstatus: MarketingStatus.EXPIRED,\n\t\t\t\t$expr: { $lt: ['$amountSpent', '$spendLimit'] },\n\t\t\t},\n\t\t\t{ $set: { status: MarketingStatus.ACTIVE }, $unset: { expiredAt: 1 } }\n\t\t);\n\n\t\tif (update.modifiedCount > 0) {\n\t\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(marketingIds);\n\t\t}\n\t}\n\n\tpublic async recomputeAndSyncAllMarketingSpent(): Promise<void> {\n\t\tconst cursor = this.model\n\t\t\t.find({ marketingType: { $ne: MarketingType.FEATURED } }, { _id: 1 })\n\t\t\t.lean()\n\t\t\t.cursor();\n\n\t\tconst bulkOps: mongoose.AnyBulkWriteOperation[] = [];\n\t\tconst marketingIds: mongoose.Types.ObjectId[] = [];\n\n\t\tfor await (const marketing of cursor) {\n\t\t\tconst { amount } = await this.marketingMetricsRepository.calculateMarketingSpent(marketing._id);\n\n\t\t\tbulkOps.push({\n\t\t\t\tupdateOne: {\n\t\t\t\t\tfilter: { _id: marketing._id },\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\t$set: { amountSpent: amount },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tmarketingIds.push(marketing._id);\n\n\t\t\tif (bulkOps.length >= 500) {\n\t\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t\t\tbulkOps.length = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (bulkOps.length) {\n\t\t\tawait this.model.bulkWrite(bulkOps);\n\t\t}\n\n\t\tawait this.expireMarketingsExceedingSpendLimits(marketingIds);\n\t\tawait this.unExpireMarketingsBelowSpendLimits(marketingIds);\n\t}\n\n\tpublic async reseedEntireMenuMarketing(marketingId: mongoose.Types.ObjectId): Promise<void> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tconst marketing = await this.model.findOne({ _id: marketingId, deletedAt: null });\n\t\tif (!marketing) internalServerError('Marketing not found');\n\n\t\tconst PAGE_SIZE = 500;\n\t\tconst mid = marketingId.toString();\n\t\tconst shopId = ((marketing.shop as any)?._id ?? marketing.shop).toString();\n\t\tconst count = await ProductModel.countDocuments({ shop: marketing.shop });\n\t\tconst pages = Math.ceil(count / PAGE_SIZE);\n\n\t\tif (!pages) return;\n\n\t\tawait Promise.all(\n\t\t\tArray.from({ length: pages }, (_, page) =>\n\t\t\t\tpublishEvent(\n\t\t\t\t\tnew MarketingEntireMenuSeedEvent({\n\t\t\t\t\t\tmarketingId: mid,\n\t\t\t\t\t\tshopId,\n\t\t\t\t\t\tisAppliedByCompany: marketing.isAppliedByCompany ?? false,\n\t\t\t\t\t\tisBuy1Get1: marketing.marketingType === MarketingType.BUY1GET1,\n\t\t\t\t\t\tvalue: (marketing as any).value,\n\t\t\t\t\t\tvalueType: (marketing as any).valueType,\n\t\t\t\t\t\tpage,\n\t\t\t\t\t\tpageSize: PAGE_SIZE,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t\tlogger.debug(`entire-menu reseed dispatched — ${pages} pages for ${count} products`, {\n\t\t\ttag: 'marketing.seed.entire-menu',\n\t\t\tdata: { marketingId: mid, shopId, pages, productCount: count },\n\t\t});\n\t}\n\n\tpublic async assignMarketingToProducts(marketing: DocumentType<Buy1Get1Marketing | DiscountMarketing>) {\n\t\tconst diffStartTime = dayjs(marketing.duration.start).diff(dayjs(), 'milliseconds');\n\t\tif (diffStartTime > 0) {\n\t\t\treturn await scheduleMarketingProductSync(marketing._id.toString(), diffStartTime);\n\t\t}\n\n\t\tif (marketing.isEntireMenu) {\n\t\t\tconst logger = getLibraries().getLoggerKit();\n\t\t\tconst PAGE_SIZE = 500;\n\t\t\tconst marketingId = marketing._id.toString();\n\t\t\tconst shopId = ((marketing.shop as any)?._id ?? marketing.shop).toString();\n\n\t\t\tconst count = await ProductModel.countDocuments({ shop: marketing.shop });\n\t\t\tconst pages = Math.ceil(count / PAGE_SIZE);\n\n\t\t\tif (pages > 0) {\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tArray.from({ length: pages }, (_, page) =>\n\t\t\t\t\t\tpublishEvent(\n\t\t\t\t\t\t\tnew MarketingEntireMenuSeedEvent({\n\t\t\t\t\t\t\t\tmarketingId,\n\t\t\t\t\t\t\t\tshopId,\n\t\t\t\t\t\t\t\tisAppliedByCompany: marketing.isAppliedByCompany ?? false,\n\t\t\t\t\t\t\t\tisBuy1Get1: marketing.marketingType === MarketingType.BUY1GET1,\n\t\t\t\t\t\t\t\tvalue: (marketing as any).value,\n\t\t\t\t\t\t\t\tvalueType: (marketing as any).valueType,\n\t\t\t\t\t\t\t\tpage,\n\t\t\t\t\t\t\t\tpageSize: PAGE_SIZE,\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\n\t\t\t\tlogger.debug(`entire-menu marketing seed dispatched — ${pages} pages for ${count} products`, {\n\t\t\t\t\ttag: 'marketing.seed.entire-menu',\n\t\t\t\t\tdata: { marketingId, shopId, pages, productCount: count },\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tawait productMarketingService.syncProductMarketingInfo(marketing._id);\n\t\t}\n\t}\n}\n\nexport const marketingService = Container.get(MarketingService);\n"]}
@@ -25,8 +25,10 @@ export declare class ProductMarketingService {
25
25
  checkProductMarketingAvailability(products: mongoose.Types.ObjectId[], isAppliedByCompany?: boolean): Promise<boolean>;
26
26
  pauseConflictingMarketings(products: mongoose.Types.ObjectId[]): Promise<mongoose.Types.ObjectId[]>;
27
27
  upsertProductMarketingsForPage(data: {
28
+ shop: mongoose.Types.ObjectId;
28
29
  marketingId: mongoose.Types.ObjectId;
29
- productIds: mongoose.Types.ObjectId[];
30
+ page: number;
31
+ pageSize: number;
30
32
  isAppliedByCompany: boolean;
31
33
  isBuy1Get1: boolean;
32
34
  value?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"product-marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/product-marketing.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product-marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/product-marketing.service.ts"],"names":[],"mappings":"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"}
@@ -245,10 +245,7 @@ let ProductMarketingService = class ProductMarketingService {
245
245
  }
246
246
  }
247
247
  async syncProductMarketingInfo(marketingId) {
248
- const productMarketings = await this.model
249
- .find({ marketing: marketingId, deletedAt: null })
250
- .select('product')
251
- .lean();
248
+ const productMarketings = await this.model.find({ marketing: marketingId });
252
249
  const productIds = productMarketings
253
250
  .map((r) => r.product)
254
251
  .filter((p) => !!p)
@@ -326,21 +323,27 @@ let ProductMarketingService = class ProductMarketingService {
326
323
  return marketingIds;
327
324
  }
328
325
  async upsertProductMarketingsForPage(data) {
329
- const { marketingId, productIds, isAppliedByCompany, isBuy1Get1, value, valueType } = data;
330
- if (!productIds.length)
326
+ const { shop, marketingId, page, pageSize, isAppliedByCompany, isBuy1Get1, value, valueType } = data;
327
+ const products = await this.productModel
328
+ .find({ shop })
329
+ .select('_id')
330
+ .skip(page * pageSize)
331
+ .limit(pageSize)
332
+ .lean();
333
+ if (!products.length)
331
334
  return [];
332
- const ops = productIds.map(productId => ({
335
+ const ops = products.map(product => ({
333
336
  updateOne: {
334
- filter: { marketing: marketingId, product: productId, deletedAt: null },
337
+ filter: { marketing: marketingId, product: product._id, deletedAt: null },
335
338
  update: {
336
339
  $set: { value, valueType, isAppliedByCompany, isBuy1Get1 },
337
- $setOnInsert: { marketing: marketingId, product: productId },
340
+ $setOnInsert: { marketing: marketingId, product: product._id },
338
341
  },
339
342
  upsert: true,
340
343
  },
341
344
  }));
342
345
  await this.model.bulkWrite(ops);
343
- return productIds;
346
+ return products.map(p => p._id);
344
347
  }
345
348
  async countDocuments(filter) {
346
349
  const count = await this.model.countDocuments({ ...filter, deletedAt: null });
@@ -1 +1 @@
1
- {"version":3,"file":"product-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/product-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport {\n\tMarketingModel,\n\tProductMarketingModel,\n\tProductMarketing as Model,\n\tProductModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models/';\nimport {\n\tBatchCreateProductMarketingsInputDTO,\n\tCreateProductMarketingDTO as CreateDTO,\n\tQueryProductMarketingDTO as QueryDTO,\n\tQueryMultipleProductMarketingDTO,\n\tUpdateProductMarketingDTO as UpdateDTO,\n} from '@modules/marketing/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { FilterDTO, PaginatedResponse } from '@lyxa.ai/core/dist/utilities/validation';\nimport { createRawDocumentPaginatorObject, PaginatorOptions } from '@lyxa.ai/core/dist/utilities/pagination';\nimport { ModelType } from '@typegoose/typegoose/lib/types';\nimport { MarketingCampaignType, MarketingStatus, ValueType } from '@lyxa.ai/core/dist/utilities/enum';\nimport {\n\tSynchronizeProductMarketingService,\n\tsynchronizeProductMarketingService,\n} from './synchronize-product-marketing.service';\nimport { badRequestError } from '@lyxa.ai/core/dist/utilities/error-common';\n\n@Service()\nexport class ProductMarketingService {\n\tprivate model: typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\tprivate productModel: typeof ProductModel;\n\n\tprivate syncProductsMarketingInfoService: SynchronizeProductMarketingService;\n\n\tconstructor() {\n\t\tthis.model = ProductMarketingModel as typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\t\tthis.productModel = ProductModel;\n\n\t\tthis.syncProductsMarketingInfoService = synchronizeProductMarketingService;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model.create(data);\n\t\tif (!result) badRequestError('Product marketing creation failed');\n\t\treturn result;\n\t}\n\n\t/**\n\t * Bulk create new records\n\t * @param data Data for the new records\n\t */\n\tpublic async bulkCreate(data: CreateDTO[]): Promise<void> {\n\t\tawait this.model.insertMany(data, { ordered: false });\n\t}\n\n\tpublic async bulkCreateFromCursor<T>(cursor: AsyncIterable<T>, mapper: (item: T) => any) {\n\t\tconst BATCH_SIZE = 500;\n\t\tconst batch = [];\n\n\t\tfor await (const item of cursor) {\n\t\t\tbatch.push(mapper(item));\n\n\t\t\tif (batch.length === BATCH_SIZE) {\n\t\t\t\tawait this.bulkCreate(batch);\n\t\t\t\tbatch.length = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (batch.length) {\n\t\t\tawait this.bulkCreate(batch);\n\t\t}\n\t}\n\n\tpublic async bulkCreateFromArray<T>(items: Iterable<T>, mapper: (item: T) => any) {\n\t\tconst BATCH_SIZE = 500;\n\t\tconst batch = [];\n\n\t\tfor (const item of items) {\n\t\t\tbatch.push(mapper(item));\n\n\t\t\tif (batch.length === BATCH_SIZE) {\n\t\t\t\tawait this.bulkCreate(batch);\n\t\t\t\tbatch.length = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (batch.length) {\n\t\t\tawait this.bulkCreate(batch);\n\t\t}\n\t}\n\n\tprivate async buildProductsMap(data: {\n\t\tproducts: {\n\t\t\tproduct: mongoose.Types.ObjectId;\n\t\t\tvalue?: number;\n\t\t\tvalueType?: ValueType | null;\n\t\t}[];\n\t\tisBuy1Get1: boolean;\n\t\tcategories?: mongoose.Types.ObjectId[];\n\t\tcategoryValue?: number;\n\t\tcategoryValueType?: ValueType;\n\t}): Promise<Record<string, { value?: number; valueType?: ValueType; isBuy1Get1?: boolean }>> {\n\t\tconst map: Record<string, { value?: number; valueType?: ValueType; isBuy1Get1?: boolean }> = {};\n\n\t\t// explicit products\n\t\tfor (const p of data.products || []) {\n\t\t\tif (data.isBuy1Get1) {\n\t\t\t\tmap[p.product.toString()] = {\n\t\t\t\t\tisBuy1Get1: true,\n\t\t\t\t};\n\t\t\t} else if (p.value !== undefined && p.valueType) {\n\t\t\t\tmap[p.product.toString()] = {\n\t\t\t\t\tvalue: Number(p.value),\n\t\t\t\t\tvalueType: p.valueType,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// category products\n\t\tif (data.categories?.length) {\n\t\t\tconst categoryProducts = await this.productModel\n\t\t\t\t.find({ shopCategory: { $in: data.categories } })\n\t\t\t\t.select('_id')\n\t\t\t\t.lean();\n\n\t\t\tfor (const p of categoryProducts) {\n\t\t\t\tconst id = p._id.toString();\n\t\t\t\tif (!map[id]) {\n\t\t\t\t\tif (data.isBuy1Get1) {\n\t\t\t\t\t\tmap[id.toString()] = {\n\t\t\t\t\t\t\tisBuy1Get1: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (data.categoryValue !== undefined && data.categoryValueType) {\n\t\t\t\t\t\tmap[id] = {\n\t\t\t\t\t\t\tvalue: Number(data.categoryValue),\n\t\t\t\t\t\t\tvalueType: data.categoryValueType,\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\n\t\treturn map;\n\t}\n\n\tpublic async createProductMarketings(data: BatchCreateProductMarketingsInputDTO): Promise<void> {\n\t\tconst {\n\t\t\tshop,\n\t\t\tmarketingId,\n\t\t\tproducts,\n\t\t\tcategories,\n\t\t\tisEntireMenu,\n\t\t\tisAppliedByCompany,\n\t\t\tcategoryValue,\n\t\t\tcategoryValueType,\n\t\t\tvalue,\n\t\t\tvalueType,\n\t\t\tisBuy1Get1,\n\t\t} = data;\n\n\t\tif (isEntireMenu) {\n\t\t\tawait this.bulkCreateFromCursor(\n\t\t\t\tthis.productModel.find({ shop }).select('_id').lean().cursor(),\n\t\t\t\tproduct => ({\n\t\t\t\t\tmarketing: marketingId,\n\t\t\t\t\tproduct: product._id,\n\t\t\t\t\tvalue,\n\t\t\t\t\tvalueType,\n\t\t\t\t\tisAppliedByCompany,\n\t\t\t\t\tisBuy1Get1,\n\t\t\t\t})\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst productsMap = await this.buildProductsMap({\n\t\t\tproducts: data.products,\n\t\t\tisBuy1Get1: data.isBuy1Get1,\n\t\t\tcategories: data.categories,\n\t\t\tcategoryValue: data.categoryValue,\n\t\t\tcategoryValueType: data.categoryValueType,\n\t\t});\n\n\t\tawait this.bulkCreateFromArray(Object.entries(productsMap), ([productId, info]) => ({\n\t\t\tmarketing: marketingId,\n\t\t\tproduct: new mongoose.Types.ObjectId(productId),\n\t\t\tvalue: info.value,\n\t\t\tvalueType: info.valueType,\n\t\t\tisAppliedByCompany,\n\t\t\tisBuy1Get1: info.isBuy1Get1,\n\t\t}));\n\t}\n\n\t/**\n\t * Get record by ID\n\t * @param id ID of the record\n\t */\n\tpublic async findById(id: string | mongoose.Types.ObjectId): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model.findOne({\n\t\t\t_id: id,\n\t\t\tdeletedAt: null,\n\t\t});\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get records\n\t * @param query Query to find records\n\t */\n\tpublic async find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>> {\n\t\ttry {\n\t\t\tconst paginate = createRawDocumentPaginatorObject(this.model as ReturnModelType<typeof this.model>);\n\t\t\tconst options: PaginatorOptions<typeof Model> = {\n\t\t\t\tpage: data?.page,\n\t\t\t\tsize: data?.size,\n\t\t\t\tsort: data?.sort,\n\t\t\t\tquery: data?.query,\n\t\t\t\tselect: data?.select,\n\t\t\t\tpopulate: data?.populate,\n\t\t\t};\n\t\t\tconst paginatedResult = await paginate(options);\n\t\t\treturn paginatedResult;\n\t\t} catch (err) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `err: ${err}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Update single record based on query\n\t * @param query Query to find the record\n\t * @param data Data to update\n\t */\n\tpublic async updateOne(query: QueryDTO, data: UpdateDTO): Promise<string> {\n\t\tconst record = await this.model.findOneAndUpdate(query, data, {\n\t\t\tnew: true,\n\t\t\trunValidators: true,\n\t\t});\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn 'Records updated successfully';\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMany(filter: QueryDTO, softDelete: boolean): Promise<string> {\n\t\tconst productMarketings = await this.model.find(filter);\n\n\t\tawait this.model.deleteRecords(filter, softDelete);\n\n\t\tconst productIds: mongoose.Types.ObjectId[] = productMarketings\n\t\t\t.map((r: any) => r.product)\n\t\t\t.filter((p: any): p is mongoose.Types.ObjectId | string => !!p) // filter out null/undefined\n\t\t\t.map((p: any) => (p instanceof mongoose.Types.ObjectId ? p : new mongoose.Types.ObjectId(p))); // convert to ObjectId\n\n\t\tconst uniqueProductIds = [...new Set(productIds.map((id: any) => new mongoose.Types.ObjectId(id)))];\n\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductIds(uniqueProductIds);\n\n\t\treturn 'Record deleted successfully';\n\t}\n\n\tpublic async deleteManyByMarketingIds(marketingIds: mongoose.Types.ObjectId[], softDelete: boolean): Promise<void> {\n\t\tif (marketingIds.length === 0) return;\n\n\t\tconst productMarketings = await this.model\n\t\t\t.find({ marketing: { $in: marketingIds } })\n\t\t\t.select('product')\n\t\t\t.lean();\n\n\t\tawait this.model.deleteRecords({ marketing: { $in: marketingIds } }, softDelete);\n\n\t\tconst uniqueProductIds = [\n\t\t\t...new Map(\n\t\t\t\tproductMarketings\n\t\t\t\t\t.map((r: any) => r.product)\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((p: any) => {\n\t\t\t\t\t\tconst id = p instanceof mongoose.Types.ObjectId ? p : new mongoose.Types.ObjectId(p);\n\t\t\t\t\t\treturn [id.toString(), id] as [string, mongoose.Types.ObjectId];\n\t\t\t\t\t})\n\t\t\t).values(),\n\t\t];\n\n\t\tif (uniqueProductIds.length) {\n\t\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductIds(uniqueProductIds);\n\t\t}\n\t}\n\n\tpublic async syncProductMarketingInfo(marketingId: mongoose.Types.ObjectId) {\n\t\tconst productMarketings = await this.model\n\t\t\t.find({ marketing: marketingId, deletedAt: null })\n\t\t\t.select('product')\n\t\t\t.lean();\n\n\t\tconst productIds: mongoose.Types.ObjectId[] = productMarketings\n\t\t\t.map((r: any) => r.product)\n\t\t\t.filter((p: any): p is mongoose.Types.ObjectId | string => !!p) // filter out null/undefined\n\t\t\t.map((p: any) => (p instanceof mongoose.Types.ObjectId ? p : new mongoose.Types.ObjectId(p))); // convert to ObjectId\n\n\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductIds(productIds);\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMultipleProducts(\n\t\tfilter: QueryMultipleProductMarketingDTO,\n\t\tsoftDelete: boolean\n\t): Promise<string> {\n\t\tconst result = await this.model.deleteRecords(\n\t\t\t{\n\t\t\t\tmarketing: filter.marketing,\n\t\t\t\tproduct: { $in: filter.products },\n\t\t\t},\n\t\t\tsoftDelete\n\t\t);\n\t\t// sync\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Check if products are available for marketing\n\t * @param products Array of product IDs\n\t */\n\tpublic async checkProductMarketingAvailability(\n\t\tproducts: mongoose.Types.ObjectId[],\n\t\tisAppliedByCompany?: boolean\n\t): Promise<boolean> {\n\t\tconst now = new Date();\n\n\t\tconst marketingMatch: any = {\n\t\t\t'marketingDoc.status': MarketingStatus.ACTIVE,\n\t\t\t'marketingDoc.duration.start': { $lt: now },\n\t\t\t'marketingDoc.duration.end': { $gt: now },\n\t\t};\n\n\t\t// Only add this filter if explicitly provided\n\t\tif (typeof isAppliedByCompany === 'boolean') {\n\t\t\tmarketingMatch['marketingDoc.isAppliedByCompany'] = isAppliedByCompany;\n\t\t}\n\n\t\tconst result = await this.model.aggregate([\n\t\t\t{\n\t\t\t\t$match: { product: { $in: products }, deletedAt: null },\n\t\t\t},\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'marketings',\n\t\t\t\t\tlocalField: 'marketing',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'marketingDoc',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $unwind: '$marketingDoc' },\n\t\t\t{\n\t\t\t\t$match: marketingMatch,\n\t\t\t},\n\t\t\t{ $limit: 1 }, // stop as soon as one match is found\n\t\t]);\n\n\t\tconst anyExist = result.length > 0;\n\n\t\treturn !anyExist;\n\t}\n\n\t/**\n\t * Pause any standard (non-LTO) marketing already covering these products, so a\n\t * Limited Time Offer marketing can take them over instead of being blocked by it.\n\t * @param products Array of product IDs\n\t */\n\tpublic async pauseConflictingMarketings(\n\t\tproducts: mongoose.Types.ObjectId[]\n\t): Promise<mongoose.Types.ObjectId[]> {\n\t\tconst now = new Date();\n\n\t\tconst result = await this.model.aggregate([\n\t\t\t{\n\t\t\t\t$match: { product: { $in: products }, deletedAt: null },\n\t\t\t},\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'marketings',\n\t\t\t\t\tlocalField: 'marketing',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'marketingDoc',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $unwind: '$marketingDoc' },\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t'marketingDoc.status': MarketingStatus.ACTIVE,\n\t\t\t\t\t'marketingDoc.duration.start': { $lt: now },\n\t\t\t\t\t'marketingDoc.duration.end': { $gt: now },\n\t\t\t\t\t'marketingDoc.campaignType': { $in: [MarketingCampaignType.STANDARD, null] },\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $group: { _id: '$marketingDoc._id' } },\n\t\t]);\n\n\t\tconst marketingIds = result.map(r => r._id);\n\t\tif (!marketingIds.length) return [];\n\n\t\tawait MarketingModel.updateMany({ _id: { $in: marketingIds } }, { $set: { status: MarketingStatus.PAUSED } });\n\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(marketingIds);\n\t\treturn marketingIds;\n\t}\n\n\tpublic async upsertProductMarketingsForPage(data: {\n\t\tmarketingId: mongoose.Types.ObjectId;\n\t\tproductIds: mongoose.Types.ObjectId[];\n\t\tisAppliedByCompany: boolean;\n\t\tisBuy1Get1: boolean;\n\t\tvalue?: number;\n\t\tvalueType?: ValueType;\n\t}): Promise<mongoose.Types.ObjectId[]> {\n\t\tconst { marketingId, productIds, isAppliedByCompany, isBuy1Get1, value, valueType } = data;\n\n\t\tif (!productIds.length) return [];\n\n\t\tconst ops = productIds.map(productId => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { marketing: marketingId, product: productId, deletedAt: null },\n\t\t\t\tupdate: {\n\t\t\t\t\t$set: { value, valueType, isAppliedByCompany, isBuy1Get1 },\n\t\t\t\t\t$setOnInsert: { marketing: marketingId, product: productId },\n\t\t\t\t},\n\t\t\t\tupsert: true,\n\t\t\t},\n\t\t}));\n\n\t\tawait this.model.bulkWrite(ops);\n\n\t\treturn productIds;\n\t}\n\n\tpublic async countDocuments(filter: QueryDTO): Promise<number> {\n\t\tconst count = await this.model.countDocuments({ ...filter, deletedAt: null });\n\t\treturn count ?? 0;\n\t}\n}\n\nexport const productMarketingService = Container.get(ProductMarketingService);\n"]}
1
+ {"version":3,"file":"product-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/product-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport {\n\tMarketingModel,\n\tProductMarketingModel,\n\tProductMarketing as Model,\n\tProductModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models/';\nimport {\n\tBatchCreateProductMarketingsInputDTO,\n\tCreateProductMarketingDTO as CreateDTO,\n\tQueryProductMarketingDTO as QueryDTO,\n\tQueryMultipleProductMarketingDTO,\n\tUpdateProductMarketingDTO as UpdateDTO,\n} from '@modules/marketing/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { FilterDTO, PaginatedResponse } from '@lyxa.ai/core/dist/utilities/validation';\nimport { createRawDocumentPaginatorObject, PaginatorOptions } from '@lyxa.ai/core/dist/utilities/pagination';\nimport { ModelType } from '@typegoose/typegoose/lib/types';\nimport { MarketingCampaignType, MarketingStatus, ValueType } from '@lyxa.ai/core/dist/utilities/enum';\nimport {\n\tSynchronizeProductMarketingService,\n\tsynchronizeProductMarketingService,\n} from './synchronize-product-marketing.service';\nimport { badRequestError } from '@lyxa.ai/core/dist/utilities/error-common';\n\n@Service()\nexport class ProductMarketingService {\n\tprivate model: typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\tprivate productModel: typeof ProductModel;\n\n\tprivate syncProductsMarketingInfoService: SynchronizeProductMarketingService;\n\n\tconstructor() {\n\t\tthis.model = ProductMarketingModel as typeof ProductMarketingModel & SoftDeleteModel<Model>;\n\t\tthis.productModel = ProductModel;\n\n\t\tthis.syncProductsMarketingInfoService = synchronizeProductMarketingService;\n\t}\n\n\t/**\n\t * Create a new record\n\t * @param data Data for the new record\n\t */\n\tpublic async create(data: CreateDTO): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model.create(data);\n\t\tif (!result) badRequestError('Product marketing creation failed');\n\t\treturn result;\n\t}\n\n\t/**\n\t * Bulk create new records\n\t * @param data Data for the new records\n\t */\n\tpublic async bulkCreate(data: CreateDTO[]): Promise<void> {\n\t\tawait this.model.insertMany(data, { ordered: false });\n\t}\n\n\tpublic async bulkCreateFromCursor<T>(cursor: AsyncIterable<T>, mapper: (item: T) => any) {\n\t\tconst BATCH_SIZE = 500;\n\t\tconst batch = [];\n\n\t\tfor await (const item of cursor) {\n\t\t\tbatch.push(mapper(item));\n\n\t\t\tif (batch.length === BATCH_SIZE) {\n\t\t\t\tawait this.bulkCreate(batch);\n\t\t\t\tbatch.length = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (batch.length) {\n\t\t\tawait this.bulkCreate(batch);\n\t\t}\n\t}\n\n\tpublic async bulkCreateFromArray<T>(items: Iterable<T>, mapper: (item: T) => any) {\n\t\tconst BATCH_SIZE = 500;\n\t\tconst batch = [];\n\n\t\tfor (const item of items) {\n\t\t\tbatch.push(mapper(item));\n\n\t\t\tif (batch.length === BATCH_SIZE) {\n\t\t\t\tawait this.bulkCreate(batch);\n\t\t\t\tbatch.length = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (batch.length) {\n\t\t\tawait this.bulkCreate(batch);\n\t\t}\n\t}\n\n\tprivate async buildProductsMap(data: {\n\t\tproducts: {\n\t\t\tproduct: mongoose.Types.ObjectId;\n\t\t\tvalue?: number;\n\t\t\tvalueType?: ValueType | null;\n\t\t}[];\n\t\tisBuy1Get1: boolean;\n\t\tcategories?: mongoose.Types.ObjectId[];\n\t\tcategoryValue?: number;\n\t\tcategoryValueType?: ValueType;\n\t}): Promise<Record<string, { value?: number; valueType?: ValueType; isBuy1Get1?: boolean }>> {\n\t\tconst map: Record<string, { value?: number; valueType?: ValueType; isBuy1Get1?: boolean }> = {};\n\n\t\t// explicit products\n\t\tfor (const p of data.products || []) {\n\t\t\tif (data.isBuy1Get1) {\n\t\t\t\tmap[p.product.toString()] = {\n\t\t\t\t\tisBuy1Get1: true,\n\t\t\t\t};\n\t\t\t} else if (p.value !== undefined && p.valueType) {\n\t\t\t\tmap[p.product.toString()] = {\n\t\t\t\t\tvalue: Number(p.value),\n\t\t\t\t\tvalueType: p.valueType,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// category products\n\t\tif (data.categories?.length) {\n\t\t\tconst categoryProducts = await this.productModel\n\t\t\t\t.find({ shopCategory: { $in: data.categories } })\n\t\t\t\t.select('_id')\n\t\t\t\t.lean();\n\n\t\t\tfor (const p of categoryProducts) {\n\t\t\t\tconst id = p._id.toString();\n\t\t\t\tif (!map[id]) {\n\t\t\t\t\tif (data.isBuy1Get1) {\n\t\t\t\t\t\tmap[id.toString()] = {\n\t\t\t\t\t\t\tisBuy1Get1: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (data.categoryValue !== undefined && data.categoryValueType) {\n\t\t\t\t\t\tmap[id] = {\n\t\t\t\t\t\t\tvalue: Number(data.categoryValue),\n\t\t\t\t\t\t\tvalueType: data.categoryValueType,\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\n\t\treturn map;\n\t}\n\n\tpublic async createProductMarketings(data: BatchCreateProductMarketingsInputDTO): Promise<void> {\n\t\tconst {\n\t\t\tshop,\n\t\t\tmarketingId,\n\t\t\tproducts,\n\t\t\tcategories,\n\t\t\tisEntireMenu,\n\t\t\tisAppliedByCompany,\n\t\t\tcategoryValue,\n\t\t\tcategoryValueType,\n\t\t\tvalue,\n\t\t\tvalueType,\n\t\t\tisBuy1Get1,\n\t\t} = data;\n\n\t\tif (isEntireMenu) {\n\t\t\tawait this.bulkCreateFromCursor(\n\t\t\t\tthis.productModel.find({ shop }).select('_id').lean().cursor(),\n\t\t\t\tproduct => ({\n\t\t\t\t\tmarketing: marketingId,\n\t\t\t\t\tproduct: product._id,\n\t\t\t\t\tvalue,\n\t\t\t\t\tvalueType,\n\t\t\t\t\tisAppliedByCompany,\n\t\t\t\t\tisBuy1Get1,\n\t\t\t\t})\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst productsMap = await this.buildProductsMap({\n\t\t\tproducts: data.products,\n\t\t\tisBuy1Get1: data.isBuy1Get1,\n\t\t\tcategories: data.categories,\n\t\t\tcategoryValue: data.categoryValue,\n\t\t\tcategoryValueType: data.categoryValueType,\n\t\t});\n\n\t\tawait this.bulkCreateFromArray(Object.entries(productsMap), ([productId, info]) => ({\n\t\t\tmarketing: marketingId,\n\t\t\tproduct: new mongoose.Types.ObjectId(productId),\n\t\t\tvalue: info.value,\n\t\t\tvalueType: info.valueType,\n\t\t\tisAppliedByCompany,\n\t\t\tisBuy1Get1: info.isBuy1Get1,\n\t\t}));\n\t}\n\n\t/**\n\t * Get record by ID\n\t * @param id ID of the record\n\t */\n\tpublic async findById(id: string | mongoose.Types.ObjectId): Promise<DocumentType<Model>> {\n\t\tconst result = await this.model.findOne({\n\t\t\t_id: id,\n\t\t\tdeletedAt: null,\n\t\t});\n\t\tif (!result) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get records\n\t * @param query Query to find records\n\t */\n\tpublic async find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>> {\n\t\ttry {\n\t\t\tconst paginate = createRawDocumentPaginatorObject(this.model as ReturnModelType<typeof this.model>);\n\t\t\tconst options: PaginatorOptions<typeof Model> = {\n\t\t\t\tpage: data?.page,\n\t\t\t\tsize: data?.size,\n\t\t\t\tsort: data?.sort,\n\t\t\t\tquery: data?.query,\n\t\t\t\tselect: data?.select,\n\t\t\t\tpopulate: data?.populate,\n\t\t\t};\n\t\t\tconst paginatedResult = await paginate(options);\n\t\t\treturn paginatedResult;\n\t\t} catch (err) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: `err: ${err}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Update single record based on query\n\t * @param query Query to find the record\n\t * @param data Data to update\n\t */\n\tpublic async updateOne(query: QueryDTO, data: UpdateDTO): Promise<string> {\n\t\tconst record = await this.model.findOneAndUpdate(query, data, {\n\t\t\tnew: true,\n\t\t\trunValidators: true,\n\t\t});\n\n\t\tif (!record) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: `Record not found`,\n\t\t\t});\n\t\t}\n\n\t\treturn 'Records updated successfully';\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMany(filter: QueryDTO, softDelete: boolean): Promise<string> {\n\t\tconst productMarketings = await this.model.find(filter);\n\n\t\tawait this.model.deleteRecords(filter, softDelete);\n\n\t\tconst productIds: mongoose.Types.ObjectId[] = productMarketings\n\t\t\t.map((r: any) => r.product)\n\t\t\t.filter((p: any): p is mongoose.Types.ObjectId | string => !!p) // filter out null/undefined\n\t\t\t.map((p: any) => (p instanceof mongoose.Types.ObjectId ? p : new mongoose.Types.ObjectId(p))); // convert to ObjectId\n\n\t\tconst uniqueProductIds = [...new Set(productIds.map((id: any) => new mongoose.Types.ObjectId(id)))];\n\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductIds(uniqueProductIds);\n\n\t\treturn 'Record deleted successfully';\n\t}\n\n\tpublic async deleteManyByMarketingIds(marketingIds: mongoose.Types.ObjectId[], softDelete: boolean): Promise<void> {\n\t\tif (marketingIds.length === 0) return;\n\n\t\tconst productMarketings = await this.model\n\t\t\t.find({ marketing: { $in: marketingIds } })\n\t\t\t.select('product')\n\t\t\t.lean();\n\n\t\tawait this.model.deleteRecords({ marketing: { $in: marketingIds } }, softDelete);\n\n\t\tconst uniqueProductIds = [\n\t\t\t...new Map(\n\t\t\t\tproductMarketings\n\t\t\t\t\t.map((r: any) => r.product)\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((p: any) => {\n\t\t\t\t\t\tconst id = p instanceof mongoose.Types.ObjectId ? p : new mongoose.Types.ObjectId(p);\n\t\t\t\t\t\treturn [id.toString(), id] as [string, mongoose.Types.ObjectId];\n\t\t\t\t\t})\n\t\t\t).values(),\n\t\t];\n\n\t\tif (uniqueProductIds.length) {\n\t\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductIds(uniqueProductIds);\n\t\t}\n\t}\n\n\tpublic async syncProductMarketingInfo(marketingId: mongoose.Types.ObjectId) {\n\t\tconst productMarketings = await this.model.find({ marketing: marketingId });\n\n\t\tconst productIds: mongoose.Types.ObjectId[] = productMarketings\n\t\t\t.map((r: any) => r.product)\n\t\t\t.filter((p: any): p is mongoose.Types.ObjectId | string => !!p) // filter out null/undefined\n\t\t\t.map((p: any) => (p instanceof mongoose.Types.ObjectId ? p : new mongoose.Types.ObjectId(p))); // convert to ObjectId\n\n\t\tawait this.syncProductsMarketingInfoService.syncProductMarketingInfoByProductIds(productIds);\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteMultipleProducts(\n\t\tfilter: QueryMultipleProductMarketingDTO,\n\t\tsoftDelete: boolean\n\t): Promise<string> {\n\t\tconst result = await this.model.deleteRecords(\n\t\t\t{\n\t\t\t\tmarketing: filter.marketing,\n\t\t\t\tproduct: { $in: filter.products },\n\t\t\t},\n\t\t\tsoftDelete\n\t\t);\n\t\t// sync\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Check if products are available for marketing\n\t * @param products Array of product IDs\n\t */\n\tpublic async checkProductMarketingAvailability(\n\t\tproducts: mongoose.Types.ObjectId[],\n\t\tisAppliedByCompany?: boolean\n\t): Promise<boolean> {\n\t\tconst now = new Date();\n\n\t\tconst marketingMatch: any = {\n\t\t\t'marketingDoc.status': MarketingStatus.ACTIVE,\n\t\t\t'marketingDoc.duration.start': { $lt: now },\n\t\t\t'marketingDoc.duration.end': { $gt: now },\n\t\t};\n\n\t\t// Only add this filter if explicitly provided\n\t\tif (typeof isAppliedByCompany === 'boolean') {\n\t\t\tmarketingMatch['marketingDoc.isAppliedByCompany'] = isAppliedByCompany;\n\t\t}\n\n\t\tconst result = await this.model.aggregate([\n\t\t\t{\n\t\t\t\t$match: { product: { $in: products }, deletedAt: null },\n\t\t\t},\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'marketings',\n\t\t\t\t\tlocalField: 'marketing',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'marketingDoc',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $unwind: '$marketingDoc' },\n\t\t\t{\n\t\t\t\t$match: marketingMatch,\n\t\t\t},\n\t\t\t{ $limit: 1 }, // stop as soon as one match is found\n\t\t]);\n\n\t\tconst anyExist = result.length > 0;\n\n\t\treturn !anyExist;\n\t}\n\n\t/**\n\t * Pause any standard (non-LTO) marketing already covering these products, so a\n\t * Limited Time Offer marketing can take them over instead of being blocked by it.\n\t * @param products Array of product IDs\n\t */\n\tpublic async pauseConflictingMarketings(\n\t\tproducts: mongoose.Types.ObjectId[]\n\t): Promise<mongoose.Types.ObjectId[]> {\n\t\tconst now = new Date();\n\n\t\tconst result = await this.model.aggregate([\n\t\t\t{\n\t\t\t\t$match: { product: { $in: products }, deletedAt: null },\n\t\t\t},\n\t\t\t{\n\t\t\t\t$lookup: {\n\t\t\t\t\tfrom: 'marketings',\n\t\t\t\t\tlocalField: 'marketing',\n\t\t\t\t\tforeignField: '_id',\n\t\t\t\t\tas: 'marketingDoc',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $unwind: '$marketingDoc' },\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t'marketingDoc.status': MarketingStatus.ACTIVE,\n\t\t\t\t\t'marketingDoc.duration.start': { $lt: now },\n\t\t\t\t\t'marketingDoc.duration.end': { $gt: now },\n\t\t\t\t\t'marketingDoc.campaignType': { $in: [MarketingCampaignType.STANDARD, null] },\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ $group: { _id: '$marketingDoc._id' } },\n\t\t]);\n\n\t\tconst marketingIds = result.map(r => r._id);\n\t\tif (!marketingIds.length) return [];\n\n\t\tawait MarketingModel.updateMany({ _id: { $in: marketingIds } }, { $set: { status: MarketingStatus.PAUSED } });\n\t\tawait synchronizeProductMarketingService.syncProductMarketingInfoByMarketingIds(marketingIds);\n\t\treturn marketingIds;\n\t}\n\n\tpublic async upsertProductMarketingsForPage(data: {\n\t\tshop: mongoose.Types.ObjectId;\n\t\tmarketingId: mongoose.Types.ObjectId;\n\t\tpage: number;\n\t\tpageSize: number;\n\t\tisAppliedByCompany: boolean;\n\t\tisBuy1Get1: boolean;\n\t\tvalue?: number;\n\t\tvalueType?: ValueType;\n\t}): Promise<mongoose.Types.ObjectId[]> {\n\t\tconst { shop, marketingId, page, pageSize, isAppliedByCompany, isBuy1Get1, value, valueType } = data;\n\n\t\tconst products = await this.productModel\n\t\t\t.find({ shop })\n\t\t\t.select('_id')\n\t\t\t.skip(page * pageSize)\n\t\t\t.limit(pageSize)\n\t\t\t.lean();\n\n\t\tif (!products.length) return [];\n\n\t\tconst ops = products.map(product => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { marketing: marketingId, product: product._id, deletedAt: null },\n\t\t\t\tupdate: {\n\t\t\t\t\t$set: { value, valueType, isAppliedByCompany, isBuy1Get1 },\n\t\t\t\t\t$setOnInsert: { marketing: marketingId, product: product._id },\n\t\t\t\t},\n\t\t\t\tupsert: true,\n\t\t\t},\n\t\t}));\n\n\t\tawait this.model.bulkWrite(ops);\n\n\t\treturn products.map(p => p._id as mongoose.Types.ObjectId);\n\t}\n\n\tpublic async countDocuments(filter: QueryDTO): Promise<number> {\n\t\tconst count = await this.model.countDocuments({ ...filter, deletedAt: null });\n\t\treturn count ?? 0;\n\t}\n}\n\nexport const productMarketingService = Container.get(ProductMarketingService);\n"]}
@@ -17,6 +17,18 @@ export interface SpendToGetProgressResult {
17
17
  amountToNextTier?: number;
18
18
  isRedeemable: boolean;
19
19
  }
20
+ export interface SpendToGetTier {
21
+ minSpend: number;
22
+ rewardType: SpendToGetRewardType;
23
+ rewardValue?: number;
24
+ maxDiscountCap?: number;
25
+ isMaxDiscountCapEnabled?: boolean;
26
+ }
27
+ export interface SpendToGetTiersResult {
28
+ marketingId?: mongoose.Types.ObjectId;
29
+ isAppliedByCompany: boolean;
30
+ tiers: SpendToGetTier[];
31
+ }
20
32
  export declare class SpendToGetProgressService {
21
33
  private repository;
22
34
  constructor();
@@ -25,6 +37,7 @@ export declare class SpendToGetProgressService {
25
37
  basketTotal: number;
26
38
  userId?: mongoose.Types.ObjectId;
27
39
  }): Promise<SpendToGetProgressResult>;
40
+ getTiers(shop: mongoose.Types.ObjectId): Promise<SpendToGetTiersResult>;
28
41
  private calculateDiscountAmount;
29
42
  }
30
43
  export declare const spendToGetProgressService: SpendToGetProgressService;
@@ -1 +1 @@
1
- {"version":3,"file":"spend-to-get-progress.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/spend-to-get-progress.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAKzE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACxC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IACpC,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACtB;AAQD,qBACa,yBAAyB;IACrC,OAAO,CAAC,UAAU,CAA+B;;IAYpC,WAAW,CAAC,MAAM,EAAE;QAChC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9B,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;KACjC,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA2DrC,OAAO,CAAC,uBAAuB;CAgB/B;AAED,eAAO,MAAM,yBAAyB,2BAA2C,CAAC"}
1
+ {"version":3,"file":"spend-to-get-progress.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/spend-to-get-progress.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAKzE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACxC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IACpC,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACrC,WAAW,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IACtC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;CACxB;AAaD,qBACa,yBAAyB;IACrC,OAAO,CAAC,UAAU,CAA+B;;IAYpC,WAAW,CAAC,MAAM,EAAE;QAChC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9B,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;KACjC,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgExB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwBpF,OAAO,CAAC,uBAAuB;CAgB/B;AAED,eAAO,MAAM,yBAAyB,2BAA2C,CAAC"}
@@ -53,6 +53,10 @@ const EMPTY_PROGRESS = {
53
53
  discountAmount: 0,
54
54
  isRedeemable: false,
55
55
  };
56
+ const EMPTY_TIERS = {
57
+ isAppliedByCompany: false,
58
+ tiers: [],
59
+ };
56
60
  let SpendToGetProgressService = class SpendToGetProgressService {
57
61
  repository;
58
62
  constructor() {
@@ -100,6 +104,26 @@ let SpendToGetProgressService = class SpendToGetProgressService {
100
104
  isRedeemable: isRedeemable && Boolean(appliedTier),
101
105
  };
102
106
  }
107
+ async getTiers(shop) {
108
+ const marketing = await this.repository.findActiveByShop(shop, (0, dayjs_1.dayjs)().toDate());
109
+ if (!marketing || marketing.tiers.length === 0) {
110
+ return EMPTY_TIERS;
111
+ }
112
+ const tiers = [...marketing.tiers]
113
+ .sort((a, b) => a.minSpend - b.minSpend)
114
+ .map(tier => ({
115
+ minSpend: tier.minSpend,
116
+ rewardType: tier.rewardType,
117
+ rewardValue: tier.rewardValue,
118
+ maxDiscountCap: tier.maxDiscountCap,
119
+ isMaxDiscountCapEnabled: tier.isMaxDiscountCapEnabled,
120
+ }));
121
+ return {
122
+ marketingId: marketing._id,
123
+ isAppliedByCompany: !!marketing.isAppliedByCompany,
124
+ tiers,
125
+ };
126
+ }
103
127
  calculateDiscountAmount(tier, basketTotal) {
104
128
  if (tier.rewardType === enum_1.SpendToGetRewardType.FREE_DELIVERY) {
105
129
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"spend-to-get-progress.service.js","sourceRoot":"/","sources":["modules/marketing/services/spend-to-get-progress.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { mongoose } from '@typegoose/typegoose';\nimport { SpendToGetRewardType } from '@lyxa.ai/core/dist/utilities/enum';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport { spendToGetHistoryService } from '../../spend-to-get-history/spend-to-get-history.service';\nimport { SpendToGetProgressRepository } from './spend-to-get-progress.repository';\n\nexport interface SpendToGetTierProgress {\n\tminSpend: number;\n\trewardType: SpendToGetRewardType;\n\trewardValue?: number;\n\tmaxDiscountCap?: number;\n\tisMaxDiscountCapEnabled?: boolean;\n\tisUnlocked: boolean;\n}\n\nexport interface SpendToGetProgressResult {\n\tmarketing?: mongoose.Types.ObjectId;\n\ttiers: SpendToGetTierProgress[];\n\tappliedTier?: SpendToGetTierProgress;\n\tdiscountAmount: number;\n\tnextTier?: SpendToGetTierProgress;\n\tamountToNextTier?: number;\n\tisRedeemable: boolean;\n}\n\nconst EMPTY_PROGRESS: SpendToGetProgressResult = {\n\ttiers: [],\n\tdiscountAmount: 0,\n\tisRedeemable: false,\n};\n\n@Service()\nexport class SpendToGetProgressService {\n\tprivate repository: SpendToGetProgressRepository;\n\n\tconstructor() {\n\t\tthis.repository = Container.get(SpendToGetProgressRepository);\n\t}\n\n\t/**\n\t * Live progress + eligibility for a shop's active Spend-to-Get promotion, given a basket total.\n\t * Only the highest qualifying tier's reward ever applies (no stacking). Global spend-limit\n\t * exhaustion is read off the existing amountSpent/spendLimit status-flip fields (Marketing base\n\t * model), same source of truth the checkout path uses — no separate live aggregation here.\n\t */\n\tpublic async getProgress(params: {\n\t\tshop: mongoose.Types.ObjectId;\n\t\tbasketTotal: number;\n\t\tuserId?: mongoose.Types.ObjectId;\n\t}): Promise<SpendToGetProgressResult> {\n\t\tconst now = dayjs().toDate();\n\n\t\tconst marketing = await this.repository.findActiveByShop(params.shop, now);\n\n\t\tif (!marketing || marketing.tiers.length === 0) {\n\t\t\treturn EMPTY_PROGRESS;\n\t\t}\n\n\t\tconst budgetExhausted = Boolean(\n\t\t\tmarketing.isSpendLimitEnabled && marketing.spendLimit && (marketing.amountSpent ?? 0) >= marketing.spendLimit\n\t\t);\n\n\t\tconst userLimitReached =\n\t\t\tBoolean(params.userId) && Boolean(marketing.isPerUserLimitEnabled) && Boolean(marketing.perUserLimit)\n\t\t\t\t? await spendToGetHistoryService.hasUserReachedLimit(\n\t\t\t\t\t\tparams.userId as mongoose.Types.ObjectId,\n\t\t\t\t\t\tmarketing._id,\n\t\t\t\t\t\tmarketing.perUserLimit as number\n\t\t\t\t\t)\n\t\t\t\t: false;\n\n\t\tconst isRedeemable = !budgetExhausted && !userLimitReached;\n\n\t\tconst tierProgressList: SpendToGetTierProgress[] = [...marketing.tiers]\n\t\t\t.sort((a, b) => a.minSpend - b.minSpend)\n\t\t\t.map(tier => ({\n\t\t\t\tminSpend: tier.minSpend,\n\t\t\t\trewardType: tier.rewardType,\n\t\t\t\trewardValue: tier.rewardValue,\n\t\t\t\tmaxDiscountCap: tier.maxDiscountCap,\n\t\t\t\tisMaxDiscountCapEnabled: tier.isMaxDiscountCapEnabled,\n\t\t\t\tisUnlocked: params.basketTotal >= tier.minSpend,\n\t\t\t}));\n\n\t\tlet appliedTier: SpendToGetTierProgress | undefined;\n\t\tlet nextTier: SpendToGetTierProgress | undefined;\n\t\tfor (const tier of tierProgressList) {\n\t\t\tif (tier.isUnlocked) {\n\t\t\t\tappliedTier = tier;\n\t\t\t} else if (!nextTier) {\n\t\t\t\tnextTier = tier;\n\t\t\t}\n\t\t}\n\n\t\tconst discountAmount =\n\t\t\tisRedeemable && appliedTier ? this.calculateDiscountAmount(appliedTier, params.basketTotal) : 0;\n\n\t\treturn {\n\t\t\tmarketing: marketing._id,\n\t\t\ttiers: tierProgressList,\n\t\t\tappliedTier: isRedeemable ? appliedTier : undefined,\n\t\t\tdiscountAmount,\n\t\t\tnextTier,\n\t\t\tamountToNextTier: nextTier ? Math.max(nextTier.minSpend - params.basketTotal, 0) : undefined,\n\t\t\tisRedeemable: isRedeemable && Boolean(appliedTier),\n\t\t};\n\t}\n\n\tprivate calculateDiscountAmount(tier: SpendToGetTierProgress, basketTotal: number): number {\n\t\tif (tier.rewardType === SpendToGetRewardType.FREE_DELIVERY) {\n\t\t\t// Free delivery isn't a basket discount amount — the caller applies it as a delivery-fee override.\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (tier.rewardType === SpendToGetRewardType.FIXED) {\n\t\t\treturn tier.rewardValue ?? 0;\n\t\t}\n\n\t\tlet amount = ((tier.rewardValue ?? 0) / 100) * basketTotal;\n\t\tif (tier.isMaxDiscountCapEnabled && tier.maxDiscountCap) {\n\t\t\tamount = Math.min(amount, tier.maxDiscountCap);\n\t\t}\n\t\treturn amount;\n\t}\n}\n\nexport const spendToGetProgressService = Container.get(SpendToGetProgressService);\n"]}
1
+ {"version":3,"file":"spend-to-get-progress.service.js","sourceRoot":"/","sources":["modules/marketing/services/spend-to-get-progress.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { mongoose } from '@typegoose/typegoose';\nimport { SpendToGetRewardType } from '@lyxa.ai/core/dist/utilities/enum';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport { spendToGetHistoryService } from '../../spend-to-get-history/spend-to-get-history.service';\nimport { SpendToGetProgressRepository } from './spend-to-get-progress.repository';\n\nexport interface SpendToGetTierProgress {\n\tminSpend: number;\n\trewardType: SpendToGetRewardType;\n\trewardValue?: number;\n\tmaxDiscountCap?: number;\n\tisMaxDiscountCapEnabled?: boolean;\n\tisUnlocked: boolean;\n}\n\nexport interface SpendToGetProgressResult {\n\tmarketing?: mongoose.Types.ObjectId;\n\ttiers: SpendToGetTierProgress[];\n\tappliedTier?: SpendToGetTierProgress;\n\tdiscountAmount: number;\n\tnextTier?: SpendToGetTierProgress;\n\tamountToNextTier?: number;\n\tisRedeemable: boolean;\n}\n\nexport interface SpendToGetTier {\n\tminSpend: number;\n\trewardType: SpendToGetRewardType;\n\trewardValue?: number;\n\tmaxDiscountCap?: number;\n\tisMaxDiscountCapEnabled?: boolean;\n}\n\nexport interface SpendToGetTiersResult {\n\tmarketingId?: mongoose.Types.ObjectId;\n\tisAppliedByCompany: boolean;\n\ttiers: SpendToGetTier[];\n}\n\nconst EMPTY_PROGRESS: SpendToGetProgressResult = {\n\ttiers: [],\n\tdiscountAmount: 0,\n\tisRedeemable: false,\n};\n\nconst EMPTY_TIERS: SpendToGetTiersResult = {\n\tisAppliedByCompany: false,\n\ttiers: [],\n};\n\n@Service()\nexport class SpendToGetProgressService {\n\tprivate repository: SpendToGetProgressRepository;\n\n\tconstructor() {\n\t\tthis.repository = Container.get(SpendToGetProgressRepository);\n\t}\n\n\t/**\n\t * Live progress + eligibility for a shop's active Spend-to-Get promotion, given a basket total.\n\t * Only the highest qualifying tier's reward ever applies (no stacking). Global spend-limit\n\t * exhaustion is read off the existing amountSpent/spendLimit status-flip fields (Marketing base\n\t * model), same source of truth the checkout path uses — no separate live aggregation here.\n\t */\n\tpublic async getProgress(params: {\n\t\tshop: mongoose.Types.ObjectId;\n\t\tbasketTotal: number;\n\t\tuserId?: mongoose.Types.ObjectId;\n\t}): Promise<SpendToGetProgressResult> {\n\t\tconst now = dayjs().toDate();\n\n\t\tconst marketing = await this.repository.findActiveByShop(params.shop, now);\n\n\t\tif (!marketing || marketing.tiers.length === 0) {\n\t\t\treturn EMPTY_PROGRESS;\n\t\t}\n\n\t\tconst budgetExhausted = Boolean(\n\t\t\tmarketing.isSpendLimitEnabled && marketing.spendLimit && (marketing.amountSpent ?? 0) >= marketing.spendLimit\n\t\t);\n\n\t\tconst userLimitReached =\n\t\t\tBoolean(params.userId) && Boolean(marketing.isPerUserLimitEnabled) && Boolean(marketing.perUserLimit)\n\t\t\t\t? await spendToGetHistoryService.hasUserReachedLimit(\n\t\t\t\t\t\tparams.userId as mongoose.Types.ObjectId,\n\t\t\t\t\t\tmarketing._id,\n\t\t\t\t\t\tmarketing.perUserLimit as number\n\t\t\t\t\t)\n\t\t\t\t: false;\n\n\t\tconst isRedeemable = !budgetExhausted && !userLimitReached;\n\n\t\tconst tierProgressList: SpendToGetTierProgress[] = [...marketing.tiers]\n\t\t\t.sort((a, b) => a.minSpend - b.minSpend)\n\t\t\t.map(tier => ({\n\t\t\t\tminSpend: tier.minSpend,\n\t\t\t\trewardType: tier.rewardType,\n\t\t\t\trewardValue: tier.rewardValue,\n\t\t\t\tmaxDiscountCap: tier.maxDiscountCap,\n\t\t\t\tisMaxDiscountCapEnabled: tier.isMaxDiscountCapEnabled,\n\t\t\t\tisUnlocked: params.basketTotal >= tier.minSpend,\n\t\t\t}));\n\n\t\tlet appliedTier: SpendToGetTierProgress | undefined;\n\t\tlet nextTier: SpendToGetTierProgress | undefined;\n\t\tfor (const tier of tierProgressList) {\n\t\t\tif (tier.isUnlocked) {\n\t\t\t\tappliedTier = tier;\n\t\t\t} else if (!nextTier) {\n\t\t\t\tnextTier = tier;\n\t\t\t}\n\t\t}\n\n\t\tconst discountAmount =\n\t\t\tisRedeemable && appliedTier ? this.calculateDiscountAmount(appliedTier, params.basketTotal) : 0;\n\n\t\treturn {\n\t\t\tmarketing: marketing._id,\n\t\t\ttiers: tierProgressList,\n\t\t\tappliedTier: isRedeemable ? appliedTier : undefined,\n\t\t\tdiscountAmount,\n\t\t\tnextTier,\n\t\t\tamountToNextTier: nextTier ? Math.max(nextTier.minSpend - params.basketTotal, 0) : undefined,\n\t\t\tisRedeemable: isRedeemable && Boolean(appliedTier),\n\t\t};\n\t}\n\n\t/**\n\t * Static tier configuration for a shop's active Spend-to-Get promotion — no basket, no\n\t * eligibility/discount math. For surfaces (e.g. a shop banner) that just list the reward\n\t * ladder before a basket exists.\n\t */\n\tpublic async getTiers(shop: mongoose.Types.ObjectId): Promise<SpendToGetTiersResult> {\n\t\tconst marketing = await this.repository.findActiveByShop(shop, dayjs().toDate());\n\n\t\tif (!marketing || marketing.tiers.length === 0) {\n\t\t\treturn EMPTY_TIERS;\n\t\t}\n\n\t\tconst tiers: SpendToGetTier[] = [...marketing.tiers]\n\t\t\t.sort((a, b) => a.minSpend - b.minSpend)\n\t\t\t.map(tier => ({\n\t\t\t\tminSpend: tier.minSpend,\n\t\t\t\trewardType: tier.rewardType,\n\t\t\t\trewardValue: tier.rewardValue,\n\t\t\t\tmaxDiscountCap: tier.maxDiscountCap,\n\t\t\t\tisMaxDiscountCapEnabled: tier.isMaxDiscountCapEnabled,\n\t\t\t}));\n\n\t\treturn {\n\t\t\tmarketingId: marketing._id,\n\t\t\tisAppliedByCompany: !!marketing.isAppliedByCompany,\n\t\t\ttiers,\n\t\t};\n\t}\n\n\tprivate calculateDiscountAmount(tier: SpendToGetTierProgress, basketTotal: number): number {\n\t\tif (tier.rewardType === SpendToGetRewardType.FREE_DELIVERY) {\n\t\t\t// Free delivery isn't a basket discount amount — the caller applies it as a delivery-fee override.\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (tier.rewardType === SpendToGetRewardType.FIXED) {\n\t\t\treturn tier.rewardValue ?? 0;\n\t\t}\n\n\t\tlet amount = ((tier.rewardValue ?? 0) / 100) * basketTotal;\n\t\tif (tier.isMaxDiscountCapEnabled && tier.maxDiscountCap) {\n\t\t\tamount = Math.min(amount, tier.maxDiscountCap);\n\t\t}\n\t\treturn amount;\n\t}\n}\n\nexport const spendToGetProgressService = Container.get(SpendToGetProgressService);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"synchronize-product-marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/synchronize-product-marketing.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAahD,OAAO,EAAE,6CAA6C,EAAE,MAAM,0FAA0F,CAAC;AAIzJ,qBACa,kCAAkC;IAC9C,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,qBAAqB,CAAmE;;IAQnF,kDAAkD;IAKxD,2CAA2C,CACjD,OAAO,EAAE,6CAA6C,GACpD,MAAM;IAKF,4BAA4B,QAAa,OAAO,CAAC,GAAG,CAAC,CAqC1D;YAEY,oBAAoB;YA2CpB,kCAAkC;IAsCnC,mCAAmC,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;IAqCtE,oCAAoC,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE;IAoI1E,sCAAsC,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE;CAY3F;AAED,eAAO,MAAM,kCAAkC,oCAAoD,CAAC"}
1
+ {"version":3,"file":"synchronize-product-marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/synchronize-product-marketing.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAWhD,OAAO,EAAE,6CAA6C,EAAE,MAAM,0FAA0F,CAAC;AAIzJ,qBACa,kCAAkC;IAC9C,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,qBAAqB,CAAmE;;IAQnF,kDAAkD;IAKxD,2CAA2C,CACjD,OAAO,EAAE,6CAA6C,GACpD,MAAM;IAKF,4BAA4B,QAAa,OAAO,CAAC,GAAG,CAAC,CAqC1D;YAEY,oBAAoB;YA2CpB,kCAAkC;IAsCnC,mCAAmC,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;IAqCtE,oCAAoC,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE;IA8D1E,sCAAsC,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE;CAY3F;AAED,eAAO,MAAM,kCAAkC,oCAAoD,CAAC"}