@lyxa.ai/marketing 1.0.42 → 1.0.44

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 (194) hide show
  1. package/dist/lib/event/event-initializations.d.ts.map +1 -1
  2. package/dist/lib/event/event-initializations.js +2 -0
  3. package/dist/lib/event/event-initializations.js.map +1 -1
  4. package/dist/lib/event/event-listeners/event-listeners.d.ts +2 -0
  5. package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -1
  6. package/dist/lib/event/event-listeners/event-listeners.js +59 -0
  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 +17 -0
  9. package/dist/lib/event/events/marketing-product-seed.event.d.ts.map +1 -0
  10. package/dist/lib/event/events/marketing-product-seed.event.js +12 -0
  11. package/dist/lib/event/events/marketing-product-seed.event.js.map +1 -0
  12. package/dist/lib/index.d.ts +224 -82
  13. package/dist/lib/index.d.ts.map +1 -1
  14. package/dist/lib/modules/coupon/routers/coupon.router.d.ts +118 -0
  15. package/dist/lib/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  16. package/dist/lib/modules/coupon/routers/coupon.router.js +33 -1
  17. package/dist/lib/modules/coupon/routers/coupon.router.js.map +1 -1
  18. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts +32 -0
  19. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -0
  20. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js +504 -0
  21. package/dist/lib/modules/coupon/services/patterns/repository/CouponMetricsRepository.js.map +1 -0
  22. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts +420 -1
  23. package/dist/lib/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  24. package/dist/lib/modules/coupon/validations/coupon.validation.js +40 -1
  25. package/dist/lib/modules/coupon/validations/coupon.validation.js.map +1 -1
  26. package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts +1118 -0
  27. package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -0
  28. package/dist/lib/modules/coupon/validations/create-coupon.validation.js +13 -0
  29. package/dist/lib/modules/coupon/validations/create-coupon.validation.js.map +1 -0
  30. package/dist/lib/modules/coupon/validations/index.d.ts +1 -0
  31. package/dist/lib/modules/coupon/validations/index.d.ts.map +1 -1
  32. package/dist/lib/modules/coupon/validations/index.js +1 -0
  33. package/dist/lib/modules/coupon/validations/index.js.map +1 -1
  34. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts +29 -72
  35. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
  36. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js +3 -16
  37. package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js.map +1 -1
  38. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts +36 -0
  39. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts.map +1 -0
  40. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.js +48 -0
  41. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.js.map +1 -0
  42. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts +22 -0
  43. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts.map +1 -0
  44. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.js +131 -0
  45. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.js.map +1 -0
  46. package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +78 -78
  47. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +1 -2
  48. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
  49. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js +6 -11
  50. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js.map +1 -1
  51. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +16 -51
  52. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
  53. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js +33 -156
  54. package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js.map +1 -1
  55. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.builder.d.ts +8 -0
  56. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.builder.d.ts.map +1 -0
  57. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.builder.js +13 -0
  58. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.builder.js.map +1 -0
  59. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.repository.d.ts +14 -0
  60. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.repository.d.ts.map +1 -0
  61. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.repository.js +77 -0
  62. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.repository.js.map +1 -0
  63. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts +1 -2
  64. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts.map +1 -1
  65. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.js +19 -26
  66. package/dist/lib/modules/limited-time-offer/config/limited-time-offer-config.service.js.map +1 -1
  67. package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.d.ts.map +1 -1
  68. package/dist/lib/modules/limited-time-offer/config/limited-time-offer.router.js.map +1 -1
  69. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts +92 -77
  70. package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -1
  71. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts +53 -0
  72. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts.map +1 -0
  73. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.js +55 -0
  74. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.js.map +1 -0
  75. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts +21 -0
  76. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts.map +1 -0
  77. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.js +142 -0
  78. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.js.map +1 -0
  79. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +63 -5
  80. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
  81. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js +8 -2
  82. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js.map +1 -1
  83. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +1 -0
  84. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +1 -0
  85. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js +2 -0
  86. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js.map +1 -0
  87. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +161 -27
  88. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -1
  89. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js +11 -9
  90. package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js.map +1 -1
  91. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +6 -1
  92. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
  93. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js +17 -38
  94. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js.map +1 -1
  95. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +20 -8
  96. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
  97. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js +38 -27
  98. package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js.map +1 -1
  99. package/dist/lib/modules/marketing/routers/marketing.router.d.ts +12 -3
  100. package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  101. package/dist/lib/modules/marketing/routers/marketing.router.js +7 -0
  102. package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -1
  103. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
  104. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js +11 -9
  105. package/dist/lib/modules/marketing/services/buy1-get1-marketing.service.js.map +1 -1
  106. package/dist/lib/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
  107. package/dist/lib/modules/marketing/services/discount-marketing.service.js +15 -13
  108. package/dist/lib/modules/marketing/services/discount-marketing.service.js.map +1 -1
  109. package/dist/lib/modules/marketing/services/marketing.service.d.ts +1 -0
  110. package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
  111. package/dist/lib/modules/marketing/services/marketing.service.js +57 -7
  112. package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
  113. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +11 -0
  114. package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  115. package/dist/lib/modules/marketing/services/product-marketing.service.js +23 -0
  116. package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -1
  117. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  118. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js +6 -31
  119. package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js.map +1 -1
  120. package/dist/lib/modules/marketing/validations/marketing.validation.d.ts +2 -2
  121. package/dist/lib/modules/marketing/validations/product-marketing.validation.d.ts +2 -2
  122. package/dist/lib/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +2 -2
  123. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts +1 -0
  124. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts.map +1 -1
  125. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js +14 -0
  126. package/dist/lib/modules/punch-marketing-history/services/punch-marketing-history.service.js.map +1 -1
  127. package/dist/lib/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +4 -4
  128. package/dist/types/event/event-initializations.d.ts.map +1 -1
  129. package/dist/types/event/event-listeners/event-listeners.d.ts +2 -0
  130. package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -1
  131. package/dist/types/event/events/marketing-product-seed.event.d.ts +17 -0
  132. package/dist/types/event/events/marketing-product-seed.event.d.ts.map +1 -0
  133. package/dist/types/index.d.ts +224 -82
  134. package/dist/types/index.d.ts.map +1 -1
  135. package/dist/types/modules/coupon/routers/coupon.router.d.ts +118 -0
  136. package/dist/types/modules/coupon/routers/coupon.router.d.ts.map +1 -1
  137. package/dist/types/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts +32 -0
  138. package/dist/types/modules/coupon/services/patterns/repository/CouponMetricsRepository.d.ts.map +1 -0
  139. package/dist/types/modules/coupon/validations/coupon.validation.d.ts +420 -1
  140. package/dist/types/modules/coupon/validations/coupon.validation.d.ts.map +1 -1
  141. package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts +1118 -0
  142. package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -0
  143. package/dist/types/modules/coupon/validations/index.d.ts +1 -0
  144. package/dist/types/modules/coupon/validations/index.d.ts.map +1 -1
  145. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts +29 -72
  146. package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
  147. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts +36 -0
  148. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts.map +1 -0
  149. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts +22 -0
  150. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts.map +1 -0
  151. package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +78 -78
  152. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +1 -2
  153. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
  154. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +16 -51
  155. package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
  156. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.builder.d.ts +8 -0
  157. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.builder.d.ts.map +1 -0
  158. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.repository.d.ts +14 -0
  159. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.repository.d.ts.map +1 -0
  160. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts +1 -2
  161. package/dist/types/modules/limited-time-offer/config/limited-time-offer-config.service.d.ts.map +1 -1
  162. package/dist/types/modules/limited-time-offer/config/limited-time-offer.router.d.ts.map +1 -1
  163. package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts +92 -77
  164. package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -1
  165. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts +53 -0
  166. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts.map +1 -0
  167. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts +21 -0
  168. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts.map +1 -0
  169. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +63 -5
  170. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
  171. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +161 -27
  172. package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -1
  173. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +6 -1
  174. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
  175. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +20 -8
  176. package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
  177. package/dist/types/modules/marketing/routers/marketing.router.d.ts +12 -3
  178. package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
  179. package/dist/types/modules/marketing/services/buy1-get1-marketing.service.d.ts.map +1 -1
  180. package/dist/types/modules/marketing/services/discount-marketing.service.d.ts.map +1 -1
  181. package/dist/types/modules/marketing/services/marketing.service.d.ts +1 -0
  182. package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
  183. package/dist/types/modules/marketing/services/product-marketing.service.d.ts +11 -0
  184. package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
  185. package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
  186. package/dist/types/modules/marketing/validations/marketing.validation.d.ts +2 -2
  187. package/dist/types/modules/marketing/validations/product-marketing.validation.d.ts +2 -2
  188. package/dist/types/modules/punch-marketing-history/routers/punch-marketing-history.router.d.ts +2 -2
  189. package/dist/types/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts +1 -0
  190. package/dist/types/modules/punch-marketing-history/services/punch-marketing-history.service.d.ts.map +1 -1
  191. package/dist/types/modules/punch-marketing-history/validations/punch-marketing-history.validation.d.ts +4 -4
  192. package/package.json +3 -3
  193. package/dist/types/events/event-initializations.d.ts +0 -2
  194. package/dist/types/events/event-initializations.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"synchronize-product-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/synchronize-product-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { mongoose } from '@typegoose/typegoose';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { ProductModel, Product as Model, Setting } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { addProductMarketingInfo } from '@lyxa.ai/core/dist/utilities/pipelines/product-pipeline-stages';\nimport { publishAllProductsProductMarketingInfoProcessEvent } from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport { SynchronizeAllProductsProductMarketingInfoDTO } from '@lyxa.ai/core/dist/libraries/event/events/sync-all-products-product-marketing-info-event';\n@Service()\nexport class SynchronizeProductMarketingService {\n\tprivate productModel: typeof ProductModel & SoftDeleteModel<Model>;\n\n\tconstructor() {\n\t\tthis.productModel = ProductModel as typeof ProductModel & SoftDeleteModel<Model>;\n\t}\n\n\tpublic async publishAllProductsProductMarketingInfoProcessEvent() {\n\t\tawait publishAllProductsProductMarketingInfoProcessEvent({});\n\t\treturn 'Processing all products product marketing information! ';\n\t}\n\n\tpublic processAllProductsProductMarketingInfoEvent(\n\t\tpayload: SynchronizeAllProductsProductMarketingInfoDTO\n\t): string {\n\t\tthis.syncAllProductsMarketingInfo();\n\t\treturn 'Processing all products product marketing information! ';\n\t}\n\n\tpublic syncAllProductsMarketingInfo = async (): Promise<any> => {\n\t\tconst CHUNK_SIZE = 500;\n\n\t\tconsole.time('TOTAL_SYNC_TIME');\n\t\tconsole.log('[SYNC] Starting product marketing info sync');\n\n\t\tconst cursor = this.productModel.find().select('_id shop price priceBreakdowns').lean().cursor();\n\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tlet batch: any[] = [];\n\t\tlet batchIndex = 0;\n\t\tlet totalProcessed = 0;\n\n\t\tfor await (const product of cursor) {\n\t\t\tbatch.push(product);\n\n\t\t\tif (batch.length === CHUNK_SIZE) {\n\t\t\t\tbatchIndex++;\n\t\t\t\ttotalProcessed += batch.length;\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[SYNC][BATCH ${batchIndex}] Processing ${batch.length} products (Total processed: ${totalProcessed})`\n\t\t\t\t);\n\n\t\t\t\tconsole.time(`[BATCH ${batchIndex}] TIME`);\n\t\t\t\tawait this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);\n\t\t\t\tconsole.timeEnd(`[BATCH ${batchIndex}] TIME`);\n\n\t\t\t\tbatch = [];\n\t\t\t}\n\t\t}\n\n\t\t// Process remaining products\n\t\tif (batch.length) {\n\t\t\tbatchIndex++;\n\t\t\ttotalProcessed += batch.length;\n\n\t\t\tconsole.log(\n\t\t\t\t`[SYNC][BATCH ${batchIndex}] Processing remaining ${batch.length} products (Total processed: ${totalProcessed})`\n\t\t\t);\n\n\t\t\tconsole.time(`[BATCH ${batchIndex}] TIME`);\n\t\t\tawait this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);\n\t\t\tconsole.timeEnd(`[BATCH ${batchIndex}] TIME`);\n\t\t}\n\n\t\tconsole.log(`[SYNC] Completed. Total batches: ${batchIndex}, Total products: ${totalProcessed}`);\n\t\tconsole.timeEnd('TOTAL_SYNC_TIME');\n\n\t\treturn 'Bulk product marketing info sync completed';\n\t};\n\n\tprivate async processProductsBatch(\n\t\tproductsBatch: any[],\n\t\texchangeRate: number,\n\t\tsecondaryCurrencyName: string,\n\t\tbatchIndex: number\n\t): Promise<void> {\n\t\tconst productIds = productsBatch.map(p => p._id);\n\n\t\tconsole.log(\n\t\t\t`[BATCH ${batchIndex}] Aggregating marketing info for ${productIds.length} products`,\n\t\t\t`| First ID: ${productIds[0]}`,\n\t\t\t`| Last ID: ${productIds[productIds.length - 1]}`\n\t\t);\n\n\t\tconst results = await this.productModel.aggregate([\n\t\t\t{ $match: { _id: { $in: productIds } } },\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tproductMarketingInfo: { $push: '$productMarketing' },\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tconsole.log(`[BATCH ${batchIndex}] Aggregation completed. Result count: ${results.length}`);\n\t\tconst bulkOps = results.map(r => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { _id: r._id },\n\t\t\t\tupdate: {\n\t\t\t\t\t$set: {\n\t\t\t\t\t\tproductMarketingInfo: (r.productMarketingInfo ?? []).filter(Boolean).map((pm: any) => ({\n\t\t\t\t\t\t\tmarketing: pm.marketingInfo,\n\t\t\t\t\t\t\tisBuy1Get1: pm.isBuy1Get1,\n\t\t\t\t\t\t\tvalueType: pm.valueType,\n\t\t\t\t\t\t\tvalue: pm.value,\n\t\t\t\t\t\t\tsecondaryCurrencyValue: pm.secondaryCurrencyValue,\n\t\t\t\t\t\t\tlabel: pm.label,\n\t\t\t\t\t\t\tisAppliedByCompany: pm.isAppliedByCompany ?? false,\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\tif (bulkOps.length) {\n\t\t\tconsole.log(`[BATCH ${batchIndex}] bulkWrite started (${bulkOps.length} ops)`);\n\t\t\tawait this.productModel.bulkWrite(bulkOps, { ordered: false });\n\t\t\tconsole.log(`[BATCH ${batchIndex}] bulkWrite completed`);\n\t\t} else {\n\t\t\tconsole.log(`[BATCH ${batchIndex}] No bulk operations to write`);\n\t\t}\n\t}\n\n\tprivate async getProductMarketingInfoByProductId(productId: mongoose.Types.ObjectId): Promise<any[]> {\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tconst result = await this.productModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: { _id: productId },\n\t\t\t},\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tproductMarketingInfo: {\n\t\t\t\t\t\t$push: '$productMarketing',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tconst productMarketingInfo = result?.[0]?.productMarketing\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tmarketing: result?.[0].productMarketing.marketingInfo,\n\t\t\t\t\t\tisBuy1Get1: result?.[0].productMarketing.isBuy1Get1,\n\t\t\t\t\t\tvalueType: result?.[0].productMarketing.valueType,\n\t\t\t\t\t\tvalue: result?.[0].productMarketing.value,\n\t\t\t\t\t\tsecondaryCurrencyValue: result?.[0].productMarketing.secondaryCurrencyValue,\n\t\t\t\t\t\tlabel: result?.[0].productMarketing.label,\n\t\t\t\t\t\tisAppliedByCompany: result?.[0].productMarketing.isAppliedByCompany ?? false,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t: [];\n\n\t\treturn productMarketingInfo;\n\t}\n\n\tpublic async syncProductMarketingInfoByProductId(productId: mongoose.Types.ObjectId) {\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\t\tconst result = await this.productModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t_id: productId,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t]);\n\n\t\tconst productMarketingInfo = (result || [])\n\t\t\t.filter(item => item?.productMarketing)\n\t\t\t.map(item => ({\n\t\t\t\tmarketing: item.productMarketing.marketingInfo,\n\t\t\t\tisBuy1Get1: item.productMarketing.isBuy1Get1,\n\t\t\t\tvalueType: item.productMarketing.valueType,\n\t\t\t\tvalue: item.productMarketing.value,\n\t\t\t\tsecondaryCurrencyValue: item.productMarketing.secondaryCurrencyValue,\n\t\t\t\tlabel: item.productMarketing.label,\n\t\t\t\tisAppliedByCompany: item.productMarketing.isAppliedByCompany ?? false,\n\t\t\t}));\n\n\t\tawait this.productModel.updateOne(\n\t\t\t{ _id: productId },\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tproductMarketingInfo,\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t\treturn 'Synchronized product marketing info';\n\t}\n\n\tpublic async syncProductMarketingInfoByProductIds(productIds: mongoose.Types.ObjectId[]) {\n\t\tconsole.time('SYNC_PRODUCT_IDS_TIME');\n\t\tconsole.log(`Starting sync for ${productIds.length} product IDs`); // Debug log\n\t\tif (!productIds.length) return 'No products to sync';\n\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tconst BATCH_SIZE = 500;\n\t\tconst results: any[] = [];\n\n\t\tconst totalBatches = Math.ceil(productIds.length / BATCH_SIZE);\n\n\t\tconsole.time('[ProductAggregate] Total Execution');\n\n\t\tfor (let i = 0; i < productIds.length; i += BATCH_SIZE) {\n\t\t\tconst batchIndex = i / BATCH_SIZE + 1;\n\t\t\tconst batchIds = productIds.slice(i, i + BATCH_SIZE);\n\n\t\t\tconst label = `[ProductAggregate] Batch ${batchIndex}/${totalBatches}`;\n\n\t\t\tconsole.log(`${label} → starting (${batchIds.length} ids)`);\n\t\t\tconsole.time(label);\n\n\t\t\tconst batchResults = await this.productModel.aggregate([\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t_id: { $in: batchIds },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: '$_id',\n\t\t\t\t\t\tproductMarketingInfo: {\n\t\t\t\t\t\t\t$push: '$productMarketing',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconsole.timeEnd(label);\n\t\t\tconsole.log(`${label} → completed (${batchResults.length} docs)`);\n\n\t\t\tresults.push(...batchResults);\n\t\t}\n\n\t\tconsole.timeEnd('[ProductAggregate] Total Execution');\n\n\t\tconsole.log(`[ProductAggregate] Total results: ${results.length}`);\n\n\t\tif (!results.length) return 'No matching products found';\n\n\t\tconst bulkOps = results.map(product => {\n\t\t\tconst productMarketingInfo = (product.productMarketingInfo || []).map((pm: any) => ({\n\t\t\t\tmarketing: pm.marketingInfo,\n\t\t\t\tisBuy1Get1: pm.isBuy1Get1,\n\t\t\t\tvalueType: pm.valueType,\n\t\t\t\tvalue: pm.value,\n\t\t\t\tsecondaryCurrencyValue: pm.secondaryCurrencyValue,\n\t\t\t\tlabel: pm.label,\n\t\t\t\tisAppliedByCompany: pm.isAppliedByCompany ?? false,\n\t\t\t}));\n\n\t\t\treturn {\n\t\t\t\tupdateOne: {\n\t\t\t\t\tfilter: { _id: product._id },\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\t$set: { productMarketingInfo },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\tconsole.timeEnd('SYNC_PRODUCT_IDS_TIME');\n\n\t\tconsole.time('BULK_WRITE_TIME');\n\t\tawait this.productModel.bulkWrite(bulkOps);\n\n\t\tconsole.timeEnd('BULK_WRITE_TIME');\n\n\t\treturn `Synchronized product marketing info for ${bulkOps.length} products`;\n\t}\n}\n\nexport const synchronizeProductMarketingService = Container.get(SynchronizeProductMarketingService);\n"]}
