@unchainedshop/plugins
Version:
Because of a Typescript issue with upstream "postfinancecheckout", the Postfinance plugin has been disabled from transpilation, import the source ts files from src and enable node_module tsc or copy over the src/payment/postfinance-checkout to your projec
90 lines (74 loc) • 2.93 kB
text/typescript
import {
DeliveryPricingRowCategory,
IDeliveryPricingAdapter,
DeliveryPricingAdapter,
DeliveryPricingDirector,
} from '@unchainedshop/core';
import { Order } from '@unchainedshop/core-orders';
import { DeliveryProvider } from '@unchainedshop/core-delivery';
import { SwissTaxCategories } from './tax/ch.js';
const getTaxRate = ({ order, provider }: { order?: Order; provider?: DeliveryProvider }) => {
const taxCategoryFromProvider = provider?.configuration?.find(({ key }) => {
if (key === 'swiss-tax-category') return true;
return null;
})?.value;
const taxCategory = SwissTaxCategories[taxCategoryFromProvider] || SwissTaxCategories.DEFAULT;
return taxCategory.rate(order?.ordered);
};
const isDeliveryAddressInSwitzerland = ({ orderDelivery, order, country = null }) => {
let countryCode = country?.toUpperCase().trim() || order.countryCode;
const address = orderDelivery?.context?.address || order?.billingAddress;
if (address?.countryCode > '') {
countryCode = address.countryCode?.toUpperCase().trim();
}
return countryCode === 'CH' || countryCode === 'LI';
};
export const DeliverySwissTax: IDeliveryPricingAdapter = {
...DeliveryPricingAdapter,
key: 'shop.unchained.pricing.delivery-swiss-tax',
version: '1.0.0',
label: 'Apply Swiss Tax on Delivery Fees',
orderIndex: 80,
isActivatedFor: (context) => {
return isDeliveryAddressInSwitzerland(context);
},
actions: (params) => {
const pricingAdapter = DeliveryPricingAdapter.actions(params);
const { context } = params;
return {
...pricingAdapter,
calculate: async () => {
const taxRate = getTaxRate(context);
DeliveryPricingAdapter.log(`DeliverySwissTax -> Tax Multiplicator: ${taxRate}`);
params.calculationSheet.filterBy({ isTaxable: true }).forEach(({ isNetPrice, ...row }) => {
if (!isNetPrice) {
const taxAmount = row.amount - row.amount / (1 + taxRate);
pricingAdapter.resultSheet().calculation.push({
...row,
amount: -taxAmount,
isTaxable: false,
isNetPrice: false,
meta: { adapter: DeliverySwissTax.key },
});
pricingAdapter.resultSheet().addTax({
amount: taxAmount,
rate: taxRate,
baseCategory: DeliveryPricingRowCategory.Delivery,
meta: { adapter: DeliverySwissTax.key },
});
} else {
const taxAmount = row.amount * taxRate;
pricingAdapter.resultSheet().addTax({
amount: taxAmount,
rate: taxRate,
baseCategory: DeliveryPricingRowCategory.Delivery,
meta: { adapter: DeliverySwissTax.key },
});
}
});
return pricingAdapter.calculate();
},
};
},
};
DeliveryPricingDirector.registerAdapter(DeliverySwissTax);