shareneus 1.7.337 → 1.7.338

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.
@@ -31,6 +31,7 @@ export declare class TransactionCalculationEngine {
31
31
  total: number;
32
32
  taxRows: unknown;
33
33
  includeTaxInTotal: boolean;
34
+ qty?: number;
34
35
  }): number;
35
36
  static reverseCalculateAmountAndUnitPriceFromTotal(input: {
36
37
  qty: number;
@@ -48,6 +48,59 @@ function sumTaxRateFromTaxes(taxes) {
48
48
  const rows = getTaxesArray(taxes);
49
49
  return rows.reduce((sum, row) => { var _a; return (0, math_operations_1.Add)(sum, toNum((_a = row === null || row === void 0 ? void 0 : row.Rate) !== null && _a !== void 0 ? _a : row === null || row === void 0 ? void 0 : row.rate)); }, 0);
50
50
  }
51
+ function normalizeCalcMethod(calcMethod) {
52
+ return calcMethod === 'Percentage' || isNullOrEmpty(calcMethod)
53
+ ? 'Percent'
54
+ : String(calcMethod);
55
+ }
56
+ function getTaxRowQty(row, fallbackQty) {
57
+ var _a, _b, _c;
58
+ return toNum((_c = (_b = (_a = row === null || row === void 0 ? void 0 : row.Qty) !== null && _a !== void 0 ? _a : row === null || row === void 0 ? void 0 : row.qty) !== null && _b !== void 0 ? _b : row === null || row === void 0 ? void 0 : row.Quantity) !== null && _c !== void 0 ? _c : row === null || row === void 0 ? void 0 : row.quantity) || fallbackQty;
59
+ }
60
+ function getPerUnitTaxAmount(row, fallbackQty, fallbackToAmt = true) {
61
+ var _a, _b;
62
+ const perUnitAmt = toNum((_a = row === null || row === void 0 ? void 0 : row.PerUnitAmt) !== null && _a !== void 0 ? _a : row === null || row === void 0 ? void 0 : row.perUnitAmt);
63
+ const qty = getTaxRowQty(row, fallbackQty);
64
+ if (perUnitAmt !== 0 && qty !== 0) {
65
+ return (0, math_operations_1.Multiply)(perUnitAmt, qty);
66
+ }
67
+ return fallbackToAmt ? toNum((_b = row === null || row === void 0 ? void 0 : row.Amt) !== null && _b !== void 0 ? _b : row === null || row === void 0 ? void 0 : row.amt) : 0;
68
+ }
69
+ function getReverseTaxBreakdown(taxes, qty) {
70
+ return getTaxesArray(taxes).reduce((summary, row) => {
71
+ var _a, _b, _c;
72
+ const calcMethod = normalizeCalcMethod((_a = row === null || row === void 0 ? void 0 : row.CalcMethod) !== null && _a !== void 0 ? _a : row === null || row === void 0 ? void 0 : row.calcMethod);
73
+ const rate = toNum((_b = row === null || row === void 0 ? void 0 : row.Rate) !== null && _b !== void 0 ? _b : row === null || row === void 0 ? void 0 : row.rate);
74
+ switch (calcMethod) {
75
+ case 'PerUnit':
76
+ summary.fixedTaxAmount = (0, math_operations_1.Add)(summary.fixedTaxAmount, getPerUnitTaxAmount(row, qty));
77
+ break;
78
+ case 'PerUnitPlusPercent':
79
+ summary.fixedTaxAmount = (0, math_operations_1.Add)(summary.fixedTaxAmount, getPerUnitTaxAmount(row, qty, false));
80
+ summary.percentTaxRate = (0, math_operations_1.Add)(summary.percentTaxRate, rate);
81
+ break;
82
+ case 'MaxOfPercentOrPerUnit': {
83
+ const amt = toNum((_c = row === null || row === void 0 ? void 0 : row.Amt) !== null && _c !== void 0 ? _c : row === null || row === void 0 ? void 0 : row.amt);
84
+ const perUnitAmt = getPerUnitTaxAmount(row, qty);
85
+ if (amt !== 0) {
86
+ summary.fixedTaxAmount = (0, math_operations_1.Add)(summary.fixedTaxAmount, amt);
87
+ }
88
+ else if (perUnitAmt !== 0) {
89
+ summary.fixedTaxAmount = (0, math_operations_1.Add)(summary.fixedTaxAmount, perUnitAmt);
90
+ }
91
+ else {
92
+ summary.percentTaxRate = (0, math_operations_1.Add)(summary.percentTaxRate, rate);
93
+ }
94
+ break;
95
+ }
96
+ case 'Percent':
97
+ default:
98
+ summary.percentTaxRate = (0, math_operations_1.Add)(summary.percentTaxRate, rate);
99
+ break;
100
+ }
101
+ return summary;
102
+ }, { fixedTaxAmount: 0, percentTaxRate: 0 });
103
+ }
51
104
  /**
52
105
  * Distribute a flat discount amount across a set of rows proportionally
53
106
  * by each row's `baseKey` value. Returns an array of share amounts aligned
@@ -115,12 +168,13 @@ class TransactionCalculationEngine {
115
168
  if (!input.includeTaxInTotal) {
116
169
  return total;
117
170
  }
118
- const taxSummary = TransactionCalculationEngine.getTaxesSummary(input.taxRows);
119
- if (taxSummary.taxRate) {
120
- const divisor = (0, math_operations_1.Add)(1, (0, math_operations_1.Divide)(taxSummary.taxRate, 100));
121
- return divisor === 0 ? total : (0, math_operations_1.Divide)(total, divisor);
171
+ const taxBreakdown = getReverseTaxBreakdown(input.taxRows, toNum(input.qty) || 1);
172
+ const totalAfterFixedTax = (0, math_operations_1.Subtract)(total, taxBreakdown.fixedTaxAmount);
173
+ if (taxBreakdown.percentTaxRate) {
174
+ const divisor = (0, math_operations_1.Add)(1, (0, math_operations_1.Divide)(taxBreakdown.percentTaxRate, 100));
175
+ return divisor === 0 ? totalAfterFixedTax : (0, math_operations_1.Divide)(totalAfterFixedTax, divisor);
122
176
  }
123
- return (0, math_operations_1.Subtract)(total, taxSummary.taxAmount);
177
+ return totalAfterFixedTax;
124
178
  }
125
179
  static reverseCalculateAmountAndUnitPriceFromTotal(input) {
126
180
  const qty = toNum(input.qty) || 1;
@@ -128,6 +182,7 @@ class TransactionCalculationEngine {
128
182
  total: input.total,
129
183
  taxRows: input.taxRows,
130
184
  includeTaxInTotal: input.includeTaxInTotal,
185
+ qty,
131
186
  });
132
187
  const disc = toNum(input.disc);
133
188
  const recDisc = toNum(input.recDisc);
@@ -369,15 +424,14 @@ class TransactionCalculationEngine {
369
424
  if (qty === 0) {
370
425
  return Object.assign({}, item);
371
426
  }
372
- const taxSummary = TransactionCalculationEngine.getTaxesSummary((_a = item === null || item === void 0 ? void 0 : item.Taxes) !== null && _a !== void 0 ? _a : item === null || item === void 0 ? void 0 : item.taxes);
373
427
  // If total doesn't include tax, treat it as "already stripped".
374
428
  const subtotal = includeTaxInTotal
375
- ? taxSummary.taxAmount !== 0
376
- ? (0, math_operations_1.Subtract)(total, taxSummary.taxAmount)
377
- : (() => {
378
- const divisor = (0, math_operations_1.Add)(1, (0, math_operations_1.Divide)(taxSummary.taxRate, 100));
379
- return (0, math_operations_1.Divide)(total, divisor === 0 ? 1 : divisor);
380
- })()
429
+ ? TransactionCalculationEngine.calculateSubtotalFromTotalUsingTaxes({
430
+ total,
431
+ taxRows: (_a = item === null || item === void 0 ? void 0 : item.Taxes) !== null && _a !== void 0 ? _a : item === null || item === void 0 ? void 0 : item.taxes,
432
+ includeTaxInTotal,
433
+ qty,
434
+ })
381
435
  : total;
382
436
  if (item.NoDisc) {
383
437
  const unpr = (0, math_operations_1.Divide)(subtotal, qty);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shareneus",
3
- "version": "1.7.337",
3
+ "version": "1.7.338",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -65,13 +65,88 @@ function sumTaxAmountFromTaxes(taxes: any): number {
65
65
  );
66
66
  }
67
67
 
68
- function sumTaxRateFromTaxes(taxes: any): number {
69
- const rows = getTaxesArray(taxes);
70
- return rows.reduce(
71
- (sum, row) => Add(sum, toNum(row?.Rate ?? row?.rate)),
72
- 0,
73
- );
74
- }
68
+ function sumTaxRateFromTaxes(taxes: any): number {
69
+ const rows = getTaxesArray(taxes);
70
+ return rows.reduce(
71
+ (sum, row) => Add(sum, toNum(row?.Rate ?? row?.rate)),
72
+ 0,
73
+ );
74
+ }
75
+
76
+ function normalizeCalcMethod(calcMethod: any): string {
77
+ return calcMethod === 'Percentage' || isNullOrEmpty(calcMethod)
78
+ ? 'Percent'
79
+ : String(calcMethod);
80
+ }
81
+
82
+ function getTaxRowQty(row: any, fallbackQty: number): number {
83
+ return toNum(row?.Qty ?? row?.qty ?? row?.Quantity ?? row?.quantity) || fallbackQty;
84
+ }
85
+
86
+ function getPerUnitTaxAmount(
87
+ row: any,
88
+ fallbackQty: number,
89
+ fallbackToAmt = true,
90
+ ): number {
91
+ const perUnitAmt = toNum(row?.PerUnitAmt ?? row?.perUnitAmt);
92
+ const qty = getTaxRowQty(row, fallbackQty);
93
+
94
+ if (perUnitAmt !== 0 && qty !== 0) {
95
+ return Multiply(perUnitAmt, qty);
96
+ }
97
+
98
+ return fallbackToAmt ? toNum(row?.Amt ?? row?.amt) : 0;
99
+ }
100
+
101
+ function getReverseTaxBreakdown(taxes: any, qty: number): {
102
+ fixedTaxAmount: number;
103
+ percentTaxRate: number;
104
+ } {
105
+ return getTaxesArray(taxes).reduce(
106
+ (summary, row) => {
107
+ const calcMethod = normalizeCalcMethod(row?.CalcMethod ?? row?.calcMethod);
108
+ const rate = toNum(row?.Rate ?? row?.rate);
109
+
110
+ switch (calcMethod) {
111
+ case 'PerUnit':
112
+ summary.fixedTaxAmount = Add(
113
+ summary.fixedTaxAmount,
114
+ getPerUnitTaxAmount(row, qty),
115
+ );
116
+ break;
117
+
118
+ case 'PerUnitPlusPercent':
119
+ summary.fixedTaxAmount = Add(
120
+ summary.fixedTaxAmount,
121
+ getPerUnitTaxAmount(row, qty, false),
122
+ );
123
+ summary.percentTaxRate = Add(summary.percentTaxRate, rate);
124
+ break;
125
+
126
+ case 'MaxOfPercentOrPerUnit': {
127
+ const amt = toNum(row?.Amt ?? row?.amt);
128
+ const perUnitAmt = getPerUnitTaxAmount(row, qty);
129
+ if (amt !== 0) {
130
+ summary.fixedTaxAmount = Add(summary.fixedTaxAmount, amt);
131
+ } else if (perUnitAmt !== 0) {
132
+ summary.fixedTaxAmount = Add(summary.fixedTaxAmount, perUnitAmt);
133
+ } else {
134
+ summary.percentTaxRate = Add(summary.percentTaxRate, rate);
135
+ }
136
+ break;
137
+ }
138
+
139
+ case 'Percent':
140
+ default:
141
+ summary.percentTaxRate = Add(summary.percentTaxRate, rate);
142
+ break;
143
+ }
144
+
145
+ return summary;
146
+ },
147
+ { fixedTaxAmount: 0, percentTaxRate: 0 },
148
+ );
149
+ }
75
150
 
76
151
  /**
77
152
  * Distribute a flat discount amount across a set of rows proportionally
@@ -153,26 +228,30 @@ export class TransactionCalculationEngine {
153
228
  : baseAmount;
154
229
  }
155
230
 
156
- static calculateSubtotalFromTotalUsingTaxes(input: {
157
- total: number;
158
- taxRows: unknown;
159
- includeTaxInTotal: boolean;
160
- }): number {
161
- const total = toNum(input.total);
162
- if (!input.includeTaxInTotal) {
163
- return total;
164
- }
165
-
166
- const taxSummary = TransactionCalculationEngine.getTaxesSummary(
167
- input.taxRows,
168
- );
169
- if (taxSummary.taxRate) {
170
- const divisor = Add(1, Divide(taxSummary.taxRate, 100));
171
- return divisor === 0 ? total : Divide(total, divisor);
172
- }
173
-
174
- return Subtract(total, taxSummary.taxAmount);
175
- }
231
+ static calculateSubtotalFromTotalUsingTaxes(input: {
232
+ total: number;
233
+ taxRows: unknown;
234
+ includeTaxInTotal: boolean;
235
+ qty?: number;
236
+ }): number {
237
+ const total = toNum(input.total);
238
+ if (!input.includeTaxInTotal) {
239
+ return total;
240
+ }
241
+
242
+ const taxBreakdown = getReverseTaxBreakdown(
243
+ input.taxRows,
244
+ toNum(input.qty) || 1,
245
+ );
246
+ const totalAfterFixedTax = Subtract(total, taxBreakdown.fixedTaxAmount);
247
+
248
+ if (taxBreakdown.percentTaxRate) {
249
+ const divisor = Add(1, Divide(taxBreakdown.percentTaxRate, 100));
250
+ return divisor === 0 ? totalAfterFixedTax : Divide(totalAfterFixedTax, divisor);
251
+ }
252
+
253
+ return totalAfterFixedTax;
254
+ }
176
255
 
177
256
  static reverseCalculateAmountAndUnitPriceFromTotal(input: {
178
257
  qty: number;
@@ -185,11 +264,12 @@ export class TransactionCalculationEngine {
185
264
  }): { amount: number; unitPrice: number } {
186
265
  const qty = toNum(input.qty) || 1;
187
266
  const subtotal =
188
- TransactionCalculationEngine.calculateSubtotalFromTotalUsingTaxes({
189
- total: input.total,
190
- taxRows: input.taxRows,
191
- includeTaxInTotal: input.includeTaxInTotal,
192
- });
267
+ TransactionCalculationEngine.calculateSubtotalFromTotalUsingTaxes({
268
+ total: input.total,
269
+ taxRows: input.taxRows,
270
+ includeTaxInTotal: input.includeTaxInTotal,
271
+ qty,
272
+ });
193
273
 
194
274
  const disc = toNum(input.disc);
195
275
  const recDisc = toNum(input.recDisc);
@@ -474,19 +554,15 @@ export class TransactionCalculationEngine {
474
554
  return { ...item };
475
555
  }
476
556
 
477
- const taxSummary = TransactionCalculationEngine.getTaxesSummary(
478
- item?.Taxes ?? item?.taxes,
479
- );
480
-
481
- // If total doesn't include tax, treat it as "already stripped".
482
- const subtotal = includeTaxInTotal
483
- ? taxSummary.taxAmount !== 0
484
- ? Subtract(total, taxSummary.taxAmount)
485
- : (() => {
486
- const divisor = Add(1, Divide(taxSummary.taxRate, 100));
487
- return Divide(total, divisor === 0 ? 1 : divisor);
488
- })()
489
- : total;
557
+ // If total doesn't include tax, treat it as "already stripped".
558
+ const subtotal = includeTaxInTotal
559
+ ? TransactionCalculationEngine.calculateSubtotalFromTotalUsingTaxes({
560
+ total,
561
+ taxRows: item?.Taxes ?? item?.taxes,
562
+ includeTaxInTotal,
563
+ qty,
564
+ })
565
+ : total;
490
566
 
491
567
  if (item.NoDisc) {
492
568
  const unpr = Divide(subtotal, qty);