@fin.cx/einvoice 5.0.3 → 5.1.3
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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/einvoice.d.ts +4 -8
- package/dist_ts/einvoice.js +46 -7
- package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
- package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
- package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
- package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
- package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
- package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
- package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
- package/dist_ts/formats/semantic/semantic.validator.js +596 -0
- package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
- package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
- package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
- package/dist_ts/formats/utils/currency.utils.js +250 -0
- package/dist_ts/formats/utils/decimal.d.ts +151 -0
- package/dist_ts/formats/utils/decimal.js +435 -0
- package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
- package/dist_ts/formats/validation/codelist.validator.js +188 -0
- package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
- package/dist_ts/formats/validation/conformance.harness.js +471 -0
- package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
- package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
- package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
- package/dist_ts/formats/validation/facturx.validator.js +522 -0
- package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
- package/dist_ts/formats/validation/integrated.validator.js +311 -0
- package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
- package/dist_ts/formats/validation/peppol.validator.js +529 -0
- package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
- package/dist_ts/formats/validation/schematron.downloader.js +254 -0
- package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
- package/dist_ts/formats/validation/schematron.integration.js +230 -0
- package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
- package/dist_ts/formats/validation/schematron.validator.js +288 -0
- package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
- package/dist_ts/formats/validation/schematron.worker.js +185 -0
- package/dist_ts/formats/validation/validation.types.d.ts +163 -0
- package/dist_ts/formats/validation/validation.types.js +181 -0
- package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
- package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
- package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
- package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
- package/dist_ts/interfaces/common.d.ts +1 -0
- package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
- package/dist_ts/interfaces/en16931-metadata.js +6 -0
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +7 -2
- package/dist_ts_install/download-schematron.d.ts +6 -0
- package/dist_ts_install/download-schematron.js +62 -0
- package/dist_ts_install/download-test-samples.d.ts +19 -0
- package/dist_ts_install/download-test-samples.js +169 -0
- package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
- package/dist_ts_install/download-xrechnung-rules.js +146 -0
- package/dist_ts_install/index.d.ts +8 -0
- package/dist_ts_install/index.js +246 -0
- package/npmextra.json +1 -1
- package/package.json +12 -6
- package/readme.md +255 -810
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/einvoice.ts +63 -14
- package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
- package/ts/formats/semantic/bt-bg.model.ts +524 -0
- package/ts/formats/semantic/semantic.adapter.ts +600 -0
- package/ts/formats/semantic/semantic.validator.ts +654 -0
- package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
- package/ts/formats/utils/currency.utils.ts +299 -0
- package/ts/formats/utils/decimal.ts +509 -0
- package/ts/formats/validation/codelist.validator.ts +317 -0
- package/ts/formats/validation/conformance.harness.ts +591 -0
- package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
- package/ts/formats/validation/facturx.validator.ts +579 -0
- package/ts/formats/validation/integrated.validator.ts +405 -0
- package/ts/formats/validation/peppol.validator.ts +589 -0
- package/ts/formats/validation/schematron.downloader.ts +304 -0
- package/ts/formats/validation/schematron.integration.ts +285 -0
- package/ts/formats/validation/schematron.validator.ts +348 -0
- package/ts/formats/validation/schematron.worker.ts +221 -0
- package/ts/formats/validation/validation.types.ts +274 -0
- package/ts/formats/validation/vat-categories.validator.ts +845 -0
- package/ts/formats/validation/xrechnung.validator.ts +494 -0
- package/ts/interfaces/common.ts +1 -0
- package/ts/interfaces/en16931-metadata.ts +104 -0
- package/ts/plugins.ts +8 -0
- package/ts/tspublish.json +3 -0
- package/dist_ts/classes.decoder.d.ts +0 -40
- package/dist_ts/classes.decoder.js +0 -320
- package/dist_ts/classes.encoder.d.ts +0 -51
- package/dist_ts/classes.encoder.js +0 -293
- package/dist_ts/classes.xinvoice.d.ts +0 -136
- package/dist_ts/classes.xinvoice.js +0 -352
- package/dist_ts/formats/base.decoder.d.ts +0 -19
- package/dist_ts/formats/base.decoder.js +0 -130
- package/dist_ts/formats/base.validator.d.ts +0 -44
- package/dist_ts/formats/base.validator.js +0 -39
- package/dist_ts/formats/decoder.factory.d.ts +0 -15
- package/dist_ts/formats/decoder.factory.js +0 -46
- package/dist_ts/formats/factorx.decoder.d.ts +0 -18
- package/dist_ts/formats/factorx.decoder.js +0 -178
- package/dist_ts/formats/factorx.encoder.d.ts +0 -51
- package/dist_ts/formats/factorx.encoder.js +0 -293
- package/dist_ts/formats/facturx.decoder.d.ts +0 -18
- package/dist_ts/formats/facturx.decoder.js +0 -210
- package/dist_ts/formats/facturx.encoder.d.ts +0 -51
- package/dist_ts/formats/facturx.encoder.js +0 -293
- package/dist_ts/formats/facturx.validator.d.ts +0 -67
- package/dist_ts/formats/facturx.validator.js +0 -266
- package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
- package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
- package/dist_ts/formats/ubl.validator.d.ts +0 -82
- package/dist_ts/formats/ubl.validator.js +0 -306
- package/dist_ts/formats/validator.factory.d.ts +0 -18
- package/dist_ts/formats/validator.factory.js +0 -78
- package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
- package/dist_ts/formats/xinvoice.decoder.js +0 -332
- package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
- package/dist_ts/formats/xinvoice.encoder.js +0 -282
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Currency Calculator using Decimal Arithmetic
|
|
3
|
+
* EN16931-compliant monetary calculations with exact precision
|
|
4
|
+
*/
|
|
5
|
+
import { Decimal, RoundingMode } from './decimal.js';
|
|
6
|
+
import type { TCurrency } from '@tsclass/tsclass/dist_ts/finance/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Currency-aware calculator using decimal arithmetic for EN16931 compliance
|
|
9
|
+
*/
|
|
10
|
+
export declare class DecimalCurrencyCalculator {
|
|
11
|
+
private readonly currency;
|
|
12
|
+
private readonly minorUnits;
|
|
13
|
+
private readonly roundingMode;
|
|
14
|
+
constructor(currency: TCurrency, roundingMode?: RoundingMode);
|
|
15
|
+
/**
|
|
16
|
+
* Round a decimal value according to currency rules
|
|
17
|
+
*/
|
|
18
|
+
round(value: Decimal | number | string): Decimal;
|
|
19
|
+
/**
|
|
20
|
+
* Calculate line net amount: (quantity × unitPrice) - discount
|
|
21
|
+
*/
|
|
22
|
+
calculateLineNet(quantity: Decimal | number | string, unitPrice: Decimal | number | string, discount?: Decimal | number | string): Decimal;
|
|
23
|
+
/**
|
|
24
|
+
* Calculate VAT amount from base and rate
|
|
25
|
+
*/
|
|
26
|
+
calculateVAT(baseAmount: Decimal | number | string, vatRate: Decimal | number | string): Decimal;
|
|
27
|
+
/**
|
|
28
|
+
* Calculate total with VAT
|
|
29
|
+
*/
|
|
30
|
+
calculateGrossAmount(netAmount: Decimal | number | string, vatAmount: Decimal | number | string): Decimal;
|
|
31
|
+
/**
|
|
32
|
+
* Calculate sum of line items
|
|
33
|
+
*/
|
|
34
|
+
sumLineItems(items: Array<{
|
|
35
|
+
quantity: Decimal | number | string;
|
|
36
|
+
unitPrice: Decimal | number | string;
|
|
37
|
+
discount?: Decimal | number | string;
|
|
38
|
+
}>): Decimal;
|
|
39
|
+
/**
|
|
40
|
+
* Calculate VAT breakdown by rate
|
|
41
|
+
*/
|
|
42
|
+
calculateVATBreakdown(items: Array<{
|
|
43
|
+
netAmount: Decimal | number | string;
|
|
44
|
+
vatRate: Decimal | number | string;
|
|
45
|
+
}>): Array<{
|
|
46
|
+
rate: Decimal;
|
|
47
|
+
baseAmount: Decimal;
|
|
48
|
+
vatAmount: Decimal;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Check if two amounts are equal within currency precision
|
|
52
|
+
*/
|
|
53
|
+
areEqual(amount1: Decimal | number | string, amount2: Decimal | number | string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Calculate payment terms discount
|
|
56
|
+
*/
|
|
57
|
+
calculatePaymentDiscount(amount: Decimal | number | string, discountRate: Decimal | number | string): Decimal;
|
|
58
|
+
/**
|
|
59
|
+
* Distribute a total amount across items proportionally
|
|
60
|
+
*/
|
|
61
|
+
distributeAmount(totalToDistribute: Decimal | number | string, items: Array<{
|
|
62
|
+
value: Decimal | number | string;
|
|
63
|
+
}>): Decimal[];
|
|
64
|
+
/**
|
|
65
|
+
* Calculate compound amount (e.g., for multiple charges/allowances)
|
|
66
|
+
*/
|
|
67
|
+
calculateCompoundAmount(baseAmount: Decimal | number | string, adjustments: Array<{
|
|
68
|
+
type: 'charge' | 'allowance';
|
|
69
|
+
value: Decimal | number | string;
|
|
70
|
+
isPercentage?: boolean;
|
|
71
|
+
}>): Decimal;
|
|
72
|
+
/**
|
|
73
|
+
* Validate monetary calculation according to EN16931 rules
|
|
74
|
+
*/
|
|
75
|
+
validateCalculation(expected: Decimal | number | string, calculated: Decimal | number | string, ruleName: string): {
|
|
76
|
+
valid: boolean;
|
|
77
|
+
expected: string;
|
|
78
|
+
calculated: string;
|
|
79
|
+
difference?: string;
|
|
80
|
+
rule: string;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Format amount for display
|
|
84
|
+
*/
|
|
85
|
+
formatAmount(amount: Decimal | number | string): string;
|
|
86
|
+
/**
|
|
87
|
+
* Get currency information
|
|
88
|
+
*/
|
|
89
|
+
getCurrencyInfo(): {
|
|
90
|
+
code: TCurrency;
|
|
91
|
+
minorUnits: number;
|
|
92
|
+
roundingMode: RoundingMode;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Factory function to create a decimal currency calculator
|
|
97
|
+
*/
|
|
98
|
+
export declare function createDecimalCalculator(currency: TCurrency, roundingMode?: RoundingMode): DecimalCurrencyCalculator;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Currency Calculator using Decimal Arithmetic
|
|
3
|
+
* EN16931-compliant monetary calculations with exact precision
|
|
4
|
+
*/
|
|
5
|
+
import { Decimal, decimal, RoundingMode } from './decimal.js';
|
|
6
|
+
import { getCurrencyMinorUnits } from './currency.utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Currency-aware calculator using decimal arithmetic for EN16931 compliance
|
|
9
|
+
*/
|
|
10
|
+
export class DecimalCurrencyCalculator {
|
|
11
|
+
constructor(currency, roundingMode = 'HALF_UP') {
|
|
12
|
+
this.currency = currency;
|
|
13
|
+
this.minorUnits = getCurrencyMinorUnits(currency);
|
|
14
|
+
this.roundingMode = roundingMode;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Round a decimal value according to currency rules
|
|
18
|
+
*/
|
|
19
|
+
round(value) {
|
|
20
|
+
const decimalValue = value instanceof Decimal ? value : new Decimal(value);
|
|
21
|
+
return decimalValue.round(this.minorUnits, this.roundingMode);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculate line net amount: (quantity × unitPrice) - discount
|
|
25
|
+
*/
|
|
26
|
+
calculateLineNet(quantity, unitPrice, discount = '0') {
|
|
27
|
+
const qty = quantity instanceof Decimal ? quantity : new Decimal(quantity);
|
|
28
|
+
const price = unitPrice instanceof Decimal ? unitPrice : new Decimal(unitPrice);
|
|
29
|
+
const disc = discount instanceof Decimal ? discount : new Decimal(discount);
|
|
30
|
+
const gross = qty.multiply(price);
|
|
31
|
+
const net = gross.subtract(disc);
|
|
32
|
+
return this.round(net);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate VAT amount from base and rate
|
|
36
|
+
*/
|
|
37
|
+
calculateVAT(baseAmount, vatRate) {
|
|
38
|
+
const base = baseAmount instanceof Decimal ? baseAmount : new Decimal(baseAmount);
|
|
39
|
+
const rate = vatRate instanceof Decimal ? vatRate : new Decimal(vatRate);
|
|
40
|
+
const vat = base.percentage(rate);
|
|
41
|
+
return this.round(vat);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Calculate total with VAT
|
|
45
|
+
*/
|
|
46
|
+
calculateGrossAmount(netAmount, vatAmount) {
|
|
47
|
+
const net = netAmount instanceof Decimal ? netAmount : new Decimal(netAmount);
|
|
48
|
+
const vat = vatAmount instanceof Decimal ? vatAmount : new Decimal(vatAmount);
|
|
49
|
+
return this.round(net.add(vat));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Calculate sum of line items
|
|
53
|
+
*/
|
|
54
|
+
sumLineItems(items) {
|
|
55
|
+
let total = Decimal.ZERO;
|
|
56
|
+
for (const item of items) {
|
|
57
|
+
const lineNet = this.calculateLineNet(item.quantity, item.unitPrice, item.discount);
|
|
58
|
+
total = total.add(lineNet);
|
|
59
|
+
}
|
|
60
|
+
return this.round(total);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calculate VAT breakdown by rate
|
|
64
|
+
*/
|
|
65
|
+
calculateVATBreakdown(items) {
|
|
66
|
+
// Group by VAT rate
|
|
67
|
+
const groups = new Map();
|
|
68
|
+
for (const item of items) {
|
|
69
|
+
const net = item.netAmount instanceof Decimal ? item.netAmount : new Decimal(item.netAmount);
|
|
70
|
+
const rate = item.vatRate instanceof Decimal ? item.vatRate : new Decimal(item.vatRate);
|
|
71
|
+
const rateKey = rate.toString();
|
|
72
|
+
if (groups.has(rateKey)) {
|
|
73
|
+
const group = groups.get(rateKey);
|
|
74
|
+
group.baseAmount = group.baseAmount.add(net);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
groups.set(rateKey, {
|
|
78
|
+
rate,
|
|
79
|
+
baseAmount: net
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Calculate VAT for each group
|
|
84
|
+
const breakdown = [];
|
|
85
|
+
for (const group of groups.values()) {
|
|
86
|
+
breakdown.push({
|
|
87
|
+
rate: group.rate,
|
|
88
|
+
baseAmount: this.round(group.baseAmount),
|
|
89
|
+
vatAmount: this.calculateVAT(group.baseAmount, group.rate)
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return breakdown;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if two amounts are equal within currency precision
|
|
96
|
+
*/
|
|
97
|
+
areEqual(amount1, amount2) {
|
|
98
|
+
const a1 = amount1 instanceof Decimal ? amount1 : new Decimal(amount1);
|
|
99
|
+
const a2 = amount2 instanceof Decimal ? amount2 : new Decimal(amount2);
|
|
100
|
+
// Round both to currency precision before comparing
|
|
101
|
+
const rounded1 = this.round(a1);
|
|
102
|
+
const rounded2 = this.round(a2);
|
|
103
|
+
return rounded1.equals(rounded2);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Calculate payment terms discount
|
|
107
|
+
*/
|
|
108
|
+
calculatePaymentDiscount(amount, discountRate) {
|
|
109
|
+
const amt = amount instanceof Decimal ? amount : new Decimal(amount);
|
|
110
|
+
const rate = discountRate instanceof Decimal ? discountRate : new Decimal(discountRate);
|
|
111
|
+
const discount = amt.percentage(rate);
|
|
112
|
+
return this.round(discount);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Distribute a total amount across items proportionally
|
|
116
|
+
*/
|
|
117
|
+
distributeAmount(totalToDistribute, items) {
|
|
118
|
+
const total = totalToDistribute instanceof Decimal ? totalToDistribute : new Decimal(totalToDistribute);
|
|
119
|
+
// Calculate sum of all item values
|
|
120
|
+
const itemSum = items.reduce((sum, item) => {
|
|
121
|
+
const value = item.value instanceof Decimal ? item.value : new Decimal(item.value);
|
|
122
|
+
return sum.add(value);
|
|
123
|
+
}, Decimal.ZERO);
|
|
124
|
+
if (itemSum.isZero()) {
|
|
125
|
+
// Can't distribute if sum is zero
|
|
126
|
+
return items.map(() => Decimal.ZERO);
|
|
127
|
+
}
|
|
128
|
+
const distributed = [];
|
|
129
|
+
let distributedSum = Decimal.ZERO;
|
|
130
|
+
// Distribute proportionally
|
|
131
|
+
for (let i = 0; i < items.length; i++) {
|
|
132
|
+
const itemValue = items[i].value instanceof Decimal ? items[i].value : new Decimal(items[i].value);
|
|
133
|
+
if (i === items.length - 1) {
|
|
134
|
+
// Last item gets the remainder to avoid rounding errors
|
|
135
|
+
distributed.push(total.subtract(distributedSum));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const itemDecimal = itemValue instanceof Decimal ? itemValue : new Decimal(itemValue);
|
|
139
|
+
const proportion = itemDecimal.divide(itemSum);
|
|
140
|
+
const distributedAmount = this.round(total.multiply(proportion));
|
|
141
|
+
distributed.push(distributedAmount);
|
|
142
|
+
distributedSum = distributedSum.add(distributedAmount);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return distributed;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Calculate compound amount (e.g., for multiple charges/allowances)
|
|
149
|
+
*/
|
|
150
|
+
calculateCompoundAmount(baseAmount, adjustments) {
|
|
151
|
+
let result = baseAmount instanceof Decimal ? baseAmount : new Decimal(baseAmount);
|
|
152
|
+
for (const adjustment of adjustments) {
|
|
153
|
+
const value = adjustment.value instanceof Decimal ? adjustment.value : new Decimal(adjustment.value);
|
|
154
|
+
let adjustmentAmount;
|
|
155
|
+
if (adjustment.isPercentage) {
|
|
156
|
+
adjustmentAmount = result.percentage(value);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
adjustmentAmount = value;
|
|
160
|
+
}
|
|
161
|
+
if (adjustment.type === 'charge') {
|
|
162
|
+
result = result.add(adjustmentAmount);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
result = result.subtract(adjustmentAmount);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return this.round(result);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Validate monetary calculation according to EN16931 rules
|
|
172
|
+
*/
|
|
173
|
+
validateCalculation(expected, calculated, ruleName) {
|
|
174
|
+
const exp = expected instanceof Decimal ? expected : new Decimal(expected);
|
|
175
|
+
const calc = calculated instanceof Decimal ? calculated : new Decimal(calculated);
|
|
176
|
+
const roundedExp = this.round(exp);
|
|
177
|
+
const roundedCalc = this.round(calc);
|
|
178
|
+
const valid = roundedExp.equals(roundedCalc);
|
|
179
|
+
return {
|
|
180
|
+
valid,
|
|
181
|
+
expected: roundedExp.toFixed(this.minorUnits),
|
|
182
|
+
calculated: roundedCalc.toFixed(this.minorUnits),
|
|
183
|
+
difference: valid ? undefined : roundedExp.subtract(roundedCalc).abs().toFixed(this.minorUnits),
|
|
184
|
+
rule: ruleName
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Format amount for display
|
|
189
|
+
*/
|
|
190
|
+
formatAmount(amount) {
|
|
191
|
+
const amt = amount instanceof Decimal ? amount : new Decimal(amount);
|
|
192
|
+
const rounded = this.round(amt);
|
|
193
|
+
return `${rounded.toFixed(this.minorUnits)} ${this.currency}`;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get currency information
|
|
197
|
+
*/
|
|
198
|
+
getCurrencyInfo() {
|
|
199
|
+
return {
|
|
200
|
+
code: this.currency,
|
|
201
|
+
minorUnits: this.minorUnits,
|
|
202
|
+
roundingMode: this.roundingMode
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Factory function to create a decimal currency calculator
|
|
208
|
+
*/
|
|
209
|
+
export function createDecimalCalculator(currency, roundingMode) {
|
|
210
|
+
return new DecimalCurrencyCalculator(currency, roundingMode);
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3kuY2FsY3VsYXRvci5kZWNpbWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy91dGlscy9jdXJyZW5jeS5jYWxjdWxhdG9yLmRlY2ltYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHlCQUF5QjtJQUtwQyxZQUNFLFFBQW1CLEVBQ25CLGVBQTZCLFNBQVM7UUFFdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsS0FBZ0M7UUFDcEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRSxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQ2QsUUFBbUMsRUFDbkMsU0FBb0MsRUFDcEMsV0FBc0MsR0FBRztRQUV6QyxNQUFNLEdBQUcsR0FBRyxRQUFRLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sS0FBSyxHQUFHLFNBQVMsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEYsTUFBTSxJQUFJLEdBQUcsUUFBUSxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1RSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FDVixVQUFxQyxFQUNyQyxPQUFrQztRQUVsQyxNQUFNLElBQUksR0FBRyxVQUFVLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sSUFBSSxHQUFHLE9BQU8sWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLENBQ2xCLFNBQW9DLEVBQ3BDLFNBQW9DO1FBRXBDLE1BQU0sR0FBRyxHQUFHLFNBQVMsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUUsTUFBTSxHQUFHLEdBQUcsU0FBUyxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5RSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxLQUlYO1FBQ0EsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUV6QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkMsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztZQUNGLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCLENBQUMsS0FHcEI7UUFLQSxvQkFBb0I7UUFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBR2xCLENBQUM7UUFFTCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFaEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLENBQUM7Z0JBQ25DLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO29CQUNsQixJQUFJO29CQUNKLFVBQVUsRUFBRSxHQUFHO2lCQUNoQixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELCtCQUErQjtRQUMvQixNQUFNLFNBQVMsR0FJVixFQUFFLENBQUM7UUFFUixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUN4QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDM0QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FDTixPQUFrQyxFQUNsQyxPQUFrQztRQUVsQyxNQUFNLEVBQUUsR0FBRyxPQUFPLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sRUFBRSxHQUFHLE9BQU8sWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkUsb0RBQW9EO1FBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVoQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCLENBQ3RCLE1BQWlDLEVBQ2pDLFlBQXVDO1FBRXZDLE1BQU0sR0FBRyxHQUFHLE1BQU0sWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckUsTUFBTSxJQUFJLEdBQUcsWUFBWSxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV4RixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FDZCxpQkFBNEMsRUFDNUMsS0FBa0Q7UUFFbEQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV4RyxtQ0FBbUM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25GLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDckIsa0NBQWtDO1lBQ2xDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFjLEVBQUUsQ0FBQztRQUNsQyxJQUFJLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRWxDLDRCQUE0QjtRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbkcsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0Isd0RBQXdEO2dCQUN4RCxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUNuRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxXQUFXLEdBQUcsU0FBUyxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEYsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDakUsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNwQyxjQUFjLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsdUJBQXVCLENBQ3JCLFVBQXFDLEVBQ3JDLFdBSUU7UUFFRixJQUFJLE1BQU0sR0FBRyxVQUFVLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxGLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFLENBQUM7WUFDckMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVyRyxJQUFJLGdCQUF5QixDQUFDO1lBQzlCLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM1QixnQkFBZ0IsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztZQUVELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN4QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUIsQ0FDakIsUUFBbUMsRUFDbkMsVUFBcUMsRUFDckMsUUFBZ0I7UUFRaEIsTUFBTSxHQUFHLEdBQUcsUUFBUSxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRSxNQUFNLElBQUksR0FBRyxVQUFVLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLE9BQU87WUFDTCxLQUFLO1lBQ0wsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM3QyxVQUFVLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2hELFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvRixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsTUFBaUM7UUFDNUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUtiLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLFFBQW1CLEVBQ25CLFlBQTJCO0lBRTNCLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDL0QsQ0FBQyJ9
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ISO 4217 Currency utilities for EN16931 compliance
|
|
3
|
+
* Provides currency-aware rounding and decimal handling
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* ISO 4217 Currency minor units (decimal places)
|
|
7
|
+
* Based on ISO 4217:2015 standard
|
|
8
|
+
*
|
|
9
|
+
* Most currencies use 2 decimal places, but there are exceptions:
|
|
10
|
+
* - 0 decimals: JPY, KRW, CLP, etc.
|
|
11
|
+
* - 3 decimals: BHD, IQD, JOD, KWD, OMR, TND
|
|
12
|
+
* - 4 decimals: CLF (Chilean Unit of Account)
|
|
13
|
+
*/
|
|
14
|
+
export declare const ISO4217MinorUnits: Record<string, number>;
|
|
15
|
+
/**
|
|
16
|
+
* Rounding modes for currency calculations
|
|
17
|
+
*/
|
|
18
|
+
export declare enum RoundingMode {
|
|
19
|
+
HALF_UP = "HALF_UP",// Round half values up (0.5 → 1, -0.5 → -1)
|
|
20
|
+
HALF_DOWN = "HALF_DOWN",// Round half values down (0.5 → 0, -0.5 → 0)
|
|
21
|
+
HALF_EVEN = "HALF_EVEN",// Banker's rounding (0.5 → 0, 1.5 → 2)
|
|
22
|
+
UP = "UP",// Always round up
|
|
23
|
+
DOWN = "DOWN",// Always round down (truncate)
|
|
24
|
+
CEILING = "CEILING",// Round toward positive infinity
|
|
25
|
+
FLOOR = "FLOOR"
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Currency configuration for calculations
|
|
29
|
+
*/
|
|
30
|
+
export interface CurrencyConfig {
|
|
31
|
+
code: string;
|
|
32
|
+
minorUnits: number;
|
|
33
|
+
roundingMode: RoundingMode;
|
|
34
|
+
tolerance?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get minor units (decimal places) for a currency
|
|
38
|
+
*/
|
|
39
|
+
export declare function getCurrencyMinorUnits(currencyCode: string): number;
|
|
40
|
+
/**
|
|
41
|
+
* Round a value according to currency rules
|
|
42
|
+
*/
|
|
43
|
+
export declare function roundToCurrency(value: number, currencyCode: string, mode?: RoundingMode): number;
|
|
44
|
+
/**
|
|
45
|
+
* Get tolerance for currency comparison
|
|
46
|
+
* Based on the smallest representable unit for the currency
|
|
47
|
+
*/
|
|
48
|
+
export declare function getCurrencyTolerance(currencyCode: string): number;
|
|
49
|
+
/**
|
|
50
|
+
* Compare two monetary values with currency-aware tolerance
|
|
51
|
+
*/
|
|
52
|
+
export declare function areMonetaryValuesEqual(value1: number, value2: number, currencyCode: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Format a value according to currency decimal places
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatCurrencyValue(value: number, currencyCode: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Validate if a value has correct decimal places for a currency
|
|
59
|
+
*/
|
|
60
|
+
export declare function hasValidDecimalPlaces(value: number, currencyCode: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Currency calculation context for EN16931 compliance
|
|
63
|
+
*/
|
|
64
|
+
export declare class CurrencyCalculator {
|
|
65
|
+
private currency;
|
|
66
|
+
private minorUnits;
|
|
67
|
+
private roundingMode;
|
|
68
|
+
constructor(config: CurrencyConfig | string);
|
|
69
|
+
/**
|
|
70
|
+
* Round a value according to configured rules
|
|
71
|
+
*/
|
|
72
|
+
round(value: number): number;
|
|
73
|
+
/**
|
|
74
|
+
* Calculate line net amount with rounding
|
|
75
|
+
* EN16931: Line net = (quantity × unit price) - line discounts
|
|
76
|
+
*/
|
|
77
|
+
calculateLineNet(quantity: number, unitPrice: number, discount?: number): number;
|
|
78
|
+
/**
|
|
79
|
+
* Calculate VAT amount with rounding
|
|
80
|
+
* EN16931: VAT amount = taxable amount × (rate / 100)
|
|
81
|
+
*/
|
|
82
|
+
calculateVAT(taxableAmount: number, rate: number): number;
|
|
83
|
+
/**
|
|
84
|
+
* Compare values with currency-aware tolerance
|
|
85
|
+
*/
|
|
86
|
+
areEqual(value1: number, value2: number): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Get the tolerance for comparisons
|
|
89
|
+
*/
|
|
90
|
+
getTolerance(): number;
|
|
91
|
+
/**
|
|
92
|
+
* Format value for display
|
|
93
|
+
*/
|
|
94
|
+
format(value: number): string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get version info for ISO 4217 data
|
|
98
|
+
*/
|
|
99
|
+
export declare function getISO4217Version(): string;
|