@8medusa/utils 2.10.19 → 2.11.1

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,78 +22,121 @@ 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
+ if (math_1.MathBN.eq(currentQuantity, 0)) {
26
+ totals.refundable_total_per_unit = new big_number_1.BigNumber(0);
27
+ totals.refundable_total = new big_number_1.BigNumber(0);
28
+ return;
29
+ }
30
+ const isTaxInclusive = item.is_tax_inclusive ?? context.includeTax;
31
+ const sumTax = math_1.MathBN.sum(...((item.tax_lines ?? []).map((taxLine) => taxLine.rate) ?? []));
32
+ const sumTaxRate = math_1.MathBN.div(sumTax, 100);
33
+ const vatMul = math_1.MathBN.add(1, sumTaxRate);
34
+ // Derive unitNet (same as main calculation)
35
+ const unitNet = isTaxInclusive
36
+ ? math_1.MathBN.div(item.unit_price, vatMul)
37
+ : item.unit_price;
38
+ // Calculate refundable line net (for current quantity, not returned)
39
+ const refundableLineNet = math_1.MathBN.mult(unitNet, currentQuantity);
40
+ const refundableLineNetRounded = math_1.MathBN.round(refundableLineNet, 2);
41
+ // Calculate discount per unit and apply to refundable quantity
25
42
  const discountPerUnit = math_1.MathBN.div(discountsTotal, item.quantity);
26
- const refundableSubTotal = math_1.MathBN.sub(math_1.MathBN.mult(currentQuantity, item.unit_price), math_1.MathBN.mult(currentQuantity, discountPerUnit));
43
+ const refundableDiscount = math_1.MathBN.mult(discountPerUnit, currentQuantity);
44
+ // Subtract discount from net
45
+ const refundableNetAfterDiscount = math_1.MathBN.sub(refundableLineNetRounded, refundableDiscount);
46
+ // Calculate tax on refundable net (after discount)
27
47
  const taxTotal = (0, tax_1.calculateTaxTotal)({
28
48
  taxLines: item.tax_lines || [],
29
- taxableAmount: refundableSubTotal,
49
+ taxableAmount: refundableNetAfterDiscount,
30
50
  });
31
- const refundableTotal = math_1.MathBN.add(refundableSubTotal, taxTotal);
32
- totals.refundable_total_per_unit = new big_number_1.BigNumber(math_1.MathBN.eq(currentQuantity, 0)
33
- ? 0
34
- : math_1.MathBN.div(refundableTotal, currentQuantity));
51
+ const taxTotalRounded = math_1.MathBN.round(taxTotal, 2);
52
+ // Calculate refundable gross total
53
+ const refundableTotal = math_1.MathBN.round(math_1.MathBN.add(refundableNetAfterDiscount, taxTotalRounded), 2);
54
+ totals.refundable_total_per_unit = new big_number_1.BigNumber(math_1.MathBN.div(refundableTotal, currentQuantity));
35
55
  totals.refundable_total = new big_number_1.BigNumber(refundableTotal);
36
56
  }
