@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,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureAffiliateOwnOrderPromotionWorkflow = 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 promotion_eligibility_1 = require("./promotion-eligibility");
9
+ const ensureAffiliateOwnOrderPromotionStep = (0, workflows_sdk_1.createStep)("ensure-affiliate-own-order-promotion", async (input, { container }) => {
10
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
11
+ const promotionService = container.resolve(utils_1.Modules.PROMOTION);
12
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
13
+ const affiliate = await affiliateService.retrieveAffiliateRecord(input.affiliate_id);
14
+ const status = affiliate.status === "active" && affiliate.customer_id
15
+ ? "active"
16
+ : "inactive";
17
+ const desiredCode = affiliate.customer_id
18
+ ? `AFFILIATE-OWN-${affiliate.id}-${affiliate.customer_id}`.toUpperCase()
19
+ : null;
20
+ // Medusa's promotion module rejects a percentage application_method
21
+ // value of 0 (it must be strictly greater than 0), and a 0% own-order
22
+ // discount is a legitimate, commonly-defaulted configuration (an
23
+ // affiliate who earns no self-discount). Treat it as "no promotion
24
+ // needed" everywhere below instead of ever passing value: 0 downstream.
25
+ const hasPositiveRate = affiliate.own_order_discount_rate > 0;
26
+ if (affiliate.own_order_promotion_id) {
27
+ const currentPromotion = await promotionService.retrievePromotion(affiliate.own_order_promotion_id, { relations: ["rules", "rules.values"] });
28
+ const customerRule = currentPromotion.rules?.find((rule) => rule.attribute === "customer.id");
29
+ const boundCustomerIds = customerRule?.values.map((value) => value.value) ?? [];
30
+ const stillBoundToCurrentCustomer = affiliate.customer_id !== null &&
31
+ affiliate.customer_id !== undefined &&
32
+ boundCustomerIds.includes(affiliate.customer_id);
33
+ if (!stillBoundToCurrentCustomer) {
34
+ await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
35
+ input: {
36
+ promotionsData: [
37
+ {
38
+ id: affiliate.own_order_promotion_id,
39
+ status: "inactive",
40
+ },
41
+ ],
42
+ },
43
+ });
44
+ if (!affiliate.customer_id || !desiredCode || !hasPositiveRate) {
45
+ return new workflows_sdk_1.StepResponse(affiliate);
46
+ }
47
+ const repairPromotions = await promotionService.listPromotions({ code: [desiredCode] }, { relations: ["rules", "rules.values"], take: 1 });
48
+ let replacementPromotion = repairPromotions[0];
49
+ if (replacementPromotion) {
50
+ const replacementCustomerRule = replacementPromotion.rules?.find((rule) => rule.attribute === "customer.id");
51
+ const correctlyBound = replacementCustomerRule?.values.some((value) => value.value === affiliate.customer_id) ?? false;
52
+ if (!correctlyBound) {
53
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `Own-order promotion code "${desiredCode}" is bound to another customer.`);
54
+ }
55
+ }
56
+ else {
57
+ const created = await (0, core_flows_1.createPromotionsWorkflow)(container).run({
58
+ input: {
59
+ promotionsData: [
60
+ {
61
+ code: desiredCode,
62
+ type: "standard",
63
+ status,
64
+ is_automatic: true,
65
+ rules: [
66
+ {
67
+ attribute: "customer.id",
68
+ operator: "eq",
69
+ values: affiliate.customer_id,
70
+ },
71
+ ],
72
+ application_method: {
73
+ type: "percentage",
74
+ target_type: "items",
75
+ allocation: "across",
76
+ value: affiliate.own_order_discount_rate,
77
+ target_rules: promotion_eligibility_1.affiliateEligibleItemTargetRules,
78
+ },
79
+ },
80
+ ],
81
+ },
82
+ });
83
+ replacementPromotion = created.result[0];
84
+ }
85
+ await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
86
+ input: {
87
+ promotionsData: [
88
+ {
89
+ id: replacementPromotion.id,
90
+ status,
91
+ is_automatic: true,
92
+ application_method: {
93
+ type: "percentage",
94
+ target_type: "items",
95
+ allocation: "across",
96
+ value: affiliate.own_order_discount_rate,
97
+ },
98
+ },
99
+ ],
100
+ },
101
+ });
102
+ let updated;
103
+ try {
104
+ await (0, promotion_eligibility_1.ensureAffiliateEligibleItemTargetRules)(promotionService, query, replacementPromotion.id);
105
+ updated = await affiliateService.setAffiliatePromotionState({
106
+ affiliate_id: affiliate.id,
107
+ own_order_promotion_id: replacementPromotion.id,
108
+ });
109
+ }
110
+ catch (error) {
111
+ await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
112
+ input: {
113
+ promotionsData: [
114
+ { id: replacementPromotion.id, status: "inactive" },
115
+ ],
116
+ },
117
+ });
118
+ throw error;
119
+ }
120
+ return new workflows_sdk_1.StepResponse(updated);
121
+ }
122
+ if (!hasPositiveRate) {
123
+ await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
124
+ input: {
125
+ promotionsData: [
126
+ {
127
+ id: affiliate.own_order_promotion_id,
128
+ status: "inactive",
129
+ },
130
+ ],
131
+ },
132
+ });
133
+ return new workflows_sdk_1.StepResponse(affiliate);
134
+ }
135
+ await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
136
+ input: {
137
+ promotionsData: [
138
+ {
139
+ id: affiliate.own_order_promotion_id,
140
+ status,
141
+ is_automatic: true,
142
+ application_method: {
143
+ type: "percentage",
144
+ target_type: "items",
145
+ allocation: "across",
146
+ value: affiliate.own_order_discount_rate,
147
+ },
148
+ },
149
+ ],
150
+ },
151
+ });
152
+ await (0, promotion_eligibility_1.ensureAffiliateEligibleItemTargetRules)(promotionService, query, affiliate.own_order_promotion_id);
153
+ return new workflows_sdk_1.StepResponse(affiliate);
154
+ }
155
+ if (!affiliate.customer_id || !hasPositiveRate) {
156
+ return new workflows_sdk_1.StepResponse(affiliate);
157
+ }
158
+ const repairPromotions = await promotionService.listPromotions({ code: [desiredCode] }, { relations: ["rules", "rules.values"], take: 1 });
159
+ let promotionId = repairPromotions[0]?.id ?? null;
160
+ if (repairPromotions[0]) {
161
+ const customerRule = repairPromotions[0].rules?.find((rule) => rule.attribute === "customer.id");
162
+ if (!customerRule?.values.some((value) => value.value === affiliate.customer_id)) {
163
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `Own-order promotion code "${desiredCode}" is bound to another customer.`);
164
+ }
165
+ await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
166
+ input: {
167
+ promotionsData: [
168
+ {
169
+ id: repairPromotions[0].id,
170
+ status,
171
+ is_automatic: true,
172
+ application_method: {
173
+ type: "percentage",
174
+ target_type: "items",
175
+ allocation: "across",
176
+ value: affiliate.own_order_discount_rate,
177
+ },
178
+ },
179
+ ],
180
+ },
181
+ });
182
+ }
183
+ else {
184
+ const created = await (0, core_flows_1.createPromotionsWorkflow)(container).run({
185
+ input: {
186
+ promotionsData: [
187
+ {
188
+ code: desiredCode,
189
+ type: "standard",
190
+ status,
191
+ is_automatic: true,
192
+ rules: [
193
+ {
194
+ attribute: "customer.id",
195
+ operator: "eq",
196
+ values: affiliate.customer_id,
197
+ },
198
+ ],
199
+ application_method: {
200
+ type: "percentage",
201
+ target_type: "items",
202
+ allocation: "across",
203
+ value: affiliate.own_order_discount_rate,
204
+ target_rules: promotion_eligibility_1.affiliateEligibleItemTargetRules,
205
+ },
206
+ },
207
+ ],
208
+ },
209
+ });
210
+ promotionId = created.result[0].id;
211
+ }
212
+ let updated;
213
+ try {
214
+ await (0, promotion_eligibility_1.ensureAffiliateEligibleItemTargetRules)(promotionService, query, promotionId);
215
+ updated = await affiliateService.setAffiliatePromotionState({
216
+ affiliate_id: affiliate.id,
217
+ own_order_promotion_id: promotionId,
218
+ });
219
+ }
220
+ catch (error) {
221
+ await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
222
+ input: {
223
+ promotionsData: [{ id: promotionId, status: "inactive" }],
224
+ },
225
+ });
226
+ throw error;
227
+ }
228
+ return new workflows_sdk_1.StepResponse(updated);
229
+ });
230
+ exports.ensureAffiliateOwnOrderPromotionWorkflow = (0, workflows_sdk_1.createWorkflow)("ensure-affiliate-own-order-promotion", (input) => {
231
+ (0, core_flows_1.acquireLockStep)({
232
+ key: input.affiliate_id,
233
+ timeout: 10,
234
+ ttl: 60,
235
+ });
236
+ const affiliate = ensureAffiliateOwnOrderPromotionStep(input);
237
+ (0, core_flows_1.releaseLockStep)({ key: input.affiliate_id });
238
+ return new workflows_sdk_1.WorkflowResponse(affiliate);
239
+ });
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5zdXJlLWFmZmlsaWF0ZS1vd24tb3JkZXItcHJvbW90aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hZmZpbGlhdGUvZW5zdXJlLWFmZmlsaWF0ZS1vd24tb3JkZXItcHJvbW90aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHFFQUswQztBQUMxQyxxREFJa0M7QUFDbEMsNERBS29DO0FBRXBDLG1FQUFzRTtBQUV0RSxtRUFHZ0M7QUFNaEMsTUFBTSxvQ0FBb0MsR0FBRyxJQUFBLDBCQUFVLEVBQ3JELHNDQUFzQyxFQUN0QyxLQUFLLEVBQ0gsS0FBNEMsRUFDNUMsRUFBRSxTQUFTLEVBQUUsRUFDd0IsRUFBRTtJQUN2QyxNQUFNLGdCQUFnQixHQUFHLElBQUEsMENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUN4QyxlQUFPLENBQUMsU0FBUyxDQUNTLENBQUE7SUFDNUIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLFNBQVMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLHVCQUF1QixDQUM5RCxLQUFLLENBQUMsWUFBWSxDQUNuQixDQUFBO0lBQ0QsTUFBTSxNQUFNLEdBQ1YsU0FBUyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksU0FBUyxDQUFDLFdBQVc7UUFDcEQsQ0FBQyxDQUFDLFFBQVE7UUFDVixDQUFDLENBQUMsVUFBVSxDQUFBO0lBQ2hCLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXO1FBQ3ZDLENBQUMsQ0FBQyxpQkFBaUIsU0FBUyxDQUFDLEVBQUUsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFO1FBQ3hFLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDUixvRUFBb0U7SUFDcEUs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
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureDefaultAffiliateCouponWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const affiliate_cart_operation_lock_1 = require("../../utils/affiliate-cart-operation-lock");
6
+ const resolve_services_1 = require("../../utils/resolve-services");
7
+ const ensure_affiliate_coupon_promotion_1 = require("./ensure-affiliate-coupon-promotion");
8
+ const reconcile_affiliate_coupon_1 = require("./reconcile-affiliate-coupon");
9
+ const ensureDefaultAffiliateCouponStep = (0, workflows_sdk_1.createStep)("ensure-default-affiliate-coupon", async (input, { container }) => {
10
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
11
+ const observed = await affiliateService.retrieveAffiliateRecord(input.affiliate_id);
12
+ if (observed.status !== "active") {
13
+ return new workflows_sdk_1.StepResponse({
14
+ coupon: null,
15
+ created: false,
16
+ reconciled: [],
17
+ });
18
+ }
19
+ const ensured = await (0, affiliate_cart_operation_lock_1.withAffiliateOperationLocks)(container, (0, ensure_affiliate_coupon_promotion_1.affiliateCouponProvisioningLockKeys)(input.affiliate_id), async () => {
20
+ const affiliate = await affiliateService.retrieveAffiliateRecord(input.affiliate_id);
21
+ if (affiliate.status !== "active") {
22
+ return { coupon: null, created: false };
23
+ }
24
+ return await affiliateService.ensureDefaultAffiliateCoupon({
25
+ affiliate_id: affiliate.id,
26
+ });
27
+ });
28
+ const reconciled = await (0, reconcile_affiliate_coupon_1.reconcileAffiliateCouponsForAffiliate)(container, input.affiliate_id);
29
+ return new workflows_sdk_1.StepResponse({ ...ensured, reconciled });
30
+ });
31
+ exports.ensureDefaultAffiliateCouponWorkflow = (0, workflows_sdk_1.createWorkflow)("ensure-default-affiliate-coupon", (input) => new workflows_sdk_1.WorkflowResponse(ensureDefaultAffiliateCouponStep(input)));
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5zdXJlLWRlZmF1bHQtYWZmaWxpYXRlLWNvdXBvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvYWZmaWxpYXRlL2Vuc3VyZS1kZWZhdWx0LWFmZmlsaWF0ZS1jb3Vwb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBRzFDLDZGQUF1RjtBQUN2RixtRUFBc0U7QUFDdEUsMkZBQXlGO0FBQ3pGLDZFQUFvRjtBQVlwRixNQUFNLGdDQUFnQyxHQUFHLElBQUEsMEJBQVUsRUFDakQsaUNBQWlDLEVBQ2pDLEtBQUssRUFDSCxLQUFnRCxFQUNoRCxFQUFFLFNBQVMsRUFBRSxFQUNzRCxFQUFFO0lBQ3JFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUMzRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLHVCQUF1QixDQUM3RCxLQUFLLENBQUMsWUFBWSxDQUNuQixDQUFBO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSw0QkFBWSxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxJQUFJO1lBQ1osT0FBTyxFQUFFLEtBQUs7WUFDZCxVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsMkRBQTJCLEVBQy9DLFNBQVMsRUFDVCxJQUFBLHVFQUFtQyxFQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFDdkQsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLHVCQUF1QixDQUM5RCxLQUFLLENBQUMsWUFBWSxDQUNuQixDQUFBO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQTtRQUN6QyxDQUFDO1FBQ0QsT0FBTyxNQUFNLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDO1lBQ3pELFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRTtTQUMzQixDQUFDLENBQUE7SUFDSixDQUFDLENBQ0YsQ0FBQTtJQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxrRUFBcUMsRUFDNUQsU0FBUyxFQUNULEtBQUssQ0FBQyxZQUFZLENBQ25CLENBQUE7SUFDRCxPQUFPLElBQUksNEJBQVksQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7QUFDckQsQ0FBQyxDQUNGLENBQUE7QUFFWSxRQUFBLG9DQUFvQyxHQUFHLElBQUEsOEJBQWMsRUFDaEUsaUNBQWlDLEVBQ2pDLENBQUMsS0FBZ0QsRUFBRSxFQUFFLENBQ25ELElBQUksZ0NBQWdCLENBQUMsZ0NBQWdDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDaEUsQ0FBQSJ9
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expireAffiliateAttributionStateWorkflow = exports.expireAffiliateAttributionState = 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 affiliate_cart_operation_lock_1 = require("../../utils/affiliate-cart-operation-lock");
8
+ const cart_promotions_1 = require("../../utils/cart-promotions");
9
+ const resolve_services_1 = require("../../utils/resolve-services");
10
+ const settle_cart_promotions_1 = require("../../utils/settle-cart-promotions");
11
+ const payment_authorization_1 = require("./payment-authorization");
12
+ const loadExpiryCart = async (container, cartId) => {
13
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
14
+ const { data } = await query.graph({
15
+ entity: "cart",
16
+ fields: [
17
+ "id",
18
+ "completed_at",
19
+ "promotions.id",
20
+ "promotions.code",
21
+ "payment_collection.status",
22
+ "payment_collection.payment_sessions.status"
23
+ ],
24
+ filters: { id: cartId }
25
+ }, { cache: { enable: false } });
26
+ return data[0] ?? null;
27
+ };
28
+ const removeExpiredReferralPromotions = async (container, result) => {
29
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
30
+ const byCart = new Map();
31
+ for (const referral of result.expired_cart_referrals) {
32
+ const referrals = byCart.get(referral.cart_id) ?? [];
33
+ referrals.push(referral);
34
+ byCart.set(referral.cart_id, referrals);
35
+ }
36
+ const cleaned = [];
37
+ const failures = [];
38
+ let paymentAuthorizationBlocked = false;
39
+ for (const cartId of [...byCart.keys()].sort()) {
40
+ const referrals = byCart.get(cartId);
41
+ const promotionIds = new Set(referrals.map(({ applied_promotion_id }) => applied_promotion_id));
42
+ try {
43
+ const cleanupCompleted = await (0, affiliate_cart_operation_lock_1.withAffiliateCartOperationLock)(container, cartId, async () => {
44
+ const cart = await loadExpiryCart(container, cartId);
45
+ if (!cart || cart.completed_at)
46
+ return true;
47
+ const activeReferrals = await affiliateService.listAffiliateCartReferrals({
48
+ cart_id: cartId,
49
+ status: "active",
50
+ applied_promotion_id: [...promotionIds]
51
+ }, { order: { captured_at: "DESC", id: "DESC" } });
52
+ const currentTime = Date.now();
53
+ const activelyOwnedPromotionIds = new Set(activeReferrals
54
+ .filter((referral) => referral.applied_affiliate_coupon_id !== null &&
55
+ referral.applied_promotion_id !== null &&
56
+ new Date(referral.expires_at).getTime() > currentTime)
57
+ .map(({ applied_promotion_id }) => applied_promotion_id));
58
+ const removablePromotionIds = new Set([...promotionIds].filter((promotionId) => !activelyOwnedPromotionIds.has(promotionId)));
59
+ const codes = (0, cart_promotions_1.readCartPromotions)(cart.promotions)
60
+ .filter(({ id }) => removablePromotionIds.has(id))
61
+ .map(({ code }) => code)
62
+ .filter((code) => Boolean(code));
63
+ if (codes.length) {
64
+ if ((0, payment_authorization_1.hasPaymentAuthorizationStarted)(cart.payment_collection)) {
65
+ paymentAuthorizationBlocked = true;
66
+ return false;
67
+ }
68
+ await (0, core_flows_1.updateCartPromotionsWorkflow)(container).run({
69
+ input: {
70
+ cart_id: cartId,
71
+ promo_codes: [...new Set(codes)],
72
+ action: utils_1.PromotionActions.REMOVE,
73
+ force_refresh_payment_collection: true
74
+ }
75
+ });
76
+ // Removing these codes changes item_total; settle so any other
77
+ // total-dependent automatic promotion re-evaluates against the
78
+ // now-accurate cart instead of the pre-removal snapshot.
79
+ await (0, settle_cart_promotions_1.settleCartPromotions)(container, cartId);
80
+ }
81
+ const readback = await loadExpiryCart(container, cartId);
82
+ if (readback &&
83
+ !readback.completed_at &&
84
+ (0, cart_promotions_1.readCartPromotions)(readback.promotions).some(({ id }) => removablePromotionIds.has(id))) {
85
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Cart "${cartId}" still contains an expired Affiliate promotion.`);
86
+ }
87
+ return true;
88
+ });
89
+ if (cleanupCompleted) {
90
+ cleaned.push(...referrals);
91
+ }
92
+ }
93
+ catch (error) {
94
+ failures.push(error);
95
+ }
96
+ }
97
+ if (cleaned.length) {
98
+ await affiliateService.completeExpiredCartReferralPromotionCleanup({
99
+ referrals: cleaned.map(({ referral_id, applied_promotion_id }) => ({
100
+ referral_id,
101
+ applied_promotion_id
102
+ }))
103
+ });
104
+ }
105
+ if (failures.length === 1)
106
+ throw failures[0];
107
+ if (failures.length) {
108
+ throw new AggregateError(failures, "Expired Affiliate referral promotion cleanup failed");
109
+ }
110
+ return { payment_authorization_blocked: paymentAuthorizationBlocked };
111
+ };
112
+ const expireAffiliateAttributionState = async (container, input) => {
113
+ const result = await (0, resolve_services_1.resolveAffiliateService)(container).expireAffiliateAttributionState({
114
+ now: input.now ? new Date(input.now) : new Date(),
115
+ limit: 500
116
+ });
117
+ const cleanup = await removeExpiredReferralPromotions(container, result);
118
+ return {
119
+ processed: result.processed,
120
+ // A blocked receipt remains at the front of the next batch. Defer it to
121
+ // the next scheduled run instead of spinning while payment remains locked.
122
+ has_more: result.has_more && !cleanup.payment_authorization_blocked
123
+ };
124
+ };
125
+ exports.expireAffiliateAttributionState = expireAffiliateAttributionState;
126
+ const expireAffiliateAttributionStateStep = (0, workflows_sdk_1.createStep)("expire-affiliate-attribution-state", async (input, { container }) => {
127
+ const result = await (0, exports.expireAffiliateAttributionState)(container, input);
128
+ return new workflows_sdk_1.StepResponse(result);
129
+ });
130
+ exports.expireAffiliateAttributionStateWorkflow = (0, workflows_sdk_1.createWorkflow)("expire-affiliate-attribution-state", (input) => new workflows_sdk_1.WorkflowResponse(expireAffiliateAttributionStateStep(input)));
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwaXJlLWFmZmlsaWF0ZS1hdHRyaWJ1dGlvbi1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvYWZmaWxpYXRlL2V4cGlyZS1hZmZpbGlhdGUtYXR0cmlidXRpb24tc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBRTFDLHFEQUlrQztBQUNsQyw0REFBMEU7QUFNMUUsNkZBQTBGO0FBQzFGLGlFQUFnRTtBQUNoRSxtRUFBc0U7QUFDdEUsK0VBQXlFO0FBQ3pFLG1FQUdnQztBQWFoQyxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQzFCLFNBQTBCLEVBQzFCLE1BQWMsRUFDYyxFQUFFO0lBQzlCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FDaEM7UUFDRSxNQUFNLEVBQUUsTUFBTTtRQUNkLE1BQU0sRUFBRTtZQUNOLElBQUk7WUFDSixjQUFjO1lBQ2QsZUFBZTtZQUNmLGlCQUFpQjtZQUNqQiwyQkFBMkI7WUFDM0IsNENBQTRDO1NBQzdDO1FBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRTtLQUN4QixFQUNELEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQzdCLENBQUE7SUFDRCxPQUFRLElBQUksQ0FBQyxDQUFDLENBQTRCLElBQUksSUFBSSxDQUFBO0FBQ3BELENBQUMsQ0FBQTtBQUVELE1BQU0sK0JBQStCLEdBQUcsS0FBSyxFQUMzQyxTQUEwQixFQUMxQixNQUFrRCxFQUNHLEVBQUU7SUFDdkQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDBDQUF1QixFQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzNELE1BQU0sTUFBTSxHQUFHLElBQUks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
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.finalizeAffiliateOrderAttributionWorkflow = exports.finalizeAffiliateOrderAttributionStep = 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 promotion_eligibility_1 = require("./promotion-eligibility");
10
+ const utils_2 = require("./utils");
11
+ const affiliate_coupon_cart_1 = require("./affiliate-coupon-cart");
12
+ exports.finalizeAffiliateOrderAttributionStep = (0, workflows_sdk_1.createStep)("finalize-affiliate-order-attribution", async (input, { container }) => {
13
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
14
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
15
+ const [{ data: orders }, { data: carts }, commissionOrder] = await Promise.all([
16
+ query.graph({
17
+ entity: "order",
18
+ fields: [
19
+ "id",
20
+ "customer_id",
21
+ "email",
22
+ "currency_code",
23
+ "created_at",
24
+ ],
25
+ filters: { id: input.order_id },
26
+ }),
27
+ query.graph({
28
+ entity: "cart",
29
+ fields: ["id", "promotions.id", "promotions.code"],
30
+ filters: { id: input.cart_id },
31
+ }),
32
+ (0, utils_2.retrieveCheckoutOrderForCommission)(input.order_id, container),
33
+ ]);
34
+ const order = orders[0];
35
+ const cart = carts[0];
36
+ if (!order) {
37
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Order "${input.order_id}" was not found.`);
38
+ }
39
+ if (!cart) {
40
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart "${input.cart_id}" was not found.`);
41
+ }
42
+ const couponBindings = await (0, affiliate_coupon_cart_1.loadAffiliateCouponCartBindings)(affiliateService, (0, cart_promotions_1.readCartPromotions)(cart.promotions));
43
+ if (couponBindings.length > 1 ||
44
+ couponBindings.some(({ exact }) => !exact)) {
45
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "A completed cart must contain at most one exact Affiliate coupon promotion.");
46
+ }
47
+ let validatedCoupon = null;
48
+ const couponBinding = couponBindings[0];
49
+ if (couponBinding) {
50
+ const coupon = couponBinding.coupon;
51
+ const couponAffiliate = await affiliateService.retrieveAffiliateRecord(coupon.affiliate_id);
52
+ const promotion = await (0, promotion_eligibility_1.assertAuthenticAffiliateCouponPromotion)(container.resolve(utils_1.Modules.PROMOTION), { coupon, affiliate: couponAffiliate });
53
+ if (!promotion.code) {
54
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The affiliate promotion has no code.");
55
+ }
56
+ validatedCoupon = {
57
+ affiliate_coupon_id: coupon.id,
58
+ affiliate_id: couponAffiliate.id,
59
+ promotion_id: promotion.id,
60
+ code: promotion.code,
61
+ };
62
+ }
63
+ const result = (await affiliateService.finalizeOrderAttribution({
64
+ order_id: order.id,
65
+ cart_id: cart.id,
66
+ customer_id: order.customer_id ?? null,
67
+ normalized_email: order.email
68
+ ? (0, email_normalization_1.normalizeAffiliateEmail)(order.email)
69
+ : null,
70
+ currency_code: order.currency_code,
71
+ attributed_at: new Date(order.created_at),
72
+ validated_coupon: validatedCoupon,
73
+ commission_order: commissionOrder,
74
+ }));
75
+ return new workflows_sdk_1.StepResponse(result, result.compensation);
76
+ }, async (compensation, { container }) => {
77
+ if (!compensation)
78
+ return;
79
+ await (0, resolve_services_1.resolveAffiliateService)(container).compensateOrderAttribution(compensation);
80
+ });
81
+ exports.finalizeAffiliateOrderAttributionWorkflow = (0, workflows_sdk_1.createWorkflow)("finalize-affiliate-order-attribution", (input) => new workflows_sdk_1.WorkflowResponse((0, exports.finalizeAffiliateOrderAttributionStep)(input)));
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluYWxpemUtYWZmaWxpYXRlLW9yZGVyLWF0dHJpYnV0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hZmZpbGlhdGUvZmluYWxpemUtYWZmaWxpYXRlLW9yZGVyLWF0dHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFFQUswQztBQUMxQyxxREFJa0M7QUFFbEMsNEZBQTRGO0FBSzVGLG1FQUFzRTtBQUN0RSxpRUFBZ0U7QUFDaEUsbUVBQWlGO0FBQ2pGLG1DQUE0RDtBQUM1RCxtRUFBeUU7QUFvQjVELFFBQUEscUNBQXFDLEdBQUcsSUFBQSwwQkFBVSxFQUM3RCxzQ0FBc0MsRUFDdEMsS0FBSyxFQUNILEtBQXFELEVBQ3JELEVBQUUsU0FBUyxFQUFFLEVBQ2IsRUFBRTtJQUNGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUMzRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxlQUFlLENBQUMsR0FDeEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDVixNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLGFBQWE7Z0JBQ2IsT0FBTztnQkFDUCxlQUFlO2dCQUNmLFlBQVk7YUFDYjtZQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO1NBQ2hDLENBQUM7UUFDRixLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ1YsTUFBTSxFQUFFLE1BQU07WUFDZCxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO1NBQy9CLENBQUM7UUFDRixJQUFBLDBDQUFrQyxFQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO0tBQzlELENBQUMsQ0FBQTtJQUNKLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQXlDLENBQUE7SUFDL0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBd0MsQ0FBQTtJQUM1RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixVQUFVLEtBQUssQ0FBQyxRQUFRLGtCQUFrQixDQUMzQyxDQUFBO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLFNBQVMsS0FBSyxDQUFDLE9BQU8sa0JBQWtCLENBQ3pDLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFBLHVEQUErQixFQUMxRCxnQkFBZ0IsRUFDaEIsSUFBQSxvQ0FBa0IsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3BDLENBQUE7SUFDRCxJQUNFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUN6QixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDMUMsQ0FBQztRQUNELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDZFQUE2RSxDQUM5RSxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksZUFBZSxHQUtSLElBQUksQ0FBQTtJQUNmLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUE7UUFDbkMsTUFBTSxlQUFlLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FDcEUsTUFBTSxDQUFDLFlBQVksQ0FDcEIsQ0FBQTtRQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSwrREFBdUMsRUFDN0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUE0QixFQUMvRCxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLENBQ3ZDLENBQUE7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHNDQUFzQyxDQUN2QyxDQUFBO1FBQ0gsQ0FBQztRQUNELGVBQWUsR0FBRztZQUNoQixtQkFBbUIsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM5QixZQUFZLEVBQUUsZUFBZSxDQUFDLEVBQUU7WUFDaEMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1lBQzFCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtTQUNyQixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQztRQUM5RCxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQ2hCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUk7UUFDdEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDM0IsQ0FBQyxDQUFDLElBQUEsNkNBQXVCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN0QyxDQUFDLENBQUMsSUFBSTtRQUNSLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtRQUNsQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUN6QyxnQkFBZ0IsRUFBRSxlQUFlO1FBQ2pDLGdCQUFnQixFQUFFLGVBQWU7S0FDbEMsQ0FBQyxDQUE0QyxDQUFBO0lBRTlDLE9BQU8sSUFBSSw0QkFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7QUFDdEQsQ0FBQyxFQUNELEtBQUssRUFDSCxZQUFzRSxFQUN0RSxFQUFFLFNBQVMsRUFBRSxFQUNiLEVBQUU7SUFDRixJQUFJLENBQUMsWUFBWTtRQUFFLE9BQU07SUFDekIsTUFBTSxJQUFBLDBDQUF1QixFQUFDLFNBQVMsQ0FBQyxDQUFDLDBCQUEwQixDQUNqRSxZQUFZLENBQ2IsQ0FBQTtBQUNILENBQUMsQ0FDRixDQUFBO0FBRVksUUFBQSx5Q0FBeUMsR0FBRyxJQUFBLDhCQUFjLEVBQ3JFLHNDQUFzQyxFQUN0QyxDQUFDLEtBQXFELEVBQUUsRUFBRSxDQUN4RCxJQUFJLGdDQUFnQixDQUFDLElBQUEsNkNBQXFDLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FDckUsQ0FBQSJ9
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PAYMENT_AUTHORIZATION_PROMOTION_MUTATION_MESSAGE = void 0;
4
+ exports.hasPaymentAuthorizationStarted = hasPaymentAuthorizationStarted;
5
+ exports.assertPaymentAuthorizationNotStarted = assertPaymentAuthorizationNotStarted;
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ exports.PAYMENT_AUTHORIZATION_PROMOTION_MUTATION_MESSAGE = "The cart's promotions can't be changed after payment authorization has started.";
8
+ const lockedPaymentCollectionStatuses = new Set([
9
+ utils_1.PaymentCollectionStatus.AUTHORIZED,
10
+ utils_1.PaymentCollectionStatus.PARTIALLY_AUTHORIZED,
11
+ utils_1.PaymentCollectionStatus.PARTIALLY_CAPTURED,
12
+ utils_1.PaymentCollectionStatus.COMPLETED
13
+ ]);
14
+ const lockedPaymentSessionStatuses = new Set([
15
+ utils_1.PaymentSessionStatus.PENDING_AUTHORIZATION,
16
+ utils_1.PaymentSessionStatus.REQUIRES_MORE,
17
+ utils_1.PaymentSessionStatus.AUTHORIZED,
18
+ utils_1.PaymentSessionStatus.CAPTURED
19
+ ]);
20
+ function hasPaymentAuthorizationStarted(paymentCollection) {
21
+ return ((paymentCollection?.status !== null &&
22
+ paymentCollection?.status !== undefined &&
23
+ lockedPaymentCollectionStatuses.has(paymentCollection.status)) ||
24
+ paymentCollection?.payment_sessions?.some((session) => session.status !== null &&
25
+ session.status !== undefined &&
26
+ lockedPaymentSessionStatuses.has(session.status)) === true);
27
+ }
28
+ function assertPaymentAuthorizationNotStarted(paymentCollection) {
29
+ if (hasPaymentAuthorizationStarted(paymentCollection)) {
30
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, exports.PAYMENT_AUTHORIZATION_PROMOTION_MUTATION_MESSAGE);
31
+ }
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1hdXRob3JpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hZmZpbGlhdGUvcGF5bWVudC1hdXRob3JpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRCQSx3RUFjQztBQUVELG9GQVNDO0FBckRELHFEQUlrQztBQU9yQixRQUFBLGdEQUFnRCxHQUMzRCxpRkFBaUYsQ0FBQTtBQUVuRixNQUFNLCtCQUErQixHQUFHLElBQUksR0FBRyxDQUFTO0lBQ3RELCtCQUF1QixDQUFDLFVBQVU7SUFDbEMsK0JBQXVCLENBQUMsb0JBQW9CO0lBQzVDLCtCQUF1QixDQUFDLGtCQUFrQjtJQUMxQywrQkFBdUIsQ0FBQyxTQUFTO0NBQ2xDLENBQUMsQ0FBQTtBQUVGLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLENBQVM7SUFDbkQsNEJBQW9CLENBQUMscUJBQXFCO0lBQzFDLDRCQUFvQixDQUFDLGFBQWE7SUFDbEMsNEJBQW9CLENBQUMsVUFBVTtJQUMvQiw0QkFBb0IsQ0FBQyxRQUFRO0NBQzlCLENBQUMsQ0FBQTtBQUVGLFNBQWdCLDhCQUE4QixDQUM1QyxpQkFBb0Q7SUFFcEQsT0FBTyxDQUNMLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxLQUFLLElBQUk7UUFDakMsaUJBQWlCLEVBQUUsTUFBTSxLQUFLLFNBQVM7UUFDdkMsK0JBQStCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FDdkMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSTtZQUN2QixPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDNUIsNEJBQTRCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDbkQsS0FBSyxJQUFJLENBQ1gsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQixvQ0FBb0MsQ0FDbEQsaUJBQW9EO0lBRXBELElBQUksOEJBQThCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQzFCLHdEQUFnRCxDQUNqRCxDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMifQ==