@unchainedshop/plugins
Version:
Official plugin collection for the Unchained Engine with payment, delivery, and pricing adapters
54 lines (53 loc) • 2.54 kB
JavaScript
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);