1
+ {"version":3,"file":"synchronize-product-marketing.service.js","sourceRoot":"/","sources":["modules/marketing/services/synchronize-product-marketing.service.ts"],"names":[],"mappings":"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","sourcesContent":["import Container, { Service } from 'typedi';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { mongoose } from '@typegoose/typegoose';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport { ProductModel, Product as Model, Setting } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { addProductMarketingInfo } from '@lyxa.ai/core/dist/utilities/pipelines/product-pipeline-stages';\nimport { publishAllProductsProductMarketingInfoProcessEvent } from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport { SynchronizeAllProductsProductMarketingInfoDTO } from '@lyxa.ai/core/dist/libraries/event/events/sync-all-products-product-marketing-info-event';\n\nconst TAG = 'marketing.seed.entire-menu';\n\n@Service()\nexport class SynchronizeProductMarketingService {\n\tprivate productModel: typeof ProductModel & SoftDeleteModel<Model>;\n\n\tconstructor() {\n\t\tthis.productModel = ProductModel as typeof ProductModel & SoftDeleteModel<Model>;\n\t}\n\n\tpublic async publishAllProductsProductMarketingInfoProcessEvent() {\n\t\tawait publishAllProductsProductMarketingInfoProcessEvent({});\n\t\treturn 'Processing all products product marketing information! ';\n\t}\n\n\tpublic processAllProductsProductMarketingInfoEvent(\n\t\tpayload: SynchronizeAllProductsProductMarketingInfoDTO\n\t): string {\n\t\tthis.syncAllProductsMarketingInfo();\n\t\treturn 'Processing all products product marketing information! ';\n\t}\n\n\tpublic syncAllProductsMarketingInfo = async (): Promise<any> => {\n\t\tconst logger = getLibraries().getLoggerKit();\n\t\tconst CHUNK_SIZE = 500;\n\n\t\tconst cursor = this.productModel.find().select('_id shop price priceBreakdowns').lean().cursor();\n\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tlet batch: any[] = [];\n\t\tlet batchIndex = 0;\n\t\tlet totalProcessed = 0;\n\n\t\tfor await (const product of cursor) {\n\t\t\tbatch.push(product);\n\n\t\t\tif (batch.length === CHUNK_SIZE) {\n\t\t\t\tbatchIndex++;\n\t\t\t\ttotalProcessed += batch.length;\n\t\t\t\tawait this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);\n\t\t\t\tbatch = [];\n\t\t\t}\n\t\t}\n\n\t\tif (batch.length) {\n\t\t\tbatchIndex++;\n\t\t\ttotalProcessed += batch.length;\n\t\t\tawait this.processProductsBatch(batch, exchangeRate, secondaryCurrencyName, batchIndex);\n\t\t}\n\n\t\tlogger.debug('full product marketing sync complete', {\n\t\t\ttag: TAG,\n\t\t\tdata: { totalProducts: totalProcessed },\n\t\t});\n\n\t\treturn 'Bulk product marketing info sync completed';\n\t};\n\n\tprivate async processProductsBatch(\n\t\tproductsBatch: any[],\n\t\texchangeRate: number,\n\t\tsecondaryCurrencyName: string,\n\t\tbatchIndex: number\n\t): Promise<void> {\n\t\tconst productIds = productsBatch.map(p => p._id);\n\n\t\tconst results = await this.productModel.aggregate([\n\t\t\t{ $match: { _id: { $in: productIds } } },\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tproductMarketingInfo: { $push: '$productMarketing' },\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tconst bulkOps = results.map(r => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { _id: r._id },\n\t\t\t\tupdate: {\n\t\t\t\t\t$set: {\n\t\t\t\t\t\tproductMarketingInfo: (r.productMarketingInfo ?? []).filter(Boolean).map((pm: any) => ({\n\t\t\t\t\t\t\tmarketing: pm.marketingInfo,\n\t\t\t\t\t\t\tisBuy1Get1: pm.isBuy1Get1,\n\t\t\t\t\t\t\tvalueType: pm.valueType,\n\t\t\t\t\t\t\tvalue: pm.value,\n\t\t\t\t\t\t\tsecondaryCurrencyValue: pm.secondaryCurrencyValue,\n\t\t\t\t\t\t\tlabel: pm.label,\n\t\t\t\t\t\t\tisAppliedByCompany: pm.isAppliedByCompany ?? false,\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\tif (bulkOps.length) {\n\t\t\tawait this.productModel.bulkWrite(bulkOps, { ordered: false });\n\t\t}\n\t}\n\n\tprivate async getProductMarketingInfoByProductId(productId: mongoose.Types.ObjectId): Promise<any[]> {\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tconst result = await this.productModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: { _id: productId },\n\t\t\t},\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t{\n\t\t\t\t$group: {\n\t\t\t\t\t_id: '$_id',\n\t\t\t\t\tproductMarketingInfo: {\n\t\t\t\t\t\t$push: '$productMarketing',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\n\t\tconst productMarketingInfo = result?.[0]?.productMarketing\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tmarketing: result?.[0].productMarketing.marketingInfo,\n\t\t\t\t\t\tisBuy1Get1: result?.[0].productMarketing.isBuy1Get1,\n\t\t\t\t\t\tvalueType: result?.[0].productMarketing.valueType,\n\t\t\t\t\t\tvalue: result?.[0].productMarketing.value,\n\t\t\t\t\t\tsecondaryCurrencyValue: result?.[0].productMarketing.secondaryCurrencyValue,\n\t\t\t\t\t\tlabel: result?.[0].productMarketing.label,\n\t\t\t\t\t\tisAppliedByCompany: result?.[0].productMarketing.isAppliedByCompany ?? false,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t: [];\n\n\t\treturn productMarketingInfo;\n\t}\n\n\tpublic async syncProductMarketingInfoByProductId(productId: mongoose.Types.ObjectId) {\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\t\tconst result = await this.productModel.aggregate([\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t_id: productId,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t]);\n\n\t\tconst productMarketingInfo = (result || [])\n\t\t\t.filter(item => item?.productMarketing)\n\t\t\t.map(item => ({\n\t\t\t\tmarketing: item.productMarketing.marketingInfo,\n\t\t\t\tisBuy1Get1: item.productMarketing.isBuy1Get1,\n\t\t\t\tvalueType: item.productMarketing.valueType,\n\t\t\t\tvalue: item.productMarketing.value,\n\t\t\t\tsecondaryCurrencyValue: item.productMarketing.secondaryCurrencyValue,\n\t\t\t\tlabel: item.productMarketing.label,\n\t\t\t\tisAppliedByCompany: item.productMarketing.isAppliedByCompany ?? false,\n\t\t\t}));\n\n\t\tawait this.productModel.updateOne(\n\t\t\t{ _id: productId },\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tproductMarketingInfo,\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t\treturn 'Synchronized product marketing info';\n\t}\n\n\tpublic async syncProductMarketingInfoByProductIds(productIds: mongoose.Types.ObjectId[]) {\n\t\tif (!productIds.length) return 'No products to sync';\n\n\t\tconst adminSettings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst exchangeRate = adminSettings?.currencySetting?.exchangeRate ?? 0;\n\t\tconst secondaryCurrencyName = adminSettings?.currencySetting?.secondaryCurrency?.name ?? 'LBP';\n\n\t\tconst BATCH_SIZE = 500;\n\t\tconst results: any[] = [];\n\t\tconst totalBatches = Math.ceil(productIds.length / BATCH_SIZE);\n\n\t\tfor (let i = 0; i < productIds.length; i += BATCH_SIZE) {\n\t\t\tconst batchIds = productIds.slice(i, i + BATCH_SIZE);\n\n\t\t\tconst batchResults = await this.productModel.aggregate([\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t_id: { $in: batchIds },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t...addProductMarketingInfo(exchangeRate, secondaryCurrencyName),\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: '$_id',\n\t\t\t\t\t\tproductMarketingInfo: {\n\t\t\t\t\t\t\t$push: '$productMarketing',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tresults.push(...batchResults);\n\t\t}\n\n\t\tif (!results.length) return 'No matching products found';\n\n\t\tconst bulkOps = results.map(product => {\n\t\t\tconst productMarketingInfo = (product.productMarketingInfo || []).map((pm: any) => ({\n\t\t\t\tmarketing: pm.marketingInfo,\n\t\t\t\tisBuy1Get1: pm.isBuy1Get1,\n\t\t\t\tvalueType: pm.valueType,\n\t\t\t\tvalue: pm.value,\n\t\t\t\tsecondaryCurrencyValue: pm.secondaryCurrencyValue,\n\t\t\t\tlabel: pm.label,\n\t\t\t\tisAppliedByCompany: pm.isAppliedByCompany ?? false,\n\t\t\t}));\n\n\t\t\treturn {\n\t\t\t\tupdateOne: {\n\t\t\t\t\tfilter: { _id: product._id },\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\t$set: { productMarketingInfo },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\tawait this.productModel.bulkWrite(bulkOps);\n\n\t\treturn `Synchronized product marketing info for ${bulkOps.length} products`;\n\t}\n}\n\nexport const synchronizeProductMarketingService = Container.get(SynchronizeProductMarketingService);\n"]}
@@ -259,12 +259,12 @@ export declare const MarketingGraphInputSchema: z.ZodObject<{
259
259
  }, "strip", z.ZodTypeAny, {
260
260
  type: GraphType;
261
261
  startDate: Date;
262
- marketingId: string | import("mongoose").Types.ObjectId;
263
262
  endDate: Date;
263
+ marketingId: string | import("mongoose").Types.ObjectId;
264
264
  }, {
265
265
  startDate: string | Date;
266
- marketingId: string | import("mongoose").Types.ObjectId;
267
266
  endDate: string | Date;
267
+ marketingId: string | import("mongoose").Types.ObjectId;
268
268
  type?: GraphType | undefined;
269
269
  }>;
