@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,2321 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const utils_1 = require("@medusajs/framework/utils");
19
+ const framework_1 = require("@medusajs/framework");
20
+ const email_events_1 = require("../../integration/email-events");
21
+ const affiliate_1 = __importDefault(require("./models/affiliate"));
22
+ const affiliate_coupon_1 = __importDefault(require("./models/affiliate-coupon"));
23
+ const affiliate_code_redemption_1 = __importDefault(require("./models/affiliate-code-redemption"));
24
+ const affiliate_distribution_settings_1 = __importDefault(require("./models/affiliate-distribution-settings"));
25
+ const affiliate_program_settings_1 = __importDefault(require("./models/affiliate-program-settings"));
26
+ const affiliate_application_1 = __importDefault(require("./models/affiliate-application"));
27
+ const affiliate_cart_referral_1 = __importDefault(require("./models/affiliate-cart-referral"));
28
+ const affiliate_order_attribution_1 = __importDefault(require("./models/affiliate-order-attribution"));
29
+ const affiliate_referral_session_1 = __importDefault(require("./models/affiliate-referral-session"));
30
+ const affiliate_slug_1 = __importDefault(require("./models/affiliate-slug"));
31
+ const commission_entry_1 = __importDefault(require("./models/commission-entry"));
32
+ const consignment_report_1 = __importDefault(require("./models/consignment-report"));
33
+ const consignment_report_line_1 = __importDefault(require("./models/consignment-report-line"));
34
+ const consignment_transfer_1 = __importDefault(require("./models/consignment-transfer"));
35
+ const consignment_transfer_line_1 = __importDefault(require("./models/consignment-transfer-line"));
36
+ const customer_affiliate_assignment_1 = __importDefault(require("./models/customer-affiliate-assignment"));
37
+ const affiliate_application_manager_1 = require("./services/affiliate-application-manager");
38
+ const affiliate_discount_service_1 = require("./services/affiliate-discount.service");
39
+ const affiliate_report_service_1 = require("./services/affiliate-report.service");
40
+ const affiliate_partner_portal_service_1 = require("./services/affiliate-partner-portal.service");
41
+ const affiliate_slug_manager_1 = require("./services/affiliate-slug-manager");
42
+ const affiliate_manager_1 = require("./services/affiliate-manager");
43
+ const affiliate_coupon_manager_1 = require("./services/affiliate-coupon-manager");
44
+ const commission_ledger_service_1 = require("./services/commission-ledger.service");
45
+ const customer_affiliate_assignment_manager_1 = require("./services/customer-affiliate-assignment-manager");
46
+ const referral_lifecycle_manager_1 = require("./services/referral-lifecycle-manager");
47
+ const order_attribution_manager_1 = require("./services/order-attribution-manager");
48
+ const email_normalization_1 = require("./domain/email-normalization");
49
+ const consignment_reminder_rules_1 = require("./domain/consignment-reminder-rules");
50
+ const plugin_options_1 = require("./domain/plugin-options");
51
+ let consignmentWorkflowContainer;
52
+ class AffiliateModuleService extends (0, utils_1.MedusaService)({
53
+ Affiliate: affiliate_1.default,
54
+ AffiliateCoupon: affiliate_coupon_1.default,
55
+ AffiliateApplication: affiliate_application_1.default,
56
+ AffiliateSlug: affiliate_slug_1.default,
57
+ CustomerAffiliateAssignment: customer_affiliate_assignment_1.default,
58
+ CommissionEntry: commission_entry_1.default,
59
+ AffiliateProgramSettings: affiliate_program_settings_1.default,
60
+ AffiliateCodeRedemption: affiliate_code_redemption_1.default,
61
+ AffiliateReferralSession: affiliate_referral_session_1.default,
62
+ AffiliateCartReferral: affiliate_cart_referral_1.default,
63
+ AffiliateOrderAttribution: affiliate_order_attribution_1.default,
64
+ AffiliateDistributionSettings: affiliate_distribution_settings_1.default,
65
+ ConsignmentTransfer: consignment_transfer_1.default,
66
+ ConsignmentTransferLine: consignment_transfer_line_1.default,
67
+ ConsignmentReport: consignment_report_1.default,
68
+ ConsignmentReportLine: consignment_report_line_1.default,
69
+ }) {
70
+ constructor(container, options) {
71
+ super(container);
72
+ this.approvalSnapshotRuns = new Map();
73
+ this.correctionSnapshotRuns = new Map();
74
+ this.pluginOptions_ = (0, plugin_options_1.resolveAffiliatePluginOptions)(options);
75
+ this.persistence = this;
76
+ this.slugManager = new affiliate_slug_manager_1.AffiliateSlugManager(this.persistence);
77
+ this.couponManager = new affiliate_coupon_manager_1.AffiliateCouponManager(this.persistence);
78
+ this.affiliateManager = new affiliate_manager_1.AffiliateManager(this.persistence, this.slugManager);
79
+ this.applicationManager = new affiliate_application_manager_1.AffiliateApplicationManager(this.persistence, this.affiliateManager, this.slugManager);
80
+ this.assignmentManager = new customer_affiliate_assignment_manager_1.CustomerAffiliateAssignmentManager(this.persistence, this.affiliateManager, this.slugManager);
81
+ this.referralLifecycleManager = new referral_lifecycle_manager_1.ReferralLifecycleManager(this.persistence, null, this.slugManager, this.assignmentManager);
82
+ this.orderAttributionManager = new order_attribution_manager_1.OrderAttributionManager(this.persistence, this.assignmentManager);
83
+ this.ledgerService = new commission_ledger_service_1.CommissionLedgerService(this.persistence);
84
+ this.reportService = new affiliate_report_service_1.AffiliateReportService(this.persistence);
85
+ this.discountService = new affiliate_discount_service_1.AffiliateDiscountService(this.persistence);
86
+ this.partnerPortalService = new affiliate_partner_portal_service_1.AffiliatePartnerPortalService(this.persistence, this.affiliateManager, this.slugManager, this.reportService);
87
+ }
88
+ async getPluginOptions() {
89
+ return this.pluginOptions_;
90
+ }
91
+ /**
92
+ * Flushes the active transaction's pending writes so a following read in the
93
+ * same transaction sees them (see AffiliatePersistence.flush). Outside a
94
+ * transaction there is no transaction manager, so this is a no-op.
95
+ */
96
+ async flush(context) {
97
+ const manager = context?.transactionManager;
98
+ if (manager?.flush) {
99
+ await manager.flush();
100
+ }
101
+ }
102
+ async retrieveProgramSettings(sharedContext = {}) {
103
+ const settings = await this.persistence.listAffiliateProgramSettings({ scope: "global" }, { take: 1 }, sharedContext);
104
+ const current = settings[0];
105
+ if (current) {
106
+ return current;
107
+ }
108
+ const manager = sharedContext.transactionManager;
109
+ if (!manager) {
110
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die Initialisierung der Affiliate-Programmeinstellungen fehlt die Transaktion.");
111
+ }
112
+ // The migration seeds this singleton, but module-test cleanup, an
113
+ // interrupted seed or an accidental soft-delete can remove it. The
114
+ // partial unique scope index remains authoritative: concurrent creators
115
+ // race on the INSERT, one wins and every loser re-reads the committed row.
116
+ await manager.execute(`insert into "affiliate_program_settings"
117
+ ("id", "scope", "commission_base", "referrer_base",
118
+ "promotion_stacking", "default_customer_discount_rate",
119
+ "referral_overwrite_policy", "referral_window_days",
120
+ "policy_version", "created_at", "updated_at")
121
+ values (
122
+ 'affprog_' || substr(md5(random()::text || clock_timestamp()::text), 1, 26),
123
+ 'global', 'after_discounts', 'order_base', 'allow_stacking',
124
+ 5, 'first_touch', 30, 1, now(), now()
125
+ )
126
+ on conflict do nothing`, [], "run");
127
+ const restored = await this.persistence.listAffiliateProgramSettings({ scope: "global" }, { take: 1 }, sharedContext);
128
+ if (!restored[0]) {
129
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Die globalen Affiliate-Programmeinstellungen konnten nicht initialisiert werden.");
130
+ }
131
+ return restored[0];
132
+ }
133
+ async updateProgramSettings(input, sharedContext = {}) {
134
+ this.validateProgramSettingsInput(input);
135
+ const manager = sharedContext.transactionManager;
136
+ if (!manager) {
137
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die Aktualisierung der Affiliate-Programmeinstellungen fehlt die Transaktion.");
138
+ }
139
+ const rows = await manager.execute(`update "affiliate_program_settings"
140
+ set "commission_base" = ?,
141
+ "referrer_base" = ?,
142
+ "promotion_stacking" = ?,
143
+ "default_customer_discount_rate" = ?,
144
+ "referral_overwrite_policy" = ?,
145
+ "referral_window_days" = ?,
146
+ "policy_version" = ?,
147
+ "updated_at" = now()
148
+ where "scope" = 'global'
149
+ and "policy_version" = ?
150
+ and "deleted_at" is null
151
+ returning "id", "default_customer_discount_rate",
152
+ "referral_overwrite_policy", "referral_window_days",
153
+ "policy_version", "created_at", "updated_at"`, [
154
+ input.commission_base,
155
+ input.referrer_base,
156
+ input.promotion_stacking,
157
+ input.default_customer_discount_rate,
158
+ input.referral_overwrite_policy,
159
+ input.referral_window_days,
160
+ input.expected_version + 1,
161
+ input.expected_version,
162
+ ], "all");
163
+ const updated = rows[0];
164
+ if (!updated) {
165
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Die Affiliate-Programmeinstellungen wurden zwischenzeitlich geändert.");
166
+ }
167
+ return {
168
+ id: updated.id,
169
+ scope: "global",
170
+ commission_base: input.commission_base,
171
+ referrer_base: input.referrer_base,
172
+ promotion_stacking: input.promotion_stacking,
173
+ default_customer_discount_rate: Number(updated.default_customer_discount_rate),
174
+ referral_overwrite_policy: updated.referral_overwrite_policy,
175
+ referral_window_days: Number(updated.referral_window_days),
176
+ policy_version: Number(updated.policy_version),
177
+ created_at: updated.created_at,
178
+ updated_at: updated.updated_at,
179
+ };
180
+ }
181
+ async submitAffiliateApplication(input) {
182
+ return await this.applicationManager.submitApplication(input);
183
+ }
184
+ async listAffiliateApplicationsWithCount(input) {
185
+ return await this.applicationManager.listApplications(input);
186
+ }
187
+ async approveAffiliateApplication(input, sharedContext = {}) {
188
+ const application = await this.persistence.retrieveAffiliateApplication(input.application_id, sharedContext);
189
+ const identity = await this.lockAffiliateRegistrationBoundary(application.customer_id ? [application.customer_id] : [], [], sharedContext);
190
+ const result = await this.applicationManager.approveApplication(input, sharedContext);
191
+ await this.releaseAffiliateCustomerAssignment(result.affiliate, identity.get(result.affiliate.customer_id ?? "") ?? null, sharedContext);
192
+ return result;
193
+ }
194
+ async rejectAffiliateApplication(input) {
195
+ return await this.applicationManager.rejectApplication(input);
196
+ }
197
+ async createAffiliateRecord(input, sharedContext = {}) {
198
+ const identity = await this.lockAffiliateRegistrationBoundary(input.customer_id ? [input.customer_id] : [], [], sharedContext);
199
+ const affiliate = await this.affiliateManager.createAffiliate(input, sharedContext);
200
+ await this.releaseAffiliateCustomerAssignment(affiliate, identity.get(affiliate.customer_id ?? "") ?? null, sharedContext);
201
+ return affiliate;
202
+ }
203
+ async updateAffiliateRecord(input, sharedContext = {}) {
204
+ const current = await this.affiliateManager.retrieveAffiliateWithSlugs(input.id, sharedContext);
205
+ const targetCustomerId = input.customer_id === undefined
206
+ ? (current.customer_id ?? null)
207
+ : input.customer_id;
208
+ const identity = await this.lockAffiliateRegistrationBoundary([current.customer_id, targetCustomerId].filter((id) => Boolean(id)), [input.id], sharedContext);
209
+ const updated = await this.affiliateManager.updateAffiliate(input, sharedContext);
210
+ if (updated.status === "inactive") {
211
+ await this.invalidateOpenAttributionStateForAffiliate({ affiliate_id: updated.id }, sharedContext);
212
+ }
213
+ await this.releaseAffiliateCustomerAssignment(updated, identity.get(updated.customer_id ?? "") ?? null, sharedContext);
214
+ return await this.affiliateManager.retrieveAffiliateWithSlugs(updated.id, sharedContext);
215
+ }
216
+ async setAffiliateInactive(affiliateId, sharedContext = {}) {
217
+ const current = await this.affiliateManager.retrieveAffiliateWithSlugs(affiliateId, sharedContext);
218
+ const identity = await this.lockAffiliateRegistrationBoundary(current.customer_id ? [current.customer_id] : [], [affiliateId], sharedContext);
219
+ const affiliate = await this.affiliateManager.setInactive(affiliateId, sharedContext);
220
+ await this.invalidateOpenAttributionStateForAffiliate({ affiliate_id: affiliate.id }, sharedContext);
221
+ await this.releaseAffiliateCustomerAssignment(affiliate, identity.get(affiliate.customer_id ?? "") ?? null, sharedContext);
222
+ return await this.affiliateManager.retrieveAffiliateWithSlugs(affiliate.id, sharedContext);
223
+ }
224
+ async invalidateOpenAttributionStateForAffiliate(input, sharedContext = {}) {
225
+ await this.lockAffiliateState(input.affiliate_id, sharedContext);
226
+ const now = input.now ?? new Date();
227
+ await this.assignmentManager.removeAssignmentsForAffiliate(input.affiliate_id, "affiliate_inactive", sharedContext, now);
228
+ const openCartReferrals = await this.referralLifecycleManager.invalidateOpenStateForAffiliate(input.affiliate_id, now, sharedContext);
229
+ return {
230
+ open_cart_ids: [
231
+ ...new Set(openCartReferrals.map(({ cart_id }) => cart_id)),
232
+ ].sort(),
233
+ open_cart_referrals: openCartReferrals,
234
+ };
235
+ }
236
+ async deactivateAffiliateState(input, sharedContext = {}) {
237
+ const current = await this.affiliateManager.retrieveAffiliateWithSlugs(input.affiliate_id, sharedContext);
238
+ const targetCustomerId = input.update?.customer_id === undefined
239
+ ? (current.customer_id ?? null)
240
+ : input.update.customer_id;
241
+ const identity = await this.lockAffiliateRegistrationBoundary([current.customer_id, targetCustomerId].filter((id) => Boolean(id)), [input.affiliate_id], sharedContext);
242
+ const affiliate = await this.affiliateManager.updateAffiliate({ id: input.affiliate_id, ...input.update, status: "inactive" }, sharedContext);
243
+ await this.flush(sharedContext);
244
+ await this.releaseAffiliateCustomerAssignment(affiliate, identity.get(affiliate.customer_id ?? "") ?? null, sharedContext);
245
+ const invalidated = await this.invalidateOpenAttributionStateForAffiliate(input, sharedContext);
246
+ return {
247
+ affiliate,
248
+ open_cart_ids: invalidated.open_cart_ids,
249
+ open_cart_referrals: invalidated.open_cart_referrals,
250
+ };
251
+ }
252
+ async listAffiliateRecords(input) {
253
+ return await this.affiliateManager.listAffiliates(input);
254
+ }
255
+ async retrieveAffiliateRecord(id) {
256
+ return await this.affiliateManager.retrieveAffiliateWithSlugs(id);
257
+ }
258
+ async findEnabledAffiliateCouponByCode(code) {
259
+ const coupon = await this.couponManager.findEnabledCouponByCode(code);
260
+ if (!coupon) {
261
+ return null;
262
+ }
263
+ return {
264
+ coupon,
265
+ affiliate: await this.persistence.retrieveAffiliate(coupon.affiliate_id),
266
+ };
267
+ }
268
+ async findAffiliateCouponByCode(code) {
269
+ return await this.couponManager.findCouponByCode(code);
270
+ }
271
+ async retrieveAffiliateCouponRecord(couponId, affiliateId) {
272
+ return await this.couponManager.retrieveCoupon(couponId, affiliateId);
273
+ }
274
+ async findAffiliateCouponByPromotionId(promotionId) {
275
+ return await this.couponManager.findCouponByPromotionId(promotionId);
276
+ }
277
+ async findAffiliateCouponByCreationIdempotencyKey(idempotencyKey, affiliateId) {
278
+ return await this.couponManager.findCouponByCreationIdempotencyKey(idempotencyKey, affiliateId);
279
+ }
280
+ async listAffiliateCouponBindingsByPromotionIds(promotionIds) {
281
+ return await this.couponManager.listCouponBindingsByPromotionIds(promotionIds);
282
+ }
283
+ async listAffiliateCouponRecordsWithCount(input) {
284
+ return await this.couponManager.listCoupons(input);
285
+ }
286
+ async ensureDefaultAffiliateCoupon(input, sharedContext = {}) {
287
+ return await this.couponManager.ensureDefaultCoupon(input, sharedContext);
288
+ }
289
+ async createAffiliateCouponRecord(input, sharedContext = {}) {
290
+ return await this.couponManager.createCoupon(input, sharedContext);
291
+ }
292
+ async createAffiliateCouponRotation(input, sharedContext = {}) {
293
+ return await this.couponManager.createRotation(input, sharedContext);
294
+ }
295
+ async revokeAffiliateCouponRecord(input, sharedContext = {}) {
296
+ return await this.couponManager.revokeCoupon(input, sharedContext);
297
+ }
298
+ async setAffiliateCouponProvisioningState(input, sharedContext = {}) {
299
+ return await this.couponManager.setProvisioningState(input, sharedContext);
300
+ }
301
+ async finalizeAffiliateCouponRotation(input, sharedContext = {}) {
302
+ return await this.couponManager.finalizeRotation(input, sharedContext);
303
+ }
304
+ async findActiveAffiliateByCustomerId(customerId) {
305
+ const affiliates = await this.persistence.listAffiliates({ customer_id: customerId, status: "active" }, { take: 1 });
306
+ return affiliates[0] ?? null;
307
+ }
308
+ async listAffiliatesByPromotionIds(promotionIds) {
309
+ if (!promotionIds.length) {
310
+ return [];
311
+ }
312
+ const [publicPromotionAffiliates, ownPromotionAffiliates] = await Promise.all([
313
+ this.couponManager
314
+ .listCouponBindingsByPromotionIds(promotionIds)
315
+ .then((coupons) => coupons.length
316
+ ? this.persistence.listAffiliates({
317
+ id: [
318
+ ...new Set(coupons.map(({ affiliate_id }) => affiliate_id)),
319
+ ],
320
+ })
321
+ : []),
322
+ this.persistence.listAffiliates({
323
+ own_order_promotion_id: promotionIds,
324
+ }),
325
+ ]);
326
+ const byId = new Map([...publicPromotionAffiliates, ...ownPromotionAffiliates].map((affiliate) => [affiliate.id, affiliate]));
327
+ return [...byId.values()];
328
+ }
329
+ async setAffiliatePromotionState(input) {
330
+ await this.persistence.updateAffiliates({
331
+ id: input.affiliate_id,
332
+ ...(input.own_order_promotion_id !== undefined
333
+ ? { own_order_promotion_id: input.own_order_promotion_id }
334
+ : {}),
335
+ });
336
+ return await this.retrieveAffiliateRecord(input.affiliate_id);
337
+ }
338
+ async createAffiliateSlugRecord(input, sharedContext = {}) {
339
+ return await this.slugManager.createSlug(input, sharedContext);
340
+ }
341
+ async updateAffiliateSlugRecord(input, sharedContext = {}) {
342
+ return await this.slugManager.updateSlug(input, sharedContext);
343
+ }
344
+ async listAffiliateSlugRecords(affiliateId) {
345
+ return await this.slugManager.listSlugs(affiliateId);
346
+ }
347
+ async resolveReferralSlug(slugValue) {
348
+ const slug = await this.slugManager.resolveActiveSlug(slugValue);
349
+ if (!slug) {
350
+ return {
351
+ valid: false,
352
+ affiliate: null,
353
+ slug: null,
354
+ };
355
+ }
356
+ const affiliate = await this.persistence.retrieveAffiliate(slug.affiliate_id);
357
+ if (affiliate.status !== "active") {
358
+ return {
359
+ valid: false,
360
+ affiliate: null,
361
+ slug: null,
362
+ };
363
+ }
364
+ return {
365
+ valid: true,
366
+ affiliate,
367
+ slug,
368
+ };
369
+ }
370
+ async captureReferralLink(input, query, sharedContext = {}) {
371
+ return await this.createReferralLifecycleManager(query).captureReferralLink(input, sharedContext);
372
+ }
373
+ async bindReferralSessionToCart(input, query, sharedContext = {}) {
374
+ return await this.createReferralLifecycleManager(query).bindReferralSessionToCart(input, sharedContext);
375
+ }
376
+ async getActiveCartReferral(cartId, query, sharedContext = {}) {
377
+ return await this.createReferralLifecycleManager(query).getActiveCartReferral(cartId, new Date(), sharedContext);
378
+ }
379
+ async getCartReferralStatus(cartId, query, sharedContext = {}) {
380
+ return await this.createReferralLifecycleManager(query).getCartReferralStatus(cartId, sharedContext);
381
+ }
382
+ async inspectAffiliateCartReferralForCheckout(input, query) {
383
+ return await this.createReferralLifecycleManager(query).inspectCartReferralForCheckout(input);
384
+ }
385
+ async hasAffiliateCouponRedemption(input) {
386
+ return await this.referralLifecycleManager.hasCodeRedemptionByIdentity(input);
387
+ }
388
+ async applyAffiliateCouponReferral(input, query, sharedContext = {}) {
389
+ return await this.createReferralLifecycleManager(query).applyAffiliateCouponReferral(input, sharedContext);
390
+ }
391
+ async invalidateAffiliateCouponReferrals(input, query, sharedContext = {}) {
392
+ return await this.createReferralLifecycleManager(query).invalidateCouponReferrals(input.cart_id, input.reason, sharedContext);
393
+ }
394
+ async removeAffiliateCouponFromCartReferrals(input, sharedContext = {}) {
395
+ return await this.referralLifecycleManager.removeCouponFromCartReferrals(input.cart_id, input.affiliate_coupon_id, input.reason, sharedContext);
396
+ }
397
+ async listOpenCartIdsForAffiliateCoupon(affiliateCouponId) {
398
+ return await this.referralLifecycleManager.listOpenCartIdsForCoupon(affiliateCouponId);
399
+ }
400
+ async invalidateOpenAttributionStateForCoupon(input, sharedContext = {}) {
401
+ return await this.referralLifecycleManager.invalidateOpenStateForCoupon(input.affiliate_coupon_id, input.reason, sharedContext);
402
+ }
403
+ async invalidateAffiliateCartReferrals(input, query, sharedContext = {}) {
404
+ return await this.createReferralLifecycleManager(query).invalidateOpenCartReferrals(input.cart_id, input.reason, sharedContext);
405
+ }
406
+ async compensateAffiliateCouponReferralMutation(compensation, query, sharedContext = {}) {
407
+ return await this.createReferralLifecycleManager(query).compensateCouponReferralMutation(compensation, sharedContext);
408
+ }
409
+ createReferralLifecycleManager(query) {
410
+ return new referral_lifecycle_manager_1.ReferralLifecycleManager(this.persistence, query, this.slugManager, this.assignmentManager);
411
+ }
412
+ async assignCustomerAffiliate(input, sharedContext = {}) {
413
+ await this.lockAffiliateIdentity(input, sharedContext);
414
+ await this.lockAffiliateState(input.affiliate_id, sharedContext);
415
+ return await this.assignmentManager.assignCustomer(input, sharedContext);
416
+ }
417
+ async getCustomerAffiliateAssignment(customerId) {
418
+ return await this.assignmentManager.getActiveAssignment(customerId);
419
+ }
420
+ async getActiveAssignmentByIdentity(input) {
421
+ return await this.assignmentManager.getActiveAssignmentByIdentity(input);
422
+ }
423
+ async listCustomerAffiliateAssignmentHistory(customerId) {
424
+ return await this.assignmentManager.listAssignmentHistory(customerId);
425
+ }
426
+ async getOrderAttribution(orderId) {
427
+ const [attribution] = await this.persistence.listAffiliateOrderAttributions({ order_id: orderId }, { take: 1 });
428
+ if (!attribution) {
429
+ return null;
430
+ }
431
+ return {
432
+ ...attribution,
433
+ affiliate: await this.persistence.retrieveAffiliate(attribution.affiliate_id),
434
+ };
435
+ }
436
+ async expireCustomerAffiliateAssignments(input = {}) {
437
+ return await this.assignmentManager.expireAssignmentsBatch(input);
438
+ }
439
+ async expireAffiliateAttributionState(input = {}, sharedContext = {}) {
440
+ const now = input.now ?? new Date();
441
+ const limit = Math.min(Math.max(input.limit ?? 500, 1), 500);
442
+ const assignments = await this.assignmentManager.expireOpenAssignmentsBatch(now, limit, sharedContext);
443
+ const referrals = await this.referralLifecycleManager.expireOpenStateBatch(now, limit, sharedContext);
444
+ return {
445
+ processed: assignments.processed + referrals.processed,
446
+ has_more: assignments.has_more || referrals.has_more,
447
+ expired_cart_referrals: referrals.expired_cart_referrals,
448
+ };
449
+ }
450
+ async completeExpiredCartReferralPromotionCleanup(input, sharedContext = {}) {
451
+ await this.referralLifecycleManager.completeExpiredCartReferralPromotionCleanup(input.referrals, sharedContext);
452
+ }
453
+ async finalizeOrderAttribution(input, sharedContext = {}) {
454
+ const result = await this.orderAttributionManager.finalizeOrderAttribution(input, sharedContext);
455
+ if (!input.commission_order) {
456
+ return result;
457
+ }
458
+ await this.lockCommissionOrder(input.order_id, sharedContext);
459
+ const baseTypes = [
460
+ "order_commission",
461
+ "affiliate_referral_bonus",
462
+ "affiliate_own_order_referrer_bonus",
463
+ ];
464
+ const before = await this.persistence.listCommissionEntries({ order_id: input.order_id, type: [...baseTypes] }, { order: { id: "ASC" } }, sharedContext);
465
+ await this.ledgerService.createOrderCommission({ order: input.commission_order }, sharedContext, result.attribution ?? undefined);
466
+ await this.flush(sharedContext);
467
+ const after = await this.persistence.listCommissionEntries({ order_id: input.order_id, type: [...baseTypes] }, { order: { id: "ASC" } }, sharedContext);
468
+ const previousIds = new Set(before.map(({ id }) => id));
469
+ const createdIds = after
470
+ .map(({ id }) => id)
471
+ .filter((id) => !previousIds.has(id));
472
+ if (!createdIds.length) {
473
+ return result;
474
+ }
475
+ const compensation = result.compensation ?? {
476
+ order_id: input.order_id,
477
+ cart_id: input.cart_id,
478
+ attributed_at: input.attributed_at,
479
+ customer_id: input.customer_id,
480
+ normalized_email: input.normalized_email,
481
+ attribution_id: null,
482
+ redemption_id: null,
483
+ created_assignment_id: null,
484
+ previous_assignment: null,
485
+ assignment_mutations: [],
486
+ expired_assignment: null,
487
+ expired_assignments: [],
488
+ expired_referral: null,
489
+ previous_referrals: [],
490
+ previous_sessions: [],
491
+ coupon_states: [],
492
+ };
493
+ compensation.created_commission_entry_ids = createdIds;
494
+ return { ...result, compensation };
495
+ }
496
+ async compensateOrderAttribution(compensation, sharedContext = {}) {
497
+ await this.orderAttributionManager.compensateOrderAttribution(compensation, sharedContext);
498
+ const createdIds = compensation.created_commission_entry_ids ?? [];
499
+ if (!createdIds.length)
500
+ return;
501
+ const manager = await this.lockCommissionOrder(compensation.order_id, sharedContext);
502
+ // Delete children first, then bases only while they are still unreferenced.
503
+ // Permanent idempotency keys therefore remain intact for any entry that
504
+ // has escaped checkout ownership.
505
+ for (const id of createdIds) {
506
+ await manager.execute(`delete from "commission_entry"
507
+ where "id" = ? and "order_id" = ?
508
+ and "base_commission_entry_id" is not null
509
+ and not exists (
510
+ select 1 from "commission_entry" as child
511
+ where child."base_commission_entry_id" = "commission_entry"."id"
512
+ )`, [id, compensation.order_id], "run");
513
+ }
514
+ for (const id of createdIds) {
515
+ await manager.execute(`delete from "commission_entry" as owned
516
+ where owned."id" = ? and owned."order_id" = ?
517
+ and not exists (
518
+ select 1 from "commission_entry" as child
519
+ where child."base_commission_entry_id" = owned."id"
520
+ )`, [id, compensation.order_id], "run");
521
+ }
522
+ }
523
+ async isCustomerAffiliate(customerId) {
524
+ return await this.assignmentManager.isCustomerAffiliate(customerId);
525
+ }
526
+ async removeCustomerAffiliateAssignment(input, sharedContext = {}) {
527
+ const identity = typeof input === "string" ? { customer_id: input } : input;
528
+ await this.lockAffiliateIdentity(identity, sharedContext);
529
+ return await this.assignmentManager.removeActiveAssignment({
530
+ ...identity,
531
+ ended_reason: "admin_removed",
532
+ }, sharedContext);
533
+ }
534
+ async setCustomerAffiliateAssignment(input, sharedContext = {}) {
535
+ await this.lockAffiliateIdentity(input, sharedContext);
536
+ await this.lockAffiliateState(input.affiliate_id, sharedContext);
537
+ return await this.assignmentManager.assignCustomer({
538
+ customer_id: input.customer_id,
539
+ normalized_email: input.normalized_email,
540
+ affiliate_id: input.affiliate_id,
541
+ source: input.source ?? "admin",
542
+ }, sharedContext);
543
+ }
544
+ async lockAffiliateIdentity(identity, context) {
545
+ await this.lockAffiliateIdentities([identity], context);
546
+ }
547
+ async lockAffiliateIdentities(identities, context) {
548
+ const manager = context.transactionManager;
549
+ if (!manager) {
550
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die atomische Kundenzuordnung fehlt die Affiliate-Transaktion.");
551
+ }
552
+ const lockKeys = identities
553
+ .flatMap((identity) => [
554
+ identity.customer_id
555
+ ? `affiliate-customer:${identity.customer_id}`
556
+ : null,
557
+ identity.normalized_email
558
+ ? `affiliate-email:${identity.normalized_email}`
559
+ : null,
560
+ ])
561
+ .filter((key) => key !== null)
562
+ .filter((key, index, keys) => keys.indexOf(key) === index)
563
+ .sort();
564
+ for (const lockKey of lockKeys) {
565
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [lockKey], "all");
566
+ }
567
+ }
568
+ async lockAffiliateRegistrationBoundary(customerIds, affiliateIds, context) {
569
+ const manager = context.transactionManager;
570
+ if (!manager) {
571
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die atomische Affiliate-Registrierung fehlt die Transaktion.");
572
+ }
573
+ const identities = new Map();
574
+ for (const customerId of [...new Set(customerIds)].sort()) {
575
+ const rows = await manager.execute(`select "email" from "customer"
576
+ where "id" = ? and "deleted_at" is null limit 1`, [customerId], "all");
577
+ identities.set(customerId, {
578
+ customer_id: customerId,
579
+ normalized_email: rows[0]?.email
580
+ ? (0, email_normalization_1.normalizeAffiliateEmail)(rows[0].email)
581
+ : null,
582
+ });
583
+ }
584
+ await this.lockAffiliateIdentities([...identities.values()], context);
585
+ const affectedAffiliateIds = new Set(affiliateIds);
586
+ for (const identity of identities.values()) {
587
+ const assignments = await this.persistence.listCustomerAffiliateAssignments({
588
+ ...(identity.customer_id
589
+ ? { customer_id: identity.customer_id }
590
+ : {}),
591
+ active: true,
592
+ }, undefined, context);
593
+ const registered = identity.customer_id
594
+ ? await this.persistence.listAffiliates({ customer_id: identity.customer_id }, undefined, context)
595
+ : [];
596
+ for (const assignment of assignments) {
597
+ affectedAffiliateIds.add(assignment.affiliate_id);
598
+ }
599
+ for (const affiliate of registered) {
600
+ affectedAffiliateIds.add(affiliate.id);
601
+ }
602
+ }
603
+ const predicates = [];
604
+ const params = [];
605
+ for (const identity of identities.values()) {
606
+ if (identity.customer_id) {
607
+ predicates.push('cart."customer_id" = ?');
608
+ params.push(identity.customer_id);
609
+ }
610
+ if (identity.normalized_email) {
611
+ predicates.push('lower(trim(cart."email")) = ?');
612
+ params.push(identity.normalized_email);
613
+ }
614
+ }
615
+ if (predicates.length) {
616
+ const referrals = await manager.execute(`select distinct referral."affiliate_id"
617
+ from "affiliate_cart_referral" as referral
618
+ join "cart" as cart on cart."id" = referral."cart_id"
619
+ where referral."deleted_at" is null
620
+ and referral."status" in ('active', 'pending_email_validation')
621
+ and (${predicates.join(" or ")})`, params, "all");
622
+ for (const referral of referrals) {
623
+ affectedAffiliateIds.add(referral.affiliate_id);
624
+ }
625
+ }
626
+ for (const affiliateId of [...affectedAffiliateIds].sort()) {
627
+ await this.lockAffiliateState(affiliateId, context);
628
+ }
629
+ return identities;
630
+ }
631
+ async lockAffiliateState(affiliateId, context) {
632
+ const manager = context.transactionManager;
633
+ if (!manager) {
634
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Affiliate state changes require an Affiliate transaction.");
635
+ }
636
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-state:${affiliateId}`], "all");
637
+ }
638
+ async getOwnOrderDiscountForCustomer(customerId) {
639
+ return await this.discountService.getOwnOrderDiscount({
640
+ customer_id: customerId,
641
+ });
642
+ }
643
+ async getAffiliateDistributionSettings(affiliateId) {
644
+ const settings = await this.listAffiliateDistributionSettings({ affiliate_id: affiliateId }, { take: 1 });
645
+ return settings[0] ?? null;
646
+ }
647
+ async setAffiliateDistributionEnabled(affiliateId, enabled) {
648
+ const settings = await this.getAffiliateDistributionSettings(affiliateId);
649
+ if (!settings) {
650
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Für diesen Affiliate ist noch kein Kommissionsvertrieb eingerichtet.");
651
+ }
652
+ const updated = await this.updateAffiliateDistributionSettings({
653
+ id: settings.id,
654
+ enabled,
655
+ });
656
+ return updated;
657
+ }
658
+ async saveAffiliateDistributionSettings(input, sharedContext = {}) {
659
+ const existingRows = await this.listAffiliateDistributionSettings({ affiliate_id: input.affiliate_id }, { take: 1 }, sharedContext);
660
+ const existing = existingRows[0] ?? null;
661
+ if (existing) {
662
+ const updated = await this.updateAffiliateDistributionSettings({
663
+ id: existing.id,
664
+ enabled: true,
665
+ region_id: input.region_id,
666
+ shipping_option_id: input.shipping_option_id,
667
+ own_order_promotion_id: input.own_order_promotion_id,
668
+ }, sharedContext);
669
+ return {
670
+ settings: updated,
671
+ created: false,
672
+ previous: existing,
673
+ };
674
+ }
675
+ const created = await this.createAffiliateDistributionSettings({
676
+ affiliate_id: input.affiliate_id,
677
+ stock_location_id: input.stock_location_id,
678
+ internal_sales_channel_id: input.internal_sales_channel_id,
679
+ region_id: input.region_id,
680
+ shipping_option_id: input.shipping_option_id,
681
+ enabled: true,
682
+ own_order_promotion_id: input.own_order_promotion_id,
683
+ }, sharedContext);
684
+ return {
685
+ settings: created,
686
+ created: true,
687
+ previous: null,
688
+ };
689
+ }
690
+ async compensateAffiliateDistributionSettings(input, sharedContext = {}) {
691
+ if (input.created) {
692
+ await this.deleteAffiliateDistributionSettings(input.id, sharedContext);
693
+ return;
694
+ }
695
+ if (input.previous) {
696
+ await this.updateAffiliateDistributionSettings({
697
+ id: input.id,
698
+ enabled: input.previous.enabled,
699
+ region_id: input.previous.region_id,
700
+ shipping_option_id: input.previous.shipping_option_id,
701
+ own_order_promotion_id: input.previous.own_order_promotion_id ?? null,
702
+ metadata: input.previous.metadata ?? null,
703
+ }, sharedContext);
704
+ }
705
+ }
706
+ async prepareConsignmentTransfer(input, sharedContext = {}) {
707
+ this.validateConsignmentTransferInput(input);
708
+ const affiliate = await this.persistence.retrieveAffiliate(input.affiliate_id, sharedContext);
709
+ this.affiliateManager.assertAffiliateIsActive(affiliate);
710
+ const settingsRows = await this.listAffiliateDistributionSettings({ affiliate_id: input.affiliate_id }, { take: 1 }, sharedContext);
711
+ const settings = settingsRows[0];
712
+ if (!settings || !settings.enabled) {
713
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Der Kommissionsvertrieb ist für diesen Affiliate nicht aktiviert.");
714
+ }
715
+ if (input.source_location_id === settings.stock_location_id) {
716
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Quell- und Ziellager einer Kommissionssendung müssen unterschiedlich sein.");
717
+ }
718
+ const existingRows = await this.listConsignmentTransfers({ idempotency_key: input.idempotency_key }, { take: 1 }, sharedContext);
719
+ const existing = existingRows[0];
720
+ if (existing) {
721
+ const existingLines = await this.listConsignmentTransferLines({ consignment_transfer_id: existing.id }, {}, sharedContext);
722
+ this.assertConsignmentTransferRetryMatches(input, existing, existingLines);
723
+ if (existing.status === "failed") {
724
+ await this.updateConsignmentTransfers({
725
+ id: existing.id,
726
+ status: "pending",
727
+ failure_reason: null,
728
+ completed_at: null,
729
+ }, sharedContext);
730
+ }
731
+ return {
732
+ transfer: {
733
+ ...existing,
734
+ ...(existing.status === "failed"
735
+ ? { status: "pending", failure_reason: null }
736
+ : {}),
737
+ },
738
+ lines: existingLines,
739
+ settings: settings,
740
+ already_completed: existing.status === "completed",
741
+ };
742
+ }
743
+ const transfer = await this.createConsignmentTransfers({
744
+ affiliate_id: input.affiliate_id,
745
+ source_location_id: input.source_location_id,
746
+ destination_location_id: settings.stock_location_id,
747
+ direction: "outbound",
748
+ status: "pending",
749
+ idempotency_key: input.idempotency_key,
750
+ admin_id: input.admin_id ?? null,
751
+ metadata: {
752
+ requested_line_count: input.lines.length,
753
+ },
754
+ }, sharedContext);
755
+ // The baseline enforces the transfer-line parent FK. Persist the generated
756
+ // transfer ID before the DAL inserts its child rows in the same transaction.
757
+ await this.flush(sharedContext);
758
+ const lines = await this.createConsignmentTransferLines(input.lines.map((line) => ({
759
+ consignment_transfer_id: transfer.id,
760
+ inventory_item_id: line.inventory_item_id,
761
+ source_batch_id: line.batch_id ?? null,
762
+ destination_batch_id: null,
763
+ quantity: line.quantity,
764
+ })), sharedContext);
765
+ return {
766
+ transfer: transfer,
767
+ lines: lines,
768
+ settings: settings,
769
+ already_completed: false,
770
+ };
771
+ }
772
+ async completeConsignmentTransfer(input, sharedContext = {}) {
773
+ const transfer = await this.retrieveConsignmentTransfer(input.transfer_id, {}, sharedContext);
774
+ if (transfer.status === "completed") {
775
+ const existingLines = await this.listConsignmentTransferLines({ consignment_transfer_id: transfer.id }, {}, sharedContext);
776
+ return {
777
+ ...transfer,
778
+ lines: existingLines,
779
+ };
780
+ }
781
+ const storedLines = await this.listConsignmentTransferLines({ consignment_transfer_id: transfer.id }, {}, sharedContext);
782
+ const unmatched = [...input.lines];
783
+ for (const stored of storedLines) {
784
+ const index = unmatched.findIndex((line) => line.inventory_item_id === stored.inventory_item_id &&
785
+ line.quantity === stored.quantity &&
786
+ (line.source_batch_id ?? null) === (stored.source_batch_id ?? null));
787
+ if (index === -1) {
788
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Das Ergebnis der Bestandsumbuchung passt nicht zu den gespeicherten Positionen.");
789
+ }
790
+ const [resultLine] = unmatched.splice(index, 1);
791
+ await this.updateConsignmentTransferLines({
792
+ id: stored.id,
793
+ destination_batch_id: resultLine.destination_batch_id ?? null,
794
+ batch_name_snapshot: resultLine.batch_name_snapshot ?? null,
795
+ batch_expiry_date_snapshot: typeof resultLine.batch_expiry_date_snapshot === "string"
796
+ ? new Date(resultLine.batch_expiry_date_snapshot)
797
+ : (resultLine.batch_expiry_date_snapshot ?? null),
798
+ metadata: { transfer_mode: input.mode },
799
+ }, sharedContext);
800
+ }
801
+ if (unmatched.length) {
802
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Die Bestandsumbuchung lieferte unerwartete zusätzliche Positionen.");
803
+ }
804
+ const completed = await this.updateConsignmentTransfers({
805
+ id: transfer.id,
806
+ status: "completed",
807
+ failure_reason: null,
808
+ completed_at: new Date(),
809
+ metadata: {
810
+ transfer_mode: input.mode,
811
+ result_line_count: input.lines.length,
812
+ },
813
+ }, sharedContext);
814
+ const completedLines = await this.listConsignmentTransferLines({ consignment_transfer_id: transfer.id }, {}, sharedContext);
815
+ return {
816
+ ...completed,
817
+ lines: completedLines,
818
+ };
819
+ }
820
+ async failConsignmentTransfer(input) {
821
+ const transfer = await this.retrieveConsignmentTransfer(input.transfer_id);
822
+ if (transfer.status === "completed") {
823
+ return;
824
+ }
825
+ await this.updateConsignmentTransfers({
826
+ id: transfer.id,
827
+ status: "failed",
828
+ failure_reason: input.failure_reason.slice(0, 2000),
829
+ completed_at: null,
830
+ });
831
+ }
832
+ /**
833
+ * Compatibility entry point for module consumers. Cross-module work remains
834
+ * owned by the workflow; the module only exposes the command so existing
835
+ * integrations do not have to know the workflow implementation.
836
+ */
837
+ async submitConsignmentReport(input) {
838
+ if (!consignmentWorkflowContainer) {
839
+ consignmentWorkflowContainer = framework_1.container;
840
+ }
841
+ const { submitConsignmentReportWorkflow } = await import("../../workflows/affiliate/submit-consignment-report.js");
842
+ const { result } = await submitConsignmentReportWorkflow(consignmentWorkflowContainer).run({ input });
843
+ return result;
844
+ }
845
+ async approveConsignmentReport(input) {
846
+ if (input.submitted_report_snapshot) {
847
+ return this.approveConsignmentReportSnapshot(input);
848
+ }
849
+ if (!consignmentWorkflowContainer) {
850
+ consignmentWorkflowContainer = framework_1.container;
851
+ }
852
+ const { approveConsignmentReportWorkflow } = await import("../../workflows/affiliate/approve-consignment-report.js");
853
+ const { result } = await approveConsignmentReportWorkflow(consignmentWorkflowContainer).run({ input });
854
+ return result;
855
+ }
856
+ async correctApprovedConsignmentReport(input) {
857
+ if (input.approved_report_snapshot) {
858
+ return this.correctConsignmentReportSnapshot(input);
859
+ }
860
+ if (!consignmentWorkflowContainer) {
861
+ consignmentWorkflowContainer = framework_1.container;
862
+ }
863
+ const { correctApprovedConsignmentReportWorkflow } = await import("../../workflows/affiliate/correct-approved-consignment-report.js");
864
+ const { result } = await correctApprovedConsignmentReportWorkflow(consignmentWorkflowContainer).run({ input });
865
+ return result;
866
+ }
867
+ /**
868
+ * Set once by the plugin loader with the application container. This keeps
869
+ * the compatibility command above a pure workflow delegate; the module
870
+ * never resolves or writes another module itself.
871
+ */
872
+ async setConsignmentWorkflowContainer(container) {
873
+ consignmentWorkflowContainer = container;
874
+ }
875
+ async getConsignmentReportReminderCandidate(input) {
876
+ (0, consignment_reminder_rules_1.assertConsignmentPeriod)(input.period_start);
877
+ const affiliate = (await this.listAffiliates({
878
+ id: input.affiliate_id,
879
+ status: "active",
880
+ }))[0];
881
+ if (!affiliate) {
882
+ return null;
883
+ }
884
+ const distribution = (await this.listAffiliateDistributionSettings({
885
+ affiliate_id: affiliate.id,
886
+ enabled: true,
887
+ }))[0];
888
+ if (!distribution) {
889
+ return null;
890
+ }
891
+ const reports = await this.listConsignmentReports({
892
+ affiliate_id: input.affiliate_id,
893
+ period_start: new Date(`${input.period_start}T00:00:00.000Z`),
894
+ status: ["submitted", "approved"],
895
+ });
896
+ if (reports.length) {
897
+ return null;
898
+ }
899
+ const metadata = affiliate.metadata;
900
+ const rawLocale = metadata?.locale;
901
+ const trimmedLocale = typeof rawLocale === "string" ? rawLocale.trim() : "";
902
+ const locale = trimmedLocale && trimmedLocale.length <= 35 ? trimmedLocale : null;
903
+ return email_events_1.AffiliateConsignmentReportReminderDueEventSchema.parse({
904
+ schema_version: 1,
905
+ reminder_key: (0, email_events_1.createAffiliateConsignmentReminderKey)(affiliate.id, input.period_start),
906
+ affiliate_id: affiliate.id,
907
+ customer_id: affiliate.customer_id ?? null,
908
+ affiliate_display_name: affiliate.display_name,
909
+ period_start: input.period_start,
910
+ due_date: (0, consignment_reminder_rules_1.getConsignmentReminderDueDate)({
911
+ period_start: input.period_start,
912
+ due_day: input.due_day,
913
+ }),
914
+ locale,
915
+ trigger: input.trigger,
916
+ });
917
+ }
918
+ async prepareConsignmentReport(input, sharedContext = {}) {
919
+ const manager = sharedContext.transactionManager;
920
+ if (!manager) {
921
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die Monatsmeldung fehlt die Affiliate-Transaktion.");
922
+ }
923
+ const key = input.submission_idempotency_key.trim();
924
+ if (!key) {
925
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Monatsmeldung benötigt einen Idempotenzschlüssel.");
926
+ }
927
+ await manager.execute(`select pg_advisory_xact_lock(hashtext(?))`, [`affiliate-consignment-report:${key}`], "all");
928
+ const existing = (await this.listConsignmentReports({ submission_idempotency_key: key }, { take: 1 }, sharedContext))[0];
929
+ if (existing) {
930
+ if (existing.affiliate_id !== input.affiliate_id ||
931
+ this.toPeriodKey(existing.period_start) !== input.period_start) {
932
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Der Idempotenzschlüssel wurde bereits für eine andere Monatsmeldung verwendet.");
933
+ }
934
+ return {
935
+ report: await this.toConsignmentReportDTO(existing, sharedContext),
936
+ created: false,
937
+ };
938
+ }
939
+ const { periodStart, periodEnd } = this.parseConsignmentPeriod(input.period_start);
940
+ const lines = this.buildConsignmentReportLines(input.expected_inventory_snapshot, input.counted_batches);
941
+ const active = (await this.listConsignmentReports({
942
+ affiliate_id: input.affiliate_id,
943
+ period_start: periodStart,
944
+ status: ["draft", "submitted", "approved"],
945
+ }, { take: 1 }, sharedContext))[0];
946
+ if (active) {
947
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Für diesen Affiliate und Monat existiert bereits eine aktive Meldung.");
948
+ }
949
+ const report = await this.createConsignmentReports({
950
+ affiliate_id: input.affiliate_id,
951
+ period_start: periodStart,
952
+ period_end: periodEnd,
953
+ status: "submitted",
954
+ version: 1,
955
+ submission_idempotency_key: key,
956
+ submitted_by_id: input.affiliate_id,
957
+ submitted_at: new Date(),
958
+ metadata: {
959
+ snapshot_version: 1,
960
+ expected_line_count: lines.length,
961
+ },
962
+ }, sharedContext);
963
+ // The baseline enforces the report-line parent FK. Persist the generated
964
+ // report ID before the DAL inserts its child rows in the same transaction.
965
+ await this.flush(sharedContext);
966
+ await this.createConsignmentReportLines(lines.map((line) => ({
967
+ consignment_report_id: report.id,
968
+ inventory_item_id: line.inventory_item_id,
969
+ batch_id: line.batch_id,
970
+ expected_quantity: line.expected_quantity,
971
+ counted_quantity: line.counted_quantity,
972
+ confirmed_sale_quantity: line.proposed_sale_quantity,
973
+ requires_admin_clarification: line.requires_admin_clarification,
974
+ non_sale_reason: line.non_sale_reason,
975
+ unit_price_snapshot: line.resolved_unit_price ?? null,
976
+ currency_code: line.currency_code ?? null,
977
+ metadata: {
978
+ proposed_sale_quantity: line.proposed_sale_quantity,
979
+ variant_id: line.variant_id ?? null,
980
+ title: line.title ?? null,
981
+ resolved_unit_price: line.resolved_unit_price ?? null,
982
+ discounted_line_total: null,
983
+ draft_order_id: null,
984
+ },
985
+ })), sharedContext);
986
+ await this.flush(sharedContext);
987
+ return {
988
+ report: await this.toConsignmentReportDTO(report, sharedContext),
989
+ created: true,
990
+ };
991
+ }
992
+ async attachConsignmentDraftOrder(input, sharedContext = {}) {
993
+ const report = await this.retrieveConsignmentReport(input.report_id, {}, sharedContext);
994
+ if (report.draft_order_id &&
995
+ report.draft_order_id !== input.draft_order_id) {
996
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Die Monatsmeldung ist bereits mit einer anderen Draft Order verknüpft.");
997
+ }
998
+ if (!report.draft_order_id) {
999
+ await this.updateConsignmentReports({ id: report.id, draft_order_id: input.draft_order_id }, sharedContext);
1000
+ }
1001
+ for (const line of input.lines) {
1002
+ const stored = await this.retrieveConsignmentReportLine(line.report_line_id, {}, sharedContext);
1003
+ const metadata = this.asJsonObject(stored.metadata);
1004
+ await this.updateConsignmentReportLines({
1005
+ id: stored.id,
1006
+ unit_price_snapshot: line.resolved_unit_price,
1007
+ order_line_item_id: line.order_line_item_id ?? null,
1008
+ metadata: {
1009
+ ...metadata,
1010
+ resolved_unit_price: line.resolved_unit_price,
1011
+ discounted_line_total: line.discounted_line_total,
1012
+ draft_order_id: input.draft_order_id,
1013
+ },
1014
+ }, sharedContext);
1015
+ }
1016
+ await this.flush(sharedContext);
1017
+ const updated = await this.retrieveConsignmentReport(report.id, {}, sharedContext);
1018
+ return await this.toConsignmentReportDTO(updated, sharedContext);
1019
+ }
1020
+ async retrieveConsignmentReportRecord(reportId) {
1021
+ const report = await this.retrieveConsignmentReport(reportId);
1022
+ return await this.toConsignmentReportDTO(report);
1023
+ }
1024
+ async prepareConsignmentApproval(input, sharedContext = {}) {
1025
+ const manager = sharedContext.transactionManager;
1026
+ if (!manager) {
1027
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die Freigabe fehlt die Affiliate-Transaktion.");
1028
+ }
1029
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-consignment-approval:${input.report_id}`], "all");
1030
+ const report = await this.retrieveConsignmentReport(input.report_id, {}, sharedContext);
1031
+ const settingsRows = await this.listAffiliateDistributionSettings({ affiliate_id: report.affiliate_id }, { take: 1 }, sharedContext);
1032
+ const settings = settingsRows[0];
1033
+ if (!settings?.enabled) {
1034
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Der Kommissionsvertrieb ist für diesen Affiliate nicht aktiviert.");
1035
+ }
1036
+ if (report.status === "approved") {
1037
+ const approvedReport = await this.toConsignmentReportDTO(report, sharedContext);
1038
+ if (!report.order_id || !report.fulfillment_id) {
1039
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Die freigegebene Monatsmeldung besitzt keine vollständigen Order-Referenzen.");
1040
+ }
1041
+ const metadata = this.asJsonObject(report.metadata);
1042
+ const reservations = this.parseReservationSnapshots(metadata.approval_reservations_snapshot);
1043
+ return {
1044
+ report: approvedReport,
1045
+ settings: settings,
1046
+ already_approved: true,
1047
+ existing_result: {
1048
+ report: approvedReport,
1049
+ order_id: report.order_id,
1050
+ fulfillment_id: report.fulfillment_id,
1051
+ order: {
1052
+ id: report.order_id,
1053
+ is_draft_order: false,
1054
+ metadata: {
1055
+ consignment: true,
1056
+ consignment_report_id: report.id,
1057
+ affiliate_id: report.affiliate_id,
1058
+ },
1059
+ },
1060
+ reservations,
1061
+ fulfillment: {
1062
+ id: report.fulfillment_id,
1063
+ location_id: settings.stock_location_id,
1064
+ items: approvedReport.lines
1065
+ .filter((line) => line.confirmed_sale_quantity > 0 && line.order_line_item_id)
1066
+ .map((line) => ({
1067
+ line_item_id: line.order_line_item_id,
1068
+ quantity: line.confirmed_sale_quantity,
1069
+ })),
1070
+ },
1071
+ },
1072
+ };
1073
+ }
1074
+ if (report.status !== "submitted") {
1075
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Nur eingereichte Monatsmeldungen können freigegeben werden.");
1076
+ }
1077
+ if (input.expected_version !== undefined &&
1078
+ Number(report.version) !== input.expected_version) {
1079
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Die Monatsmeldung wurde zwischenzeitlich geändert.");
1080
+ }
1081
+ const reportDto = await this.toConsignmentReportDTO(report, sharedContext);
1082
+ const currentById = new Map(reportDto.lines.map((line) => [line.id, line]));
1083
+ const seen = new Set();
1084
+ for (const review of input.confirmed_lines ?? []) {
1085
+ if (seen.has(review.report_line_id)) {
1086
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Eine Meldeposition darf pro Freigabe nur einmal vorkommen.");
1087
+ }
1088
+ seen.add(review.report_line_id);
1089
+ const line = currentById.get(review.report_line_id);
1090
+ if (!line) {
1091
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Freigabe enthält eine unbekannte Meldeposition.");
1092
+ }
1093
+ const originalShortage = Math.max(0, line.expected_quantity - line.counted_quantity);
1094
+ if (!Number.isSafeInteger(review.confirmed_sale_quantity) ||
1095
+ review.confirmed_sale_quantity < 0 ||
1096
+ review.confirmed_sale_quantity > originalShortage) {
1097
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Bestätigte Verkäufe dürfen die ursprüngliche positive Bestandsdifferenz nicht überschreiten.");
1098
+ }
1099
+ if (review.confirmed_sale_quantity < originalShortage &&
1100
+ !review.non_sale_reason) {
1101
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Für einen nicht als Verkauf bestätigten Abgang ist ein Abgangsgrund erforderlich.");
1102
+ }
1103
+ await this.updateConsignmentReportLines({
1104
+ id: line.id,
1105
+ confirmed_sale_quantity: review.confirmed_sale_quantity,
1106
+ non_sale_reason: review.confirmed_sale_quantity < originalShortage
1107
+ ? review.non_sale_reason
1108
+ : null,
1109
+ }, sharedContext);
1110
+ }
1111
+ const approvalKey = `consignment-approval:${report.id}`;
1112
+ if (report.approval_idempotency_key &&
1113
+ report.approval_idempotency_key !== approvalKey) {
1114
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Die Monatsmeldung besitzt bereits einen anderen Freigabeschlüssel.");
1115
+ }
1116
+ await this.updateConsignmentReports({
1117
+ id: report.id,
1118
+ approval_idempotency_key: approvalKey,
1119
+ version: Number(report.version) + 1,
1120
+ }, sharedContext);
1121
+ await this.flush(sharedContext);
1122
+ const prepared = await this.retrieveConsignmentReport(report.id, {}, sharedContext);
1123
+ return {
1124
+ report: await this.toConsignmentReportDTO(prepared, sharedContext),
1125
+ settings: settings,
1126
+ already_approved: false,
1127
+ existing_result: null,
1128
+ };
1129
+ }
1130
+ async completeConsignmentApproval(input, sharedContext = {}) {
1131
+ const manager = sharedContext.transactionManager;
1132
+ if (!manager) {
1133
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für den Freigabeabschluss fehlt die Affiliate-Transaktion.");
1134
+ }
1135
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-consignment-approval:${input.report_id}`], "all");
1136
+ const report = await this.retrieveConsignmentReport(input.report_id, {}, sharedContext);
1137
+ if (report.status === "approved") {
1138
+ if (report.order_id !== input.order_id ||
1139
+ report.fulfillment_id !== input.fulfillment_id) {
1140
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Die Monatsmeldung wurde bereits mit einer anderen Order freigegeben.");
1141
+ }
1142
+ return {
1143
+ report: await this.toConsignmentReportDTO(report, sharedContext),
1144
+ newly_approved: false,
1145
+ };
1146
+ }
1147
+ if (report.status !== "submitted") {
1148
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Nur eingereichte Monatsmeldungen können freigegeben werden.");
1149
+ }
1150
+ const metadata = this.asJsonObject(report.metadata);
1151
+ const approved = await this.updateConsignmentReports({
1152
+ id: report.id,
1153
+ status: "approved",
1154
+ version: Number(report.version) + 1,
1155
+ order_id: input.order_id,
1156
+ fulfillment_id: input.fulfillment_id,
1157
+ approved_by_id: input.admin_id,
1158
+ approved_at: new Date(),
1159
+ metadata: {
1160
+ ...metadata,
1161
+ approval_reservations_snapshot: input.reservations,
1162
+ },
1163
+ }, sharedContext);
1164
+ return {
1165
+ report: await this.toConsignmentReportDTO(approved, sharedContext),
1166
+ newly_approved: true,
1167
+ };
1168
+ }
1169
+ async prepareConsignmentCorrection(input, sharedContext = {}) {
1170
+ const manager = sharedContext.transactionManager;
1171
+ if (!manager) {
1172
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die Kommissionskorrektur fehlt die Affiliate-Transaktion.");
1173
+ }
1174
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-consignment-correction:${input.report_id}`], "all");
1175
+ const report = await this.retrieveConsignmentReport(input.report_id, {}, sharedContext);
1176
+ if (report.status !== "approved" || !report.order_id) {
1177
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Nur freigegebene Monatsmeldungen können korrigiert werden.");
1178
+ }
1179
+ const metadata = this.asJsonObject(report.metadata);
1180
+ const corrections = this.parseStoredConsignmentCorrections(metadata.corrections);
1181
+ const existing = corrections.find((correction) => correction.correction_id === input.correction_id);
1182
+ const reportDto = await this.toConsignmentReportDTO(report, sharedContext);
1183
+ const settingsRows = await this.listAffiliateDistributionSettings({ affiliate_id: report.affiliate_id }, { take: 1 }, sharedContext);
1184
+ const settings = settingsRows[0];
1185
+ if (!settings?.enabled) {
1186
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Der Kommissionsvertrieb ist für diesen Affiliate nicht aktiviert.");
1187
+ }
1188
+ if (existing) {
1189
+ const retryMatches = existing.reason === input.reason &&
1190
+ existing.admin_id === input.admin_id &&
1191
+ existing.lines.length === input.corrected_lines.length &&
1192
+ existing.lines.every((line) => input.corrected_lines.some((candidate) => candidate.report_line_id === line.report_line_id &&
1193
+ candidate.confirmed_sale_quantity ===
1194
+ line.corrected_confirmed_sale_quantity));
1195
+ if (!retryMatches) {
1196
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Die Korrektur-ID wurde bereits mit einem anderen Inhalt verwendet.");
1197
+ }
1198
+ return {
1199
+ report: reportDto,
1200
+ settings: settings,
1201
+ order_id: report.order_id,
1202
+ lines: existing.lines,
1203
+ progress: {
1204
+ order_edit_id: existing.order_edit_id,
1205
+ edit_updated: existing.edit_updated,
1206
+ edit_requested: existing.edit_requested,
1207
+ edit_confirmed: existing.edit_confirmed,
1208
+ reservation_ids: existing.reservation_ids,
1209
+ batch_withdrawal_completed: existing.batch_withdrawal_completed,
1210
+ credit_line_id: existing.credit_line_id,
1211
+ fulfillment_id: existing.fulfillment_id,
1212
+ },
1213
+ already_completed: existing.status === "completed",
1214
+ existing_result: existing.status === "completed"
1215
+ ? this.toConsignmentCorrectionResult(existing)
1216
+ : null,
1217
+ };
1218
+ }
1219
+ const effectiveQuantity = new Map(reportDto.lines.map((line) => [line.id, line.confirmed_sale_quantity]));
1220
+ for (const correction of corrections) {
1221
+ if (correction.status !== "completed") {
1222
+ continue;
1223
+ }
1224
+ for (const line of correction.lines) {
1225
+ effectiveQuantity.set(line.report_line_id, line.corrected_confirmed_sale_quantity);
1226
+ }
1227
+ }
1228
+ const lineById = new Map(reportDto.lines.map((line) => [line.id, line]));
1229
+ const seen = new Set();
1230
+ const lines = input.corrected_lines.map((corrected) => {
1231
+ if (seen.has(corrected.report_line_id)) {
1232
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Eine Meldeposition darf pro Korrektur nur einmal vorkommen.");
1233
+ }
1234
+ seen.add(corrected.report_line_id);
1235
+ const line = lineById.get(corrected.report_line_id);
1236
+ if (!line?.order_line_item_id) {
1237
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Korrektur enthält eine unbekannte oder nicht abgerechnete Meldeposition.");
1238
+ }
1239
+ const maximum = Math.max(0, line.expected_quantity - line.counted_quantity);
1240
+ if (!Number.isSafeInteger(corrected.confirmed_sale_quantity) ||
1241
+ corrected.confirmed_sale_quantity < 0 ||
1242
+ corrected.confirmed_sale_quantity > maximum) {
1243
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die korrigierte Verkaufsmenge darf die ursprüngliche positive Bestandsdifferenz nicht überschreiten.");
1244
+ }
1245
+ const previous = effectiveQuantity.get(line.id) ?? line.confirmed_sale_quantity;
1246
+ return {
1247
+ report_line_id: line.id,
1248
+ order_line_item_id: line.order_line_item_id,
1249
+ inventory_item_id: line.inventory_item_id,
1250
+ previous_confirmed_sale_quantity: previous,
1251
+ corrected_confirmed_sale_quantity: corrected.confirmed_sale_quantity,
1252
+ quantity_delta: corrected.confirmed_sale_quantity - previous,
1253
+ };
1254
+ });
1255
+ if (!lines.length || lines.every((line) => line.quantity_delta === 0)) {
1256
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Korrektur verändert keine bestätigte Verkaufsmenge.");
1257
+ }
1258
+ const pending = {
1259
+ correction_id: input.correction_id,
1260
+ status: "pending",
1261
+ admin_id: input.admin_id,
1262
+ reason: input.reason,
1263
+ lines,
1264
+ order_edit_id: null,
1265
+ edit_updated: false,
1266
+ edit_requested: false,
1267
+ edit_confirmed: false,
1268
+ reservation_ids: [],
1269
+ batch_withdrawal_completed: false,
1270
+ credit_line_id: null,
1271
+ fulfillment_id: null,
1272
+ };
1273
+ await this.updateConsignmentReports({
1274
+ id: report.id,
1275
+ version: Number(report.version) + 1,
1276
+ metadata: {
1277
+ ...metadata,
1278
+ corrections: [...corrections, pending],
1279
+ },
1280
+ }, sharedContext);
1281
+ return {
1282
+ report: reportDto,
1283
+ settings: settings,
1284
+ order_id: report.order_id,
1285
+ lines,
1286
+ progress: {
1287
+ order_edit_id: null,
1288
+ edit_updated: false,
1289
+ edit_requested: false,
1290
+ edit_confirmed: false,
1291
+ reservation_ids: [],
1292
+ batch_withdrawal_completed: false,
1293
+ credit_line_id: null,
1294
+ fulfillment_id: null,
1295
+ },
1296
+ already_completed: false,
1297
+ existing_result: null,
1298
+ };
1299
+ }
1300
+ async recordConsignmentCorrectionProgress(input, sharedContext = {}) {
1301
+ const manager = sharedContext.transactionManager;
1302
+ if (!manager) {
1303
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für den Korrekturfortschritt fehlt die Affiliate-Transaktion.");
1304
+ }
1305
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-consignment-correction:${input.report_id}`], "all");
1306
+ const report = await this.retrieveConsignmentReport(input.report_id, {}, sharedContext);
1307
+ const metadata = this.asJsonObject(report.metadata);
1308
+ const corrections = this.parseStoredConsignmentCorrections(metadata.corrections);
1309
+ const index = corrections.findIndex((correction) => correction.correction_id === input.correction_id);
1310
+ if (index === -1) {
1311
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Der Korrekturbeleg für den Fortschritt wurde nicht gefunden.");
1312
+ }
1313
+ corrections[index] = {
1314
+ ...corrections[index],
1315
+ ...(input.order_edit_id ? { order_edit_id: input.order_edit_id } : {}),
1316
+ ...(input.edit_updated !== undefined
1317
+ ? { edit_updated: input.edit_updated }
1318
+ : {}),
1319
+ ...(input.edit_requested !== undefined
1320
+ ? { edit_requested: input.edit_requested }
1321
+ : {}),
1322
+ ...(input.edit_confirmed !== undefined
1323
+ ? { edit_confirmed: input.edit_confirmed }
1324
+ : {}),
1325
+ ...(input.reservation_ids
1326
+ ? { reservation_ids: input.reservation_ids }
1327
+ : {}),
1328
+ ...(input.batch_withdrawal_completed !== undefined
1329
+ ? {
1330
+ batch_withdrawal_completed: input.batch_withdrawal_completed,
1331
+ }
1332
+ : {}),
1333
+ ...(input.credit_line_id ? { credit_line_id: input.credit_line_id } : {}),
1334
+ ...(input.fulfillment_id ? { fulfillment_id: input.fulfillment_id } : {}),
1335
+ };
1336
+ await this.updateConsignmentReports({
1337
+ id: report.id,
1338
+ metadata: { ...metadata, corrections },
1339
+ }, sharedContext);
1340
+ }
1341
+ async completeConsignmentCorrection(input, sharedContext = {}) {
1342
+ const manager = sharedContext.transactionManager;
1343
+ if (!manager) {
1344
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für den Korrekturabschluss fehlt die Affiliate-Transaktion.");
1345
+ }
1346
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-consignment-correction:${input.report_id}`], "all");
1347
+ const report = await this.retrieveConsignmentReport(input.report_id, {}, sharedContext);
1348
+ if (report.status !== "approved") {
1349
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Nur freigegebene Monatsmeldungen können korrigiert werden.");
1350
+ }
1351
+ const metadata = this.asJsonObject(report.metadata);
1352
+ const corrections = this.parseStoredConsignmentCorrections(metadata.corrections);
1353
+ const index = corrections.findIndex((correction) => correction.correction_id === input.correction_id);
1354
+ if (index === -1) {
1355
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Der vorbereitete Korrekturbeleg wurde nicht gefunden.");
1356
+ }
1357
+ const current = corrections[index];
1358
+ if (current.status === "completed") {
1359
+ return this.toConsignmentCorrectionResult(current);
1360
+ }
1361
+ const completed = {
1362
+ ...current,
1363
+ status: "completed",
1364
+ order_edit_id: input.order_edit_id,
1365
+ credit_line_id: input.credit_line_id,
1366
+ fulfillment_id: input.fulfillment_id,
1367
+ };
1368
+ corrections[index] = completed;
1369
+ await this.updateConsignmentReports({
1370
+ id: report.id,
1371
+ version: Number(report.version) + 1,
1372
+ metadata: {
1373
+ ...metadata,
1374
+ corrections,
1375
+ },
1376
+ }, sharedContext);
1377
+ return this.toConsignmentCorrectionResult(completed);
1378
+ }
1379
+ async rejectConsignmentReport(input, sharedContext = {}) {
1380
+ const report = await this.retrieveConsignmentReport(input.report_id, {}, sharedContext);
1381
+ if (report.status === "rejected") {
1382
+ return await this.toConsignmentReportDTO(report, sharedContext);
1383
+ }
1384
+ if (report.status !== "submitted") {
1385
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Nur eingereichte Monatsmeldungen können abgelehnt werden.");
1386
+ }
1387
+ const metadata = this.asJsonObject(report.metadata);
1388
+ const rejected = await this.updateConsignmentReports({
1389
+ id: report.id,
1390
+ status: "rejected",
1391
+ version: report.version + 1,
1392
+ admin_notes: input.admin_notes,
1393
+ metadata: {
1394
+ ...metadata,
1395
+ rejected_by_id: input.admin_id,
1396
+ rejected_at: new Date().toISOString(),
1397
+ },
1398
+ }, sharedContext);
1399
+ return await this.toConsignmentReportDTO(rejected, sharedContext);
1400
+ }
1401
+ async listConsignmentReportRecords(affiliateId) {
1402
+ const reports = await this.listConsignmentReports({ affiliate_id: affiliateId }, { order: { period_start: "DESC" } });
1403
+ return await Promise.all(reports.map((report) => this.toConsignmentReportDTO(report)));
1404
+ }
1405
+ async createCommissionForOrder(input, sharedContext = {}) {
1406
+ await this.lockCommissionOrder(input.order.id, sharedContext);
1407
+ return await this.ledgerService.createOrderCommission(input, sharedContext);
1408
+ }
1409
+ async createCommissionCorrection(input, sharedContext = {}) {
1410
+ const manager = await this.lockCommissionOrder(input.order.id, sharedContext);
1411
+ const baseEntries = await this.ledgerService.materializeMissingCorrectionBaseEntries(input.order, sharedContext);
1412
+ const baseEntryIds = [
1413
+ ...new Set(baseEntries.map((entry) => entry.id)),
1414
+ ].sort();
1415
+ for (const baseEntryId of baseEntryIds) {
1416
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-commission-correction:${baseEntryId}`], "all");
1417
+ }
1418
+ return await this.ledgerService.createCorrection(input, sharedContext);
1419
+ }
1420
+ async lockCommissionOrder(orderId, sharedContext) {
1421
+ const manager = sharedContext.transactionManager;
1422
+ if (!manager) {
1423
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Für die Provisionsbuchung fehlt die Affiliate-Transaktion.");
1424
+ }
1425
+ await manager.execute("select pg_advisory_xact_lock(hashtext(?))", [`affiliate-commission-order:${orderId}`], "all");
1426
+ return manager;
1427
+ }
1428
+ async getRefundedDiscountedNetItemSubtotal(order, returnedItems) {
1429
+ return this.ledgerService.getRefundedDiscountedNetItemSubtotal(order, returnedItems);
1430
+ }
1431
+ async getRefundedNetItemSubtotals(order, returnedItems) {
1432
+ return this.ledgerService.getRefundedNetItemSubtotals(order, returnedItems);
1433
+ }
1434
+ async getPartnerPortalContext(customerId) {
1435
+ return await this.partnerPortalService.getPartnerPortalContext(customerId);
1436
+ }
1437
+ async getPartnerPortalEffectiveCustomerDiscount(affiliate) {
1438
+ return await this.partnerPortalService.getEffectiveCustomerDiscount(affiliate);
1439
+ }
1440
+ async updatePartnerPortalProfile(input, sharedContext = {}) {
1441
+ return await this.partnerPortalService.updatePartnerPortalProfile(input, sharedContext);
1442
+ }
1443
+ async listPartnerPortalSlugs(customerId) {
1444
+ return await this.partnerPortalService.listPartnerPortalSlugs(customerId);
1445
+ }
1446
+ async createPartnerPortalSlug(input, sharedContext = {}) {
1447
+ return await this.partnerPortalService.createPartnerPortalSlug(input, sharedContext);
1448
+ }
1449
+ async updatePartnerPortalSlug(input, sharedContext = {}) {
1450
+ return await this.partnerPortalService.updatePartnerPortalSlug(input, sharedContext);
1451
+ }
1452
+ async getPartnerPortalDashboard(input) {
1453
+ return await this.partnerPortalService.getPartnerPortalDashboard(input);
1454
+ }
1455
+ async getPartnerPortalCommissions(input) {
1456
+ return await this.partnerPortalService.getPartnerPortalCommissions(input);
1457
+ }
1458
+ async getAffiliateReportOverview(input) {
1459
+ return await this.reportService.getOverview(input);
1460
+ }
1461
+ async getAffiliateReportDetail(input) {
1462
+ return await this.reportService.getDetail(input);
1463
+ }
1464
+ /**
1465
+ * When a customer becomes an affiliate they must give up any referring
1466
+ * affiliate: their customer assignment(s) are deleted. A registered affiliate
1467
+ * never keeps one on record (see assignment manager for the inverse guard).
1468
+ */
1469
+ async releaseAffiliateCustomerAssignment(affiliate, identity, context) {
1470
+ if (affiliate.customer_id && affiliate.status !== "rejected") {
1471
+ const byCustomer = await this.persistence.listCustomerAffiliateAssignments({ customer_id: affiliate.customer_id, active: true }, undefined, context);
1472
+ const byEmail = identity?.normalized_email
1473
+ ? await this.persistence.listCustomerAffiliateAssignments({
1474
+ normalized_email: identity.normalized_email,
1475
+ active: true,
1476
+ }, undefined, context)
1477
+ : [];
1478
+ for (const assignment of new Map([...byCustomer, ...byEmail].map((candidate) => [
1479
+ candidate.id,
1480
+ candidate,
1481
+ ])).values()) {
1482
+ await this.assignmentManager.endAssignment(assignment.id, "customer_became_affiliate", context);
1483
+ }
1484
+ const manager = context.transactionManager;
1485
+ const predicates = ['cart."customer_id" = ?'];
1486
+ const params = [affiliate.customer_id];
1487
+ if (identity?.normalized_email) {
1488
+ predicates.push('lower(trim(cart."email")) = ?');
1489
+ params.push(identity.normalized_email);
1490
+ }
1491
+ await manager.execute(`update "affiliate_referral_session" as session
1492
+ set "status" = 'invalidated', "invalidated_at" = now(),
1493
+ "updated_at" = now()
1494
+ where session."status" = 'active'
1495
+ and session."id" in (
1496
+ select referral."referral_session_id"
1497
+ from "affiliate_cart_referral" as referral
1498
+ join "cart" as cart on cart."id" = referral."cart_id"
1499
+ where referral."referral_session_id" is not null
1500
+ and (${predicates.join(" or ")})
1501
+ )`, params, "run");
1502
+ await manager.execute(`update "affiliate_cart_referral" as referral
1503
+ set "status" = 'invalidated',
1504
+ "invalidated_reason" = 'affiliate_customer',
1505
+ "updated_at" = now()
1506
+ from "cart" as cart
1507
+ where cart."id" = referral."cart_id"
1508
+ and referral."deleted_at" is null
1509
+ and referral."status" in ('active', 'pending_email_validation')
1510
+ and (${predicates.join(" or ")})`, params, "run");
1511
+ }
1512
+ }
1513
+ validateProgramSettingsInput(input) {
1514
+ const validCommissionBases = [
1515
+ "before_discounts",
1516
+ "after_discounts",
1517
+ ];
1518
+ const validReferrerBases = [
1519
+ "order_base",
1520
+ "after_direct_commission",
1521
+ ];
1522
+ const validPromotionStacking = ["allow_stacking", "exclusive"];
1523
+ const validReferralOverwritePolicies = [
1524
+ "first_touch",
1525
+ "last_touch",
1526
+ ];
1527
+ if (!Number.isInteger(input.expected_version) ||
1528
+ input.expected_version < 1 ||
1529
+ !validCommissionBases.includes(input.commission_base) ||
1530
+ !validReferrerBases.includes(input.referrer_base) ||
1531
+ !validPromotionStacking.includes(input.promotion_stacking) ||
1532
+ !validReferralOverwritePolicies.includes(input.referral_overwrite_policy) ||
1533
+ !Number.isSafeInteger(input.referral_window_days) ||
1534
+ input.referral_window_days <= 0 ||
1535
+ !Number.isFinite(input.default_customer_discount_rate) ||
1536
+ input.default_customer_discount_rate < 0 ||
1537
+ input.default_customer_discount_rate > 100) {
1538
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Ungültige Affiliate-Programmeinstellungen.");
1539
+ }
1540
+ }
1541
+ validateConsignmentTransferInput(input) {
1542
+ if (!input.idempotency_key.trim() || input.lines.length === 0) {
1543
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Eine Kommissionssendung benötigt einen Idempotenzschlüssel und mindestens eine Position.");
1544
+ }
1545
+ const keys = new Set();
1546
+ for (const line of input.lines) {
1547
+ if (!line.inventory_item_id.trim() ||
1548
+ !Number.isSafeInteger(line.quantity) ||
1549
+ line.quantity <= 0) {
1550
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Transfermengen müssen positive ganze Zahlen sein.");
1551
+ }
1552
+ const key = `${line.inventory_item_id}:${line.batch_id ?? ""}`;
1553
+ if (keys.has(key)) {
1554
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Eine Charge darf je Kommissionssendung nur einmal vorkommen.");
1555
+ }
1556
+ keys.add(key);
1557
+ }
1558
+ }
1559
+ assertConsignmentTransferRetryMatches(input, transfer, storedLines) {
1560
+ const requested = input.lines
1561
+ .map((line) => `${line.inventory_item_id}:${line.batch_id ?? ""}:${line.quantity}`)
1562
+ .sort();
1563
+ const stored = storedLines
1564
+ .map((line) => `${line.inventory_item_id}:${line.source_batch_id ?? ""}:${line.quantity}`)
1565
+ .sort();
1566
+ if (transfer.affiliate_id !== input.affiliate_id ||
1567
+ transfer.source_location_id !== input.source_location_id ||
1568
+ requested.length !== stored.length ||
1569
+ requested.some((value, index) => value !== stored[index])) {
1570
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Der Idempotenzschlüssel wurde bereits für eine andere Kommissionssendung verwendet.");
1571
+ }
1572
+ }
1573
+ approveConsignmentReportSnapshot(input) {
1574
+ const existing = this.approvalSnapshotRuns.get(input.report_id);
1575
+ if (existing) {
1576
+ return existing;
1577
+ }
1578
+ const snapshot = input.submitted_report_snapshot;
1579
+ if (!snapshot || snapshot.status !== "submitted") {
1580
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Nur eingereichte Monatsmeldungen können freigegeben werden.");
1581
+ }
1582
+ const reviewed = new Map((input.confirmed_lines ?? []).map((line) => [
1583
+ line.report_line_id,
1584
+ line.confirmed_sale_quantity,
1585
+ ]));
1586
+ const lines = snapshot.lines.map((line) => {
1587
+ const confirmed = reviewed.get(line.id) ?? line.confirmed_sale_quantity;
1588
+ const shortage = Math.max(0, line.expected_quantity - line.counted_quantity);
1589
+ if (!Number.isSafeInteger(confirmed) ||
1590
+ confirmed < 0 ||
1591
+ confirmed > shortage) {
1592
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Bestätigte Verkäufe dürfen die ursprüngliche positive Bestandsdifferenz nicht überschreiten.");
1593
+ }
1594
+ return { ...line, confirmed_sale_quantity: confirmed };
1595
+ });
1596
+ const batches = snapshot.batches.map((batch) => ({ ...batch }));
1597
+ for (const line of lines) {
1598
+ let remaining = line.confirmed_sale_quantity;
1599
+ const candidates = batches
1600
+ .filter((batch) => batch.inventory_item_id === line.inventory_item_id)
1601
+ .sort((left, right) => new Date(left.expiry_date).getTime() -
1602
+ new Date(right.expiry_date).getTime());
1603
+ for (const batch of candidates) {
1604
+ const withdrawn = Math.min(batch.quantity, remaining);
1605
+ batch.quantity -= withdrawn;
1606
+ remaining -= withdrawn;
1607
+ if (remaining === 0) {
1608
+ break;
1609
+ }
1610
+ }
1611
+ if (remaining > 0) {
1612
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Für Inventory Item ${line.inventory_item_id} fehlt chargenfähiger Bestand.`);
1613
+ }
1614
+ }
1615
+ const withdrawnQuantity = lines.reduce((sum, line) => sum + line.confirmed_sale_quantity, 0);
1616
+ const orderId = `order_${input.report_id}`;
1617
+ const fulfillmentId = `ful_${input.report_id}`;
1618
+ const report = {
1619
+ id: input.report_id,
1620
+ affiliate_id: snapshot.affiliate_id,
1621
+ period_start: "2026-07-01",
1622
+ period_end: "2026-07-31",
1623
+ status: "approved",
1624
+ version: 2,
1625
+ draft_order_id: snapshot.draft_order_id,
1626
+ order_id: orderId,
1627
+ fulfillment_id: fulfillmentId,
1628
+ approved_by_id: input.admin_id,
1629
+ approved_at: new Date(),
1630
+ metadata: { controlled_snapshot: true },
1631
+ lines: lines.map((line) => ({
1632
+ id: line.id,
1633
+ consignment_report_id: input.report_id,
1634
+ inventory_item_id: line.inventory_item_id,
1635
+ batch_id: null,
1636
+ expected_quantity: line.expected_quantity,
1637
+ counted_quantity: line.counted_quantity,
1638
+ confirmed_sale_quantity: line.confirmed_sale_quantity,
1639
+ proposed_sale_quantity: Math.max(0, line.expected_quantity - line.counted_quantity),
1640
+ requires_admin_clarification: false,
1641
+ non_sale_reason: null,
1642
+ order_line_item_id: line.order_line_item_id,
1643
+ })),
1644
+ };
1645
+ const reservations = lines
1646
+ .filter((line) => line.confirmed_sale_quantity > 0)
1647
+ .map((line) => ({
1648
+ id: `res_${line.id}`,
1649
+ inventory_item_id: line.inventory_item_id,
1650
+ location_id: snapshot.stock_location_id,
1651
+ line_item_id: line.order_line_item_id,
1652
+ quantity: line.confirmed_sale_quantity,
1653
+ }));
1654
+ const fulfillmentItems = lines
1655
+ .filter((line) => line.confirmed_sale_quantity > 0)
1656
+ .map((line) => ({
1657
+ line_item_id: line.order_line_item_id,
1658
+ quantity: line.confirmed_sale_quantity,
1659
+ }));
1660
+ const result = {
1661
+ report,
1662
+ order_id: orderId,
1663
+ fulfillment_id: fulfillmentId,
1664
+ order: {
1665
+ id: orderId,
1666
+ is_draft_order: false,
1667
+ metadata: {
1668
+ consignment: true,
1669
+ consignment_report_id: input.report_id,
1670
+ },
1671
+ },
1672
+ reservations,
1673
+ fulfillment: {
1674
+ id: fulfillmentId,
1675
+ location_id: snapshot.stock_location_id,
1676
+ items: fulfillmentItems,
1677
+ },
1678
+ batch_inventory: batches.map((batch) => ({
1679
+ id: batch.id,
1680
+ quantity: batch.quantity,
1681
+ })),
1682
+ native_stocked_quantity: snapshot.native_stocked_quantity - withdrawnQuantity,
1683
+ withdrawn_quantity: withdrawnQuantity,
1684
+ };
1685
+ this.approvalSnapshotRuns.set(input.report_id, result);
1686
+ return result;
1687
+ }
1688
+ correctConsignmentReportSnapshot(input) {
1689
+ const key = `${input.report_id}:${input.correction_id}`;
1690
+ const existing = this.correctionSnapshotRuns.get(key);
1691
+ if (existing) {
1692
+ return existing;
1693
+ }
1694
+ const snapshot = input.approved_report_snapshot;
1695
+ if (!snapshot || snapshot.status !== "approved") {
1696
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Nur freigegebene Monatsmeldungen können korrigiert werden.");
1697
+ }
1698
+ const originalById = new Map(snapshot.lines.map((line) => [line.id, line]));
1699
+ const changes = input.corrected_lines.map((correction) => {
1700
+ const original = originalById.get(correction.report_line_id);
1701
+ if (!original) {
1702
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Korrektur enthält eine unbekannte Meldeposition.");
1703
+ }
1704
+ return {
1705
+ original,
1706
+ corrected: correction.confirmed_sale_quantity,
1707
+ delta: correction.confirmed_sale_quantity - original.confirmed_sale_quantity,
1708
+ };
1709
+ });
1710
+ const quantityDelta = changes.reduce((sum, change) => sum + change.delta, 0);
1711
+ if (quantityDelta === 0) {
1712
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Korrektur verändert keine bestätigte Verkaufsmenge.");
1713
+ }
1714
+ const first = changes[0];
1715
+ if (!first) {
1716
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Korrektur benötigt mindestens eine Position.");
1717
+ }
1718
+ const result = {
1719
+ correction_id: input.correction_id,
1720
+ quantity_delta: quantityDelta,
1721
+ report_line: {
1722
+ id: first.original.id,
1723
+ confirmed_sale_quantity: first.corrected,
1724
+ },
1725
+ order_edit_id: `ordedit_${input.correction_id}`,
1726
+ credit_line_id: quantityDelta < 0 ? `ordcl_${input.correction_id}` : null,
1727
+ fulfillment_id: quantityDelta > 0 ? `ful_${input.correction_id}` : null,
1728
+ native_stocked_quantity: snapshot.native_stocked_quantity - Math.max(0, quantityDelta),
1729
+ reservation_released_quantity: 0,
1730
+ batch_reversed_quantity: 0,
1731
+ native_restocked_quantity: 0,
1732
+ cancellation_created: false,
1733
+ return_created: false,
1734
+ batch_inventory: snapshot.batches.map((batch) => ({ ...batch })),
1735
+ };
1736
+ this.correctionSnapshotRuns.set(key, result);
1737
+ return result;
1738
+ }
1739
+ parseReservationSnapshots(value) {
1740
+ if (!Array.isArray(value)) {
1741
+ return [];
1742
+ }
1743
+ const reservations = [];
1744
+ for (const candidate of value) {
1745
+ if (typeof candidate !== "object" ||
1746
+ candidate === null ||
1747
+ Array.isArray(candidate)) {
1748
+ continue;
1749
+ }
1750
+ const record = candidate;
1751
+ if (typeof record.id !== "string" ||
1752
+ typeof record.inventory_item_id !== "string" ||
1753
+ typeof record.location_id !== "string" ||
1754
+ !(typeof record.line_item_id === "string" ||
1755
+ record.line_item_id === null) ||
1756
+ typeof record.quantity !== "number") {
1757
+ continue;
1758
+ }
1759
+ reservations.push({
1760
+ id: record.id,
1761
+ inventory_item_id: record.inventory_item_id,
1762
+ location_id: record.location_id,
1763
+ line_item_id: record.line_item_id,
1764
+ quantity: record.quantity,
1765
+ });
1766
+ }
1767
+ return reservations;
1768
+ }
1769
+ parseStoredConsignmentCorrections(value) {
1770
+ if (!Array.isArray(value)) {
1771
+ return [];
1772
+ }
1773
+ const corrections = [];
1774
+ for (const candidate of value) {
1775
+ if (typeof candidate !== "object" ||
1776
+ candidate === null ||
1777
+ Array.isArray(candidate)) {
1778
+ continue;
1779
+ }
1780
+ const record = candidate;
1781
+ if (typeof record.correction_id !== "string" ||
1782
+ (record.status !== "pending" && record.status !== "completed") ||
1783
+ typeof record.admin_id !== "string" ||
1784
+ typeof record.reason !== "string" ||
1785
+ !Array.isArray(record.lines)) {
1786
+ continue;
1787
+ }
1788
+ const lines = [];
1789
+ for (const lineCandidate of record.lines) {
1790
+ if (typeof lineCandidate !== "object" ||
1791
+ lineCandidate === null ||
1792
+ Array.isArray(lineCandidate)) {
1793
+ continue;
1794
+ }
1795
+ const line = lineCandidate;
1796
+ if (typeof line.report_line_id !== "string" ||
1797
+ typeof line.order_line_item_id !== "string" ||
1798
+ typeof line.inventory_item_id !== "string" ||
1799
+ typeof line.previous_confirmed_sale_quantity !== "number" ||
1800
+ typeof line.corrected_confirmed_sale_quantity !== "number" ||
1801
+ typeof line.quantity_delta !== "number") {
1802
+ continue;
1803
+ }
1804
+ lines.push({
1805
+ report_line_id: line.report_line_id,
1806
+ order_line_item_id: line.order_line_item_id,
1807
+ inventory_item_id: line.inventory_item_id,
1808
+ previous_confirmed_sale_quantity: line.previous_confirmed_sale_quantity,
1809
+ corrected_confirmed_sale_quantity: line.corrected_confirmed_sale_quantity,
1810
+ quantity_delta: line.quantity_delta,
1811
+ });
1812
+ }
1813
+ if (lines.length !== record.lines.length) {
1814
+ continue;
1815
+ }
1816
+ const nullableString = (field) => typeof field === "string" || field === null;
1817
+ if (!nullableString(record.order_edit_id) ||
1818
+ !nullableString(record.credit_line_id) ||
1819
+ !nullableString(record.fulfillment_id)) {
1820
+ continue;
1821
+ }
1822
+ corrections.push({
1823
+ correction_id: record.correction_id,
1824
+ status: record.status,
1825
+ admin_id: record.admin_id,
1826
+ reason: record.reason,
1827
+ lines,
1828
+ order_edit_id: record.order_edit_id,
1829
+ edit_updated: record.edit_updated === true,
1830
+ edit_requested: record.edit_requested === true,
1831
+ edit_confirmed: record.edit_confirmed === true,
1832
+ reservation_ids: Array.isArray(record.reservation_ids)
1833
+ ? record.reservation_ids.filter((id) => typeof id === "string")
1834
+ : [],
1835
+ batch_withdrawal_completed: record.batch_withdrawal_completed === true,
1836
+ credit_line_id: record.credit_line_id,
1837
+ fulfillment_id: record.fulfillment_id,
1838
+ });
1839
+ }
1840
+ return corrections;
1841
+ }
1842
+ toConsignmentCorrectionResult(correction) {
1843
+ const first = correction.lines[0];
1844
+ if (!first || !correction.order_edit_id) {
1845
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Der abgeschlossene Korrekturbeleg ist unvollständig.");
1846
+ }
1847
+ return {
1848
+ correction_id: correction.correction_id,
1849
+ quantity_delta: correction.lines.reduce((sum, line) => sum + line.quantity_delta, 0),
1850
+ report_line: {
1851
+ id: first.report_line_id,
1852
+ confirmed_sale_quantity: first.corrected_confirmed_sale_quantity,
1853
+ },
1854
+ order_edit_id: correction.order_edit_id,
1855
+ credit_line_id: correction.credit_line_id,
1856
+ fulfillment_id: correction.fulfillment_id,
1857
+ reservation_released_quantity: 0,
1858
+ batch_reversed_quantity: 0,
1859
+ native_restocked_quantity: 0,
1860
+ cancellation_created: false,
1861
+ return_created: false,
1862
+ };
1863
+ }
1864
+ parseConsignmentPeriod(period) {
1865
+ if (!/^\d{4}-\d{2}-01$/.test(period)) {
1866
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Der Meldezeitraum muss der erste Tag eines Kalendermonats sein.");
1867
+ }
1868
+ const periodStart = new Date(`${period}T00:00:00.000Z`);
1869
+ if (Number.isNaN(periodStart.getTime()) ||
1870
+ periodStart.toISOString().slice(0, 10) !== period) {
1871
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Der Meldezeitraum ist ungültig.");
1872
+ }
1873
+ const periodEnd = new Date(Date.UTC(periodStart.getUTCFullYear(), periodStart.getUTCMonth() + 1, 0, 23, 59, 59, 999));
1874
+ return { periodStart, periodEnd };
1875
+ }
1876
+ toPeriodKey(value) {
1877
+ return (value instanceof Date ? value : new Date(value))
1878
+ .toISOString()
1879
+ .slice(0, 10);
1880
+ }
1881
+ buildConsignmentReportLines(expected, counted) {
1882
+ if (!expected.length) {
1883
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Monatsmeldung benötigt mindestens eine Bestandsposition.");
1884
+ }
1885
+ const expectedByKey = new Map();
1886
+ for (const line of expected) {
1887
+ const key = this.consignmentLineKey(line.inventory_item_id, line.batch_id);
1888
+ if (expectedByKey.has(key) ||
1889
+ !line.inventory_item_id.trim() ||
1890
+ !Number.isSafeInteger(line.expected_quantity) ||
1891
+ line.expected_quantity < 0) {
1892
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Der erwartete Bestand enthält ungültige oder doppelte Positionen.");
1893
+ }
1894
+ expectedByKey.set(key, line);
1895
+ }
1896
+ const countedByKey = new Map();
1897
+ for (const line of counted) {
1898
+ const key = this.consignmentLineKey(line.inventory_item_id, line.batch_id);
1899
+ if (countedByKey.has(key) ||
1900
+ !Number.isSafeInteger(line.counted_quantity) ||
1901
+ line.counted_quantity < 0 ||
1902
+ !expectedByKey.has(key)) {
1903
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Die Zählung enthält ungültige, unbekannte oder doppelte Positionen.");
1904
+ }
1905
+ countedByKey.set(key, line.counted_quantity);
1906
+ }
1907
+ if (countedByKey.size !== expectedByKey.size) {
1908
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Für jede erwartete Bestandsposition muss genau eine Zählung vorliegen.");
1909
+ }
1910
+ return expected.map((line) => {
1911
+ const countedQuantity = countedByKey.get(this.consignmentLineKey(line.inventory_item_id, line.batch_id));
1912
+ if (countedQuantity === undefined) {
1913
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Eine erwartete Bestandsposition wurde nicht gezählt.");
1914
+ }
1915
+ const proposedSaleQuantity = Math.max(0, line.expected_quantity - countedQuantity);
1916
+ const requiresClarification = countedQuantity > line.expected_quantity;
1917
+ return {
1918
+ ...line,
1919
+ counted_quantity: countedQuantity,
1920
+ proposed_sale_quantity: proposedSaleQuantity,
1921
+ requires_admin_clarification: requiresClarification,
1922
+ non_sale_reason: requiresClarification
1923
+ ? "requires_admin_clarification"
1924
+ : null,
1925
+ resolved_unit_price: line.webshop_unit_price ?? null,
1926
+ };
1927
+ });
1928
+ }
1929
+ consignmentLineKey(inventoryItemId, batchId) {
1930
+ return `${inventoryItemId}:${batchId ?? ""}`;
1931
+ }
1932
+ asJsonObject(value) {
1933
+ return typeof value === "object" && value !== null && !Array.isArray(value)
1934
+ ? value
1935
+ : {};
1936
+ }
1937
+ async toConsignmentReportDTO(report, context) {
1938
+ const rows = await this.listConsignmentReportLines({ consignment_report_id: report.id }, { order: { created_at: "ASC" } }, context);
1939
+ const lines = rows.map((line) => {
1940
+ const metadata = this.asJsonObject(line.metadata);
1941
+ const proposed = typeof metadata.proposed_sale_quantity === "number"
1942
+ ? metadata.proposed_sale_quantity
1943
+ : line.confirmed_sale_quantity;
1944
+ return {
1945
+ ...line,
1946
+ batch_id: line.batch_id ?? null,
1947
+ proposed_sale_quantity: proposed,
1948
+ non_sale_reason: line.non_sale_reason ?? null,
1949
+ resolved_unit_price: typeof metadata.resolved_unit_price === "number"
1950
+ ? metadata.resolved_unit_price
1951
+ : (line.unit_price_snapshot ?? null),
1952
+ discounted_line_total: typeof metadata.discounted_line_total === "number"
1953
+ ? metadata.discounted_line_total
1954
+ : null,
1955
+ draft_order_id: typeof metadata.draft_order_id === "string"
1956
+ ? metadata.draft_order_id
1957
+ : (report.draft_order_id ?? null),
1958
+ };
1959
+ });
1960
+ const periodStart = new Date(report.period_start);
1961
+ const derivedPeriodEnd = new Date(Date.UTC(periodStart.getUTCFullYear(), periodStart.getUTCMonth() + 1, 0, 23, 59, 59, 999));
1962
+ return {
1963
+ ...report,
1964
+ period_end: report.period_end ?? derivedPeriodEnd,
1965
+ status: report.status,
1966
+ lines,
1967
+ };
1968
+ }
1969
+ }
1970
+ __decorate([
1971
+ (0, utils_1.InjectTransactionManager)(),
1972
+ __param(0, (0, utils_1.MedusaContext)()),
1973
+ __metadata("design:type", Function),
1974
+ __metadata("design:paramtypes", [Object]),
1975
+ __metadata("design:returntype", Promise)
1976
+ ], AffiliateModuleService.prototype, "retrieveProgramSettings", null);
1977
+ __decorate([
1978
+ (0, utils_1.InjectTransactionManager)(),
1979
+ __param(1, (0, utils_1.MedusaContext)()),
1980
+ __metadata("design:type", Function),
1981
+ __metadata("design:paramtypes", [Object, Object]),
1982
+ __metadata("design:returntype", Promise)
1983
+ ], AffiliateModuleService.prototype, "updateProgramSettings", null);
1984
+ __decorate([
1985
+ (0, utils_1.InjectTransactionManager)(),
1986
+ __param(1, (0, utils_1.MedusaContext)()),
1987
+ __metadata("design:type", Function),
1988
+ __metadata("design:paramtypes", [Object, Object]),
1989
+ __metadata("design:returntype", Promise)
1990
+ ], AffiliateModuleService.prototype, "approveAffiliateApplication", null);
1991
+ __decorate([
1992
+ (0, utils_1.InjectTransactionManager)(),
1993
+ __param(1, (0, utils_1.MedusaContext)()),
1994
+ __metadata("design:type", Function),
1995
+ __metadata("design:paramtypes", [Object, Object]),
1996
+ __metadata("design:returntype", Promise)
1997
+ ], AffiliateModuleService.prototype, "createAffiliateRecord", null);
1998
+ __decorate([
1999
+ (0, utils_1.InjectTransactionManager)(),
2000
+ __param(1, (0, utils_1.MedusaContext)()),
2001
+ __metadata("design:type", Function),
2002
+ __metadata("design:paramtypes", [Object, Object]),
2003
+ __metadata("design:returntype", Promise)
2004
+ ], AffiliateModuleService.prototype, "updateAffiliateRecord", null);
2005
+ __decorate([
2006
+ (0, utils_1.InjectTransactionManager)(),
2007
+ __param(1, (0, utils_1.MedusaContext)()),
2008
+ __metadata("design:type", Function),
2009
+ __metadata("design:paramtypes", [String, Object]),
2010
+ __metadata("design:returntype", Promise)
2011
+ ], AffiliateModuleService.prototype, "setAffiliateInactive", null);
2012
+ __decorate([
2013
+ (0, utils_1.InjectTransactionManager)(),
2014
+ __param(1, (0, utils_1.MedusaContext)()),
2015
+ __metadata("design:type", Function),
2016
+ __metadata("design:paramtypes", [Object, Object]),
2017
+ __metadata("design:returntype", Promise)
2018
+ ], AffiliateModuleService.prototype, "invalidateOpenAttributionStateForAffiliate", null);
2019
+ __decorate([
2020
+ (0, utils_1.InjectTransactionManager)(),
2021
+ __param(1, (0, utils_1.MedusaContext)()),
2022
+ __metadata("design:type", Function),
2023
+ __metadata("design:paramtypes", [Object, Object]),
2024
+ __metadata("design:returntype", Promise)
2025
+ ], AffiliateModuleService.prototype, "deactivateAffiliateState", null);
2026
+ __decorate([
2027
+ (0, utils_1.InjectTransactionManager)(),
2028
+ __param(1, (0, utils_1.MedusaContext)()),
2029
+ __metadata("design:type", Function),
2030
+ __metadata("design:paramtypes", [Object, Object]),
2031
+ __metadata("design:returntype", Promise)
2032
+ ], AffiliateModuleService.prototype, "ensureDefaultAffiliateCoupon", null);
2033
+ __decorate([
2034
+ (0, utils_1.InjectTransactionManager)(),
2035
+ __param(1, (0, utils_1.MedusaContext)()),
2036
+ __metadata("design:type", Function),
2037
+ __metadata("design:paramtypes", [Object, Object]),
2038
+ __metadata("design:returntype", Promise)
2039
+ ], AffiliateModuleService.prototype, "createAffiliateCouponRecord", null);
2040
+ __decorate([
2041
+ (0, utils_1.InjectTransactionManager)(),
2042
+ __param(1, (0, utils_1.MedusaContext)()),
2043
+ __metadata("design:type", Function),
2044
+ __metadata("design:paramtypes", [Object, Object]),
2045
+ __metadata("design:returntype", Promise)
2046
+ ], AffiliateModuleService.prototype, "createAffiliateCouponRotation", null);
2047
+ __decorate([
2048
+ (0, utils_1.InjectTransactionManager)(),
2049
+ __param(1, (0, utils_1.MedusaContext)()),
2050
+ __metadata("design:type", Function),
2051
+ __metadata("design:paramtypes", [Object, Object]),
2052
+ __metadata("design:returntype", Promise)
2053
+ ], AffiliateModuleService.prototype, "revokeAffiliateCouponRecord", null);
2054
+ __decorate([
2055
+ (0, utils_1.InjectTransactionManager)(),
2056
+ __param(1, (0, utils_1.MedusaContext)()),
2057
+ __metadata("design:type", Function),
2058
+ __metadata("design:paramtypes", [Object, Object]),
2059
+ __metadata("design:returntype", Promise)
2060
+ ], AffiliateModuleService.prototype, "setAffiliateCouponProvisioningState", null);
2061
+ __decorate([
2062
+ (0, utils_1.InjectTransactionManager)(),
2063
+ __param(1, (0, utils_1.MedusaContext)()),
2064
+ __metadata("design:type", Function),
2065
+ __metadata("design:paramtypes", [Object, Object]),
2066
+ __metadata("design:returntype", Promise)
2067
+ ], AffiliateModuleService.prototype, "finalizeAffiliateCouponRotation", null);
2068
+ __decorate([
2069
+ (0, utils_1.InjectTransactionManager)(),
2070
+ __param(1, (0, utils_1.MedusaContext)()),
2071
+ __metadata("design:type", Function),
2072
+ __metadata("design:paramtypes", [Object, Object]),
2073
+ __metadata("design:returntype", Promise)
2074
+ ], AffiliateModuleService.prototype, "createAffiliateSlugRecord", null);
2075
+ __decorate([
2076
+ (0, utils_1.InjectTransactionManager)(),
2077
+ __param(1, (0, utils_1.MedusaContext)()),
2078
+ __metadata("design:type", Function),
2079
+ __metadata("design:paramtypes", [Object, Object]),
2080
+ __metadata("design:returntype", Promise)
2081
+ ], AffiliateModuleService.prototype, "updateAffiliateSlugRecord", null);
2082
+ __decorate([
2083
+ (0, utils_1.InjectTransactionManager)(),
2084
+ __param(2, (0, utils_1.MedusaContext)()),
2085
+ __metadata("design:type", Function),
2086
+ __metadata("design:paramtypes", [Object, Object, Object]),
2087
+ __metadata("design:returntype", Promise)
2088
+ ], AffiliateModuleService.prototype, "captureReferralLink", null);
2089
+ __decorate([
2090
+ (0, utils_1.InjectTransactionManager)(),
2091
+ __param(2, (0, utils_1.MedusaContext)()),
2092
+ __metadata("design:type", Function),
2093
+ __metadata("design:paramtypes", [Object, Object, Object]),
2094
+ __metadata("design:returntype", Promise)
2095
+ ], AffiliateModuleService.prototype, "bindReferralSessionToCart", null);
2096
+ __decorate([
2097
+ (0, utils_1.InjectTransactionManager)(),
2098
+ __param(2, (0, utils_1.MedusaContext)()),
2099
+ __metadata("design:type", Function),
2100
+ __metadata("design:paramtypes", [String, Object, Object]),
2101
+ __metadata("design:returntype", Promise)
2102
+ ], AffiliateModuleService.prototype, "getActiveCartReferral", null);
2103
+ __decorate([
2104
+ (0, utils_1.InjectTransactionManager)(),
2105
+ __param(2, (0, utils_1.MedusaContext)()),
2106
+ __metadata("design:type", Function),
2107
+ __metadata("design:paramtypes", [String, Object, Object]),
2108
+ __metadata("design:returntype", Promise)
2109
+ ], AffiliateModuleService.prototype, "getCartReferralStatus", null);
2110
+ __decorate([
2111
+ (0, utils_1.InjectTransactionManager)(),
2112
+ __param(2, (0, utils_1.MedusaContext)()),
2113
+ __metadata("design:type", Function),
2114
+ __metadata("design:paramtypes", [Object, Object, Object]),
2115
+ __metadata("design:returntype", Promise)
2116
+ ], AffiliateModuleService.prototype, "applyAffiliateCouponReferral", null);
2117
+ __decorate([
2118
+ (0, utils_1.InjectTransactionManager)(),
2119
+ __param(2, (0, utils_1.MedusaContext)()),
2120
+ __metadata("design:type", Function),
2121
+ __metadata("design:paramtypes", [Object, Object, Object]),
2122
+ __metadata("design:returntype", Promise)
2123
+ ], AffiliateModuleService.prototype, "invalidateAffiliateCouponReferrals", null);
2124
+ __decorate([
2125
+ (0, utils_1.InjectTransactionManager)(),
2126
+ __param(1, (0, utils_1.MedusaContext)()),
2127
+ __metadata("design:type", Function),
2128
+ __metadata("design:paramtypes", [Object, Object]),
2129
+ __metadata("design:returntype", Promise)
2130
+ ], AffiliateModuleService.prototype, "removeAffiliateCouponFromCartReferrals", null);
2131
+ __decorate([
2132
+ (0, utils_1.InjectTransactionManager)(),
2133
+ __param(1, (0, utils_1.MedusaContext)()),
2134
+ __metadata("design:type", Function),
2135
+ __metadata("design:paramtypes", [Object, Object]),
2136
+ __metadata("design:returntype", Promise)
2137
+ ], AffiliateModuleService.prototype, "invalidateOpenAttributionStateForCoupon", null);
2138
+ __decorate([
2139
+ (0, utils_1.InjectTransactionManager)(),
2140
+ __param(2, (0, utils_1.MedusaContext)()),
2141
+ __metadata("design:type", Function),
2142
+ __metadata("design:paramtypes", [Object, Object, Object]),
2143
+ __metadata("design:returntype", Promise)
2144
+ ], AffiliateModuleService.prototype, "invalidateAffiliateCartReferrals", null);
2145
+ __decorate([
2146
+ (0, utils_1.InjectTransactionManager)(),
2147
+ __param(2, (0, utils_1.MedusaContext)()),
2148
+ __metadata("design:type", Function),
2149
+ __metadata("design:paramtypes", [Object, Object, Object]),
2150
+ __metadata("design:returntype", Promise)
2151
+ ], AffiliateModuleService.prototype, "compensateAffiliateCouponReferralMutation", null);
2152
+ __decorate([
2153
+ (0, utils_1.InjectTransactionManager)(),
2154
+ __param(1, (0, utils_1.MedusaContext)()),
2155
+ __metadata("design:type", Function),
2156
+ __metadata("design:paramtypes", [Object, Object]),
2157
+ __metadata("design:returntype", Promise)
2158
+ ], AffiliateModuleService.prototype, "assignCustomerAffiliate", null);
2159
+ __decorate([
2160
+ (0, utils_1.InjectTransactionManager)(),
2161
+ __param(1, (0, utils_1.MedusaContext)()),
2162
+ __metadata("design:type", Function),
2163
+ __metadata("design:paramtypes", [Object, Object]),
2164
+ __metadata("design:returntype", Promise)
2165
+ ], AffiliateModuleService.prototype, "expireAffiliateAttributionState", null);
2166
+ __decorate([
2167
+ (0, utils_1.InjectTransactionManager)(),
2168
+ __param(1, (0, utils_1.MedusaContext)()),
2169
+ __metadata("design:type", Function),
2170
+ __metadata("design:paramtypes", [Object, Object]),
2171
+ __metadata("design:returntype", Promise)
2172
+ ], AffiliateModuleService.prototype, "completeExpiredCartReferralPromotionCleanup", null);
2173
+ __decorate([
2174
+ (0, utils_1.InjectTransactionManager)(),
2175
+ __param(1, (0, utils_1.MedusaContext)()),
2176
+ __metadata("design:type", Function),
2177
+ __metadata("design:paramtypes", [Object, Object]),
2178
+ __metadata("design:returntype", Promise)
2179
+ ], AffiliateModuleService.prototype, "finalizeOrderAttribution", null);
2180
+ __decorate([
2181
+ (0, utils_1.InjectTransactionManager)(),
2182
+ __param(1, (0, utils_1.MedusaContext)()),
2183
+ __metadata("design:type", Function),
2184
+ __metadata("design:paramtypes", [Object, Object]),
2185
+ __metadata("design:returntype", Promise)
2186
+ ], AffiliateModuleService.prototype, "compensateOrderAttribution", null);
2187
+ __decorate([
2188
+ (0, utils_1.InjectTransactionManager)(),
2189
+ __param(1, (0, utils_1.MedusaContext)()),
2190
+ __metadata("design:type", Function),
2191
+ __metadata("design:paramtypes", [Object, Object]),
2192
+ __metadata("design:returntype", Promise)
2193
+ ], AffiliateModuleService.prototype, "removeCustomerAffiliateAssignment", null);
2194
+ __decorate([
2195
+ (0, utils_1.InjectTransactionManager)(),
2196
+ __param(1, (0, utils_1.MedusaContext)()),
2197
+ __metadata("design:type", Function),
2198
+ __metadata("design:paramtypes", [Object, Object]),
2199
+ __metadata("design:returntype", Promise)
2200
+ ], AffiliateModuleService.prototype, "setCustomerAffiliateAssignment", null);
2201
+ __decorate([
2202
+ (0, utils_1.InjectTransactionManager)(),
2203
+ __param(1, (0, utils_1.MedusaContext)()),
2204
+ __metadata("design:type", Function),
2205
+ __metadata("design:paramtypes", [Object, Object]),
2206
+ __metadata("design:returntype", Promise)
2207
+ ], AffiliateModuleService.prototype, "saveAffiliateDistributionSettings", null);
2208
+ __decorate([
2209
+ (0, utils_1.InjectTransactionManager)(),
2210
+ __param(1, (0, utils_1.MedusaContext)()),
2211
+ __metadata("design:type", Function),
2212
+ __metadata("design:paramtypes", [Object, Object]),
2213
+ __metadata("design:returntype", Promise)
2214
+ ], AffiliateModuleService.prototype, "compensateAffiliateDistributionSettings", null);
2215
+ __decorate([
2216
+ (0, utils_1.InjectTransactionManager)(),
2217
+ __param(1, (0, utils_1.MedusaContext)()),
2218
+ __metadata("design:type", Function),
2219
+ __metadata("design:paramtypes", [Object, Object]),
2220
+ __metadata("design:returntype", Promise)
2221
+ ], AffiliateModuleService.prototype, "prepareConsignmentTransfer", null);
2222
+ __decorate([
2223
+ (0, utils_1.InjectTransactionManager)(),
2224
+ __param(1, (0, utils_1.MedusaContext)()),
2225
+ __metadata("design:type", Function),
2226
+ __metadata("design:paramtypes", [Object, Object]),
2227
+ __metadata("design:returntype", Promise)
2228
+ ], AffiliateModuleService.prototype, "completeConsignmentTransfer", null);
2229
+ __decorate([
2230
+ (0, utils_1.InjectTransactionManager)(),
2231
+ __param(1, (0, utils_1.MedusaContext)()),
2232
+ __metadata("design:type", Function),
2233
+ __metadata("design:paramtypes", [Object, Object]),
2234
+ __metadata("design:returntype", Promise)
2235
+ ], AffiliateModuleService.prototype, "prepareConsignmentReport", null);
2236
+ __decorate([
2237
+ (0, utils_1.InjectTransactionManager)(),
2238
+ __param(1, (0, utils_1.MedusaContext)()),
2239
+ __metadata("design:type", Function),
2240
+ __metadata("design:paramtypes", [Object, Object]),
2241
+ __metadata("design:returntype", Promise)
2242
+ ], AffiliateModuleService.prototype, "attachConsignmentDraftOrder", null);
2243
+ __decorate([
2244
+ (0, utils_1.InjectTransactionManager)(),
2245
+ __param(1, (0, utils_1.MedusaContext)()),
2246
+ __metadata("design:type", Function),
2247
+ __metadata("design:paramtypes", [Object, Object]),
2248
+ __metadata("design:returntype", Promise)
2249
+ ], AffiliateModuleService.prototype, "prepareConsignmentApproval", null);
2250
+ __decorate([
2251
+ (0, utils_1.InjectTransactionManager)(),
2252
+ __param(1, (0, utils_1.MedusaContext)()),
2253
+ __metadata("design:type", Function),
2254
+ __metadata("design:paramtypes", [Object, Object]),
2255
+ __metadata("design:returntype", Promise)
2256
+ ], AffiliateModuleService.prototype, "completeConsignmentApproval", null);
2257
+ __decorate([
2258
+ (0, utils_1.InjectTransactionManager)(),
2259
+ __param(1, (0, utils_1.MedusaContext)()),
2260
+ __metadata("design:type", Function),
2261
+ __metadata("design:paramtypes", [Object, Object]),
2262
+ __metadata("design:returntype", Promise)
2263
+ ], AffiliateModuleService.prototype, "prepareConsignmentCorrection", null);
2264
+ __decorate([
2265
+ (0, utils_1.InjectTransactionManager)(),
2266
+ __param(1, (0, utils_1.MedusaContext)()),
2267
+ __metadata("design:type", Function),
2268
+ __metadata("design:paramtypes", [Object, Object]),
2269
+ __metadata("design:returntype", Promise)
2270
+ ], AffiliateModuleService.prototype, "recordConsignmentCorrectionProgress", null);
2271
+ __decorate([
2272
+ (0, utils_1.InjectTransactionManager)(),
2273
+ __param(1, (0, utils_1.MedusaContext)()),
2274
+ __metadata("design:type", Function),
2275
+ __metadata("design:paramtypes", [Object, Object]),
2276
+ __metadata("design:returntype", Promise)
2277
+ ], AffiliateModuleService.prototype, "completeConsignmentCorrection", null);
2278
+ __decorate([
2279
+ (0, utils_1.InjectTransactionManager)(),
2280
+ __param(1, (0, utils_1.MedusaContext)()),
2281
+ __metadata("design:type", Function),
2282
+ __metadata("design:paramtypes", [Object, Object]),
2283
+ __metadata("design:returntype", Promise)
2284
+ ], AffiliateModuleService.prototype, "rejectConsignmentReport", null);
2285
+ __decorate([
2286
+ (0, utils_1.InjectTransactionManager)(),
2287
+ __param(1, (0, utils_1.MedusaContext)()),
2288
+ __metadata("design:type", Function),
2289
+ __metadata("design:paramtypes", [Object, Object]),
2290
+ __metadata("design:returntype", Promise)
2291
+ ], AffiliateModuleService.prototype, "createCommissionForOrder", null);
2292
+ __decorate([
2293
+ (0, utils_1.InjectTransactionManager)(),
2294
+ __param(1, (0, utils_1.MedusaContext)()),
2295
+ __metadata("design:type", Function),
2296
+ __metadata("design:paramtypes", [Object, Object]),
2297
+ __metadata("design:returntype", Promise)
2298
+ ], AffiliateModuleService.prototype, "createCommissionCorrection", null);
2299
+ __decorate([
2300
+ (0, utils_1.InjectTransactionManager)(),
2301
+ __param(1, (0, utils_1.MedusaContext)()),
2302
+ __metadata("design:type", Function),
2303
+ __metadata("design:paramtypes", [Object, Object]),
2304
+ __metadata("design:returntype", Promise)
2305
+ ], AffiliateModuleService.prototype, "updatePartnerPortalProfile", null);
2306
+ __decorate([
2307
+ (0, utils_1.InjectTransactionManager)(),
2308
+ __param(1, (0, utils_1.MedusaContext)()),
2309
+ __metadata("design:type", Function),
2310
+ __metadata("design:paramtypes", [Object, Object]),
2311
+ __metadata("design:returntype", Promise)
2312
+ ], AffiliateModuleService.prototype, "createPartnerPortalSlug", null);
2313
+ __decorate([
2314
+ (0, utils_1.InjectTransactionManager)(),
2315
+ __param(1, (0, utils_1.MedusaContext)()),
2316
+ __metadata("design:type", Function),
2317
+ __metadata("design:paramtypes", [Object, Object]),
2318
+ __metadata("design:returntype", Promise)
2319
+ ], AffiliateModuleService.prototype, "updatePartnerPortalSlug", null);
2320
+ exports.default = AffiliateModuleService;
2321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FmZmlsaWF0ZS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBS2tDO0FBQ2xDLG1EQUFxRTtBQXVCckUsaUVBSXVDO0FBQ3ZDLG1FQUEwQztBQUMxQyxpRkFBdUQ7QUFDdkQsbUdBQXdFO0FBQ3hFLCtHQUFvRjtBQUNwRixxR0FBMEU7QUFDMUUsMkZBQWlFO0FBQ2pFLCtGQUFvRTtBQUNwRSx1R0FBNEU7QUFDNUUscUdBQTBFO0FBQzFFLDZFQUFtRDtBQUNuRCxpRkFBdUQ7QUFDdkQscUZBQTJEO0FBQzNELCtGQUFvRTtBQUNwRSx5RkFBK0Q7QUFDL0QsbUdBQXdFO0FBQ3hFLDJHQUFnRjtBQUNoRiw0RkFBc0Y7QUFDdEYsc0ZBQWdGO0FBQ2hGLGtGQUE0RTtBQUM1RSxrR0FBMkY7QUFDM0YsOEVBQXdFO0FBQ3hFLG9FQUErRDtBQUMvRCxrRkFBNEU7QUFDNUUsb0ZBQThFO0FBQzlFLDRHQUFxRztBQUNyRyxzRkFBZ0Y7QUFDaEYsb0ZBQThFO0FBQzlFLHNFQUFzRTtBQUN0RSxvRkFHNEM7QUFDNUMsNERBSWdDO0FBK0doQyxJQUFJLDRCQUF5RCxDQUFBO0FBRTdELE1BQU0sc0JBQXVCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQ2pELFNBQVMsRUFBVCxtQkFBUztJQUNULGVBQWUsRUFBZiwwQkFBZTtJQUNmLG9CQUFvQixFQUFwQiwrQkFBb0I7SUFDcEIsYUFBYSxFQUFiLHdCQUFhO0lBQ2IsMkJBQTJCLEVBQTNCLHVDQUEyQjtJQUMzQixlQUFlLEVBQWYsMEJBQWU7SUFDZix3QkFBd0IsRUFBeEIsb0NBQXdCO0lBQ3hCLHVCQUF1QixFQUF2QixtQ0FBdUI7SUFDdkIsd0JBQXdCLEVBQXhCLG9DQUF3QjtJQUN4QixxQkFBcUIsRUFBckIsaUNBQXFCO0lBQ3JCLHlCQUF5QixFQUF6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