@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.
- package/.medusa/server/src/admin/index.js +3739 -0
- package/.medusa/server/src/admin/index.mjs +3738 -0
- package/.medusa/server/src/api/admin/affiliate-applications/[id]/approve/route.js +28 -0
- package/.medusa/server/src/api/admin/affiliate-applications/[id]/reject/route.js +19 -0
- package/.medusa/server/src/api/admin/affiliate-applications/route.js +23 -0
- package/.medusa/server/src/api/admin/affiliate-distribution-reports/query.js +171 -0
- package/.medusa/server/src/api/admin/affiliate-distribution-reports/route.js +13 -0
- package/.medusa/server/src/api/admin/affiliate-program-settings/route.js +27 -0
- package/.medusa/server/src/api/admin/affiliate-reports/[id]/route.js +45 -0
- package/.medusa/server/src/api/admin/affiliate-reports/route.js +27 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/consignment-reminders/route.js +31 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/consignment-transfers/route.js +41 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/reconcile/route.js +34 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/revoke/route.js +36 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/rotate/route.js +40 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/route.js +56 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/distribution/route.js +45 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/inactive/route.js +20 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/route.js +50 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/slugs/[slug_id]/route.js +19 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/slugs/route.js +26 -0
- package/.medusa/server/src/api/admin/affiliates/route.js +43 -0
- package/.medusa/server/src/api/admin/consignment-report-response.js +36 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/approve/route.js +25 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/correct/route.js +18 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/reject/route.js +15 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/route.js +11 -0
- package/.medusa/server/src/api/admin/consignment-reports/route.js +27 -0
- package/.medusa/server/src/api/admin/customers/[id]/affiliate/route.js +50 -0
- package/.medusa/server/src/api/admin/orders/[id]/affiliate-attribution/route.js +30 -0
- package/.medusa/server/src/api/affiliate-coupon-http.js +152 -0
- package/.medusa/server/src/api/affiliate-referral-cookie.js +34 -0
- package/.medusa/server/src/api/affiliate-self-service-http.js +37 -0
- package/.medusa/server/src/api/middlewares.js +786 -0
- package/.medusa/server/src/api/store/affiliate-referrals/apply-coupon/route.js +47 -0
- package/.medusa/server/src/api/store/affiliate-referrals/capture/route.js +76 -0
- package/.medusa/server/src/api/store/affiliate-referrals/carts/[cart_id]/route.js +20 -0
- package/.medusa/server/src/api/store/affiliates/consignment-inventory/route.js +53 -0
- package/.medusa/server/src/api/store/affiliates/consignment-report-response.js +31 -0
- package/.medusa/server/src/api/store/affiliates/consignment-reports/[id]/submit/route.js +40 -0
- package/.medusa/server/src/api/store/affiliates/consignment-reports/route.js +43 -0
- package/.medusa/server/src/api/store/affiliates/coupon-labels/route.js +14 -0
- package/.medusa/server/src/api/store/affiliates/me/commissions/route.js +35 -0
- package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/revoke/route.js +36 -0
- package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/rotate/route.js +40 -0
- package/.medusa/server/src/api/store/affiliates/me/coupon-codes/route.js +55 -0
- package/.medusa/server/src/api/store/affiliates/me/dashboard/route.js +15 -0
- package/.medusa/server/src/api/store/affiliates/me/route.js +85 -0
- package/.medusa/server/src/api/store/affiliates/me/slugs/[slug_id]/route.js +29 -0
- package/.medusa/server/src/api/store/affiliates/me/slugs/route.js +34 -0
- package/.medusa/server/src/api/store/affiliates/own-order-discount/route.js +22 -0
- package/.medusa/server/src/api/store/affiliates/own-order-promotion/route.js +30 -0
- package/.medusa/server/src/api/store/affiliates/register/route.js +27 -0
- package/.medusa/server/src/api/store/affiliates/resolve-referral/route.js +34 -0
- package/.medusa/server/src/api/validators.js +52 -0
- package/.medusa/server/src/api/wire-response.js +10 -0
- package/.medusa/server/src/integration/email-events.js +51 -0
- package/.medusa/server/src/integrations/inventory-transfer/batch-management-transfer-adapter.js +36 -0
- package/.medusa/server/src/integrations/inventory-transfer/native-inventory-transfer-adapter.js +30 -0
- package/.medusa/server/src/integrations/inventory-transfer/resolve-inventory-transfer-adapter.js +46 -0
- package/.medusa/server/src/integrations/inventory-transfer/types.js +3 -0
- package/.medusa/server/src/jobs/affiliate-attribution-expiry.js +20 -0
- package/.medusa/server/src/jobs/affiliate-consignment-report-reminders.js +15 -0
- package/.medusa/server/src/jobs/affiliate-promotion-freshness.js +24 -0
- package/.medusa/server/src/lib/query-string.js +15 -0
- package/.medusa/server/src/modules/affiliate/domain/affiliate-attribution-policy.js +81 -0
- package/.medusa/server/src/modules/affiliate/domain/affiliate-coupon-policy.js +61 -0
- package/.medusa/server/src/modules/affiliate/domain/commission-policy.js +33 -0
- package/.medusa/server/src/modules/affiliate/domain/consignment-reminder-rules.js +74 -0
- package/.medusa/server/src/modules/affiliate/domain/email-normalization.js +20 -0
- package/.medusa/server/src/modules/affiliate/domain/own-order-coupon-code.js +37 -0
- package/.medusa/server/src/modules/affiliate/domain/plugin-options.js +40 -0
- package/.medusa/server/src/modules/affiliate/index.js +13 -0
- package/.medusa/server/src/modules/affiliate/migrations/Migration20260827085154.js +423 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-application.js +38 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-cart-referral.js +65 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-code-redemption.js +41 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-coupon.js +55 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-distribution-settings.js +22 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-order-attribution.js +49 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-program-settings.js +28 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-referral-session.js +34 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-slug.js +27 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate.js +49 -0
- package/.medusa/server/src/modules/affiliate/models/commission-entry.js +62 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-report-line.js +21 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-report.js +31 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-transfer-line.js +16 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-transfer.js +20 -0
- package/.medusa/server/src/modules/affiliate/models/customer-affiliate-assignment.js +58 -0
- package/.medusa/server/src/modules/affiliate/service.js +2321 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-application-manager.js +171 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-coupon-manager.js +441 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-discount.service.js +55 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-manager.js +242 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-partner-portal.service.js +138 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-report.service.js +436 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-slug-manager.js +163 -0
- package/.medusa/server/src/modules/affiliate/services/commission-ledger.service.js +729 -0
- package/.medusa/server/src/modules/affiliate/services/customer-affiliate-assignment-manager.js +350 -0
- package/.medusa/server/src/modules/affiliate/services/order-attribution-manager.js +1051 -0
- package/.medusa/server/src/modules/affiliate/services/referral-lifecycle-manager.js +1420 -0
- package/.medusa/server/src/modules/affiliate/services/utils.js +49 -0
- package/.medusa/server/src/modules/affiliate/types/internal.js +3 -0
- package/.medusa/server/src/paths/affiliate.js +7 -0
- package/.medusa/server/src/paths/index.js +18 -0
- package/.medusa/server/src/schemas/index.js +18 -0
- package/.medusa/server/src/schemas/store.js +24 -0
- package/.medusa/server/src/subscribers/affiliate-cart-updated.js +92 -0
- package/.medusa/server/src/subscribers/affiliate-order-canceled.js +70 -0
- package/.medusa/server/src/subscribers/affiliate-order-placed.js +63 -0
- package/.medusa/server/src/subscribers/affiliate-order-return-received.js +67 -0
- package/.medusa/server/src/subscribers/affiliate-product-eligibility-updated.js +87 -0
- package/.medusa/server/src/types/admin-api.js +3 -0
- package/.medusa/server/src/types/enums.js +53 -0
- package/.medusa/server/src/types/index.js +32 -0
- package/.medusa/server/src/types/public.js +3 -0
- package/.medusa/server/src/types/store-api.js +3 -0
- package/.medusa/server/src/utils/affiliate-cart-operation-lock.js +316 -0
- package/.medusa/server/src/utils/affiliate-promotion-mutation-authorization.js +49 -0
- package/.medusa/server/src/utils/cart-promotions.js +9 -0
- package/.medusa/server/src/utils/money.js +79 -0
- package/.medusa/server/src/utils/promotion-code-availability.js +34 -0
- package/.medusa/server/src/utils/registered-email-checkout.js +101 -0
- package/.medusa/server/src/utils/resolve-services.js +7 -0
- package/.medusa/server/src/utils/settle-cart-promotions.js +44 -0
- package/.medusa/server/src/workflows/affiliate/affiliate-coupon-cart.js +215 -0
- package/.medusa/server/src/workflows/affiliate/affiliate-coupon-command-authorization.js +20 -0
- package/.medusa/server/src/workflows/affiliate/apply-affiliate-coupon.js +174 -0
- package/.medusa/server/src/workflows/affiliate/apply-own-order-promotion.js +89 -0
- package/.medusa/server/src/workflows/affiliate/approve-consignment-report.js +186 -0
- package/.medusa/server/src/workflows/affiliate/correct-approved-consignment-report.js +263 -0
- package/.medusa/server/src/workflows/affiliate/create-affiliate-coupon.js +35 -0
- package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-cancellation.js +21 -0
- package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-refund.js +24 -0
- package/.medusa/server/src/workflows/affiliate/create-commission-for-order.js +17 -0
- package/.medusa/server/src/workflows/affiliate/deactivate-affiliate.js +89 -0
- package/.medusa/server/src/workflows/affiliate/enable-distribution.js +120 -0
- package/.medusa/server/src/workflows/affiliate/enrich-affiliate-report.js +75 -0
- package/.medusa/server/src/workflows/affiliate/ensure-affiliate-coupon-promotion.js +410 -0
- package/.medusa/server/src/workflows/affiliate/ensure-affiliate-own-order-promotion.js +240 -0
- package/.medusa/server/src/workflows/affiliate/ensure-default-affiliate-coupon.js +32 -0
- package/.medusa/server/src/workflows/affiliate/expire-affiliate-attribution-state.js +131 -0
- package/.medusa/server/src/workflows/affiliate/finalize-affiliate-order-attribution.js +82 -0
- package/.medusa/server/src/workflows/affiliate/payment-authorization.js +33 -0
- package/.medusa/server/src/workflows/affiliate/promotion-eligibility.js +179 -0
- package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-cart-referral.js +219 -0
- package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-coupon.js +388 -0
- package/.medusa/server/src/workflows/affiliate/refresh-affiliate-promotions.js +114 -0
- package/.medusa/server/src/workflows/affiliate/resolve-coupon-labels.js +40 -0
- package/.medusa/server/src/workflows/affiliate/revoke-affiliate-coupon.js +29 -0
- package/.medusa/server/src/workflows/affiliate/rotate-affiliate-coupon.js +36 -0
- package/.medusa/server/src/workflows/affiliate/run-consignment-report-reminders.js +58 -0
- package/.medusa/server/src/workflows/affiliate/submit-consignment-report.js +279 -0
- package/.medusa/server/src/workflows/affiliate/transfer-batch-aware-inventory.js +172 -0
- package/.medusa/server/src/workflows/affiliate/transfer-consignment-stock.js +106 -0
- package/.medusa/server/src/workflows/affiliate/update-affiliate-coupon-discounts.js +129 -0
- package/.medusa/server/src/workflows/affiliate/utils.js +118 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-affiliate-attribution.js +57 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-order-created-composition.js +111 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-own-order-discount.js +75 -0
- package/.medusa/server/src/workflows/hooks/enforce-unique-promotion-codes.js +33 -0
- package/.medusa/server/src/workflows/hooks/validate-affiliate-customer-code.js +239 -0
- package/.medusa/server/src/workflows/hooks/validate-complete-cart-affiliate-referral.js +137 -0
- package/LICENSE +21 -0
- package/README.md +799 -0
- package/dist/integration/email-events.d.ts +20 -0
- package/dist/integration/email-events.js +50 -0
- 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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
|