270
270
  export declare const MarketingOrdersGraphOutputSchema: z.ZodArray<z.ZodObject<{
@@ -190,8 +190,8 @@ export declare const BatchCreateProductMarketingsInputSchema: z.ZodObject<{
190
190
  value?: number | undefined;
191
191
  valueType?: ValueType | null | undefined;
192
192
  }[];
193
- isBuy1Get1: boolean;
194
193
  marketingId: import("mongoose").Types.ObjectId;
194
+ isBuy1Get1: boolean;
195
195
  categories: import("mongoose").Types.ObjectId[];
196
196
  isEntireMenu: boolean;
197
197
  value?: number | undefined;
@@ -201,8 +201,8 @@ export declare const BatchCreateProductMarketingsInputSchema: z.ZodObject<{
201
201
  categoryValueType?: ValueType | undefined;
202
202
  }, {
203
203
  shop: string | import("mongoose").Types.ObjectId;
204
- isBuy1Get1: boolean;
205
204
  marketingId: string | import("mongoose").Types.ObjectId;
205
+ isBuy1Get1: boolean;
206
206
  isEntireMenu: boolean;
207
207
  value?: number | undefined;
208
208
  valueType?: ValueType | undefined;
@@ -18,15 +18,15 @@ export declare const punchMarketingHistoryRouter: import("@trpc/server").TRPCBui
18
18
  input: {
19
19
  user: string | import("mongoose").Types.ObjectId;
20
20
  shop: string | import("mongoose").Types.ObjectId;
21
- marketing: string | import("mongoose").Types.ObjectId;
22
21
  minimumOrderValue: number;
22
+ marketing: string | import("mongoose").Types.ObjectId;
23
23
  targetOrder: number;
24
24
  couponValueType: import("@lyxa.ai/core/dist/utilities/enum").ValueType;
25
25
  couponValue: number;
26
26
  couponDurationInDays: number;
27
27
  status?: import("@lyxa.ai/core/dist/utilities/enum").PunchMarketingStatus | undefined;
28
- completedOrder?: number | undefined;
29
28
  startDate?: string | Date | undefined;
29
+ completedOrder?: number | undefined;
30
30
  expiryDate?: string | Date | undefined;
31
31
  completedAt?: string | Date | undefined;
32
32
  couponExpiryDate?: string | Date | undefined;
@@ -20,6 +20,7 @@ export declare class PunchMarketingHistoryService {
20
20
  applyPunchDiscountToOrder(userId: mongoose.Types.ObjectId, orderId: mongoose.Types.ObjectId): Promise<void>;
21
21
  getPunchDiscount(data: ValidateCouponDTO): Promise<CouponValidationOutputDTO>;
22
22
  getPunchCoupon(user: mongoose.Types.ObjectId, shop: mongoose.Types.ObjectId): Promise<any>;
23
+ returnPunchCoupon(orderId: mongoose.Types.ObjectId): Promise<void>;
23
24
  }
24
25
  export declare const punchMarketingHistoryService: PunchMarketingHistoryService;
25
26
  //# sourceMappingURL=punch-marketing-history.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"punch-marketing-history.service.d.ts","sourceRoot":"/","sources":["modules/punch-marketing-history/services/punch-marketing-history.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAElG,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAEN,qBAAqB,IAAI,KAAK,EAK9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACN,8BAA8B,IAAI,SAAS,EAC3C,mBAAmB,EACnB,8BAA8B,IAAI,SAAS,EAC3C,MAAM,8CAA8C,CAAC;AAWtD,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAO3F,qBACa,4BAA4B;IACxC,OAAO,CAAC,KAAK,CAA6D;IAC1E,OAAO,CAAC,cAAc,CAA+D;IACrF,OAAO,CAAC,UAAU,CAA2D;;IAYhE,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAQrD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAkB5E,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAyB3F,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;IAuCzD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA2BjE,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB5C,oBAAoB,CAChC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC/B,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAC9B,OAAO,CAAC,MAAM,CAAC;YA0DJ,gBAAgB;IA+CjB,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;IA0C3F,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA2D7E,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;CA4CvG;AAED,eAAO,MAAM,4BAA4B,8BAA8C,CAAC"}
1
+ {"version":3,"file":"punch-marketing-history.service.d.ts","sourceRoot":"/","sources":["modules/punch-marketing-history/services/punch-marketing-history.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAElG,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAEN,qBAAqB,IAAI,KAAK,EAK9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACN,8BAA8B,IAAI,SAAS,EAC3C,mBAAmB,EACnB,8BAA8B,IAAI,SAAS,EAC3C,MAAM,8CAA8C,CAAC;AAWtD,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAO3F,qBACa,4BAA4B;IACxC,OAAO,CAAC,KAAK,CAA6D;IAC1E,OAAO,CAAC,cAAc,CAA+D;IACrF,OAAO,CAAC,UAAU,CAA2D;;IAYhE,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAQrD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAkB5E,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAyB3F,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;IAuCzD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA2BjE,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB5C,oBAAoB,CAChC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC/B,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAC9B,OAAO,CAAC,MAAM,CAAC;YA0DJ,gBAAgB;IA+CjB,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;IA0C3F,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA2D7E,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IA6C1F,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB/E;AAED,eAAO,MAAM,4BAA4B,8BAA8C,CAAC"}
@@ -362,6 +362,20 @@ let PunchMarketingHistoryService = class PunchMarketingHistoryService {
362
362
  };
363
363
  return punchCoupon;
364
364
  }
365
+ async returnPunchCoupon(orderId) {
366
+ await this.model.findOneAndUpdate({
367
+ order: orderId,
368
+ status: enum_1.PunchMarketingStatus.COUPON_USED,
369
+ }, {
370
+ $set: {
371
+ status: enum_1.PunchMarketingStatus.COMPLETED,
372
+ order: null,
373
+ },
374
+ }, {
375
+ new: true,
376
+ runValidators: true,
377
+ });
378
+ }
365
379
  };
366
380
  exports.PunchMarketingHistoryService = PunchMarketingHistoryService;
367
381
  exports.PunchMarketingHistoryService = PunchMarketingHistoryService = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"punch-marketing-history.service.js","sourceRoot":"/","sources":["modules/punch-marketing-history/services/punch-marketing-history.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { notFoundError } from '@lyxa.ai/core/dist/utilities/error-common';\nimport Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport { FilterDTO, PaginatedResponse, DeleteDTO } 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 {\n\tPunchMarketingHistoryModel,\n\tPunchMarketingHistory as Model,\n\tPunchMarketingModel,\n\tPunchMarketing,\n\tRegularOrder,\n\tRegularOrderModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tCreatePunchMarketingHistoryDTO as CreateDTO,\n\tGetByUserAndShopDTO,\n\tUpdatePunchMarketingHistoryDTO as UpdateDTO,\n} from '@modules/punch-marketing-history/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport {\n\tCouponType,\n\tMarketingType,\n\tPunchMarketingStatus,\n\tStatus,\n\tValueType,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport { PunchMarketingSchema, PunchMarketingValidationSchema } from '@modules/marketing/validations';\nimport { CouponValidationOutputDTO, ValidateCouponDTO } from '@modules/coupon/validations';\nimport { convertToSecondary } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { publishSyncUserShopPunchMarketingHistoryWithPunchSectionCacheProcessEvent } from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport { ChangeStreamOperationTypes } from '@lyxa.ai/core/dist/libraries/event/events/mongo-stream-changes-batch-process-shops-event';\n\n@Service()\nexport class PunchMarketingHistoryService {\n\tprivate model: typeof PunchMarketingHistoryModel & SoftDeleteModel<Model>;\n\tprivate marketingModel: typeof PunchMarketingModel & SoftDeleteModel<PunchMarketing>;\n\tprivate orderModel: typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\n\tconstructor() {\n\t\tthis.model = PunchMarketingHistoryModel as typeof PunchMarketingHistoryModel & SoftDeleteModel<Model>;\n\t\tthis.marketingModel = PunchMarketingModel as typeof PunchMarketingModel & SoftDeleteModel<PunchMarketing>;\n\t\tthis.orderModel = RegularOrderModel as typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\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\treturn await this.model.create(data);\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 * Get Record\n\t * @param UserId ShopId to find records\n\t */\n\tpublic async getByUserAndShop(data: GetByUserAndShopDTO): Promise<any> {\n\t\tlet result = await this.model.findOne({\n\t\t\tuser: data.userId,\n\t\t\tshop: data.shopId,\n\t\t\texpiryDate: { $gt: new Date() },\n\t\t\tcompletedAt: null,\n\t\t\tstatus: PunchMarketingStatus.ACTIVE,\n\t\t});\n\n\t\tif (result) return result;\n\n\t\tconst marketing = await this.marketingModel.findOne({\n\t\t\tmarketingType: MarketingType.PUNCH_MARKETING,\n\t\t\tshop: data.shopId,\n\t\t\tstatus: Status.ACTIVE,\n\t\t\t'duration.start': { $lt: new Date() },\n\t\t\t'duration.end': { $gt: new Date() },\n\t\t});\n\n\t\tif (!marketing) notFoundError('No Punch Marketing is Active For This Shop...');\n\n\t\treturn {\n\t\t\tuser: data.userId,\n\t\t\tshop: data.shopId,\n\t\t\tmarketing: marketing!._id,\n\t\t\ttargetOrder: marketing.targetOrders,\n\t\t\tminimumOrderValue: marketing.minimumOrderValue,\n\t\t\tcompletedOrder: 0,\n\t\t\tcouponValueType: marketing.couponValueType,\n\t\t\tcouponValue: marketing.couponValue,\n\t\t\tcouponDurationInDays: marketing.couponDurationInDays,\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(id: string, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\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 record;\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteById(data: DeleteDTO): Promise<string> {\n\t\tconst { _id, softDelete } = data;\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: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Increment punch history for user\n\t * @param userId User ID\n\t * @param orderId Order ID\n\t */\n\tpublic async incrementUserHistory(\n\t\tuserId: mongoose.Types.ObjectId,\n\t\torderId: mongoose.Types.ObjectId\n\t): Promise<string> {\n\t\tconst order = await this.orderModel.findById(orderId);\n\n\t\tif (!order || order.user.toString != userId.toString) {\n\t\t\tnotFoundError('Order not found');\n\t\t}\n\n\t\tconst existingHistory = await this.model.findOne({\n\t\t\tuser: userId,\n\t\t\tshop: order.shop,\n\t\t\texpiryDate: { $gt: new Date() },\n\t\t\tcompletedAt: null,\n\t\t\tstatus: PunchMarketingStatus.ACTIVE,\n\t\t});\n\n\t\tif (existingHistory) {\n\t\t\tif (order.finance.pricing.subtotal ?? 0 >= existingHistory.minimumOrderValue) {\n\t\t\t\tconst completedAt =\n\t\t\t\t\texistingHistory.targetOrder == existingHistory.completedOrder + 1 ? new Date() : null;\n\t\t\t\tconst couponExpiryDate = completedAt\n\t\t\t\t\t? dayjs(completedAt).add(existingHistory.couponDurationInDays, 'day').toDate()\n\t\t\t\t\t: null;\n\t\t\t\tconst status = completedAt ? PunchMarketingStatus.COMPLETED : PunchMarketingStatus.ACTIVE;\n\n\t\t\t\tawait this.model.findByIdAndUpdate(\n\t\t\t\t\texistingHistory._id,\n\t\t\t\t\t{\n\t\t\t\t\t\t$inc: {\n\t\t\t\t\t\t\tcompletedOrder: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcompletedAt,\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\tcouponExpiryDate,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnew: true,\n\t\t\t\t\t\trunValidators: true,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tawait this.createNewHistory(userId, order);\n\t\t}\n\n\t\tawait publishSyncUserShopPunchMarketingHistoryWithPunchSectionCacheProcessEvent({\n\t\t\tuserId,\n\t\t\tshopId: order.shop._id,\n\t\t\toperation: ChangeStreamOperationTypes.UPDATE,\n\t\t})\n\n\t\treturn 'Record updated successfully';\n\t}\n\n\t/**\n\t * Create new history with current punch marketing of the shop\n\t * @param userId User ID\n\t * @param order Order document\n\t */\n\tprivate async createNewHistory(userId: mongoose.Types.ObjectId, order: DocumentType<RegularOrder>) {\n\t\tconst marketing = await this.marketingModel.findOne({\n\t\t\tmarketingType: MarketingType.PUNCH_MARKETING,\n\t\t\tshop: order.shop,\n\t\t\tstatus: Status.ACTIVE,\n\t\t\t'duration.start': { $lt: new Date() },\n\t\t\t'duration.end': { $gt: new Date() },\n\t\t});\n\n\t\tif (!marketing) notFoundError('Marketing Not Found');\n\n\t\tconst expiryDate = dayjs().add(marketing.dayLimit, 'day').toDate();\n\t\tconst couponDurationInDays = marketing!.couponDurationInDays;\n\t\tconst couponValue = marketing!.couponValue;\n\t\tconst couponValueType = marketing!.couponValueType;\n\t\tconst targetOrder = marketing!.targetOrders;\n\t\tconst minimumOrderValue = marketing!.minimumOrderValue;\n\t\tconst completedOrder = 1;\n\t\tconst status =\n\t\t\tmarketing!.targetOrders == completedOrder\n\t\t\t\t? PunchMarketingStatus.COMPLETED\n\t\t\t\t: PunchMarketingStatus.ACTIVE;\n\t\tconst completedAt = marketing!.targetOrders == completedOrder ? new Date() : null;\n\t\tconst couponExpiryDate = completedAt\n\t\t\t? dayjs(completedAt).add(marketing!.couponDurationInDays, 'day').toDate()\n\t\t\t: null;\n\n\t\tif (order.finance.pricing.subtotal ?? 0 >= marketing.minimumOrderValue) {\n\t\t\tconst data: CreateDTO = {\n\t\t\t\tuser: userId as mongoose.Types.ObjectId,\n\t\t\t\tshop: order!.shop as mongoose.Types.ObjectId,\n\t\t\t\tmarketing: marketing!._id as mongoose.Types.ObjectId,\n\t\t\t\ttargetOrder,\n\t\t\t\tminimumOrderValue,\n\t\t\t\tcompletedOrder,\n\t\t\t\tstatus,\n\t\t\t\tcouponValueType,\n\t\t\t\tcouponValue,\n\t\t\t\tcouponDurationInDays,\n\t\t\t\texpiryDate,\n\t\t\t\t...(completedAt && { completedAt }),\n\t\t\t\t...(couponExpiryDate && { couponExpiryDate }),\n\t\t\t};\n\t\t\tawait this.create(data);\n\t\t}\n\t}\n\n\tpublic async applyPunchDiscountToOrder(userId: mongoose.Types.ObjectId, orderId: mongoose.Types.ObjectId) {\n\t\tconst order = await this.orderModel.findById(orderId);\n\t\tif (!order) notFoundError('Order not found');\n\n\t\tconst punchHistory = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\tuser: userId,\n\t\t\t\tshop: order.shop,\n\t\t\t\tcouponExpiryDate: { $gte: new Date() },\n\t\t\t\tstatus: PunchMarketingStatus.COMPLETED,\n\t\t\t},\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\torder: orderId,\n\t\t\t\t\tstatus: PunchMarketingStatus.COUPON_USED,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!punchHistory) notFoundError('No valid punch coupon available');\n\n\t\tawait this.orderModel.findByIdAndUpdate(orderId, {\n\t\t\t$push: {\n\t\t\t\tmarketings: punchHistory.marketing,\n\t\t\t},\n\t\t});\n\t\t\n\t\tawait publishSyncUserShopPunchMarketingHistoryWithPunchSectionCacheProcessEvent({\n\t\t\tuserId,\n\t\t\tshopId: order.shop._id,\n\t\t\toperation: ChangeStreamOperationTypes.DELETE,\n\t\t})\n\t}\n\n\t/**\n\t * Get punch discount\n\t * @param data Data to use for validating discount\n\t */\n\tpublic async getPunchDiscount(data: ValidateCouponDTO): Promise<CouponValidationOutputDTO> {\n\t\tconst punchHistory = await this.model.findOne({\n\t\t\tuser: data.user,\n\t\t\tshop: data.shop,\n\t\t\tcouponExpiryDate: { $gte: new Date() },\n\t\t\tstatus: PunchMarketingStatus.COMPLETED,\n\t\t});\n\n\t\tif (!punchHistory) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tdata.scheduledAt &&\n\t\t\tBoolean(punchHistory.couponExpiryDate) &&\n\t\t\tdayjs(punchHistory.couponExpiryDate).isBefore(data.scheduledAt)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t};\n\t\t}\n\n\t\tlet discountAmount =\n\t\t\tpunchHistory.couponValueType == ValueType.FIXED\n\t\t\t\t? punchHistory.couponValue\n\t\t\t\t: roundBaseCurrency((punchHistory.couponValue / 100) * data.amountBeforeCoupon);\n\n\t\tlet secondaryDiscountAmount =\n\t\t\tpunchHistory.couponValueType == ValueType.FIXED\n\t\t\t\t? await convertToSecondary(punchHistory.couponValue)\n\t\t\t\t: roundSecondaryCurrency((punchHistory.couponValue / 100) * data.secondaryAmountBeforeCoupon);\n\n\t\tif (discountAmount > data.amountBeforeCoupon) {\n\t\t\tdiscountAmount = data.amountBeforeCoupon;\n\t\t}\n\t\tif (secondaryDiscountAmount > data.secondaryAmountBeforeCoupon) {\n\t\t\tsecondaryDiscountAmount = data.secondaryAmountBeforeCoupon;\n\t\t}\n\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\tdiscountAmount,\n\t\t\tsecondaryDiscountAmount,\n\t\t\tamountAfterCoupon: Math.max(0, roundBaseCurrency(data.amountBeforeCoupon - discountAmount)),\n\t\t\tsecondaryAmountAfterCoupon: Math.max(\n\t\t\t\t0,\n\t\t\t\troundSecondaryCurrency(data.secondaryAmountBeforeCoupon - secondaryDiscountAmount)\n\t\t\t),\n\t\t\tdiscountCut: {\n\t\t\t\tcompanyCut: 0,\n\t\t\t\tsecondaryCompanyCut: 0,\n\t\t\t\tshopCut: discountAmount,\n\t\t\t\tsecondaryShopCut: secondaryDiscountAmount,\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic async getPunchCoupon(user: mongoose.Types.ObjectId, shop: mongoose.Types.ObjectId): Promise<any> {\n\t\tconst punchHistory = await this.model.findOne({\n\t\t\tuser: user,\n\t\t\tshop: shop,\n\t\t\tcouponExpiryDate: { $gte: new Date() },\n\t\t\tstatus: PunchMarketingStatus.COMPLETED,\n\t\t});\n\t\tif (!punchHistory) return null;\n\n\t\tconst settings = await getLibraries().getCachedSettingsService().getSettings();\n\t\tconst exchangeRate = settings?.currencySetting?.exchangeRate ?? 0;\n\n\t\tconst punchCoupon = {\n\t\t\t_id: null,\n\t\t\tcode: 'punch',\n\t\t\tcouponType: CouponType.INDIVIDUAL_USER,\n\t\t\torderLimitPerUser: 1,\n\t\t\tcreatedBy: null,\n\t\t\tdeletedAt: null,\n\t\t\tvalueType: punchHistory.couponValueType,\n\t\t\tvalue: punchHistory.couponValue,\n\t\t\tmaxDiscountLimit: null,\n\t\t\tduration: {\n\t\t\t\tstart: punchHistory.completedAt,\n\t\t\t\tend: punchHistory.couponExpiryDate,\n\t\t\t},\n\t\t\tshops: [shop],\n\t\t\tspendLimit: null,\n\t\t\ttotalOrderLimit: 1,\n\t\t\tminOrderValue: null,\n\t\t\tforNewUserOnly: false,\n\t\t\tstatus: Status.ACTIVE,\n\t\t\texpirationReason: null,\n\t\t\tcreatedAt: punchHistory.completedAt,\n\t\t\tupdatedAt: punchHistory.completedAt,\n\t\t\tsecondaryCurrencyValue:\n\t\t\t\tpunchHistory.couponValueType === ValueType.FIXED\n\t\t\t\t\t? roundSecondaryCurrency(punchHistory.couponValue * exchangeRate)\n\t\t\t\t\t: null,\n\t\t\tsecondaryCurrencyMaxDiscountLimit: null,\n\t\t\tsecondaryCurrencyMinOrderValue: null,\n\t\t};\n\t\treturn punchCoupon;\n\t}\n}\n\nexport const punchMarketingHistoryService = Container.get(PunchMarketingHistoryService);\n"]}
1
+ {"version":3,"file":"punch-marketing-history.service.js","sourceRoot":"/","sources":["modules/punch-marketing-history/services/punch-marketing-history.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { notFoundError } from '@lyxa.ai/core/dist/utilities/error-common';\nimport Container, { Service } from 'typedi';\nimport { TRPCError } from '@trpc/server';\nimport { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';\nimport { FilterDTO, PaginatedResponse, DeleteDTO } 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 {\n\tPunchMarketingHistoryModel,\n\tPunchMarketingHistory as Model,\n\tPunchMarketingModel,\n\tPunchMarketing,\n\tRegularOrder,\n\tRegularOrderModel,\n} from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport {\n\tCreatePunchMarketingHistoryDTO as CreateDTO,\n\tGetByUserAndShopDTO,\n\tUpdatePunchMarketingHistoryDTO as UpdateDTO,\n} from '@modules/punch-marketing-history/validations';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\nimport {\n\tCouponType,\n\tMarketingType,\n\tPunchMarketingStatus,\n\tStatus,\n\tValueType,\n} from '@lyxa.ai/core/dist/utilities/enum';\nimport { dayjs } from '@lyxa.ai/core/dist/utilities/dayjs';\nimport { PunchMarketingSchema, PunchMarketingValidationSchema } from '@modules/marketing/validations';\nimport { CouponValidationOutputDTO, ValidateCouponDTO } from '@modules/coupon/validations';\nimport { convertToSecondary } from '@lyxa.ai/core/dist/utilities/currency';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '@lyxa.ai/core/dist/utilities/shared';\nimport { getLibraries } from '@lyxa.ai/core';\nimport { publishSyncUserShopPunchMarketingHistoryWithPunchSectionCacheProcessEvent } from '@lyxa.ai/core/dist/utilities/events-common-methods';\nimport { ChangeStreamOperationTypes } from '@lyxa.ai/core/dist/libraries/event/events/mongo-stream-changes-batch-process-shops-event';\n\n@Service()\nexport class PunchMarketingHistoryService {\n\tprivate model: typeof PunchMarketingHistoryModel & SoftDeleteModel<Model>;\n\tprivate marketingModel: typeof PunchMarketingModel & SoftDeleteModel<PunchMarketing>;\n\tprivate orderModel: typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\n\n\tconstructor() {\n\t\tthis.model = PunchMarketingHistoryModel as typeof PunchMarketingHistoryModel & SoftDeleteModel<Model>;\n\t\tthis.marketingModel = PunchMarketingModel as typeof PunchMarketingModel & SoftDeleteModel<PunchMarketing>;\n\t\tthis.orderModel = RegularOrderModel as typeof RegularOrderModel & SoftDeleteModel<RegularOrder>;\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\treturn await this.model.create(data);\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 * Get Record\n\t * @param UserId ShopId to find records\n\t */\n\tpublic async getByUserAndShop(data: GetByUserAndShopDTO): Promise<any> {\n\t\tlet result = await this.model.findOne({\n\t\t\tuser: data.userId,\n\t\t\tshop: data.shopId,\n\t\t\texpiryDate: { $gt: new Date() },\n\t\t\tcompletedAt: null,\n\t\t\tstatus: PunchMarketingStatus.ACTIVE,\n\t\t});\n\n\t\tif (result) return result;\n\n\t\tconst marketing = await this.marketingModel.findOne({\n\t\t\tmarketingType: MarketingType.PUNCH_MARKETING,\n\t\t\tshop: data.shopId,\n\t\t\tstatus: Status.ACTIVE,\n\t\t\t'duration.start': { $lt: new Date() },\n\t\t\t'duration.end': { $gt: new Date() },\n\t\t});\n\n\t\tif (!marketing) notFoundError('No Punch Marketing is Active For This Shop...');\n\n\t\treturn {\n\t\t\tuser: data.userId,\n\t\t\tshop: data.shopId,\n\t\t\tmarketing: marketing!._id,\n\t\t\ttargetOrder: marketing.targetOrders,\n\t\t\tminimumOrderValue: marketing.minimumOrderValue,\n\t\t\tcompletedOrder: 0,\n\t\t\tcouponValueType: marketing.couponValueType,\n\t\t\tcouponValue: marketing.couponValue,\n\t\t\tcouponDurationInDays: marketing.couponDurationInDays,\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(id: string, data: UpdateDTO): Promise<DocumentType<Model>> {\n\t\tconst record = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\t_id: id,\n\t\t\t\tdeletedAt: null,\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\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 record;\n\t}\n\n\t/**\n\t * Delete record\n\t * @param data Data for delete\n\t */\n\tpublic async deleteById(data: DeleteDTO): Promise<string> {\n\t\tconst { _id, softDelete } = data;\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: 'NOT_FOUND',\n\t\t\t\tmessage: 'Record not found',\n\t\t\t});\n\t\t}\n\n\t\treturn 'Record deleted successfully';\n\t}\n\n\t/**\n\t * Increment punch history for user\n\t * @param userId User ID\n\t * @param orderId Order ID\n\t */\n\tpublic async incrementUserHistory(\n\t\tuserId: mongoose.Types.ObjectId,\n\t\torderId: mongoose.Types.ObjectId\n\t): Promise<string> {\n\t\tconst order = await this.orderModel.findById(orderId);\n\n\t\tif (!order || order.user.toString != userId.toString) {\n\t\t\tnotFoundError('Order not found');\n\t\t}\n\n\t\tconst existingHistory = await this.model.findOne({\n\t\t\tuser: userId,\n\t\t\tshop: order.shop,\n\t\t\texpiryDate: { $gt: new Date() },\n\t\t\tcompletedAt: null,\n\t\t\tstatus: PunchMarketingStatus.ACTIVE,\n\t\t});\n\n\t\tif (existingHistory) {\n\t\t\tif (order.finance.pricing.subtotal ?? 0 >= existingHistory.minimumOrderValue) {\n\t\t\t\tconst completedAt =\n\t\t\t\t\texistingHistory.targetOrder == existingHistory.completedOrder + 1 ? new Date() : null;\n\t\t\t\tconst couponExpiryDate = completedAt\n\t\t\t\t\t? dayjs(completedAt).add(existingHistory.couponDurationInDays, 'day').toDate()\n\t\t\t\t\t: null;\n\t\t\t\tconst status = completedAt ? PunchMarketingStatus.COMPLETED : PunchMarketingStatus.ACTIVE;\n\n\t\t\t\tawait this.model.findByIdAndUpdate(\n\t\t\t\t\texistingHistory._id,\n\t\t\t\t\t{\n\t\t\t\t\t\t$inc: {\n\t\t\t\t\t\t\tcompletedOrder: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcompletedAt,\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\tcouponExpiryDate,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnew: true,\n\t\t\t\t\t\trunValidators: true,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tawait this.createNewHistory(userId, order);\n\t\t}\n\n\t\tawait publishSyncUserShopPunchMarketingHistoryWithPunchSectionCacheProcessEvent({\n\t\t\tuserId,\n\t\t\tshopId: order.shop._id,\n\t\t\toperation: ChangeStreamOperationTypes.UPDATE,\n\t\t});\n\n\t\treturn 'Record updated successfully';\n\t}\n\n\t/**\n\t * Create new history with current punch marketing of the shop\n\t * @param userId User ID\n\t * @param order Order document\n\t */\n\tprivate async createNewHistory(userId: mongoose.Types.ObjectId, order: DocumentType<RegularOrder>) {\n\t\tconst marketing = await this.marketingModel.findOne({\n\t\t\tmarketingType: MarketingType.PUNCH_MARKETING,\n\t\t\tshop: order.shop,\n\t\t\tstatus: Status.ACTIVE,\n\t\t\t'duration.start': { $lt: new Date() },\n\t\t\t'duration.end': { $gt: new Date() },\n\t\t});\n\n\t\tif (!marketing) notFoundError('Marketing Not Found');\n\n\t\tconst expiryDate = dayjs().add(marketing.dayLimit, 'day').toDate();\n\t\tconst couponDurationInDays = marketing!.couponDurationInDays;\n\t\tconst couponValue = marketing!.couponValue;\n\t\tconst couponValueType = marketing!.couponValueType;\n\t\tconst targetOrder = marketing!.targetOrders;\n\t\tconst minimumOrderValue = marketing!.minimumOrderValue;\n\t\tconst completedOrder = 1;\n\t\tconst status =\n\t\t\tmarketing!.targetOrders == completedOrder\n\t\t\t\t? PunchMarketingStatus.COMPLETED\n\t\t\t\t: PunchMarketingStatus.ACTIVE;\n\t\tconst completedAt = marketing!.targetOrders == completedOrder ? new Date() : null;\n\t\tconst couponExpiryDate = completedAt\n\t\t\t? dayjs(completedAt).add(marketing!.couponDurationInDays, 'day').toDate()\n\t\t\t: null;\n\n\t\tif (order.finance.pricing.subtotal ?? 0 >= marketing.minimumOrderValue) {\n\t\t\tconst data: CreateDTO = {\n\t\t\t\tuser: userId as mongoose.Types.ObjectId,\n\t\t\t\tshop: order!.shop as mongoose.Types.ObjectId,\n\t\t\t\tmarketing: marketing!._id as mongoose.Types.ObjectId,\n\t\t\t\ttargetOrder,\n\t\t\t\tminimumOrderValue,\n\t\t\t\tcompletedOrder,\n\t\t\t\tstatus,\n\t\t\t\tcouponValueType,\n\t\t\t\tcouponValue,\n\t\t\t\tcouponDurationInDays,\n\t\t\t\texpiryDate,\n\t\t\t\t...(completedAt && { completedAt }),\n\t\t\t\t...(couponExpiryDate && { couponExpiryDate }),\n\t\t\t};\n\t\t\tawait this.create(data);\n\t\t}\n\t}\n\n\tpublic async applyPunchDiscountToOrder(userId: mongoose.Types.ObjectId, orderId: mongoose.Types.ObjectId) {\n\t\tconst order = await this.orderModel.findById(orderId);\n\t\tif (!order) notFoundError('Order not found');\n\n\t\tconst punchHistory = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\tuser: userId,\n\t\t\t\tshop: order.shop,\n\t\t\t\tcouponExpiryDate: { $gte: new Date() },\n\t\t\t\tstatus: PunchMarketingStatus.COMPLETED,\n\t\t\t},\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\torder: orderId,\n\t\t\t\t\tstatus: PunchMarketingStatus.COUPON_USED,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\n\t\tif (!punchHistory) notFoundError('No valid punch coupon available');\n\n\t\tawait this.orderModel.findByIdAndUpdate(orderId, {\n\t\t\t$push: {\n\t\t\t\tmarketings: punchHistory.marketing,\n\t\t\t},\n\t\t});\n\n\t\tawait publishSyncUserShopPunchMarketingHistoryWithPunchSectionCacheProcessEvent({\n\t\t\tuserId,\n\t\t\tshopId: order.shop._id,\n\t\t\toperation: ChangeStreamOperationTypes.DELETE,\n\t\t});\n\t}\n\n\t/**\n\t * Get punch discount\n\t * @param data Data to use for validating discount\n\t */\n\tpublic async getPunchDiscount(data: ValidateCouponDTO): Promise<CouponValidationOutputDTO> {\n\t\tconst punchHistory = await this.model.findOne({\n\t\t\tuser: data.user,\n\t\t\tshop: data.shop,\n\t\t\tcouponExpiryDate: { $gte: new Date() },\n\t\t\tstatus: PunchMarketingStatus.COMPLETED,\n\t\t});\n\n\t\tif (!punchHistory) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tdata.scheduledAt &&\n\t\t\tBoolean(punchHistory.couponExpiryDate) &&\n\t\t\tdayjs(punchHistory.couponExpiryDate).isBefore(data.scheduledAt)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t};\n\t\t}\n\n\t\tlet discountAmount =\n\t\t\tpunchHistory.couponValueType == ValueType.FIXED\n\t\t\t\t? punchHistory.couponValue\n\t\t\t\t: roundBaseCurrency((punchHistory.couponValue / 100) * data.amountBeforeCoupon);\n\n\t\tlet secondaryDiscountAmount =\n\t\t\tpunchHistory.couponValueType == ValueType.FIXED\n\t\t\t\t? await convertToSecondary(punchHistory.couponValue)\n\t\t\t\t: roundSecondaryCurrency((punchHistory.couponValue / 100) * data.secondaryAmountBeforeCoupon);\n\n\t\tif (discountAmount > data.amountBeforeCoupon) {\n\t\t\tdiscountAmount = data.amountBeforeCoupon;\n\t\t}\n\t\tif (secondaryDiscountAmount > data.secondaryAmountBeforeCoupon) {\n\t\t\tsecondaryDiscountAmount = data.secondaryAmountBeforeCoupon;\n\t\t}\n\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\tdiscountAmount,\n\t\t\tsecondaryDiscountAmount,\n\t\t\tamountAfterCoupon: Math.max(0, roundBaseCurrency(data.amountBeforeCoupon - discountAmount)),\n\t\t\tsecondaryAmountAfterCoupon: Math.max(\n\t\t\t\t0,\n\t\t\t\troundSecondaryCurrency(data.secondaryAmountBeforeCoupon - secondaryDiscountAmount)\n\t\t\t),\n\t\t\tdiscountCut: {\n\t\t\t\tcompanyCut: 0,\n\t\t\t\tsecondaryCompanyCut: 0,\n\t\t\t\tshopCut: discountAmount,\n\t\t\t\tsecondaryShopCut: secondaryDiscountAmount,\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic async getPunchCoupon(user: mongoose.Types.ObjectId, shop: mongoose.Types.ObjectId): Promise<any> {\n\t\tconst punchHistory = await this.model.findOne({\n\t\t\tuser: user,\n\t\t\tshop: shop,\n\t\t\tcouponExpiryDate: { $gte: new Date() },\n\t\t\tstatus: PunchMarketingStatus.COMPLETED,\n\t\t});\n\t\tif (!punchHistory) return null;\n\n\t\tconst settings = await getLibraries().getCachedSettingsService().getSettings();\n\t\tconst exchangeRate = settings?.currencySetting?.exchangeRate ?? 0;\n\n\t\tconst punchCoupon = {\n\t\t\t_id: null,\n\t\t\tcode: 'punch',\n\t\t\tcouponType: CouponType.INDIVIDUAL_USER,\n\t\t\torderLimitPerUser: 1,\n\t\t\tcreatedBy: null,\n\t\t\tdeletedAt: null,\n\t\t\tvalueType: punchHistory.couponValueType,\n\t\t\tvalue: punchHistory.couponValue,\n\t\t\tmaxDiscountLimit: null,\n\t\t\tduration: {\n\t\t\t\tstart: punchHistory.completedAt,\n\t\t\t\tend: punchHistory.couponExpiryDate,\n\t\t\t},\n\t\t\tshops: [shop],\n\t\t\tspendLimit: null,\n\t\t\ttotalOrderLimit: 1,\n\t\t\tminOrderValue: null,\n\t\t\tforNewUserOnly: false,\n\t\t\tstatus: Status.ACTIVE,\n\t\t\texpirationReason: null,\n\t\t\tcreatedAt: punchHistory.completedAt,\n\t\t\tupdatedAt: punchHistory.completedAt,\n\t\t\tsecondaryCurrencyValue:\n\t\t\t\tpunchHistory.couponValueType === ValueType.FIXED\n\t\t\t\t\t? roundSecondaryCurrency(punchHistory.couponValue * exchangeRate)\n\t\t\t\t\t: null,\n\t\t\tsecondaryCurrencyMaxDiscountLimit: null,\n\t\t\tsecondaryCurrencyMinOrderValue: null,\n\t\t};\n\t\treturn punchCoupon;\n\t}\n\n\tpublic async returnPunchCoupon(orderId: mongoose.Types.ObjectId): Promise<void> {\n\t\tawait this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\torder: orderId,\n\t\t\t\tstatus: PunchMarketingStatus.COUPON_USED,\n\t\t\t},\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tstatus: PunchMarketingStatus.COMPLETED,\n\t\t\t\t\torder: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tnew: true,\n\t\t\t\trunValidators: true,\n\t\t\t}\n\t\t);\n\t}\n}\n\nexport const punchMarketingHistoryService = Container.get(PunchMarketingHistoryService);\n"]}
@@ -19,30 +19,30 @@ declare const PunchMarketingHistoryValidationSchema: z.ZodObject<{
19
19
  }, "strict", z.ZodTypeAny, {
20
20
  user: import("mongoose").Types.ObjectId;
21
21
  shop: import("mongoose").Types.ObjectId;
22
- marketing: import("mongoose").Types.ObjectId;
23
22
  minimumOrderValue: number;
23
+ marketing: import("mongoose").Types.ObjectId;
24
24
  targetOrder: number;
25
25
  couponValueType: ValueType;
26
26
  couponValue: number;
27
27
  couponDurationInDays: number;
28
28
  status?: PunchMarketingStatus | undefined;
29
- completedOrder?: number | undefined;
30
29
  startDate?: Date | undefined;
30
+ completedOrder?: number | undefined;
31
31
  expiryDate?: Date | undefined;
32
32
  completedAt?: Date | undefined;
33
33
  couponExpiryDate?: Date | undefined;
34
34
  }, {
35
35
  user: string | import("mongoose").Types.ObjectId;
36
36
  shop: string | import("mongoose").Types.ObjectId;
37
- marketing: string | import("mongoose").Types.ObjectId;
38
37
  minimumOrderValue: number;
38
+ marketing: string | import("mongoose").Types.ObjectId;
39
39
  targetOrder: number;
40
40
  couponValueType: ValueType;
41
41
  couponValue: number;
42
42
  couponDurationInDays: number;
43
43
  status?: PunchMarketingStatus | undefined;
44
- completedOrder?: number | undefined;
45
44
  startDate?: string | Date | undefined;
45
+ completedOrder?: number | undefined;
46
46
  expiryDate?: string | Date | undefined;
47
47
  completedAt?: string | Date | undefined;
48
48
  couponExpiryDate?: string | Date | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"event-initializations.d.ts","sourceRoot":"/","sources":["event/event-initializations.ts"],"names":[],"mappings":"AAGA,wBAAsB,kBAAkB,kBAGvC"}
1
+ {"version":3,"file":"event-initializations.d.ts","sourceRoot":"/","sources":["event/event-initializations.ts"],"names":[],"mappings":"AAOA,wBAAsB,kBAAkB,kBAKvC"}
@@ -1,2 +1,4 @@
1
1
  export declare function subscribeToSyncAllProductsProductMarketingInfoProcessEvent(): Promise<void>;
2
+ export declare function subscribeToMarketingEntireMenuSeedEvent(): Promise<void>;
3
+ export declare function subscribeToMarketingReturnPunchCouponEvent(): Promise<void>;
2
4
  //# sourceMappingURL=event-listeners.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-listeners.d.ts","sourceRoot":"/","sources":["event/event-listeners/event-listeners.ts"],"names":[],"mappings":"AAIA,wBAAsB,0DAA0D,kBAI/E"}
1
+ {"version":3,"file":"event-listeners.d.ts","sourceRoot":"/","sources":["event/event-listeners/event-listeners.ts"],"names":[],"mappings":"AAaA,wBAAsB,0DAA0D,kBAI/E;AAED,wBAAsB,uCAAuC,kBAmD5D;AAED,wBAAsB,0CAA0C,kBAI/D"}
@@ -0,0 +1,17 @@
1
+ import { BaseEvent } from '@lyxa.ai/core/dist/libraries/event/BaseEvent';
2
+ import { ValueType } from '@lyxa.ai/core/dist/utilities/enum';
3
+ export declare const MARKETING_ENTIRE_MENU_SEED_EVENT = "marketing_entire_menu_seed_event";
4
+ export interface MarketingProductSeedPayload {
5
+ marketingId: string;
6
+ shopId: string;
7
+ isAppliedByCompany: boolean;
8
+ isBuy1Get1: boolean;
9
+ page: number;
10
+ pageSize: number;
11
+ value?: number;
12
+ valueType?: ValueType;
13
+ }
14
+ export declare class MarketingEntireMenuSeedEvent extends BaseEvent<MarketingProductSeedPayload> {
15
+ constructor(payload: MarketingProductSeedPayload);
16
+ }
17
+ //# sourceMappingURL=marketing-product-seed.event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-product-seed.event.d.ts","sourceRoot":"/","sources":["event/events/marketing-product-seed.event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,eAAO,MAAM,gCAAgC,qCAAqC,CAAC;AAEnF,MAAM,WAAW,2BAA2B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,qBAAa,4BAA6B,SAAQ,SAAS,CAAC,2BAA2B,CAAC;gBAC3E,OAAO,EAAE,2BAA2B;CAGhD"}