@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.
Files changed (117) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/einvoice.d.ts +4 -8
  3. package/dist_ts/einvoice.js +46 -7
  4. package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
  5. package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
  6. package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
  7. package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
  8. package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
  9. package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
  10. package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
  11. package/dist_ts/formats/semantic/semantic.validator.js +596 -0
  12. package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
  13. package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
  14. package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
  15. package/dist_ts/formats/utils/currency.utils.js +250 -0
  16. package/dist_ts/formats/utils/decimal.d.ts +151 -0
  17. package/dist_ts/formats/utils/decimal.js +435 -0
  18. package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
  19. package/dist_ts/formats/validation/codelist.validator.js +188 -0
  20. package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
  21. package/dist_ts/formats/validation/conformance.harness.js +471 -0
  22. package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
  23. package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
  24. package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
  25. package/dist_ts/formats/validation/facturx.validator.js +522 -0
  26. package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
  27. package/dist_ts/formats/validation/integrated.validator.js +311 -0
  28. package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
  29. package/dist_ts/formats/validation/peppol.validator.js +529 -0
  30. package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
  31. package/dist_ts/formats/validation/schematron.downloader.js +254 -0
  32. package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
  33. package/dist_ts/formats/validation/schematron.integration.js +230 -0
  34. package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
  35. package/dist_ts/formats/validation/schematron.validator.js +288 -0
  36. package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
  37. package/dist_ts/formats/validation/schematron.worker.js +185 -0
  38. package/dist_ts/formats/validation/validation.types.d.ts +163 -0
  39. package/dist_ts/formats/validation/validation.types.js +181 -0
  40. package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
  41. package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
  42. package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
  43. package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
  44. package/dist_ts/interfaces/common.d.ts +1 -0
  45. package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
  46. package/dist_ts/interfaces/en16931-metadata.js +6 -0
  47. package/dist_ts/plugins.d.ts +3 -1
  48. package/dist_ts/plugins.js +7 -2
  49. package/dist_ts_install/download-schematron.d.ts +6 -0
  50. package/dist_ts_install/download-schematron.js +62 -0
  51. package/dist_ts_install/download-test-samples.d.ts +19 -0
  52. package/dist_ts_install/download-test-samples.js +169 -0
  53. package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
  54. package/dist_ts_install/download-xrechnung-rules.js +146 -0
  55. package/dist_ts_install/index.d.ts +8 -0
  56. package/dist_ts_install/index.js +246 -0
  57. package/npmextra.json +1 -1
  58. package/package.json +12 -6
  59. package/readme.md +255 -810
  60. package/ts/00_commitinfo_data.ts +1 -1
  61. package/ts/einvoice.ts +63 -14
  62. package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
  63. package/ts/formats/semantic/bt-bg.model.ts +524 -0
  64. package/ts/formats/semantic/semantic.adapter.ts +600 -0
  65. package/ts/formats/semantic/semantic.validator.ts +654 -0
  66. package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
  67. package/ts/formats/utils/currency.utils.ts +299 -0
  68. package/ts/formats/utils/decimal.ts +509 -0
  69. package/ts/formats/validation/codelist.validator.ts +317 -0
  70. package/ts/formats/validation/conformance.harness.ts +591 -0
  71. package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
  72. package/ts/formats/validation/facturx.validator.ts +579 -0
  73. package/ts/formats/validation/integrated.validator.ts +405 -0
  74. package/ts/formats/validation/peppol.validator.ts +589 -0
  75. package/ts/formats/validation/schematron.downloader.ts +304 -0
  76. package/ts/formats/validation/schematron.integration.ts +285 -0
  77. package/ts/formats/validation/schematron.validator.ts +348 -0
  78. package/ts/formats/validation/schematron.worker.ts +221 -0
  79. package/ts/formats/validation/validation.types.ts +274 -0
  80. package/ts/formats/validation/vat-categories.validator.ts +845 -0
  81. package/ts/formats/validation/xrechnung.validator.ts +494 -0
  82. package/ts/interfaces/common.ts +1 -0
  83. package/ts/interfaces/en16931-metadata.ts +104 -0
  84. package/ts/plugins.ts +8 -0
  85. package/ts/tspublish.json +3 -0
  86. package/dist_ts/classes.decoder.d.ts +0 -40
  87. package/dist_ts/classes.decoder.js +0 -320
  88. package/dist_ts/classes.encoder.d.ts +0 -51
  89. package/dist_ts/classes.encoder.js +0 -293
  90. package/dist_ts/classes.xinvoice.d.ts +0 -136
  91. package/dist_ts/classes.xinvoice.js +0 -352
  92. package/dist_ts/formats/base.decoder.d.ts +0 -19
  93. package/dist_ts/formats/base.decoder.js +0 -130
  94. package/dist_ts/formats/base.validator.d.ts +0 -44
  95. package/dist_ts/formats/base.validator.js +0 -39
  96. package/dist_ts/formats/decoder.factory.d.ts +0 -15
  97. package/dist_ts/formats/decoder.factory.js +0 -46
  98. package/dist_ts/formats/factorx.decoder.d.ts +0 -18
  99. package/dist_ts/formats/factorx.decoder.js +0 -178
  100. package/dist_ts/formats/factorx.encoder.d.ts +0 -51
  101. package/dist_ts/formats/factorx.encoder.js +0 -293
  102. package/dist_ts/formats/facturx.decoder.d.ts +0 -18
  103. package/dist_ts/formats/facturx.decoder.js +0 -210
  104. package/dist_ts/formats/facturx.encoder.d.ts +0 -51
  105. package/dist_ts/formats/facturx.encoder.js +0 -293
  106. package/dist_ts/formats/facturx.validator.d.ts +0 -67
  107. package/dist_ts/formats/facturx.validator.js +0 -266
  108. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
  109. package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
  110. package/dist_ts/formats/ubl.validator.d.ts +0 -82
  111. package/dist_ts/formats/ubl.validator.js +0 -306
  112. package/dist_ts/formats/validator.factory.d.ts +0 -18
  113. package/dist_ts/formats/validator.factory.js +0 -78
  114. package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
  115. package/dist_ts/formats/xinvoice.decoder.js +0 -332
  116. package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
  117. package/dist_ts/formats/xinvoice.encoder.js +0 -282
