@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,117 @@
1
+ import type { KasseneckAuth } from './auth.js';
2
+ /**
3
+ * Transport zum Kasseneck-Backend: ein Aufruf ist ein POST an
4
+ * `<basis>/<funktionsname>` mit dem JSON-Rumpf `{ "params": { … } }` — wie im
5
+ * Flutter-Zwilling `kasseneck_api`.
6
+ *
7
+ * Der Transport macht drei Dinge und sonst nichts: Anfrage bauen (Kopfzeilen
8
+ * von der Anmeldung, Nutzlast aus Auth-Parametern und Aufruferparametern),
9
+ * Zeitlimit ueberwachen, und die Antworthuelle aufloesen. Er kennt keine
10
+ * einzelne Backend-Funktion und keine Firebase-Details.
11
+ *
12
+ * Es gibt **zwei Einstiegspunkte** auf demselben Kern: [createTransport] fuer
13
+ * die JSON-Aufrufe und [createBinaryTransport] fuer die beiden Bericht-
14
+ * Downloads, die ein PDF liefern. Anmeldung, Zeitlimit, Rumpfaufbau und die
15
+ * Fehlerarten sind bei beiden dieselben; sie unterscheiden sich nur darin, wie
16
+ * der Antwortrumpf gelesen und ausgewertet wird.
17
+ *
18
+ * **Kein Wiederholen fehlgeschlagener Aufrufe.** Ein Beleg ist nicht folgenlos
19
+ * wiederholbar; ohne entschiedene Idempotenz waere ein automatischer zweiter
20
+ * Versuch ein zweiter Beleg.
21
+ */
22
+ /** Basis-URL der Produktion. */
23
+ export declare const DEFAULT_BASE_URL = "https://api.kasseneck.at/v1";
24
+ /**
25
+ * Zeitlimit je Aufruf (wie im Flutter-Zwilling). Ohne Zeitlimit bleibt eine
26
+ * haengende Anfrage fuer immer offen — der Aufrufer bekaeme weder Ergebnis
27
+ * noch Fehler.
28
+ */
29
+ export declare const DEFAULT_TIMEOUT_MS = 30000;
30
+ /**
31
+ * Der Teil einer `fetch`-Antwort, den dieser Transport braucht. Bewusst
32
+ * minimal, damit Tests ohne echtes Netz eine Antwort stellen koennen; das
33
+ * globale `fetch` erfuellt diese Form.
34
+ */
35
+ export interface HttpResponseLike {
36
+ status: number;
37
+ headers: {
38
+ get(name: string): string | null;
39
+ };
40
+ text(): Promise<string>;
41
+ /**
42
+ * Rohe Bytes der Antwort — der Binaerweg ([createBinaryTransport]) liest
43
+ * ausschliesslich sie. Bewusst **verpflichtend**: jede `fetch`-Antwort bringt
44
+ * die Methode mit, betroffen sind nur Attrappen — und eine Attrappe ohne
45
+ * Bytes bringt einen Test dazu, den Binaerweg nie zu erreichen und trotzdem
46
+ * gruen zu melden. Dieser Fehler gehoert an die Bauzeit, nicht in die
47
+ * Laufzeit.
48
+ */
49
+ arrayBuffer(): Promise<ArrayBuffer>;
50
+ }
51
+ export interface HttpRequestInit {
52
+ method: string;
53
+ headers: Record<string, string>;
54
+ body: string;
55
+ signal: AbortSignal;
56
+ }
57
+ /**
58
+ * Austauschbare `fetch`-Umsetzung. Vorgabe ist das globale `fetch` (Node
59
+ * >= 20.18 und jeder Browser bringen es mit) — dieses Paket haengt an keiner
60
+ * HTTP-Bibliothek.
61
+ */
62
+ export type FetchLike = (url: string, init: HttpRequestInit) => Promise<HttpResponseLike>;
63
+ export interface TransportOptions {
64
+ /** Anmeldung; wird pro Aufruf befragt. */
65
+ auth: KasseneckAuth;
66
+ /** Abweichende Basis-URL (z. B. eigene Rewrites der Browser-Kasse). */
67
+ baseUrl?: string;
68
+ /** Zeitlimit je Aufruf in Millisekunden. */
69
+ timeoutMs?: number;
70
+ /** Eigene `fetch`-Umsetzung (Tests, Proxys). */
71
+ fetch?: FetchLike;
72
+ }
73
+ /**
74
+ * Ruft eine Backend-Funktion auf und liefert deren Nutzlast **ohne Huelle**.
75
+ * Ein Verbraucher prueft nie selbst auf `status`: Misserfolg kommt als
76
+ * geworfener Fehler.
77
+ *
78
+ * `extraBodyFields` legt zusaetzliche Felder **neben** `params` auf die oberste
79
+ * Rumpfebene. Genau ein Endpunkt braucht das: `financeWebService` erwartet
80
+ * seine `method` neben `params` und nicht darin (siehe Flutter-Vorbild
81
+ * `_financeWebServicePostRequest`). Fuer alle anderen Aufrufe bleibt der Rumpf
82
+ * unveraendert `{params:{…}}`.
83
+ *
84
+ * `secretParams` nennt Werte, die dieser Aufruf in der **Nutzlast** sendet und
85
+ * die in keinem Fehler auftauchen duerfen. Die gesendeten Kopfzeilen sind
86
+ * ohnehin geschuetzt (siehe unten); PIN, Geraetegeheimnis und Kopplungs-Code
87
+ * der Kassen-Anmeldung reisen dagegen im Rumpf, und ein Geraetegeheimnis ist
88
+ * bezeichner-foermig genug, um durch die Ursachen-Verdichtung zu kommen. Wer
89
+ * ein Geheimnis im Rumpf sendet, nennt es hier — sonst gilt es als
90
+ * unbedenklich.
91
+ *
92
+ * Der Typ nennt darum genau dieses eine Feld und ist kein offener Beutel:
93
+ * ein `params` von aussen wuerde die Nutzlast samt Auth-Parametern
94
+ * ueberschreiben — mit `registerUserAuth` verschwaende dabei still die
95
+ * Kassenbindung. Zusaetzlich setzt der Rumpfaufbau `params` als letztes, damit
96
+ * auch ein Verbraucher ohne Typen nicht daran vorbeikommt.
97
+ */
98
+ export interface TransportBodyFields {
99
+ /** Vorgangsart von `financeWebService` (z. B. `status_cashbox`). */
100
+ method?: string;
101
+ }
102
+ export type KasseneckTransport = <T = unknown>(functionName: string, params?: Record<string, unknown>, extraBodyFields?: TransportBodyFields, secretParams?: readonly string[]) => Promise<T>;
103
+ /**
104
+ * Ruft eine Backend-Funktion auf, die **Binaerdaten** liefert (die beiden
105
+ * Bericht-PDFs), und gibt sie als `Uint8Array` zurueck.
106
+ */
107
+ export type KasseneckBinaryTransport = (functionName: string, params?: Record<string, unknown>) => Promise<Uint8Array>;
108
+ export declare function createTransport(options: TransportOptions): KasseneckTransport;
109
+ /**
110
+ * Zweiter Einstiegspunkt fuer die Bericht-Downloads. Er liest die Antwort als
111
+ * Bytes und **nie** als Zeichenkette: ein PDF ist keine UTF-8-Folge, und eine
112
+ * Textdeutung ersetzt jedes Byte ueber 0x7F durch U+FFFD — die Datei waere
113
+ * kaputt, ohne dass es jemand merkt. (Das Flutter-Vorbild nimmt hier
114
+ * `response.body.codeUnits`; das ist eine bewusste Abweichung, siehe
115
+ * reports.ts.)
116
+ */
117
+ export declare function createBinaryTransport(options: TransportOptions): KasseneckBinaryTransport;
@@ -0,0 +1,307 @@
1
+ import { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, causeDigest, } from './errors.js';
2
+ /**
3
+ * Transport zum Kasseneck-Backend: ein Aufruf ist ein POST an
4
+ * `<basis>/<funktionsname>` mit dem JSON-Rumpf `{ "params": { … } }` — wie im
5
+ * Flutter-Zwilling `kasseneck_api`.
6
+ *
7
+ * Der Transport macht drei Dinge und sonst nichts: Anfrage bauen (Kopfzeilen
8
+ * von der Anmeldung, Nutzlast aus Auth-Parametern und Aufruferparametern),
9
+ * Zeitlimit ueberwachen, und die Antworthuelle aufloesen. Er kennt keine
10
+ * einzelne Backend-Funktion und keine Firebase-Details.
11
+ *
12
+ * Es gibt **zwei Einstiegspunkte** auf demselben Kern: [createTransport] fuer
13
+ * die JSON-Aufrufe und [createBinaryTransport] fuer die beiden Bericht-
14
+ * Downloads, die ein PDF liefern. Anmeldung, Zeitlimit, Rumpfaufbau und die
15
+ * Fehlerarten sind bei beiden dieselben; sie unterscheiden sich nur darin, wie
16
+ * der Antwortrumpf gelesen und ausgewertet wird.
17
+ *
18
+ * **Kein Wiederholen fehlgeschlagener Aufrufe.** Ein Beleg ist nicht folgenlos
19
+ * wiederholbar; ohne entschiedene Idempotenz waere ein automatischer zweiter
20
+ * Versuch ein zweiter Beleg.
21
+ */
22
+ /** Basis-URL der Produktion. */
23
+ export const DEFAULT_BASE_URL = 'https://api.kasseneck.at/v1';
24
+ /**
25
+ * Zeitlimit je Aufruf (wie im Flutter-Zwilling). Ohne Zeitlimit bleibt eine
26
+ * haengende Anfrage fuer immer offen — der Aufrufer bekaeme weder Ergebnis
27
+ * noch Fehler.
28
+ */
29
+ export const DEFAULT_TIMEOUT_MS = 30_000;
30
+ export function createTransport(options) {
31
+ const kern = createCore(options);
32
+ return (functionName, params, extraBodyFields, secretParams) => kern(functionName, params, extraBodyFields, secretParams, alsText, jsonAuswerten);
33
+ }
34
+ /**
35
+ * Zweiter Einstiegspunkt fuer die Bericht-Downloads. Er liest die Antwort als
36
+ * Bytes und **nie** als Zeichenkette: ein PDF ist keine UTF-8-Folge, und eine
37
+ * Textdeutung ersetzt jedes Byte ueber 0x7F durch U+FFFD — die Datei waere
38
+ * kaputt, ohne dass es jemand merkt. (Das Flutter-Vorbild nimmt hier
39
+ * `response.body.codeUnits`; das ist eine bewusste Abweichung, siehe
40
+ * reports.ts.)
41
+ */
42
+ export function createBinaryTransport(options) {
43
+ const kern = createCore(options);
44
+ return (functionName, params) => kern(functionName, params, undefined, undefined, alsBytes, pdfAuswerten);
45
+ }
46
+ /**
47
+ * Gemeinsamer Kern beider Einstiegspunkte: Anmeldung, Zeitlimit, Anfrage und
48
+ * HTTP-Status. Was danach mit dem Rumpf geschieht, entscheiden `lesen` und
49
+ * `auswerten`.
50
+ */
51
+ function createCore(options) {
52
+ const basis = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, '');
53
+ const zeitlimitMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
54
+ const holen = options.fetch ?? globalesFetch();
55
+ return async function aufrufen(functionName, params = {}, extraBodyFields, secretParams, lesen, auswerten) {
56
+ // Die URL nennt die Backend-Funktion, die Fehler nennen den **Vorgang**:
57
+ // `financeWebService` fuehrt ein Dutzend verschiedener Vorgaenge unter einem
58
+ // Endpunkt, und ein Fehler, der nur "financeWebService" sagt, verschweigt
59
+ // dem Aufrufer, welcher davon scheiterte.
60
+ const fehlerName = extraBodyFields?.method ? `${functionName}/${extraBodyFields.method}` : functionName;
61
+ // Das Zeitlimit laeuft ab HIER — es deckt die Anmeldung mit ab. Haengt die
62
+ // Token-Erneuerung auf flauem Netz, haette der Aufruf sonst weder Ergebnis
63
+ // noch Fehler, und die Kasse stuende still.
64
+ const abbruch = new AbortController();
65
+ const wecker = setTimeout(() => abbruch.abort(), zeitlimitMs);
66
+ try {
67
+ // Die Anmeldung wird bei JEDEM Aufruf befragt — nichts wird beim Anlegen
68
+ // des Transports gemerkt (Ablaufzeiten siehe auth.ts).
69
+ let anmeldung;
70
+ try {
71
+ const ergebnis = await Promise.race([Promise.resolve(options.auth()), abbruchAlsAblehnung(abbruch.signal)]);
72
+ anmeldung = gepruefteAnmeldung(ergebnis);
73
+ }
74
+ catch (ursache) {
75
+ if (abbruch.signal.aborted) {
76
+ throw new KasseneckNetworkError(fehlerName, true, zeitlimitMs);
77
+ }
78
+ // Eigene Pruefungen tragen ihren geheimnisfreien Grund weiter; von einer
79
+ // fremden Ursache (Firebase & Co.) bleibt nichts uebrig — weder Meldung
80
+ // noch Verdichtung, siehe Klassenkommentar zu KasseneckAuthError.
81
+ const grund = ursache instanceof KasseneckAuthError ? ursache.reason : 'Anmeldung fehlgeschlagen';
82
+ throw new KasseneckAuthError(grund, { functionName: fehlerName });
83
+ }
84
+ // Was wir gleich senden, darf spaeter in keiner Fehlermeldung auftauchen:
85
+ // die Kopfzeilen der Anmeldung — und die Werte, die dieser Aufruf als
86
+ // Geheimnis der Nutzlast benannt hat (Kassen-Anmeldung: Kopplungs-Code,
87
+ // Geraetegeheimnis, PIN). Ohne die zweite Haelfte greift die Zusage genau
88
+ // dort nicht, wo es gar keine Kopfzeilen gibt.
89
+ const geheimnisse = [...Object.values(anmeldung.headers), ...(secretParams ?? [])];
90
+ const url = `${basis}/${encodeURIComponent(functionName)}`;
91
+ // `params` steht ZULETZT: so kann kein Zusatzfeld die Nutzlast (und mit
92
+ // ihr die Kassenbindung aus der Anmeldung) verdraengen — auch nicht von
93
+ // einem Verbraucher, der ohne Typen an TransportBodyFields vorbeikommt.
94
+ const rumpf = JSON.stringify({ ...extraBodyFields, params: nutzlast(anmeldung.params, params) });
95
+ let antwort;
96
+ let koerper;
97
+ try {
98
+ // Auch der Aufruf laeuft gegen den Abbruch — nicht nur die Anmeldung.
99
+ // Das `AbortSignal` geht zwar mit, aber ob eine fetch-Umsetzung es
100
+ // beachtet, ist keine Zusage dieses Pakets: `options.fetch` ist ein
101
+ // dokumentierter Erweiterungspunkt fuer Proxys, und eine Umsetzung,
102
+ // die das Signal ignoriert, liesse den Aufruf sonst fuer immer offen —
103
+ // weder Ergebnis noch Fehler. Das Lesen des Rumpfs haengt genauso mit
104
+ // darunter: eine Gegenstelle kann die Kopfzeilen schicken und den
105
+ // Rumpf offen lassen.
106
+ antwort = await Promise.race([
107
+ holen(url, {
108
+ method: 'POST',
109
+ headers: { 'Content-Type': 'application/json', ...anmeldung.headers },
110
+ body: rumpf,
111
+ signal: abbruch.signal,
112
+ }),
113
+ abbruchAlsAblehnung(abbruch.signal),
114
+ ]);
115
+ koerper = await Promise.race([lesen(antwort, fehlerName), abbruchAlsAblehnung(abbruch.signal)]);
116
+ }
117
+ catch (ursache) {
118
+ // Ein Formfehler des Pakets ist kein Netzfehler und behaelt seine Art
119
+ // (der Binaerweg wirft ihn, wenn die fetch-Antwort keine Bytes liefert).
120
+ if (ursache instanceof KasseneckValidationError) {
121
+ throw ursache;
122
+ }
123
+ // Bis hierher kam keine verwertbare Antwort: Netz weg oder Zeitlimit.
124
+ throw new KasseneckNetworkError(fehlerName, abbruch.signal.aborted, zeitlimitMs, causeDigest(ursache, geheimnisse));
125
+ }
126
+ const inhaltstyp = antwort.headers.get('content-type') ?? undefined;
127
+ // Das Backend antwortet auf jeden fachlichen Ausgang mit HTTP 200; alles
128
+ // andere kommt nicht von ihm (Proxy, Rewrite-Luecke, Infrastruktur).
129
+ if (antwort.status !== 200) {
130
+ throw new KasseneckHttpError(fehlerName, antwort.status, inhaltstyp, 'server-error');
131
+ }
132
+ return auswerten(koerper, fehlerName, antwort.status, inhaltstyp);
133
+ }
134
+ finally {
135
+ // Ohne Abraeumen haelt der Wecker den Node-Prozess bis zum Zeitlimit wach.
136
+ clearTimeout(wecker);
137
+ }
138
+ };
139
+ }
140
+ /** JSON-Weg: der Rumpf ist Text. */
141
+ const alsText = (antwort) => antwort.text();
142
+ /**
143
+ * Binaerweg: der Rumpf sind Bytes. `text()` wird hier bewusst **nicht**
144
+ * angefasst — es wuerde die Bytes als UTF-8 deuten.
145
+ */
146
+ const alsBytes = async (antwort, functionName) => {
147
+ if (typeof antwort.arrayBuffer !== 'function') {
148
+ // Der Typ verlangt die Methode; diese Pruefung gilt dem Verbraucher ohne
149
+ // Typen, der eine eigene fetch-Umsetzung mitbringt. Lieber laut scheitern
150
+ // als still auf text() ausweichen — das waere genau der Bytefehler, den
151
+ // dieser Weg verhindern soll.
152
+ throw new KasseneckValidationError(functionName, 'Die fetch-Antwort liefert keine Bytes (arrayBuffer fehlt)', 'response');
153
+ }
154
+ return new Uint8Array(await antwort.arrayBuffer());
155
+ };
156
+ /** Auswertung des JSON-Wegs: Huelle aufloesen, Nutzlast zurueckgeben. */
157
+ function jsonAuswerten(text, functionName, statusCode, inhaltstyp) {
158
+ if (!text.trim()) {
159
+ throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body');
160
+ }
161
+ let roh;
162
+ try {
163
+ roh = JSON.parse(text);
164
+ }
165
+ catch {
166
+ // Typischer Fall: der Aufruf landete mangels Rewrite auf der HTML-Seite
167
+ // der Single-Page-App — HTTP 200, aber kein JSON.
168
+ throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json');
169
+ }
170
+ const huelle = alsHuelle(roh);
171
+ if (huelle === null) {
172
+ throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status');
173
+ }
174
+ if (huelle.status === 'success') {
175
+ return huelle.data;
176
+ }
177
+ // Alles, was nicht ausdruecklich Erfolg ist, gilt als fachlicher Fehler —
178
+ // ein unbekannter Statuswert darf nie stillschweigend als Erfolg durchgehen.
179
+ throw fachfehler(functionName, huelle.message);
180
+ }
181
+ /**
182
+ * Auswertung des Binaerwegs. Der Kern der Zusage: **ein Aufrufer bekommt nie
183
+ * ein "PDF", das in Wahrheit eine Fehlermeldung ist.** Das Backend antwortet
184
+ * auch im Fehlerfall mit HTTP 200 und schickt dann seine JSON-Huelle statt des
185
+ * PDF; wer die Bytes ungeprueft durchreicht, gibt dem Kassier eine kaputte
186
+ * Datei ohne jeden Hinweis.
187
+ *
188
+ * Entschieden wird an den **ersten Bytes**, nicht am Inhaltstyp: der Inhaltstyp
189
+ * ist die Aussage der Gegenstelle (oder eines Proxys davor) und kann fehlen
190
+ * oder falsch sein, die PDF-Kennung `%PDF` steht dagegen in jeder Datei, die
191
+ * das Backend hier erzeugt (pdf-lib). Alles, was nicht so anfaengt, ist kein
192
+ * Bericht — und wird dann daraufhin angesehen, ob es die Fehlerhuelle ist.
193
+ */
194
+ function pdfAuswerten(bytes, functionName, statusCode, inhaltstyp) {
195
+ if (bytes.length === 0) {
196
+ throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body');
197
+ }
198
+ if (istPdf(bytes)) {
199
+ return bytes;
200
+ }
201
+ // Ab hier ist nichts mehr zu retten; die Bytes werden nur noch **zur
202
+ // Fehlerdeutung** als Text gelesen, nie als Ergebnis zurueckgegeben. Die
203
+ // Gruende sind dieselben wie auf dem JSON-Weg und heissen auch so: "kein
204
+ // JSON" ist betrieblich der fehlende Rewrite (die Antwort ist die HTML-Seite
205
+ // der Single-Page-App), "kein Statusfeld" ein geaenderter Backend-Vertrag.
206
+ // Ein eigener Sammelgrund fuer den Binaerweg wuerde die beiden verschmelzen.
207
+ let roh;
208
+ try {
209
+ roh = JSON.parse(new TextDecoder('utf-8').decode(bytes));
210
+ }
211
+ catch {
212
+ throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json');
213
+ }
214
+ const huelle = alsHuelle(roh);
215
+ if (huelle === null) {
216
+ throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status');
217
+ }
218
+ if (huelle.status === 'success') {
219
+ // Erfolg gemeldet, aber kein PDF geliefert: die Antwort traegt nicht, was
220
+ // der Aufruf zusagt.
221
+ throw new KasseneckValidationError(functionName, 'Antwort ist ein Erfolgsrumpf statt eines PDF', 'response');
222
+ }
223
+ // Derselbe fachliche Fehler wie auf dem JSON-Weg — fuer den Aufrufer macht
224
+ // es keinen Unterschied, ob er ein PDF oder eine Nutzlast erwartet hat.
225
+ throw fachfehler(functionName, huelle.message);
226
+ }
227
+ /** `%PDF` am Anfang — die Kennung jeder PDF-Datei. */
228
+ function istPdf(bytes) {
229
+ return bytes.length >= 4 && bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46;
230
+ }
231
+ /** Antworthuelle `{status, message, data}` — oder `null`, wenn es keine ist. */
232
+ function alsHuelle(wert) {
233
+ if (typeof wert !== 'object' || wert === null || !('status' in wert)) {
234
+ return null;
235
+ }
236
+ return wert;
237
+ }
238
+ function fachfehler(functionName, message) {
239
+ const meldung = typeof message === 'string' && message.trim() ? message : 'Unbekannter Fehler';
240
+ return new KasseneckApiError(functionName, meldung);
241
+ }
242
+ /**
243
+ * Nutzlast aus Auth- und Aufruferparametern. Auth-Parameter bilden die
244
+ * Grundlage; ein ausdruecklich gesetzter Aufruferwert sticht (der Server prueft
245
+ * ihn ohnehin gegen die Sitzung). Ein **anwesender, aber undefinierter**
246
+ * Schluessel sticht dagegen nicht: `{ …, cashregisterId: opts.cashregisterId }`
247
+ * ist in der Endpunkt-Schicht das natuerlichste Muster der Welt, und ein reines
248
+ * Spread wuerde die Kassenbindung damit still loeschen (`JSON.stringify` wirft
249
+ * undefined danach weg). `null` bleibt erhalten — das ist eine Aussage.
250
+ */
251
+ function nutzlast(authParams, params) {
252
+ const zusammen = { ...authParams };
253
+ for (const [schluessel, wert] of Object.entries(params)) {
254
+ if (wert !== undefined) {
255
+ zusammen[schluessel] = wert;
256
+ }
257
+ }
258
+ return zusammen;
259
+ }
260
+ /**
261
+ * Prueft, was eine Anmeldung geliefert hat. Die Typen verlangen
262
+ * `{headers, params}` — `auth()` ist aber der Erweiterungspunkt fuer fremden
263
+ * Code, und zur Laufzeit kommt an, was ankommt. Ohne diese Pruefung flogen
264
+ * `undefined`, ein String oder ein Objekt ohne `headers` als roher `TypeError`
265
+ * an allen Fehlerarten dieses Pakets vorbei, waehrend ein fehlendes `params`
266
+ * still durchlief. Der gelieferte Wert selbst taucht in der Meldung **nicht**
267
+ * auf — er kann der api_key sein.
268
+ */
269
+ function gepruefteAnmeldung(wert) {
270
+ if (typeof wert !== 'object' || wert === null) {
271
+ throw new KasseneckAuthError('Anmeldung lieferte keine Zugangsdaten');
272
+ }
273
+ const { headers, params } = wert;
274
+ if (!istKopfzeilen(headers)) {
275
+ throw new KasseneckAuthError('Anmeldung lieferte keine brauchbaren Kopfzeilen');
276
+ }
277
+ if (typeof params !== 'object' || params === null || Array.isArray(params)) {
278
+ throw new KasseneckAuthError('Anmeldung lieferte keine brauchbaren Zusatzparameter');
279
+ }
280
+ return { headers, params: params };
281
+ }
282
+ function istKopfzeilen(wert) {
283
+ if (typeof wert !== 'object' || wert === null || Array.isArray(wert)) {
284
+ return false;
285
+ }
286
+ return Object.values(wert).every((eintrag) => typeof eintrag === 'string');
287
+ }
288
+ /** Lehnt ab, sobald das Zeitlimit die Anfrage abbricht. */
289
+ function abbruchAlsAblehnung(signal) {
290
+ return new Promise((_erfuellen, ablehnen) => {
291
+ if (signal.aborted) {
292
+ ablehnen(new Error('abgebrochen'));
293
+ return;
294
+ }
295
+ signal.addEventListener('abort', () => ablehnen(new Error('abgebrochen')), { once: true });
296
+ });
297
+ }
298
+ /** Das globale `fetch`; fehlt es, faellt das sofort und deutlich auf. */
299
+ function globalesFetch() {
300
+ const umgebung = globalThis;
301
+ if (typeof umgebung.fetch !== 'function') {
302
+ throw new Error('createTransport: kein globales fetch vorhanden — Node >= 20.18 verwenden oder eine fetch-Umsetzung uebergeben');
303
+ }
304
+ // Ueber das Umgebungsobjekt aufrufen: manche Browser verlangen `globalThis`
305
+ // als Empfaenger und werfen bei einem losgeloesten fetch.
306
+ return (url, init) => umgebung.fetch(url, init);
307
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Kartenanbieter — Zwilling von `CreditCardProvider` in
3
+ * kasseneck_api/lib/enums/credit_card_provider.dart.
4
+ *
5
+ * `hobexHps`, `sumup` und `myposPro` bleiben Teil des Enums: Das Backend kennt sie,
6
+ * und Belege aus der Flutter-App tragen sie weiterhin. Nur die Anbindung im
7
+ * Browser-Paket fehlt bewusst — Hobex HPS spricht lokal per TCP mit dem Terminal,
8
+ * myPOS und SumUp sind Android-SDKs. Ein Browser kann das nicht, und kein Bundler
9
+ * aendert daran etwas.
10
+ */
11
+ export declare const CreditCardProvider: {
12
+ readonly gpTomAndroid: "gpTomAndroid";
13
+ readonly gpTomIos: "gpTomIos";
14
+ readonly hobexCloudApi: "hobexCloudApi";
15
+ readonly hobexHps: "hobexHps";
16
+ readonly sumup: "sumup";
17
+ readonly myposPro: "myposPro";
18
+ readonly stripe: "stripe";
19
+ readonly custom: "custom";
20
+ };
21
+ export type CreditCardProviderKey = keyof typeof CreditCardProvider;
22
+ export type CreditCardProvider = (typeof CreditCardProvider)[CreditCardProviderKey];
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Kartenanbieter — Zwilling von `CreditCardProvider` in
3
+ * kasseneck_api/lib/enums/credit_card_provider.dart.
4
+ *
5
+ * `hobexHps`, `sumup` und `myposPro` bleiben Teil des Enums: Das Backend kennt sie,
6
+ * und Belege aus der Flutter-App tragen sie weiterhin. Nur die Anbindung im
7
+ * Browser-Paket fehlt bewusst — Hobex HPS spricht lokal per TCP mit dem Terminal,
8
+ * myPOS und SumUp sind Android-SDKs. Ein Browser kann das nicht, und kein Bundler
9
+ * aendert daran etwas.
10
+ */
11
+ export const CreditCardProvider = {
12
+ gpTomAndroid: 'gpTomAndroid',
13
+ gpTomIos: 'gpTomIos',
14
+ hobexCloudApi: 'hobexCloudApi',
15
+ hobexHps: 'hobexHps',
16
+ sumup: 'sumup',
17
+ myposPro: 'myposPro',
18
+ stripe: 'stripe',
19
+ custom: 'custom',
20
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Bindet bei Enums mit Zusatzfeldern das `value`-Feld zur Bauzeit an den eigenen
3
+ * Objekt-Schluessel — `vat20: { value: 'vat20', ... }` kompiliert, `vat20: { value:
4
+ * 'vat2O', ... }` nicht. `value` ist die Nutzlast, die an das Backend geht: ein
5
+ * Tippfehler dort erzeugt sonst erst in Produktion einen Beleg mit unbekanntem
6
+ * Steuersatz bzw. Belegtyp.
7
+ *
8
+ * `const T` erhaelt die Literal-Typen (wie `as const`), ohne dass der Aufrufer
9
+ * `as const` selbst schreiben muss.
10
+ */
11
+ export declare function defineEnum<const T extends {
12
+ [K in keyof T]: {
13
+ value: K;
14
+ } & Record<string, unknown>;
15
+ }>(eintraege: T): T;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Bindet bei Enums mit Zusatzfeldern das `value`-Feld zur Bauzeit an den eigenen
3
+ * Objekt-Schluessel — `vat20: { value: 'vat20', ... }` kompiliert, `vat20: { value:
4
+ * 'vat2O', ... }` nicht. `value` ist die Nutzlast, die an das Backend geht: ein
5
+ * Tippfehler dort erzeugt sonst erst in Produktion einen Beleg mit unbekanntem
6
+ * Steuersatz bzw. Belegtyp.
7
+ *
8
+ * `const T` erhaelt die Literal-Typen (wie `as const`), ohne dass der Aufrufer
9
+ * `as const` selbst schreiben muss.
10
+ */
11
+ export function defineEnum(eintraege) {
12
+ return eintraege;
13
+ }
@@ -0,0 +1,7 @@
1
+ export { ReceiptType, type ReceiptTypeKey } from './receipt-type.js';
2
+ export { VatRate, type VatRateKey } from './vat-rate.js';
3
+ export { KeckPaymentMethod, type KeckPaymentMethodKey } from './keck-payment-method.js';
4
+ export { CreditCardProvider, type CreditCardProviderKey } from './credit-card-provider.js';
5
+ export { VoucherType, type VoucherTypeKey } from './voucher-type.js';
6
+ export { VoucherAction, type VoucherActionKey } from './voucher-action.js';
7
+ export { StripeLinkMode, type StripeLinkModeKey } from './stripe-link-mode.js';
@@ -0,0 +1,7 @@
1
+ export { ReceiptType } from './receipt-type.js';
2
+ export { VatRate } from './vat-rate.js';
3
+ export { KeckPaymentMethod } from './keck-payment-method.js';
4
+ export { CreditCardProvider } from './credit-card-provider.js';
5
+ export { VoucherType } from './voucher-type.js';
6
+ export { VoucherAction } from './voucher-action.js';
7
+ export { StripeLinkMode } from './stripe-link-mode.js';
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Zahlungsart — Zwilling von `KeckPaymentMethod` in
3
+ * kasseneck_api/lib/enums/keck_payment_method.dart.
4
+ *
5
+ * `label` ist das deutsche Anzeige-Label fuer die Zahlungsart-Zeile auf dem Beleg.
6
+ * Muss 1:1 mit dem Backend-Mapping `paymentMethodToString` (functions/helper.js)
7
+ * uebereinstimmen.
8
+ */
9
+ export declare const KeckPaymentMethod: {
10
+ readonly cash: {
11
+ readonly value: "cash";
12
+ readonly needsCreditCard: false;
13
+ readonly label: "Barzahlung";
14
+ };
15
+ readonly creditCard: {
16
+ readonly value: "creditCard";
17
+ readonly needsCreditCard: true;
18
+ readonly label: "Kartenzahlung";
19
+ };
20
+ readonly online: {
21
+ readonly value: "online";
22
+ readonly needsCreditCard: false;
23
+ readonly label: "Onlinezahlung";
24
+ };
25
+ readonly uberApp: {
26
+ readonly value: "uberApp";
27
+ readonly needsCreditCard: false;
28
+ readonly label: "Uber App";
29
+ };
30
+ readonly uberCash: {
31
+ readonly value: "uberCash";
32
+ readonly needsCreditCard: false;
33
+ readonly label: "Uber Cash";
34
+ };
35
+ readonly uberCard: {
36
+ readonly value: "uberCard";
37
+ readonly needsCreditCard: true;
38
+ readonly label: "Uber Card";
39
+ };
40
+ readonly boltApp: {
41
+ readonly value: "boltApp";
42
+ readonly needsCreditCard: false;
43
+ readonly label: "Bolt App";
44
+ };
45
+ readonly boltCash: {
46
+ readonly value: "boltCash";
47
+ readonly needsCreditCard: false;
48
+ readonly label: "Bolt Cash";
49
+ };
50
+ readonly boltCard: {
51
+ readonly value: "boltCard";
52
+ readonly needsCreditCard: true;
53
+ readonly label: "Bolt Card";
54
+ };
55
+ };
56
+ export type KeckPaymentMethodKey = keyof typeof KeckPaymentMethod;
57
+ export type KeckPaymentMethod = (typeof KeckPaymentMethod)[KeckPaymentMethodKey];
@@ -0,0 +1,20 @@
1
+ import { defineEnum } from './define-enum.js';
2
+ /**
3
+ * Zahlungsart — Zwilling von `KeckPaymentMethod` in
4
+ * kasseneck_api/lib/enums/keck_payment_method.dart.
5
+ *
6
+ * `label` ist das deutsche Anzeige-Label fuer die Zahlungsart-Zeile auf dem Beleg.
7
+ * Muss 1:1 mit dem Backend-Mapping `paymentMethodToString` (functions/helper.js)
8
+ * uebereinstimmen.
9
+ */
10
+ export const KeckPaymentMethod = defineEnum({
11
+ cash: { value: 'cash', needsCreditCard: false, label: 'Barzahlung' },
12
+ creditCard: { value: 'creditCard', needsCreditCard: true, label: 'Kartenzahlung' },
13
+ online: { value: 'online', needsCreditCard: false, label: 'Onlinezahlung' },
14
+ uberApp: { value: 'uberApp', needsCreditCard: false, label: 'Uber App' },
15
+ uberCash: { value: 'uberCash', needsCreditCard: false, label: 'Uber Cash' },
16
+ uberCard: { value: 'uberCard', needsCreditCard: true, label: 'Uber Card' },
17
+ boltApp: { value: 'boltApp', needsCreditCard: false, label: 'Bolt App' },
18
+ boltCash: { value: 'boltCash', needsCreditCard: false, label: 'Bolt Cash' },
19
+ boltCard: { value: 'boltCard', needsCreditCard: true, label: 'Bolt Card' },
20
+ });
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Belegtyp — Zwilling von `ReceiptType` in kasseneck_api/lib/enums/receipt_type.dart.
3
+ *
4
+ * needsItems: Positionen sind fuer diesen Typ Pflicht.
5
+ * isZero: RKSV-Nullbeleg (Start-/Monats-/Jahresbeleg-Signaturkette-Marker).
6
+ * allowsVouchers: Gutscheine duerfen auf Belegen dieses Typs erscheinen.
7
+ */
8
+ export declare const ReceiptType: {
9
+ readonly start: {
10
+ readonly value: "start";
11
+ readonly needsItems: false;
12
+ readonly isZero: true;
13
+ readonly allowsVouchers: false;
14
+ };
15
+ readonly standard: {
16
+ readonly value: "standard";
17
+ readonly needsItems: true;
18
+ readonly isZero: false;
19
+ readonly allowsVouchers: true;
20
+ };
21
+ readonly zero: {
22
+ readonly value: "zero";
23
+ readonly needsItems: false;
24
+ readonly isZero: true;
25
+ readonly allowsVouchers: false;
26
+ };
27
+ readonly cancellation: {
28
+ readonly value: "cancellation";
29
+ readonly needsItems: true;
30
+ readonly isZero: false;
31
+ readonly allowsVouchers: true;
32
+ };
33
+ readonly training: {
34
+ readonly value: "training";
35
+ readonly needsItems: true;
36
+ readonly isZero: false;
37
+ readonly allowsVouchers: true;
38
+ };
39
+ };
40
+ export type ReceiptTypeKey = keyof typeof ReceiptType;
41
+ export type ReceiptType = (typeof ReceiptType)[ReceiptTypeKey];
@@ -0,0 +1,15 @@
1
+ import { defineEnum } from './define-enum.js';
2
+ /**
3
+ * Belegtyp — Zwilling von `ReceiptType` in kasseneck_api/lib/enums/receipt_type.dart.
4
+ *
5
+ * needsItems: Positionen sind fuer diesen Typ Pflicht.
6
+ * isZero: RKSV-Nullbeleg (Start-/Monats-/Jahresbeleg-Signaturkette-Marker).
7
+ * allowsVouchers: Gutscheine duerfen auf Belegen dieses Typs erscheinen.
8
+ */
9
+ export const ReceiptType = defineEnum({
10
+ start: { value: 'start', needsItems: false, isZero: true, allowsVouchers: false },
11
+ standard: { value: 'standard', needsItems: true, isZero: false, allowsVouchers: true },
12
+ zero: { value: 'zero', needsItems: false, isZero: true, allowsVouchers: false },
13
+ cancellation: { value: 'cancellation', needsItems: true, isZero: false, allowsVouchers: true },
14
+ training: { value: 'training', needsItems: true, isZero: false, allowsVouchers: true },
15
+ });