@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,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.settleCartPromotions = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
6
|
+
/**
|
|
7
|
+
* `updateCartPromotionsWorkflow` computes every promotion's rules against a
|
|
8
|
+
* single cart snapshot fetched at the start of that one call. When that same
|
|
9
|
+
* call is the one introducing or removing a promo code (as every caller of
|
|
10
|
+
* this helper does), any *other* promotion whose rule depends on a cart total
|
|
11
|
+
* affected by that code (e.g. a free-shipping threshold keyed on
|
|
12
|
+
* `item_total`) is evaluated against the *pre*-change total, not the one this
|
|
13
|
+
* call is about to persist - Medusa's compute-actions pass has no visibility
|
|
14
|
+
* into adjustments created by its own current invocation.
|
|
15
|
+
*
|
|
16
|
+
* Calling the workflow again immediately afterward, with an empty `ADD` (a
|
|
17
|
+
* request that adds nothing and keeps every currently-applied code as-is),
|
|
18
|
+
* forces a second, now-accurate pass: it re-fetches the cart - which by now
|
|
19
|
+
* reflects the just-persisted adjustments - and re-evaluates every
|
|
20
|
+
* automatic and applied promotion against that settled state, correcting
|
|
21
|
+
* anything that would otherwise persist with a stale, incorrect adjustment.
|
|
22
|
+
*
|
|
23
|
+
* Best-effort: a failure here must not undo the coupon mutation that already
|
|
24
|
+
* succeeded, so errors are swallowed after logging.
|
|
25
|
+
*/
|
|
26
|
+
const settleCartPromotions = async (container, cartId) => {
|
|
27
|
+
try {
|
|
28
|
+
await (0, core_flows_1.updateCartPromotionsWorkflow)(container).run({
|
|
29
|
+
input: {
|
|
30
|
+
cart_id: cartId,
|
|
31
|
+
promo_codes: [],
|
|
32
|
+
action: utils_1.PromotionActions.ADD,
|
|
33
|
+
force_refresh_payment_collection: true,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
39
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
40
|
+
logger?.warn(`Settling cart promotions failed for cart ${cartId} after a coupon mutation: ${message}`);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.settleCartPromotions = settleCartPromotions;
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGxlLWNhcnQtcHJvbW90aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9zZXR0bGUtY2FydC1wcm9tb3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUF1RjtBQUN2Riw0REFBMEU7QUFFMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLEtBQUssRUFDdkMsU0FBMEIsRUFDMUIsTUFBYyxFQUNDLEVBQUU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFBLHlDQUE0QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNoRCxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsTUFBTSxFQUFFLHdCQUFnQixDQUFDLEdBQUc7Z0JBQzVCLGdDQUFnQyxFQUFFLElBQUk7YUFDdkM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUVoRSxDQUFBO1FBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFBO1FBQ3hFLE1BQU0sRUFBRSxJQUFJLENBQ1YsNENBQTRDLE1BQU0sNkJBQTZCLE9BQU8sRUFBRSxDQUN6RixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQTtBQXRCWSxRQUFBLG9CQUFvQix3QkFzQmhDIn0=
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncAffiliateCouponCartPromotion = exports.retrieveAffiliateCouponCartPromotions = exports.planAffiliateCouponCartPromotionMutation = exports.hasExactPreparedAffiliateCouponBinding = exports.loadAffiliateCouponCartBindings = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
6
|
+
const affiliate_promotion_mutation_authorization_1 = require("../../utils/affiliate-promotion-mutation-authorization");
|
|
7
|
+
const affiliate_cart_operation_lock_1 = require("../../utils/affiliate-cart-operation-lock");
|
|
8
|
+
const settle_cart_promotions_1 = require("../../utils/settle-cart-promotions");
|
|
9
|
+
const cart_promotions_1 = require("../../utils/cart-promotions");
|
|
10
|
+
const normalizedCode = (code) => code?.trim().toUpperCase() || null;
|
|
11
|
+
const loadAffiliateCouponCartBindings = async (affiliateService, promotions) => {
|
|
12
|
+
const promotionBindings = await affiliateService.listAffiliateCouponBindingsByPromotionIds(promotions.map(({ id }) => id));
|
|
13
|
+
const byPromotionId = new Map(promotionBindings
|
|
14
|
+
.filter(({ promotion_id }) => Boolean(promotion_id))
|
|
15
|
+
.map((coupon) => [coupon.promotion_id, coupon]));
|
|
16
|
+
const byCode = new Map();
|
|
17
|
+
await Promise.all(promotions.map(async ({ code }) => {
|
|
18
|
+
const canonical = normalizedCode(code);
|
|
19
|
+
if (!canonical || byCode.has(canonical))
|
|
20
|
+
return;
|
|
21
|
+
try {
|
|
22
|
+
const coupon = await affiliateService.findAffiliateCouponByCode(canonical);
|
|
23
|
+
if (coupon)
|
|
24
|
+
byCode.set(canonical, coupon);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof utils_1.MedusaError &&
|
|
28
|
+
error.type === utils_1.MedusaError.Types.INVALID_DATA) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}));
|
|
34
|
+
return promotions.flatMap((promotion) => {
|
|
35
|
+
const promotionCoupon = byPromotionId.get(promotion.id) ?? null;
|
|
36
|
+
const codeCoupon = normalizedCode(promotion.code)
|
|
37
|
+
? (byCode.get(normalizedCode(promotion.code)) ?? null)
|
|
38
|
+
: null;
|
|
39
|
+
if (promotionCoupon && codeCoupon && promotionCoupon.id !== codeCoupon.id) {
|
|
40
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "A cart promotion resolves to conflicting Affiliate coupons.");
|
|
41
|
+
}
|
|
42
|
+
const coupon = promotionCoupon ?? codeCoupon;
|
|
43
|
+
if (!coupon)
|
|
44
|
+
return [];
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
promotion,
|
|
48
|
+
coupon,
|
|
49
|
+
exact: coupon.promotion_id === promotion.id &&
|
|
50
|
+
normalizedCode(promotion.code) === coupon.code,
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
exports.loadAffiliateCouponCartBindings = loadAffiliateCouponCartBindings;
|
|
56
|
+
const hasExactPreparedAffiliateCouponBinding = (referrals, coupon, now = new Date()) => referrals.some((referral) => referral.status === "active" &&
|
|
57
|
+
new Date(referral.expires_at).getTime() > now.getTime() &&
|
|
58
|
+
referral.affiliate_id === coupon.affiliate_id &&
|
|
59
|
+
referral.applied_affiliate_coupon_id === coupon.id &&
|
|
60
|
+
referral.applied_promotion_id === coupon.promotion_id &&
|
|
61
|
+
(referral.source === "link"
|
|
62
|
+
? referral.source_affiliate_coupon_id === null
|
|
63
|
+
: referral.source_affiliate_coupon_id === coupon.id &&
|
|
64
|
+
referral.source_value_snapshot === coupon.code));
|
|
65
|
+
exports.hasExactPreparedAffiliateCouponBinding = hasExactPreparedAffiliateCouponBinding;
|
|
66
|
+
const planAffiliateCouponCartPromotionMutation = (input) => {
|
|
67
|
+
const { promotions, bindings, target_coupon: targetCoupon } = input;
|
|
68
|
+
const affiliatePromotionIds = new Set(bindings.map(({ promotion }) => promotion.id));
|
|
69
|
+
const nonAffiliateCodes = promotions
|
|
70
|
+
.filter(({ id }) => !affiliatePromotionIds.has(id))
|
|
71
|
+
.map(({ code }) => code)
|
|
72
|
+
.filter((code) => Boolean(code));
|
|
73
|
+
const exactTargetAlreadyApplied = Boolean(targetCoupon &&
|
|
74
|
+
bindings.length === 1 &&
|
|
75
|
+
bindings[0].exact &&
|
|
76
|
+
bindings[0].coupon.id === targetCoupon.id &&
|
|
77
|
+
bindings[0].promotion.id === targetCoupon.promotion_id);
|
|
78
|
+
// Automatic promotions (e.g. a threshold-based free-shipping promotion)
|
|
79
|
+
// aren't something the customer chose to combine, so they don't count as
|
|
80
|
+
// "another promotion" under exclusive stacking.
|
|
81
|
+
const exclusiveHasOtherPromotions = input.promotion_stacking === "exclusive" &&
|
|
82
|
+
promotions.some(({ id, is_automatic }) => id !== targetCoupon?.promotion_id && !is_automatic);
|
|
83
|
+
if (!targetCoupon) {
|
|
84
|
+
if (input.force_replace) {
|
|
85
|
+
return {
|
|
86
|
+
action: utils_1.PromotionActions.REPLACE,
|
|
87
|
+
promo_codes: [...new Set(nonAffiliateCodes)],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const publicCodes = bindings
|
|
91
|
+
.map(({ promotion }) => promotion.code)
|
|
92
|
+
.filter((code) => Boolean(code));
|
|
93
|
+
return publicCodes.length
|
|
94
|
+
? {
|
|
95
|
+
action: utils_1.PromotionActions.REMOVE,
|
|
96
|
+
promo_codes: [...new Set(publicCodes)],
|
|
97
|
+
}
|
|
98
|
+
: null;
|
|
99
|
+
}
|
|
100
|
+
if (!targetCoupon.promotion_id) {
|
|
101
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "The Affiliate coupon has no native promotion binding.");
|
|
102
|
+
}
|
|
103
|
+
if (exactTargetAlreadyApplied &&
|
|
104
|
+
!exclusiveHasOtherPromotions &&
|
|
105
|
+
!input.force_replace) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const replace = input.force_replace ||
|
|
109
|
+
bindings.length > 0 ||
|
|
110
|
+
input.promotion_stacking === "exclusive";
|
|
111
|
+
return {
|
|
112
|
+
action: replace ? utils_1.PromotionActions.REPLACE : utils_1.PromotionActions.ADD,
|
|
113
|
+
promo_codes: replace
|
|
114
|
+
? [
|
|
115
|
+
...new Set([
|
|
116
|
+
...(input.promotion_stacking === "allow_stacking"
|
|
117
|
+
? nonAffiliateCodes
|
|
118
|
+
: []),
|
|
119
|
+
targetCoupon.code,
|
|
120
|
+
]),
|
|
121
|
+
]
|
|
122
|
+
: [targetCoupon.code],
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
exports.planAffiliateCouponCartPromotionMutation = planAffiliateCouponCartPromotionMutation;
|
|
126
|
+
const retrieveAffiliateCouponCartPromotions = async (container, cartId) => {
|
|
127
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
128
|
+
const { data } = await query.graph({
|
|
129
|
+
entity: "cart",
|
|
130
|
+
fields: ["id", "promotions.id", "promotions.code", "promotions.is_automatic"],
|
|
131
|
+
filters: { id: cartId },
|
|
132
|
+
}, { cache: { enable: false } });
|
|
133
|
+
const cart = data[0];
|
|
134
|
+
if (!cart) {
|
|
135
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart "${cartId}" was not found.`);
|
|
136
|
+
}
|
|
137
|
+
return (0, cart_promotions_1.readCartPromotions)(cart.promotions);
|
|
138
|
+
};
|
|
139
|
+
exports.retrieveAffiliateCouponCartPromotions = retrieveAffiliateCouponCartPromotions;
|
|
140
|
+
const syncAffiliateCouponCartPromotion = async (input) => {
|
|
141
|
+
const currentPromotions = input.base_promotions ??
|
|
142
|
+
(await (0, exports.retrieveAffiliateCouponCartPromotions)(input.container, input.cart_id));
|
|
143
|
+
const currentBindings = await (0, exports.loadAffiliateCouponCartBindings)(input.affiliate_service, currentPromotions);
|
|
144
|
+
const mutation = (0, exports.planAffiliateCouponCartPromotionMutation)({
|
|
145
|
+
promotions: currentPromotions,
|
|
146
|
+
bindings: currentBindings,
|
|
147
|
+
target_coupon: input.target_coupon,
|
|
148
|
+
promotion_stacking: input.promotion_stacking,
|
|
149
|
+
force_replace: input.force_replace,
|
|
150
|
+
});
|
|
151
|
+
if (mutation) {
|
|
152
|
+
const authorizationCoupon = input.target_coupon ??
|
|
153
|
+
(mutation.action === utils_1.PromotionActions.REPLACE
|
|
154
|
+
? currentBindings[0]?.coupon
|
|
155
|
+
: null);
|
|
156
|
+
if (authorizationCoupon &&
|
|
157
|
+
mutation.action !== utils_1.PromotionActions.REMOVE &&
|
|
158
|
+
!(0, affiliate_cart_operation_lock_1.isAffiliateCartOperationLockKeyHeld)((0, affiliate_cart_operation_lock_1.affiliateCartLockKey)(input.cart_id))) {
|
|
159
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Affiliate coupon promotion authorization requires the Affiliate cart lock.");
|
|
160
|
+
}
|
|
161
|
+
const authorization = authorizationCoupon && mutation.action !== utils_1.PromotionActions.REMOVE
|
|
162
|
+
? (0, affiliate_promotion_mutation_authorization_1.issueAffiliatePromotionMutationAuthorization)({
|
|
163
|
+
cart_id: input.cart_id,
|
|
164
|
+
coupon_id: authorizationCoupon.id,
|
|
165
|
+
promotion_id: authorizationCoupon.promotion_id,
|
|
166
|
+
action: mutation.action,
|
|
167
|
+
promo_codes: mutation.promo_codes,
|
|
168
|
+
})
|
|
169
|
+
: null;
|
|
170
|
+
try {
|
|
171
|
+
const workflowInput = {
|
|
172
|
+
cart_id: input.cart_id,
|
|
173
|
+
promo_codes: mutation.promo_codes,
|
|
174
|
+
action: mutation.action,
|
|
175
|
+
force_refresh_payment_collection: true,
|
|
176
|
+
...(authorization
|
|
177
|
+
? {
|
|
178
|
+
[affiliate_promotion_mutation_authorization_1.affiliatePromotionAuthorizationInputKey]: authorization.token,
|
|
179
|
+
}
|
|
180
|
+
: {}),
|
|
181
|
+
};
|
|
182
|
+
const { result } = await (0, core_flows_1.updateCartPromotionsWorkflow)(input.container).run({ input: workflowInput });
|
|
183
|
+
const skippedTarget = result.skipped_promo_codes.find(({ code }) => normalizedCode(code) === normalizedCode(input.target_coupon?.code));
|
|
184
|
+
if (skippedTarget) {
|
|
185
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Dieser Gutscheincode wurde bereits verwendet.");
|
|
186
|
+
}
|
|
187
|
+
// This call just added/replaced/removed a promo code, changing the
|
|
188
|
+
// cart totals other automatic promotions' rules depend on - settle so
|
|
189
|
+
// they re-evaluate against the now-accurate cart, not the snapshot
|
|
190
|
+
// this same call started from.
|
|
191
|
+
await (0, settle_cart_promotions_1.settleCartPromotions)(input.container, input.cart_id);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
authorization?.revoke();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const readbackPromotions = await (0, exports.retrieveAffiliateCouponCartPromotions)(input.container, input.cart_id);
|
|
198
|
+
const readbackBindings = await (0, exports.loadAffiliateCouponCartBindings)(input.affiliate_service, readbackPromotions);
|
|
199
|
+
if (!input.target_coupon) {
|
|
200
|
+
if (readbackBindings.length) {
|
|
201
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "The cart still contains an Affiliate coupon promotion.");
|
|
202
|
+
}
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const target = input.target_coupon;
|
|
206
|
+
const exact = readbackBindings.length === 1 &&
|
|
207
|
+
readbackBindings[0].exact &&
|
|
208
|
+
readbackBindings[0].coupon.id === target.id &&
|
|
209
|
+
readbackBindings[0].promotion.id === target.promotion_id;
|
|
210
|
+
if (!exact) {
|
|
211
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "coupon_not_applicable");
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
exports.syncAffiliateCouponCartPromotion = syncAffiliateCouponCartPromotion;
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLWNvdXBvbi1jYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hZmZpbGlhdGUvYWZmaWxpYXRlLWNvdXBvbi1jYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUltQztBQUNuQyw0REFBMkU7QUFHM0UsdUhBR2dFO0FBQ2hFLDZGQUdtRDtBQUNuRCwrRUFBMEU7QUFDMUUsaUVBQWlFO0FBcUJqRSxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQW9CLEVBQWlCLEVBQUUsQ0FDN0QsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQztBQUU5QixNQUFNLCtCQUErQixHQUFHLEtBQUssRUFDbEQsZ0JBQXVDLEVBQ3ZDLFVBQTBDLEVBQ0gsRUFBRTtJQUN6QyxNQUFNLGlCQUFpQixHQUNyQixNQUFNLGdCQUFnQixDQUFDLHlDQUF5QyxDQUM5RCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQy9CLENBQUM7SUFDSixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FDM0IsaUJBQWlCO1NBQ2QsTUFBTSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ25ELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQ25ELENBQUM7SUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQUVyRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLGNBQWMs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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withAuthorizedAffiliateCouponCommand = 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 withAuthorizedAffiliateCouponCommand = async (container, lockKeys, actor, operation) => await (0, affiliate_cart_operation_lock_1.withAffiliateOperationLocks)(container, lockKeys, async () => {
|
|
8
|
+
if (actor.actor_type === "affiliate") {
|
|
9
|
+
const affiliate = await (0, resolve_services_1.resolveAffiliateService)(container).retrieveAffiliateRecord(actor.affiliate_id);
|
|
10
|
+
if (!actor.actor_id || affiliate.customer_id !== actor.actor_id) {
|
|
11
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "affiliate_not_found");
|
|
12
|
+
}
|
|
13
|
+
if (affiliate.status !== "active") {
|
|
14
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "affiliate_not_active");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return await operation();
|
|
18
|
+
});
|
|
19
|
+
exports.withAuthorizedAffiliateCouponCommand = withAuthorizedAffiliateCouponCommand;
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLWNvdXBvbi1jb21tYW5kLWF1dGhvcml6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2FmZmlsaWF0ZS9hZmZpbGlhdGUtY291cG9uLWNvbW1hbmQtYXV0aG9yaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFHdkQsNkZBQXVGO0FBQ3ZGLG1FQUFzRTtBQVEvRCxNQUFNLG9DQUFvQyxHQUFHLEtBQUssRUFDdkQsU0FBMEIsRUFDMUIsUUFBMkIsRUFDM0IsS0FBa0MsRUFDbEMsU0FBMkIsRUFDZixFQUFFLENBQ2QsTUFBTSxJQUFBLDJEQUEyQixFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDaEUsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFDN0MsU0FBUyxDQUNWLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLHFCQUFxQixDQUN0QixDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3QixzQkFBc0IsQ0FDdkIsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLFNBQVMsRUFBRSxDQUFBO0FBQzFCLENBQUMsQ0FBQyxDQUFBO0FBMUJTLFFBQUEsb0NBQW9DLHdDQTBCN0MifQ==
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyAffiliateCouponWorkflow = exports.resolveAppliedAffiliateCouponForCart = exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const email_normalization_1 = require("../../modules/affiliate/domain/email-normalization");
|
|
7
|
+
const resolve_services_1 = require("../../utils/resolve-services");
|
|
8
|
+
const cart_promotions_1 = require("../../utils/cart-promotions");
|
|
9
|
+
const affiliate_cart_operation_lock_1 = require("../../utils/affiliate-cart-operation-lock");
|
|
10
|
+
const promotion_eligibility_1 = require("./promotion-eligibility");
|
|
11
|
+
const affiliate_coupon_cart_1 = require("./affiliate-coupon-cart");
|
|
12
|
+
const payment_authorization_1 = require("./payment-authorization");
|
|
13
|
+
exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE = "Dieser Gutscheincode wurde bereits verwendet.";
|
|
14
|
+
const prepareAffiliateCouponStep = (0, workflows_sdk_1.createStep)("prepare-affiliate-coupon", async (input, { container }) => {
|
|
15
|
+
const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
|
|
16
|
+
const promotionService = container.resolve(utils_1.Modules.PROMOTION);
|
|
17
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
18
|
+
const { data } = await query.graph({
|
|
19
|
+
entity: "cart",
|
|
20
|
+
fields: [
|
|
21
|
+
"id",
|
|
22
|
+
"email",
|
|
23
|
+
"customer_id",
|
|
24
|
+
"promotions.id",
|
|
25
|
+
"promotions.code",
|
|
26
|
+
"payment_collection.status",
|
|
27
|
+
"payment_collection.payment_sessions.status"
|
|
28
|
+
],
|
|
29
|
+
filters: { id: input.cart_id }
|
|
30
|
+
});
|
|
31
|
+
const cart = data[0];
|
|
32
|
+
if (!cart) {
|
|
33
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart "${input.cart_id}" was not found.`);
|
|
34
|
+
}
|
|
35
|
+
(0, payment_authorization_1.assertPaymentAuthorizationNotStarted)(cart.payment_collection);
|
|
36
|
+
const resolved = await affiliateService.findEnabledAffiliateCouponByCode(input.code);
|
|
37
|
+
if (!resolved ||
|
|
38
|
+
resolved.affiliate.status !== "active" ||
|
|
39
|
+
resolved.coupon.provisioning_status !== "ready" ||
|
|
40
|
+
!resolved.coupon.promotion_id) {
|
|
41
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Der Affiliate-Gutscheincode wurde nicht gefunden.");
|
|
42
|
+
}
|
|
43
|
+
const { affiliate, coupon } = resolved;
|
|
44
|
+
if (cart.customer_id &&
|
|
45
|
+
(await affiliateService.isCustomerAffiliate(cart.customer_id))) {
|
|
46
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Affiliate-Kunden können keine öffentlichen Affiliate-Gutscheincodes verwenden.");
|
|
47
|
+
}
|
|
48
|
+
if (await affiliateService.hasAffiliateCouponRedemption({
|
|
49
|
+
customer_id: cart.customer_id ?? null,
|
|
50
|
+
normalized_email: cart.email
|
|
51
|
+
? (0, email_normalization_1.normalizeAffiliateEmail)(cart.email)
|
|
52
|
+
: null
|
|
53
|
+
})) {
|
|
54
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE);
|
|
55
|
+
}
|
|
56
|
+
await (0, promotion_eligibility_1.assertAuthenticAffiliateCouponPromotion)(promotionService, {
|
|
57
|
+
coupon,
|
|
58
|
+
affiliate
|
|
59
|
+
});
|
|
60
|
+
return new workflows_sdk_1.StepResponse({
|
|
61
|
+
cart,
|
|
62
|
+
affiliate,
|
|
63
|
+
coupon,
|
|
64
|
+
previous_promotions: (0, cart_promotions_1.readCartPromotions)(cart.promotions)
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
const writeAffiliateCouponReferralStep = (0, workflows_sdk_1.createStep)("write-affiliate-coupon-referral", async (prepared, { container }) => {
|
|
68
|
+
const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
|
|
69
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
70
|
+
const result = await affiliateService.applyAffiliateCouponReferral({
|
|
71
|
+
cart_id: prepared.cart.id,
|
|
72
|
+
email: prepared.cart.email ?? null,
|
|
73
|
+
customer_id: prepared.cart.customer_id ?? null,
|
|
74
|
+
affiliate: prepared.affiliate,
|
|
75
|
+
coupon: prepared.coupon
|
|
76
|
+
}, query);
|
|
77
|
+
return new workflows_sdk_1.StepResponse({ prepared, result }, result.compensation);
|
|
78
|
+
}, async (compensation, { container }) => {
|
|
79
|
+
if (!compensation) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
await (0, resolve_services_1.resolveAffiliateService)(container).compensateAffiliateCouponReferralMutation(compensation, container.resolve(utils_1.ContainerRegistrationKeys.QUERY));
|
|
83
|
+
});
|
|
84
|
+
const resolveAppliedAffiliateCouponForCart = async (container, cartId, allowedCouponIds) => {
|
|
85
|
+
const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
|
|
86
|
+
const [active] = await affiliateService.listAffiliateCartReferrals({ cart_id: cartId, status: "active" }, { take: 1, order: { captured_at: "DESC" } });
|
|
87
|
+
if (!active?.applied_affiliate_coupon_id)
|
|
88
|
+
return null;
|
|
89
|
+
if (allowedCouponIds &&
|
|
90
|
+
!allowedCouponIds.has(active.applied_affiliate_coupon_id)) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const coupon = await affiliateService.retrieveAffiliateCouponRecord(active.applied_affiliate_coupon_id, active.affiliate_id);
|
|
94
|
+
const affiliate = await affiliateService.retrieveAffiliateRecord(coupon.affiliate_id);
|
|
95
|
+
await (0, promotion_eligibility_1.assertAuthenticAffiliateCouponPromotion)(container.resolve(utils_1.Modules.PROMOTION), { coupon, affiliate });
|
|
96
|
+
return coupon;
|
|
97
|
+
};
|
|
98
|
+
exports.resolveAppliedAffiliateCouponForCart = resolveAppliedAffiliateCouponForCart;
|
|
99
|
+
const restoreCouponMutation = async (container, mutation) => {
|
|
100
|
+
const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
|
|
101
|
+
const compensated = await affiliateService.compensateAffiliateCouponReferralMutation(mutation.result.compensation, container.resolve(utils_1.ContainerRegistrationKeys.QUERY));
|
|
102
|
+
let target = null;
|
|
103
|
+
try {
|
|
104
|
+
target = await (0, exports.resolveAppliedAffiliateCouponForCart)(container, mutation.prepared.cart.id, new Set(compensated.restorable_affiliate_coupon_ids));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
target = null;
|
|
108
|
+
}
|
|
109
|
+
const settings = await affiliateService.retrieveProgramSettings();
|
|
110
|
+
await (0, affiliate_coupon_cart_1.syncAffiliateCouponCartPromotion)({
|
|
111
|
+
container,
|
|
112
|
+
affiliate_service: affiliateService,
|
|
113
|
+
cart_id: mutation.prepared.cart.id,
|
|
114
|
+
target_coupon: target,
|
|
115
|
+
promotion_stacking: settings.promotion_stacking,
|
|
116
|
+
base_promotions: mutation.prepared.previous_promotions,
|
|
117
|
+
force_replace: true
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const syncAffiliateCouponPromotionStep = (0, workflows_sdk_1.createStep)("sync-affiliate-coupon-promotion", async (mutation, { container }) => {
|
|
121
|
+
const { prepared, result } = mutation;
|
|
122
|
+
const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
|
|
123
|
+
try {
|
|
124
|
+
const target = [
|
|
125
|
+
"pending_email_validation",
|
|
126
|
+
"coupon_already_redeemed",
|
|
127
|
+
"ignored_existing_assignment"
|
|
128
|
+
].includes(result.status)
|
|
129
|
+
? null
|
|
130
|
+
: await (0, exports.resolveAppliedAffiliateCouponForCart)(container, prepared.cart.id);
|
|
131
|
+
const settings = await affiliateService.retrieveProgramSettings();
|
|
132
|
+
await (0, affiliate_coupon_cart_1.syncAffiliateCouponCartPromotion)({
|
|
133
|
+
container,
|
|
134
|
+
affiliate_service: affiliateService,
|
|
135
|
+
cart_id: prepared.cart.id,
|
|
136
|
+
target_coupon: target,
|
|
137
|
+
promotion_stacking: settings.promotion_stacking
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
await restoreCouponMutation(container, mutation);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
const referral = result.referral?.status === "active"
|
|
145
|
+
? await (0, resolve_services_1.resolveAffiliateService)(container).getCartReferralStatus(prepared.cart.id, container.resolve(utils_1.ContainerRegistrationKeys.QUERY))
|
|
146
|
+
: null;
|
|
147
|
+
const output = {
|
|
148
|
+
status: result.status,
|
|
149
|
+
referral,
|
|
150
|
+
discount_applied: result.apply_coupon,
|
|
151
|
+
...(result.status === "coupon_already_redeemed"
|
|
152
|
+
? { message: exports.AFFILIATE_COUPON_ALREADY_USED_MESSAGE }
|
|
153
|
+
: {})
|
|
154
|
+
};
|
|
155
|
+
return new workflows_sdk_1.StepResponse(output, mutation);
|
|
156
|
+
}, async (compensation, { container }) => {
|
|
157
|
+
if (!compensation) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
await restoreCouponMutation(container, compensation);
|
|
161
|
+
});
|
|
162
|
+
const applyAffiliateCouponWorkflowInternal = (0, workflows_sdk_1.createWorkflow)("apply-affiliate-coupon", (input) => {
|
|
163
|
+
const prepared = prepareAffiliateCouponStep(input);
|
|
164
|
+
const mutation = writeAffiliateCouponReferralStep(prepared);
|
|
165
|
+
return new workflows_sdk_1.WorkflowResponse(syncAffiliateCouponPromotionStep(mutation));
|
|
166
|
+
});
|
|
167
|
+
const applyAffiliateCouponWorkflow = (container) => {
|
|
168
|
+
const workflow = applyAffiliateCouponWorkflowInternal(container);
|
|
169
|
+
return {
|
|
170
|
+
run: async (options) => await (0, affiliate_cart_operation_lock_1.withAffiliateCartOperationLock)(container, options.input.cart_id, async () => await workflow.run(options))
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
exports.applyAffiliateCouponWorkflow = applyAffiliateCouponWorkflow;
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktYWZmaWxpYXRlLWNvdXBvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvYWZmaWxpYXRlL2FwcGx5LWFmZmlsaWF0ZS1jb3Vwb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEscUVBSzBDO0FBQzFDLHFEQUlrQztBQUdsQyw0RkFBNEY7QUFNNUYsbUVBQXNFO0FBQ3RFLGlFQUFnRTtBQUNoRSw2RkFBMEY7QUFDMUYsbUVBQWlGO0FBQ2pGLG1FQUdnQztBQUNoQyxtRUFHZ0M7QUFFbkIsUUFBQSxxQ0FBcUMsR0FDaEQsK0NBQStDLENBQUE7QUFrQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBQSwwQkFBVSxFQUMzQywwQkFBMEIsRUFDMUIsS0FBSyxFQUFFLEtBQWdDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUMzRCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3hDLGVBQU8sQ0FBQyxTQUFTLENBQ1MsQ0FBQTtJQUM1QixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakMsTUFBTSxFQUFFLE1BQU07UUFDZCxNQUFNLEVBQUU7WUFDTixJQUFJO1lBQ0osT0FBTztZQUNQLGFBQWE7WUFDYixlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLDJCQUEyQjtZQUMzQiw0Q0FBNEM7U0FDN0M7UUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtLQUMvQixDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFzQyxDQUFB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
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyAffiliateOwnOrderPromotionWorkflow = 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_services_1 = require("../../utils/resolve-services");
|
|
8
|
+
const cart_promotions_1 = require("../../utils/cart-promotions");
|
|
9
|
+
const settle_cart_promotions_1 = require("../../utils/settle-cart-promotions");
|
|
10
|
+
const ensure_affiliate_own_order_promotion_1 = require("./ensure-affiliate-own-order-promotion");
|
|
11
|
+
const payment_authorization_1 = require("./payment-authorization");
|
|
12
|
+
const applyAffiliateOwnOrderPromotionStep = (0, workflows_sdk_1.createStep)("apply-affiliate-own-order-promotion", async (input, { container }) => {
|
|
13
|
+
const affiliateService = (0, resolve_services_1.resolveAffiliateService)(container);
|
|
14
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
15
|
+
const promotionService = container.resolve(utils_1.Modules.PROMOTION);
|
|
16
|
+
const { data } = await query.graph({
|
|
17
|
+
entity: "cart",
|
|
18
|
+
fields: [
|
|
19
|
+
"id",
|
|
20
|
+
"customer_id",
|
|
21
|
+
"payment_collection.status",
|
|
22
|
+
"payment_collection.payment_sessions.status",
|
|
23
|
+
"promotions.id",
|
|
24
|
+
"promotions.code",
|
|
25
|
+
],
|
|
26
|
+
filters: { id: input.cart_id },
|
|
27
|
+
});
|
|
28
|
+
const cart = data[0];
|
|
29
|
+
if (!cart) {
|
|
30
|
+
return new workflows_sdk_1.StepResponse({ applied: false });
|
|
31
|
+
}
|
|
32
|
+
if (!cart.customer_id) {
|
|
33
|
+
return new workflows_sdk_1.StepResponse({ applied: false });
|
|
34
|
+
}
|
|
35
|
+
if ((0, payment_authorization_1.hasPaymentAuthorizationStarted)(cart.payment_collection)) {
|
|
36
|
+
return new workflows_sdk_1.StepResponse({ applied: false });
|
|
37
|
+
}
|
|
38
|
+
let affiliate = await affiliateService.findActiveAffiliateByCustomerId(cart.customer_id);
|
|
39
|
+
if (!affiliate) {
|
|
40
|
+
return new workflows_sdk_1.StepResponse({ applied: false });
|
|
41
|
+
}
|
|
42
|
+
const ensured = await (0, ensure_affiliate_own_order_promotion_1.ensureAffiliateOwnOrderPromotionWorkflow)(container).run({ input: { affiliate_id: affiliate.id } });
|
|
43
|
+
affiliate = ensured.result;
|
|
44
|
+
if (!affiliate.own_order_promotion_id) {
|
|
45
|
+
return new workflows_sdk_1.StepResponse({ applied: false });
|
|
46
|
+
}
|
|
47
|
+
const cartPromotions = (0, cart_promotions_1.readCartPromotions)(cart.promotions);
|
|
48
|
+
const promotionIds = cartPromotions.map((promotion) => promotion.id);
|
|
49
|
+
const publicPromotionIds = new Set((await affiliateService.listAffiliateCouponBindingsByPromotionIds(promotionIds))
|
|
50
|
+
.map((coupon) => coupon.promotion_id)
|
|
51
|
+
.filter((id) => Boolean(id)));
|
|
52
|
+
const publicCodes = cartPromotions
|
|
53
|
+
.filter((promotion) => publicPromotionIds.has(promotion.id))
|
|
54
|
+
.map((promotion) => promotion.code)
|
|
55
|
+
.filter((code) => Boolean(code));
|
|
56
|
+
const hasOwnPromotion = promotionIds.includes(affiliate.own_order_promotion_id);
|
|
57
|
+
if (!publicCodes.length && hasOwnPromotion) {
|
|
58
|
+
return new workflows_sdk_1.StepResponse({ applied: true });
|
|
59
|
+
}
|
|
60
|
+
if (publicCodes.length || !hasOwnPromotion || promotionIds.length !== 1) {
|
|
61
|
+
const ownPromotion = await promotionService.retrievePromotion(affiliate.own_order_promotion_id);
|
|
62
|
+
if (!ownPromotion.code) {
|
|
63
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Affiliate own-order promotion has no code.");
|
|
64
|
+
}
|
|
65
|
+
const { result: updateResult } = await (0, core_flows_1.updateCartPromotionsWorkflow)(container).run({
|
|
66
|
+
input: {
|
|
67
|
+
cart_id: cart.id,
|
|
68
|
+
promo_codes: [ownPromotion.code],
|
|
69
|
+
action: utils_1.PromotionActions.REPLACE,
|
|
70
|
+
force_refresh_payment_collection: true,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
// Medusa silently drops a promo code into skipped_promo_codes instead
|
|
74
|
+
// of erroring when it computes no adjustment for the cart's current
|
|
75
|
+
// items (e.g. no eligible item) - report that as not applied instead
|
|
76
|
+
// of a misleading success.
|
|
77
|
+
if (updateResult.skipped_promo_codes?.some((skipped) => skipped.code === ownPromotion.code)) {
|
|
78
|
+
return new workflows_sdk_1.StepResponse({ applied: false });
|
|
79
|
+
}
|
|
80
|
+
// The item discount just introduced above changes item_total; settle
|
|
81
|
+
// so any other total-dependent automatic promotion (e.g. a
|
|
82
|
+
// free-shipping threshold) re-evaluates against the now-accurate cart
|
|
83
|
+
// instead of the pre-discount snapshot this same call started from.
|
|
84
|
+
await (0, settle_cart_promotions_1.settleCartPromotions)(container, cart.id);
|
|
85
|
+
}
|
|
86
|
+
return new workflows_sdk_1.StepResponse({ applied: true });
|
|
87
|
+
});
|
|
88
|
+
exports.applyAffiliateOwnOrderPromotionWorkflow = (0, workflows_sdk_1.createWorkflow)("apply-affiliate-own-order-promotion", (input) => new workflows_sdk_1.WorkflowResponse(applyAffiliateOwnOrderPromotionStep(input)));
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktb3duLW9yZGVyLXByb21vdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvYWZmaWxpYXRlL2FwcGx5LW93bi1vcmRlci1wcm9tb3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscUVBSzBDO0FBQzFDLHFEQUtrQztBQUNsQyw0REFBMEU7QUFFMUUsbUVBQXNFO0FBQ3RFLGlFQUFnRTtBQUNoRSwrRUFBeUU7QUFDekUsaUdBQWlHO0FBQ2pHLG1FQUdnQztBQWtCaEMsTUFBTSxtQ0FBbUMsR0FBRyxJQUFBLDBCQUFVLEVBQ3BELHFDQUFxQyxFQUNyQyxLQUFLLEVBQ0gsS0FBMkMsRUFDM0MsRUFBRSxTQUFTLEVBQUUsRUFDZ0MsRUFBRTtJQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUEsMENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3hDLGVBQU8sQ0FBQyxTQUFTLENBQ1MsQ0FBQTtJQUM1QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFO1lBQ04sSUFBSTtZQUNKLGFBQWE7WUFDYiwyQkFBMkI7WUFDM0IsNENBQTRDO1lBQzVDLGVBQWU7WUFDZixpQkFBaUI7U0FDbEI7UUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtLQUMvQixDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUE0QixDQUFBO0lBRS9DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sSUFBSSw0QkFB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
|