@kreiseck/kasseneck-api 0.6.7

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 (294) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +2 -0
  3. package/README.md +206 -0
  4. package/dist/cjs/client/api.d.ts +75 -0
  5. package/dist/cjs/client/api.js +40 -0
  6. package/dist/cjs/client/auth.d.ts +52 -0
  7. package/dist/cjs/client/auth.js +72 -0
  8. package/dist/cjs/client/cashregisters.d.ts +21 -0
  9. package/dist/cjs/client/cashregisters.js +36 -0
  10. package/dist/cjs/client/errors.d.ts +159 -0
  11. package/dist/cjs/client/errors.js +226 -0
  12. package/dist/cjs/client/index.d.ts +8 -0
  13. package/dist/cjs/client/index.js +44 -0
  14. package/dist/cjs/client/receipts.d.ts +245 -0
  15. package/dist/cjs/client/receipts.js +452 -0
  16. package/dist/cjs/client/reports.d.ts +43 -0
  17. package/dist/cjs/client/reports.js +73 -0
  18. package/dist/cjs/client/status.d.ts +43 -0
  19. package/dist/cjs/client/status.js +47 -0
  20. package/dist/cjs/client/transport.d.ts +117 -0
  21. package/dist/cjs/client/transport.js +312 -0
  22. package/dist/cjs/enums/credit-card-provider.d.ts +22 -0
  23. package/dist/cjs/enums/credit-card-provider.js +23 -0
  24. package/dist/cjs/enums/define-enum.d.ts +15 -0
  25. package/dist/cjs/enums/define-enum.js +16 -0
  26. package/dist/cjs/enums/index.d.ts +7 -0
  27. package/dist/cjs/enums/index.js +17 -0
  28. package/dist/cjs/enums/keck-payment-method.d.ts +57 -0
  29. package/dist/cjs/enums/keck-payment-method.js +23 -0
  30. package/dist/cjs/enums/receipt-type.d.ts +41 -0
  31. package/dist/cjs/enums/receipt-type.js +18 -0
  32. package/dist/cjs/enums/stripe-link-mode.d.ts +17 -0
  33. package/dist/cjs/enums/stripe-link-mode.js +18 -0
  34. package/dist/cjs/enums/vat-rate.d.ts +40 -0
  35. package/dist/cjs/enums/vat-rate.js +19 -0
  36. package/dist/cjs/enums/voucher-action.d.ts +10 -0
  37. package/dist/cjs/enums/voucher-action.js +11 -0
  38. package/dist/cjs/enums/voucher-type.d.ts +9 -0
  39. package/dist/cjs/enums/voucher-type.js +10 -0
  40. package/dist/cjs/index.d.ts +5 -0
  41. package/dist/cjs/index.js +97 -0
  42. package/dist/cjs/kasse/artikel.d.ts +83 -0
  43. package/dist/cjs/kasse/artikel.js +79 -0
  44. package/dist/cjs/kasse/client.d.ts +10 -0
  45. package/dist/cjs/kasse/client.js +38 -0
  46. package/dist/cjs/kasse/drucker.d.ts +54 -0
  47. package/dist/cjs/kasse/drucker.js +41 -0
  48. package/dist/cjs/kasse/index.d.ts +11 -0
  49. package/dist/cjs/kasse/index.js +38 -0
  50. package/dist/cjs/kasse/settings.d.ts +115 -0
  51. package/dist/cjs/kasse/settings.js +62 -0
  52. package/dist/cjs/models/cancellation.d.ts +51 -0
  53. package/dist/cjs/models/cancellation.js +45 -0
  54. package/dist/cjs/models/cashregister.d.ts +77 -0
  55. package/dist/cjs/models/cashregister.js +53 -0
  56. package/dist/cjs/models/enum-payload.d.ts +26 -0
  57. package/dist/cjs/models/enum-payload.js +50 -0
  58. package/dist/cjs/models/hobex-receipt.d.ts +63 -0
  59. package/dist/cjs/models/hobex-receipt.js +86 -0
  60. package/dist/cjs/models/index.d.ts +10 -0
  61. package/dist/cjs/models/index.js +46 -0
  62. package/dist/cjs/models/receipt-company.d.ts +71 -0
  63. package/dist/cjs/models/receipt-company.js +52 -0
  64. package/dist/cjs/models/receipt-item.d.ts +100 -0
  65. package/dist/cjs/models/receipt-item.js +108 -0
  66. package/dist/cjs/models/receipt-summary.d.ts +92 -0
  67. package/dist/cjs/models/receipt-summary.js +54 -0
  68. package/dist/cjs/models/receipt.d.ts +108 -0
  69. package/dist/cjs/models/receipt.js +119 -0
  70. package/dist/cjs/models/report-month.d.ts +32 -0
  71. package/dist/cjs/models/report-month.js +65 -0
  72. package/dist/cjs/models/stripe-url-session.d.ts +18 -0
  73. package/dist/cjs/models/stripe-url-session.js +20 -0
  74. package/dist/cjs/models/voucher.d.ts +41 -0
  75. package/dist/cjs/models/voucher.js +56 -0
  76. package/dist/cjs/money.d.ts +23 -0
  77. package/dist/cjs/money.js +35 -0
  78. package/dist/cjs/package.json +1 -0
  79. package/dist/cjs/payments/hobex.d.ts +87 -0
  80. package/dist/cjs/payments/hobex.js +167 -0
  81. package/dist/cjs/payments/index.d.ts +33 -0
  82. package/dist/cjs/payments/index.js +42 -0
  83. package/dist/cjs/payments/stripe.d.ts +61 -0
  84. package/dist/cjs/payments/stripe.js +157 -0
  85. package/dist/cjs/printing/escpos.d.ts +219 -0
  86. package/dist/cjs/printing/escpos.js +636 -0
  87. package/dist/cjs/printing/index.d.ts +3 -0
  88. package/dist/cjs/printing/index.js +33 -0
  89. package/dist/cjs/printing/printable.d.ts +27 -0
  90. package/dist/cjs/printing/printable.js +90 -0
  91. package/dist/cjs/printing/webusb.d.ts +89 -0
  92. package/dist/cjs/printing/webusb.js +110 -0
  93. package/dist/cjs/react/index.d.ts +46 -0
  94. package/dist/cjs/react/index.js +51 -0
  95. package/dist/cjs/receipt/discount.d.ts +12 -0
  96. package/dist/cjs/receipt/discount.js +54 -0
  97. package/dist/cjs/receipt/epos.d.ts +53 -0
  98. package/dist/cjs/receipt/epos.js +95 -0
  99. package/dist/cjs/receipt/grid.d.ts +47 -0
  100. package/dist/cjs/receipt/grid.js +122 -0
  101. package/dist/cjs/receipt/index.d.ts +4 -0
  102. package/dist/cjs/receipt/index.js +29 -0
  103. package/dist/cjs/receipt/layout-escpos.d.ts +35 -0
  104. package/dist/cjs/receipt/layout-escpos.js +67 -0
  105. package/dist/cjs/receipt/layout.d.ts +180 -0
  106. package/dist/cjs/receipt/layout.js +594 -0
  107. package/dist/cjs/register/index.d.ts +51 -0
  108. package/dist/cjs/register/index.js +61 -0
  109. package/dist/cjs/register/pairing.d.ts +248 -0
  110. package/dist/cjs/register/pairing.js +279 -0
  111. package/dist/cjs/register/session.d.ts +37 -0
  112. package/dist/cjs/register/session.js +52 -0
  113. package/dist/cjs/vienna-time.d.ts +23 -0
  114. package/dist/cjs/vienna-time.js +114 -0
  115. package/dist/esm/client/api.d.ts +75 -0
  116. package/dist/esm/client/api.js +37 -0
  117. package/dist/esm/client/auth.d.ts +52 -0
  118. package/dist/esm/client/auth.js +68 -0
  119. package/dist/esm/client/cashregisters.d.ts +21 -0
  120. package/dist/esm/client/cashregisters.js +33 -0
  121. package/dist/esm/client/errors.d.ts +159 -0
  122. package/dist/esm/client/errors.js +212 -0
  123. package/dist/esm/client/index.d.ts +8 -0
  124. package/dist/esm/client/index.js +8 -0
  125. package/dist/esm/client/receipts.d.ts +245 -0
  126. package/dist/esm/client/receipts.js +438 -0
  127. package/dist/esm/client/reports.d.ts +43 -0
  128. package/dist/esm/client/reports.js +69 -0
  129. package/dist/esm/client/status.d.ts +43 -0
  130. package/dist/esm/client/status.js +43 -0
  131. package/dist/esm/client/transport.d.ts +117 -0
  132. package/dist/esm/client/transport.js +307 -0
  133. package/dist/esm/enums/credit-card-provider.d.ts +22 -0
  134. package/dist/esm/enums/credit-card-provider.js +20 -0
  135. package/dist/esm/enums/define-enum.d.ts +15 -0
  136. package/dist/esm/enums/define-enum.js +13 -0
  137. package/dist/esm/enums/index.d.ts +7 -0
  138. package/dist/esm/enums/index.js +7 -0
  139. package/dist/esm/enums/keck-payment-method.d.ts +57 -0
  140. package/dist/esm/enums/keck-payment-method.js +20 -0
  141. package/dist/esm/enums/receipt-type.d.ts +41 -0
  142. package/dist/esm/enums/receipt-type.js +15 -0
  143. package/dist/esm/enums/stripe-link-mode.d.ts +17 -0
  144. package/dist/esm/enums/stripe-link-mode.js +15 -0
  145. package/dist/esm/enums/vat-rate.d.ts +40 -0
  146. package/dist/esm/enums/vat-rate.js +16 -0
  147. package/dist/esm/enums/voucher-action.d.ts +10 -0
  148. package/dist/esm/enums/voucher-action.js +8 -0
  149. package/dist/esm/enums/voucher-type.d.ts +9 -0
  150. package/dist/esm/enums/voucher-type.js +7 -0
  151. package/dist/esm/index.d.ts +5 -0
  152. package/dist/esm/index.js +5 -0
  153. package/dist/esm/kasse/artikel.d.ts +83 -0
  154. package/dist/esm/kasse/artikel.js +70 -0
  155. package/dist/esm/kasse/client.d.ts +10 -0
  156. package/dist/esm/kasse/client.js +33 -0
  157. package/dist/esm/kasse/drucker.d.ts +54 -0
  158. package/dist/esm/kasse/drucker.js +36 -0
  159. package/dist/esm/kasse/index.d.ts +11 -0
  160. package/dist/esm/kasse/index.js +13 -0
  161. package/dist/esm/kasse/settings.d.ts +115 -0
  162. package/dist/esm/kasse/settings.js +58 -0
  163. package/dist/esm/models/cancellation.d.ts +51 -0
  164. package/dist/esm/models/cancellation.js +40 -0
  165. package/dist/esm/models/cashregister.d.ts +77 -0
  166. package/dist/esm/models/cashregister.js +50 -0
  167. package/dist/esm/models/enum-payload.d.ts +26 -0
  168. package/dist/esm/models/enum-payload.js +44 -0
  169. package/dist/esm/models/hobex-receipt.d.ts +63 -0
  170. package/dist/esm/models/hobex-receipt.js +80 -0
  171. package/dist/esm/models/index.d.ts +10 -0
  172. package/dist/esm/models/index.js +10 -0
  173. package/dist/esm/models/receipt-company.d.ts +71 -0
  174. package/dist/esm/models/receipt-company.js +48 -0
  175. package/dist/esm/models/receipt-item.d.ts +100 -0
  176. package/dist/esm/models/receipt-item.js +101 -0
  177. package/dist/esm/models/receipt-summary.d.ts +92 -0
  178. package/dist/esm/models/receipt-summary.js +49 -0
  179. package/dist/esm/models/receipt.d.ts +108 -0
  180. package/dist/esm/models/receipt.js +113 -0
  181. package/dist/esm/models/report-month.d.ts +32 -0
  182. package/dist/esm/models/report-month.js +58 -0
  183. package/dist/esm/models/stripe-url-session.d.ts +18 -0
  184. package/dist/esm/models/stripe-url-session.js +16 -0
  185. package/dist/esm/models/voucher.d.ts +41 -0
  186. package/dist/esm/models/voucher.js +51 -0
  187. package/dist/esm/money.d.ts +23 -0
  188. package/dist/esm/money.js +31 -0
  189. package/dist/esm/payments/hobex.d.ts +87 -0
  190. package/dist/esm/payments/hobex.js +162 -0
  191. package/dist/esm/payments/index.d.ts +33 -0
  192. package/dist/esm/payments/index.js +33 -0
  193. package/dist/esm/payments/stripe.d.ts +61 -0
  194. package/dist/esm/payments/stripe.js +153 -0
  195. package/dist/esm/printing/escpos.d.ts +219 -0
  196. package/dist/esm/printing/escpos.js +616 -0
  197. package/dist/esm/printing/index.d.ts +3 -0
  198. package/dist/esm/printing/index.js +3 -0
  199. package/dist/esm/printing/printable.d.ts +27 -0
  200. package/dist/esm/printing/printable.js +87 -0
  201. package/dist/esm/printing/webusb.d.ts +89 -0
  202. package/dist/esm/printing/webusb.js +101 -0
  203. package/dist/esm/react/index.d.ts +46 -0
  204. package/dist/esm/react/index.js +47 -0
  205. package/dist/esm/receipt/discount.d.ts +12 -0
  206. package/dist/esm/receipt/discount.js +51 -0
  207. package/dist/esm/receipt/epos.d.ts +53 -0
  208. package/dist/esm/receipt/epos.js +86 -0
  209. package/dist/esm/receipt/grid.d.ts +47 -0
  210. package/dist/esm/receipt/grid.js +116 -0
  211. package/dist/esm/receipt/index.d.ts +4 -0
  212. package/dist/esm/receipt/index.js +4 -0
  213. package/dist/esm/receipt/layout-escpos.d.ts +35 -0
  214. package/dist/esm/receipt/layout-escpos.js +64 -0
  215. package/dist/esm/receipt/layout.d.ts +180 -0
  216. package/dist/esm/receipt/layout.js +583 -0
  217. package/dist/esm/register/index.d.ts +51 -0
  218. package/dist/esm/register/index.js +51 -0
  219. package/dist/esm/register/pairing.d.ts +248 -0
  220. package/dist/esm/register/pairing.js +270 -0
  221. package/dist/esm/register/session.d.ts +37 -0
  222. package/dist/esm/register/session.js +48 -0
  223. package/dist/esm/vienna-time.d.ts +23 -0
  224. package/dist/esm/vienna-time.js +110 -0
  225. package/fixtures/belege/langer-artikelname.json +43 -0
  226. package/fixtures/belege/null-ausfall.json +41 -0
  227. package/fixtures/belege/null-jahr.json +41 -0
  228. package/fixtures/belege/null-monat.json +41 -0
  229. package/fixtures/belege/null-pruef.json +41 -0
  230. package/fixtures/belege/null-schluss.json +41 -0
  231. package/fixtures/belege/null-start.json +40 -0
  232. package/fixtures/belege/rabattzeilen.json +61 -0
  233. package/fixtures/belege/signaturausfall-verkauf.json +49 -0
  234. package/fixtures/belege/storno-teil.json +48 -0
  235. package/fixtures/belege/storno-voll.json +54 -0
  236. package/fixtures/belege/testkasse-verkauf.json +50 -0
  237. package/fixtures/belege/testsignatur-verkauf.json +50 -0
  238. package/fixtures/belege/training.json +49 -0
  239. package/fixtures/belege/verkauf-bar.json +49 -0
  240. package/fixtures/belege/verkauf-karte.json +49 -0
  241. package/fixtures/belege/verkauf-kleinunternehmer.json +42 -0
  242. package/fixtures/erwartet/langer-artikelname.grid32.txt +25 -0
  243. package/fixtures/erwartet/langer-artikelname.grid48.txt +24 -0
  244. package/fixtures/erwartet/langer-artikelname.lines.json +216 -0
  245. package/fixtures/erwartet/null-ausfall.grid32.txt +28 -0
  246. package/fixtures/erwartet/null-ausfall.grid48.txt +25 -0
  247. package/fixtures/erwartet/null-ausfall.lines.json +220 -0
  248. package/fixtures/erwartet/null-jahr.grid32.txt +29 -0
  249. package/fixtures/erwartet/null-jahr.grid48.txt +25 -0
  250. package/fixtures/erwartet/null-jahr.lines.json +220 -0
  251. package/fixtures/erwartet/null-monat.grid32.txt +28 -0
  252. package/fixtures/erwartet/null-monat.grid48.txt +25 -0
  253. package/fixtures/erwartet/null-monat.lines.json +220 -0
  254. package/fixtures/erwartet/null-pruef.grid32.txt +28 -0
  255. package/fixtures/erwartet/null-pruef.grid48.txt +25 -0
  256. package/fixtures/erwartet/null-pruef.lines.json +220 -0
  257. package/fixtures/erwartet/null-schluss.grid32.txt +28 -0
  258. package/fixtures/erwartet/null-schluss.grid48.txt +25 -0
  259. package/fixtures/erwartet/null-schluss.lines.json +220 -0
  260. package/fixtures/erwartet/null-start.grid32.txt +28 -0
  261. package/fixtures/erwartet/null-start.grid48.txt +25 -0
  262. package/fixtures/erwartet/null-start.lines.json +220 -0
  263. package/fixtures/erwartet/rabattzeilen.grid32.txt +27 -0
  264. package/fixtures/erwartet/rabattzeilen.grid48.txt +26 -0
  265. package/fixtures/erwartet/rabattzeilen.lines.json +286 -0
  266. package/fixtures/erwartet/signaturausfall-verkauf.grid32.txt +28 -0
  267. package/fixtures/erwartet/signaturausfall-verkauf.grid48.txt +26 -0
  268. package/fixtures/erwartet/signaturausfall-verkauf.lines.json +266 -0
  269. package/fixtures/erwartet/storno-teil.grid32.txt +27 -0
  270. package/fixtures/erwartet/storno-teil.grid48.txt +26 -0
  271. package/fixtures/erwartet/storno-teil.lines.json +237 -0
  272. package/fixtures/erwartet/storno-voll.grid32.txt +29 -0
  273. package/fixtures/erwartet/storno-voll.grid48.txt +28 -0
  274. package/fixtures/erwartet/storno-voll.lines.json +277 -0
  275. package/fixtures/erwartet/testkasse-verkauf.grid32.txt +28 -0
  276. package/fixtures/erwartet/testkasse-verkauf.grid48.txt +27 -0
  277. package/fixtures/erwartet/testkasse-verkauf.lines.json +270 -0
  278. package/fixtures/erwartet/testsignatur-verkauf.grid32.txt +30 -0
  279. package/fixtures/erwartet/testsignatur-verkauf.grid48.txt +27 -0
  280. package/fixtures/erwartet/testsignatur-verkauf.lines.json +270 -0
  281. package/fixtures/erwartet/training.grid32.txt +33 -0
  282. package/fixtures/erwartet/training.grid48.txt +30 -0
  283. package/fixtures/erwartet/training.lines.json +277 -0
  284. package/fixtures/erwartet/verkauf-bar.grid32.txt +25 -0
  285. package/fixtures/erwartet/verkauf-bar.grid48.txt +24 -0
  286. package/fixtures/erwartet/verkauf-bar.lines.json +256 -0
  287. package/fixtures/erwartet/verkauf-karte.grid32.txt +25 -0
  288. package/fixtures/erwartet/verkauf-karte.grid48.txt +24 -0
  289. package/fixtures/erwartet/verkauf-karte.lines.json +256 -0
  290. package/fixtures/erwartet/verkauf-kleinunternehmer.grid32.txt +26 -0
  291. package/fixtures/erwartet/verkauf-kleinunternehmer.grid48.txt +25 -0
  292. package/fixtures/erwartet/verkauf-kleinunternehmer.lines.json +226 -0
  293. package/fixtures/manifest.json +107 -0
  294. package/package.json +135 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Deutung von Server-Zeitstempeln in der Geschaeftszeitzone Europe/Vienna —
