UNPKG

@devx-commerce/plugin-loyalty

Version:

A starter for Medusa plugins.

64 lines 6.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateAmountFromPoints = exports.csvCell = exports.formatIN = exports.LOYALTY_PROMOTION_CODE_PREFIX = exports.CUSTOMER_ID_PROMOTION_RULE_ATTRIBUTE = void 0; exports.getCartLoyaltyPromotion = getCartLoyaltyPromotion; exports.orderHasLoyaltyPromotion = orderHasLoyaltyPromotion; exports.getReferralCodeFromOrder = getReferralCodeFromOrder; exports.isReferralAlreadyUsed = isReferralAlreadyUsed; exports.CUSTOMER_ID_PROMOTION_RULE_ATTRIBUTE = "customer_id"; exports.LOYALTY_PROMOTION_CODE_PREFIX = "LOYALTY-"; function getCartLoyaltyPromotion(cart) { // Ensure promotions is an array if (!Array.isArray(cart?.promotions)) { console.warn("Cart promotions is not an array:", cart?.promotions); return; } // Resolve from the promotions actually on the cart rather than from // `metadata.loyalty_promo_id`. `refreshLoyaltyWorkflow` removes and re-creates // the loyalty promotion on every cart refresh, so the metadata id goes stale // whenever a refresh lands after the last apply — leaving it pointing at a // detached promotion. Matching on the id then returns undefined and callers // silently treat the cart as having no loyalty (skipping the points debit). const loyaltyPromotions = cart.promotions.filter((promotion) => promotion?.code?.startsWith(exports.LOYALTY_PROMOTION_CODE_PREFIX)); if (loyaltyPromotions.length <= 1) { return loyaltyPromotions[0]; } // A cart should only ever carry one loyalty promotion. If several are somehow // live, prefer the one metadata points at, else the newest — promotion ids are // ULIDs, so sorting them lexicographically orders by creation time. Either way // the choice is deterministic rather than array-order dependent. return (loyaltyPromotions.find((promotion) => promotion.id === cart?.metadata?.loyalty_promo_id) ?? [...loyaltyPromotions].sort((a, b) => b.id.localeCompare(a.id))[0]); } function orderHasLoyaltyPromotion(order) { const loyaltyPromotion = getCartLoyaltyPromotion(order.cart); return (loyaltyPromotion?.rules?.some((rule) => { return (rule?.attribute === exports.CUSTOMER_ID_PROMOTION_RULE_ATTRIBUTE && (rule?.values?.some((value) => value.value === order.customer?.id) || false)); }) || false); } function getReferralCodeFromOrder(order) { return order.cart?.metadata?.referral_code; } function isReferralAlreadyUsed(wallet, code) { if (!wallet.used_referrals) { return false; } return wallet.used_referrals.includes(code); } const formatIN = (n) => new Intl.NumberFormat("en-IN").format(n); exports.formatIN = formatIN; const csvCell = (n) => { const formatted = (0, exports.formatIN)(n); return formatted.includes(",") ? `"${formatted}"` : formatted; }; exports.csvCell = csvCell; const calculateAmountFromPoints = (points, pointsPerRupee) => { if (!pointsPerRupee) { return points; } const amount = Math.floor(points / pointsPerRupee); return amount > 0 ? amount : 0; }; exports.calculateAmountFromPoints = calculateAmountFromPoints; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL2hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5QkEsMERBZ0NDO0FBRUQsNERBYUM7QUFFRCw0REFFQztBQUVELHNEQU1DO0FBL0RZLFFBQUEsb0NBQW9DLEdBQUcsYUFBYSxDQUFDO0FBRXJELFFBQUEsNkJBQTZCLEdBQUcsVUFBVSxDQUFDO0FBRXhELFNBQWdCLHVCQUF1QixDQUNyQyxJQUFjO0lBRWQsZ0NBQWdDO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLE9BQU87SUFDVCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLCtFQUErRTtJQUMvRSw2RUFBNkU7SUFDN0UsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSw0RUFBNEU7SUFDNUUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzdELFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLHFDQUE2QixDQUFDLENBQzNELENBQUM7SUFFRixJQUFJLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsK0VBQStFO0lBQy9FLCtFQUErRTtJQUMvRSxpRUFBaUU7SUFDakUsT0FBTyxDQUNMLGlCQUFpQixDQUFDLElBQUksQ0FDcEIsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FDakUsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDeEUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxLQUFnQjtJQUN2RCxNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUM5QyxLQUFLLENBQUMsSUFBMkIsQ0FDbEMsQ0FBQztJQUNGLE9BQU8sQ0FDTCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDckMsT0FBTyxDQUNMLElBQUksRUFBRSxTQUFTLEtBQUssNENBQW9DO1lBQ3hELENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7Z0JBQ2hFLEtBQUssQ0FBQyxDQUNULENBQUM7SUFDSixDQUFDLENBQUMsSUFBSSxLQUFLLENBQ1osQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxLQUFnQjtJQUN2RCxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQW1DLENBQUM7QUFDbkUsQ0FBQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJO0lBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRU0sTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUM1QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRDlCLFFBQUEsUUFBUSxZQUNzQjtBQUVwQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFO0lBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUEsZ0JBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoRSxDQUFDLENBQUM7QUFIVyxRQUFBLE9BQU8sV0FHbEI7QUFFSyxNQUFNLHlCQUF5QixHQUFHLENBQ3ZDLE1BQWMsRUFDZCxjQUF1QixFQUN2QixFQUFFO0lBQ0YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQztJQUNuRCxPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQztBQVZXLFFBQUEseUJBQXlCLDZCQVVwQyJ9