@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,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transferConsignmentStockWorkflow = 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_inventory_transfer_adapter_1 = require("../../integrations/inventory-transfer/resolve-inventory-transfer-adapter");
8
+ const resolve_services_1 = require("../../utils/resolve-services");
9
+ const errorMessage = (error) => error instanceof Error ? error.message : "Unbekannter Transferfehler";
10
+ const validateBatchSources = async (container, input) => {
11
+ const registry = container;
12
+ if (registry.hasRegistration?.("batch_management") === false) {
13
+ return;
14
+ }
15
+ let candidate;
16
+ try {
17
+ candidate = container.resolve("batch_management");
18
+ }
19
+ catch (error) {
20
+ if (error instanceof Error &&
21
+ error.message.includes("Missing registration")) {
22
+ return;
23
+ }
24
+ throw error;
25
+ }
26
+ if (typeof candidate !== "object" ||
27
+ candidate === null ||
28
+ !("retrieveBatch" in candidate) ||
29
+ typeof candidate.retrieveBatch !== "function") {
30
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Batch Management ist installiert, unterstützt aber keine chargensicheren Transfers. Aktualisiere das Batch-Management-Plugin.");
31
+ }
32
+ const batchService = candidate;
33
+ await Promise.all(input.lines.map(async (line) => {
34
+ if (!line.batch_id) {
35
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Eine chargenspezifische Umbuchung benötigt für jede Position eine Charge.");
36
+ }
37
+ const batch = await batchService.retrieveBatch(line.batch_id);
38
+ if (batch.inventory_item_id !== line.inventory_item_id) {
39
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Die Charge "${batch.id}" gehört nicht zum angegebenen Inventory Item.`);
40
+ }
41
+ if (batch.location_id !== input.source_location_id) {
42
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Die Charge "${batch.id}" liegt nicht am angegebenen Quelllager.`);
43
+ }
44
+ return batch;
45
+ }));
46
+ };
47
+ const addBatchSnapshots = (result) => result.lines.map((line) => {
48
+ return {
49
+ ...line,
50
+ batch_name_snapshot: line.batch_name ?? null,
51
+ batch_expiry_date_snapshot: line.batch_expiry_date ?? null,
52
+ };
53
+ });
54
+ const executeConsignmentTransferStep = (0, workflows_sdk_1.createStep)("affiliate-execute-consignment-stock-transfer", async (input, { container }) => {
55
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
56
+ const prepared = await affiliateService.prepareConsignmentTransfer(input);
57
+ if (prepared.already_completed) {
58
+ return new workflows_sdk_1.StepResponse({
59
+ ...prepared.transfer,
60
+ lines: prepared.lines,
61
+ });
62
+ }
63
+ try {
64
+ const stockLocations = container.resolve(utils_1.Modules.STOCK_LOCATION);
65
+ const inventory = container.resolve(utils_1.Modules.INVENTORY);
66
+ await Promise.all([
67
+ stockLocations.retrieveStockLocation(input.source_location_id),
68
+ stockLocations.retrieveStockLocation(prepared.settings.stock_location_id),
69
+ ...input.lines.map((line) => inventory.retrieveInventoryItem(line.inventory_item_id)),
70
+ ]);
71
+ const adapter = (0, resolve_inventory_transfer_adapter_1.resolveInventoryTransferAdapter)(container, {
72
+ require_batch_validation: true,
73
+ });
74
+ await validateBatchSources(container, input);
75
+ const result = await adapter.transfer({
76
+ idempotency_key: `consignment-transfer:${prepared.transfer.id}`,
77
+ lines: input.lines.map((line) => ({
78
+ ...line,
79
+ source_location_id: input.source_location_id,
80
+ destination_location_id: prepared.settings.stock_location_id,
81
+ })),
82
+ });
83
+ const resultLines = addBatchSnapshots(result);
84
+ const completed = await affiliateService.completeConsignmentTransfer({
85
+ transfer_id: prepared.transfer.id,
86
+ mode: result.mode,
87
+ lines: resultLines,
88
+ });
89
+ return new workflows_sdk_1.StepResponse(completed);
90
+ }
91
+ catch (error) {
92
+ await affiliateService.failConsignmentTransfer({
93
+ transfer_id: prepared.transfer.id,
94
+ failure_reason: errorMessage(error),
95
+ });
96
+ throw error;
97
+ }
98
+ });
99
+ exports.transferConsignmentStockWorkflow = (0, workflows_sdk_1.createWorkflow)("affiliate-transfer-consignment-stock", (input) => {
100
+ const lockKey = (0, workflows_sdk_1.transform)(input, (data) => `affiliate-consignment-transfer:${data.idempotency_key}`);
101
+ (0, core_flows_1.acquireLockStep)({ key: lockKey, timeout: 10, ttl: 120 });
102
+ const transfer = executeConsignmentTransferStep(input);
103
+ (0, core_flows_1.releaseLockStep)({ key: lockKey });
104
+ return new workflows_sdk_1.WorkflowResponse(transfer);
105
+ });
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXItY29uc2lnbm1lbnQtc3RvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2FmZmlsaWF0ZS90cmFuc2Zlci1jb25zaWdubWVudC1zdG9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxxRUFNMEM7QUFDMUMscURBQWdFO0FBQ2hFLDREQUdvQztBQUVwQyxpSUFBMEg7QUFHMUgsbUVBQXNFO0FBZ0N0RSxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFLENBQzlDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFBO0FBRXZFLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUNoQyxTQUFnRSxFQUNoRSxLQUFvQyxFQUNyQixFQUFFO0lBQ2pCLE1BQU0sUUFBUSxHQUFHLFNBQTZCLENBQUE7SUFDOUMsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM3RCxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksU0FBa0IsQ0FBQTtJQUN0QixJQUFJLENBQUM7UUFDSCxTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFDRSxLQUFLLFlBQVksS0FBSztZQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUM5QyxDQUFDO1lBQ0QsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQTtJQUNiLENBQUM7SUFFRCxJQUNFLE9BQU8sU0FBUyxLQUFLLFFBQVE7UUFDN0IsU0FBUyxLQUFLLElBQUk7UUFDbEIsQ0FBQyxDQUFDLGVBQWUsSUFBSSxTQUFTLENBQUM7UUFDL0IsT0FBTyxTQUFTLENBQUMsYUFBYSxLQUFLLFVBQVUsRUFDN0MsQ0FBQztRQUNELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLCtIQUErSCxDQUNoSSxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLFNBQWlDLENBQUE7SUFDdEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDJFQUEyRSxDQUM1RSxDQUFBO1FBQ0gsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFN0QsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsZUFBZSxLQUFLLENBQUMsRUFBRSxnREFBZ0QsQ0FDeEUsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDbkQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsZUFBZSxLQUFLLENBQUMsRUFBRSwwQ0FBMEMsQ0FDbEUsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsQ0FBQyxDQUNILENBQUE7QUFFSCxDQUFDLENBQUE7QUFFRCxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLE1BQStCLEVBQy9CLEVBQUUsQ0FDRixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ3hCLE9BQU87UUFDTCxHQUFHLElBQUk7UUFDUCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUk7UUFDNUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUk7S0FDM0QsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUosTUFBTSw4QkFBOEIsR0FBRyxJQUFBLDBCQUFVLEVBQy9DLDhDQUE4QyxFQUM5QyxLQUFLLEVBQ0gsS0FBb0MsRUFDcEMsRUFBRSxTQUFTLEVBQUUsRUFDa0MsRUFBRTtJQUNqRCxNQUFNLGdCQUFnQixHQUFHLElBQUEsMENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUV6RSxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSw0QkFBWSxDQUFDO1lBQ3RCLEdBQUcsUUFBUSxDQUFDLFFBQVE7WUFDcEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ3RCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUN0QyxlQUFPLENBQUMsY0FBYyxDQUNFLENBQUE7UUFDMUIsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDakMsZUFBTyxDQUFDLFNBQVMsQ0FDRyxDQUFBO1FBQ3RCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoQixjQUFjLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1lBQzlELGNBQWMsQ0FBQyxxQkFBcUIsQ0FDbEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FDcEM7WUFDRCxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDMUIsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUN4RDtTQUNGLENBQUMsQ0FBQTtRQUVGLE1BQU0sT0FBTyxHQUFHLElBQUEsb0VBQStCLEVBQUMsU0FBUyxFQUFFO1lBQ3pELHdCQUF3QixFQUFFLElBQUk7U0FDL0IsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxvQkFBb0IsQ0FDeEIsU0FBUyxFQUNULEtBQUssQ0FDTixDQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3BDLGVBQWUsRUFBRSx3QkFBd0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDL0QsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxHQUFHLElBQUk7Z0JBQ1Asa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtnQkFDNUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7YUFDN0QsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFBO1FBQ0YsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDN0MsTUFBTSxTQUFTLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQztZQUNqRCxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2pDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixLQUFLLEVBQUUsV0FBVztTQUNuQixDQUFDLENBQUE7UUFFSixPQUFPLElBQUksNEJBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sZ0JBQWdCLENBQUMsdUJBQXVCLENBQUM7WUFDN0MsV0FBVyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNqQyxjQUFjLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQztTQUNwQyxDQUFDLENBQUE7UUFDRixNQUFNLEtBQUssQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDLENBQ0YsQ0FBQTtBQUVZLFFBQUEsZ0NBQWdDLEdBQUcsSUFBQSw4QkFBYyxFQUM1RCxzQ0FBc0MsRUFDdEMsQ0FBQyxLQUFvQyxFQUFFLEVBQUU7SUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBQSx5QkFBUyxFQUN2QixLQUFLLEVBQ0wsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGtDQUFrQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQ25FLENBQUE7SUFDRCxJQUFBLDRCQUFlLEVBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDeEQsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEQsSUFBQSw0QkFBZSxFQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFFakMsT0FBTyxJQUFJLGdDQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ3ZDLENBQUMsQ0FDRixDQUFBIn0=
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateProgramSettingsWithCouponDiscountReconciliation = exports.updateAffiliateWithCouponDiscountReconciliation = 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 ensure_affiliate_coupon_promotion_1 = require("./ensure-affiliate-coupon-promotion");
8
+ const reconcile_affiliate_coupon_1 = require("./reconcile-affiliate-coupon");
9
+ const listEnabledCoupons = async (affiliateService, affiliateId) => {
10
+ const coupons = [];
11
+ const pageSize = 100;
12
+ let offset = 0;
13
+ while (true) {
14
+ const [page] = await affiliateService.listAffiliateCouponRecordsWithCount({
15
+ ...(affiliateId ? { affiliate_id: affiliateId } : {}),
16
+ lifecycle_status: "enabled",
17
+ limit: pageSize,
18
+ offset,
19
+ });
20
+ coupons.push(...page);
21
+ if (page.length < pageSize)
22
+ return coupons;
23
+ offset += pageSize;
24
+ }
25
+ };
26
+ const provisionCoupons = async (container, coupons) => {
27
+ const outcomes = [];
28
+ const failures = [];
29
+ for (const coupon of coupons) {
30
+ try {
31
+ outcomes.push(await (0, ensure_affiliate_coupon_promotion_1.provisionAffiliateCouponPromotion)(container, {
32
+ coupon_id: coupon.id,
33
+ }));
34
+ }
35
+ catch (error) {
36
+ failures.push({ coupon_id: coupon.id, error });
37
+ }
38
+ }
39
+ return { outcomes, failures };
40
+ };
41
+ const completeCouponReconciliations = async (container, batch) => {
42
+ const failures = [...batch.failures];
43
+ for (const outcome of batch.outcomes) {
44
+ try {
45
+ await (0, reconcile_affiliate_coupon_1.completeAffiliateCouponReconciliation)(container, outcome);
46
+ }
47
+ catch (error) {
48
+ failures.push({ coupon_id: outcome.coupon.id, error });
49
+ }
50
+ }
51
+ return failures;
52
+ };
53
+ const throwReconciliationFailures = (failures, message) => {
54
+ if (failures.length === 1)
55
+ throw failures[0].error;
56
+ if (failures.length) {
57
+ throw new AggregateError(failures.map(({ error }) => error), message);
58
+ }
59
+ };
60
+ const updateAffiliateWithCouponDiscountReconciliation = async (container, input) => {
61
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
62
+ const critical = await (0, affiliate_cart_operation_lock_1.withAffiliateOperationLocks)(container, (0, ensure_affiliate_coupon_promotion_1.affiliateCouponProvisioningLockKeys)(input.id), async () => {
63
+ const previous = await affiliateService.retrieveAffiliateRecord(input.id);
64
+ const affiliate = await affiliateService.updateAffiliateRecord(input);
65
+ const rateChanged = (previous.customer_discount_rate_override ?? null) !==
66
+ (affiliate.customer_discount_rate_override ?? null);
67
+ const batch = rateChanged
68
+ ? await provisionCoupons(container, await listEnabledCoupons(affiliateService, affiliate.id))
69
+ : { outcomes: [], failures: [] };
70
+ return { affiliate, batch };
71
+ });
72
+ const failures = await completeCouponReconciliations(container, critical.batch);
73
+ throwReconciliationFailures(failures, `Affiliate coupon discount reconciliation failed for affiliate "${input.id}"`);
74
+ return critical.affiliate;
75
+ };
76
+ exports.updateAffiliateWithCouponDiscountReconciliation = updateAffiliateWithCouponDiscountReconciliation;
77
+ const listDefaultDiscountCoupons = async (affiliateService) => {
78
+ const affiliates = new Map();
79
+ const coupons = [];
80
+ for (const coupon of await listEnabledCoupons(affiliateService)) {
81
+ let affiliate = affiliates.get(coupon.affiliate_id);
82
+ if (!affiliate) {
83
+ affiliate = await affiliateService.retrieveAffiliateRecord(coupon.affiliate_id);
84
+ affiliates.set(coupon.affiliate_id, affiliate);
85
+ }
86
+ if (affiliate.customer_discount_rate_override == null) {
87
+ coupons.push(coupon);
88
+ }
89
+ }
90
+ return {
91
+ coupons,
92
+ affiliate_ids: [...new Set(coupons.map(({ affiliate_id }) => affiliate_id))]
93
+ .sort(),
94
+ };
95
+ };
96
+ const updateProgramSettingsWithCouponDiscountReconciliation = async (container, input) => {
97
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
98
+ let observed = await listDefaultDiscountCoupons(affiliateService);
99
+ for (let attempt = 0; attempt < 3; attempt += 1) {
100
+ const lockedAffiliateIds = new Set(observed.affiliate_ids);
101
+ const critical = await (0, affiliate_cart_operation_lock_1.withAffiliateOperationLocks)(container, [
102
+ ...(0, ensure_affiliate_coupon_promotion_1.affiliateCouponProgramLockKeys)(),
103
+ ...observed.affiliate_ids.map(affiliate_cart_operation_lock_1.affiliateSagaLockKey),
104
+ ], async () => {
105
+ const locked = await listDefaultDiscountCoupons(affiliateService);
106
+ if (locked.affiliate_ids.some((affiliateId) => !lockedAffiliateIds.has(affiliateId))) {
107
+ return { kind: "retry", state: locked };
108
+ }
109
+ const previous = await affiliateService.retrieveProgramSettings();
110
+ const settings = await affiliateService.updateProgramSettings(input);
111
+ const batch = previous.default_customer_discount_rate ===
112
+ settings.default_customer_discount_rate
113
+ ? { outcomes: [], failures: [] }
114
+ : await provisionCoupons(container, locked.coupons);
115
+ return { kind: "updated", settings, batch };
116
+ });
117
+ if (critical.kind === "retry") {
118
+ observed = critical.state;
119
+ continue;
120
+ }
121
+ return {
122
+ settings: critical.settings,
123
+ failures: await completeCouponReconciliations(container, critical.batch),
124
+ };
125
+ }
126
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Affiliate coupon state changed repeatedly during the program discount update.");
127
+ };
128
+ exports.updateProgramSettingsWithCouponDiscountReconciliation = updateProgramSettingsWithCouponDiscountReconciliation;
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWFmZmlsaWF0ZS1jb3Vwb24tZGlzY291bnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hZmZpbGlhdGUvdXBkYXRlLWFmZmlsaWF0ZS1jb3Vwb24tZGlzY291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUF1RDtBQVV2RCw2RkFHa0Q7QUFDbEQsbUVBQXNFO0FBQ3RFLDJGQUs0QztBQUM1Qyw2RUFBb0Y7QUFZcEYsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQzlCLGdCQUF3QyxFQUN4QyxXQUFvQixFQUNXLEVBQUU7SUFDakMsTUFBTSxPQUFPLEdBQXlCLEVBQUUsQ0FBQTtJQUN4QyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUE7SUFDcEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO0lBRWQsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FDVixNQUFNLGdCQUFnQixDQUFDLG1DQUFtQyxDQUFDO1lBQ3pELEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckQsZ0JBQWdCLEVBQUUsU0FBUztZQUMzQixLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU07U0FDUCxDQUFDLENBQUE7UUFDSixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVE7WUFBRSxPQUFPLE9BQU8sQ0FBQTtRQUMxQyxNQUFNLElBQUksUUFBUSxDQUFBO0lBQ3BCLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFDNUIsU0FBMEIsRUFDMUIsT0FBc0MsRUFDVixFQUFFO0lBQzlCLE1BQU0sUUFBUSxHQUEyQyxFQUFFLENBQUE7SUFD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
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.retrieveReturnForCommission = exports.retrieveCheckoutOrderForCommission = exports.retrieveOrderForCommission = exports.mapReturnForCommission = exports.mapOrderForCommission = exports.bigNumberValueToNumber = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const money_1 = require("../../utils/money");
6
+ const hasToNumber = (value) => "toNumber" in value && typeof value.toNumber === "function";
7
+ const bigNumberValueToNumber = (value) => {
8
+ if (value === undefined || value === null) {
9
+ return 0;
10
+ }
11
+ if (typeof value === "number") {
12
+ return value;
13
+ }
14
+ if (typeof value === "string") {
15
+ return Number(value);
16
+ }
17
+ if ("numeric" in value && typeof value.numeric === "number") {
18
+ return value.numeric;
19
+ }
20
+ if (hasToNumber(value)) {
21
+ return value.toNumber();
22
+ }
23
+ return Number(value.valueOf());
24
+ };
25
+ exports.bigNumberValueToNumber = bigNumberValueToNumber;
26
+ const netOfTax = (total, taxTotal, decimals) => money_1.Money.of((0, exports.bigNumberValueToNumber)(total))
27
+ .subtract((0, exports.bigNumberValueToNumber)(taxTotal))
28
+ .toRoundedNumber(decimals);
29
+ const mapLineItem = (item, decimals, excludedProductIds) => ({
30
+ id: item.id,
31
+ quantity: (0, exports.bigNumberValueToNumber)(item.quantity),
32
+ undiscounted_net_subtotal: netOfTax(item.original_total ?? item.subtotal, item.original_tax_total, decimals),
33
+ discounted_net_subtotal: netOfTax(item.total, item.tax_total, decimals),
34
+ eligible: !item.is_giftcard &&
35
+ item.requires_shipping !== false &&
36
+ item.is_discountable !== false &&
37
+ item.metadata?.affiliate_commission_excluded !== true &&
38
+ item.line_item_metadata?.affiliate_commission_excluded !== true &&
39
+ (!item.product_id || !excludedProductIds.has(item.product_id)),
40
+ is_giftcard: item.is_giftcard,
41
+ });
42
+ const mapOrderForCommission = (order, options = {}) => {
43
+ const decimals = (0, money_1.getCurrencyDecimals)(order.currency_code);
44
+ const excludedProductIds = new Set(options.excluded_product_ids ?? []);
45
+ return {
46
+ id: order.id,
47
+ customer_id: order.customer_id ?? null,
48
+ email: order.email ?? null,
49
+ currency_code: order.currency_code,
50
+ created_at: order.created_at,
51
+ canceled_at: order.canceled_at ?? null,
52
+ item_discounted_net_subtotal: netOfTax(order.item_total, order.item_tax_total, decimals),
53
+ items: order.items?.map((item) => mapLineItem(item, decimals, excludedProductIds)) ?? [],
54
+ eligibility_is_immutable: options.eligibility_is_immutable,
55
+ };
56
+ };
57
+ exports.mapOrderForCommission = mapOrderForCommission;
58
+ const mapReturnForCommission = (orderReturn) => ({
59
+ id: orderReturn.id,
60
+ order_id: orderReturn.order_id,
61
+ items: orderReturn.items?.map((item) => ({
62
+ item_id: item.item_id,
63
+ quantity: (0, exports.bigNumberValueToNumber)(item.quantity),
64
+ received_quantity: item.received_quantity === undefined || item.received_quantity === null
65
+ ? null
66
+ : (0, exports.bigNumberValueToNumber)(item.received_quantity),
67
+ })) ?? [],
68
+ received_at: orderReturn.received_at ?? null,
69
+ updated_at: orderReturn.updated_at ?? null,
70
+ created_at: orderReturn.created_at ?? null,
71
+ });
72
+ exports.mapReturnForCommission = mapReturnForCommission;
73
+ const retrieveOrderForCommission = async (orderId, container) => {
74
+ const orderService = container.resolve(utils_1.Modules.ORDER);
75
+ const order = await orderService.retrieveOrder(orderId, {
76
+ relations: ["items"],
77
+ });
78
+ // Product eligibility is mutable. Async handlers consume the immutable
79
+ // ledger family created by the checkout hook and otherwise fail closed.
80
+ return (0, exports.mapOrderForCommission)(order, { eligibility_is_immutable: false });
81
+ };
82
+ exports.retrieveOrderForCommission = retrieveOrderForCommission;
83
+ const retrieveCheckoutOrderForCommission = async (orderId, container) => {
84
+ const orderService = container.resolve(utils_1.Modules.ORDER);
85
+ const order = await orderService.retrieveOrder(orderId, {
86
+ relations: ["items"],
87
+ });
88
+ const productIds = [
89
+ ...new Set((order.items ?? [])
90
+ .map((item) => item.product_id)
91
+ .filter((productId) => Boolean(productId))),
92
+ ];
93
+ let excludedProductIds = [];
94
+ if (productIds.length) {
95
+ const productService = container.resolve(utils_1.Modules.PRODUCT);
96
+ const products = await productService.listProducts({ id: productIds }, {
97
+ select: ["id", "metadata"],
98
+ take: productIds.length,
99
+ });
100
+ excludedProductIds = products
101
+ .filter((product) => product.metadata?.affiliate_commission_excluded === true)
102
+ .map((product) => product.id);
103
+ }
104
+ return (0, exports.mapOrderForCommission)(order, {
105
+ excluded_product_ids: excludedProductIds,
106
+ eligibility_is_immutable: true,
107
+ });
108
+ };
109
+ exports.retrieveCheckoutOrderForCommission = retrieveCheckoutOrderForCommission;
110
+ const retrieveReturnForCommission = async (returnId, container) => {
111
+ const orderService = container.resolve(utils_1.Modules.ORDER);
112
+ const orderReturn = await orderService.retrieveReturn(returnId, {
113
+ relations: ["items"],
114
+ });
115
+ return (0, exports.mapReturnForCommission)(orderReturn);
116
+ };
117
+ exports.retrieveReturnForCommission = retrieveReturnForCommission;
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2FmZmlsaWF0ZS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxxREFBbUQ7QUFPbkQsNkNBQThEO0FBTTlELE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBYSxFQUFrQyxFQUFFLENBQ3BFLFVBQVUsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQTtBQUV0RCxNQUFNLHNCQUFzQixHQUFHLENBQ3BDLEtBQXdDLEVBQ2hDLEVBQUU7SUFDVixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBRUQsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUE7SUFDdEIsQ0FBQztJQUVELElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDekIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQ2hDLENBQUMsQ0FBQTtBQXhCWSxRQUFBLHNCQUFzQiwwQkF3QmxDO0FBRUQsTUFBTSxRQUFRLEdBQUcsQ0FDZixLQUF3QyxFQUN4QyxRQUEyQyxFQUMzQyxRQUFnQixF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
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const Sentry = __importStar(require("@sentry/node"));
37
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
38
+ const complete_cart_order_created_composition_1 = require("./complete-cart-order-created-composition");
39
+ // Medusa 2.19.0 creates this hook internally but omits it from complete cart's
40
+ // public declaration. Keep the cast isolated to this version-specific edge.
41
+ const { orderCreated } = core_flows_1.completeCartWorkflow.hooks;
42
+ // No throw/catch exists here today - this wraps defensively anyway, since
43
+ // any unexpected exception in a post-order side-effect hook currently has
44
+ // zero visibility beyond whatever the workflow engine itself logs.
45
+ orderCreated(async (input, context) => {
46
+ try {
47
+ return await (0, complete_cart_order_created_composition_1.handleCompleteCartOrderCreated)(input, context);
48
+ }
49
+ catch (error) {
50
+ Sentry.captureException(error, {
51
+ tags: { area: "affiliate-complete-cart-order-created" },
52
+ extra: { cartId: input.cart_id, orderId: input.order_id },
53
+ });
54
+ throw error;
55
+ }
56
+ }, complete_cart_order_created_composition_1.compensateCompleteCartOrderCreated);
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGUtY2FydC1hZmZpbGlhdGUtYXR0cmlidXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2hvb2tzL2NvbXBsZXRlLWNhcnQtYWZmaWxpYXRlLWF0dHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQXNDO0FBRXRDLDREQUFrRTtBQUVsRSx1R0FJa0Q7QUFhbEQsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsaUNBQW9CLENBQUMsS0FFN0MsQ0FBQTtBQUVELDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsbUVBQW1FO0FBQ25FLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3BDLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxJQUFBLHdFQUE4QixFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDN0IsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLHVDQUF1QyxFQUFFO1lBQ3ZELEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO1NBQzFELENBQUMsQ0FBQTtRQUNGLE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUMsRUFBRSw0RUFBa0MsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compensateCompleteCartOrderCreated = exports.handleCompleteCartOrderCreated = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const finalize_affiliate_order_attribution_1 = require("../affiliate/finalize-affiliate-order-attribution");
7
+ const warnTaxEvidenceFailure = (container, operation) => {
8
+ const message = operation === "freeze"
9
+ ? "Tax evidence freeze is unavailable; continuing without tax evidence."
10
+ : "Tax evidence compensation failed; workflow cancellation remains failed for retry.";
11
+ try {
12
+ container
13
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
14
+ .warn(message);
15
+ }
16
+ catch {
17
+ // Logging must not replace the original workflow outcome.
18
+ }
19
+ };
20
+ const cartRequiresFrozenTaxEvidence = async (container, cartId) => {
21
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
22
+ const { data } = await query.graph({
23
+ entity: "cart",
24
+ fields: ["id", "items.tax_lines.rate", "shipping_methods.tax_lines.rate"],
25
+ filters: { id: cartId },
26
+ });
27
+ const cart = data[0];
28
+ if (!cart) {
29
+ throw new Error(`Cart with id '${cartId}' was not found.`);
30
+ }
31
+ const rates = [
32
+ ...(cart.items ?? []).flatMap((item) => item.tax_lines ?? []),
33
+ ...(cart.shipping_methods ?? []).flatMap((shippingMethod) => shippingMethod.tax_lines ?? []),
34
+ ].map(({ rate }) => Number(rate));
35
+ return (rates.length > 0 &&
36
+ rates.every((rate) => Number.isFinite(rate) && rate === 0));
37
+ };
38
+ const runTaxEvidenceFreeze = async (input, stepContext) => {
39
+ const { container, ...sharedContext } = stepContext;
40
+ let requiresFrozenEvidence;
41
+ const requiresFrozenTaxEvidence = () => (requiresFrozenEvidence ??= cartRequiresFrozenTaxEvidence(container, input.cart_id));
42
+ try {
43
+ if (!container.hasRegistration("tax_compliance")) {
44
+ return;
45
+ }
46
+ const workflowEngine = container.resolve(utils_1.Modules.WORKFLOW_ENGINE);
47
+ const transaction = await workflowEngine.run("freeze-tax-compliance-order-evidence", {
48
+ input,
49
+ transactionId: stepContext.transactionId,
50
+ context: {
51
+ ...sharedContext,
52
+ preventReleaseEvents: true,
53
+ },
54
+ });
55
+ if (transaction?.result == null &&
56
+ (await requiresFrozenTaxEvidence())) {
57
+ throw new Error("Zero-rated order completion requires durable frozen tax evidence.");
58
+ }
59
+ }
60
+ catch (error) {
61
+ if (await requiresFrozenTaxEvidence()) {
62
+ throw error;
63
+ }
64
+ warnTaxEvidenceFailure(container, "freeze");
65
+ }
66
+ };
67
+ const compensateTaxEvidenceFreeze = async (transactionId, stepContext) => {
68
+ const { container, ...sharedContext } = stepContext;
69
+ try {
70
+ if (!container.hasRegistration("tax_compliance")) {
71
+ return;
72
+ }
73
+ const workflowEngine = container.resolve(utils_1.Modules.WORKFLOW_ENGINE);
74
+ await workflowEngine.cancel("freeze-tax-compliance-order-evidence", {
75
+ transactionId,
76
+ container,
77
+ context: sharedContext,
78
+ });
79
+ }
80
+ catch (error) {
81
+ warnTaxEvidenceFailure(container, "compensation");
82
+ throw error;
83
+ }
84
+ };
85
+ const handleCompleteCartOrderCreated = async (input, stepContext) => {
86
+ const { container, ...sharedContext } = stepContext;
87
+ const transaction = await (0, finalize_affiliate_order_attribution_1.finalizeAffiliateOrderAttributionWorkflow)(container).run({
88
+ input,
89
+ context: {
90
+ ...sharedContext,
91
+ preventReleaseEvents: true,
92
+ },
93
+ });
94
+ await runTaxEvidenceFreeze(input, stepContext);
95
+ return new workflows_sdk_1.StepResponse(transaction.result, stepContext.transactionId);
96
+ };
97
+ exports.handleCompleteCartOrderCreated = handleCompleteCartOrderCreated;
98
+ const compensateCompleteCartOrderCreated = async (transactionId, stepContext) => {
99
+ if (!transactionId) {
100
+ return;
101
+ }
102
+ const { container, ...sharedContext } = stepContext;
103
+ await (0, finalize_affiliate_order_attribution_1.finalizeAffiliateOrderAttributionWorkflow)(container).cancel({
104
+ transactionId,
105
+ container,
106
+ context: sharedContext,
107
+ });
108
+ await compensateTaxEvidenceFreeze(transactionId, stepContext);
109
+ };
110
+ exports.compensateCompleteCartOrderCreated = compensateCompleteCartOrderCreated;
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGUtY2FydC1vcmRlci1jcmVhdGVkLWNvbXBvc2l0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9ob29rcy9jb21wbGV0ZS1jYXJ0LW9yZGVyLWNyZWF0ZWQtY29tcG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQWdFO0FBS2hFLHFEQUE4RTtBQUc5RSw0R0FBNkc7QUFXN0csTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixTQUEwQixFQUMxQixTQUFvQyxFQUM5QixFQUFFO0lBQ1IsTUFBTSxPQUFPLEdBQ1gsU0FBUyxLQUFLLFFBQVE7UUFDcEIsQ0FBQyxDQUFDLHNFQUFzRTtRQUN4RSxDQUFDLENBQUMsbUZBQW1GLENBQUE7SUFFekYsSUFBSSxDQUFDO1FBQ0gsU0FBUzthQUNOLE9BQU8sQ0FFTCxpQ0FBeUIsQ0FBQyxNQUFNLENBQUM7YUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCwwREFBMEQ7SUFDNUQsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVELE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxFQUN6QyxTQUEwQixFQUMxQixNQUFjLEVBQ0ksRUFBRTtJQUNwQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakMsTUFBTSxFQUFFLE1BQU07UUFDZCxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsaUNBQWlDLENBQUM7UUFDekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRTtLQUN4QixDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQU9OLENBQUE7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
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCompleteCartOwnOrderDiscount = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const resolve_services_1 = require("../../utils/resolve-services");
7
+ const cart_promotions_1 = require("../../utils/cart-promotions");
8
+ const promotion_eligibility_1 = require("../affiliate/promotion-eligibility");
9
+ const validateCompleteCartOwnOrderDiscount = async ({ cart }, { 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 typedCart = cart;
14
+ const promotionIds = (0, cart_promotions_1.readCartPromotions)(typedCart.promotions).map((promotion) => promotion.id);
15
+ const publicCouponBindings = await affiliateService.listAffiliateCouponBindingsByPromotionIds(promotionIds);
16
+ const publicPromotionIds = new Set(publicCouponBindings
17
+ .map(({ promotion_id }) => promotion_id)
18
+ .filter((id) => Boolean(id)));
19
+ const ownAffiliate = typedCart.customer_id
20
+ ? await affiliateService.findActiveAffiliateByCustomerId(typedCart.customer_id)
21
+ : null;
22
+ if (ownAffiliate) {
23
+ if (promotionIds.some((id) => publicPromotionIds.has(id))) {
24
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Affiliate customers cannot use public affiliate codes.");
25
+ }
26
+ // Without an own-order discount there is no promotion to require: the
27
+ // Affiliate is never given one for a 0% rate.
28
+ if (!(Number(ownAffiliate.own_order_discount_rate) > 0)) {
29
+ return new workflows_sdk_1.StepResponse(undefined);
30
+ }
31
+ const cartVariantIds = new Set((typedCart.items ?? [])
32
+ .map((item) => item.variant_id)
33
+ .filter((id) => Boolean(id)));
34
+ const [ownPromotion] = ownAffiliate.own_order_promotion_id
35
+ ? await promotionService.listPromotions({ id: [ownAffiliate.own_order_promotion_id] }, {
36
+ relations: [
37
+ "application_method",
38
+ "application_method.target_rules",
39
+ "application_method.target_rules.values",
40
+ ],
41
+ take: 1,
42
+ })
43
+ : [];
44
+ // Whether the discount can apply follows the promotion's own variant
45
+ // allowlist - exactly what Medusa applies - not the live catalogue, which
46
+ // runs ahead of it after a product change until provisioning catches up.
47
+ // Without a promotion there is no allowlist, so the catalogue decides.
48
+ const eligibleVariantIds = ownPromotion
49
+ ? (0, promotion_eligibility_1.affiliatePromotionVariantAllowlist)(ownPromotion.application_method?.target_rules)
50
+ : new Set(await (0, promotion_eligibility_1.listAffiliateEligibleVariantIds)(query));
51
+ const cartHasEligibleItems = [...cartVariantIds].some((id) => eligibleVariantIds.has(id));
52
+ // A cart made up entirely of items the affiliate discount can never
53
+ // apply to (no shippable/eligible variant) must still be completable at
54
+ // full price - the mandatory-promotion gate only makes sense once the
55
+ // discount could actually apply to something in the cart.
56
+ if (!cartHasEligibleItems) {
57
+ return new workflows_sdk_1.StepResponse(undefined);
58
+ }
59
+ if (!ownPromotion || !promotionIds.includes(ownPromotion.id)) {
60
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "The mandatory affiliate own-order promotion is missing.");
61
+ }
62
+ // Its rate is kept current by provisioning; checkout only verifies the
63
+ // promotion is live and correctly shaped.
64
+ const rate = Number(ownPromotion.application_method?.value);
65
+ if (ownPromotion.status !== "active" ||
66
+ ownPromotion.application_method?.type !== "percentage" ||
67
+ !(rate > 0 && rate <= 100)) {
68
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "The affiliate own-order promotion is invalid.");
69
+ }
70
+ return new workflows_sdk_1.StepResponse(undefined);
71
+ }
72
+ return new workflows_sdk_1.StepResponse(undefined);
73
+ };
74
+ exports.validateCompleteCartOwnOrderDiscount = validateCompleteCartOwnOrderDiscount;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGUtY2FydC1vd24tb3JkZXItZGlzY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2hvb2tzL2NvbXBsZXRlLWNhcnQtb3duLW9yZGVyLWRpc2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFFQUFnRTtBQUNoRSxxREFJa0M7QUFHbEMsbUVBQXNFO0FBQ3RFLGlFQUFnRTtBQUNoRSw4RUFHMkM7QUF5QnBDLE1BQU0sb0NBQW9DLEdBQUcsS0FBSyxFQUN2RCxFQUFFLElBQUksRUFBNkIsRUFDbkMsRUFBRSxTQUFTLEVBQStCLEVBQzFDLEVBQUU7SUFDRixNQUFNLGdCQUFnQixHQUFHLElBQUEsMENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUN4QyxlQUFPLENBQUMsU0FBUyxDQUNTLENBQUE7SUFDNUIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUE2QixDQUFBO0lBRS9DLE1BQU0sWUFBWSxHQUFHLElBQUEsb0NBQWtCLEVBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FDL0QsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQzVCLENBQUE7SUFDRCxNQUFNLG9CQUFvQixHQUN4QixNQUFNLGdCQUFnQixDQUFDLHlDQUF5QyxDQUM5RCxZQUFZLENBQ2IsQ0FBQTtJQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQ2hDLG9CQUFvQjtTQUNqQixHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7U0FDdkMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFnQixFQUFFLENBQUMsT0FB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