3
+ * Zwilling von `ViennaTime.parseServerTimeStamp` in
4
+ * kasseneck_api/lib/services/vienna_time.dart.
5
+ *
6
+ * Zwei Richtungen: `parseServerTimeStamp` deutet die Nutzlast als Zeitpunkt,
7
+ * `toViennaWallClock` liest zu einem Zeitpunkt die Wiener Wanduhrzeit zurueck.
8
+ * Die Rueckrichtung braucht jeder, der aus einem Zeitpunkt einen fachlichen
9
+ * Kalenderwert ableitet (Berichtsmonat, Tagesabgrenzung): die eingebauten
10
+ * `getMonth()`/`getFullYear()` liefern die Zeitzone des ausfuehrenden
11
+ * Rechners, und ein Beleg vom 1. Maerz 00:30 Wiener Zeit faellt damit auf
12
+ * einer UTC-Maschine in den Februar. Weitere Anzeigehilfen des Dart-Vorbilds
13
+ * (`dayKey`, `now()`) sind nicht Teil dieses Pakets.
14
+ *
15
+ * Der Kasseneck-Server liefert Zeitstempel uneinheitlich: neue Belege als
16
+ * Wiener Wanduhrzeit ohne Offset (`getLokalAustriaTimeFinanzamtFormat()` im
17
+ * Backend, Format `YYYY-MM-DDTHH:mm:ss`), manche aeltere/andere Felder als
18
+ * echten Zeitpunkt mit `Z`/Offset. `new Date(raw)` allein ist dafuer
19
+ * ungeeignet: JS deutet einen offsetlosen ISO-String als **lokale** Zeit des
20
+ * ausfuehrenden Rechners — auf einer Wiener Maschine zufaellig richtig, in
21
+ * jeder anderen Zeitzone (z. B. einer Browser-Kasse im Ausland) falsch.
22
+ */
23
+ const STUNDE_MS = 60 * 60 * 1000;
24
+ const NAIVER_ZEITSTEMPEL = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?$/;
25
+ const HAT_ZEITZONE = /Z$|[+-]\d{2}:?\d{2}$/;
26
+ /**
27
+ * Server-Zeitstempel parsen: ohne Offset = Wiener Wanduhrzeit, mit
28
+ * Offset/`Z` = bereits ein echter Zeitpunkt. Ergebnis ist immer ein echter
29
+ * Zeitpunkt (JS-`Date`, intern UTC-Millisekunden seit Epoch).
30
+ */
31
+ export function parseServerTimeStamp(raw) {
32
+ const trimmed = raw.trim();
33
+ if (HAT_ZEITZONE.test(trimmed)) {
34
+ const zeitpunkt = new Date(trimmed);
35
+ // `new Date` macht aus '2026-99-99T00:00:00Z' klaglos ein Invalid Date:
36
+ // eine Zeitzone allein macht noch kein Datum. Ohne diese Pruefung wandert
37
+ // der Unsinn still weiter und wird erst in einer Ableitung zu NaN — dort,
38
+ // wo niemand mehr auf den Zeitstempel schaut.
39
+ if (Number.isNaN(zeitpunkt.getTime())) {
40
+ throw new Error(`Zeitstempel: unlesbares Format "${raw}"`);
41
+ }
42
+ return zeitpunkt;
43
+ }
44
+ const match = NAIVER_ZEITSTEMPEL.exec(trimmed);
45
+ if (!match) {
46
+ throw new Error(`Zeitstempel: unlesbares Format "${raw}"`);
47
+ }
48
+ const [, jahr, monat, tag, stunde, minute, sekunde, bruchteil] = match;
49
+ return fromViennaWallClock({
50
+ year: Number(jahr),
51
+ month: Number(monat),
52
+ day: Number(tag),
53
+ hour: Number(stunde),
54
+ minute: Number(minute),
55
+ second: Number(sekunde),
56
+ millisecond: bruchteil ? Number(bruchteil.padEnd(3, '0').slice(0, 3)) : 0,
57
+ });
58
+ }
59
+ /**
60
+ * Echter Zeitpunkt -> Wiener Wanduhrzeit (Gegenstueck zu
61
+ * [parseServerTimeStamp]). Der Versatz kommt aus derselben Sommerzeitregel wie
62
+ * die Hinrichtung; hier ist er direkt anwendbar, weil der Zeitpunkt schon
63
+ * feststeht.
64
+ */
65
+ export function toViennaWallClock(zeitpunkt) {
66
+ const utcMs = zeitpunkt.getTime();
67
+ // Ein Invalid Date wuerde hier lautlos zu NaN in jedem Feld — und damit zu
68
+ // einem NaN-Berichtsmonat beim Aufrufer.
69
+ if (Number.isNaN(utcMs)) {
70
+ throw new Error('Zeitpunkt: unbrauchbarer Wert (Invalid Date)');
71
+ }
72
+ const versatzMs = (istSommerzeit(utcMs) ? 2 : 1) * STUNDE_MS;
73
+ const verschoben = new Date(utcMs + versatzMs);
74
+ return {
75
+ year: verschoben.getUTCFullYear(),
76
+ month: verschoben.getUTCMonth() + 1,
77
+ day: verschoben.getUTCDate(),
78
+ hour: verschoben.getUTCHours(),
79
+ minute: verschoben.getUTCMinutes(),
80
+ second: verschoben.getUTCSeconds(),
81
+ millisecond: verschoben.getUTCMilliseconds(),
82
+ };
83
+ }
84
+ /** Wiener Wanduhrzeit (Ziffern wie angezeigt) -> echter Zeitpunkt (UTC). */
85
+ function fromViennaWallClock(wand) {
86
+ const basisUtcMs = Date.UTC(wand.year, wand.month - 1, wand.day, wand.hour, wand.minute, wand.second, wand.millisecond);
87
+ // Erst Sommerzeit annehmen; stimmt die Annahme fuer den resultierenden
88
+ // Zeitpunkt, war sie richtig — sonst gilt Winterzeit (wie im Dart-Vorbild).
89
+ const sommerVariante = basisUtcMs - 2 * STUNDE_MS;
90
+ if (istSommerzeit(sommerVariante)) {
91
+ return new Date(sommerVariante);
92
+ }
93
+ return new Date(basisUtcMs - 1 * STUNDE_MS);
94
+ }
95
+ /** EU-Sommerzeit: letzter Sonntag im Maerz 01:00 UTC bis letzter Sonntag im Oktober 01:00 UTC. */
96
+ function istSommerzeit(utcMs) {
97
+ const jahr = new Date(utcMs).getUTCFullYear();
98
+ const start = letzterSonntagUtcMs(jahr, 3);
99
+ const ende = letzterSonntagUtcMs(jahr, 10);
100
+ return utcMs >= start && utcMs < ende;
101
+ }
102
+ /** Letzter Sonntag des Monats, 01:00 UTC (EU-Umstellungszeitpunkt). */
103
+ function letzterSonntagUtcMs(jahr, monat) {
104
+ const letzterTag = new Date(Date.UTC(jahr, monat, 0)).getUTCDate();
105
+ // JS-Wochentag (0=Sonntag..6=Samstag) ist bereits die Anzahl Tage seit dem
106
+ // letzten Sonntag — keine Umrechnung noetig (anders als Darts weekday, das
107
+ // Montag=1..Sonntag=7 zaehlt und dafuer `% 7` braucht).
108
+ const wochentag = new Date(Date.UTC(jahr, monat - 1, letzterTag)).getUTCDay();
109
+ return Date.UTC(jahr, monat - 1, letzterTag - wochentag, 1, 0, 0, 0);
110
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-42",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [
21
+ {
22
+ "name": "Hausgemachte Bio-Dinkelvollkornsemmel mit Kürbiskernen und Sonnenblumenkernen",
23
+ "quantity": 2,
24
+ "unitPriceCents": 149,
25
+ "vatRate": 10
26
+ }
27
+ ],
28
+ "vouchers": [],
29
+ "paymentMethod": "cash",
30
+ "turnoverCounterAES256ICM": "UMSATZ",
31
+ "signaturePreviousReceipt": "VORGAENGER",
32
+ "certificateSerialNumber": "6F0404F0",
33
+ "receiptType": "standard",
34
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
35
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
36
+ "fullReceiptId": "VOLL",
37
+ "customerDetails": [],
38
+ "legalMessage": []
39
+ },
40
+ "options": {
41
+ "paperSize": "mm58"
42
+ }
43
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-50",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [],
21
+ "vouchers": [],
22
+ "paymentMethod": null,
23
+ "turnoverCounterAES256ICM": "UMSATZ",
24
+ "signaturePreviousReceipt": "VORGAENGER",
25
+ "certificateSerialNumber": "6F0404F0",
26
+ "receiptType": "zero",
27
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
28
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
29
+ "fullReceiptId": "VOLL",
30
+ "customerDetails": [],
31
+ "legalMessage": [],
32
+ "zeroKind": "outage_end"
33
+ },
34
+ "options": {
35
+ "paperSize": "mm80",
36
+ "pruefangaben": {
37
+ "karteRegistriertAm": "2024-03-12",
38
+ "kasseRegistriertAm": "2024-03-12"
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-48",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-12-31T23:59:30",
20
+ "items": [],
21
+ "vouchers": [],
22
+ "paymentMethod": null,
23
+ "turnoverCounterAES256ICM": "UMSATZ",
24
+ "signaturePreviousReceipt": "VORGAENGER",
25
+ "certificateSerialNumber": "6F0404F0",
26
+ "receiptType": "zero",
27
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
28
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
29
+ "fullReceiptId": "VOLL",
30
+ "customerDetails": [],
31
+ "legalMessage": [],
32
+ "zeroKind": "annual"
33
+ },
34
+ "options": {
35
+ "paperSize": "mm80",
36
+ "pruefangaben": {
37
+ "karteRegistriertAm": "2024-03-12",
38
+ "kasseRegistriertAm": "2024-03-12"
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-47",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-31T23:59:30",
20
+ "items": [],
21
+ "vouchers": [],
22
+ "paymentMethod": null,
23
+ "turnoverCounterAES256ICM": "UMSATZ",
24
+ "signaturePreviousReceipt": "VORGAENGER",
25
+ "certificateSerialNumber": "6F0404F0",
26
+ "receiptType": "zero",
27
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
28
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
29
+ "fullReceiptId": "VOLL",
30
+ "customerDetails": [],
31
+ "legalMessage": [],
32
+ "zeroKind": "monthly"
33
+ },
34
+ "options": {
35
+ "paperSize": "mm80",
36
+ "pruefangaben": {
37
+ "karteRegistriertAm": "2024-03-12",
38
+ "kasseRegistriertAm": "2024-03-12"
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-46",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [],
21
+ "vouchers": [],
22
+ "paymentMethod": null,
23
+ "turnoverCounterAES256ICM": "UMSATZ",
24
+ "signaturePreviousReceipt": "VORGAENGER",
25
+ "certificateSerialNumber": "6F0404F0",
26
+ "receiptType": "zero",
27
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
28
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
29
+ "fullReceiptId": "VOLL",
30
+ "customerDetails": [],
31
+ "legalMessage": [],
32
+ "zeroKind": "manual"
33
+ },
34
+ "options": {
35
+ "paperSize": "mm80",
36
+ "pruefangaben": {
37
+ "karteRegistriertAm": "2024-03-12",
38
+ "kasseRegistriertAm": "2024-03-12"
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-49",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [],
21
+ "vouchers": [],
22
+ "paymentMethod": null,
23
+ "turnoverCounterAES256ICM": "UMSATZ",
24
+ "signaturePreviousReceipt": "VORGAENGER",
25
+ "certificateSerialNumber": "6F0404F0",
26
+ "receiptType": "zero",
27
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
28
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
29
+ "fullReceiptId": "VOLL",
30
+ "customerDetails": [],
31
+ "legalMessage": [],
32
+ "zeroKind": "final"
33
+ },
34
+ "options": {
35
+ "paperSize": "mm80",
36
+ "pruefangaben": {
37
+ "karteRegistriertAm": "2024-03-12",
38
+ "kasseRegistriertAm": "2024-03-12"
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-1",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-01-02T08:00:00",
20
+ "items": [],
21
+ "vouchers": [],
22
+ "paymentMethod": null,
23
+ "turnoverCounterAES256ICM": "UMSATZ",
24
+ "signaturePreviousReceipt": "VORGAENGER",
25
+ "certificateSerialNumber": "6F0404F0",
26
+ "receiptType": "start",
27
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
28
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
29
+ "fullReceiptId": "VOLL",
30
+ "customerDetails": [],
31
+ "legalMessage": []
32
+ },
33
+ "options": {
34
+ "paperSize": "mm80",
35
+ "pruefangaben": {
36
+ "karteRegistriertAm": "2024-03-12",
37
+ "kasseRegistriertAm": "2024-03-12"
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-42",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [
21
+ {
22
+ "name": "Semmel",
23
+ "quantity": 4,
24
+ "unitPriceCents": 79,
25
+ "vatRate": 10
26
+ },
27
+ {
28
+ "name": "Kaffee klein",
29
+ "quantity": 1,
30
+ "unitPriceCents": 280,
31
+ "vatRate": 20
32
+ },
33
+ {
34
+ "name": "Rabatt 10 %",
35
+ "quantity": 1,
36
+ "unitPriceCents": -32,
37
+ "vatRate": 10
38
+ },
39
+ {
40
+ "name": "Rabatt 10 %",
41
+ "quantity": 1,
42
+ "unitPriceCents": -28,
43
+ "vatRate": 20
44
+ }
45
+ ],
46
+ "vouchers": [],
47
+ "paymentMethod": "cash",
48
+ "turnoverCounterAES256ICM": "UMSATZ",
49
+ "signaturePreviousReceipt": "VORGAENGER",
50
+ "certificateSerialNumber": "6F0404F0",
51
+ "receiptType": "standard",
52
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
53
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
54
+ "fullReceiptId": "VOLL",
55
+ "customerDetails": [],
56
+ "legalMessage": []
57
+ },
58
+ "options": {
59
+ "paperSize": "mm80"
60
+ }
61
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-51",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [
21
+ {
22
+ "name": "Semmel",
23
+ "quantity": 4,
24
+ "unitPriceCents": 79,
25
+ "vatRate": 10
26
+ },
27
+ {
28
+ "name": "Kaffee klein",
29
+ "quantity": 1,
30
+ "unitPriceCents": 280,
31
+ "vatRate": 20
32
+ }
33
+ ],
34
+ "vouchers": [],
35
+ "paymentMethod": "cash",
36
+ "turnoverCounterAES256ICM": "UMSATZ",
37
+ "signaturePreviousReceipt": "VORGAENGER",
38
+ "certificateSerialNumber": "6F0404F0",
39
+ "receiptType": "standard",
40
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.U2ljaGVyaGVpdHNlaW5yaWNodHVuZyBhdXNnZWZhbGxlbg",
41
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
42
+ "fullReceiptId": "VOLL",
43
+ "customerDetails": [],
44
+ "legalMessage": []
45
+ },
46
+ "options": {
47
+ "paperSize": "mm80"
48
+ }
49
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-44",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [
21
+ {
22
+ "name": "Semmel",
23
+ "quantity": -1,
24
+ "unitPriceCents": 79,
25
+ "vatRate": 10
26
+ }
27
+ ],
28
+ "vouchers": [],
29
+ "paymentMethod": "cash",
30
+ "turnoverCounterAES256ICM": "UMSATZ",
31
+ "signaturePreviousReceipt": "VORGAENGER",
32
+ "certificateSerialNumber": "6F0404F0",
33
+ "receiptType": "cancellation",
34
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
35
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
36
+ "fullReceiptId": "VOLL",
37
+ "customerDetails": [],
38
+ "legalMessage": [],
39
+ "cancellationOf": {
40
+ "receiptId": "AT0-KASSE1-42",
41
+ "fullReceiptId": null
42
+ },
43
+ "cancellationReason": "fehleingabe"
44
+ },
45
+ "options": {
46
+ "paperSize": "mm58"
47
+ }
48
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-43",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [
21
+ {
22
+ "name": "Semmel",
23
+ "quantity": -4,
24
+ "unitPriceCents": 79,
25
+ "vatRate": 10
26
+ },
27
+ {
28
+ "name": "Kaffee klein",
29
+ "quantity": -1,
30
+ "unitPriceCents": 280,
31
+ "vatRate": 20
32
+ }
33
+ ],
34
+ "vouchers": [],
35
+ "paymentMethod": "cash",
36
+ "turnoverCounterAES256ICM": "UMSATZ",
37
+ "signaturePreviousReceipt": "VORGAENGER",
38
+ "certificateSerialNumber": "6F0404F0",
39
+ "receiptType": "cancellation",
40
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
41
+ "qr": "_R1-AT1_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
42
+ "fullReceiptId": "VOLL",
43
+ "customerDetails": [],
44
+ "legalMessage": [],
45
+ "cancellationOf": {
46
+ "receiptId": "AT0-KASSE1-42",
47
+ "fullReceiptId": null
48
+ },
49
+ "cancellationReason": "kunde_storniert"
50
+ },
51
+ "options": {
52
+ "paperSize": "mm80"
53
+ }
54
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "company": {
3
+ "companyName": "Bäckerei Muster",
4
+ "street": "Hauptplatz 1",
5
+ "zip": "4830",
6
+ "city": "Hallstatt",
7
+ "phone": "+43 6134 12345",
8
+ "uid": "ATU12345678",
9
+ "taxnr": "",
10
+ "isSmallBusiness": false,
11
+ "footer1": "Vielen Dank für Ihren Einkauf",
12
+ "footer2": "www.baeckerei-muster.at",
13
+ "thanksMessage": [],
14
+ "showKreiseckLogo": false
15
+ },
16
+ "receipt": {
17
+ "receiptId": "AT0-KASSE1-42",
18
+ "cashregisterId": "KASSE1",
19
+ "timeStamp": "2026-08-13T10:15:30",
20
+ "items": [
21
+ {
22
+ "name": "Semmel",
23
+ "quantity": 4,
24
+ "unitPriceCents": 79,
25
+ "vatRate": 10
26
+ },
27
+ {
28
+ "name": "Kaffee klein",
29
+ "quantity": 1,
30
+ "unitPriceCents": 280,
31
+ "vatRate": 20
32
+ }
33
+ ],
34
+ "vouchers": [],
35
+ "paymentMethod": "cash",
36
+ "turnoverCounterAES256ICM": "UMSATZ",
37
+ "signaturePreviousReceipt": "VORGAENGER",
38
+ "certificateSerialNumber": "6F0404F0",
39
+ "receiptType": "standard",
40
+ "sig": "eyJhbGciOiJFUzI1NiJ9.QVQx.SIGNATURWERT",
41
+ "qr": "_R1-AT100_KASSE1_AT0-KASSE1-42_2026-08-13T10:15:30_5,00_2,70_0,00_0,00_0,00_UMSATZ_VORGAENGER_6F0404F0_SIGNATUR",
42
+ "fullReceiptId": "VOLL",
43
+ "customerDetails": [],
44
+ "legalMessage": []
45
+ },
46
+ "options": {
47
+ "paperSize": "mm80",
48
+ "testKasse": true
49
+ }
50
+ }