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.
|
@@ -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
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
|
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
|
-
?
|
|
376
|
-
|
|
377
|
-
: (
|
|
378
|
-
|
|
379
|
-
|
|
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
|
@@ -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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
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);
|