fix(utils,core-flows): subtotal calculation and returns location (#13497)
* fix(utils,core-flows): subtotal calculation and returns location * changeset * fix test * var * rm extra field from test * fix original total * fix partial refunds and pending difference * fix test * fix test * test * extract to util * original total and update payment when receive return * original_subtotal * default fields * test * calculate pending difference * revert claims test * pending difference * creadit line fix * if
This commit is contained in:
committed by
GitHub
parent
4736c58da5
commit
9563ee446f
@@ -41,6 +41,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 60,
|
||||
total: 66,
|
||||
original_total: 66,
|
||||
original_subtotal: 60,
|
||||
discount_total: 0,
|
||||
discount_subtotal: 0,
|
||||
discount_tax_total: 0,
|
||||
@@ -60,6 +61,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 5,
|
||||
total: 7.5,
|
||||
original_total: 7.5,
|
||||
original_subtotal: 5,
|
||||
discount_total: 0,
|
||||
discount_subtotal: 0,
|
||||
discount_tax_total: 0,
|
||||
@@ -78,6 +80,7 @@ describe("Total calculation", function () {
|
||||
item_tax_total: 8.5,
|
||||
item_discount_total: 0,
|
||||
original_total: 73.5,
|
||||
original_subtotal: 65,
|
||||
original_tax_total: 8.5,
|
||||
original_item_subtotal: 65,
|
||||
original_item_total: 73.5,
|
||||
@@ -132,6 +135,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 100,
|
||||
total: 99,
|
||||
original_total: 110,
|
||||
original_subtotal: 100,
|
||||
discount_total: 11,
|
||||
discount_subtotal: 10,
|
||||
discount_tax_total: 1,
|
||||
@@ -146,6 +150,7 @@ describe("Total calculation", function () {
|
||||
discount_subtotal: 10,
|
||||
discount_tax_total: 1,
|
||||
original_total: 110,
|
||||
original_subtotal: 100,
|
||||
original_tax_total: 10,
|
||||
item_total: 99,
|
||||
item_subtotal: 100,
|
||||
@@ -253,6 +258,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 90,
|
||||
total: 89.1,
|
||||
original_total: 99,
|
||||
original_subtotal: 90,
|
||||
discount_total: 9.9,
|
||||
discount_subtotal: 9,
|
||||
discount_tax_total: 0.9,
|
||||
@@ -280,6 +286,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 9,
|
||||
total: 6.6,
|
||||
original_total: 9.9,
|
||||
original_subtotal: 9,
|
||||
discount_total: 3.3,
|
||||
discount_subtotal: 3,
|
||||
discount_tax_total: 0.3,
|
||||
@@ -308,6 +315,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 90,
|
||||
total: 89.1,
|
||||
original_total: 99,
|
||||
original_subtotal: 90,
|
||||
discount_total: 9.9,
|
||||
discount_subtotal: 9,
|
||||
discount_tax_total: 0.9,
|
||||
@@ -334,6 +342,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 9,
|
||||
total: 6.6,
|
||||
original_total: 9.9,
|
||||
original_subtotal: 9,
|
||||
discount_total: 3.3,
|
||||
discount_subtotal: 3,
|
||||
discount_tax_total: 0.3,
|
||||
@@ -348,6 +357,7 @@ describe("Total calculation", function () {
|
||||
discount_subtotal: 24,
|
||||
discount_tax_total: 2.4,
|
||||
original_total: 217.8,
|
||||
original_subtotal: 198,
|
||||
original_tax_total: 19.8,
|
||||
item_total: 95.7,
|
||||
item_subtotal: 99,
|
||||
@@ -431,6 +441,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 90.9090909090909,
|
||||
total: 100,
|
||||
original_total: 100,
|
||||
original_subtotal: 90.9090909090909,
|
||||
discount_total: 0,
|
||||
discount_tax_total: 0,
|
||||
tax_total: 9.090909090909092,
|
||||
@@ -444,6 +455,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 0,
|
||||
discount_tax_total: 0,
|
||||
original_total: 100,
|
||||
original_subtotal: 90.9090909090909,
|
||||
original_tax_total: 9.090909090909092,
|
||||
item_total: 100,
|
||||
item_subtotal: 90.9090909090909,
|
||||
@@ -478,6 +490,7 @@ describe("Total calculation", function () {
|
||||
discount_tax_total: 0,
|
||||
tax_total: 10,
|
||||
original_tax_total: 10,
|
||||
original_subtotal: 100,
|
||||
},
|
||||
],
|
||||
total: 110,
|
||||
@@ -487,6 +500,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 0,
|
||||
discount_tax_total: 0,
|
||||
original_total: 110,
|
||||
original_subtotal: 100,
|
||||
original_tax_total: 10,
|
||||
item_total: 110,
|
||||
item_subtotal: 100,
|
||||
@@ -516,6 +530,7 @@ describe("Total calculation", function () {
|
||||
],
|
||||
subtotal: 90.9090909090909,
|
||||
total: 100,
|
||||
original_subtotal: 90.9090909090909,
|
||||
original_total: 100,
|
||||
discount_total: 0,
|
||||
discount_tax_total: 0,
|
||||
@@ -537,6 +552,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 100,
|
||||
total: 110,
|
||||
original_total: 110,
|
||||
original_subtotal: 100,
|
||||
discount_total: 0,
|
||||
discount_tax_total: 0,
|
||||
tax_total: 10,
|
||||
@@ -550,6 +566,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 0,
|
||||
discount_tax_total: 0,
|
||||
original_total: 210,
|
||||
original_subtotal: 190.9090909090909,
|
||||
original_tax_total: 19.09090909090909,
|
||||
item_total: 210,
|
||||
item_subtotal: 190.9090909090909,
|
||||
@@ -606,6 +623,7 @@ describe("Total calculation", function () {
|
||||
is_tax_inclusive: true,
|
||||
|
||||
original_total: 120,
|
||||
original_subtotal: 100,
|
||||
original_tax_total: 20,
|
||||
|
||||
discount_subtotal: 8.333333333333334,
|
||||
@@ -637,6 +655,7 @@ describe("Total calculation", function () {
|
||||
original_item_total: 120,
|
||||
original_tax_total: 20,
|
||||
original_total: 120,
|
||||
original_subtotal: 100,
|
||||
|
||||
discount_subtotal: 8.333333333333334,
|
||||
discount_tax_total: 1.6666666666666667,
|
||||
@@ -712,6 +731,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 100,
|
||||
total: 88,
|
||||
original_total: 110,
|
||||
original_subtotal: 100,
|
||||
discount_total: 22,
|
||||
discount_subtotal: 20,
|
||||
discount_tax_total: 2,
|
||||
@@ -739,6 +759,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 25,
|
||||
total: 25.3,
|
||||
original_total: 27.5,
|
||||
original_subtotal: 25,
|
||||
discount_total: 2.2,
|
||||
discount_subtotal: 2,
|
||||
discount_tax_total: 0.2,
|
||||
@@ -753,6 +774,7 @@ describe("Total calculation", function () {
|
||||
discount_subtotal: 22,
|
||||
discount_tax_total: 2.2,
|
||||
original_total: 137.5,
|
||||
original_subtotal: 125,
|
||||
original_tax_total: 12.5,
|
||||
item_total: 88,
|
||||
item_subtotal: 100,
|
||||
@@ -836,8 +858,8 @@ describe("Total calculation", function () {
|
||||
tax_lines: [
|
||||
{
|
||||
rate: 10,
|
||||
total: 8,
|
||||
subtotal: 10,
|
||||
total: 0,
|
||||
subtotal: 0,
|
||||
},
|
||||
],
|
||||
adjustments: [
|
||||
@@ -847,14 +869,15 @@ describe("Total calculation", function () {
|
||||
total: 22,
|
||||
},
|
||||
],
|
||||
subtotal: 100,
|
||||
total: 88,
|
||||
original_total: 110,
|
||||
discount_total: 22,
|
||||
discount_subtotal: 20,
|
||||
discount_tax_total: 2,
|
||||
tax_total: 8,
|
||||
original_tax_total: 10,
|
||||
subtotal: 0,
|
||||
total: 0,
|
||||
original_total: 0,
|
||||
original_subtotal: 0,
|
||||
discount_total: 0,
|
||||
discount_subtotal: 0,
|
||||
discount_tax_total: 0,
|
||||
tax_total: 0,
|
||||
original_tax_total: 0,
|
||||
refundable_total_per_unit: 0,
|
||||
refundable_total: 0,
|
||||
fulfilled_total: 88,
|
||||
@@ -865,21 +888,22 @@ describe("Total calculation", function () {
|
||||
write_off_total: 44,
|
||||
},
|
||||
],
|
||||
total: 48,
|
||||
subtotal: 100,
|
||||
tax_total: 8,
|
||||
discount_total: 22,
|
||||
discount_subtotal: 20,
|
||||
discount_tax_total: 2,
|
||||
original_total: 110,
|
||||
original_tax_total: 10,
|
||||
item_total: 88,
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 8,
|
||||
item_discount_total: 22,
|
||||
original_item_total: 110,
|
||||
original_item_subtotal: 100,
|
||||
original_item_tax_total: 10,
|
||||
total: -40,
|
||||
subtotal: 0,
|
||||
tax_total: 0,
|
||||
discount_total: 0,
|
||||
discount_subtotal: 0,
|
||||
discount_tax_total: 0,
|
||||
original_total: 0,
|
||||
original_subtotal: 0,
|
||||
original_tax_total: 0,
|
||||
item_total: 0,
|
||||
item_subtotal: 0,
|
||||
item_tax_total: 0,
|
||||
item_discount_total: 0,
|
||||
original_item_total: 0,
|
||||
original_item_subtotal: 0,
|
||||
original_item_tax_total: 0,
|
||||
fulfilled_total: 88,
|
||||
shipped_total: 88,
|
||||
return_requested_total: 0,
|
||||
@@ -923,6 +947,7 @@ describe("Total calculation", function () {
|
||||
{
|
||||
rate: 19,
|
||||
subtotal: 22.61,
|
||||
total: 0,
|
||||
},
|
||||
],
|
||||
adjustments: [
|
||||
@@ -935,6 +960,7 @@ describe("Total calculation", function () {
|
||||
subtotal: 119,
|
||||
total: 0,
|
||||
original_total: 141.61,
|
||||
original_subtotal: 119,
|
||||
discount_total: 141.61,
|
||||
discount_subtotal: 119,
|
||||
discount_tax_total: 22.61,
|
||||
@@ -949,6 +975,7 @@ describe("Total calculation", function () {
|
||||
discount_subtotal: 119,
|
||||
discount_tax_total: 22.61,
|
||||
original_total: 141.61,
|
||||
original_subtotal: 119,
|
||||
original_tax_total: 22.61,
|
||||
item_total: 0,
|
||||
item_subtotal: 119,
|
||||
@@ -1026,6 +1053,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 0,
|
||||
is_tax_inclusive: true,
|
||||
original_tax_total: 19,
|
||||
original_subtotal: 100,
|
||||
original_total: 119,
|
||||
quantity: 1,
|
||||
subtotal: 100,
|
||||
@@ -1045,6 +1073,7 @@ describe("Total calculation", function () {
|
||||
original_item_tax_total: 19,
|
||||
original_item_total: 119,
|
||||
original_tax_total: 19,
|
||||
original_subtotal: 100,
|
||||
original_total: 119,
|
||||
subtotal: 100,
|
||||
tax_total: 19,
|
||||
@@ -1069,6 +1098,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 0,
|
||||
is_tax_inclusive: false,
|
||||
original_tax_total: 22.61,
|
||||
original_subtotal: 119,
|
||||
original_total: 141.61,
|
||||
quantity: 1,
|
||||
subtotal: 119,
|
||||
@@ -1088,6 +1118,7 @@ describe("Total calculation", function () {
|
||||
original_item_tax_total: 22.61,
|
||||
original_item_total: 141.61,
|
||||
original_tax_total: 22.61,
|
||||
original_subtotal: 119,
|
||||
original_total: 141.61,
|
||||
subtotal: 119,
|
||||
tax_total: 22.61,
|
||||
@@ -1113,6 +1144,7 @@ describe("Total calculation", function () {
|
||||
is_tax_inclusive: true,
|
||||
original_tax_total: 19,
|
||||
original_total: 119,
|
||||
original_subtotal: 100,
|
||||
quantity: 1,
|
||||
subtotal: 100,
|
||||
tax_lines: [
|
||||
@@ -1132,6 +1164,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 0,
|
||||
is_tax_inclusive: false,
|
||||
original_tax_total: 22.61,
|
||||
original_subtotal: 119,
|
||||
original_total: 141.61,
|
||||
quantity: 1,
|
||||
subtotal: 119,
|
||||
@@ -1150,6 +1183,7 @@ describe("Total calculation", function () {
|
||||
original_item_subtotal: 219,
|
||||
original_item_tax_total: 41.61,
|
||||
original_item_total: 260.61,
|
||||
original_subtotal: 219,
|
||||
original_tax_total: 41.61,
|
||||
original_total: 260.61,
|
||||
subtotal: 219,
|
||||
@@ -1206,6 +1240,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 119,
|
||||
is_tax_inclusive: true,
|
||||
original_tax_total: 19,
|
||||
original_subtotal: 100,
|
||||
original_total: 119,
|
||||
quantity: 1,
|
||||
subtotal: 100,
|
||||
@@ -1213,6 +1248,7 @@ describe("Total calculation", function () {
|
||||
{
|
||||
rate: 19,
|
||||
subtotal: 19,
|
||||
total: 0,
|
||||
},
|
||||
],
|
||||
tax_total: 0,
|
||||
@@ -1224,6 +1260,7 @@ describe("Total calculation", function () {
|
||||
original_item_tax_total: 19,
|
||||
original_item_total: 119,
|
||||
original_tax_total: 19,
|
||||
original_subtotal: 100,
|
||||
original_total: 119,
|
||||
subtotal: 100,
|
||||
tax_total: 0,
|
||||
|
||||
@@ -4,9 +4,11 @@ import { BigNumber } from "../big-number"
|
||||
import { MathBN } from "../math"
|
||||
|
||||
export function calculateAdjustmentTotal({
|
||||
item,
|
||||
adjustments,
|
||||
taxRate,
|
||||
}: {
|
||||
item?: { quantity: BigNumberInput }
|
||||
adjustments: Pick<AdjustmentLineDTO, "amount" | "is_tax_inclusive">[]
|
||||
taxRate?: BigNumberInput
|
||||
}) {
|
||||
@@ -40,9 +42,24 @@ export function calculateAdjustmentTotal({
|
||||
adj["total"] = new BigNumber(adjustmentsTotal)
|
||||
}
|
||||
|
||||
const quantity = item?.quantity || MathBN.convert(1)
|
||||
|
||||
let adjustmentPerItem = MathBN.convert(0)
|
||||
let adjustmentSubtotalPerItem = MathBN.convert(0)
|
||||
let adjustmentTaxTotalPerItem = MathBN.convert(0)
|
||||
|
||||
if (!MathBN.eq(quantity, 0)) {
|
||||
adjustmentPerItem = MathBN.div(adjustmentsTotal, quantity)
|
||||
adjustmentSubtotalPerItem = MathBN.div(adjustmentsSubtotal, quantity)
|
||||
adjustmentTaxTotalPerItem = MathBN.div(adjustmentsTaxTotal, quantity)
|
||||
}
|
||||
|
||||
return {
|
||||
adjustmentsTotal,
|
||||
adjustmentsSubtotal,
|
||||
adjustmentsTaxTotal,
|
||||
adjustmentPerItem,
|
||||
adjustmentSubtotalPerItem,
|
||||
adjustmentTaxTotalPerItem,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +101,8 @@ export function decorateCartTotals(
|
||||
let shippingDiscountTotal = MathBN.convert(0)
|
||||
|
||||
const cartItems = items.map((item, index) => {
|
||||
const itemTotals = Object.assign(item, itemsTotals[item.id ?? index] ?? {})
|
||||
const rawTotals = itemsTotals[item.id ?? index] ?? {}
|
||||
const itemTotals = Object.assign(item, rawTotals)
|
||||
const itemSubtotal = itemTotals.subtotal
|
||||
|
||||
const itemTotal = MathBN.convert(itemTotals.total)
|
||||
@@ -208,6 +209,10 @@ export function decorateCartTotals(
|
||||
|
||||
// TODO: Gift Card calculations
|
||||
const originalTotal = MathBN.add(itemsOriginalTotal, shippingOriginalTotal)
|
||||
const originalSubtotal = MathBN.add(
|
||||
itemsOriginalSubtotal,
|
||||
shippingOriginalSubtotal
|
||||
)
|
||||
|
||||
// TODO: subtract (cart.gift_card_total + cart.gift_card_tax_total)
|
||||
const tempTotal = MathBN.add(subtotal, taxTotal)
|
||||
@@ -231,6 +236,7 @@ export function decorateCartTotals(
|
||||
// cart.gift_card_tax_total = giftCardTotal.tax_total || 0
|
||||
|
||||
cart.original_total = new BigNumber(originalTotal)
|
||||
cart.original_subtotal = new BigNumber(originalSubtotal)
|
||||
cart.original_tax_total = new BigNumber(originalTaxTotal)
|
||||
|
||||
// cart.original_gift_card_total =
|
||||
@@ -264,5 +270,22 @@ export function decorateCartTotals(
|
||||
cart.original_shipping_total = new BigNumber(shippingOriginalTotal)
|
||||
}
|
||||
|
||||
// Calculate pending return total
|
||||
if (cart.summary) {
|
||||
const pendingReturnTotal = MathBN.sum(
|
||||
0,
|
||||
...(cart.items?.map((item) => item.return_requested_total ?? 0) ?? [0])
|
||||
)
|
||||
|
||||
const pendingDifference = new BigNumber(
|
||||
MathBN.sub(
|
||||
MathBN.sub(cart.total, pendingReturnTotal),
|
||||
cart.summary?.transaction_total ?? 0
|
||||
)
|
||||
)
|
||||
|
||||
cart.summary.pending_difference = pendingDifference
|
||||
}
|
||||
|
||||
return cart
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ export interface GetItemTotalOutput {
|
||||
unit_price: BigNumber
|
||||
|
||||
subtotal: BigNumber
|
||||
original_subtotal: BigNumber
|
||||
|
||||
total: BigNumber
|
||||
original_total: BigNumber
|
||||
@@ -76,8 +77,7 @@ export function getLineItemsTotals(
|
||||
function setRefundableTotal(
|
||||
item: GetItemTotalInput,
|
||||
discountsTotal: BigNumberInput,
|
||||
totals: GetItemTotalOutput,
|
||||
context: GetLineItemsTotalsContext
|
||||
totals: GetItemTotalOutput
|
||||
) {
|
||||
const itemDetail = item.detail!
|
||||
const totalReturnedQuantity = MathBN.sum(
|
||||
@@ -127,54 +127,107 @@ function getLineItemTotals(
|
||||
? MathBN.div(totalItemPrice, MathBN.add(1, sumTaxRate))
|
||||
: totalItemPrice
|
||||
|
||||
// Proportional discounts to current quantity and compute taxes on the current net amount
|
||||
const {
|
||||
adjustmentsTotal: discountsTotal,
|
||||
adjustmentsSubtotal: discountsSubtotal,
|
||||
adjustmentsTaxTotal: discountTaxTotal,
|
||||
adjustmentsSubtotal: discountsSubtotalFull,
|
||||
adjustmentSubtotalPerItem,
|
||||
} = calculateAdjustmentTotal({
|
||||
item,
|
||||
adjustments: item.adjustments || [],
|
||||
taxRate: sumTaxRate,
|
||||
})
|
||||
|
||||
const itemDetail = item.detail!
|
||||
const totalReturnedQuantity = MathBN.sum(
|
||||
itemDetail?.return_received_quantity ?? 0,
|
||||
itemDetail?.return_dismissed_quantity ?? 0
|
||||
)
|
||||
|
||||
const currentQuantity = MathBN.sub(item.quantity, totalReturnedQuantity)
|
||||
const currentTotalItemPrice = MathBN.mult(item.unit_price, currentQuantity)
|
||||
const currentSubtotal = isTaxInclusive
|
||||
? MathBN.div(currentTotalItemPrice, MathBN.add(1, sumTaxRate))
|
||||
: currentTotalItemPrice
|
||||
|
||||
const currentDiscountsSubtotal = MathBN.mult(
|
||||
adjustmentSubtotalPerItem ?? 0,
|
||||
currentQuantity
|
||||
)
|
||||
|
||||
const taxTotal = calculateTaxTotal({
|
||||
taxLines: item.tax_lines || [],
|
||||
taxableAmount: MathBN.sub(subtotal, discountsSubtotal),
|
||||
taxableAmount: MathBN.sub(currentSubtotal, currentDiscountsSubtotal),
|
||||
setTotalField: "total",
|
||||
})
|
||||
|
||||
const originalTaxTotal = calculateTaxTotal({
|
||||
taxLines: item.tax_lines || [],
|
||||
taxableAmount: subtotal,
|
||||
taxableAmount: currentSubtotal,
|
||||
setTotalField: "subtotal",
|
||||
})
|
||||
|
||||
// Compute full-quantity net total after discounts and taxes to derive per-unit totals
|
||||
const fullDiscountedTaxable = MathBN.sub(subtotal, discountsSubtotalFull ?? 0)
|
||||
const taxTotalFull = calculateTaxTotal({
|
||||
taxLines: item.tax_lines || [],
|
||||
taxableAmount: fullDiscountedTaxable,
|
||||
})
|
||||
const fullNetTotal = MathBN.sum(fullDiscountedTaxable, taxTotalFull)
|
||||
|
||||
const totals: GetItemTotalOutput = {
|
||||
quantity: item.quantity,
|
||||
unit_price: item.unit_price,
|
||||
|
||||
subtotal: new BigNumber(subtotal),
|
||||
subtotal: new BigNumber(currentSubtotal),
|
||||
|
||||
total: new BigNumber(
|
||||
MathBN.sum(MathBN.sub(subtotal, discountsSubtotal), taxTotal)
|
||||
MathBN.sum(
|
||||
MathBN.sub(currentSubtotal, currentDiscountsSubtotal),
|
||||
taxTotal
|
||||
)
|
||||
),
|
||||
|
||||
original_subtotal: new BigNumber(
|
||||
MathBN.sub(
|
||||
isTaxInclusive
|
||||
? currentTotalItemPrice
|
||||
: MathBN.add(currentSubtotal, originalTaxTotal),
|
||||
originalTaxTotal
|
||||
)
|
||||
),
|
||||
|
||||
original_total: new BigNumber(
|
||||
isTaxInclusive ? totalItemPrice : MathBN.add(subtotal, originalTaxTotal)
|
||||
isTaxInclusive
|
||||
? currentTotalItemPrice
|
||||
: MathBN.add(currentSubtotal, originalTaxTotal)
|
||||
),
|
||||
|
||||
discount_total: new BigNumber(discountsTotal),
|
||||
discount_subtotal: new BigNumber(discountsSubtotal),
|
||||
discount_tax_total: new BigNumber(discountTaxTotal),
|
||||
// Discount values prorated to the current quantity
|
||||
discount_subtotal: new BigNumber(currentDiscountsSubtotal),
|
||||
discount_tax_total: new BigNumber(MathBN.sub(originalTaxTotal, taxTotal)),
|
||||
discount_total: new BigNumber(
|
||||
MathBN.add(
|
||||
currentDiscountsSubtotal,
|
||||
MathBN.sub(originalTaxTotal, taxTotal)
|
||||
)
|
||||
),
|
||||
|
||||
tax_total: new BigNumber(taxTotal),
|
||||
original_tax_total: new BigNumber(originalTaxTotal),
|
||||
}
|
||||
|
||||
if (isDefined(item.detail?.return_requested_quantity)) {
|
||||
setRefundableTotal(item, discountsTotal, totals, context)
|
||||
if (
|
||||
isDefined(item.detail?.return_requested_quantity) ||
|
||||
isDefined(item.detail?.return_received_quantity) ||
|
||||
isDefined(item.detail?.return_dismissed_quantity)
|
||||
) {
|
||||
setRefundableTotal(item, discountsTotal, totals)
|
||||
}
|
||||
|
||||
// Per-unit total should be based on full-quantity net total to support lifecycle totals consistently
|
||||
const div = MathBN.eq(item.quantity, 0) ? 1 : item.quantity
|
||||
const totalPerUnit = MathBN.div(totals.total, div)
|
||||
const totalPerUnit = MathBN.div(fullNetTotal, div)
|
||||
|
||||
const optionalFields = {
|
||||
...(context.extraQuantityFields ?? {}),
|
||||
@@ -183,10 +236,9 @@ function getLineItemTotals(
|
||||
for (const field in optionalFields) {
|
||||
const totalField = optionalFields[field]
|
||||
|
||||
let target = item[totalField]
|
||||
if (field.includes(".")) {
|
||||
target = pickValueFromObject(field, item)
|
||||
}
|
||||
let target = field.includes(".")
|
||||
? pickValueFromObject(field, item)
|
||||
: item[field]
|
||||
|
||||
if (!isDefined(target)) {
|
||||
continue
|
||||
|
||||
@@ -20,6 +20,7 @@ export interface GetShippingMethodTotalOutput {
|
||||
amount: BigNumber
|
||||
|
||||
subtotal: BigNumber
|
||||
original_subtotal: BigNumber
|
||||
|
||||
total: BigNumber
|
||||
original_total: BigNumber
|
||||
@@ -96,6 +97,14 @@ export function getShippingMethodTotals(
|
||||
total: new BigNumber(
|
||||
MathBN.sum(MathBN.sub(subtotal, discountsSubtotal), taxTotal)
|
||||
),
|
||||
original_subtotal: new BigNumber(
|
||||
MathBN.sub(
|
||||
isTaxInclusive
|
||||
? shippingMethodAmount
|
||||
: MathBN.add(subtotal, originalTaxTotal),
|
||||
originalTaxTotal
|
||||
)
|
||||
),
|
||||
original_total: new BigNumber(
|
||||
isTaxInclusive
|
||||
? shippingMethodAmount
|
||||
|
||||
@@ -11,10 +11,6 @@ export function calculateTaxTotal({
|
||||
taxableAmount: BigNumberInput
|
||||
setTotalField?: string
|
||||
}) {
|
||||
if (MathBN.lte(taxableAmount, 0)) {
|
||||
return MathBN.convert(0)
|
||||
}
|
||||
|
||||
let taxTotal = MathBN.convert(0)
|
||||
|
||||
for (const taxLine of taxLines) {
|
||||
|
||||
Reference in New Issue
Block a user