@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,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withQuery = void 0;
|
|
4
|
+
const withQuery = (path, params) => {
|
|
5
|
+
const search = new URLSearchParams();
|
|
6
|
+
for (const [key, value] of Object.entries(params)) {
|
|
7
|
+
if (value !== undefined && value !== null && value !== "") {
|
|
8
|
+
search.set(key, String(value));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const query = search.toString();
|
|
12
|
+
return query ? `${path}?${query}` : path;
|
|
13
|
+
};
|
|
14
|
+
exports.withQuery = withQuery;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9xdWVyeS1zdHJpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQU8sTUFBTSxTQUFTLEdBQUcsQ0FDdkIsSUFBWSxFQUNaLE1BQW9FLEVBQzVELEVBQUU7SUFDVixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO0lBRXBDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzFELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBRS9CLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQzFDLENBQUMsQ0FBQTtBQWZZLFFBQUEsU0FBUyxhQWVyQiJ9
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateAssignmentValidUntil = exports.chooseCheckoutAttribution = exports.isAssignmentValidAt = exports.chooseReferralCandidate = void 0;
|
|
4
|
+
const millisecondsPerDay = 24 * 60 * 60 * 1000;
|
|
5
|
+
const assertNever = (value) => {
|
|
6
|
+
throw new Error(`Unhandled affiliate attribution value: ${value}`);
|
|
7
|
+
};
|
|
8
|
+
const shouldApplyCoupon = (referral) => referral.source === "coupon";
|
|
9
|
+
const chooseReferralCandidate = (input) => {
|
|
10
|
+
if (!input.current) {
|
|
11
|
+
return {
|
|
12
|
+
kind: "captured",
|
|
13
|
+
referral: input.incoming,
|
|
14
|
+
apply_incoming_coupon: shouldApplyCoupon(input.incoming),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (input.current.affiliate_id === input.incoming.affiliate_id) {
|
|
18
|
+
return {
|
|
19
|
+
kind: "kept_existing",
|
|
20
|
+
referral: input.current,
|
|
21
|
+
apply_incoming_coupon: shouldApplyCoupon(input.incoming),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
switch (input.overwrite_policy) {
|
|
25
|
+
case "first_touch":
|
|
26
|
+
return {
|
|
27
|
+
kind: "kept_existing",
|
|
28
|
+
referral: input.current,
|
|
29
|
+
apply_incoming_coupon: false,
|
|
30
|
+
};
|
|
31
|
+
case "last_touch":
|
|
32
|
+
return {
|
|
33
|
+
kind: "replaced",
|
|
34
|
+
referral: input.incoming,
|
|
35
|
+
apply_incoming_coupon: shouldApplyCoupon(input.incoming),
|
|
36
|
+
};
|
|
37
|
+
default:
|
|
38
|
+
return assertNever(input.overwrite_policy);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.chooseReferralCandidate = chooseReferralCandidate;
|
|
42
|
+
const isAssignmentValidAt = (assignment, now) => assignment.valid_until === null || assignment.valid_until.getTime() > now.getTime();
|
|
43
|
+
exports.isAssignmentValidAt = isAssignmentValidAt;
|
|
44
|
+
const chooseCheckoutAttribution = (input) => {
|
|
45
|
+
if (input.assignment && (0, exports.isAssignmentValidAt)(input.assignment, input.now)) {
|
|
46
|
+
return {
|
|
47
|
+
kind: "assignment",
|
|
48
|
+
assignment: input.assignment,
|
|
49
|
+
ignore_referral: input.referral !== null &&
|
|
50
|
+
input.referral.affiliate_id !== input.assignment.affiliate_id,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return input.referral
|
|
54
|
+
? { kind: "referral", referral: input.referral }
|
|
55
|
+
: { kind: "none" };
|
|
56
|
+
};
|
|
57
|
+
exports.chooseCheckoutAttribution = chooseCheckoutAttribution;
|
|
58
|
+
const calculateAssignmentValidUntil = (input) => {
|
|
59
|
+
if (input.existing_assignment) {
|
|
60
|
+
return input.existing_assignment.valid_until;
|
|
61
|
+
}
|
|
62
|
+
switch (input.customer_assignment_mode) {
|
|
63
|
+
case "lifetime":
|
|
64
|
+
return null;
|
|
65
|
+
case "time_limited": {
|
|
66
|
+
if (input.assignment_duration_days === null ||
|
|
67
|
+
!Number.isInteger(input.assignment_duration_days) ||
|
|
68
|
+
input.assignment_duration_days <= 0) {
|
|
69
|
+
throw new Error("time_limited assignments require a positive integer duration.");
|
|
70
|
+
}
|
|
71
|
+
return new Date(input.assigned_at.getTime() +
|
|
72
|
+
input.assignment_duration_days * millisecondsPerDay);
|
|
73
|
+
}
|
|
74
|
+
case "order_only":
|
|
75
|
+
return undefined;
|
|
76
|
+
default:
|
|
77
|
+
return assertNever(input.customer_assignment_mode);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
exports.calculateAssignmentValidUntil = calculateAssignmentValidUntil;
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLWF0dHJpYnV0aW9uLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FmZmlsaWF0ZS9kb21haW4vYWZmaWxpYXRlLWF0dHJpYnV0aW9uLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0QkEsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFFOUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFZLEVBQVMsRUFBRTtJQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0FBQ3BFLENBQUMsQ0FBQTtBQUVELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUEyQixFQUFXLEVBQUUsQ0FDakUsUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUE7QUFFdkIsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBSXZDLEVBQThCLEVBQUU7SUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixPQUFPO1lBQ0wsSUFBSSxFQUFFLFVBQVU7WUFDaEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLHFCQUFxQixFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7U0FDekQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0QsT0FBTztZQUNMLElBQUksRUFBRSxlQUFlO1lBQ3JCLFFBQVEsRUFBRSxLQUFLLENBQUMsT0FBTztZQUN2QixxQkFBcUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1NBQ3pELENBQUE7SUFDSCxDQUFDO0lBRUQsUUFBUSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUs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
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isAffiliateCouponRedeemable = exports.getAffiliateCouponWireStatus = exports.isAffiliateCouponRotationSource = exports.countLogicalEnabledAffiliateCouponSlots = exports.generateAffiliateCouponCode = exports.normalizeAffiliateCouponCode = exports.AFFILIATE_COUPON_CODE_ALPHABET = exports.AFFILIATE_COUPON_CODE_LENGTH = exports.AFFILIATE_COUPON_CODE_GENERATION_MAX_ATTEMPTS = exports.MAX_ENABLED_COUPONS_PER_AFFILIATE = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
exports.MAX_ENABLED_COUPONS_PER_AFFILIATE = 5;
|
|
6
|
+
exports.AFFILIATE_COUPON_CODE_GENERATION_MAX_ATTEMPTS = 5;
|
|
7
|
+
exports.AFFILIATE_COUPON_CODE_LENGTH = 8;
|
|
8
|
+
exports.AFFILIATE_COUPON_CODE_ALPHABET = "ABCDEFGHJKMNPQRSTVWXYZ23456789";
|
|
9
|
+
const affiliateCouponCodePattern = /^[A-Z0-9][A-Z0-9-]{2,31}$/;
|
|
10
|
+
const affiliateCouponInputPattern = /^[A-Za-z0-9][A-Za-z0-9-]{2,31}$/;
|
|
11
|
+
const normalizeAffiliateCouponCode = (value) => {
|
|
12
|
+
const trimmed = value.trim();
|
|
13
|
+
const code = trimmed.toUpperCase();
|
|
14
|
+
if (!affiliateCouponInputPattern.test(trimmed) ||
|
|
15
|
+
!affiliateCouponCodePattern.test(code)) {
|
|
16
|
+
throw new Error("Affiliate coupon codes must contain 3 to 32 uppercase letters, digits, or hyphens and start with a letter or digit.");
|
|
17
|
+
}
|
|
18
|
+
return code;
|
|
19
|
+
};
|
|
20
|
+
exports.normalizeAffiliateCouponCode = normalizeAffiliateCouponCode;
|
|
21
|
+
const generateAffiliateCouponCode = (randomIndex = node_crypto_1.randomInt) => {
|
|
22
|
+
let code = "";
|
|
23
|
+
while (code.length < exports.AFFILIATE_COUPON_CODE_LENGTH) {
|
|
24
|
+
const index = randomIndex(exports.AFFILIATE_COUPON_CODE_ALPHABET.length);
|
|
25
|
+
if (!Number.isInteger(index) ||
|
|
26
|
+
index < 0 ||
|
|
27
|
+
index >= exports.AFFILIATE_COUPON_CODE_ALPHABET.length) {
|
|
28
|
+
throw new Error("The affiliate coupon random source returned an invalid index.");
|
|
29
|
+
}
|
|
30
|
+
code += exports.AFFILIATE_COUPON_CODE_ALPHABET[index];
|
|
31
|
+
}
|
|
32
|
+
return code;
|
|
33
|
+
};
|
|
34
|
+
exports.generateAffiliateCouponCode = generateAffiliateCouponCode;
|
|
35
|
+
const countLogicalEnabledAffiliateCouponSlots = (coupons) => {
|
|
36
|
+
const enabledIds = new Set(coupons
|
|
37
|
+
.filter(({ lifecycle_status }) => lifecycle_status === "enabled")
|
|
38
|
+
.map(({ id }) => id));
|
|
39
|
+
return coupons.filter((coupon) => coupon.lifecycle_status === "enabled" &&
|
|
40
|
+
(!coupon.replaces_coupon_id || !enabledIds.has(coupon.replaces_coupon_id))).length;
|
|
41
|
+
};
|
|
42
|
+
exports.countLogicalEnabledAffiliateCouponSlots = countLogicalEnabledAffiliateCouponSlots;
|
|
43
|
+
const isAffiliateCouponRotationSource = (coupon) => coupon.lifecycle_status === "enabled" &&
|
|
44
|
+
coupon.provisioning_status === "ready";
|
|
45
|
+
exports.isAffiliateCouponRotationSource = isAffiliateCouponRotationSource;
|
|
46
|
+
const getAffiliateCouponWireStatus = (coupon, affiliateStatus) => {
|
|
47
|
+
if (coupon.lifecycle_status === "revoked") {
|
|
48
|
+
return "revoked";
|
|
49
|
+
}
|
|
50
|
+
if (coupon.provisioning_status === "pending") {
|
|
51
|
+
return "provisioning";
|
|
52
|
+
}
|
|
53
|
+
if (coupon.provisioning_status === "failed") {
|
|
54
|
+
return "provisioning_failed";
|
|
55
|
+
}
|
|
56
|
+
return affiliateStatus === "active" ? "active" : "affiliate_inactive";
|
|
57
|
+
};
|
|
58
|
+
exports.getAffiliateCouponWireStatus = getAffiliateCouponWireStatus;
|
|
59
|
+
const isAffiliateCouponRedeemable = (coupon, affiliateStatus) => (0, exports.getAffiliateCouponWireStatus)(coupon, affiliateStatus) === "active";
|
|
60
|
+
exports.isAffiliateCouponRedeemable = isAffiliateCouponRedeemable;
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLWNvdXBvbi1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hZmZpbGlhdGUvZG9tYWluL2FmZmlsaWF0ZS1jb3Vwb24tcG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1QztBQU8xQixRQUFBLGlDQUFpQyxHQUFHLENBQUMsQ0FBQTtBQUNyQyxRQUFBLDZDQUE2QyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxRQUFBLDRCQUE0QixHQUFHLENBQUMsQ0FBQTtBQUNoQyxRQUFBLDhCQUE4QixHQUN6QyxnQ0FBZ0MsQ0FBQTtBQUVsQyxNQUFNLDBCQUEwQixHQUFHLDJCQUEyQixDQUFBO0FBQzlELE1BQU0sMkJBQTJCLEdBQUcsaUNBQWlDLENBQUE7QUFTOUQsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUM1QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFbEMsSUFDRSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDMUMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ3RDLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHFIQUFxSCxDQUN0SCxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyxDQUFBO0FBZFksUUFBQSw0QkFBNEIsZ0NBY3hDO0FBRU0sTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxjQUF1Qyx1QkFBUyxFQUN4QyxFQUFFO0lBQ1YsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRWIsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLG9DQUE0QixFQUFFLENBQUM7UUFDbEQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLHNDQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2hFLElBQ0UsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUN4QixLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssSUFBSSxzQ0FBOEIsQ0FBQyxNQUFNLEVBQzlDLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUE7UUFDbEYsQ0FBQztRQUNELElBQUksSUFBSSxzQ0FBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDLENBQUE7QUFsQlksUUFBQSwyQkFBMkIsK0JBa0J2QztBQUVNLE1BQU0sdUNBQXVDLEdBQUcsQ0FDckQsT0FHRyxFQUNLLEVBQUU7SUFDVixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FDeEIsT0FBTztTQUNKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDO1NBQ2hFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUN2QixDQUFBO0lBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUNuQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1QsTUFBTSxDQUFDLGdCQUFnQixLQUFLLFNBQVM7UUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FDN0UsQ0FBQyxNQUFNLENBQUE7QUFDVixDQUFDLENBQUE7QUFqQlksUUFBQSx1Q0FBdUMsMkNBaUJuRDtBQUVNLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsTUFHQyxFQUNRLEVBQUUsQ0FDWCxNQUFNLENBQUMsZ0JBQWdCLEtBQUssU0FBUztJQUNyQyxNQUFNLENBQUMsbUJBQW1CLEtBQUssT0FBTyxDQUFBO0FBUDNCLFFBQUEsK0JBQStCLG1DQU9KO0FBRWpDLE1BQU0sNEJBQTRCLEdBQUcsQ0FDMUMsTUFHQyxFQUNELGVBQWdDLEVBQ0wsRUFBRTtJQUM3QixJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0MsT0FBTyxjQUFjLENBQUE7SUFDdkIsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLG1CQUFtQixLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVDLE9BQU8scUJBQXFCLENBQUE7SUFDOUIsQ0FBQztJQUNELE9BQU8sZUFBZSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQTtBQUN2RSxDQUFDLENBQUE7QUFqQlksUUFBQSw0QkFBNEIsZ0NBaUJ4QztBQUVNLE1BQU0sMkJBQTJCLEdBQUcsQ0FDekMsTUFHQyxFQUNELGVBQWdDLEVBQ3ZCLEVBQUUsQ0FBQyxJQUFBLG9DQUE0QixFQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsS0FBSyxRQUFRLENBQUE7QUFObkUsUUFBQSwyQkFBMkIsK0JBTXdDIn0=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateCommissionBreakdown = void 0;
|
|
4
|
+
const money_1 = require("../../../utils/money");
|
|
5
|
+
const calculateCommissionBreakdown = (input) => {
|
|
6
|
+
const decimals = (0, money_1.getCurrencyDecimals)(input.currency_code);
|
|
7
|
+
const undiscounted = money_1.Money.of(input.undiscounted_net_amount);
|
|
8
|
+
const discounted = money_1.Money.of(input.discounted_net_amount);
|
|
9
|
+
const orderBase = input.policy.commission_base === "before_discounts"
|
|
10
|
+
? undiscounted
|
|
11
|
+
: discounted;
|
|
12
|
+
const direct = money_1.Money.of(orderBase.applyPercentageRate(input.direct_rate).toRoundedNumber(decimals));
|
|
13
|
+
const referrerBase = input.policy.referrer_base === "after_direct_commission"
|
|
14
|
+
? orderBase.subtract(direct).max(money_1.Money.zero())
|
|
15
|
+
: orderBase;
|
|
16
|
+
return {
|
|
17
|
+
policy_version: input.policy.version,
|
|
18
|
+
undiscounted_net_amount: undiscounted.toRoundedNumber(decimals),
|
|
19
|
+
discounted_net_amount: discounted.toRoundedNumber(decimals),
|
|
20
|
+
discount_amount: undiscounted
|
|
21
|
+
.subtract(discounted)
|
|
22
|
+
.max(money_1.Money.zero())
|
|
23
|
+
.toRoundedNumber(decimals),
|
|
24
|
+
order_base: orderBase.toRoundedNumber(decimals),
|
|
25
|
+
direct_commission_amount: direct.toRoundedNumber(decimals),
|
|
26
|
+
referrer_base: referrerBase.toRoundedNumber(decimals),
|
|
27
|
+
referrer_commission_amount: referrerBase
|
|
28
|
+
.applyPercentageRate(input.referrer_rate)
|
|
29
|
+
.toRoundedNumber(decimals),
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.calculateCommissionBreakdown = calculateCommissionBreakdown;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWlzc2lvbi1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hZmZpbGlhdGUvZG9tYWluL2NvbW1pc3Npb24tcG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLGdEQUFpRTtBQThCMUQsTUFBTSw0QkFBNEIsR0FBRyxDQUMxQyxLQUF3QyxFQUNuQixFQUFFO0lBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUEsMkJBQW1CLEVBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3pELE1BQU0sWUFBWSxHQUFHLGFBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDNUQsTUFBTSxVQUFVLEdBQUcsYUFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUN4RCxNQUFNLFNBQVMsR0FDYixLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsS0FBSyxrQkFBa0I7UUFDakQsQ0FBQyxDQUFDLFlBQVk7UUFDZCxDQUFDLENBQUMsVUFBVSxDQUFBO0lBQ2hCLE1BQU0sTUFBTSxHQUFHLGFBQUssQ0FBQyxFQUFFLENBQ3JCLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUMzRSxDQUFBO0lBQ0QsTUFBTSxZQUFZLEdBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLHlCQUF5QjtRQUN0RCxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFFZixPQUFPO1FBQ0wsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTztRQUNwQyx1QkFBdUIsRUFBRSxZQUFZLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUMvRCxxQkFBcUIsRUFBRSxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUMzRCxlQUFlLEVBQUUsWUFBWTthQUMxQixRQUFRLENBQUMsVUFBVSxDQUFDO2FBQ3BCLEdBQUcsQ0FBQyxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDakIsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUM1QixVQUFVLEVBQUUsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFDL0Msd0JBQXdCLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFDMUQsYUFBYSxFQUFFLFlBQVksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1FBQ3JELDBCQUEwQixFQUFFLFlBQVk7YUFDckMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQzthQUN4QyxlQUFlLENBQUMsUUFBUSxDQUFDO0tBQzdCLENBQUE7QUFDSCxDQUFDLENBQUE7QUFqQ1ksUUFBQSw0QkFBNEIsZ0NBaUN4QyJ9
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveAffiliateConsignmentReminderOptions = resolveAffiliateConsignmentReminderOptions;
|
|
4
|
+
exports.getDueConsignmentPeriod = getDueConsignmentPeriod;
|
|
5
|
+
exports.getConsignmentReminderDueDate = getConsignmentReminderDueDate;
|
|
6
|
+
exports.assertConsignmentPeriod = assertConsignmentPeriod;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
function resolveAffiliateConsignmentReminderOptions(input = {}) {
|
|
9
|
+
const dueDay = input.due_day ?? 10;
|
|
10
|
+
const timezone = input.timezone ?? "UTC";
|
|
11
|
+
if (!Number.isInteger(dueDay) || dueDay < 1 || dueDay > 28) {
|
|
12
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "consignment_reminders.due_day must be an integer from 1 to 28.");
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
new Intl.DateTimeFormat("en", { timeZone: timezone }).format(new Date());
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "consignment_reminders.timezone must be a valid IANA timezone.");
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
due_day: dueDay,
|
|
22
|
+
timezone,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function localCalendarParts(now, timezone) {
|
|
26
|
+
const parts = new Intl.DateTimeFormat("en-CA", {
|
|
27
|
+
timeZone: timezone,
|
|
28
|
+
year: "numeric",
|
|
29
|
+
month: "2-digit",
|
|
30
|
+
day: "2-digit",
|
|
31
|
+
}).formatToParts(now);
|
|
32
|
+
const value = (type) => {
|
|
33
|
+
const part = parts.find((candidate) => candidate.type === type)?.value;
|
|
34
|
+
return Number(part);
|
|
35
|
+
};
|
|
36
|
+
return { year: value("year"), month: value("month"), day: value("day") };
|
|
37
|
+
}
|
|
38
|
+
function getDueConsignmentPeriod(input) {
|
|
39
|
+
const options = resolveAffiliateConsignmentReminderOptions({
|
|
40
|
+
due_day: input.due_day,
|
|
41
|
+
timezone: input.timezone,
|
|
42
|
+
});
|
|
43
|
+
if (Number.isNaN(input.now.getTime())) {
|
|
44
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "now is invalid.");
|
|
45
|
+
}
|
|
46
|
+
const local = localCalendarParts(input.now, options.timezone);
|
|
47
|
+
// The bundled scanner runs at 06:00 UTC. Do not make a manual invocation in
|
|
48
|
+
// the late UTC evening of the preceding date pre-empt the next daily run
|
|
49
|
+
// merely because an eastern timezone has crossed midnight already.
|
|
50
|
+
if (local.day < options.due_day ||
|
|
51
|
+
input.now.getUTCDate() < options.due_day) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const previous = new Date(Date.UTC(local.year, local.month - 2, 1));
|
|
55
|
+
return previous.toISOString().slice(0, 10);
|
|
56
|
+
}
|
|
57
|
+
function getConsignmentReminderDueDate(input) {
|
|
58
|
+
if (!/^\d{4}-\d{2}-01$/.test(input.period_start)) {
|
|
59
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "period_start must be the first day of a calendar month.");
|
|
60
|
+
}
|
|
61
|
+
const period = new Date(`${input.period_start}T00:00:00.000Z`);
|
|
62
|
+
if (Number.isNaN(period.getTime()) ||
|
|
63
|
+
period.toISOString().slice(0, 10) !== input.period_start) {
|
|
64
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "period_start is invalid.");
|
|
65
|
+
}
|
|
66
|
+
resolveAffiliateConsignmentReminderOptions({ due_day: input.due_day });
|
|
67
|
+
return new Date(Date.UTC(period.getUTCFullYear(), period.getUTCMonth() + 1, input.due_day))
|
|
68
|
+
.toISOString()
|
|
69
|
+
.slice(0, 10);
|
|
70
|
+
}
|
|
71
|
+
function assertConsignmentPeriod(periodStart) {
|
|
72
|
+
getConsignmentReminderDueDate({ period_start: periodStart, due_day: 1 });
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2lnbm1lbnQtcmVtaW5kZXItcnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hZmZpbGlhdGUvZG9tYWluL2NvbnNpZ25tZW50LXJlbWluZGVyLXJ1bGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBWUEsZ0dBeUJDO0FBb0JELDBEQXdCQztBQUVELHNFQThCQztBQUVELDBEQUVDO0FBckhELHFEQUF1RDtBQVl2RCxTQUFnQiwwQ0FBMEMsQ0FDeEQsUUFBNkMsRUFBRTtJQUUvQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNsQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQTtJQUV4QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUMzRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixnRUFBZ0UsQ0FDakUsQ0FBQTtJQUNILENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsK0RBQStELENBQ2hFLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNO1FBQ2YsUUFBUTtLQUNULENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFTLEVBQUUsUUFB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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeAffiliateEmail = normalizeAffiliateEmail;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
/**
|
|
6
|
+
* Affiliate identities deliberately use provider-agnostic normalization.
|
|
7
|
+
* Plus tags and dots can identify different mailboxes outside a single
|
|
8
|
+
* provider, so only surrounding whitespace and casing are normalized.
|
|
9
|
+
*/
|
|
10
|
+
function normalizeAffiliateEmail(value) {
|
|
11
|
+
const normalized = value.trim().toLowerCase();
|
|
12
|
+
if (!normalized ||
|
|
13
|
+
!normalized.includes("@") ||
|
|
14
|
+
normalized.startsWith("@") ||
|
|
15
|
+
normalized.endsWith("@")) {
|
|
16
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "A valid email is required to use an affiliate code.");
|
|
17
|
+
}
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtbm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FmZmlsaWF0ZS9kb21haW4vZW1haWwtbm9ybWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLDBEQWdCQztBQXZCRCxxREFBdUQ7QUFFdkQ7Ozs7R0FJRztBQUNILFNBQWdCLHVCQUF1QixDQUFDLEtBQWE7SUFDbkQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBRTdDLElBQ0UsQ0FBQyxVQUFVO1FBQ1gsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUN6QixVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUMxQixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUN4QixDQUFDO1FBQ0QsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscURBQXFELENBQ3RELENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQyJ9
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseAffiliateOwnOrderCouponCode = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Matches the code format generated in
|
|
6
|
+
* `../../../workflows/affiliate/ensure-affiliate-own-order-promotion.ts`:
|
|
7
|
+
* `` `AFFILIATE-OWN-${affiliate.id}-${affiliate.customer_id}`.toUpperCase() ``.
|
|
8
|
+
* Purely a display-layer concern (see `resolve-coupon-labels.ts`) - this
|
|
9
|
+
* does not change what the code actually is, only how it gets labeled.
|
|
10
|
+
*/
|
|
11
|
+
const OWN_ORDER_COUPON_CODE_PATTERN = /^AFFILIATE-OWN-(AFF_[0-9A-Z]+)-(CUS_[0-9A-Z]+)$/;
|
|
12
|
+
/**
|
|
13
|
+
* `.toUpperCase()` only altered the "aff_"/"cus_" prefixes when the code was
|
|
14
|
+
* generated - Medusa entity ids are `<lowercase prefix>_<ULID>`, and ULIDs
|
|
15
|
+
* (from the `ulid` package) are already uppercase Crockford base32. Restoring
|
|
16
|
+
* the original id therefore only needs the segment before the first
|
|
17
|
+
* underscore lowercased back, not the whole string.
|
|
18
|
+
*/
|
|
19
|
+
const restoreEntityIdCasing = (value) => {
|
|
20
|
+
const separatorIndex = value.indexOf("_");
|
|
21
|
+
if (separatorIndex === -1) {
|
|
22
|
+
return value.toLowerCase();
|
|
23
|
+
}
|
|
24
|
+
return `${value.slice(0, separatorIndex).toLowerCase()}${value.slice(separatorIndex)}`;
|
|
25
|
+
};
|
|
26
|
+
const parseAffiliateOwnOrderCouponCode = (code) => {
|
|
27
|
+
const match = OWN_ORDER_COUPON_CODE_PATTERN.exec(code.trim().toUpperCase());
|
|
28
|
+
if (!match) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
affiliateId: restoreEntityIdCasing(match[1]),
|
|
33
|
+
customerId: restoreEntityIdCasing(match[2]),
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
exports.parseAffiliateOwnOrderCouponCode = parseAffiliateOwnOrderCouponCode;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3duLW9yZGVyLWNvdXBvbi1jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvYWZmaWxpYXRlL2RvbWFpbi9vd24tb3JkZXItY291cG9uLWNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSw2QkFBNkIsR0FDakMsaURBQWlELENBQUE7QUFPbkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFO0lBQ3RELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDekMsSUFBSSxjQUFjLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0lBRUQsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQTtBQUN4RixDQUFDLENBQUE7QUFFTSxNQUFNLGdDQUFnQyxHQUFHLENBQzlDLElBQVksRUFDOEIsRUFBRTtJQUM1QyxNQUFNLEtBQUssR0FBRyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7SUFFM0UsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsT0FBTztRQUNMLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsVUFBVSxFQUFFLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1QyxDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBYlksUUFBQSxnQ0FBZ0Msb0NBYTVDIn0=
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveAffiliatePluginOptions = resolveAffiliatePluginOptions;
|
|
4
|
+
exports.buildReferralUrl = buildReferralUrl;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const consignment_reminder_rules_1 = require("./consignment-reminder-rules");
|
|
7
|
+
const INVALID_REFERRAL_BASE_URL = "portal.referral_base_url must be an absolute HTTP(S) URL.";
|
|
8
|
+
function resolveAffiliatePluginOptions(input = {}) {
|
|
9
|
+
const enabled = input.portal?.enabled ?? false;
|
|
10
|
+
const configuredBaseUrl = input.portal?.referral_base_url;
|
|
11
|
+
const referralBaseUrl = typeof configuredBaseUrl === "string" ? configuredBaseUrl.trim() : null;
|
|
12
|
+
if (enabled) {
|
|
13
|
+
let valid = false;
|
|
14
|
+
try {
|
|
15
|
+
const parsed = new URL(referralBaseUrl ?? "");
|
|
16
|
+
valid =
|
|
17
|
+
(parsed.protocol === "http:" || parsed.protocol === "https:") &&
|
|
18
|
+
Boolean(parsed.hostname);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// The common invalid-data error below intentionally covers every form.
|
|
22
|
+
}
|
|
23
|
+
if (!valid) {
|
|
24
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, INVALID_REFERRAL_BASE_URL);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
consignment_reminders: (0, consignment_reminder_rules_1.resolveAffiliateConsignmentReminderOptions)(input.consignment_reminders),
|
|
29
|
+
portal: {
|
|
30
|
+
enabled,
|
|
31
|
+
referral_base_url: referralBaseUrl,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function buildReferralUrl(baseUrl, slug) {
|
|
36
|
+
const url = new URL(baseUrl);
|
|
37
|
+
url.searchParams.set("ref", slug);
|
|
38
|
+
return url.toString();
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hZmZpbGlhdGUvZG9tYWluL3BsdWdpbi1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLHNFQXFDQztBQUVELDRDQUlDO0FBdEVELHFEQUF1RDtBQUV2RCw2RUFJcUM7QUFrQnJDLE1BQU0seUJBQXlCLEdBQzdCLDJEQUEyRCxDQUFBO0FBRTdELFNBQWdCLDZCQUE2QixDQUMzQyxRQUFnQyxFQUFFO0lBRWxDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQTtJQUM5QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUE7SUFDekQsTUFBTSxlQUFlLEdBQ25CLE9BQU8saUJBQWlCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBRXpFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUE7UUFFakIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBQzdDLEtBQUs7Z0JBQ0gsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQztvQkFDN0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM1QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsdUVBQXVFO1FBQ3pFLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5QkFBeUIsQ0FDMUIsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLHFCQUFxQixFQUFFLElBQUEsdUVBQTBDLEVBQy9ELEtBQUssQ0FBQyxxQkFBcUIsQ0FDNUI7UUFDRCxNQUFNLEVBQUU7WUFDTixPQUFPO1lBQ1AsaUJBQWlCLEVBQUUsZUFBZTtTQUNuQztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2pDLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFBO0FBQ3ZCLENBQUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AFFILIATE_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const service_1 = __importDefault(require("./service"));
|
|
9
|
+
exports.AFFILIATE_MODULE = "affiliate";
|
|
10
|
+
exports.default = (0, utils_1.Module)(exports.AFFILIATE_MODULE, {
|
|
11
|
+
service: service_1.default,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hZmZpbGlhdGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBRWxELHdEQUE4QztBQUVqQyxRQUFBLGdCQUFnQixHQUFHLFdBQVcsQ0FBQTtBQUUzQyxrQkFBZSxJQUFBLGNBQU0sRUFBQyx3QkFBZ0IsRUFBRTtJQUN0QyxPQUFPLEVBQUUsaUJBQXNCO0NBQ2hDLENBQUMsQ0FBQSJ9
|