UNPKG

@unchainedshop/plugins

Version:

Official plugin collection for the Unchained Engine with payment, delivery, and pricing adapters

70 lines (69 loc) 3.13 kB
import { calculation as calcUtils } from '@unchainedshop/utils'; import { ProductPricingDirector, ProductPricingAdapter, ProductPricingRowCategory, } from '@unchainedshop/core'; export const ProductDiscount = { ...ProductPricingAdapter, key: 'shop.unchained.pricing.product-discount', version: '1.0.0', label: 'Apply Discounts on Product Price', orderIndex: 30, isActivatedFor: () => { return true; }, actions: (params) => { const pricingAdapter = ProductPricingAdapter.actions(params); const addDiscounts = (discount, total, resolvedConfiguration) => { const { discountId } = discount; const { isNetPrice = false, taxRate, ...meta } = resolvedConfiguration; const amount = calcUtils.applyRate(resolvedConfiguration, total); const isTaxable = taxRate === undefined || taxRate === null; pricingAdapter.resultSheet().addDiscount({ amount: amount * -1, discountId, isNetPrice, isTaxable, meta: { adapter: ProductDiscount.key, ...meta }, }); if (!isTaxable && taxRate) { const taxAmount = calcUtils.getTaxAmount(amount, taxRate, isNetPrice); pricingAdapter.resultSheet().addTax({ amount: taxAmount * -1, rate: taxRate, discountId, baseCategory: ProductPricingRowCategory.Discount, meta: { adapter: ProductDiscount.key, discountId, ...meta }, }); if (!isNetPrice) { pricingAdapter.resultSheet().addDiscount({ amount: taxAmount, discountId, isNetPrice: false, isTaxable: false, meta: { adapter: ProductDiscount.key, discountId, ...meta }, }); } } }; return { ...pricingAdapter, calculate: async () => { params.discounts.forEach((discount) => { if (!discount) return; const { configuration } = discount; const resolvedConfiguration = configuration.customPriceConfigurationResolver ? configuration.customPriceConfigurationResolver(params.context.product, params.context.quantity, params.context.configuration) : configuration; if (!resolvedConfiguration) return; const total = params.calculationSheet.total({ category: ProductPricingRowCategory.Item, useNetPrice: resolvedConfiguration.isNetPrice, }); addDiscounts(discount, total.amount, resolvedConfiguration); }); return pricingAdapter.calculate(); }, }; }, }; ProductPricingDirector.registerAdapter(ProductDiscount);