申请加拿大的折扣和免税计算
apply discount and exempt tax calculation for Canada
之前有人问过这个问题,但没有任何正确答案。问题是我正在为加拿大客户开发 POS 应用程序。我陷入税收计算中,无法找到解决方案。所以这是我的场景,我有 2 件物品,假设物品 1 = 10 美元,物品 2 = 2 美元。第 2 项免税意味着税项 (13%) 不适用于第 2 项,但在征税之前。我需要申请折扣,例如 5 美元。那么如何对我的总账单应用折扣并计算总税额。
我需要折扣后的税额。税收是 13%。
商品 1 是 10 美元
第 2 项是 2 美元(免税)
小计为 12 美元
折扣为 5 美元
税收将是?
这是一种方法:
- 按价格排序,最贵的排在最前面。
- 对排序列表中的项目应用折扣,直到没有折扣为止。
- 对该列表的价格求和以获得折扣后的小计。
- 将该列表中的应税项目的价格相加得到应税金额。
- 将税款应用于应税金额,并将其添加到小计中以获得总数。
const ITEMS = [
{ price: 2.00, taxExempt: true },
{ price: 10.00, taxExempt: false },
{ price: 8.25, taxExempt: false },
]
const DISCOUNT = 12
const TAX = 0.13
const applyDiscount = (items, discount) => {
// 1️⃣ sort by price, most expensive to least
items = items.slice().sort((a,b) => b.price - a.price)
// 2️⃣
return items.map(item => {
let price = item.price
const itemDiscount = Math.min(price, discount)
if (itemDiscount > 0) {
price -= itemDiscount
discount -= itemDiscount
}
return { ...item, price, origPrice: item.price, itemDiscount }
})
}
const itemsWithDiscount = applyDiscount(ITEMS, DISCOUNT)
const sumPrices = arr => arr.map(x => x.price).reduce((p,c) => p + c, 0)
const subtotal = sumPrices(itemsWithDiscount) // 3️⃣
const taxableAmt = sumPrices(itemsWithDiscount.filter(x => !x.taxExempt)) // 4️⃣
const total = subtotal + (taxableAmt * TAX) // 5️⃣
console.log('items after discount', itemsWithDiscount)
console.log('subtotal: $' + subtotal.toFixed(2) + ' (taxable: $' + taxableAmt.toFixed(2) + ')')
console.log('tax: $' + (taxableAmt * TAX).toFixed(2) + ' (' + (TAX * 100) + '%)')
console.log('total: $' + total.toFixed(2))
之前有人问过这个问题,但没有任何正确答案。问题是我正在为加拿大客户开发 POS 应用程序。我陷入税收计算中,无法找到解决方案。所以这是我的场景,我有 2 件物品,假设物品 1 = 10 美元,物品 2 = 2 美元。第 2 项免税意味着税项 (13%) 不适用于第 2 项,但在征税之前。我需要申请折扣,例如 5 美元。那么如何对我的总账单应用折扣并计算总税额。
我需要折扣后的税额。税收是 13%。
商品 1 是 10 美元 第 2 项是 2 美元(免税)
小计为 12 美元 折扣为 5 美元 税收将是?
这是一种方法:
- 按价格排序,最贵的排在最前面。
- 对排序列表中的项目应用折扣,直到没有折扣为止。
- 对该列表的价格求和以获得折扣后的小计。
- 将该列表中的应税项目的价格相加得到应税金额。
- 将税款应用于应税金额,并将其添加到小计中以获得总数。
const ITEMS = [
{ price: 2.00, taxExempt: true },
{ price: 10.00, taxExempt: false },
{ price: 8.25, taxExempt: false },
]
const DISCOUNT = 12
const TAX = 0.13
const applyDiscount = (items, discount) => {
// 1️⃣ sort by price, most expensive to least
items = items.slice().sort((a,b) => b.price - a.price)
// 2️⃣
return items.map(item => {
let price = item.price
const itemDiscount = Math.min(price, discount)
if (itemDiscount > 0) {
price -= itemDiscount
discount -= itemDiscount
}
return { ...item, price, origPrice: item.price, itemDiscount }
})
}
const itemsWithDiscount = applyDiscount(ITEMS, DISCOUNT)
const sumPrices = arr => arr.map(x => x.price).reduce((p,c) => p + c, 0)
const subtotal = sumPrices(itemsWithDiscount) // 3️⃣
const taxableAmt = sumPrices(itemsWithDiscount.filter(x => !x.taxExempt)) // 4️⃣
const total = subtotal + (taxableAmt * TAX) // 5️⃣
console.log('items after discount', itemsWithDiscount)
console.log('subtotal: $' + subtotal.toFixed(2) + ' (taxable: $' + taxableAmt.toFixed(2) + ')')
console.log('tax: $' + (taxableAmt * TAX).toFixed(2) + ' (' + (TAX * 100) + '%)')
console.log('total: $' + total.toFixed(2))