@fabrix/spool-cart
Version:
Spool - eCommerce Spool for Fabrix
77 lines (76 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const spool_generics_1 = require("@fabrix/spool-generics");
class DefaultTaxProvider extends spool_generics_1.Generic {
getRate(data) {
return Promise.resolve({
amount: 0,
rate: 0.0,
title: 'Sales Tax',
tax_details: {}
});
}
taxForOrder(data) {
const app = this.app;
const Country = app.models['Country'];
const Province = app.models['Province'];
return Promise.resolve()
.then(() => {
return Province.sequelize.Promise.mapSeries(data.nexus_addresses, nexus => {
return Province.findOne({
where: {
code: nexus.province_code
},
attributes: ['id', 'code', 'tax_name', 'tax_type', 'tax_rate', 'tax_percentage'],
include: [
{
model: Country.instance,
attributes: ['id', 'code', 'tax_name', 'tax_rate', 'tax_percentage'],
where: {
code: nexus.country_code
}
}
]
});
});
})
.then((nexusProvinces) => {
nexusProvinces = nexusProvinces.filter(n => n);
if (data.to_address && nexusProvinces.some(p => p.code === data.to_address.province_code)) {
this.app.log.debug('HAS NEXUS TAXES:', data.to_address.province_code);
const nexus = nexusProvinces.find(p => p.code === data.to_address.province_code);
const taxLines = [];
let totalTaxes = 0;
const lineItems = data.line_items.map(item => {
const calc = nexus.tax_type === 'rate' ?
item.calculated_price + nexus.tax_rate
: Math.round(item.calculated_price * nexus.tax_percentage);
item.tax_lines = [
{
name: nexus.tax_name,
price: calc
}
];
item.total_taxes = calc;
return item;
});
lineItems.forEach(item => {
totalTaxes = totalTaxes + item.total_taxes;
taxLines.push(item.tax_lines[0]);
});
return Promise.resolve({
tax_lines: taxLines,
line_items: lineItems
});
}
else {
return {
line_items: data.line_items,
tax_lines: [],
total_taxes: 0
};
}
});
}
}
exports.DefaultTaxProvider = DefaultTaxProvider;