UNPKG

@unchainedshop/plugins

Version:

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

54 lines (53 loc) 2.54 kB
import { ProductPricingDirector, ProductPricingAdapter, } from '@unchainedshop/core'; export const ProductPriceRateConversion = { ...ProductPricingAdapter, key: 'shop.unchained.pricing.rate-conversion', version: '1.0.0', label: 'Generic rate conversion plugin that converts between rates if entry in DB exists.', orderIndex: 10, isActivatedFor: () => { return true; }, actions: (params) => { const pricingAdapter = ProductPricingAdapter.actions(params); const { modules } = params.context; return { ...pricingAdapter, calculate: async () => { const { product, countryCode, quantity, currencyCode: targetCurrency } = params.context; const { calculation = [] } = params.calculationSheet; if (calculation?.length) { return pricingAdapter.calculate(); } const productPrice = await modules.products.prices.price(product, { countryCode, quantity, }); if (!productPrice) { return pricingAdapter.calculate(); } const fromCurrencyObj = await modules.currencies.findCurrency({ isoCode: productPrice.currencyCode, }); const targetCurrencyObj = await modules.currencies.findCurrency({ isoCode: targetCurrency, }); if (!targetCurrencyObj?.isActive || !fromCurrencyObj?.isActive) return pricingAdapter.calculate(); const rateData = await modules.products.prices.rates.getRate(fromCurrencyObj, targetCurrencyObj); if (rateData && rateData.rate > 0) { const convertedAmount = Math.round(productPrice.amount * rateData.rate); pricingAdapter.resultSheet().resetCalculation(params.calculationSheet); pricingAdapter.resultSheet().addItem({ amount: convertedAmount * quantity, isTaxable: Boolean(productPrice?.isTaxable), isNetPrice: Boolean(productPrice?.isNetPrice), meta: { adapter: ProductPriceRateConversion.key, rate: rateData.rate }, }); } return pricingAdapter.calculate(); }, }; }, }; ProductPricingDirector.registerAdapter(ProductPriceRateConversion);