@devx-commerce/plugin-loyalty
Version:
A starter for Medusa plugins.
64 lines • 6.41 kB
JavaScript
;
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