@kreiseck/kasseneck-api 0.21.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +69 -2
  3. package/dist/cjs/client/errors.d.ts +0 -1
  4. package/dist/cjs/client/errors.js +24 -1
  5. package/dist/cjs/rechnung/api.d.ts +3 -1
  6. package/dist/cjs/rechnung/api.js +1 -0
  7. package/dist/cjs/rechnung/endpunkte.d.ts +12 -1
  8. package/dist/cjs/rechnung/endpunkte.js +56 -3
  9. package/dist/cjs/rechnung/index.d.ts +4 -2
  10. package/dist/cjs/rechnung/index.js +16 -1
  11. package/dist/cjs/rechnung/rechnen.d.ts +123 -0
  12. package/dist/cjs/rechnung/rechnen.js +327 -0
  13. package/dist/cjs/rechnung/summen.d.ts +42 -0
  14. package/dist/cjs/rechnung/summen.js +74 -0
  15. package/dist/cjs/rechnung/texte.d.ts +4 -0
  16. package/dist/cjs/rechnung/texte.js +8 -0
  17. package/dist/cjs/rechnung/typen.d.ts +51 -7
  18. package/dist/cjs/rechnung/vertrag.d.ts +1 -1
  19. package/dist/cjs/rechnung/vertrag.js +8 -0
  20. package/dist/esm/client/errors.d.ts +0 -1
  21. package/dist/esm/client/errors.js +24 -1
  22. package/dist/esm/rechnung/api.d.ts +3 -1
  23. package/dist/esm/rechnung/api.js +2 -1
  24. package/dist/esm/rechnung/endpunkte.d.ts +12 -1
  25. package/dist/esm/rechnung/endpunkte.js +55 -3
  26. package/dist/esm/rechnung/index.d.ts +4 -2
  27. package/dist/esm/rechnung/index.js +3 -1
  28. package/dist/esm/rechnung/rechnen.d.ts +123 -0
  29. package/dist/esm/rechnung/rechnen.js +316 -0
  30. package/dist/esm/rechnung/summen.d.ts +42 -0
  31. package/dist/esm/rechnung/summen.js +71 -0
  32. package/dist/esm/rechnung/texte.d.ts +4 -0
  33. package/dist/esm/rechnung/texte.js +8 -0
  34. package/dist/esm/rechnung/typen.d.ts +51 -7
  35. package/dist/esm/rechnung/vertrag.d.ts +1 -1
  36. package/dist/esm/rechnung/vertrag.js +8 -0
  37. package/fixtures/hobex-hps-codes.json +1 -1
  38. package/fixtures/kasse-texte.json +1 -1
  39. package/fixtures/oberflaeche.json +12 -2
  40. package/fixtures/position-aus-euro.json +107 -0
  41. package/fixtures/rechnung-api.schema.json +7 -2
  42. package/fixtures/rechnung-rechnen-zufall.json +8451 -0
  43. package/fixtures/rechnung-rechnen.json +304 -0
  44. package/fixtures/rechnung-summen.json +154 -0
  45. package/fixtures/rechnung-texte.json +9 -1
  46. package/package.json +13 -2
