@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
75 lines • 3.49 kB
JavaScript
import { ProductPricingDirector, ProductPricingAdapter, ProductPricingRowCategory, } from '@unchainedshop/core';
import { SwissTaxCategories } from './tax/ch.js';
export const getTaxRate = (context) => {
const { product, order } = context;
const productSpecialTaxTag = product.tags?.find((tag) => tag?.trim().toLowerCase().startsWith('swiss-tax-category:'));
const taxCategory = Object.values(SwissTaxCategories).find((t) => `swiss-tax-category:${t.value}` === productSpecialTaxTag?.trim().toLowerCase()) || SwissTaxCategories.DEFAULT;
return taxCategory.rate(order?.ordered);
};
export const isDeliveryAddressInSwitzerland = async ({ order, country, modules, }) => {
let countryCode = country?.toUpperCase().trim();
if (order) {
const orderDelivery = await modules.orders.deliveries.findDelivery({
orderDeliveryId: order.deliveryId,
});
const address = orderDelivery?.context?.address || order.billingAddress;
if (address?.countryCode > '') {
countryCode = address.countryCode?.toUpperCase().trim();
}
}
return countryCode === 'CH' || countryCode === 'LI';
};
export const ProductSwissTax = {
...ProductPricingAdapter,
key: 'shop.unchained.pricing.product-swiss-tax',
version: '1.0.0',
label: 'Apply Swiss Tax on Product',
orderIndex: 80,
isActivatedFor: () => {
return true;
},
actions: (params) => {
const pricingAdapter = ProductPricingAdapter.actions(params);
const { context } = params;
return {
...pricingAdapter,
calculate: async () => {
if (!(await isDeliveryAddressInSwitzerland(context))) {
return pricingAdapter.calculate();
}
const taxRate = getTaxRate(context);
ProductPricingAdapter.log(`ProductSwissTax -> 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: ProductSwissTax.key },
});
pricingAdapter.resultSheet().addTax({
amount: taxAmount,
rate: taxRate,
baseCategory: ProductPricingRowCategory.Item,
meta: { adapter: ProductSwissTax.key },
});
}
else {
const taxAmount = row.amount * taxRate;
pricingAdapter.resultSheet().addTax({
amount: taxAmount,
rate: taxRate,
baseCategory: ProductPricingRowCategory.Item,
meta: { adapter: ProductSwissTax.key },
});
}
});
return pricingAdapter.calculate();
},
};
},
};
ProductPricingDirector.registerAdapter(ProductSwissTax);
//# sourceMappingURL=product-swiss-tax.js.map