37
57
  function getLineItemTotals(item, context) {
38
58
  const isTaxInclusive = item.is_tax_inclusive ?? context.includeTax;
39
59
  const sumTax = math_1.MathBN.sum(...((item.tax_lines ?? []).map((taxLine) => taxLine.rate) ?? []));
40
60
  const sumTaxRate = math_1.MathBN.div(sumTax, 100);
61
+ const vatMul = math_1.MathBN.add(1, sumTaxRate);
41
62
  /*
42
- Calculate unit subtotal first
43
- If the price is inclusive of tax, we need to remove the taxed amount from the subtotal
44
- Original Price = Total Price / (1 + Tax Rate)
63
+ A) Derive vatRate and unitNet
64
+ If the price is inclusive of tax, we need to remove the taxed amount
65
+ unitNet = unitGross / (1 + vatRate)
66
+ DO NOT round unitNet - keep high precision for line-level calculation
45
67
  */
46
- const unitSubtotal = isTaxInclusive
47
- ? math_1.MathBN.div(item.unit_price, math_1.MathBN.add(1, sumTaxRate))
68
+ const unitNet = isTaxInclusive
69
+ ? math_1.MathBN.div(item.unit_price, vatMul)
48
70
  : item.unit_price;
49
- const { adjustmentsTotal: discountsTotal, adjustmentsSubtotal: discountsSubtotal, adjustmentsTaxTotal: discountTaxTotal, } = (0, adjustment_1.calculateAdjustmentTotal)({
50
- adjustments: item.adjustments || [],
51
- includesTax: isTaxInclusive,
52
- taxRate: sumTaxRate,
53
- });
54
- const unitDiscount = math_1.MathBN.eq(item.quantity, 0)
55
- ? 0
56
- : math_1.MathBN.div(discountsSubtotal, item.quantity);
57
- const unitPriceAfterDiscount = math_1.MathBN.sub(unitSubtotal, unitDiscount);
58
- const unitTax = (0, tax_1.calculateTaxTotal)({
59
- taxLines: item.tax_lines || [],
60
- taxableAmount: unitPriceAfterDiscount,
61
- setTotalField: "total",
62
- });
63
- // Step 4: Add tax to get gross unit price and round per item
64
- const unitTotalBeforeRounding = math_1.MathBN.add(unitPriceAfterDiscount, unitTax);
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
73
- const taxTotal = (0, tax_1.calculateTaxTotal)({
71
+ /*
72
+ B) Compute line net BEFORE promotions (pre-promo base)
73
+ lineNetBefore = qty × unitNet (high precision, no rounding yet)
74
+ */
75
+ const lineNetBefore = math_1.MathBN.mult(unitNet, item.quantity);
76
+ /*
77
+ C) CRITICAL: Round at NET LINE level to match Helios rounding point
78
+ Helios will do: round2(totalPrice / (1 + vatRate))
79
+ We ensure consistency by rounding the net base at LINE level, NOT unit level.
80
+ This is the key alignment point that prevents rounding drift.
81
+ */
82
+ const lineNetBeforeRounded = math_1.MathBN.round(lineNetBefore, 2);
83
+ /*
84
+ D) Compute tax on the PRE-PROMO net (tax is NOT affected by promotions)
85
+ Tax must be calculated from lineNetBeforeRounded (not unit, not discounted net)
86
+ */
87
+ const lineTax = (0, tax_1.calculateTaxTotal)({
74
88
  taxLines: item.tax_lines || [],
75
- taxableAmount: math_1.MathBN.sub(subtotal, discountsSubtotal),
89
+ taxableAmount: lineNetBeforeRounded,
76
90
  setTotalField: "total",
77
91
  });
78
- const originalTaxTotal = (0, tax_1.calculateTaxTotal)({
79
- taxLines: item.tax_lines || [],
80
- taxableAmount: subtotal,
81
- setTotalField: "subtotal",
92
+ const lineTaxRounded = math_1.MathBN.round(lineTax, 2);
93
+ /*
94
+ E) Compute original (pre-promo) gross line total
95
+ This is what the customer would pay without any promotions
96
+ */
97
+ const lineGrossBeforePromo = math_1.MathBN.round(math_1.MathBN.add(lineNetBeforeRounded, lineTaxRounded), 2);
98
+ /*
99
+ F) Compute promo/discount on GROSS (post-tax reduction)
100
+ Promotions are applied to customer-facing gross totals, not to the taxable base.
101
+ - Percentage promos are computed on lineGrossBeforePromo (gross), not on net
102
+ - Fixed promos are subtracted from gross after percentage is computed
103
+ - Tax is NOT recalculated after applying promo
104
+ */
105
+ const { adjustmentsTotal: promoGross } = (0, adjustment_1.calculateAdjustmentTotal)({
106
+ adjustments: item.adjustments || [],
107
+ includesTax: true, // Force gross interpretation - promotions reduce customer-facing price
108
+ taxRate: sumTaxRate,
82
109
  });
110
+ /*
111
+ G) Compute final total (gross after promo)
112
+ This is the totalPrice we sync to Helios
113
+ */
114
+ const total = math_1.MathBN.round(math_1.MathBN.sub(lineGrossBeforePromo, promoGross), 2);
115
+ /*
116
+ H) Prepare output fields
117
+ - subtotal: line net before promo (for consistency with existing API)
118
+ - total: gross line total after promo (synced to Helios as totalPrice)
119
+ - original_total: gross line total before promo
120
+ - original_tax_total: tax on pre-promo amounts
121
+ - tax_total: same as original_tax_total (tax doesn't change with promo)
122
+ - discount_total: gross discount amount
123
+ - discount_subtotal: net discount amount (derived)
124
+ - discount_tax_total: tax component of discount (derived)
125
+ */
83
126
  const totals = {
84
127
  quantity: item.quantity,
85
128
  unit_price: item.unit_price,
86
- subtotal: new big_number_1.BigNumber(subtotal),
129
+ subtotal: new big_number_1.BigNumber(lineNetBeforeRounded),
87
130
  total: new big_number_1.BigNumber(total),
88
- original_total: new big_number_1.BigNumber(originalTotal),
89
- discount_total: new big_number_1.BigNumber(discountsTotal),
90
- discount_subtotal: new big_number_1.BigNumber(discountsSubtotal),
91
- discount_tax_total: new big_number_1.BigNumber(discountTaxTotal),
92
- tax_total: new big_number_1.BigNumber(taxTotal),
93
- original_tax_total: new big_number_1.BigNumber(originalTaxTotal),
131
+ original_total: new big_number_1.BigNumber(lineGrossBeforePromo),
132
+ discount_total: new big_number_1.BigNumber(promoGross),
133
+ discount_subtotal: new big_number_1.BigNumber(promoGross), // Same as discount_total - promotions apply to gross amounts
134
+ discount_tax_total: new big_number_1.BigNumber(0), // No tax on discount - promotions reduce post-tax totals
135
+ tax_total: new big_number_1.BigNumber(lineTaxRounded),
136
+ original_tax_total: new big_number_1.BigNumber(lineTaxRounded),
94
137
  };
95
138
  if ((0, common_1.isDefined)(item.detail?.return_requested_quantity)) {
96
- setRefundableTotal(item, discountsTotal, totals, context);
139
+ setRefundableTotal(item, promoGross, totals, context);
97
140
  }
98
141
  const div = math_1.MathBN.eq(item.quantity, 0) ? 1 : item.quantity;
99
142
  const totalPerUnit = math_1.MathBN.div(totals.total, div);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/line-item/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/line-item/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/totals/promotion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAoC/C,wBAAgB,iBAAiB,CAAC,SAAS,KAAA,EAAE,aAAa,KAAA,EAAE,cAAc,KAAA,OAMzE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,KAAA,EAAE,WAAW,KAAA,OAM1D;AAMD,wBAAgB,sCAAsC,CACpD,QAAQ,KAAA,EACR,SAAS,KAAA,EACT,cAAc,GAAE,cAAkB,aAyFnC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/totals/promotion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAoC/C,wBAAgB,iBAAiB,CAAC,SAAS,KAAA,EAAE,aAAa,KAAA,EAAE,cAAc,KAAA,OAMzE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,KAAA,EAAE,WAAW,KAAA,OAM1D;AAgCD,wBAAgB,sCAAsC,CACpD,QAAQ,KAAA,EACR,SAAS,KAAA,EACT,cAAc,GAAE,cAAkB,aAuDnC"}
@@ -31,41 +31,37 @@ function getApplicableQuantity(lineItem, maxQuantity) {
31
31
  }
32
32
  return lineItem.quantity;
33
33
  }
34
- function getLineItemUnitPrice(lineItem) {
35
- return math_1.MathBN.div(lineItem.subtotal, lineItem.quantity);
34
+ /**
35
+ * Calculate gross total from subtotal and tax_lines
36
+ * ALL promotions apply to post-tax (gross) amounts
37
+ */
38
+ function getLineItemGrossTotal(lineItem) {
39
+ const subtotal = math_1.MathBN.convert(lineItem.subtotal);
40
+ // Calculate tax from tax_lines if available
41
+ if (lineItem.tax_lines &&
42
+ Array.isArray(lineItem.tax_lines) &&
43
+ lineItem.tax_lines.length > 0) {
44
+ const totalTaxRate = lineItem.tax_lines.reduce((acc, taxLine) => math_1.MathBN.add(acc, math_1.MathBN.div(taxLine.rate, 100)), math_1.MathBN.convert(0));
45
+ const taxAmount = math_1.MathBN.mult(subtotal, totalTaxRate);
46
+ return math_1.MathBN.add(subtotal, taxAmount);
47
+ }
48
+ // If no tax_lines, return subtotal (gross = net when no tax)
49
+ return subtotal;
50
+ }
51
+ function getLineItemUnitPriceGross(lineItem) {
52
+ const grossTotal = getLineItemGrossTotal(lineItem);
53
+ return math_1.MathBN.div(grossTotal, lineItem.quantity);
36
54
  }
37
55
  function calculateAdjustmentAmountFromPromotion(lineItem, promotion, lineItemsTotal = 0) {
38
56
  /*
39
- For a promotion with an across allocation, we consider not only the line item total, but also the total of all other line items in the order.
40
-
41
- We then distribute the promotion value proportionally across the line items based on the total of each line item.
42
-
43
- For example, if the promotion is 100$, and the order total is 400$, and the items are:
44
- item1: 250$
45
- item2: 150$
46
- total: 400$
47
-
48
- The promotion value for the line items would be:
49
- item1: 62.5$
50
- item2: 37.5$
51
- total: 100$
52
-
53
- For the next 100$ promotion, we remove the applied promotions value from the line item total and redistribute the promotion value across the line items based on the updated totals.
54
-
55
- Example:
56
- item1: (250 - 62.5) = 187.5
57
- item2: (150 - 37.5) = 112.5
58
- total: 300
59
-
60
- The promotion value for the line items would be:
61
- item1: $62.5
62
- item2: $37.5
63
- total: 100$
64
-
57
+ ALL promotions apply to GROSS (post-tax) amounts.
58
+ - PERCENTAGE: Calculate percentage on gross total
59
+ - FIXED: Distribute fixed amount proportionally across items based on gross totals
65
60
  */
66
61
  if (promotion.allocation === promotion_1.ApplicationMethodAllocation.ACROSS) {
67
62
  const quantity = getApplicableQuantity(lineItem, promotion.max_quantity);
68
- const lineItemTotal = math_1.MathBN.mult(getLineItemUnitPrice(lineItem), quantity);
63
+ // Always use GROSS for all promotion types
64
+ const lineItemTotal = math_1.MathBN.mult(getLineItemUnitPriceGross(lineItem), quantity);
69
65
  const applicableTotal = math_1.MathBN.sub(lineItemTotal, promotion.applied_value);
70
66
  if (math_1.MathBN.lte(applicableTotal, 0)) {
71
67
  return applicableTotal;
@@ -74,26 +70,12 @@ function calculateAdjustmentAmountFromPromotion(lineItem, promotion, lineItemsTo
74
70
  return math_1.MathBN.min(promotionValue, applicableTotal);
75
71
  }
76
72
  /*
77
- For a promotion with an EACH allocation, we calculate the promotion value on the line item as a whole.
78
-
79
- Example:
80
- item1: {
81
- subtotal: 200$,
82
- unit_price: 50$,
83
- quantity: 4,
84
- }
85
-
86
- When applying promotions, we need to consider 2 values:
87
- 1. What is the maximum promotion value?
88
- 2. What is the maximum promotion we can apply on the line item?
89
-
90
- After applying each promotion, we reduce the maximum promotion that you can add to the line item by the value of the promotions applied.
91
-
92
- We then apply whichever is lower.
73
+ For EACH allocation - also use GROSS
93
74
  */
94
- const remainingItemTotal = math_1.MathBN.sub(lineItem.subtotal, promotion.applied_value);
95
- const unitPrice = math_1.MathBN.div(lineItem.subtotal, lineItem.quantity);
96
- const maximumPromotionTotal = math_1.MathBN.mult(unitPrice, promotion.max_quantity ?? math_1.MathBN.convert(1));
75
+ const grossTotal = getLineItemGrossTotal(lineItem);
76
+ const remainingItemTotal = math_1.MathBN.sub(grossTotal, promotion.applied_value);
77
+ const unitPriceGross = math_1.MathBN.div(grossTotal, lineItem.quantity);
78
+ const maximumPromotionTotal = math_1.MathBN.mult(unitPriceGross, promotion.max_quantity ?? math_1.MathBN.convert(1));
97
79
  const applicableTotal = math_1.MathBN.min(remainingItemTotal, maximumPromotionTotal);
98
80
  if (math_1.MathBN.lte(applicableTotal, 0)) {
99
81
  return math_1.MathBN.convert(0);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/promotion/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/promotion/index.ts"],"names":[],"mappings":";;AAoCA,8CAMC;AAED,sDAMC;AAgCD,wFA0DC;AA3ID,+CAGwB;AACxB,kCAAgC;AAEhC,SAAS,8BAA8B,CAAC,SAAS,EAAE,aAAa;IAC9D,OAAO,aAAM,CAAC,IAAI,CAAC,aAAM,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,CAAA;AACrE,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa;IACpE,IAAI,SAAS,CAAC,UAAU,KAAK,uCAA2B,CAAC,MAAM,EAAE,CAAC;QAChE,MAAM,qBAAqB,GAAG,aAAM,CAAC,IAAI,CACvC,aAAM,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,EACpC,SAAS,CAAC,KAAK,CAChB,CAAA;QAED,IAAI,aAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,qBAAqB,CAAA;QAC9B,CAAC;QAED,MAAM,UAAU,GAAG,aAAM,CAAC,GAAG,CAC3B,aAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAC3B,qBAAqB,CACtB,CAAA;QAED,OAAO,aAAM,CAAC,IAAI,CAChB,qBAAqB,EACrB,aAAM,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAC5B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,SAAS,CAAC,KAAK,CAAA;AACxB,CAAC;AAED,SAAgB,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,cAAc;IACxE,IAAI,SAAS,CAAC,IAAI,KAAK,iCAAqB,CAAC,UAAU,EAAE,CAAC;QACxD,OAAO,8BAA8B,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,yBAAyB,CAAC,SAAS,EAAE,aAAa,EAAE,cAAc,CAAC,CAAA;AAC5E,CAAC;AAED,SAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW;IACzD,IAAI,WAAW,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,aAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAA;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,QAAQ;IACrC,MAAM,QAAQ,GAAG,aAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAElD,4CAA4C;IAC5C,IACE,QAAQ,CAAC,SAAS;QAClB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QACjC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAC7B,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAC5C,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,aAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAChE,aAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAClB,CAAA;QACD,MAAM,SAAS,GAAG,aAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACrD,OAAO,aAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACxC,CAAC;IAED,6DAA6D;IAC7D,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAQ;IACzC,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAClD,OAAO,aAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,sCAAsC,CACpD,QAAQ,EACR,SAAS,EACT,iBAAiC,CAAC;IAElC;;;;MAIE;IAEF,IAAI,SAAS,CAAC,UAAU,KAAK,uCAA2B,CAAC,MAAM,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC,CAAA;QAExE,2CAA2C;QAC3C,MAAM,aAAa,GAAG,aAAM,CAAC,IAAI,CAC/B,yBAAyB,CAAC,QAAQ,CAAC,EACnC,QAAQ,CACT,CAAA;QACD,MAAM,eAAe,GAAG,aAAM,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,aAAa,CAAC,CAAA;QAE1E,IAAI,aAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC;YACnC,OAAO,eAAe,CAAA;QACxB,CAAC;QAED,MAAM,cAAc,GAAG,iBAAiB,CACtC,SAAS,EACT,eAAe,EACf,cAAc,CACf,CAAA;QAED,OAAO,aAAM,CAAC,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;IACpD,CAAC;IAED;;MAEE;IACF,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,kBAAkB,GAAG,aAAM,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,aAAa,CAAC,CAAA;IAE1E,MAAM,cAAc,GAAG,aAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAChE,MAAM,qBAAqB,GAAG,aAAM,CAAC,IAAI,CACvC,cAAc,EACd,SAAS,CAAC,YAAY,IAAI,aAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAC5C,CAAA;IACD,MAAM,eAAe,GAAG,aAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAA;IAE7E,IAAI,aAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,aAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CACtC,SAAS,EACT,eAAe,EACf,cAAc,CACf,CAAA;IAED,OAAO,aAAM,CAAC,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;AACpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/totals/shipping-method/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAIzC,UAAU,+BAA+B;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,SAAS,CAAA;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,UAAU,EAAE,CAAA;IACxB,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,EAAE,CAAA;CAClD;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,SAAS,CAAA;IAEjB,QAAQ,EAAE,SAAS,CAAA;IAEnB,KAAK,EAAE,SAAS,CAAA;IAChB,cAAc,EAAE,SAAS,CAAA;IAEzB,cAAc,EAAE,SAAS,CAAA;IACzB,iBAAiB,EAAE,SAAS,CAAA;IAC5B,kBAAkB,EAAE,SAAS,CAAA;IAE7B,SAAS,EAAE,SAAS,CAAA;IACpB,kBAAkB,EAAE,SAAS,CAAA;CAC9B;AAED,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,2BAA2B,EAAE,EAC9C,OAAO,EAAE,+BAA+B,GACvC,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAa9C;AAED,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,2BAA2B,EAC3C,OAAO,EAAE,+BAA+B,gCA+DzC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/totals/shipping-method/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAIzC,UAAU,+BAA+B;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,SAAS,CAAA;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,UAAU,EAAE,CAAA;IACxB,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,EAAE,CAAA;CAClD;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,SAAS,CAAA;IAEjB,QAAQ,EAAE,SAAS,CAAA;IAEnB,KAAK,EAAE,SAAS,CAAA;IAChB,cAAc,EAAE,SAAS,CAAA;IAEzB,cAAc,EAAE,SAAS,CAAA;IACzB,iBAAiB,EAAE,SAAS,CAAA;IAC5B,kBAAkB,EAAE,SAAS,CAAA;IAE7B,SAAS,EAAE,SAAS,CAAA;IACpB,kBAAkB,EAAE,SAAS,CAAA;CAC9B;AAED,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,2BAA2B,EAAE,EAC9C,OAAO,EAAE,+BAA+B,GACvC,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAa9C;AAED,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,2BAA2B,EAC3C,OAAO,EAAE,+BAA+B,gCAwDzC"}
@@ -23,32 +23,34 @@ function getShippingMethodTotals(shippingMethod, context) {
23
23
  const subtotal = isTaxInclusive
24
24
  ? math_1.MathBN.div(shippingMethodAmount, math_1.MathBN.add(1, sumTaxRate))
25
25
  : shippingMethodAmount;
26
- const { adjustmentsTotal: discountsTotal, adjustmentsSubtotal: discountsSubtotal, adjustmentsTaxTotal: discountsTaxTotal, } = (0, adjustment_1.calculateAdjustmentTotal)({
26
+ const { adjustmentsTotal: discountsTotal } = (0, adjustment_1.calculateAdjustmentTotal)({
27
27
  adjustments: shippingMethod.adjustments || [],
28
28
  includesTax: isTaxInclusive,
29
29
  taxRate: sumTaxRate,
30
30
  });
31
31
  const taxLines = shippingMethod.tax_lines || [];
32
- const taxTotal = (0, tax_1.calculateTaxTotal)({
33
- taxLines,
34
- taxableAmount: math_1.MathBN.sub(subtotal, discountsSubtotal),
35
- setTotalField: "total",
36
- });
32
+ // Tax is calculated on original subtotal - not affected by discounts
37
33
  const originalTaxTotal = (0, tax_1.calculateTaxTotal)({
38
34
  taxLines,
39
35
  taxableAmount: subtotal,
40
36
  setTotalField: "subtotal",
41
37
  });
38
+ // Tax total is same as original - promotions don't reduce tax
39
+ const taxTotal = originalTaxTotal;
40
+ // Original gross total (before promotions)
41
+ const originalGrossTotal = isTaxInclusive
42
+ ? shippingMethodAmount
43
+ : math_1.MathBN.add(subtotal, originalTaxTotal);
44
+ // Final total = original gross - discount (promotions reduce post-tax total)
45
+ const total = math_1.MathBN.round(math_1.MathBN.sub(originalGrossTotal, discountsTotal), 2);
42
46
  const totals = {
43
47
  amount: new big_number_1.BigNumber(shippingMethodAmount),
44
48
  subtotal: new big_number_1.BigNumber(subtotal),
45
- total: new big_number_1.BigNumber(math_1.MathBN.round(math_1.MathBN.sum(math_1.MathBN.sub(subtotal, discountsSubtotal), taxTotal), 2)),
46
- original_total: new big_number_1.BigNumber(isTaxInclusive
47
- ? shippingMethodAmount
48
- : math_1.MathBN.add(subtotal, originalTaxTotal)),
49
+ total: new big_number_1.BigNumber(total),
50
+ original_total: new big_number_1.BigNumber(originalGrossTotal),
49
51
  discount_total: new big_number_1.BigNumber(discountsTotal),
50
- discount_subtotal: new big_number_1.BigNumber(discountsSubtotal),
51
- discount_tax_total: new big_number_1.BigNumber(discountsTaxTotal),
52
+ discount_subtotal: new big_number_1.BigNumber(discountsTotal), // Same as discount_total - promotions apply to gross
53
+ discount_tax_total: new big_number_1.BigNumber(0), // No tax on discount - promotions reduce post-tax totals
52
54
  tax_total: new big_number_1.BigNumber(taxTotal),
53
55
  original_tax_total: new big_number_1.BigNumber(originalTaxTotal),
54
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/shipping-method/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/totals/shipping-method/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@8medusa/utils",
3
- "version": "2.10.19",
3
+ "version": "2.11.1",
4
4
  "description": "Medusa utilities functions shared by Medusa core and Modules",
5
5
  "main": "dist/index.js",
6
6
  "exports": {