@kreiseck/kasseneck-api 0.22.0 → 0.23.0

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.
@@ -0,0 +1,304 @@
1
+ {
2
+ "beschreibung": "Prüffälle des Ganzzahl-Rechenkerns (rechnungRechnen). Von Hand gerechnet, nicht erzeugt: npm, Server, Dart-Zwilling und Panel müssen jeden Fall genau treffen. Preise in Millionstel Euro, Mengen in Tausendstel, Rabatt und Satz in Hundertstel-Prozent, Beträge in Cent.",
3
+ "regel": {
4
+ "zeile": "Preis × Menge × (10000 − Rabatt) ÷ 10^11 Cent, exakt als Bruch",
5
+ "net": "Netto = rund(Σ Zeilen); USt = rund(Σ Zeilen × Satz ÷ 10000); Brutto = Netto + USt",
6
+ "gross": "Brutto B = rund(Σ Zeilen); Netto = rund(B × 10000 ÷ (10000 + Satz)); USt = B − Netto",
7
+ "steuerfrei": "smallBusiness, reverseCharge, igLieferung, exportThirdCountry, domesticReverseCharge, outsideScope: jede Zeile zu 0 %",
8
+ "rundung": "kaufmännisch, halbe Einheit vom Nullpunkt weg, auf dem Bruch",
9
+ "zeilen": "Startwert kaufmännisch gerundet, Rest nach exaktem Abstand, bei Gleichstand an die frühere Zeile; eine Zeile über 0 bekommt nie einen Cent"
10
+ },
11
+ "faelle": [
12
+ {
13
+ "name": "Shop: 14,79 € + 15,00 € brutto zu 20 % bleiben 29,79 €",
14
+ "priceMode": "gross",
15
+ "positionen": [
16
+ { "unitPriceMicros": 14790000, "quantityMilli": 1000, "vatRateBp": 2000 },
17
+ { "unitPriceMicros": 15000000, "quantityMilli": 1000, "vatRateBp": 2000 }
18
+ ],
19
+ "erwartet": {
20
+ "netCents": 2483,
21
+ "vatCents": 496,
22
+ "grossCents": 2979,
23
+ "byRate": [{ "rateBp": 2000, "netCents": 2483, "vatCents": 496, "grossCents": 2979 }],
24
+ "lines": [
25
+ { "netCents": 1233, "grossCents": 1479, "rateBp": 2000 },
26
+ { "netCents": 1250, "grossCents": 1500, "rateBp": 2000 }
27
+ ]
28
+ }
29
+ },
30
+ {
31
+ "name": "Halber Cent: 21,35 € netto zu 10 % ergibt 2,14 € USt",
32
+ "priceMode": "net",
33
+ "positionen": [{ "unitPriceMicros": 21350000, "quantityMilli": 1000, "vatRateBp": 1000 }],
34
+ "erwartet": {
35
+ "netCents": 2135,
36
+ "vatCents": 214,
37
+ "grossCents": 2349,
38
+ "byRate": [{ "rateBp": 1000, "netCents": 2135, "vatCents": 214, "grossCents": 2349 }],
39
+ "lines": [{ "netCents": 2135, "grossCents": 2349, "rateBp": 1000 }]
40
+ }
41
+ },
42
+ {
43
+ "name": "Mikropreis: 0,000004 € × 3.500.000 sind 14,00 €",
44
+ "priceMode": "net",
45
+ "positionen": [{ "unitPriceMicros": 4, "quantityMilli": 3500000000, "vatRateBp": 2000 }],
46
+ "erwartet": {
47
+ "netCents": 1400,
48
+ "vatCents": 280,
49
+ "grossCents": 1680,
50
+ "byRate": [{ "rateBp": 2000, "netCents": 1400, "vatCents": 280, "grossCents": 1680 }],
51
+ "lines": [{ "netCents": 1400, "grossCents": 1680, "rateBp": 2000 }]
52
+ }
53
+ },
54
+ {
55
+ "name": "Halber Cent: 550,17 € × 1,5 netto zu 13 % ergibt 825,26 € netto (825,255 € rundet auf)",
56
+ "priceMode": "net",
57
+ "positionen": [{ "unitPriceMicros": 550170000, "quantityMilli": 1500, "vatRateBp": 1300 }],
58
+ "erwartet": {
59
+ "netCents": 82526,
60
+ "vatCents": 10728,
61
+ "grossCents": 93254,
62
+ "byRate": [{ "rateBp": 1300, "netCents": 82526, "vatCents": 10728, "grossCents": 93254 }],
63
+ "lines": [{ "netCents": 82526, "grossCents": 93254, "rateBp": 1300 }]
64
+ }
65
+ },
66
+ {
67
+ "name": "Gebrochene Menge: 66,30 € × 35,05 netto zu 20 % ergibt 2.323,82 € netto (2.323,815 € rundet auf)",
68
+ "priceMode": "net",
69
+ "positionen": [{ "unitPriceMicros": 66300000, "quantityMilli": 35050, "vatRateBp": 2000 }],
70
+ "erwartet": {
71
+ "netCents": 232382,
72
+ "vatCents": 46476,
73
+ "grossCents": 278858,
74
+ "byRate": [{ "rateBp": 2000, "netCents": 232382, "vatCents": 46476, "grossCents": 278858 }],
75
+ "lines": [{ "netCents": 232382, "grossCents": 278858, "rateBp": 2000 }]
76
+ }
77
+ },
78
+ {
79
+ "name": "Großer Betrag: 42.735,95 € × 73 netto zu 10 % ergibt 31.197.244 Cent USt (311.972,435 € rundet auf)",
80
+ "priceMode": "net",
81
+ "positionen": [{ "unitPriceMicros": 42735950000, "quantityMilli": 73000, "vatRateBp": 1000 }],
82
+ "erwartet": {
83
+ "netCents": 311972435,
84
+ "vatCents": 31197244,
85
+ "grossCents": 343169679,
86
+ "byRate": [{ "rateBp": 1000, "netCents": 311972435, "vatCents": 31197244, "grossCents": 343169679 }],
87
+ "lines": [{ "netCents": 311972435, "grossCents": 343169679, "rateBp": 1000 }]
88
+ }
89
+ },
90
+ {
91
+ "name": "Sehr großer Betrag: 3.206,08 € × 188.289,923 − 41,96 % netto zu 0 % bleiben 35.037.155.169 Cent (Rest 0,499994 Cent, knapp unter der halben Einheit, rundet ab)",
92
+ "priceMode": "net",
93
+ "positionen": [{ "unitPriceMicros": 3206080000, "quantityMilli": 188289923, "discountBp": 4196, "vatRateBp": 0 }],
94
+ "erwartet": {
95
+ "netCents": 35037155169,
96
+ "vatCents": 0,
97
+ "grossCents": 35037155169,
98
+ "byRate": [{ "rateBp": 0, "netCents": 35037155169, "vatCents": 0, "grossCents": 35037155169 }],
99
+ "lines": [{ "netCents": 35037155169, "grossCents": 35037155169, "rateBp": 0 }]
100
+ }
101
+ },
102
+ {
103
+ "name": "Rabatt: 15,45 € × 5 − 6 % netto zu 0 % ergibt 72,62 €",
104
+ "priceMode": "net",
105
+ "positionen": [{ "unitPriceMicros": 15450000, "quantityMilli": 5000, "discountBp": 600, "vatRateBp": 0 }],
106
+ "erwartet": {
107
+ "netCents": 7262,
108
+ "vatCents": 0,
109
+ "grossCents": 7262,
110
+ "byRate": [{ "rateBp": 0, "netCents": 7262, "vatCents": 0, "grossCents": 7262 }],
111
+ "lines": [{ "netCents": 7262, "grossCents": 7262, "rateBp": 0 }]
112
+ }
113
+ },
114
+ {
115
+ "name": "Gleichstand in der Verteilung: 2,81 € × 2,977 + 0,81 € × 2,377 netto zu 20 % — beide Zeilen verlieren beim Runden gleich viel (0,537 Cent), die frühere verliert den Cent",
116
+ "priceMode": "net",
117
+ "positionen": [
118
+ { "unitPriceMicros": 2810000, "quantityMilli": 2977, "vatRateBp": 2000 },
119
+ { "unitPriceMicros": 810000, "quantityMilli": 2377, "vatRateBp": 2000 }
120
+ ],
121
+ "erwartet": {
122
+ "netCents": 1029,
123
+ "vatCents": 206,
124
+ "grossCents": 1235,
125
+ "byRate": [{ "rateBp": 2000, "netCents": 1029, "vatCents": 206, "grossCents": 1235 }],
126
+ "lines": [
127
+ { "netCents": 836, "grossCents": 1004, "rateBp": 2000 },
128
+ { "netCents": 193, "grossCents": 231, "rateBp": 2000 }
129
+ ]
130
+ }
131
+ },
132
+ {
133
+ "name": "Verteilung unter einem Cent: 0,006 € + 0,006 € netto zu 0 % ergeben zusammen 0,01 €, verteilt auf 0 und 1",
134
+ "priceMode": "net",
135
+ "positionen": [
136
+ { "unitPriceMicros": 6000, "quantityMilli": 1000, "vatRateBp": 0 },
137
+ { "unitPriceMicros": 6000, "quantityMilli": 1000, "vatRateBp": 0 }
138
+ ],
139
+ "erwartet": {
140
+ "netCents": 1,
141
+ "vatCents": 0,
142
+ "grossCents": 1,
143
+ "byRate": [{ "rateBp": 0, "netCents": 1, "vatCents": 0, "grossCents": 1 }],
144
+ "lines": [
145
+ { "netCents": 0, "grossCents": 0, "rateBp": 0 },
146
+ { "netCents": 1, "grossCents": 1, "rateBp": 0 }
147
+ ]
148
+ }
149
+ },
150
+ {
151
+ "name": "Abzugszeile: 100,00 € minus 10,00 € netto zu 20 % ergeben 90,00 € netto und 18,00 € USt",
152
+ "priceMode": "net",
153
+ "positionen": [
154
+ { "unitPriceMicros": 100000000, "quantityMilli": 1000, "vatRateBp": 2000 },
155
+ { "unitPriceMicros": 10000000, "quantityMilli": -1000, "vatRateBp": 2000 }
156
+ ],
157
+ "erwartet": {
158
+ "netCents": 9000,
159
+ "vatCents": 1800,
160
+ "grossCents": 10800,
161
+ "byRate": [{ "rateBp": 2000, "netCents": 9000, "vatCents": 1800, "grossCents": 10800 }],
162
+ "lines": [
163
+ { "netCents": 10000, "grossCents": 12000, "rateBp": 2000 },
164
+ { "netCents": -1000, "grossCents": -1200, "rateBp": 2000 }
165
+ ]
166
+ }
167
+ },
168
+ {
169
+ "name": "Textzeile ohne Menge neben 5,00 € netto zu 20 % ändert nichts: netto bleibt 5,00 €, die Textzeile bleibt 0",
170
+ "priceMode": "net",
171
+ "positionen": [
172
+ { "unitPriceMicros": 0, "quantityMilli": 0, "vatRateBp": 2000 },
173
+ { "unitPriceMicros": 5000000, "quantityMilli": 1000, "vatRateBp": 2000 }
174
+ ],
175
+ "erwartet": {
176
+ "netCents": 500,
177
+ "vatCents": 100,
178
+ "grossCents": 600,
179
+ "byRate": [{ "rateBp": 2000, "netCents": 500, "vatCents": 100, "grossCents": 600 }],
180
+ "lines": [
181
+ { "netCents": 0, "grossCents": 0, "rateBp": 2000 },
182
+ { "netCents": 500, "grossCents": 600, "rateBp": 2000 }
183
+ ]
184
+ }
185
+ },
186
+ {
187
+ "name": "Nullzeile bekommt nie einen Cent: 99,99 € × 3 mit 100 % Rabatt netto zu 20 % bleibt bei 0,00 €",
188
+ "priceMode": "net",
189
+ "positionen": [{ "unitPriceMicros": 99990000, "quantityMilli": 3000, "discountBp": 10000, "vatRateBp": 2000 }],
190
+ "erwartet": {
191
+ "netCents": 0,
192
+ "vatCents": 0,
193
+ "grossCents": 0,
194
+ "byRate": [{ "rateBp": 2000, "netCents": 0, "vatCents": 0, "grossCents": 0 }],
195
+ "lines": [{ "netCents": 0, "grossCents": 0, "rateBp": 2000 }]
196
+ }
197
+ },
198
+ {
199
+ "name": "Reihenfolge von byRate: 10,00 € je zu 20 %, 10 % und 4,9 % netto stehen absteigend, USt 2,00 € + 1,00 € + 0,49 €",
200
+ "priceMode": "net",
201
+ "positionen": [
202
+ { "unitPriceMicros": 10000000, "quantityMilli": 1000, "vatRateBp": 2000 },
203
+ { "unitPriceMicros": 10000000, "quantityMilli": 1000, "vatRateBp": 1000 },
204
+ { "unitPriceMicros": 10000000, "quantityMilli": 1000, "vatRateBp": 490 }
205
+ ],
206
+ "erwartet": {
207
+ "netCents": 3000,
208
+ "vatCents": 349,
209
+ "grossCents": 3349,
210
+ "byRate": [
211
+ { "rateBp": 2000, "netCents": 1000, "vatCents": 200, "grossCents": 1200 },
212
+ { "rateBp": 1000, "netCents": 1000, "vatCents": 100, "grossCents": 1100 },
213
+ { "rateBp": 490, "netCents": 1000, "vatCents": 49, "grossCents": 1049 }
214
+ ],
215
+ "lines": [
216
+ { "netCents": 1000, "grossCents": 1200, "rateBp": 2000 },
217
+ { "netCents": 1000, "grossCents": 1100, "rateBp": 1000 },
218
+ { "netCents": 1000, "grossCents": 1049, "rateBp": 490 }
219
+ ]
220
+ }
221
+ },
222
+ {
223
+ "name": "Steuerfrei: 12,00 € brutto mit taxScheme smallBusiness bleiben 12,00 € netto ohne USt, der Preismodus zählt nicht",
224
+ "priceMode": "gross",
225
+ "taxScheme": "smallBusiness",
226
+ "positionen": [{ "unitPriceMicros": 12000000, "quantityMilli": 1000, "vatRateBp": 2000 }],
227
+ "erwartet": {
228
+ "netCents": 1200,
229
+ "vatCents": 0,
230
+ "grossCents": 1200,
231
+ "byRate": [{ "rateBp": 0, "netCents": 1200, "vatCents": 0, "grossCents": 1200 }],
232
+ "lines": [{ "netCents": 1200, "grossCents": 1200, "rateBp": 0 }]
233
+ }
234
+ },
235
+ {
236
+ "name": "Shop-Rückmeldung: 0,03 € brutto zu 20 % bleiben 0,03 € brutto und netto (2,5 Cent rundet auf)",
237
+ "priceMode": "gross",
238
+ "positionen": [{ "unitPriceMicros": 30000, "quantityMilli": 1000, "vatRateBp": 2000 }],
239
+ "erwartet": {
240
+ "netCents": 3,
241
+ "vatCents": 0,
242
+ "grossCents": 3,
243
+ "byRate": [{ "rateBp": 2000, "netCents": 3, "vatCents": 0, "grossCents": 3 }],
244
+ "lines": [{ "netCents": 3, "grossCents": 3, "rateBp": 2000 }]
245
+ }
246
+ },
247
+ {
248
+ "name": "Höchstwert: 999.999.999,99 € netto zu 0 % gehen gerade noch bis an die Obergrenze",
249
+ "priceMode": "net",
250
+ "positionen": [{ "unitPriceMicros": 999999999990, "quantityMilli": 1000000, "vatRateBp": 0 }],
251
+ "erwartet": {
252
+ "netCents": 99999999999,
253
+ "vatCents": 0,
254
+ "grossCents": 99999999999,
255
+ "byRate": [{ "rateBp": 0, "netCents": 99999999999, "vatCents": 0, "grossCents": 99999999999 }],
256
+ "lines": [{ "netCents": 99999999999, "grossCents": 99999999999, "rateBp": 0 }]
257
+ }
258
+ },
259
+ {
260
+ "name": "Brutto mit gebrochener Menge: 1,01 € × 1,5 brutto zu 20 % ergeben 1,52 € brutto (151,5 Cent rundet auf)",
261
+ "priceMode": "gross",
262
+ "positionen": [{ "unitPriceMicros": 1010000, "quantityMilli": 1500, "vatRateBp": 2000 }],
263
+ "erwartet": {
264
+ "netCents": 127,
265
+ "vatCents": 25,
266
+ "grossCents": 152,
267
+ "byRate": [{ "rateBp": 2000, "netCents": 127, "vatCents": 25, "grossCents": 152 }],
268
+ "lines": [{ "netCents": 127, "grossCents": 152, "rateBp": 2000 }]
269
+ }
270
+ },
271
+ {
272
+ "name": "Nullzeile bekommt keinen Rundungscent: 0,00 € und 2,5 Cent netto zu 20 %",
273
+ "priceMode": "net",
274
+ "positionen": [
275
+ { "unitPriceMicros": 0, "quantityMilli": 1000, "vatRateBp": 2000 },
276
+ { "unitPriceMicros": 25000, "quantityMilli": 1000, "vatRateBp": 2000 }
277
+ ],
278
+ "erwartet": {
279
+ "netCents": 3,
280
+ "vatCents": 1,
281
+ "grossCents": 4,
282
+ "byRate": [{ "rateBp": 2000, "netCents": 3, "vatCents": 1, "grossCents": 4 }],
283
+ "lines": [
284
+ { "netCents": 0, "grossCents": 0, "rateBp": 2000 },
285
+ { "netCents": 3, "grossCents": 4, "rateBp": 2000 }
286
+ ]
287
+ }
288
+ },
289
+ {
290
+ "name": "Rabatt auf Schüttgut: 0,149999 € × 50.000 − 10 % netto zu 20 % ergibt 6.749,96 € netto (der rabattierte Einzelpreis ist kein ganzer Cent mehr — wer vor der Multiplikation ganzzahlig teilt, landet bei 674.995 statt 674.996)",
291
+ "priceMode": "net",
292
+ "positionen": [
293
+ { "unitPriceMicros": 149999, "quantityMilli": 50000000, "discountBp": 1000, "vatRateBp": 2000 }
294
+ ],
295
+ "erwartet": {
296
+ "netCents": 674996,
297
+ "vatCents": 134999,
298
+ "grossCents": 809995,
299
+ "byRate": [{ "rateBp": 2000, "netCents": 674996, "vatCents": 134999, "grossCents": 809995 }],
300
+ "lines": [{ "netCents": 674996, "grossCents": 809995, "rateBp": 2000 }]
301
+ }
302
+ }
303
+ ]
304
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.22.0",
2
+ "version": "0.23.0",
3
3
  "sprachen": [
4
4
  "de",
5
5
  "en"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kreiseck/kasseneck-api",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "RKSV-Registrierkasse fuer JavaScript und TypeScript: signierte Belege, Storno, Kartenzahlung, Bondruck. Austrian fiscal cash register (RKSV) API client.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Kreiseck",
@@ -129,6 +129,16 @@
129
129
  "default": "./dist/cjs/rechnung/index.js"
130
130
  }
131
131
  },
