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