@unchainedshop/plugins
Version:
Official plugin collection for the Unchained Engine with payment, delivery, and pricing adapters
51 lines (50 loc) • 2.49 kB
JavaScript
import { ProductPricingSheet, OrderPricingDirector, OrderPricingAdapter, OrderPricingRowCategory, resolveRatioAndTaxDivisorForPricingSheet, } from '@unchainedshop/core';
import { calculation as calcUtils } from '@unchainedshop/utils';
export const OrderItemsDiscount = {
...OrderPricingAdapter,
key: 'shop.unchained.pricing.order-items-discount',
version: '1.0.0',
label: 'Apply Discounts on Total Value Of Goods',
orderIndex: 30,
isActivatedFor: () => {
return true;
},
actions: (params) => {
const pricingAdapter = OrderPricingAdapter.actions(params);
const { order, orderPositions } = params.context;
return {
...pricingAdapter,
calculate: async () => {
const totalAmountOfItems = params.calculationSheet.total({
category: OrderPricingRowCategory.Items,
useNetPrice: false,
}).amount;
const itemShares = orderPositions.map((orderPosition) => resolveRatioAndTaxDivisorForPricingSheet(ProductPricingSheet({
calculation: orderPosition.calculation,
currencyCode: order.currencyCode,
quantity: orderPosition.quantity,
}), totalAmountOfItems));
let amountLeft = totalAmountOfItems;
params.discounts.forEach(({ configuration, discountId }) => {
const leftInItemsToSplit = calcUtils.calculateAmountToSplit({ ...configuration }, totalAmountOfItems);
const [itemsDiscountAmount, itemsTaxAmount] = calcUtils.applyDiscountToMultipleShares(itemShares, Math.max(0, Math.min(amountLeft, leftInItemsToSplit)));
amountLeft -= itemsDiscountAmount;
const discountAmount = itemsDiscountAmount * -1;
const taxAmount = itemsTaxAmount * -1;
if (discountAmount) {
pricingAdapter.resultSheet().addDiscount({
amount: discountAmount,
taxAmount,
discountId,
meta: {
adapter: OrderItemsDiscount.key,
},
});
}
});
return pricingAdapter.calculate();
},
};
},
};
OrderPricingDirector.registerAdapter(OrderItemsDiscount);