132
+ "./rechnung/rechnen": {
133
+ "import": {
134
+ "types": "./dist/esm/rechnung/rechnen.d.ts",
135
+ "default": "./dist/esm/rechnung/rechnen.js"
136
+ },
137
+ "require": {
138
+ "types": "./dist/cjs/rechnung/rechnen.d.ts",
139
+ "default": "./dist/cjs/rechnung/rechnen.js"
140
+ }
141
+ },
132
142
  "./fixtures/*": "./fixtures/*"
133
143
  },
134
144
  "files": [
@@ -157,7 +167,8 @@
157
167
  "fixtures:rechnung": "npm run build && node scripts/rechnung-vertrag.mjs",
158
168
  "fixtures:rechnungstexte": "npm run build && node scripts/rechnung-texte.mjs",
159
169
  "fixtures:hobex-hps-codes": "npm run build && node scripts/hobex-hps-codes.mjs",
160
- "fixtures:texte": "npm run build && node scripts/texte.mjs"
170
+ "fixtures:texte": "npm run build && node scripts/texte.mjs",
171
+ "fixtures:rechnungzufall": "python3 scripts/rechnung-referenz.py --erzeuge --seed 20260918 --anzahl 400 --ziel fixtures/rechnung-rechnen-zufall.json"
161
172
  },
162
173
  "peerDependencies": {
163
174
  "react": ">=18.0.0"