@hartl-services/medusa-affiliate 0.3.0

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 (169) hide show
  1. package/.medusa/server/src/admin/index.js +3739 -0
  2. package/.medusa/server/src/admin/index.mjs +3738 -0
  3. package/.medusa/server/src/api/admin/affiliate-applications/[id]/approve/route.js +28 -0
  4. package/.medusa/server/src/api/admin/affiliate-applications/[id]/reject/route.js +19 -0
  5. package/.medusa/server/src/api/admin/affiliate-applications/route.js +23 -0
  6. package/.medusa/server/src/api/admin/affiliate-distribution-reports/query.js +171 -0
  7. package/.medusa/server/src/api/admin/affiliate-distribution-reports/route.js +13 -0
  8. package/.medusa/server/src/api/admin/affiliate-program-settings/route.js +27 -0
  9. package/.medusa/server/src/api/admin/affiliate-reports/[id]/route.js +45 -0
  10. package/.medusa/server/src/api/admin/affiliate-reports/route.js +27 -0
  11. package/.medusa/server/src/api/admin/affiliates/[id]/consignment-reminders/route.js +31 -0
  12. package/.medusa/server/src/api/admin/affiliates/[id]/consignment-transfers/route.js +41 -0
  13. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/reconcile/route.js +34 -0
  14. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/revoke/route.js +36 -0
  15. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/rotate/route.js +40 -0
  16. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/route.js +56 -0
  17. package/.medusa/server/src/api/admin/affiliates/[id]/distribution/route.js +45 -0
  18. package/.medusa/server/src/api/admin/affiliates/[id]/inactive/route.js +20 -0
  19. package/.medusa/server/src/api/admin/affiliates/[id]/route.js +50 -0
  20. package/.medusa/server/src/api/admin/affiliates/[id]/slugs/[slug_id]/route.js +19 -0
  21. package/.medusa/server/src/api/admin/affiliates/[id]/slugs/route.js +26 -0
  22. package/.medusa/server/src/api/admin/affiliates/route.js +43 -0
  23. package/.medusa/server/src/api/admin/consignment-report-response.js +36 -0
  24. package/.medusa/server/src/api/admin/consignment-reports/[id]/approve/route.js +25 -0
  25. package/.medusa/server/src/api/admin/consignment-reports/[id]/correct/route.js +18 -0
  26. package/.medusa/server/src/api/admin/consignment-reports/[id]/reject/route.js +15 -0
  27. package/.medusa/server/src/api/admin/consignment-reports/[id]/route.js +11 -0
  28. package/.medusa/server/src/api/admin/consignment-reports/route.js +27 -0
  29. package/.medusa/server/src/api/admin/customers/[id]/affiliate/route.js +50 -0
  30. package/.medusa/server/src/api/admin/orders/[id]/affiliate-attribution/route.js +30 -0
  31. package/.medusa/server/src/api/affiliate-coupon-http.js +152 -0
  32. package/.medusa/server/src/api/affiliate-referral-cookie.js +34 -0
  33. package/.medusa/server/src/api/affiliate-self-service-http.js +37 -0
  34. package/.medusa/server/src/api/middlewares.js +786 -0
  35. package/.medusa/server/src/api/store/affiliate-referrals/apply-coupon/route.js +47 -0
  36. package/.medusa/server/src/api/store/affiliate-referrals/capture/route.js +76 -0
  37. package/.medusa/server/src/api/store/affiliate-referrals/carts/[cart_id]/route.js +20 -0
  38. package/.medusa/server/src/api/store/affiliates/consignment-inventory/route.js +53 -0
  39. package/.medusa/server/src/api/store/affiliates/consignment-report-response.js +31 -0
  40. package/.medusa/server/src/api/store/affiliates/consignment-reports/[id]/submit/route.js +40 -0
  41. package/.medusa/server/src/api/store/affiliates/consignment-reports/route.js +43 -0
  42. package/.medusa/server/src/api/store/affiliates/coupon-labels/route.js +14 -0
  43. package/.medusa/server/src/api/store/affiliates/me/commissions/route.js +35 -0
  44. package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/revoke/route.js +36 -0
  45. package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/rotate/route.js +40 -0
  46. package/.medusa/server/src/api/store/affiliates/me/coupon-codes/route.js +55 -0
  47. package/.medusa/server/src/api/store/affiliates/me/dashboard/route.js +15 -0
  48. package/.medusa/server/src/api/store/affiliates/me/route.js +85 -0
  49. package/.medusa/server/src/api/store/affiliates/me/slugs/[slug_id]/route.js +29 -0
  50. package/.medusa/server/src/api/store/affiliates/me/slugs/route.js +34 -0
  51. package/.medusa/server/src/api/store/affiliates/own-order-discount/route.js +22 -0
  52. package/.medusa/server/src/api/store/affiliates/own-order-promotion/route.js +30 -0
  53. package/.medusa/server/src/api/store/affiliates/register/route.js +27 -0
  54. package/.medusa/server/src/api/store/affiliates/resolve-referral/route.js +34 -0
  55. package/.medusa/server/src/api/validators.js +52 -0
  56. package/.medusa/server/src/api/wire-response.js +10 -0
  57. package/.medusa/server/src/integration/email-events.js +51 -0
  58. package/.medusa/server/src/integrations/inventory-transfer/batch-management-transfer-adapter.js +36 -0
  59. package/.medusa/server/src/integrations/inventory-transfer/native-inventory-transfer-adapter.js +30 -0
  60. package/.medusa/server/src/integrations/inventory-transfer/resolve-inventory-transfer-adapter.js +46 -0
  61. package/.medusa/server/src/integrations/inventory-transfer/types.js +3 -0
  62. package/.medusa/server/src/jobs/affiliate-attribution-expiry.js +20 -0
  63. package/.medusa/server/src/jobs/affiliate-consignment-report-reminders.js +15 -0
  64. package/.medusa/server/src/jobs/affiliate-promotion-freshness.js +24 -0
  65. package/.medusa/server/src/lib/query-string.js +15 -0
  66. package/.medusa/server/src/modules/affiliate/domain/affiliate-attribution-policy.js +81 -0
  67. package/.medusa/server/src/modules/affiliate/domain/affiliate-coupon-policy.js +61 -0
  68. package/.medusa/server/src/modules/affiliate/domain/commission-policy.js +33 -0
  69. package/.medusa/server/src/modules/affiliate/domain/consignment-reminder-rules.js +74 -0
  70. package/.medusa/server/src/modules/affiliate/domain/email-normalization.js +20 -0
  71. package/.medusa/server/src/modules/affiliate/domain/own-order-coupon-code.js +37 -0
  72. package/.medusa/server/src/modules/affiliate/domain/plugin-options.js +40 -0
  73. package/.medusa/server/src/modules/affiliate/index.js +13 -0
  74. package/.medusa/server/src/modules/affiliate/migrations/Migration20260827085154.js +423 -0
  75. package/.medusa/server/src/modules/affiliate/models/affiliate-application.js +38 -0
  76. package/.medusa/server/src/modules/affiliate/models/affiliate-cart-referral.js +65 -0
  77. package/.medusa/server/src/modules/affiliate/models/affiliate-code-redemption.js +41 -0
  78. package/.medusa/server/src/modules/affiliate/models/affiliate-coupon.js +55 -0
  79. package/.medusa/server/src/modules/affiliate/models/affiliate-distribution-settings.js +22 -0
  80. package/.medusa/server/src/modules/affiliate/models/affiliate-order-attribution.js +49 -0
  81. package/.medusa/server/src/modules/affiliate/models/affiliate-program-settings.js +28 -0
  82. package/.medusa/server/src/modules/affiliate/models/affiliate-referral-session.js +34 -0
  83. package/.medusa/server/src/modules/affiliate/models/affiliate-slug.js +27 -0
  84. package/.medusa/server/src/modules/affiliate/models/affiliate.js +49 -0
  85. package/.medusa/server/src/modules/affiliate/models/commission-entry.js +62 -0
  86. package/.medusa/server/src/modules/affiliate/models/consignment-report-line.js +21 -0
  87. package/.medusa/server/src/modules/affiliate/models/consignment-report.js +31 -0
  88. package/.medusa/server/src/modules/affiliate/models/consignment-transfer-line.js +16 -0
  89. package/.medusa/server/src/modules/affiliate/models/consignment-transfer.js +20 -0
  90. package/.medusa/server/src/modules/affiliate/models/customer-affiliate-assignment.js +58 -0
  91. package/.medusa/server/src/modules/affiliate/service.js +2321 -0
  92. package/.medusa/server/src/modules/affiliate/services/affiliate-application-manager.js +171 -0
  93. package/.medusa/server/src/modules/affiliate/services/affiliate-coupon-manager.js +441 -0
  94. package/.medusa/server/src/modules/affiliate/services/affiliate-discount.service.js +55 -0
  95. package/.medusa/server/src/modules/affiliate/services/affiliate-manager.js +242 -0
  96. package/.medusa/server/src/modules/affiliate/services/affiliate-partner-portal.service.js +138 -0
  97. package/.medusa/server/src/modules/affiliate/services/affiliate-report.service.js +436 -0
  98. package/.medusa/server/src/modules/affiliate/services/affiliate-slug-manager.js +163 -0
  99. package/.medusa/server/src/modules/affiliate/services/commission-ledger.service.js +729 -0
  100. package/.medusa/server/src/modules/affiliate/services/customer-affiliate-assignment-manager.js +350 -0
  101. package/.medusa/server/src/modules/affiliate/services/order-attribution-manager.js +1051 -0
  102. package/.medusa/server/src/modules/affiliate/services/referral-lifecycle-manager.js +1420 -0
  103. package/.medusa/server/src/modules/affiliate/services/utils.js +49 -0
  104. package/.medusa/server/src/modules/affiliate/types/internal.js +3 -0
  105. package/.medusa/server/src/paths/affiliate.js +7 -0
  106. package/.medusa/server/src/paths/index.js +18 -0
  107. package/.medusa/server/src/schemas/index.js +18 -0
  108. package/.medusa/server/src/schemas/store.js +24 -0
  109. package/.medusa/server/src/subscribers/affiliate-cart-updated.js +92 -0
  110. package/.medusa/server/src/subscribers/affiliate-order-canceled.js +70 -0
  111. package/.medusa/server/src/subscribers/affiliate-order-placed.js +63 -0
  112. package/.medusa/server/src/subscribers/affiliate-order-return-received.js +67 -0
  113. package/.medusa/server/src/subscribers/affiliate-product-eligibility-updated.js +87 -0
  114. package/.medusa/server/src/types/admin-api.js +3 -0
  115. package/.medusa/server/src/types/enums.js +53 -0
  116. package/.medusa/server/src/types/index.js +32 -0
  117. package/.medusa/server/src/types/public.js +3 -0
  118. package/.medusa/server/src/types/store-api.js +3 -0
  119. package/.medusa/server/src/utils/affiliate-cart-operation-lock.js +316 -0
  120. package/.medusa/server/src/utils/affiliate-promotion-mutation-authorization.js +49 -0
  121. package/.medusa/server/src/utils/cart-promotions.js +9 -0
  122. package/.medusa/server/src/utils/money.js +79 -0
  123. package/.medusa/server/src/utils/promotion-code-availability.js +34 -0
  124. package/.medusa/server/src/utils/registered-email-checkout.js +101 -0
  125. package/.medusa/server/src/utils/resolve-services.js +7 -0
  126. package/.medusa/server/src/utils/settle-cart-promotions.js +44 -0
  127. package/.medusa/server/src/workflows/affiliate/affiliate-coupon-cart.js +215 -0
  128. package/.medusa/server/src/workflows/affiliate/affiliate-coupon-command-authorization.js +20 -0
  129. package/.medusa/server/src/workflows/affiliate/apply-affiliate-coupon.js +174 -0
  130. package/.medusa/server/src/workflows/affiliate/apply-own-order-promotion.js +89 -0
  131. package/.medusa/server/src/workflows/affiliate/approve-consignment-report.js +186 -0
  132. package/.medusa/server/src/workflows/affiliate/correct-approved-consignment-report.js +263 -0
  133. package/.medusa/server/src/workflows/affiliate/create-affiliate-coupon.js +35 -0
  134. package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-cancellation.js +21 -0
  135. package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-refund.js +24 -0
  136. package/.medusa/server/src/workflows/affiliate/create-commission-for-order.js +17 -0
  137. package/.medusa/server/src/workflows/affiliate/deactivate-affiliate.js +89 -0
  138. package/.medusa/server/src/workflows/affiliate/enable-distribution.js +120 -0
  139. package/.medusa/server/src/workflows/affiliate/enrich-affiliate-report.js +75 -0
  140. package/.medusa/server/src/workflows/affiliate/ensure-affiliate-coupon-promotion.js +410 -0
  141. package/.medusa/server/src/workflows/affiliate/ensure-affiliate-own-order-promotion.js +240 -0
  142. package/.medusa/server/src/workflows/affiliate/ensure-default-affiliate-coupon.js +32 -0
  143. package/.medusa/server/src/workflows/affiliate/expire-affiliate-attribution-state.js +131 -0
  144. package/.medusa/server/src/workflows/affiliate/finalize-affiliate-order-attribution.js +82 -0
  145. package/.medusa/server/src/workflows/affiliate/payment-authorization.js +33 -0
  146. package/.medusa/server/src/workflows/affiliate/promotion-eligibility.js +179 -0
  147. package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-cart-referral.js +219 -0
  148. package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-coupon.js +388 -0
  149. package/.medusa/server/src/workflows/affiliate/refresh-affiliate-promotions.js +114 -0
  150. package/.medusa/server/src/workflows/affiliate/resolve-coupon-labels.js +40 -0
  151. package/.medusa/server/src/workflows/affiliate/revoke-affiliate-coupon.js +29 -0
  152. package/.medusa/server/src/workflows/affiliate/rotate-affiliate-coupon.js +36 -0
  153. package/.medusa/server/src/workflows/affiliate/run-consignment-report-reminders.js +58 -0
  154. package/.medusa/server/src/workflows/affiliate/submit-consignment-report.js +279 -0
  155. package/.medusa/server/src/workflows/affiliate/transfer-batch-aware-inventory.js +172 -0
  156. package/.medusa/server/src/workflows/affiliate/transfer-consignment-stock.js +106 -0
  157. package/.medusa/server/src/workflows/affiliate/update-affiliate-coupon-discounts.js +129 -0
  158. package/.medusa/server/src/workflows/affiliate/utils.js +118 -0
  159. package/.medusa/server/src/workflows/hooks/complete-cart-affiliate-attribution.js +57 -0
  160. package/.medusa/server/src/workflows/hooks/complete-cart-order-created-composition.js +111 -0
  161. package/.medusa/server/src/workflows/hooks/complete-cart-own-order-discount.js +75 -0
  162. package/.medusa/server/src/workflows/hooks/enforce-unique-promotion-codes.js +33 -0
  163. package/.medusa/server/src/workflows/hooks/validate-affiliate-customer-code.js +239 -0
  164. package/.medusa/server/src/workflows/hooks/validate-complete-cart-affiliate-referral.js +137 -0
  165. package/LICENSE +21 -0
  166. package/README.md +799 -0
  167. package/dist/integration/email-events.d.ts +20 -0
  168. package/dist/integration/email-events.js +50 -0
  169. package/package.json +84 -0
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.settleCartPromotions = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ /**
7
+ * `updateCartPromotionsWorkflow` computes every promotion's rules against a
8
+ * single cart snapshot fetched at the start of that one call. When that same
9
+ * call is the one introducing or removing a promo code (as every caller of
10
+ * this helper does), any *other* promotion whose rule depends on a cart total
11
+ * affected by that code (e.g. a free-shipping threshold keyed on
12
+ * `item_total`) is evaluated against the *pre*-change total, not the one this
13
+ * call is about to persist - Medusa's compute-actions pass has no visibility
14
+ * into adjustments created by its own current invocation.
15
+ *
16
+ * Calling the workflow again immediately afterward, with an empty `ADD` (a
17
+ * request that adds nothing and keeps every currently-applied code as-is),
18
+ * forces a second, now-accurate pass: it re-fetches the cart - which by now
19
+ * reflects the just-persisted adjustments - and re-evaluates every
20
+ * automatic and applied promotion against that settled state, correcting
21
+ * anything that would otherwise persist with a stale, incorrect adjustment.
22
+ *
23
+ * Best-effort: a failure here must not undo the coupon mutation that already
24
+ * succeeded, so errors are swallowed after logging.
25
+ */
26
+ const settleCartPromotions = async (container, cartId) => {
27
+ try {
28
+ await (0, core_flows_1.updateCartPromotionsWorkflow)(container).run({
29
+ input: {
30
+ cart_id: cartId,
31
+ promo_codes: [],
32
+ action: utils_1.PromotionActions.ADD,
33
+ force_refresh_payment_collection: true,
34
+ },
35
+ });
36
+ }
37
+ catch (error) {
38
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
39
+ const message = error instanceof Error ? error.message : "Unknown error";
40
+ logger?.warn(`Settling cart promotions failed for cart ${cartId} after a coupon mutation: ${message}`);
41
+ }
42
+ };
43
+ exports.settleCartPromotions = settleCartPromotions;
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGxlLWNhcnQtcHJvbW90aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9zZXR0bGUtY2FydC1wcm9tb3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUF1RjtBQUN2Riw0REFBMEU7QUFFMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLEtBQUssRUFDdkMsU0FBMEIsRUFDMUIsTUFBYyxFQUNDLEVBQUU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFBLHlDQUE0QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNoRCxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsTUFBTSxFQUFFLHdCQUFnQixDQUFDLEdBQUc7Z0JBQzVCLGdDQUFnQyxFQUFFLElBQUk7YUFDdkM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUVoRSxDQUFBO1FBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFBO1FBQ3hFLE1BQU0sRUFBRSxJQUFJLENBQ1YsNENBQTRDLE1BQU0sNkJBQTZCLE9BQU8sRUFBRSxDQUN6RixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQTtBQXRCWSxRQUFBLG9CQUFvQix3QkFzQmhDIn0=
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncAffiliateCouponCartPromotion = exports.retrieveAffiliateCouponCartPromotions = exports.planAffiliateCouponCartPromotionMutation = exports.hasExactPreparedAffiliateCouponBinding = exports.loadAffiliateCouponCartBindings = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const affiliate_promotion_mutation_authorization_1 = require("../../utils/affiliate-promotion-mutation-authorization");
7
+ const affiliate_cart_operation_lock_1 = require("../../utils/affiliate-cart-operation-lock");
8
+ const settle_cart_promotions_1 = require("../../utils/settle-cart-promotions");
9
+ const cart_promotions_1 = require("../../utils/cart-promotions");
10
+ const normalizedCode = (code) => code?.trim().toUpperCase() || null;
11
+ const loadAffiliateCouponCartBindings = async (affiliateService, promotions) => {
12
+ const promotionBindings = await affiliateService.listAffiliateCouponBindingsByPromotionIds(promotions.map(({ id }) => id));
13
+ const byPromotionId = new Map(promotionBindings
14
+ .filter(({ promotion_id }) => Boolean(promotion_id))
15
+ .map((coupon) => [coupon.promotion_id, coupon]));
16
+ const byCode = new Map();
17
+ await Promise.all(promotions.map(async ({ code }) => {
18
+ const canonical = normalizedCode(code);
19
+ if (!canonical || byCode.has(canonical))
20
+ return;
21
+ try {
22
+ const coupon = await affiliateService.findAffiliateCouponByCode(canonical);
23
+ if (coupon)
24
+ byCode.set(canonical, coupon);
25
+ }
26
+ catch (error) {
27
+ if (error instanceof utils_1.MedusaError &&
28
+ error.type === utils_1.MedusaError.Types.INVALID_DATA) {
29
+ return;
30
+ }
31
+ throw error;
32
+ }
33
+ }));
34
+ return promotions.flatMap((promotion) => {
35
+ const promotionCoupon = byPromotionId.get(promotion.id) ?? null;
36
+ const codeCoupon = normalizedCode(promotion.code)
37
+ ? (byCode.get(normalizedCode(promotion.code)) ?? null)
38
+ : null;
39
+ if (promotionCoupon && codeCoupon && promotionCoupon.id !== codeCoupon.id) {
40
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "A cart promotion resolves to conflicting Affiliate coupons.");
41
+ }
42
+ const coupon = promotionCoupon ?? codeCoupon;
43
+ if (!coupon)
44
+ return [];
45
+ return [
46
+ {
47
+ promotion,
48
+ coupon,
49
+ exact: coupon.promotion_id === promotion.id &&
50
+ normalizedCode(promotion.code) === coupon.code,
51
+ },
52
+ ];
53
+ });
54
+ };
55
+ exports.loadAffiliateCouponCartBindings = loadAffiliateCouponCartBindings;
56
+ const hasExactPreparedAffiliateCouponBinding = (referrals, coupon, now = new Date()) => referrals.some((referral) => referral.status === "active" &&
57
+ new Date(referral.expires_at).getTime() > now.getTime() &&
58
+ referral.affiliate_id === coupon.affiliate_id &&
59
+ referral.applied_affiliate_coupon_id === coupon.id &&
60
+ referral.applied_promotion_id === coupon.promotion_id &&
61
+ (referral.source === "link"
62
+ ? referral.source_affiliate_coupon_id === null
63
+ : referral.source_affiliate_coupon_id === coupon.id &&
64
+ referral.source_value_snapshot === coupon.code));
65
+ exports.hasExactPreparedAffiliateCouponBinding = hasExactPreparedAffiliateCouponBinding;
66
+ const planAffiliateCouponCartPromotionMutation = (input) => {
67
+ const { promotions, bindings, target_coupon: targetCoupon } = input;
68
+ const affiliatePromotionIds = new Set(bindings.map(({ promotion }) => promotion.id));
69
+ const nonAffiliateCodes = promotions
70
+ .filter(({ id }) => !affiliatePromotionIds.has(id))
71
+ .map(({ code }) => code)
72
+ .filter((code) => Boolean(code));
73
+ const exactTargetAlreadyApplied = Boolean(targetCoupon &&
74
+ bindings.length === 1 &&
75
+ bindings[0].exact &&
76
+ bindings[0].coupon.id === targetCoupon.id &&
77
+ bindings[0].promotion.id === targetCoupon.promotion_id);
78
+ // Automatic promotions (e.g. a threshold-based free-shipping promotion)
79
+ // aren't something the customer chose to combine, so they don't count as
80
+ // "another promotion" under exclusive stacking.
81
+ const exclusiveHasOtherPromotions = input.promotion_stacking === "exclusive" &&
82
+ promotions.some(({ id, is_automatic }) => id !== targetCoupon?.promotion_id && !is_automatic);
83
+ if (!targetCoupon) {
84
+ if (input.force_replace) {
85
+ return {
86
+ action: utils_1.PromotionActions.REPLACE,
87
+ promo_codes: [...new Set(nonAffiliateCodes)],
88
+ };
89
+ }
90
+ const publicCodes = bindings
91
+ .map(({ promotion }) => promotion.code)
92
+ .filter((code) => Boolean(code));
93
+ return publicCodes.length
94
+ ? {
95
+ action: utils_1.PromotionActions.REMOVE,
96
+ promo_codes: [...new Set(publicCodes)],
97
+ }
98
+ : null;
99
+ }
100
+ if (!targetCoupon.promotion_id) {
101
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "The Affiliate coupon has no native promotion binding.");
102
+ }
103
+ if (exactTargetAlreadyApplied &&
104
+ !exclusiveHasOtherPromotions &&
105
+ !input.force_replace) {
106
+ return null;
107
+ }
108
+ const replace = input.force_replace ||
109
+ bindings.length > 0 ||
110
+ input.promotion_stacking === "exclusive";
111
+ return {
112
+ action: replace ? utils_1.PromotionActions.REPLACE : utils_1.PromotionActions.ADD,
113
+ promo_codes: replace
114
+ ? [
115
+ ...new Set([
116
+ ...(input.promotion_stacking === "allow_stacking"
117
+ ? nonAffiliateCodes
118
+ : []),
119
+ targetCoupon.code,
120
+ ]),
121
+ ]
122
+ : [targetCoupon.code],
123
+ };
124
+ };
125
+ exports.planAffiliateCouponCartPromotionMutation = planAffiliateCouponCartPromotionMutation;
126
+ const retrieveAffiliateCouponCartPromotions = async (container, cartId) => {
127
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
128
+ const { data } = await query.graph({
129
+ entity: "cart",
130
+ fields: ["id", "promotions.id", "promotions.code", "promotions.is_automatic"],
131
+ filters: { id: cartId },
132
+ }, { cache: { enable: false } });
133
+ const cart = data[0];
134
+ if (!cart) {
135
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart "${cartId}" was not found.`);
136
+ }
137
+ return (0, cart_promotions_1.readCartPromotions)(cart.promotions);
138
+ };
139
+ exports.retrieveAffiliateCouponCartPromotions = retrieveAffiliateCouponCartPromotions;
140
+ const syncAffiliateCouponCartPromotion = async (input) => {
141
+ const currentPromotions = input.base_promotions ??
142
+ (await (0, exports.retrieveAffiliateCouponCartPromotions)(input.container, input.cart_id));
143
+ const currentBindings = await (0, exports.loadAffiliateCouponCartBindings)(input.affiliate_service, currentPromotions);
144
+ const mutation = (0, exports.planAffiliateCouponCartPromotionMutation)({
145
+ promotions: currentPromotions,
146
+ bindings: currentBindings,
147
+ target_coupon: input.target_coupon,
148
+ promotion_stacking: input.promotion_stacking,
149
+ force_replace: input.force_replace,
150
+ });
151
+ if (mutation) {
152
+ const authorizationCoupon = input.target_coupon ??
153
+ (mutation.action === utils_1.PromotionActions.REPLACE
154
+ ? currentBindings[0]?.coupon
155
+ : null);
156
+ if (authorizationCoupon &&
157
+ mutation.action !== utils_1.PromotionActions.REMOVE &&
158
+ !(0, affiliate_cart_operation_lock_1.isAffiliateCartOperationLockKeyHeld)((0, affiliate_cart_operation_lock_1.affiliateCartLockKey)(input.cart_id))) {
159
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Affiliate coupon promotion authorization requires the Affiliate cart lock.");
160
+ }
161
+ const authorization = authorizationCoupon && mutation.action !== utils_1.PromotionActions.REMOVE
162
+ ? (0, affiliate_promotion_mutation_authorization_1.issueAffiliatePromotionMutationAuthorization)({
163
+ cart_id: input.cart_id,
164
+ coupon_id: authorizationCoupon.id,
165
+ promotion_id: authorizationCoupon.promotion_id,
166
+ action: mutation.action,
167
+ promo_codes: mutation.promo_codes,
168
+ })
169
+ : null;
170
+ try {
171
+ const workflowInput = {
172
+ cart_id: input.cart_id,
173
+ promo_codes: mutation.promo_codes,
174
+ action: mutation.action,
175
+ force_refresh_payment_collection: true,
176
+ ...(authorization
177
+ ? {
178
+ [affiliate_promotion_mutation_authorization_1.affiliatePromotionAuthorizationInputKey]: authorization.token,
179
+ }
180
+ : {}),
181
+ };
182
+ const { result } = await (0, core_flows_1.updateCartPromotionsWorkflow)(input.container).run({ input: workflowInput });
183
+ const skippedTarget = result.skipped_promo_codes.find(({ code }) => normalizedCode(code) === normalizedCode(input.target_coupon?.code));
184
+ if (skippedTarget) {
185
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Dieser Gutscheincode wurde bereits verwendet.");
186
+ }
187
+ // This call just added/replaced/removed a promo code, changing the
188
+ // cart totals other automatic promotions' rules depend on - settle so
189
+ // they re-evaluate against the now-accurate cart, not the snapshot
190
+ // this same call started from.
191
+ await (0, settle_cart_promotions_1.settleCartPromotions)(input.container, input.cart_id);
192
+ }
193
+ finally {
194
+ authorization?.revoke();
195
+ }
196
+ }
197
+ const readbackPromotions = await (0, exports.retrieveAffiliateCouponCartPromotions)(input.container, input.cart_id);
198
+ const readbackBindings = await (0, exports.loadAffiliateCouponCartBindings)(input.affiliate_service, readbackPromotions);
199
+ if (!input.target_coupon) {
200
+ if (readbackBindings.length) {
201
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "The cart still contains an Affiliate coupon promotion.");
202
+ }
203
+ return;
204
+ }
205
+ const target = input.target_coupon;
206
+ const exact = readbackBindings.length === 1 &&
207
+ readbackBindings[0].exact &&
208
+ readbackBindings[0].coupon.id === target.id &&
209
+ readbackBindings[0].promotion.id === target.promotion_id;
210
+ if (!exact) {
211
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "coupon_not_applicable");
212
+ }
213
+ };
214
+ exports.syncAffiliateCouponCartPromotion = syncAffiliateCouponCartPromotion;
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLWNvdXBvbi1jYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hZmZpbGlhdGUvYWZmaWxpYXRlLWNvdXBvbi1jYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUltQztBQUNuQyw0REFBMkU7QUFHM0UsdUhBR2dFO0FBQ2hFLDZGQUdtRDtBQUNuRCwrRUFBMEU7QUFDMUUsaUVBQWlFO0FBcUJqRSxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQW9CLEVBQWlCLEVBQUUsQ0FDN0QsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQztBQUU5QixNQUFNLCtCQUErQixHQUFHLEtBQUssRUFDbEQsZ0JBQXVDLEVBQ3ZDLFVBQTBDLEVBQ0gsRUFBRTtJQUN6QyxNQUFNLGlCQUFpQixHQUNyQixNQUFNLGdCQUFnQixDQUFDLHlDQUF5QyxDQUM5RCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQy9CLENBQUM7SUFDSixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FDM0IsaUJBQWlCO1NBQ2QsTUFBTSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ25ELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQ25ELENBQUM7SUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQUVyRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLGNBQWMs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
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withAuthorizedAffiliateCouponCommand = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const affiliate_cart_operation_lock_1 = require("../../utils/affiliate-cart-operation-lock");
6
+ const resolve_services_1 = require("../../utils/resolve-services");
7
+ const withAuthorizedAffiliateCouponCommand = async (container, lockKeys, actor, operation) => await (0, affiliate_cart_operation_lock_1.withAffiliateOperationLocks)(container, lockKeys, async () => {
8
+ if (actor.actor_type === "affiliate") {
9
+ const affiliate = await (0, resolve_services_1.resolveAffiliateService)(container).retrieveAffiliateRecord(actor.affiliate_id);
10
+ if (!actor.actor_id || affiliate.customer_id !== actor.actor_id) {
11
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "affiliate_not_found");
12
+ }
13
+ if (affiliate.status !== "active") {
14
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "affiliate_not_active");
15
+ }
16
+ }
17
+ return await operation();
18
+ });
19
+ exports.withAuthorizedAffiliateCouponCommand = withAuthorizedAffiliateCouponCommand;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLWNvdXBvbi1jb21tYW5kLWF1dGhvcml6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2FmZmlsaWF0ZS9hZmZpbGlhdGUtY291cG9uLWNvbW1hbmQtYXV0aG9yaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFHdkQsNkZBQXVGO0FBQ3ZGLG1FQUFzRTtBQVEvRCxNQUFNLG9DQUFvQyxHQUFHLEtBQUssRUFDdkQsU0FBMEIsRUFDMUIsUUFBMkIsRUFDM0IsS0FBa0MsRUFDbEMsU0FBMkIsRUFDZixFQUFFLENBQ2QsTUFBTSxJQUFBLDJEQUEyQixFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDaEUsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFDN0MsU0FBUyxDQUNWLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLHFCQUFxQixDQUN0QixDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3QixzQkFBc0IsQ0FDdkIsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLFNBQVMsRUFBRSxDQUFBO0FBQzFCLENBQUMsQ0FBQyxDQUFBO0FBMUJTLFFBQUEsb0NBQW9DLHdDQTBCN0MifQ==
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyAffiliateCouponWorkflow = exports.resolveAppliedAffiliateCouponForCart = exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const email_normalization_1 = require("../../modules/affiliate/domain/email-normalization");
7
+ const resolve_services_1 = require("../../utils/resolve-services");
8
+ const cart_promotions_1 = require("../../utils/cart-promotions");
9
+ const affiliate_cart_operation_lock_1 = require("../../utils/affiliate-cart-operation-lock");
10
+ const promotion_eligibility_1 = require("./promotion-eligibility");
11
+ const affiliate_coupon_cart_1 = require("./affiliate-coupon-cart");
12
+ const payment_authorization_1 = require("./payment-authorization");
13
+ exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE = "Dieser Gutscheincode wurde bereits verwendet.";
14
+ const prepareAffiliateCouponStep = (0, workflows_sdk_1.createStep)("prepare-affiliate-coupon", async (input, { container }) => {
15
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
16
+ const promotionService = container.resolve(utils_1.Modules.PROMOTION);
17
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
18
+ const { data } = await query.graph({
19
+ entity: "cart",
20
+ fields: [
21
+ "id",
22
+ "email",
23
+ "customer_id",
24
+ "promotions.id",
25
+ "promotions.code",
26
+ "payment_collection.status",
27
+ "payment_collection.payment_sessions.status"
28
+ ],
29
+ filters: { id: input.cart_id }
30
+ });
31
+ const cart = data[0];
32
+ if (!cart) {
33
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart "${input.cart_id}" was not found.`);
34
+ }
35
+ (0, payment_authorization_1.assertPaymentAuthorizationNotStarted)(cart.payment_collection);
36
+ const resolved = await affiliateService.findEnabledAffiliateCouponByCode(input.code);
37
+ if (!resolved ||
38
+ resolved.affiliate.status !== "active" ||
39
+ resolved.coupon.provisioning_status !== "ready" ||
40
+ !resolved.coupon.promotion_id) {
41
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Der Affiliate-Gutscheincode wurde nicht gefunden.");
42
+ }
43
+ const { affiliate, coupon } = resolved;
44
+ if (cart.customer_id &&
45
+ (await affiliateService.isCustomerAffiliate(cart.customer_id))) {
46
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Affiliate-Kunden können keine öffentlichen Affiliate-Gutscheincodes verwenden.");
47
+ }
48
+ if (await affiliateService.hasAffiliateCouponRedemption({
49
+ customer_id: cart.customer_id ?? null,
50
+ normalized_email: cart.email
51
+ ? (0, email_normalization_1.normalizeAffiliateEmail)(cart.email)
52
+ : null
53
+ })) {
54
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE);
55
+ }
56
+ await (0, promotion_eligibility_1.assertAuthenticAffiliateCouponPromotion)(promotionService, {
57
+ coupon,
58
+ affiliate
59
+ });
60
+ return new workflows_sdk_1.StepResponse({
61
+ cart,
62
+ affiliate,
63
+ coupon,
64
+ previous_promotions: (0, cart_promotions_1.readCartPromotions)(cart.promotions)
65
+ });
66
+ });
67
+ const writeAffiliateCouponReferralStep = (0, workflows_sdk_1.createStep)("write-affiliate-coupon-referral", async (prepared, { container }) => {
68
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
69
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
70
+ const result = await affiliateService.applyAffiliateCouponReferral({
71
+ cart_id: prepared.cart.id,
72
+ email: prepared.cart.email ?? null,
73
+ customer_id: prepared.cart.customer_id ?? null,
74
+ affiliate: prepared.affiliate,
75
+ coupon: prepared.coupon
76
+ }, query);
77
+ return new workflows_sdk_1.StepResponse({ prepared, result }, result.compensation);
78
+ }, async (compensation, { container }) => {
79
+ if (!compensation) {
80
+ return;
81
+ }
82
+ await (0, resolve_services_1.resolveAffiliateService)(container).compensateAffiliateCouponReferralMutation(compensation, container.resolve(utils_1.ContainerRegistrationKeys.QUERY));
83
+ });
84
+ const resolveAppliedAffiliateCouponForCart = async (container, cartId, allowedCouponIds) => {
85
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
86
+ const [active] = await affiliateService.listAffiliateCartReferrals({ cart_id: cartId, status: "active" }, { take: 1, order: { captured_at: "DESC" } });
87
+ if (!active?.applied_affiliate_coupon_id)
88
+ return null;
89
+ if (allowedCouponIds &&
90
+ !allowedCouponIds.has(active.applied_affiliate_coupon_id)) {
91
+ return null;
92
+ }
93
+ const coupon = await affiliateService.retrieveAffiliateCouponRecord(active.applied_affiliate_coupon_id, active.affiliate_id);
94
+ const affiliate = await affiliateService.retrieveAffiliateRecord(coupon.affiliate_id);
95
+ await (0, promotion_eligibility_1.assertAuthenticAffiliateCouponPromotion)(container.resolve(utils_1.Modules.PROMOTION), { coupon, affiliate });
96
+ return coupon;
97
+ };
98
+ exports.resolveAppliedAffiliateCouponForCart = resolveAppliedAffiliateCouponForCart;
99
+ const restoreCouponMutation = async (container, mutation) => {
100
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
101
+ const compensated = await affiliateService.compensateAffiliateCouponReferralMutation(mutation.result.compensation, container.resolve(utils_1.ContainerRegistrationKeys.QUERY));
102
+ let target = null;
103
+ try {
104
+ target = await (0, exports.resolveAppliedAffiliateCouponForCart)(container, mutation.prepared.cart.id, new Set(compensated.restorable_affiliate_coupon_ids));
105
+ }
106
+ catch {
107
+ target = null;
108
+ }
109
+ const settings = await affiliateService.retrieveProgramSettings();
110
+ await (0, affiliate_coupon_cart_1.syncAffiliateCouponCartPromotion)({
111
+ container,
112
+ affiliate_service: affiliateService,
113
+ cart_id: mutation.prepared.cart.id,
114
+ target_coupon: target,
115
+ promotion_stacking: settings.promotion_stacking,
116
+ base_promotions: mutation.prepared.previous_promotions,
117
+ force_replace: true
118
+ });
119
+ };
120
+ const syncAffiliateCouponPromotionStep = (0, workflows_sdk_1.createStep)("sync-affiliate-coupon-promotion", async (mutation, { container }) => {
121
+ const { prepared, result } = mutation;
122
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
123
+ try {
124
+ const target = [
125
+ "pending_email_validation",
126
+ "coupon_already_redeemed",
127
+ "ignored_existing_assignment"
128
+ ].includes(result.status)
129
+ ? null
130
+ : await (0, exports.resolveAppliedAffiliateCouponForCart)(container, prepared.cart.id);
131
+ const settings = await affiliateService.retrieveProgramSettings();
132
+ await (0, affiliate_coupon_cart_1.syncAffiliateCouponCartPromotion)({
133
+ container,
134
+ affiliate_service: affiliateService,
135
+ cart_id: prepared.cart.id,
136
+ target_coupon: target,
137
+ promotion_stacking: settings.promotion_stacking
138
+ });
139
+ }
140
+ catch (error) {
141
+ await restoreCouponMutation(container, mutation);
142
+ throw error;
143
+ }
144
+ const referral = result.referral?.status === "active"
145
+ ? await (0, resolve_services_1.resolveAffiliateService)(container).getCartReferralStatus(prepared.cart.id, container.resolve(utils_1.ContainerRegistrationKeys.QUERY))
146
+ : null;
147
+ const output = {
148
+ status: result.status,
149
+ referral,
150
+ discount_applied: result.apply_coupon,
151
+ ...(result.status === "coupon_already_redeemed"
152
+ ? { message: exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE }
153
+ : {})
154
+ };
155
+ return new workflows_sdk_1.StepResponse(output, mutation);
156
+ }, async (compensation, { container }) => {
157
+ if (!compensation) {
158
+ return;
159
+ }
160
+ await restoreCouponMutation(container, compensation);
161
+ });
162
+ const applyAffiliateCouponWorkflowInternal = (0, workflows_sdk_1.createWorkflow)("apply-affiliate-coupon", (input) => {
163
+ const prepared = prepareAffiliateCouponStep(input);
164
+ const mutation = writeAffiliateCouponReferralStep(prepared);
165
+ return new workflows_sdk_1.WorkflowResponse(syncAffiliateCouponPromotionStep(mutation));
166
+ });
167
+ const applyAffiliateCouponWorkflow = (container) => {
168
+ const workflow = applyAffiliateCouponWorkflowInternal(container);
169
+ return {
170
+ run: async (options) => await (0, affiliate_cart_operation_lock_1.withAffiliateCartOperationLock)(container, options.input.cart_id, async () => await workflow.run(options))
171
+ };
172
+ };
173
+ exports.applyAffiliateCouponWorkflow = applyAffiliateCouponWorkflow;
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktYWZmaWxpYXRlLWNvdXBvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvYWZmaWxpYXRlL2FwcGx5LWFmZmlsaWF0ZS1jb3Vwb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEscUVBSzBDO0FBQzFDLHFEQUlrQztBQUdsQyw0RkFBNEY7QUFNNUYsbUVBQXNFO0FBQ3RFLGlFQUFnRTtBQUNoRSw2RkFBMEY7QUFDMUYsbUVBQWlGO0FBQ2pGLG1FQUdnQztBQUNoQyxtRUFHZ0M7QUFFbkIsUUFBQSxxQ0FBcUMsR0FDaEQsK0NBQStDLENBQUE7QUFrQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBQSwwQkFBVSxFQUMzQywwQkFBMEIsRUFDMUIsS0FBSyxFQUFFLEtBQWdDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUMzRCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3hDLGVBQU8sQ0FBQyxTQUFTLENBQ1MsQ0FBQTtJQUM1QixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakMsTUFBTSxFQUFFLE1BQU07UUFDZCxNQUFNLEVBQUU7WUFDTixJQUFJO1lBQ0osT0FBTztZQUNQLGFBQWE7WUFDYixlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLDJCQUEyQjtZQUMzQiw0Q0FBNEM7U0FDN0M7UUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtLQUMvQixDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFzQyxDQUFB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
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyAffiliateOwnOrderPromotionWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
7
+ const resolve_services_1 = require("../../utils/resolve-services");
8
+ const cart_promotions_1 = require("../../utils/cart-promotions");
9
+ const settle_cart_promotions_1 = require("../../utils/settle-cart-promotions");
10
+ const ensure_affiliate_own_order_promotion_1 = require("./ensure-affiliate-own-order-promotion");
11
+ const payment_authorization_1 = require("./payment-authorization");
12
+ const applyAffiliateOwnOrderPromotionStep = (0, workflows_sdk_1.createStep)("apply-affiliate-own-order-promotion", async (input, { container }) => {
13
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
14
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
15
+ const promotionService = container.resolve(utils_1.Modules.PROMOTION);
16
+ const { data } = await query.graph({
17
+ entity: "cart",
18
+ fields: [
19
+ "id",
20
+ "customer_id",
21
+ "payment_collection.status",
22
+ "payment_collection.payment_sessions.status",
23
+ "promotions.id",
24
+ "promotions.code",
25
+ ],
26
+ filters: { id: input.cart_id },
27
+ });
28
+ const cart = data[0];
29
+ if (!cart) {
30
+ return new workflows_sdk_1.StepResponse({ applied: false });
31
+ }
32
+ if (!cart.customer_id) {
33
+ return new workflows_sdk_1.StepResponse({ applied: false });
34
+ }
35
+ if ((0, payment_authorization_1.hasPaymentAuthorizationStarted)(cart.payment_collection)) {
36
+ return new workflows_sdk_1.StepResponse({ applied: false });
37
+ }
38
+ let affiliate = await affiliateService.findActiveAffiliateByCustomerId(cart.customer_id);
39
+ if (!affiliate) {
40
+ return new workflows_sdk_1.StepResponse({ applied: false });
41
+ }
42
+ const ensured = await (0, ensure_affiliate_own_order_promotion_1.ensureAffiliateOwnOrderPromotionWorkflow)(container).run({ input: { affiliate_id: affiliate.id } });
43
+ affiliate = ensured.result;
44
+ if (!affiliate.own_order_promotion_id) {
45
+ return new workflows_sdk_1.StepResponse({ applied: false });
46
+ }
47
+ const cartPromotions = (0, cart_promotions_1.readCartPromotions)(cart.promotions);
48
+ const promotionIds = cartPromotions.map((promotion) => promotion.id);
49
+ const publicPromotionIds = new Set((await affiliateService.listAffiliateCouponBindingsByPromotionIds(promotionIds))
50
+ .map((coupon) => coupon.promotion_id)
51
+ .filter((id) => Boolean(id)));
52
+ const publicCodes = cartPromotions
53
+ .filter((promotion) => publicPromotionIds.has(promotion.id))
54
+ .map((promotion) => promotion.code)
55
+ .filter((code) => Boolean(code));
56
+ const hasOwnPromotion = promotionIds.includes(affiliate.own_order_promotion_id);
57
+ if (!publicCodes.length && hasOwnPromotion) {
58
+ return new workflows_sdk_1.StepResponse({ applied: true });
59
+ }
60
+ if (publicCodes.length || !hasOwnPromotion || promotionIds.length !== 1) {
61
+ const ownPromotion = await promotionService.retrievePromotion(affiliate.own_order_promotion_id);
62
+ if (!ownPromotion.code) {
63
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Affiliate own-order promotion has no code.");
64
+ }
65
+ const { result: updateResult } = await (0, core_flows_1.updateCartPromotionsWorkflow)(container).run({
66
+ input: {
67
+ cart_id: cart.id,
68
+ promo_codes: [ownPromotion.code],
69
+ action: utils_1.PromotionActions.REPLACE,
70
+ force_refresh_payment_collection: true,
71
+ },
72
+ });
73
+ // Medusa silently drops a promo code into skipped_promo_codes instead
74
+ // of erroring when it computes no adjustment for the cart's current
75
+ // items (e.g. no eligible item) - report that as not applied instead
76
+ // of a misleading success.
77
+ if (updateResult.skipped_promo_codes?.some((skipped) => skipped.code === ownPromotion.code)) {
78
+ return new workflows_sdk_1.StepResponse({ applied: false });
79
+ }
80
+ // The item discount just introduced above changes item_total; settle
81
+ // so any other total-dependent automatic promotion (e.g. a
82
+ // free-shipping threshold) re-evaluates against the now-accurate cart
83
+ // instead of the pre-discount snapshot this same call started from.
84
+ await (0, settle_cart_promotions_1.settleCartPromotions)(container, cart.id);
85
+ }
86
+ return new workflows_sdk_1.StepResponse({ applied: true });
87
+ });
88
+ exports.applyAffiliateOwnOrderPromotionWorkflow = (0, workflows_sdk_1.createWorkflow)("apply-affiliate-own-order-promotion", (input) => new workflows_sdk_1.WorkflowResponse(applyAffiliateOwnOrderPromotionStep(input)));
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktb3duLW9yZGVyLXByb21vdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvYWZmaWxpYXRlL2FwcGx5LW93bi1vcmRlci1wcm9tb3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscUVBSzBDO0FBQzFDLHFEQUtrQztBQUNsQyw0REFBMEU7QUFFMUUsbUVBQXNFO0FBQ3RFLGlFQUFnRTtBQUNoRSwrRUFBeUU7QUFDekUsaUdBQWlHO0FBQ2pHLG1FQUdnQztBQWtCaEMsTUFBTSxtQ0FBbUMsR0FBRyxJQUFBLDBCQUFVLEVBQ3BELHFDQUFxQyxFQUNyQyxLQUFLLEVBQ0gsS0FBMkMsRUFDM0MsRUFBRSxTQUFTLEVBQUUsRUFDZ0MsRUFBRTtJQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUEsMENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3hDLGVBQU8sQ0FBQyxTQUFTLENBQ1MsQ0FBQTtJQUM1QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFO1lBQ04sSUFBSTtZQUNKLGFBQWE7WUFDYiwyQkFBMkI7WUFDM0IsNENBQTRDO1lBQzVDLGVBQWU7WUFDZixpQkFBaUI7U0FDbEI7UUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtLQUMvQixDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUE0QixDQUFBO0lBRS9DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsSUFBSSxJQUFBLHNEQUE4QixFQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsSUFBSSxTQUFTLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FDcEUsSUFBSSxDQUFDLFdBQVcsQ0FDakIsQ0FBQTtJQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSwrRUFBd0MsRUFDNUQsU0FBUyxDQUNWLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDaEQsU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7SUFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLElBQUEsb0NBQWtCLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzFELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNwRSxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUNoQyxDQUNFLE1BQU0sZ0JBQWdCLENBQUMseUNBQXlDLENBQzlELFlBQVksQ0FDYixDQUNGO1NBQ0UsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1NBQ3BDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUM3QyxDQUFBO0lBQ0QsTUFBTSxXQUFXLEdBQUcsY0FBYztTQUMvQixNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0QsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQ2xDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2xELE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQzNDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDakMsQ0FBQTtJQUVELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzNDLE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sWUFBWSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsaUJBQWlCLENBQzNELFNBQVMsQ0FBQyxzQkFBc0IsQ0FDakMsQ0FBQTtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw0Q0FBNEMsQ0FDN0MsQ0FBQTtRQUNILENBQUM7UUFDRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBQSx5Q0FBNEIsRUFDakUsU0FBUyxDQUNWLENBQUMsR0FBRyxDQUFDO1lBQ0osS0FBSyxFQUFFO2dCQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDaEIsV0FBVyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFDaEMsTUFBTSxFQUFFLHdCQUFnQixDQUFDLE9BQU87Z0JBQ2hDLGdDQUFnQyxFQUFFLElBQUk7YUFDdkM7U0FDRixDQUFDLENBQUE7UUFDRixzRUFBc0U7UUFDdEUsb0VBQW9FO1FBQ3BFLHFFQUFxRTtRQUNyRSwyQkFBMkI7UUFDM0IsSUFDRSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUNwQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsSUFBSSxDQUNoRCxFQUNELENBQUM7WUFDRCxPQUFPLElBQUksNEJBQVksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFDRCxxRUFBcUU7UUFDckUsMkRBQTJEO1FBQzNELHNFQUFzRTtRQUN0RSxvRUFBb0U7UUFDcEUsTUFBTSxJQUFBLDZDQUFvQixFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDNUMsQ0FBQyxDQUNGLENBQUE7QUFFWSxRQUFBLHVDQUF1QyxHQUFHLElBQUEsOEJBQWMsRUFDbkUscUNBQXFDLEVBQ3JDLENBQUMsS0FBMkMsRUFBRSxFQUFFLENBQzlDLElBQUksZ0NBQWdCLENBQUMsbUNBQW1DLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDbkUsQ0FBQSJ9