@@ -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
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "beschreibung": "Prueffaelle fuer die Summen einer Rechnung. Von Hand gerechnet, nicht erzeugt: rechnungSummen (npm), der Dart-Zwilling und der Server (summenJeSatz) muessen jeden Fall genau so treffen. Betraege in Cent, Positionen in der Form der Rechnungs-API.",
3
+ "regel": {
4
+ "zeile": "Einzelpreis × Menge × (1 − Rabatt/100), ungerundet",
5
+ "net": "Netto = round(Σ Zeilen); USt = round(Σ Zeilen × Satz/100); Brutto = Netto + USt",
6
+ "gross": "Brutto B = round(Σ Zeilen); Netto = round(B × 100 / (100 + Satz)); USt = B − Netto",
7
+ "steuerfrei": "smallBusiness, reverseCharge, igLieferung, exportThirdCountry, domesticReverseCharge, outsideScope: jede Zeile zu 0 %",
8
+ "rundung": "kaufmaennisch, halber Cent vom Nullpunkt weg; je Satz, dann summiert"
9
+ },
10
+ "faelle": [
11
+ {
12
+ "name": "Shop: 0,03 € brutto zu 20 %",
13
+ "priceMode": "gross",
14
+ "items": [{ "quantity": 1, "unitPriceCents": 3, "vatRate": 20 }],
15
+ "erwartet": { "netCents": 3, "vatCents": 0, "grossCents": 3, "byRate": [{ "rate": 20, "netCents": 3, "vatCents": 0, "grossCents": 3 }] }
16
+ },
17
+ {
18
+ "name": "Shop: 14,79 € + 15,00 € brutto zu 20 % ergeben 29,79 €",
19
+ "priceMode": "gross",
20
+ "items": [
21
+ { "quantity": 1, "unitPriceCents": 1479, "vatRate": 20 },
22
+ { "quantity": 1, "unitPriceCents": 1500, "vatRate": 20 }
23
+ ],
24
+ "erwartet": { "netCents": 2483, "vatCents": 496, "grossCents": 2979, "byRate": [{ "rate": 20, "netCents": 2483, "vatCents": 496, "grossCents": 2979 }] }
25
+ },
26
+ {
27
+ "name": "Shop: 46,46 € brutto",
28
+ "priceMode": "gross",
29
+ "items": [{ "quantity": 1, "unitPriceCents": 4646, "vatRate": 20 }],
30
+ "erwartet": { "netCents": 3872, "vatCents": 774, "grossCents": 4646, "byRate": [{ "rate": 20, "netCents": 3872, "vatCents": 774, "grossCents": 4646 }] }
31
+ },
32
+ {
33
+ "name": "Shop: 12,90 € brutto",
34
+ "priceMode": "gross",
35
+ "items": [{ "quantity": 1, "unitPriceCents": 1290, "vatRate": 20 }],
36
+ "erwartet": { "netCents": 1075, "vatCents": 215, "grossCents": 1290, "byRate": [{ "rate": 20, "netCents": 1075, "vatCents": 215, "grossCents": 1290 }] }
37
+ },
38
+ {
39
+ "name": "Brutto, zwei Saetze: je Satz eigenes Brutto, absteigend",
40
+ "priceMode": "gross",
41
+ "items": [
42
+ { "quantity": 1, "unitPriceCents": 1479, "vatRate": 20 },
43
+ { "quantity": 1, "unitPriceCents": 555, "vatRate": 10 },
44
+ { "quantity": 1, "unitPriceCents": 1500, "vatRate": 20 }
45
+ ],
46
+ "erwartet": {
47
+ "netCents": 2988, "vatCents": 546, "grossCents": 3534,
48
+ "byRate": [
49
+ { "rate": 20, "netCents": 2483, "vatCents": 496, "grossCents": 2979 },
50
+ { "rate": 10, "netCents": 505, "vatCents": 50, "grossCents": 555 }
51
+ ]
52
+ }
53
+ },
54
+ {
55
+ "name": "Brutto mit Menge und Rabatt: 3 × 9,99 € − 10 % = 26,97 €",
56
+ "priceMode": "gross",
57
+ "items": [{ "quantity": 3, "unitPriceCents": 999, "vatRate": 20, "discountPct": 10 }],
58
+ "erwartet": { "netCents": 2248, "vatCents": 449, "grossCents": 2697, "byRate": [{ "rate": 20, "netCents": 2248, "vatCents": 449, "grossCents": 2697 }] }
59
+ },
60
+ {
61
+ "name": "Brutto zu 13 %: glatt",
62
+ "priceMode": "gross",
63
+ "items": [{ "quantity": 1, "unitPriceCents": 1695, "vatRate": 13 }],
64
+ "erwartet": { "netCents": 1500, "vatCents": 195, "grossCents": 1695, "byRate": [{ "rate": 13, "netCents": 1500, "vatCents": 195, "grossCents": 1695 }] }
65
+ },
66
+ {
67
+ "name": "Brutto zu 10 %: 0,11 €",
68
+ "priceMode": "gross",
69
+ "items": [{ "quantity": 1, "unitPriceCents": 11, "vatRate": 10 }],
70
+ "erwartet": { "netCents": 10, "vatCents": 1, "grossCents": 11, "byRate": [{ "rate": 10, "netCents": 10, "vatCents": 1, "grossCents": 11 }] }
71
+ },
72
+ {
73
+ "name": "Brutto: drei Zeilen zu 0,05 € sind 0,15 €, nicht dreimal gerundet",
74
+ "priceMode": "gross",
75
+ "items": [
76
+ { "quantity": 1, "unitPriceCents": 5, "vatRate": 20 },
77
+ { "quantity": 1, "unitPriceCents": 5, "vatRate": 20 },
78
+ { "quantity": 1, "unitPriceCents": 5, "vatRate": 20 }
79
+ ],
80
+ "erwartet": { "netCents": 13, "vatCents": 2, "grossCents": 15, "byRate": [{ "rate": 20, "netCents": 13, "vatCents": 2, "grossCents": 15 }] }
81
+ },
82
+ {
83
+ "name": "Brutto: Rabatt-Bruchteile erst in der Satzsumme runden (2 × 0,045 € = 0,09 €)",
84
+ "priceMode": "gross",
85
+ "items": [
86
+ { "quantity": 1, "unitPriceCents": 5, "vatRate": 20, "discountPct": 10 },
87
+ { "quantity": 1, "unitPriceCents": 5, "vatRate": 20, "discountPct": 10 }
88
+ ],
89
+ "erwartet": { "netCents": 8, "vatCents": 1, "grossCents": 9, "byRate": [{ "rate": 20, "netCents": 8, "vatCents": 1, "grossCents": 9 }] }
90
+ },
91
+ {
92
+ "name": "Brutto: ein Cent",
93
+ "priceMode": "gross",
94
+ "items": [{ "quantity": 1, "unitPriceCents": 1, "vatRate": 20 }],
95
+ "erwartet": { "netCents": 1, "vatCents": 0, "grossCents": 1, "byRate": [{ "rate": 20, "netCents": 1, "vatCents": 0, "grossCents": 1 }] }
96
+ },
97
+ {
98
+ "name": "Brutto, aber steuerfrei (ig. Lieferung): alles zu 0 %",
99
+ "priceMode": "gross",
100
+ "taxScheme": "igLieferung",
101
+ "items": [
102
+ { "quantity": 1, "unitPriceCents": 1479, "vatRate": 20 },
103
+ { "quantity": 1, "unitPriceCents": 1500, "vatRate": 0 }
104
+ ],
105
+ "erwartet": { "netCents": 2979, "vatCents": 0, "grossCents": 2979, "byRate": [{ "rate": 0, "netCents": 2979, "vatCents": 0, "grossCents": 2979 }] }
106
+ },
107
+ {
108
+ "name": "Netto: 2 × 50,00 € zu 20 %",
109
+ "priceMode": "net",
110
+ "items": [{ "quantity": 2, "unitPriceCents": 5000, "vatRate": 20 }],
111
+ "erwartet": { "netCents": 10000, "vatCents": 2000, "grossCents": 12000, "byRate": [{ "rate": 20, "netCents": 10000, "vatCents": 2000, "grossCents": 12000 }] }
112
+ },
113
+ {
114
+ "name": "Netto, zwei Saetze getrennt gerundet",
115
+ "priceMode": "net",
116
+ "items": [
117
+ { "quantity": 1, "unitPriceCents": 1000, "vatRate": 20 },
118
+ { "quantity": 1, "unitPriceCents": 1000, "vatRate": 10 }
119
+ ],
120
+ "erwartet": {
121
+ "netCents": 2000, "vatCents": 300, "grossCents": 2300,
122
+ "byRate": [
123
+ { "rate": 20, "netCents": 1000, "vatCents": 200, "grossCents": 1200 },
124
+ { "rate": 10, "netCents": 1000, "vatCents": 100, "grossCents": 1100 }
125
+ ]
126
+ }
127
+ },
128
+ {
129
+ "name": "Netto: USt aus der ungerundeten Nettosumme (1,5 × 33,33 € = 49,995 €)",
130
+ "priceMode": "net",
131
+ "items": [{ "quantity": 1.5, "unitPriceCents": 3333, "vatRate": 20 }],
132
+ "erwartet": { "netCents": 5000, "vatCents": 1000, "grossCents": 6000, "byRate": [{ "rate": 20, "netCents": 5000, "vatCents": 1000, "grossCents": 6000 }] }
133
+ },
134
+ {
135
+ "name": "Netto mit Rabatt: 3 × 9,99 € − 12,5 % = 26,22375 €",
136
+ "priceMode": "net",
137
+ "items": [{ "quantity": 3, "unitPriceCents": 999, "vatRate": 20, "discountPct": 12.5 }],
138
+ "erwartet": { "netCents": 2622, "vatCents": 524, "grossCents": 3146, "byRate": [{ "rate": 20, "netCents": 2622, "vatCents": 524, "grossCents": 3146 }] }
139
+ },
140
+ {
141
+ "name": "Kleinunternehmer: keine Steuer",
142
+ "priceMode": "net",
143
+ "taxScheme": "smallBusiness",
144
+ "items": [{ "quantity": 1, "unitPriceCents": 10000, "vatRate": 20 }],
145
+ "erwartet": { "netCents": 10000, "vatCents": 0, "grossCents": 10000, "byRate": [{ "rate": 0, "netCents": 10000, "vatCents": 0, "grossCents": 10000 }] }
146
+ },
147
+ {
148
+ "name": "Keine Positionen",
149
+ "priceMode": "gross",
150
+ "items": [],
151
+ "erwartet": { "netCents": 0, "vatCents": 0, "grossCents": 0, "byRate": [] }
152
+ }
153
+ ]
154
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.21.0",
2
+ "version": "0.23.0",
3
3
  "sprachen": [
4
4
  "de",
5
5
  "en"
@@ -27,8 +27,12 @@
27
27
  "pdf.tabelle.ust": "UST",
28
28
  "pdf.tabelle.einzelNetto": "EINZEL NETTO",
29
29
  "pdf.tabelle.betragNetto": "BETRAG NETTO",
30
+ "pdf.tabelle.einzelBrutto": "EINZEL BRUTTO",
31
+ "pdf.tabelle.betragBrutto": "BETRAG BRUTTO",
32
+ "pdf.position.rabatt": "abzüglich {prozent} % Rabatt",
30
33
  "pdf.summe.zwischensumme": "Zwischensumme netto",
31
34
  "pdf.summe.umsatzsteuer": "Umsatzsteuer {satz}%",
35
+ "pdf.summe.darinUst": "darin {satz}% USt von {netto} netto",
32
36
  "pdf.summe.gesamt.rechnung": "Gesamtbetrag",
33
37
  "pdf.summe.gesamt.gutschrift": "Gutschriftsbetrag",
34
38
  "steuer.kleinunternehmer": "Gemäß § 6 Abs. 1 Z 27 UStG wird keine Umsatzsteuer verrechnet (Kleinunternehmer).",
@@ -225,8 +229,12 @@
225
229
  "pdf.tabelle.ust": "VAT",
226
230
  "pdf.tabelle.einzelNetto": "UNIT NET",
227
231
  "pdf.tabelle.betragNetto": "AMOUNT NET",
232
+ "pdf.tabelle.einzelBrutto": "UNIT GROSS",
233
+ "pdf.tabelle.betragBrutto": "AMOUNT GROSS",
234
+ "pdf.position.rabatt": "less {prozent}% discount",
228
235
  "pdf.summe.zwischensumme": "Subtotal net",
229
236
  "pdf.summe.umsatzsteuer": "VAT {satz}%",
237
+ "pdf.summe.darinUst": "incl. {satz}% VAT on {netto} net",
230
238
  "pdf.summe.gesamt.rechnung": "Total",
231
239
  "pdf.summe.gesamt.gutschrift": "Credit total",
232
240
  "steuer.kleinunternehmer": "No VAT charged pursuant to § 6 (1) no. 27 UStG (small business exemption).",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kreiseck/kasseneck-api",
3
- "version": "0.21.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"