@lyxa.ai/marketing 1.0.62 → 1.0.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/event/event-initializations.d.ts.map +1 -1
- package/dist/lib/event/event-initializations.js +2 -0
- package/dist/lib/event/event-initializations.js.map +1 -1
- package/dist/lib/event/event-listeners/event-listeners.d.ts +2 -0
- package/dist/lib/event/event-listeners/event-listeners.d.ts.map +1 -1
- package/dist/lib/event/event-listeners/event-listeners.js +69 -12
- package/dist/lib/event/event-listeners/event-listeners.js.map +1 -1
- package/dist/lib/event/events/marketing-product-seed.event.d.ts +1 -2
- package/dist/lib/event/events/marketing-product-seed.event.d.ts.map +1 -1
- package/dist/lib/event/events/marketing-product-seed.event.js.map +1 -1
- package/dist/lib/event/events/marketing-product-sync.event.d.ts +11 -0
- package/dist/lib/event/events/marketing-product-sync.event.d.ts.map +1 -0
- package/dist/lib/event/events/marketing-product-sync.event.js +12 -0
- package/dist/lib/event/events/marketing-product-sync.event.js.map +1 -0
- package/dist/lib/index.d.ts +533 -18
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +5 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
- package/dist/lib/modules/coupon/validations/create-coupon.validation.js +4 -1
- package/dist/lib/modules/coupon/validations/create-coupon.validation.js.map +1 -1
- package/dist/lib/modules/deal-setting/services/deal-setting.service.d.ts.map +1 -1
- package/dist/lib/modules/deal-setting/services/deal-setting.service.js +4 -1
- package/dist/lib/modules/deal-setting/services/deal-setting.service.js.map +1 -1
- package/dist/lib/modules/featured-setting/services/featured-setting.service.d.ts.map +1 -1
- package/dist/lib/modules/featured-setting/services/featured-setting.service.js +3 -0
- package/dist/lib/modules/featured-setting/services/featured-setting.service.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts +54 -8
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js +11 -0
- package/dist/lib/modules/limited-time-offer/campaign/campaign.router.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js +6 -0
- package/dist/lib/modules/limited-time-offer/campaign/jobs/index.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +0 -1
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js +2 -6
- package/dist/lib/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts +16 -3
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.js +22 -3
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts +2 -0
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.js +12 -0
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +242 -35
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js +19 -1
- package/dist/lib/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +8 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js +64 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +3 -0
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js +66 -8
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js +37 -19
- package/dist/lib/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts +249 -18
- package/dist/lib/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/limited-time-offer.service.d.ts +2 -0
- package/dist/lib/modules/limited-time-offer/limited-time-offer.service.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/limited-time-offer.service.js +15 -3
- package/dist/lib/modules/limited-time-offer/limited-time-offer.service.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/notification/limited-time-offer-notification.constants.d.ts +1 -1
- package/dist/lib/modules/limited-time-offer/notification/limited-time-offer-notification.constants.js +1 -1
- package/dist/lib/modules/limited-time-offer/notification/limited-time-offer-notification.constants.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts +24 -3
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.js +19 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.builder.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts +10 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.js +43 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.repository.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +195 -10
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js +29 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.router.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +1 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js +2 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.service.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +427 -32
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js +16 -6
- package/dist/lib/modules/limited-time-offer/participant/limited-time-offer-participant.validation.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +7 -4
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js +42 -7
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +15 -3
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js +84 -18
- package/dist/lib/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.js.map +1 -1
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts +13 -0
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.js +75 -0
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.js.map +1 -0
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts +21 -0
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts.map +1 -0
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.js +83 -0
- package/dist/lib/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.js.map +1 -0
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +1 -0
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js +29 -0
- package/dist/lib/modules/marketing/patterns/repository/MarketingMetricsRepository.js.map +1 -1
- package/dist/lib/modules/marketing/routers/marketing.router.d.ts +14 -0
- package/dist/lib/modules/marketing/routers/marketing.router.d.ts.map +1 -1
- package/dist/lib/modules/marketing/routers/marketing.router.js +5 -0
- package/dist/lib/modules/marketing/routers/marketing.router.js.map +1 -1
- package/dist/lib/modules/marketing/services/index.d.ts +3 -0
- package/dist/lib/modules/marketing/services/index.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/index.js +3 -0
- package/dist/lib/modules/marketing/services/index.js.map +1 -1
- package/dist/lib/modules/marketing/services/marketing-conflict.repository.d.ts +9 -0
- package/dist/lib/modules/marketing/services/marketing-conflict.repository.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/marketing-conflict.repository.js +63 -0
- package/dist/lib/modules/marketing/services/marketing-conflict.repository.js.map +1 -0
- package/dist/lib/modules/marketing/services/marketing-conflict.service.d.ts +28 -0
- package/dist/lib/modules/marketing/services/marketing-conflict.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/marketing-conflict.service.js +139 -0
- package/dist/lib/modules/marketing/services/marketing-conflict.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/marketing.service.d.ts +7 -2
- package/dist/lib/modules/marketing/services/marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/marketing.service.js +100 -51
- package/dist/lib/modules/marketing/services/marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/services/product-marketing.service.d.ts +2 -3
- package/dist/lib/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/product-marketing.service.js +42 -13
- package/dist/lib/modules/marketing/services/product-marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.d.ts +14 -0
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.js +82 -0
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.repository.js.map +1 -0
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.d.ts +11 -0
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.js +100 -0
- package/dist/lib/modules/marketing/services/spend-to-get-marketing.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.d.ts +9 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.js +69 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.repository.js.map +1 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.service.d.ts +31 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.service.d.ts.map +1 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.service.js +123 -0
- package/dist/lib/modules/marketing/services/spend-to-get-progress.service.js.map +1 -0
- package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
- package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js +95 -27
- package/dist/lib/modules/marketing/services/synchronize-product-marketing.service.js.map +1 -1
- package/dist/lib/modules/marketing/validations/all-marketings.validation.d.ts.map +1 -1
- package/dist/lib/modules/marketing/validations/all-marketings.validation.js +3 -0
- package/dist/lib/modules/marketing/validations/all-marketings.validation.js.map +1 -1
- package/dist/lib/modules/marketing/validations/index.d.ts +1 -0
- package/dist/lib/modules/marketing/validations/index.d.ts.map +1 -1
- package/dist/lib/modules/marketing/validations/index.js +1 -0
- package/dist/lib/modules/marketing/validations/index.js.map +1 -1
- package/dist/lib/modules/marketing/validations/marketing.validation.d.ts +17 -0
- package/dist/lib/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
- package/dist/lib/modules/marketing/validations/marketing.validation.js +7 -1
- package/dist/lib/modules/marketing/validations/marketing.validation.js.map +1 -1
- package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.d.ts +617 -0
- package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.d.ts.map +1 -0
- package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.js +119 -0
- package/dist/lib/modules/marketing/validations/spend-to-get-marketing.validation.js.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.d.ts +24 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.d.ts.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.js +97 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.repository.js.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts +271 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.js +62 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.router.js.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.d.ts +24 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.d.ts.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.js +116 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.service.js.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.d.ts +232 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.d.ts.map +1 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.js +30 -0
- package/dist/lib/modules/spend-to-get-history/spend-to-get-history.validation.js.map +1 -0
- package/dist/types/event/event-initializations.d.ts.map +1 -1
- package/dist/types/event/event-listeners/event-listeners.d.ts +2 -0
- package/dist/types/event/event-listeners/event-listeners.d.ts.map +1 -1
- package/dist/types/event/events/marketing-product-seed.event.d.ts +1 -2
- package/dist/types/event/events/marketing-product-seed.event.d.ts.map +1 -1
- package/dist/types/event/events/marketing-product-sync.event.d.ts +11 -0
- package/dist/types/event/events/marketing-product-sync.event.d.ts.map +1 -0
- package/dist/types/index.d.ts +533 -18
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modules/coupon/validations/create-coupon.validation.d.ts.map +1 -1
- package/dist/types/modules/deal-setting/services/deal-setting.service.d.ts.map +1 -1
- package/dist/types/modules/featured-setting/services/featured-setting.service.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts +54 -8
- package/dist/types/modules/limited-time-offer/campaign/campaign.router.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/jobs/index.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts +0 -1
- package/dist/types/modules/limited-time-offer/campaign/jobs/limited-time-offer-campaign.worker.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts +16 -3
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.builder.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts +2 -0
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.repository.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts +242 -35
- package/dist/types/modules/limited-time-offer/campaign/limited-time-offer-campaign.validation.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts +8 -1
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-lifecycle.service.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts +3 -0
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign-scheduler.service.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts +1 -1
- package/dist/types/modules/limited-time-offer/campaign/services/limited-time-offer-campaign.service.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts +249 -18
- package/dist/types/modules/limited-time-offer/limited-time-offer.router.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/limited-time-offer.service.d.ts +2 -0
- package/dist/types/modules/limited-time-offer/limited-time-offer.service.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/notification/limited-time-offer-notification.constants.d.ts +1 -1
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts +24 -3
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.builder.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts +10 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.repository.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts +195 -10
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.router.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts +1 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.service.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts +427 -32
- package/dist/types/modules/limited-time-offer/participant/limited-time-offer-participant.validation.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts +7 -4
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts +15 -3
- package/dist/types/modules/limited-time-offer/participant/services/limited-time-offer-participant.service.d.ts.map +1 -1
- package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts +13 -0
- package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.repository.d.ts.map +1 -0
- package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts +21 -0
- package/dist/types/modules/limited-time-offer/session/limited-time-offer-campaign-session.service.d.ts.map +1 -0
- package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts +1 -0
- package/dist/types/modules/marketing/patterns/repository/MarketingMetricsRepository.d.ts.map +1 -1
- package/dist/types/modules/marketing/routers/marketing.router.d.ts +14 -0
- package/dist/types/modules/marketing/routers/marketing.router.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/index.d.ts +3 -0
- package/dist/types/modules/marketing/services/index.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/marketing-conflict.repository.d.ts +9 -0
- package/dist/types/modules/marketing/services/marketing-conflict.repository.d.ts.map +1 -0
- package/dist/types/modules/marketing/services/marketing-conflict.service.d.ts +46 -0
- package/dist/types/modules/marketing/services/marketing-conflict.service.d.ts.map +1 -0
- package/dist/types/modules/marketing/services/marketing.service.d.ts +7 -2
- package/dist/types/modules/marketing/services/marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/product-marketing.service.d.ts +7 -3
- package/dist/types/modules/marketing/services/product-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/services/spend-to-get-marketing.repository.d.ts +14 -0
- package/dist/types/modules/marketing/services/spend-to-get-marketing.repository.d.ts.map +1 -0
- package/dist/types/modules/marketing/services/spend-to-get-marketing.service.d.ts +20 -0
- package/dist/types/modules/marketing/services/spend-to-get-marketing.service.d.ts.map +1 -0
- package/dist/types/modules/marketing/services/spend-to-get-progress.repository.d.ts +9 -0
- package/dist/types/modules/marketing/services/spend-to-get-progress.repository.d.ts.map +1 -0
- package/dist/types/modules/marketing/services/spend-to-get-progress.service.d.ts +37 -0
- package/dist/types/modules/marketing/services/spend-to-get-progress.service.d.ts.map +1 -0
- package/dist/types/modules/marketing/services/synchronize-product-marketing.service.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/all-marketings.validation.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/index.d.ts +1 -0
- package/dist/types/modules/marketing/validations/index.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/marketing.validation.d.ts +17 -0
- package/dist/types/modules/marketing/validations/marketing.validation.d.ts.map +1 -1
- package/dist/types/modules/marketing/validations/spend-to-get-marketing.validation.d.ts +630 -0
- package/dist/types/modules/marketing/validations/spend-to-get-marketing.validation.d.ts.map +1 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.repository.d.ts +24 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.repository.d.ts.map +1 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts +271 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.router.d.ts.map +1 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.service.d.ts +56 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.service.d.ts.map +1 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.validation.d.ts +241 -0
- package/dist/types/modules/spend-to-get-history/spend-to-get-history.validation.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["modules/marketing/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA8C;AAC9C,+DAA6C;AAC7C,+DAA6C;AAC7C,oEAAkD;AAClD,4DAA0C;AAC1C,8DAA4C;AAC5C,sDAAoC;AACpC,0EAAwD","sourcesContent":["export * from './buy1-get1-marketing.service';\nexport * from './discount-marketing.service';\nexport * from './featured-marketing.service';\nexport * from './free-delivery-marketing.service';\nexport * from './punch-marketing.service';\nexport * from './product-marketing.service';\nexport * from './marketing.service';\nexport * from './synchronize-product-marketing.service';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["modules/marketing/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA8C;AAC9C,+DAA6C;AAC7C,+DAA6C;AAC7C,oEAAkD;AAClD,4DAA0C;AAC1C,mEAAiD;AACjD,kEAAgD;AAChD,+DAA6C;AAC7C,8DAA4C;AAC5C,sDAAoC;AACpC,0EAAwD","sourcesContent":["export * from './buy1-get1-marketing.service';\nexport * from './discount-marketing.service';\nexport * from './featured-marketing.service';\nexport * from './free-delivery-marketing.service';\nexport * from './punch-marketing.service';\nexport * from './spend-to-get-marketing.service';\nexport * from './spend-to-get-progress.service';\nexport * from './marketing-conflict.service';\nexport * from './product-marketing.service';\nexport * from './marketing.service';\nexport * from './synchronize-product-marketing.service';\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DocumentType, mongoose } from '@typegoose/typegoose';
|
|
2
|
+
import { Marketing as Model } from '@lyxa.ai/core/dist/libraries/mongo/models';
|
|
3
|
+
export declare class MarketingConflictRepository {
|
|
4
|
+
private model;
|
|
5
|
+
constructor();
|
|
6
|
+
find(filter: mongoose.FilterQuery<Model>): Promise<DocumentType<Model>[]>;
|
|
7
|
+
}
|
|
8
|
+
export declare const marketingConflictRepository: MarketingConflictRepository;
|
|
9
|
+
//# sourceMappingURL=marketing-conflict.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing-conflict.repository.d.ts","sourceRoot":"/","sources":["modules/marketing/services/marketing-conflict.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAkB,SAAS,IAAI,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAG/F,qBACa,2BAA2B;IACvC,OAAO,CAAC,KAAK,CAAiD;;IAMxD,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;CAG/E;AAED,eAAO,MAAM,2BAA2B,6BAA6C,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.marketingConflictRepository = exports.MarketingConflictRepository = void 0;
|
|
46
|
+
const typedi_1 = __importStar(require("typedi"));
|
|
47
|
+
const models_1 = require("@lyxa.ai/core/dist/libraries/mongo/models");
|
|
48
|
+
let MarketingConflictRepository = class MarketingConflictRepository {
|
|
49
|
+
model;
|
|
50
|
+
constructor() {
|
|
51
|
+
this.model = models_1.MarketingModel;
|
|
52
|
+
}
|
|
53
|
+
async find(filter) {
|
|
54
|
+
return this.model.find(filter);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.MarketingConflictRepository = MarketingConflictRepository;
|
|
58
|
+
exports.MarketingConflictRepository = MarketingConflictRepository = __decorate([
|
|
59
|
+
(0, typedi_1.Service)(),
|
|
60
|
+
__metadata("design:paramtypes", [])
|
|
61
|
+
], MarketingConflictRepository);
|
|
62
|
+
exports.marketingConflictRepository = typedi_1.default.get(MarketingConflictRepository);
|
|
63
|
+
//# sourceMappingURL=marketing-conflict.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing-conflict.repository.js","sourceRoot":"/","sources":["modules/marketing/services/marketing-conflict.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA4C;AAE5C,sEAA+F;AAIxF,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAC/B,KAAK,CAAiD;IAE9D;QACC,IAAI,CAAC,KAAK,GAAG,uBAAgE,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAmC;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACD,CAAA;AAVY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,gBAAO,GAAE;;GACG,2BAA2B,CAUvC;AAEY,QAAA,2BAA2B,GAAG,gBAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC","sourcesContent":["import Container, { Service } from 'typedi';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { MarketingModel, Marketing as Model } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { SoftDeleteModel } from '@lyxa.ai/core/dist/libraries/mongo/plugins/soft-delete-plugin';\n\n@Service()\nexport class MarketingConflictRepository {\n\tprivate model: typeof MarketingModel & SoftDeleteModel<Model>;\n\n\tconstructor() {\n\t\tthis.model = MarketingModel as typeof MarketingModel & SoftDeleteModel<Model>;\n\t}\n\n\tasync find(filter: mongoose.FilterQuery<Model>): Promise<DocumentType<Model>[]> {\n\t\treturn this.model.find(filter);\n\t}\n}\n\nexport const marketingConflictRepository = Container.get(MarketingConflictRepository);\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DocumentType, mongoose } from '@typegoose/typegoose';
|
|
2
|
+
import { Marketing } from '@lyxa.ai/core/dist/libraries/mongo/models';
|
|
3
|
+
import { MarketingType, SpendToGetRewardType } from '@lyxa.ai/core/dist/utilities/enum';
|
|
4
|
+
import { Duration } from '@lyxa.ai/core/dist/libraries/mongo/models/shared/duration.model';
|
|
5
|
+
export declare enum RewardTypeGroup {
|
|
6
|
+
DISCOUNT = "discount",
|
|
7
|
+
FREE_DELIVERY = "free_delivery"
|
|
8
|
+
}
|
|
9
|
+
export declare const CONFLICT_CHECK_MARKETING_TYPES: MarketingType[];
|
|
10
|
+
export interface ConflictCheckParams {
|
|
11
|
+
shop: mongoose.Types.ObjectId;
|
|
12
|
+
marketingType: MarketingType;
|
|
13
|
+
duration: Pick<Duration, 'start' | 'end'>;
|
|
14
|
+
rewardTypeGroups: RewardTypeGroup[];
|
|
15
|
+
excludeMarketingId?: mongoose.Types.ObjectId;
|
|
16
|
+
}
|
|
17
|
+
export declare class MarketingConflictService {
|
|
18
|
+
private repository;
|
|
19
|
+
constructor();
|
|
20
|
+
getRewardTypeGroups(marketingType: MarketingType, tiers?: {
|
|
21
|
+
rewardType: SpendToGetRewardType;
|
|
22
|
+
}[]): RewardTypeGroup[];
|
|
23
|
+
findConflicting(params: ConflictCheckParams): Promise<DocumentType<Marketing>[]>;
|
|
24
|
+
assertNoConflict(params: ConflictCheckParams): Promise<void>;
|
|
25
|
+
private describeConflict;
|
|
26
|
+
}
|
|
27
|
+
export declare const marketingConflictService: MarketingConflictService;
|
|
28
|
+
//# sourceMappingURL=marketing-conflict.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing-conflict.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/marketing-conflict.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AACtE,OAAO,EAAmB,aAAa,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;AAI3F,oBAAY,eAAe;IAC1B,QAAQ,aAAa;IACrB,aAAa,kBAAkB;CAC/B;AAED,eAAO,MAAM,8BAA8B,iBAK1C,CAAC;AAKF,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC9B,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;IAC1C,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;CAC7C;AAED,qBACa,wBAAwB;IACpC,OAAO,CAAC,UAAU,CAA8B;;IAUzC,mBAAmB,CACzB,aAAa,EAAE,aAAa,EAC5B,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,oBAAoB,CAAA;KAAE,EAAE,GAC5C,eAAe,EAAE;IAoCP,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;IA8BhF,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzE,OAAO,CAAC,gBAAgB;CAaxB;AAED,eAAO,MAAM,wBAAwB,0BAA0C,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.marketingConflictService = exports.MarketingConflictService = exports.CONFLICT_CHECK_MARKETING_TYPES = exports.RewardTypeGroup = void 0;
|
|
46
|
+
const typedi_1 = __importStar(require("typedi"));
|
|
47
|
+
const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
|
|
48
|
+
const error_common_1 = require("@lyxa.ai/core/dist/utilities/error-common");
|
|
49
|
+
const marketing_conflict_repository_1 = require("./marketing-conflict.repository");
|
|
50
|
+
var RewardTypeGroup;
|
|
51
|
+
(function (RewardTypeGroup) {
|
|
52
|
+
RewardTypeGroup["DISCOUNT"] = "discount";
|
|
53
|
+
RewardTypeGroup["FREE_DELIVERY"] = "free_delivery";
|
|
54
|
+
})(RewardTypeGroup || (exports.RewardTypeGroup = RewardTypeGroup = {}));
|
|
55
|
+
exports.CONFLICT_CHECK_MARKETING_TYPES = [
|
|
56
|
+
enum_1.MarketingType.DISCOUNT,
|
|
57
|
+
enum_1.MarketingType.BUY1GET1,
|
|
58
|
+
enum_1.MarketingType.FREE_DELIVERY,
|
|
59
|
+
enum_1.MarketingType.SPEND_TO_GET,
|
|
60
|
+
];
|
|
61
|
+
const MAX_DATE = new Date('9999-12-31T23:59:59.999Z');
|
|
62
|
+
let MarketingConflictService = class MarketingConflictService {
|
|
63
|
+
repository;
|
|
64
|
+
constructor() {
|
|
65
|
+
this.repository = typedi_1.default.get(marketing_conflict_repository_1.MarketingConflictRepository);
|
|
66
|
+
}
|
|
67
|
+
getRewardTypeGroups(marketingType, tiers) {
|
|
68
|
+
if (marketingType === enum_1.MarketingType.DISCOUNT || marketingType === enum_1.MarketingType.BUY1GET1) {
|
|
69
|
+
return [RewardTypeGroup.DISCOUNT];
|
|
70
|
+
}
|
|
71
|
+
if (marketingType === enum_1.MarketingType.FREE_DELIVERY) {
|
|
72
|
+
return [RewardTypeGroup.FREE_DELIVERY];
|
|
73
|
+
}
|
|
74
|
+
if (marketingType === enum_1.MarketingType.SPEND_TO_GET) {
|
|
75
|
+
const groups = new Set();
|
|
76
|
+
for (const tier of tiers ?? []) {
|
|
77
|
+
groups.add(tier.rewardType === enum_1.SpendToGetRewardType.FREE_DELIVERY
|
|
78
|
+
? RewardTypeGroup.FREE_DELIVERY
|
|
79
|
+
: RewardTypeGroup.DISCOUNT);
|
|
80
|
+
}
|
|
81
|
+
return Array.from(groups);
|
|
82
|
+
}
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
async findConflicting(params) {
|
|
86
|
+
if (params.rewardTypeGroups.length === 0)
|
|
87
|
+
return [];
|
|
88
|
+
const newStart = params.duration.start;
|
|
89
|
+
const newEnd = params.duration.end ?? MAX_DATE;
|
|
90
|
+
const newIsSpendToGet = params.marketingType === enum_1.MarketingType.SPEND_TO_GET;
|
|
91
|
+
const candidates = await this.repository.find({
|
|
92
|
+
shop: params.shop,
|
|
93
|
+
status: enum_1.MarketingStatus.ACTIVE,
|
|
94
|
+
marketingType: { $in: exports.CONFLICT_CHECK_MARKETING_TYPES },
|
|
95
|
+
...(params.excludeMarketingId && { _id: { $ne: params.excludeMarketingId } }),
|
|
96
|
+
'duration.start': { $lt: newEnd },
|
|
97
|
+
$or: [{ 'duration.end': { $exists: false } }, { 'duration.end': { $gt: newStart } }],
|
|
98
|
+
});
|
|
99
|
+
return candidates.filter(candidate => {
|
|
100
|
+
const candidateIsSpendToGet = candidate.marketingType === enum_1.MarketingType.SPEND_TO_GET;
|
|
101
|
+
if (!newIsSpendToGet && !candidateIsSpendToGet)
|
|
102
|
+
return false;
|
|
103
|
+
const candidateGroups = this.getRewardTypeGroups(candidate.marketingType, candidate.tiers);
|
|
104
|
+
return candidateGroups.some(group => params.rewardTypeGroups.includes(group));
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async assertNoConflict(params) {
|
|
108
|
+
const conflicts = await this.findConflicting(params);
|
|
109
|
+
if (conflicts.length === 0)
|
|
110
|
+
return;
|
|
111
|
+
const messages = new Set();
|
|
112
|
+
for (const conflict of conflicts) {
|
|
113
|
+
for (const group of this.getRewardTypeGroups(conflict.marketingType, conflict.tiers)) {
|
|
114
|
+
if (params.rewardTypeGroups.includes(group)) {
|
|
115
|
+
messages.add(this.describeConflict(conflict.marketingType, group));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
(0, error_common_1.conflictError)(Array.from(messages).join(' '));
|
|
120
|
+
}
|
|
121
|
+
describeConflict(existingType, group) {
|
|
122
|
+
const isFreeDelivery = group === RewardTypeGroup.FREE_DELIVERY;
|
|
123
|
+
if (existingType === enum_1.MarketingType.SPEND_TO_GET) {
|
|
124
|
+
return isFreeDelivery
|
|
125
|
+
? 'This shop already has an active Spend to Get promotion offering Free Delivery for these dates.'
|
|
126
|
+
: 'This shop already has an active Spend to Get promotion offering a discount for these dates.';
|
|
127
|
+
}
|
|
128
|
+
return isFreeDelivery
|
|
129
|
+
? 'This shop already has an active Free Delivery promotion for these dates.'
|
|
130
|
+
: 'This shop already has an active Discount/B1G1 promotion for these dates.';
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
exports.MarketingConflictService = MarketingConflictService;
|
|
134
|
+
exports.MarketingConflictService = MarketingConflictService = __decorate([
|
|
135
|
+
(0, typedi_1.Service)(),
|
|
136
|
+
__metadata("design:paramtypes", [])
|
|
137
|
+
], MarketingConflictService);
|
|
138
|
+
exports.marketingConflictService = typedi_1.default.get(MarketingConflictService);
|
|
139
|
+
//# sourceMappingURL=marketing-conflict.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing-conflict.service.js","sourceRoot":"/","sources":["modules/marketing/services/marketing-conflict.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA4C;AAG5C,4DAAyG;AAEzG,4EAA0E;AAC1E,mFAA8E;AAE9E,IAAY,eAGX;AAHD,WAAY,eAAe;IAC1B,wCAAqB,CAAA;IACrB,kDAA+B,CAAA;AAChC,CAAC,EAHW,eAAe,+BAAf,eAAe,QAG1B;AAEY,QAAA,8BAA8B,GAAG;IAC7C,oBAAa,CAAC,QAAQ;IACtB,oBAAa,CAAC,QAAQ;IACtB,oBAAa,CAAC,aAAa;IAC3B,oBAAa,CAAC,YAAY;CAC1B,CAAC;AAGF,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAW/C,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAC5B,UAAU,CAA8B;IAEhD;QACC,IAAI,CAAC,UAAU,GAAG,gBAAS,CAAC,GAAG,CAAC,2DAA2B,CAAC,CAAC;IAC9D,CAAC;IAMM,mBAAmB,CACzB,aAA4B,EAC5B,KAA8C;QAE9C,IAAI,aAAa,KAAK,oBAAa,CAAC,QAAQ,IAAI,aAAa,KAAK,oBAAa,CAAC,QAAQ,EAAE,CAAC;YAC1F,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,aAAa,KAAK,oBAAa,CAAC,aAAa,EAAE,CAAC;YACnD,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,aAAa,KAAK,oBAAa,CAAC,YAAY,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,CACT,IAAI,CAAC,UAAU,KAAK,2BAAoB,CAAC,aAAa;oBACrD,CAAC,CAAC,eAAe,CAAC,aAAa;oBAC/B,CAAC,CAAC,eAAe,CAAC,QAAQ,CAC3B,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC;IAcM,KAAK,CAAC,eAAe,CAAC,MAA2B;QACvD,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC;QAC/C,MAAM,eAAe,GAAG,MAAM,CAAC,aAAa,KAAK,oBAAa,CAAC,YAAY,CAAC;QAE5E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,sBAAe,CAAC,MAAM;YAC9B,aAAa,EAAE,EAAE,GAAG,EAAE,sCAA8B,EAAE;YACtD,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC7E,gBAAgB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;YACjC,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC;SACpF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;YACpC,MAAM,qBAAqB,GAAG,SAAS,CAAC,aAAa,KAAK,oBAAa,CAAC,YAAY,CAAC;YACrF,IAAI,CAAC,eAAe,IAAI,CAAC,qBAAqB;gBAAE,OAAO,KAAK,CAAC;YAE7D,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,aAAa,EAAG,SAAiB,CAAC,KAAK,CAAC,CAAC;YACpG,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACJ,CAAC;IAOM,KAAK,CAAC,gBAAgB,CAAC,MAA2B;QACxD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,aAAa,EAAG,QAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/F,IAAI,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7C,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpE,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAA,4BAAa,EAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAEO,gBAAgB,CAAC,YAA2B,EAAE,KAAsB;QAC3E,MAAM,cAAc,GAAG,KAAK,KAAK,eAAe,CAAC,aAAa,CAAC;QAE/D,IAAI,YAAY,KAAK,oBAAa,CAAC,YAAY,EAAE,CAAC;YACjD,OAAO,cAAc;gBACpB,CAAC,CAAC,gGAAgG;gBAClG,CAAC,CAAC,6FAA6F,CAAC;QAClG,CAAC;QAED,OAAO,cAAc;YACpB,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,0EAA0E,CAAC;IAC/E,CAAC;CACD,CAAA;AA7GY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,gBAAO,GAAE;;GACG,wBAAwB,CA6GpC;AAEY,QAAA,wBAAwB,GAAG,gBAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC","sourcesContent":["import Container, { Service } from 'typedi';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { Marketing } from '@lyxa.ai/core/dist/libraries/mongo/models';\nimport { MarketingStatus, MarketingType, SpendToGetRewardType } from '@lyxa.ai/core/dist/utilities/enum';\nimport { Duration } from '@lyxa.ai/core/dist/libraries/mongo/models/shared/duration.model';\nimport { conflictError } from '@lyxa.ai/core/dist/utilities/error-common';\nimport { MarketingConflictRepository } from './marketing-conflict.repository';\n\nexport enum RewardTypeGroup {\n\tDISCOUNT = 'discount',\n\tFREE_DELIVERY = 'free_delivery',\n}\n\nexport const CONFLICT_CHECK_MARKETING_TYPES = [\n\tMarketingType.DISCOUNT,\n\tMarketingType.BUY1GET1,\n\tMarketingType.FREE_DELIVERY,\n\tMarketingType.SPEND_TO_GET,\n];\n\n// Open-ended promotions (no duration.end) are treated as running indefinitely for overlap purposes.\nconst MAX_DATE = new Date('9999-12-31T23:59:59.999Z');\n\nexport interface ConflictCheckParams {\n\tshop: mongoose.Types.ObjectId;\n\tmarketingType: MarketingType;\n\tduration: Pick<Duration, 'start' | 'end'>;\n\trewardTypeGroups: RewardTypeGroup[];\n\texcludeMarketingId?: mongoose.Types.ObjectId;\n}\n\n@Service()\nexport class MarketingConflictService {\n\tprivate repository: MarketingConflictRepository;\n\n\tconstructor() {\n\t\tthis.repository = Container.get(MarketingConflictRepository);\n\t}\n\n\t/**\n\t * A Spend-to-Get promotion's reward-type-group membership is the union of all its tiers'\n\t * reward types (a promotion with both a discount and a free-delivery tier belongs to both groups).\n\t */\n\tpublic getRewardTypeGroups(\n\t\tmarketingType: MarketingType,\n\t\ttiers?: { rewardType: SpendToGetRewardType }[]\n\t): RewardTypeGroup[] {\n\t\tif (marketingType === MarketingType.DISCOUNT || marketingType === MarketingType.BUY1GET1) {\n\t\t\treturn [RewardTypeGroup.DISCOUNT];\n\t\t}\n\n\t\tif (marketingType === MarketingType.FREE_DELIVERY) {\n\t\t\treturn [RewardTypeGroup.FREE_DELIVERY];\n\t\t}\n\n\t\tif (marketingType === MarketingType.SPEND_TO_GET) {\n\t\t\tconst groups = new Set<RewardTypeGroup>();\n\t\t\tfor (const tier of tiers ?? []) {\n\t\t\t\tgroups.add(\n\t\t\t\t\ttier.rewardType === SpendToGetRewardType.FREE_DELIVERY\n\t\t\t\t\t\t? RewardTypeGroup.FREE_DELIVERY\n\t\t\t\t\t\t: RewardTypeGroup.DISCOUNT\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn Array.from(groups);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Finds other active promotions on the same shop whose date range overlaps `duration` and whose\n\t * reward-type-group membership intersects `rewardTypeGroups`. Strict `<`/`>` comparisons mean\n\t * back-to-back dates (one ends 23:59, the next starts 00:00) are not treated as overlapping.\n\t *\n\t * The exclusivity rule applies only to pairings that involve a Spend-to-Get promotion. Two\n\t * standalone promotions (e.g. an admin Discount and a shop Discount) are allowed to run\n\t * concurrently and are intentionally never flagged here.\n\t */\n\t// ponytail: check-then-write, not transactional — two same-shop activations racing within the\n\t// same millisecond could both pass. Upgrade to a per-shop lock document + mongoose session if\n\t// concurrent admin activation ever becomes frequent enough to matter.\n\tpublic async findConflicting(params: ConflictCheckParams): Promise<DocumentType<Marketing>[]> {\n\t\tif (params.rewardTypeGroups.length === 0) return [];\n\n\t\tconst newStart = params.duration.start;\n\t\tconst newEnd = params.duration.end ?? MAX_DATE;\n\t\tconst newIsSpendToGet = params.marketingType === MarketingType.SPEND_TO_GET;\n\n\t\tconst candidates = await this.repository.find({\n\t\t\tshop: params.shop,\n\t\t\tstatus: MarketingStatus.ACTIVE,\n\t\t\tmarketingType: { $in: CONFLICT_CHECK_MARKETING_TYPES },\n\t\t\t...(params.excludeMarketingId && { _id: { $ne: params.excludeMarketingId } }),\n\t\t\t'duration.start': { $lt: newEnd },\n\t\t\t$or: [{ 'duration.end': { $exists: false } }, { 'duration.end': { $gt: newStart } }],\n\t\t});\n\n\t\treturn candidates.filter(candidate => {\n\t\t\tconst candidateIsSpendToGet = candidate.marketingType === MarketingType.SPEND_TO_GET;\n\t\t\tif (!newIsSpendToGet && !candidateIsSpendToGet) return false;\n\n\t\t\tconst candidateGroups = this.getRewardTypeGroups(candidate.marketingType, (candidate as any).tiers);\n\t\t\treturn candidateGroups.some(group => params.rewardTypeGroups.includes(group));\n\t\t});\n\t}\n\n\t/**\n\t * Throws a CONFLICT error describing the existing blocking promotion. The message identifies\n\t * whether the blocker is a Spend-to-Get promotion or a standalone one and which reward type\n\t * (Free Delivery vs discount) actually overlaps.\n\t */\n\tpublic async assertNoConflict(params: ConflictCheckParams): Promise<void> {\n\t\tconst conflicts = await this.findConflicting(params);\n\t\tif (conflicts.length === 0) return;\n\n\t\tconst messages = new Set<string>();\n\t\tfor (const conflict of conflicts) {\n\t\t\tfor (const group of this.getRewardTypeGroups(conflict.marketingType, (conflict as any).tiers)) {\n\t\t\t\tif (params.rewardTypeGroups.includes(group)) {\n\t\t\t\t\tmessages.add(this.describeConflict(conflict.marketingType, group));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconflictError(Array.from(messages).join(' '));\n\t}\n\n\tprivate describeConflict(existingType: MarketingType, group: RewardTypeGroup): string {\n\t\tconst isFreeDelivery = group === RewardTypeGroup.FREE_DELIVERY;\n\n\t\tif (existingType === MarketingType.SPEND_TO_GET) {\n\t\t\treturn isFreeDelivery\n\t\t\t\t? 'This shop already has an active Spend to Get promotion offering Free Delivery for these dates.'\n\t\t\t\t: 'This shop already has an active Spend to Get promotion offering a discount for these dates.';\n\t\t}\n\n\t\treturn isFreeDelivery\n\t\t\t? 'This shop already has an active Free Delivery promotion for these dates.'\n\t\t\t: 'This shop already has an active Discount/B1G1 promotion for these dates.';\n\t}\n}\n\nexport const marketingConflictService = Container.get(MarketingConflictService);\n"]}
|
|
@@ -10,13 +10,17 @@ export declare class MarketingService {
|
|
|
10
10
|
private marketingMetricsRepository;
|
|
11
11
|
private limitedTimeOfferParticipantModel;
|
|
12
12
|
constructor();
|
|
13
|
-
create(data: AllMarketingsValidationDTO, admin?: mongoose.Types.ObjectId
|
|
13
|
+
create(data: AllMarketingsValidationDTO, admin?: mongoose.Types.ObjectId, options?: {
|
|
14
|
+
skipLimitedTimeOfferGuard?: boolean;
|
|
15
|
+
}): Promise<DocumentType<Model>>;
|
|
14
16
|
findById(data: GetByIdInputDTO): Promise<DocumentType<Model>>;
|
|
15
17
|
find(data?: Partial<FilterDTO>): Promise<PaginatedResponse<DocumentType<ModelType<Model>>>>;
|
|
16
18
|
update(_id: mongoose.Types.ObjectId, data: UpdateDTO, admin?: mongoose.Types.ObjectId): Promise<DocumentType<Model>>;
|
|
17
19
|
private verifyUnpauseConditions;
|
|
18
20
|
private logMarketingAdminAction;
|
|
19
|
-
deleteById(data: DeleteDTO, admin?: mongoose.Types.ObjectId
|
|
21
|
+
deleteById(data: DeleteDTO, admin?: mongoose.Types.ObjectId, options?: {
|
|
22
|
+
skipLimitedTimeOfferGuard?: boolean;
|
|
23
|
+
}): Promise<string>;
|
|
20
24
|
deleteManyByIds(marketingIds: mongoose.Types.ObjectId[], softDelete?: boolean): Promise<void>;
|
|
21
25
|
handleNewProductForEntireMenuMarketing(data: ProductEntireMenuMarketingHandlerDTO): Promise<string>;
|
|
22
26
|
incrementMarketingSpentFromOrder(orderId: mongoose.Types.ObjectId): Promise<any>;
|
|
@@ -24,6 +28,7 @@ export declare class MarketingService {
|
|
|
24
28
|
private expireMarketingsExceedingSpendLimits;
|
|
25
29
|
private unExpireMarketingsBelowSpendLimits;
|
|
26
30
|
recomputeAndSyncAllMarketingSpent(): Promise<void>;
|
|
31
|
+
private publishEntireMenuSeedEvents;
|
|
27
32
|
reseedEntireMenuMarketing(marketingId: mongoose.Types.ObjectId): Promise<void>;
|
|
28
33
|
assignMarketingToProducts(marketing: DocumentType<Buy1Get1Marketing | DiscountMarketing>): Promise<void>;
|
|
29
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/marketing.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EAMjB,SAAS,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"marketing.service.d.ts","sourceRoot":"/","sources":["modules/marketing/services/marketing.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EAMjB,SAAS,IAAI,KAAK,EAOlB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAEN,0BAA0B,EAE1B,oCAAoC,EACpC,kBAAkB,IAAI,SAAS,EAC/B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AA+C3D,qBACa,gBAAgB;IAC5B,OAAO,CAAC,KAAK,CAAiD;IAC9D,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,UAAU,CAA2D;IAC7E,OAAO,CAAC,0BAA0B,CAA6B;IAC/D,OAAO,CAAC,gCAAgC,CACM;;IAgBjC,MAAM,CAClB,IAAI,EAAE,0BAA0B,EAChC,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC/B,OAAO,CAAC,EAAE;QAAE,yBAAyB,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/C,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IA+JlB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAsB7D,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IA0B3F,MAAM,CAClB,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC5B,IAAI,EAAE,SAAS,EACf,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAC7B,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAqIjB,uBAAuB;YA+BvB,uBAAuB;IAmBxB,UAAU,CACtB,IAAI,EAAE,SAAS,EACf,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAC/B,OAAO,CAAC,EAAE;QAAE,yBAAyB,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/C,OAAO,CAAC,MAAM,CAAC;IAkDL,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC1F,sCAAsC,CAAC,IAAI,EAAE,oCAAoC;IA8BjF,gCAAgC,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAiChF,gCAAgC,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;YAiC/E,oCAAoC;YAgBpC,kCAAkC;IAgBnC,iCAAiC,IAAI,OAAO,CAAC,IAAI,CAAC;YAqCjD,2BAA2B;IA2B5B,yBAAyB,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9E,yBAAyB,CAAC,SAAS,EAAE,YAAY,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;CAqCrG;AAED,eAAO,MAAM,gBAAgB,kBAAkC,CAAC"}
|
|
@@ -55,12 +55,14 @@ const admin_logs_event_1 = require("@lyxa.ai/core/dist/libraries/event/events/ad
|
|
|
55
55
|
const enum_1 = require("@lyxa.ai/core/dist/utilities/enum");
|
|
56
56
|
const event_1 = require("@lyxa.ai/core/dist/libraries/event");
|
|
57
57
|
const marketing_product_seed_event_1 = require("../../../event/events/marketing-product-seed.event");
|
|
58
|
+
const marketing_product_sync_event_1 = require("../../../event/events/marketing-product-sync.event");
|
|
58
59
|
const _1 = require(".");
|
|
59
60
|
const enum_2 = require("@lyxa.ai/core/dist/utilities/enum");
|
|
60
61
|
const error_common_1 = require("@lyxa.ai/core/dist/utilities/error-common");
|
|
61
62
|
const mongo_stream_changes_batch_process_shops_event_1 = require("@lyxa.ai/core/dist/libraries/event/events/mongo-stream-changes-batch-process-shops-event");
|
|
62
63
|
const MarketingMetricsRepository_1 = require("../patterns/repository/MarketingMetricsRepository");
|
|
63
64
|
const marketing_product_sync_queue_1 = require("../queues/marketing-product-sync.queue");
|
|
65
|
+
const limited_time_offer_participant_service_1 = require("../../limited-time-offer/participant/services/limited-time-offer-participant.service");
|
|
64
66
|
let MarketingService = class MarketingService {
|
|
65
67
|
model;
|
|
66
68
|
shopModel;
|
|
@@ -75,14 +77,21 @@ let MarketingService = class MarketingService {
|
|
|
75
77
|
this.limitedTimeOfferParticipantModel =
|
|
76
78
|
models_1.LimitedTimeOfferParticipantModel;
|
|
77
79
|
}
|
|
78
|
-
async create(data, admin) {
|
|
80
|
+
async create(data, admin, options) {
|
|
79
81
|
const now = (0, dayjs_1.dayjs)().toDate();
|
|
82
|
+
if (!options?.skipLimitedTimeOfferGuard &&
|
|
83
|
+
data.marketingType === enum_2.MarketingType.DISCOUNT &&
|
|
84
|
+
(await limited_time_offer_participant_service_1.ltoParticipantService.isActiveParticipant(data.shop))) {
|
|
85
|
+
(0, error_common_1.forbiddenError)('You are currently participating in a Limited Time Offer. Please manage your discount from the Limited Time Offer section or withdraw first.');
|
|
86
|
+
}
|
|
80
87
|
const existingRecord = await this.model.findOne({
|
|
81
88
|
shop: data.shop,
|
|
82
89
|
marketingType: data.marketingType,
|
|
83
90
|
'duration.end': { $gt: now },
|
|
84
91
|
status: enum_1.MarketingStatus.ACTIVE,
|
|
85
92
|
isAppliedByCompany: data.isAppliedByCompany,
|
|
93
|
+
campaignType: data.campaignType,
|
|
94
|
+
admin: admin ? { $ne: null } : null,
|
|
86
95
|
});
|
|
87
96
|
if (existingRecord) {
|
|
88
97
|
throw new server_1.TRPCError({
|
|
@@ -90,6 +99,14 @@ let MarketingService = class MarketingService {
|
|
|
90
99
|
message: `This shop already has a ${data.marketingType} marketing`,
|
|
91
100
|
});
|
|
92
101
|
}
|
|
102
|
+
if (_1.CONFLICT_CHECK_MARKETING_TYPES.includes(data.marketingType)) {
|
|
103
|
+
await _1.marketingConflictService.assertNoConflict({
|
|
104
|
+
shop: data.shop,
|
|
105
|
+
marketingType: data.marketingType,
|
|
106
|
+
duration: data.duration,
|
|
107
|
+
rewardTypeGroups: _1.marketingConflictService.getRewardTypeGroups(data.marketingType, data.tiers),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
93
110
|
if (data.isEntireMenu) {
|
|
94
111
|
const existingMarketing = await this.model.findOne({
|
|
95
112
|
shop: data.shop,
|
|
@@ -114,12 +131,17 @@ let MarketingService = class MarketingService {
|
|
|
114
131
|
message: `Product list contains duplicate products`,
|
|
115
132
|
});
|
|
116
133
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
134
|
+
if (data.campaignType === enum_1.MarketingCampaignType.LIMITED_TIME_OFFER) {
|
|
135
|
+
await _1.productMarketingService.pauseConflictingMarketings(productIds);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const isAvailable = await _1.productMarketingService.checkProductMarketingAvailability(productIds, data.isAppliedByCompany);
|
|
139
|
+
if (!isAvailable) {
|
|
140
|
+
throw new server_1.TRPCError({
|
|
141
|
+
code: 'CONFLICT',
|
|
142
|
+
message: `Product list contains products which already have marketing applied`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
123
145
|
}
|
|
124
146
|
}
|
|
125
147
|
if (admin) {
|
|
@@ -153,6 +175,10 @@ let MarketingService = class MarketingService {
|
|
|
153
175
|
marketing = await _1.punchMarketingService.create(data);
|
|
154
176
|
break;
|
|
155
177
|
}
|
|
178
|
+
case enum_2.MarketingType.SPEND_TO_GET: {
|
|
179
|
+
marketing = await _1.spendToGetMarketingService.create(data);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
156
182
|
default: {
|
|
157
183
|
marketing = await this.model.create(data, admin);
|
|
158
184
|
}
|
|
@@ -226,9 +252,12 @@ let MarketingService = class MarketingService {
|
|
|
226
252
|
if (!oldMarketing) {
|
|
227
253
|
(0, error_common_1.notFoundError)('Could not find marketing');
|
|
228
254
|
}
|
|
229
|
-
if (data.status &&
|
|
230
|
-
|
|
231
|
-
|
|
255
|
+
if (data.status && data.status === enum_1.MarketingStatus.ACTIVE && oldMarketing.status !== enum_1.MarketingStatus.ACTIVE) {
|
|
256
|
+
if (oldMarketing.status === enum_1.MarketingStatus.PAUSED &&
|
|
257
|
+
oldMarketing.marketingType === enum_2.MarketingType.DISCOUNT &&
|
|
258
|
+
(await limited_time_offer_participant_service_1.ltoParticipantService.isActiveParticipant(oldMarketing.shop._id))) {
|
|
259
|
+
(0, error_common_1.forbiddenError)('You are currently participating in a Limited Time Offer. Please manage your discount from the Limited Time Offer section or withdraw first.');
|
|
260
|
+
}
|
|
232
261
|
await this.verifyUnpauseConditions(_id);
|
|
233
262
|
}
|
|
234
263
|
switch (oldMarketing.marketingType) {
|
|
@@ -255,6 +284,10 @@ let MarketingService = class MarketingService {
|
|
|
255
284
|
marketing = await _1.punchMarketingService.update(_id, data);
|
|
256
285
|
break;
|
|
257
286
|
}
|
|
287
|
+
case enum_2.MarketingType.SPEND_TO_GET: {
|
|
288
|
+
marketing = await _1.spendToGetMarketingService.update(_id, data);
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
258
291
|
default: {
|
|
259
292
|
marketing = await this.model
|
|
260
293
|
.findOneAndUpdate({
|
|
@@ -305,6 +338,15 @@ let MarketingService = class MarketingService {
|
|
|
305
338
|
(0, error_common_1.conflictError)("You can't activate discount and B1G1 on the same items at the same time");
|
|
306
339
|
}
|
|
307
340
|
}
|
|
341
|
+
if (_1.CONFLICT_CHECK_MARKETING_TYPES.includes(marketing.marketingType)) {
|
|
342
|
+
await _1.marketingConflictService.assertNoConflict({
|
|
343
|
+
shop: marketing.shop,
|
|
344
|
+
marketingType: marketing.marketingType,
|
|
345
|
+
duration: marketing.duration,
|
|
346
|
+
rewardTypeGroups: _1.marketingConflictService.getRewardTypeGroups(marketing.marketingType, marketing.tiers),
|
|
347
|
+
excludeMarketingId: marketingId,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
308
350
|
}
|
|
309
351
|
async logMarketingAdminAction(admin, actionType, oldDocument, newDocument) {
|
|
310
352
|
const adminActivityLogsEvent = new admin_logs_event_1.AdminActivityLogsEvent({
|
|
@@ -315,8 +357,16 @@ let MarketingService = class MarketingService {
|
|
|
315
357
|
});
|
|
316
358
|
await (0, event_1.publishEvent)(adminActivityLogsEvent);
|
|
317
359
|
}
|
|
318
|
-
async deleteById(data, admin) {
|
|
360
|
+
async deleteById(data, admin, options) {
|
|
319
361
|
const { _id, softDelete } = data;
|
|
362
|
+
if (!options?.skipLimitedTimeOfferGuard) {
|
|
363
|
+
const partOfLimitedTimeOffer = await this.limitedTimeOfferParticipantModel.exists({
|
|
364
|
+
marketing: _id,
|
|
365
|
+
});
|
|
366
|
+
if (partOfLimitedTimeOffer) {
|
|
367
|
+
(0, error_common_1.forbiddenError)('You are currently participating in a Limited Time Offer. Please make your edits from the Limited Time Offer section.');
|
|
368
|
+
}
|
|
369
|
+
}
|
|
320
370
|
const record = await this.model.findById(_id).populate({
|
|
321
371
|
path: 'shop',
|
|
322
372
|
select: '_id name shopId',
|
|
@@ -494,31 +544,34 @@ let MarketingService = class MarketingService {
|
|
|
494
544
|
await this.expireMarketingsExceedingSpendLimits(marketingIds);
|
|
495
545
|
await this.unExpireMarketingsBelowSpendLimits(marketingIds);
|
|
496
546
|
}
|
|
547
|
+
async publishEntireMenuSeedEvents(marketing) {
|
|
548
|
+
const PAGE_SIZE = 500;
|
|
549
|
+
const marketingId = marketing._id.toString();
|
|
550
|
+
const shopId = (marketing.shop?._id ?? marketing.shop).toString();
|
|
551
|
+
const products = await models_1.ProductModel.find({ shop: marketing.shop }).select('_id').lean();
|
|
552
|
+
const productIds = products.map((p) => p._id.toString());
|
|
553
|
+
for (let i = 0; i < productIds.length; i += PAGE_SIZE) {
|
|
554
|
+
await (0, event_1.publishEvent)(new marketing_product_seed_event_1.MarketingEntireMenuSeedEvent({
|
|
555
|
+
marketingId,
|
|
556
|
+
shopId,
|
|
557
|
+
isAppliedByCompany: marketing.isAppliedByCompany ?? false,
|
|
558
|
+
isBuy1Get1: marketing.marketingType === enum_2.MarketingType.BUY1GET1,
|
|
559
|
+
value: marketing.value,
|
|
560
|
+
valueType: marketing.valueType,
|
|
561
|
+
productIds: productIds.slice(i, i + PAGE_SIZE),
|
|
562
|
+
}));
|
|
563
|
+
}
|
|
564
|
+
return productIds.length;
|
|
565
|
+
}
|
|
497
566
|
async reseedEntireMenuMarketing(marketingId) {
|
|
498
567
|
const logger = (0, core_1.getLibraries)().getLoggerKit();
|
|
499
568
|
const marketing = await this.model.findOne({ _id: marketingId, deletedAt: null });
|
|
500
569
|
if (!marketing)
|
|
501
570
|
(0, error_common_1.internalServerError)('Marketing not found');
|
|
502
|
-
const
|
|
503
|
-
|
|
504
|
-
const shopId = (marketing.shop?._id ?? marketing.shop).toString();
|
|
505
|
-
const count = await models_1.ProductModel.countDocuments({ shop: marketing.shop });
|
|
506
|
-
const pages = Math.ceil(count / PAGE_SIZE);
|
|
507
|
-
if (!pages)
|
|
508
|
-
return;
|
|
509
|
-
await Promise.all(Array.from({ length: pages }, (_, page) => (0, event_1.publishEvent)(new marketing_product_seed_event_1.MarketingEntireMenuSeedEvent({
|
|
510
|
-
marketingId: mid,
|
|
511
|
-
shopId,
|
|
512
|
-
isAppliedByCompany: marketing.isAppliedByCompany ?? false,
|
|
513
|
-
isBuy1Get1: marketing.marketingType === enum_2.MarketingType.BUY1GET1,
|
|
514
|
-
value: marketing.value,
|
|
515
|
-
valueType: marketing.valueType,
|
|
516
|
-
page,
|
|
517
|
-
pageSize: PAGE_SIZE,
|
|
518
|
-
}))));
|
|
519
|
-
logger.debug(`entire-menu reseed dispatched — ${pages} pages for ${count} products`, {
|
|
571
|
+
const productCount = await this.publishEntireMenuSeedEvents(marketing);
|
|
572
|
+
logger.debug(`entire-menu reseed dispatched — ${productCount} products`, {
|
|
520
573
|
tag: 'marketing.seed.entire-menu',
|
|
521
|
-
data: { marketingId:
|
|
574
|
+
data: { marketingId: marketingId.toString(), productCount },
|
|
522
575
|
});
|
|
523
576
|
}
|
|
524
577
|
async assignMarketingToProducts(marketing) {
|
|
@@ -528,31 +581,27 @@ let MarketingService = class MarketingService {
|
|
|
528
581
|
}
|
|
529
582
|
if (marketing.isEntireMenu) {
|
|
530
583
|
const logger = (0, core_1.getLibraries)().getLoggerKit();
|
|
531
|
-
const
|
|
532
|
-
|
|
584
|
+
const productCount = await this.publishEntireMenuSeedEvents(marketing);
|
|
585
|
+
logger.debug(`entire-menu marketing seed dispatched — ${productCount} products`, {
|
|
586
|
+
tag: 'marketing.seed.entire-menu',
|
|
587
|
+
data: { marketingId: marketing._id.toString(), productCount },
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
533
591
|
const shopId = (marketing.shop?._id ?? marketing.shop).toString();
|
|
534
|
-
const
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
592
|
+
const pms = await models_1.ProductMarketingModel.find({ marketing: marketing._id, deletedAt: null })
|
|
593
|
+
.select('product')
|
|
594
|
+
.lean();
|
|
595
|
+
const productIds = pms.map((p) => p.product.toString());
|
|
596
|
+
const PAGE_SIZE = 500;
|
|
597
|
+
for (let i = 0; i < productIds.length; i += PAGE_SIZE) {
|
|
598
|
+
await (0, event_1.publishEvent)(new marketing_product_sync_event_1.MarketingProductSyncEvent({
|
|
599
|
+
marketingId: marketing._id.toString(),
|
|
539
600
|
shopId,
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
value: marketing.value,
|
|
543
|
-
valueType: marketing.valueType,
|
|
544
|
-
page,
|
|
545
|
-
pageSize: PAGE_SIZE,
|
|
546
|
-
}))));
|
|
547
|
-
logger.debug(`entire-menu marketing seed dispatched — ${pages} pages for ${count} products`, {
|
|
548
|
-
tag: 'marketing.seed.entire-menu',
|
|
549
|
-
data: { marketingId, shopId, pages, productCount: count },
|
|
550
|
-
});
|
|
601
|
+
productIds: productIds.slice(i, i + PAGE_SIZE),
|
|
602
|
+
}));
|
|
551
603
|
}
|
|
552
604
|
}
|
|
553
|
-
else {
|
|
554
|
-
await _1.productMarketingService.syncProductMarketingInfo(marketing._id);
|
|
555
|
-
}
|
|
556
605
|
}
|
|
557
606
|
};
|
|
558
607
|
exports.MarketingService = MarketingService;
|