@8medusa/utils 2.10.19 → 2.10.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -22,13 +22,26 @@ function setRefundableTotal(item, discountsTotal, totals, context) {
|
|
|
22
22
|
const itemDetail = item.detail;
|
|
23
23
|
const totalReturnedQuantity = math_1.MathBN.sum(itemDetail.return_requested_quantity ?? 0, itemDetail.return_received_quantity ?? 0, itemDetail.return_dismissed_quantity ?? 0);
|
|
24
24
|
const currentQuantity = math_1.MathBN.sub(item.quantity, totalReturnedQuantity);
|
|
25
|
-
|
|
26
|
-
const
|
|
25
|
+
// Use line-level calculation for refundable total
|
|
26
|
+
const isTaxInclusive = item.is_tax_inclusive ?? context.includeTax;
|
|
27
|
+
const sumTax = math_1.MathBN.sum(...((item.tax_lines ?? []).map((taxLine) => taxLine.rate) ?? []));
|
|
28
|
+
const sumTaxRate = math_1.MathBN.div(sumTax, 100);
|
|
29
|
+
const unitNet = isTaxInclusive
|
|
30
|
+
? math_1.MathBN.div(item.unit_price, math_1.MathBN.add(1, sumTaxRate))
|
|
31
|
+
: item.unit_price;
|
|
32
|
+
const discountPerUnit = math_1.MathBN.eq(item.quantity, 0)
|
|
33
|
+
? 0
|
|
34
|
+
: math_1.MathBN.div(discountsTotal, item.quantity);
|
|
35
|
+
// Compute refundable line net (high precision)
|
|
36
|
+
const refundableLineNetExact = math_1.MathBN.mult(currentQuantity, math_1.MathBN.sub(unitNet, discountPerUnit));
|
|
37
|
+
// Round at line level (matches Helios algorithm)
|
|
38
|
+
const refundableLineNetRounded = math_1.MathBN.round(refundableLineNetExact, 2);
|
|
39
|
+
// Compute tax on rounded line net
|
|
27
40
|
const taxTotal = (0, tax_1.calculateTaxTotal)({
|
|
28
41
|
taxLines: item.tax_lines || [],
|
|
29
|
-
taxableAmount:
|
|
42
|
+
taxableAmount: refundableLineNetRounded,
|
|
30
43
|
});
|
|
31
|
-
const refundableTotal = math_1.MathBN.add(
|
|
44
|
+
const refundableTotal = math_1.MathBN.round(math_1.MathBN.add(refundableLineNetRounded, taxTotal), 2);
|
|
32
45
|
totals.refundable_total_per_unit = new big_number_1.BigNumber(math_1.MathBN.eq(currentQuantity, 0)
|
|
33
46
|
? 0
|
|
34
47
|
: math_1.MathBN.div(refundableTotal, currentQuantity));
|
|
@@ -39,11 +52,11 @@ function getLineItemTotals(item, context) {
|
|
|
39
52
|
const sumTax = math_1.MathBN.sum(...((item.tax_lines ?? []).map((taxLine) => taxLine.rate) ?? []));
|
|
40
53
|
const sumTaxRate = math_1.MathBN.div(sumTax, 100);
|
|
41
54
|
/*
|
|
42
|
-
Calculate unit subtotal
|
|
55
|
+
Calculate unit subtotal (net price per unit)
|
|
43
56
|
If the price is inclusive of tax, we need to remove the taxed amount from the subtotal
|
|
44
57
|
Original Price = Total Price / (1 + Tax Rate)
|
|
45
58
|
*/
|
|
46
|
-
const
|
|
59
|
+
const unitNet = isTaxInclusive
|
|
47
60
|
? math_1.MathBN.div(item.unit_price, math_1.MathBN.add(1, sumTaxRate))
|
|
48
61
|
: item.unit_price;
|
|
49
62
|
const { adjustmentsTotal: discountsTotal, adjustmentsSubtotal: discountsSubtotal, adjustmentsTaxTotal: discountTaxTotal, } = (0, adjustment_1.calculateAdjustmentTotal)({
|
|
@@ -51,35 +64,32 @@ function getLineItemTotals(item, context) {
|
|
|
51
64
|
includesTax: isTaxInclusive,
|
|
52
65
|
taxRate: sumTaxRate,
|
|
53
66
|
});
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const unitTotal = math_1.MathBN.round(unitTotalBeforeRounding, 2);
|
|
66
|
-
// Step 5: Multiply rounded unit total by quantity
|
|
67
|
-
const subtotal = math_1.MathBN.mult(unitSubtotal, item.quantity);
|
|
68
|
-
const total = math_1.MathBN.mult(unitTotal, item.quantity);
|
|
69
|
-
// Calculate original total using the same EU-standard method as total
|
|
70
|
-
const unitOriginalTotal = math_1.MathBN.round(unitTotalBeforeRounding, 2);
|
|
71
|
-
const originalTotal = math_1.MathBN.mult(unitOriginalTotal, item.quantity);
|
|
72
|
-
// Calculate tax totals for reporting
|
|
67
|
+
// LINE-LEVEL CALCULATION (Helios-compatible rounding)
|
|
68
|
+
// Compute line net before discounts (high precision, no rounding)
|
|
69
|
+
const lineNetBefore = math_1.MathBN.mult(unitNet, item.quantity);
|
|
70
|
+
const subtotal = lineNetBefore;
|
|
71
|
+
// Apply discounts at line level (high precision)
|
|
72
|
+
const lineNetAfterExact = math_1.MathBN.sub(lineNetBefore, discountsSubtotal);
|
|
73
|
+
// CRITICAL ROUNDING POINT - Round at NET LINE level (matches Helios algorithm)
|
|
74
|
+
// Helios reconstructs: lineNet = totalPrice / (1 + vatRate), then rounds to 2 decimals
|
|
75
|
+
// By rounding here, we ensure Helios gets the same lineNet without additional drift
|
|
76
|
+
const lineNetAfterRounded = math_1.MathBN.round(lineNetAfterExact, 2);
|
|
77
|
+
// Compute tax on the rounded line net (ensures tax is based on the same value Helios uses)
|
|
73
78
|
const taxTotal = (0, tax_1.calculateTaxTotal)({
|
|
74
79
|
taxLines: item.tax_lines || [],
|
|
75
|
-
taxableAmount:
|
|
80
|
+
taxableAmount: lineNetAfterRounded,
|
|
76
81
|
setTotalField: "total",
|
|
77
82
|
});
|
|
83
|
+
// Compute gross line total from rounded line net + tax
|
|
84
|
+
const total = math_1.MathBN.round(math_1.MathBN.add(lineNetAfterRounded, taxTotal), 2);
|
|
85
|
+
// Calculate original totals using line-level rounding (before discounts)
|
|
86
|
+
const lineNetOriginalRounded = math_1.MathBN.round(lineNetBefore, 2);
|
|
78
87
|
const originalTaxTotal = (0, tax_1.calculateTaxTotal)({
|
|
79
88
|
taxLines: item.tax_lines || [],
|
|
80
|
-
taxableAmount:
|
|
81
|
-
setTotalField: "
|
|
89
|
+
taxableAmount: lineNetOriginalRounded,
|
|
90
|
+
setTotalField: "total",
|
|
82
91
|
});
|
|
92
|
+
const originalTotal = math_1.MathBN.round(math_1.MathBN.add(lineNetOriginalRounded, originalTaxTotal), 2);
|
|
83
93
|
const totals = {
|
|
84
94
|
quantity: item.quantity,
|
|
85
95
|
unit_price: item.unit_price,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/line-item/index.ts"],"names":[],"mappings":";;AAyDA,gDAgBC;AAxED,yCAA6D;AAC7D,8CAAwD;AACxD,8CAAyC;AACzC,kCAAgC;AAChC,gCAA0C;AAoD1C,SAAgB,kBAAkB,CAChC,KAA0B,EAC1B,OAAkC;IAElC,MAAM,WAAW,GAAG,EAAE,CAAA;IAEtB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE;YACtD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB;YACvD,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;SACjD,CAAC,CAAA;QACF,KAAK,EAAE,CAAA;IACT,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAuB,EACvB,cAA8B,EAC9B,MAA0B,EAC1B,OAAkC;IAElC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAO,CAAA;IAC/B,MAAM,qBAAqB,GAAG,aAAM,CAAC,GAAG,CACtC,UAAU,CAAC,yBAAyB,IAAI,CAAC,EACzC,UAAU,CAAC,wBAAwB,IAAI,CAAC,EACxC,UAAU,CAAC,yBAAyB,IAAI,CAAC,CAC1C,CAAA;IACD,MAAM,eAAe,GAAG,aAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/line-item/index.ts"],"names":[],"mappings":"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"}
|