申请加拿大的折扣和免税计算

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 美元 税收将是?

这是一种方法:

  1. 按价格排序,最贵的排在最前面。
  2. 对排序列表中的项目应用折扣,直到没有折扣为止。
  3. 对该列表的价格求和以获得折扣后的小计。
  4. 将该列表中的应税项目的价格相加得到应税金额。
  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))