@hartl-services/medusa-base 4.0.0 → 5.0.1

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.
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setFreeShippingPromotionContext = 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 lib_1 = require("../../shared/lib");
8
+ const plugin_features_1 = require("../../free-shipping/plugin-features");
9
+ const free_shipping_settings_1 = require("../../free-shipping/free-shipping-settings");
10
+ const sync_free_shipping_promotions_1 = require("../free-shipping/sync-free-shipping-promotions");
11
+ const declaredBooleanDefault = (key) => plugin_features_1.freeShippingPluginFeatures.settings?.find((setting) => setting.key === key)
12
+ ?.default === true;
13
+ /** The descriptor's defaults: account holders on, referred customers off. */
14
+ const DECLARED_DEFAULT_AFFILIATE_RULES = {
15
+ affiliate_applies_to_account_holders: declaredBooleanDefault("affiliate_applies_to_account_holders"),
16
+ affiliate_applies_to_referred_customers: declaredBooleanDefault("affiliate_applies_to_referred_customers"),
17
+ };
18
+ /** Last successfully read rules of this process (null until the first read). */
19
+ let lastKnownAffiliateRules = null;
20
+ /**
21
+ * This hook runs in every cart-promotion computation, so a failing settings
22
+ * read must not fail the cart. It is reported (`logger.error`, which the base
23
+ * plugin's logger wrapper forwards to Sentry) and the cart is computed with
24
+ * the last rules this process read successfully, or with the declared
25
+ * defaults when there are none yet. That keeps affiliate carts on the
26
+ * affiliate threshold instead of silently moving them to the standard one.
27
+ */
28
+ const readAffiliateRules = async (container, cartId) => {
29
+ try {
30
+ const settings = await (0, free_shipping_settings_1.resolveFreeShippingSettings)(container);
31
+ lastKnownAffiliateRules = {
32
+ affiliate_applies_to_account_holders: settings.affiliate_applies_to_account_holders,
33
+ affiliate_applies_to_referred_customers: settings.affiliate_applies_to_referred_customers,
34
+ };
35
+ return settings;
36
+ }
37
+ catch (error) {
38
+ const fallback = lastKnownAffiliateRules;
39
+ try {
40
+ container
41
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
42
+ .error(`Free-shipping settings could not be read for cart ${cartId}; computing the promotion context with the ${fallback ? "last known" : "default"} affiliate rules.`, error instanceof Error ? error : new Error(String(error)));
43
+ }
44
+ catch {
45
+ // A missing logger must not turn the fail-safe itself into a failure.
46
+ }
47
+ return fallback ?? DECLARED_DEFAULT_AFFILIATE_RULES;
48
+ }
49
+ };
50
+ /**
51
+ * Computes whether the cart qualifies for the affiliate free-shipping
52
+ * threshold, so the two automatic promotions (whose rules are static, see
53
+ * `sync-free-shipping-promotions.ts`) can tell them apart at evaluation
54
+ * time. Which criteria count as "affiliate" is controlled entirely by the
55
+ * two boolean settings - no promotion resync is needed when they change,
56
+ * only this computation.
57
+ */
58
+ const setFreeShippingPromotionContext = async ({ cart }, { container }) => {
59
+ const typedCart = cart;
60
+ let qualifies = false;
61
+ if (typedCart.customer_id) {
62
+ // The Affiliate plugin is optional: without it no cart qualifies.
63
+ const affiliateService = (0, lib_1.tryResolveOptional)(container, "affiliate");
64
+ if (affiliateService) {
65
+ const settings = await readAffiliateRules(container, typedCart.id);
66
+ if (settings.affiliate_applies_to_account_holders) {
67
+ qualifies = await affiliateService.isCustomerAffiliate(typedCart.customer_id);
68
+ }
69
+ if (!qualifies && settings.affiliate_applies_to_referred_customers) {
70
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
71
+ const state = await affiliateService.inspectAffiliateCartReferralForCheckout({
72
+ cart_id: typedCart.id,
73
+ customer_id: typedCart.customer_id,
74
+ normalized_email: (0, lib_1.normalizeEmail)(typedCart.email),
75
+ }, query);
76
+ qualifies = state.assignment !== null;
77
+ }
78
+ }
79
+ }
80
+ return new workflows_sdk_1.StepResponse({
81
+ [sync_free_shipping_promotions_1.AFFILIATE_QUALIFICATION_ATTRIBUTE]: qualifies ? "true" : "false",
82
+ });
83
+ };
84
+ exports.setFreeShippingPromotionContext = setFreeShippingPromotionContext;
85
+ core_flows_1.updateCartPromotionsWorkflow.hooks.setPromotionContext(exports.setFreeShippingPromotionContext);
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWZyZWUtc2hpcHBpbmctcHJvbW90aW9uLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2hvb2tzL3NldC1mcmVlLXNoaXBwaW5nLXByb21vdGlvbi1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUFnRTtBQUNoRSxxREFBcUU7QUFFckUsNERBQTBFO0FBQzFFLDBDQUFxRTtBQUVyRSx5RUFBZ0Y7QUFDaEYsdUZBR21EO0FBQ25ELGtHQUFrRztBQTJCbEcsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQXlCLEVBQVcsRUFBRSxDQUNwRSw0Q0FBMEIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQztJQUN6RSxFQUFFLE9BQU8sS0FBSyxJQUFJLENBQUE7QUFFdEIsNkVBQTZFO0FBQzdFLE1BQU0sZ0NBQWdDLEdBQW1CO0lBQ3ZELG9DQUFvQyxFQUFFLHNCQUFzQixDQUMxRCxzQ0FBc0MsQ0FDdkM7SUFDRCx1Q0FBdUMsRUFBRSxzQkFBc0IsQ0FDN0QseUNBQXlDLENBQzFDO0NBQ0YsQ0FBQTtBQUVELGdGQUFnRjtBQUNoRixJQUFJLHVCQUF1QixHQUEwQixJQUFJLENBQUE7QUFFekQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUM5QixTQUEwQixFQUMxQixNQUFjLEVBQ1csRUFBRTtJQUMzQixJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsb0RBQTJCLEVBQUMsU0FBUyxDQUFDLENBQUE7UUFDN0QsdUJBQXVCLEdBQUc7WUFDeEIsb0NBQW9DLEVBQ2xDLFFBQVEsQ0FBQyxvQ0FBb0M7WUFDL0MsdUNBQXVDLEVBQ3JDLFFBQVEsQ0FBQyx1Q0FBdUM7U0FDbkQsQ0FBQTtRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUE7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsU0FBUztpQkFDTixPQUFPLENBQVMsaUNBQXlCLENBQUMsTUFBTSxDQUFDO2lCQUNqRCxLQUFLLENBQ0oscURBQXFELE1BQU0sOENBQ3pELFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUM1QixtQkFBbUIsRUFDbkIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDMUQsQ0FBQTtRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxzRUFBc0U7UUFDeEUsQ0FBQztRQUNELE9BQU8sUUFBUSxJQUFJLGdDQUFnQyxDQUFBO0lBQ3JELENBQUM7QUFDSCxDQUFDLENBQUE7QUFRRDs7Ozs7OztHQU9HO0FBQ0ksTUFBTSwrQkFBK0IsR0FFckMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQXFCLENBQUE7SUFDdkMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFBO0lBRXJCLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLGtFQUFrRTtRQUNsRSxNQUFNLGdCQUFnQixHQUFHLElBQUEsd0JBQWtCLEVBQ3pDLFNBQVMsRUFDVCxXQUFXLENBQ1osQ0FBQTtRQUVELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFrQixDQUN2QyxTQUE0QixFQUM1QixTQUFTLENBQUMsRUFBRSxDQUNiLENBQUE7WUFFRCxJQUFJLFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxDQUFDO2dCQUNsRCxTQUFTLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FDcEQsU0FBUyxDQUFDLFdBQVcsQ0FDdEIsQ0FBQTtZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRSxDQUFDO2dCQUNuRSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNoRSxNQUFNLEtBQUssR0FDVCxNQUFNLGdCQUFnQixDQUFDLHVDQUF1QyxDQUM1RDtvQkFDRSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUU7b0JBQ3JCLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztvQkFDbEMsZ0JBQWdCLEVBQUUsSUFBQSxvQkFBYyxFQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7aUJBQ2xELEVBQ0QsS0FBSyxDQUNOLENBQUE7Z0JBQ0gsU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFBO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDO1FBQ3RCLENBQUMsaUVBQWlDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTztLQUNsRSxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUE1Q1ksUUFBQSwrQkFBK0IsbUNBNEMzQztBQUVELHlDQUE0QixDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FDcEQsdUNBQStCLENBQ2hDLENBQUEifQ==