@@ -0,0 +1,250 @@
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 const ISO4217MinorUnits = {
15
+ // Major currencies
16
+ 'EUR': 2, // Euro
17
+ 'USD': 2, // US Dollar
18
+ 'GBP': 2, // British Pound
19
+ 'CHF': 2, // Swiss Franc
20
+ 'CAD': 2, // Canadian Dollar
21
+ 'AUD': 2, // Australian Dollar
22
+ 'NZD': 2, // New Zealand Dollar
23
+ 'CNY': 2, // Chinese Yuan
24
+ 'INR': 2, // Indian Rupee
25
+ 'MXN': 2, // Mexican Peso
26
+ 'BRL': 2, // Brazilian Real
27
+ 'RUB': 2, // Russian Ruble
28
+ 'ZAR': 2, // South African Rand
29
+ 'SGD': 2, // Singapore Dollar
30
+ 'HKD': 2, // Hong Kong Dollar
31
+ 'NOK': 2, // Norwegian Krone
32
+ 'SEK': 2, // Swedish Krona
33
+ 'DKK': 2, // Danish Krone
34
+ 'PLN': 2, // Polish Zloty
35
+ 'CZK': 2, // Czech Koruna
36
+ 'HUF': 2, // Hungarian Forint (technically 2, though often shown as 0)
37
+ 'RON': 2, // Romanian Leu
38
+ 'BGN': 2, // Bulgarian Lev
39
+ 'HRK': 2, // Croatian Kuna
40
+ 'TRY': 2, // Turkish Lira
41
+ 'ISK': 0, // Icelandic Króna (0 decimals)
42
+ // Zero decimal currencies
43
+ 'JPY': 0, // Japanese Yen
44
+ 'KRW': 0, // South Korean Won
45
+ 'CLP': 0, // Chilean Peso
46
+ 'PYG': 0, // Paraguayan Guaraní
47
+ 'RWF': 0, // Rwandan Franc
48
+ 'VND': 0, // Vietnamese Dong
49
+ 'XAF': 0, // CFA Franc BEAC
50
+ 'XOF': 0, // CFA Franc BCEAO
51
+ 'XPF': 0, // CFP Franc
52
+ 'BIF': 0, // Burundian Franc
53
+ 'DJF': 0, // Djiboutian Franc
54
+ 'GNF': 0, // Guinean Franc
55
+ 'KMF': 0, // Comorian Franc
56
+ 'MGA': 0, // Malagasy Ariary
57
+ 'UGX': 0, // Ugandan Shilling
58
+ 'VUV': 0, // Vanuatu Vatu
59
+ // Three decimal currencies
60
+ 'BHD': 3, // Bahraini Dinar
61
+ 'IQD': 3, // Iraqi Dinar
62
+ 'JOD': 3, // Jordanian Dinar
63
+ 'KWD': 3, // Kuwaiti Dinar
64
+ 'LYD': 3, // Libyan Dinar
65
+ 'OMR': 3, // Omani Rial
66
+ 'TND': 3, // Tunisian Dinar
67
+ // Four decimal currencies
68
+ 'CLF': 4, // Chilean Unit of Account (UF)
69
+ 'UYW': 4, // Unidad Previsional (Uruguay)
70
+ };
71
+ /**
72
+ * Rounding modes for currency calculations
73
+ */
74
+ export var RoundingMode;
75
+ (function (RoundingMode) {
76
+ RoundingMode["HALF_UP"] = "HALF_UP";
77
+ RoundingMode["HALF_DOWN"] = "HALF_DOWN";
78
+ RoundingMode["HALF_EVEN"] = "HALF_EVEN";
79
+ RoundingMode["UP"] = "UP";
80
+ RoundingMode["DOWN"] = "DOWN";
81
+ RoundingMode["CEILING"] = "CEILING";
82
+ RoundingMode["FLOOR"] = "FLOOR"; // Round toward negative infinity
83
+ })(RoundingMode || (RoundingMode = {}));
84
+ /**
85
+ * Get minor units (decimal places) for a currency
86
+ */
87
+ export function getCurrencyMinorUnits(currencyCode) {
88
+ const code = currencyCode.toUpperCase();
89
+ return ISO4217MinorUnits[code] ?? 2; // Default to 2 if unknown
90
+ }
91
+ /**
92
+ * Round a value according to currency rules
93
+ */
94
+ export function roundToCurrency(value, currencyCode, mode = RoundingMode.HALF_UP) {
95
+ const minorUnits = getCurrencyMinorUnits(currencyCode);
96
+ if (minorUnits === 0) {
97
+ // For zero decimal currencies, round to integer
98
+ return Math.round(value);
99
+ }
100
+ const multiplier = Math.pow(10, minorUnits);
101
+ const scaled = value * multiplier;
102
+ let rounded;
103
+ switch (mode) {
104
+ case RoundingMode.HALF_UP:
105
+ // Round half values away from zero
106
+ if (scaled >= 0) {
107
+ rounded = Math.floor(scaled + 0.5);
108
+ }
109
+ else {
110
+ rounded = Math.ceil(scaled - 0.5);
111
+ }
112
+ break;
113
+ case RoundingMode.HALF_DOWN:
114
+ // Round half values toward zero
115
+ const fraction = Math.abs(scaled % 1);
116
+ if (fraction === 0.5) {
117
+ // Exactly 0.5 - round toward zero
118
+ rounded = scaled >= 0 ? Math.floor(scaled) : Math.ceil(scaled);
119
+ }
120
+ else {
121
+ // Not exactly 0.5 - use normal rounding
122
+ rounded = Math.round(scaled);
123
+ }
124
+ break;
125
+ case RoundingMode.HALF_EVEN:
126
+ // Banker's rounding
127
+ const isHalf = Math.abs(scaled % 1) === 0.5;
128
+ if (isHalf) {
129
+ const floor = Math.floor(scaled);
130
+ rounded = floor % 2 === 0 ? floor : Math.ceil(scaled);
131
+ }
132
+ else {
133
+ rounded = Math.round(scaled);
134
+ }
135
+ break;
136
+ case RoundingMode.UP:
137
+ rounded = scaled >= 0 ? Math.ceil(scaled) : Math.floor(scaled);
138
+ break;
139
+ case RoundingMode.DOWN:
140
+ rounded = Math.trunc(scaled);
141
+ break;
142
+ case RoundingMode.CEILING:
143
+ rounded = Math.ceil(scaled);
144
+ break;
145
+ case RoundingMode.FLOOR:
146
+ rounded = Math.floor(scaled);
147
+ break;
148
+ default:
149
+ rounded = Math.round(scaled);
150
+ }
151
+ return rounded / multiplier;
152
+ }
153
+ /**
154
+ * Get tolerance for currency comparison
155
+ * Based on the smallest representable unit for the currency
156
+ */
157
+ export function getCurrencyTolerance(currencyCode) {
158
+ const minorUnits = getCurrencyMinorUnits(currencyCode);
159
+ // Tolerance is half of the smallest unit
160
+ return 0.5 * Math.pow(10, -minorUnits);
161
+ }
162
+ /**
163
+ * Compare two monetary values with currency-aware tolerance
164
+ */
165
+ export function areMonetaryValuesEqual(value1, value2, currencyCode) {
166
+ const tolerance = getCurrencyTolerance(currencyCode);
167
+ return Math.abs(value1 - value2) <= tolerance;
168
+ }
169
+ /**
170
+ * Format a value according to currency decimal places
171
+ */
172
+ export function formatCurrencyValue(value, currencyCode) {
173
+ const minorUnits = getCurrencyMinorUnits(currencyCode);
174
+ return value.toFixed(minorUnits);
175
+ }
176
+ /**
177
+ * Validate if a value has correct decimal places for a currency
178
+ */
179
+ export function hasValidDecimalPlaces(value, currencyCode) {
180
+ const minorUnits = getCurrencyMinorUnits(currencyCode);
181
+ const multiplier = Math.pow(10, minorUnits);
182
+ const scaled = Math.round(value * multiplier);
183
+ const reconstructed = scaled / multiplier;
184
+ return Math.abs(value - reconstructed) < Number.EPSILON;
185
+ }
186
+ /**
187
+ * Currency calculation context for EN16931 compliance
188
+ */
189
+ export class CurrencyCalculator {
190
+ constructor(config) {
191
+ if (typeof config === 'string') {
192
+ this.currency = config;
193
+ this.minorUnits = getCurrencyMinorUnits(config);
194
+ this.roundingMode = RoundingMode.HALF_UP;
195
+ }
196
+ else {
197
+ this.currency = config.code;
198
+ this.minorUnits = config.minorUnits;
199
+ this.roundingMode = config.roundingMode;
200
+ }
201
+ }
202
+ /**
203
+ * Round a value according to configured rules
204
+ */
205
+ round(value) {
206
+ return roundToCurrency(value, this.currency, this.roundingMode);
207
+ }
208
+ /**
209
+ * Calculate line net amount with rounding
210
+ * EN16931: Line net = (quantity × unit price) - line discounts
211
+ */
212
+ calculateLineNet(quantity, unitPrice, discount = 0) {
213
+ const gross = quantity * unitPrice;
214
+ const net = gross - discount;
215
+ return this.round(net);
216
+ }
217
+ /**
218
+ * Calculate VAT amount with rounding
219
+ * EN16931: VAT amount = taxable amount × (rate / 100)
220
+ */
221
+ calculateVAT(taxableAmount, rate) {
222
+ const vat = taxableAmount * (rate / 100);
223
+ return this.round(vat);
224
+ }
225
+ /**
226
+ * Compare values with currency-aware tolerance
227
+ */
228
+ areEqual(value1, value2) {
229
+ return areMonetaryValuesEqual(value1, value2, this.currency);
230
+ }
231
+ /**
232
+ * Get the tolerance for comparisons
233
+ */
234
+ getTolerance() {
235
+ return getCurrencyTolerance(this.currency);
236
+ }
237
+ /**
238
+ * Format value for display
239
+ */
240
+ format(value) {
241
+ return formatCurrencyValue(value, this.currency);
242
+ }
243
+ }
244
+ /**
245
+ * Get version info for ISO 4217 data
246
+ */
247
+ export function getISO4217Version() {
248
+ return '2015'; // Update when currency list is updated
249
+ }
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3kudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3JtYXRzL3V0aWxzL2N1cnJlbmN5LnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVIOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQTJCO0lBQ3ZELG1CQUFtQjtJQUNuQixLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU87SUFDakIsS0FBSyxFQUFFLENBQUMsRUFBRSxZQUFZO0lBQ3RCLEtBQUssRUFBRSxDQUFDLEVBQUUsZ0JBQWdCO0lBQzFCLEtBQUssRUFBRSxDQUFDLEVBQUUsY0FBYztJQUN4QixLQUFLLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQjtJQUM1QixLQUFLLEVBQUUsQ0FBQyxFQUFFLG9CQUFvQjtJQUM5QixLQUFLLEVBQUUsQ0FBQyxFQUFFLHFCQUFxQjtJQUMvQixLQUFLLEVBQUUsQ0FBQyxFQUFFLGVBQWU7SUFDekIsS0FBSyxFQUFFLENBQUMsRUFBRSxlQUFlO0lBQ3pCLEtBQUssRUFBRSxDQUFDLEVBQUUsZUFBZTtJQUN6QixLQUFLLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQjtJQUMzQixLQUFLLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQjtJQUMxQixLQUFLLEVBQUUsQ0FBQyxFQUFFLHFCQUFxQjtJQUMvQixLQUFLLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQjtJQUM3QixLQUFLLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQjtJQUM3QixLQUFLLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQjtJQUM1QixLQUFLLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQjtJQUMxQixLQUFLLEVBQUUsQ0FBQyxFQUFFLGVBQWU7SUFDekIsS0FBSyxFQUFFLENBQUMsRUFBRSxlQUFlO0lBQ3pCLEtBQUssRUFBRSxDQUFDLEVBQUUsZUFBZTtJQUN6QixLQUFLLEVBQUUsQ0FBQyxFQUFFLDREQUE0RDtJQUN0RSxLQUFLLEVB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
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Decimal Arithmetic Library for EN16931 Compliance
3
+ * Provides arbitrary precision decimal arithmetic to avoid floating-point errors
4
+ *
5
+ * Based on EN16931 requirements for financial calculations:
6
+ * - All monetary amounts must be calculated with sufficient precision
7
+ * - Rounding must be consistent and predictable
8
+ * - No loss of precision in intermediate calculations
9
+ */
10
+ /**
11
+ * Decimal class for arbitrary precision arithmetic
12
+ * Internally stores the value as an integer with a scale factor
13
+ */
14
+ export declare class Decimal {
15
+ private readonly value;
16
+ private readonly scale;
17
+ private static _ZERO;
18
+ private static _ONE;
19
+ private static _TEN;
20
+ private static _HUNDRED;
21
+ static get ZERO(): Decimal;
22
+ static get ONE(): Decimal;
23
+ static get TEN(): Decimal;
24
+ static get HUNDRED(): Decimal;
25
+ private static readonly DEFAULT_SCALE;
26
+ /**
27
+ * Create a new Decimal from various input types
28
+ */
29
+ constructor(value: string | number | bigint | Decimal, scale?: number);
30
+ /**
31
+ * Convert to string representation
32
+ */
33
+ toString(decimalPlaces?: number): string;
34
+ /**
35
+ * Convert to number (may lose precision)
36
+ */
37
+ toNumber(): number;
38
+ /**
39
+ * Convert to fixed decimal places string
40
+ */
41
+ toFixed(decimalPlaces: number): string;
42
+ /**
43
+ * Add two decimals
44
+ */
45
+ add(other: Decimal | number | string): Decimal;
46
+ /**
47
+ * Subtract another decimal
48
+ */
49
+ subtract(other: Decimal | number | string): Decimal;
50
+ /**
51
+ * Multiply by another decimal
52
+ */
53
+ multiply(other: Decimal | number | string): Decimal;
54
+ /**
55
+ * Divide by another decimal
56
+ */
57
+ divide(other: Decimal | number | string, precision?: number): Decimal;
58
+ /**
59
+ * Calculate percentage (this * rate / 100)
60
+ */
61
+ percentage(rate: Decimal | number | string): Decimal;
62
+ /**
63
+ * Round to specified decimal places using a specific rounding mode
64
+ */
65
+ round(decimalPlaces: number, mode?: 'HALF_UP' | 'HALF_DOWN' | 'HALF_EVEN' | 'UP' | 'DOWN' | 'CEILING' | 'FLOOR'): Decimal;
66
+ /**
67
+ * Compare with another decimal
68
+ */
69
+ compareTo(other: Decimal | number | string): number;
70
+ /**
71
+ * Check equality
72
+ */
73
+ equals(other: Decimal | number | string, tolerance?: Decimal | number | string): boolean;
74
+ /**
75
+ * Check if less than
76
+ */
77
+ lessThan(other: Decimal | number | string): boolean;
78
+ /**
79
+ * Check if less than or equal
80
+ */
81
+ lessThanOrEqual(other: Decimal | number | string): boolean;
82
+ /**
83
+ * Check if greater than
84
+ */
85
+ greaterThan(other: Decimal | number | string): boolean;
86
+ /**
87
+ * Check if greater than or equal
88
+ */
89
+ greaterThanOrEqual(other: Decimal | number | string): boolean;
90
+ /**
91
+ * Get absolute value
92
+ */
93
+ abs(): Decimal;
94
+ /**
95
+ * Negate the value
96
+ */
97
+ negate(): Decimal;
98
+ /**
99
+ * Check if zero
100
+ */
101
+ isZero(): boolean;
102
+ /**
103
+ * Check if negative
104
+ */
105
+ isNegative(): boolean;
106
+ /**
107
+ * Check if positive
108
+ */
109
+ isPositive(): boolean;
110
+ /**
111
+ * Rescale to a different number of decimal places
112
+ */
113
+ private rescale;
114
+ /**
115
+ * Normalize by removing trailing zeros
116
+ */
117
+ private normalize;
118
+ /**
119
+ * Create a Decimal from a percentage string (e.g., "19%" -> 0.19)
120
+ */
121
+ static fromPercentage(value: string): Decimal;
122
+ /**
123
+ * Sum an array of decimals
124
+ */
125
+ static sum(values: (Decimal | number | string)[]): Decimal;
126
+ /**
127
+ * Get the minimum value
128
+ */
129
+ static min(...values: (Decimal | number | string)[]): Decimal;
130
+ /**
131
+ * Get the maximum value
132
+ */
133
+ static max(...values: (Decimal | number | string)[]): Decimal;
134
+ }
135
+ /**
136
+ * Helper function to create a Decimal
137
+ */
138
+ export declare function decimal(value: string | number | bigint | Decimal): Decimal;
139
+ /**
140
+ * Export commonly used rounding modes
141
+ */
142
+ export declare const RoundingMode: {
143
+ readonly HALF_UP: "HALF_UP";
144
+ readonly HALF_DOWN: "HALF_DOWN";
145
+ readonly HALF_EVEN: "HALF_EVEN";
146
+ readonly UP: "UP";
147
+ readonly DOWN: "DOWN";
148
+ readonly CEILING: "CEILING";
149
+ readonly FLOOR: "FLOOR";
150
+ };
151
+ export type RoundingMode = typeof RoundingMode[keyof typeof RoundingMode];