@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,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hobexPay = hobexPay;
4
+ exports.hobexRefund = hobexRefund;
5
+ exports.newHobexTransactionId = newHobexTransactionId;
6
+ const index_js_1 = require("../models/index.js");
7
+ const errors_js_1 = require("../client/errors.js");
8
+ const vienna_time_js_1 = require("../vienna-time.js");
9
+ const money_js_1 = require("../money.js");
10
+ /**
11
+ * Hobex-Kartenzahlung ueber die **Cloud-API** — Zwilling der Hobex-Aufrufe in
12
+ * kasseneck_api/lib/kasseneck_api.dart (Zeilen 491-526).
13
+ *
14
+ * Der Ablauf hat zwei Schritte: eine Kennung erzeugen ([newHobexTransactionId])
15
+ * und damit belasten ([hobexPay]). Die Kennung ist der Faden, an dem das
16
+ * Backend eine haengende Zahlung wiederfindet (`getHobexStatusWithTimeout`,
17
+ * functions/payment-endpoints.js) — sie ist deshalb kein Schmuck, sondern die
18
+ * Absicherung gegen eine doppelte Belastung.
19
+ *
20
+ * **Nur der Cloud-Weg ist hier drin, und das bleibt so.** Hobex **HPS** ist ein
21
+ * physisches Terminal, mit dem die Kasse **lokal ueber TCP** spricht; **myPOS**
22
+ * und **SumUp** sind **Android-SDKs**. Ein Browser hat weder rohe TCP-Sockets
23
+ * noch eine Android-Laufzeit — das ist keine fehlende Umsetzung und kein
24
+ * Buendler-Problem, sondern eine Grenze der Umgebung. Wer diese drei Wege
25
+ * braucht, braucht die Flutter-App, nicht dieses Paket.
26
+ *
27
+ * **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** Keiner der
28
+ * beiden Endpunkte dieser Datei setzt `allowRegisterUser`; beide laufen nur
29
+ * mit `apiKeyAuth`. Ausgefuehrt steht das in payments/index.ts — an einer
30
+ * Stelle statt an dreien.
31
+ */
32
+ /** Endpunktnamen aus dem Vorbild — beide mit Suffix `Api`. */
33
+ const ENDPUNKT_PAY = 'hobexPayApi';
34
+ const ENDPUNKT_REFUND = 'hobexRefundApi';
35
+ /**
36
+ * Belastet eine Karte ueber die **Hobex-Cloud-API** und liefert den
37
+ * entstandenen [HobexReceipt].
38
+ *
39
+ * **Der Endpunkt heisst `hobexPayApi`** — mit Suffix; ohne ihn gibt es ihn
40
+ * nicht.
41
+ */
42
+ async function hobexPay(rufen, options) {
43
+ const params = zahlungsNutzlast(ENDPUNKT_PAY, options);
44
+ // `reference` steht im Vorbild **unbedingt** in der Nutzlast: ohne Angabe
45
+ // geht sie als null raus, nicht gar nicht. Der Transport wirft nur
46
+ // `undefined` weg, `null` bleibt erhalten — genau diese Unterscheidung.
47
+ params['reference'] = options.reference ?? null;
48
+ return belegAusNutzlast(await rufen(ENDPUNKT_PAY, params));
49
+ }
50
+ /**
51
+ * Erstattet eine zuvor ueber die Hobex-Cloud getaetigte Zahlung. Das Backend
52
+ * storniert zuerst (Void, solange der Tagesabschluss aussteht) und erstattet
53
+ * erst danach.
54
+ *
55
+ * **Ohne Rueckgabewert, mit Absicht.** Das Vorbild liefert
56
+ * `resJson['status'] == 'success'`; in diesem Paket wirft die Fehlerhuelle
57
+ * schon im Transport, sobald der Status nicht ausdruecklich Erfolg ist. Ein
58
+ * Wahrheitswert waere hier also immer `true` — eine Luege ueber den
59
+ * Informationsgehalt, an der ein Aufrufer ein `if` aufhaengt, das nie greift.
60
+ * Misserfolg kommt als geworfener Fehler.
61
+ *
62
+ * **Der Endpunkt heisst `hobexRefundApi`** — mit Suffix.
63
+ */
64
+ async function hobexRefund(rufen, options) {
65
+ // Anders als die Zahlung sendet der Refund im Vorbild **keine** reference.
66
+ await rufen(ENDPUNKT_REFUND, zahlungsNutzlast(ENDPUNKT_REFUND, options));
67
+ }
68
+ /**
69
+ * Erzeugt eine neue Hobex-Transaktionskennung: 19 Ziffern aus Zeitanteil und
70
+ * Zufall (Zwilling von `newHobexTransactionId` im Vorbild, Zeile 522).
71
+ *
72
+ * Zwei bewusste Abweichungen:
73
+ *
74
+ * 1. **Wiener Wanduhrzeit statt Geraetezeit.** Das Vorbild nimmt
75
+ * `DateTime.now()` in der Zeitzone des Geraets; damit haetten zwei Kassen
76
+ * desselben Betriebs in verschiedenen Zeitzonen Kennungen, die sich um
77
+ * Stunden unterscheiden, und der Tageswechsel in der Kennung faende nicht
78
+ * zum Geschaeftstag statt. Fachlich ist Wien die Zeitzone (siehe
79
+ * vienna-time.ts) — und eine Browser-Kasse laeuft in der Zeitzone des Gasts,
80
+ * nicht des Betriebs.
81
+ * 2. **Millisekunden statt Mikrosekunden.** JavaScript hat keine
82
+ * Mikrosekunden-Uhr. Das Vorbild fuellt mit sechs Bruchteilsstellen auf und
83
+ * haengt zwei Zufallsziffern an, von denen die Laengenbegrenzung eine wieder
84
+ * abschneidet; hier stehen drei Bruchteilsstellen und vier Zufallsziffern.
85
+ * Laenge und Form (nur Ziffern, 19 Stellen, `JJMMTThhmmss` voran) bleiben
86
+ * gleich.
87
+ *
88
+ * Zeit- und Zufallsquelle sind einspeisbar, damit die Kennung pruefbar ist.
89
+ */
90
+ function newHobexTransactionId(options = {}) {
91
+ const wand = (0, vienna_time_js_1.toViennaWallClock)(options.now ?? new Date());
92
+ const zufall = options.random ?? Math.random;
93
+ const zeitanteil = zweistellig(wand.year % 100) +
94
+ zweistellig(wand.month) +
95
+ zweistellig(wand.day) +
96
+ zweistellig(wand.hour) +
97
+ zweistellig(wand.minute) +
98
+ zweistellig(wand.second) +
99
+ String(wand.millisecond).padStart(3, '0');
100
+ // Vier Ziffern, immer vierstellig: eine kuerzere Zahl wuerde die Kennung
101
+ // verkuerzen und damit ihre Form verlassen. Der Wert wird auf [0, 1)
102
+ // begrenzt — eine fremde Zufallsquelle koennte 1 liefern.
103
+ const zufallsanteil = String(Math.floor(begrenzt(zufall()) * 10_000)).padStart(4, '0');
104
+ return zeitanteil + zufallsanteil;
105
+ }
106
+ /**
107
+ * Gemeinsame Nutzlast beider Hobex-Aufrufe: Kennung und die beiden Betraege in
108
+ * Euro. Prueft, bevor irgendetwas rausgeht — hier bewegt sich Geld auf einer
109
+ * fremden Karte, und ein NaN-Betrag oder eine leere Kennung ist an einem
110
+ * Zahlungsterminal nichts, was man dem Backend zum Ausprobieren schickt.
111
+ */
112
+ function zahlungsNutzlast(functionName, options) {
113
+ if (typeof options.transactionId !== 'string' || !options.transactionId.trim()) {
114
+ throw eingabefehler(functionName, 'transactionId fehlt');
115
+ }
116
+ const amountCents = gepruefterBetrag(functionName, options.amountCents, 'amountCents', 1);
117
+ const tipCents = gepruefterBetrag(functionName, options.tipCents ?? 0, 'tipCents', 0);
118
+ return {
119
+ transactionId: options.transactionId,
120
+ // Euro-Umrechnung genau hier, an der Hobex-Grenze.
121
+ amount: (0, money_js_1.centsToEuro)(amountCents),
122
+ tip: (0, money_js_1.centsToEuro)(tipCents),
123
+ };
124
+ }
125
+ /**
126
+ * Ganzzahliger Cent-Betrag ab [mindestens]. `Number.isInteger` faengt NaN,
127
+ * Unendlich und Bruchteils-Cent in einem — ein halber Cent ergibt bei der
128
+ * Euro-Umrechnung eine dritte Nachkommastelle, die Hobex nicht kennt.
129
+ */
130
+ function gepruefterBetrag(functionName, cents, feld, mindestens) {
131
+ if (!Number.isInteger(cents)) {
132
+ throw eingabefehler(functionName, `${feld} muss eine ganze Zahl in Cent sein.`);
133
+ }
134
+ if (cents < mindestens) {
135
+ throw eingabefehler(functionName, `${feld} muss mindestens ${mindestens} Cent betragen.`);
136
+ }
137
+ return cents;
138
+ }
139
+ /**
140
+ * Hobex-Beleg aus der Antwort lesen. Geprueft werden die beiden Felder, ohne
141
+ * die der Beleg nichts wert ist: die Kennung der Zahlung und der Zeitstempel
142
+ * (an ihm scheitert die Lesart des Modells sonst mit einem nackten TypeError,
143
+ * weil sie ihn zerlegt). Die uebrigen Felder bleiben so tolerant wie im
144
+ * Vorbild — ein Beleg, dem Hobex den Kartenaussteller schuldig bleibt, ist
145
+ * trotzdem eine erfolgte Zahlung.
146
+ */
147
+ function belegAusNutzlast(daten) {
148
+ const roh = daten;
149
+ if (roh == null ||
150
+ typeof roh !== 'object' ||
151
+ typeof roh.transactionId !== 'string' ||
152
+ typeof roh.transactionDate !== 'string') {
153
+ throw antwortfehler(ENDPUNKT_PAY, 'Antwort enthaelt keinen Hobex-Beleg');
154
+ }
155
+ return (0, index_js_1.fromHobexReceiptPayload)(roh);
156
+ }
157
+ const zweistellig = (wert) => String(wert).padStart(2, '0');
158
+ /** Auf `[0, 1)` begrenzen — eine fremde Zufallsquelle haelt sich nicht daran. */
159
+ const begrenzt = (wert) => (Number.isFinite(wert) ? Math.min(Math.max(wert, 0), 0.999_999_9) : 0);
160
+ /** Fehler in der Eingabe des Aufrufers — es geht keine Anfrage raus. */
161
+ function eingabefehler(functionName, grund) {
162
+ return new errors_js_1.KasseneckValidationError(functionName, grund, 'request');
163
+ }
164
+ /** Die Antwort meldete Erfolg, trug aber nicht, was der Aufruf zusagt. */
165
+ function antwortfehler(functionName, grund) {
166
+ return new errors_js_1.KasseneckValidationError(functionName, grund, 'response');
167
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Unterpfad `@kreiseck/kasseneck-api/payments` — die Zahlungswege, die ein
3
+ * Browser oder ein Node-Prozess wirklich gehen kann: **Stripe-Zahlungslinks**
4
+ * (Fernzahlung per Link/QR-Code) und die **Hobex-Cloud-API** (Kartenzahlung
5
+ * ueber ein bei Hobex registriertes Terminal, gesteuert ueber das Netz).
6
+ *
7
+ * **Was hier bewusst fehlt — und warum es auch nicht nachgeruestet wird:**
8
+ *
9
+ * - **Hobex HPS** spricht **lokal ueber TCP** mit einem angeschlossenen
10
+ * Terminal (roher Socket auf eine Geraete-IP im selben Netz).
11
+ * - **myPOS** und **SumUp** sind **Android-SDKs**; sie laufen als
12
+ * Bibliothek in einer Android-App und reden ueber Bluetooth bzw. das
13
+ * Hersteller-Geraet mit dem Terminal.
14
+ *
15
+ * Ein Browser hat weder rohe TCP-Sockets noch eine Android-Laufzeit. Das ist
16
+ * keine Luecke in diesem Paket und auch nichts, was ein anderer Buendler,
17
+ * ein Polyfill oder eine WebAssembly-Schicht aufloest — es ist eine Grenze der
18
+ * Umgebung. Diese drei Wege gibt es im Flutter-Paket `kasseneck_api`, und dort
19
+ * bleiben sie.
20
+ *
21
+ * **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** **Keiner** der
22
+ * vier Zahlungs-Endpunkte setzt `allowRegisterUser`; sie laufen alle ueber
23
+ * `checkRequest(req, 'user', …)` und damit nur mit `apiKeyAuth`. Dieses Paket
24
+ * bildet das **nicht** nach — wer darf, entscheidet allein das Backend. Der
25
+ * Hinweis steht **hier** und gilt fuer beide Dateien dieses Unterpfads.
26
+ *
27
+ * Welche **anderen** Endpunkte den Weg offen haben, steht bewusst nirgends in
28
+ * diesem Paket: eine abgeschriebene Liste veraltet still, und sie hat hier
29
+ * nichts zu entscheiden.
30
+ */
31
+ export { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
32
+ export { type CreateStripeLinkOptions, type StripeCaptureResult, createStripeLink, stripeCaptureIntent, } from './stripe.js';
33
+ export { type HobexPayOptions, type HobexRefundOptions, type HobexTransactionIdOptions, hobexPay, hobexRefund, newHobexTransactionId, } from './hobex.js';
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Unterpfad `@kreiseck/kasseneck-api/payments` — die Zahlungswege, die ein
4
+ * Browser oder ein Node-Prozess wirklich gehen kann: **Stripe-Zahlungslinks**
5
+ * (Fernzahlung per Link/QR-Code) und die **Hobex-Cloud-API** (Kartenzahlung
6
+ * ueber ein bei Hobex registriertes Terminal, gesteuert ueber das Netz).
7
+ *
8
+ * **Was hier bewusst fehlt — und warum es auch nicht nachgeruestet wird:**
9
+ *
10
+ * - **Hobex HPS** spricht **lokal ueber TCP** mit einem angeschlossenen
11
+ * Terminal (roher Socket auf eine Geraete-IP im selben Netz).
12
+ * - **myPOS** und **SumUp** sind **Android-SDKs**; sie laufen als
13
+ * Bibliothek in einer Android-App und reden ueber Bluetooth bzw. das
14
+ * Hersteller-Geraet mit dem Terminal.
15
+ *
16
+ * Ein Browser hat weder rohe TCP-Sockets noch eine Android-Laufzeit. Das ist
17
+ * keine Luecke in diesem Paket und auch nichts, was ein anderer Buendler,
18
+ * ein Polyfill oder eine WebAssembly-Schicht aufloest — es ist eine Grenze der
19
+ * Umgebung. Diese drei Wege gibt es im Flutter-Paket `kasseneck_api`, und dort
20
+ * bleiben sie.
21
+ *
22
+ * **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** **Keiner** der
23
+ * vier Zahlungs-Endpunkte setzt `allowRegisterUser`; sie laufen alle ueber
24
+ * `checkRequest(req, 'user', …)` und damit nur mit `apiKeyAuth`. Dieses Paket
25
+ * bildet das **nicht** nach — wer darf, entscheidet allein das Backend. Der
26
+ * Hinweis steht **hier** und gilt fuer beide Dateien dieses Unterpfads.
27
+ *
28
+ * Welche **anderen** Endpunkte den Weg offen haben, steht bewusst nirgends in
29
+ * diesem Paket: eine abgeschriebene Liste veraltet still, und sie hat hier
30
+ * nichts zu entscheiden.
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.newHobexTransactionId = exports.hobexRefund = exports.hobexPay = exports.stripeCaptureIntent = exports.createStripeLink = exports.StripeLinkMode = void 0;
34
+ var index_js_1 = require("../enums/index.js");
35
+ Object.defineProperty(exports, "StripeLinkMode", { enumerable: true, get: function () { return index_js_1.StripeLinkMode; } });
36
+ var stripe_js_1 = require("./stripe.js");
37
+ Object.defineProperty(exports, "createStripeLink", { enumerable: true, get: function () { return stripe_js_1.createStripeLink; } });
38
+ Object.defineProperty(exports, "stripeCaptureIntent", { enumerable: true, get: function () { return stripe_js_1.stripeCaptureIntent; } });
39
+ var hobex_js_1 = require("./hobex.js");
40
+ Object.defineProperty(exports, "hobexPay", { enumerable: true, get: function () { return hobex_js_1.hobexPay; } });
41
+ Object.defineProperty(exports, "hobexRefund", { enumerable: true, get: function () { return hobex_js_1.hobexRefund; } });
42
+ Object.defineProperty(exports, "newHobexTransactionId", { enumerable: true, get: function () { return hobex_js_1.newHobexTransactionId; } });
@@ -0,0 +1,61 @@
1
+ import { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
2
+ import { type ReceiptItem, type StripeUrlSession } from '../models/index.js';
3
+ import type { KasseneckTransport } from '../client/transport.js';
4
+ export interface CreateStripeLinkOptions {
5
+ /** Positionen des Zahlungslinks; mindestens eine, alle gueltig. */
6
+ items: ReceiptItem[];
7
+ /** Soll das Backend nach bezahltem Link selbsttaetig einen Beleg erzeugen? */
8
+ createReceiptAfterPayment: boolean;
9
+ /** Sofort einziehen (`payment`) oder nur reservieren (`authorization`). */
10
+ mode: StripeLinkMode | StripeLinkModeKey;
11
+ /** Eigener Bezeichner fuer den Zahlungs-Webhook des Aufrufers. */
12
+ webhookId?: string;
13
+ /** Telefonnummer des Gasts (landet in den Stripe-Metadaten). */
14
+ customerPhone?: string;
15
+ /** E-Mail des Gasts (Stripe schickt die Zahlungsbestaetigung dorthin). */
16
+ customerEmail?: string;
17
+ }
18
+ /**
19
+ * Ergebnis von [stripeCaptureIntent] — das eingezogene Zahlungsversprechen
20
+ * (Stripe PaymentIntent), **nicht** noch einmal die Zahlungslink-Sitzung.
21
+ *
22
+ * Das ist eine bewusste Abweichung vom Dart-Vorbild: dort steht
23
+ * `StripeUrlSession.fromJson(resJson['data'])`, das Backend antwortet an dieser
24
+ * Stelle aber mit `{id, status, amount_received, currency}` (successResponse in
25
+ * functions/payment-endpoints.js). Weder `url` noch `shorten_payment_url` noch
26
+ * `expires_at` sind darin — die Sitzungs-Lesart kann hier gar nicht gelingen.
27
+ */
28
+ export interface StripeCaptureResult {
29
+ /** Bezeichner des PaymentIntent (`pi_…`), nicht der der Sitzung (`cs_…`). */
30
+ id: string;
31
+ /** Stripe-Status des Einzugs, z. B. `succeeded`. */
32
+ status: string;
33
+ /**
34
+ * Tatsaechlich eingezogener Betrag in Cent. Stripe fuehrt Betraege in der
35
+ * kleinsten Waehrungseinheit; der Name unterstellt damit eine
36
+ * zweistellige Waehrung. Fuer diese Anlage stimmt das — das Backend legt
37
+ * `currency: 'eur'` fest (functions/payment-endpoints.js). Bei einer
38
+ * nullstelligen Waehrung (JPY) waere „Cent" der falsche Name; dann gehoert
39
+ * die Einheit aus `currency` abgeleitet und nicht in den Feldnamen.
40
+ */
41
+ amountReceivedCents: number;
42
+ /** Waehrungscode, wie Stripe ihn fuehrt (klein geschrieben, z. B. `eur`). */
43
+ currency: string;
44
+ }
45
+ /**
46
+ * Erzeugt einen Stripe-Zahlungslink fuer [items] (Fernzahlung: Link per
47
+ * Nachricht, QR-Code oder Kurzlink).
48
+ *
49
+ * **Der Endpunkt heisst `createPaymentLinkStripe`**, nicht wie diese Funktion —
50
+ * Methodenname und Endpunktname fallen wie schon beim Monatsbericht
51
+ * auseinander (siehe client/reports.ts).
52
+ */
53
+ export declare function createStripeLink(rufen: KasseneckTransport, options: CreateStripeLinkOptions): Promise<StripeUrlSession>;
54
+ /**
55
+ * Zieht die zuvor nur reservierte Zahlung einer `authorization`-Sitzung ein.
56
+ *
57
+ * **Der Parameter heisst `stripe_sessions_id`** — mit "sessions" im Plural, so
58
+ * das Vorbild und so das Backend. Der naheliegende Singular waere ein fehlender
59
+ * Pflichtparameter.
60
+ */
61
+ export declare function stripeCaptureIntent(rufen: KasseneckTransport, stripeSessionId: string): Promise<StripeCaptureResult>;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStripeLink = createStripeLink;
4
+ exports.stripeCaptureIntent = stripeCaptureIntent;
5
+ const index_js_1 = require("../enums/index.js");
6
+ const index_js_2 = require("../models/index.js");
7
+ const errors_js_1 = require("../client/errors.js");
8
+ /**
9
+ * Stripe-Zahlungslinks — Zwilling der Stripe-Aufrufe in
10
+ * kasseneck_api/lib/kasseneck_api.dart (Zeilen 443-484).
11
+ *
12
+ * Zwei Aufrufe: [createStripeLink] erzeugt eine Checkout-Sitzung samt Kurzlink
13
+ * (`pay.kasseneck.at/…`), den der Gast oeffnet; [stripeCaptureIntent] zieht die
14
+ * zuvor nur reservierte Zahlung eines `authorization`-Links spaeter ein.
15
+ *
16
+ * **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** Keiner der
17
+ * beiden Endpunkte dieser Datei setzt `allowRegisterUser`; beide laufen nur
18
+ * mit `apiKeyAuth`. Ausgefuehrt steht das in payments/index.ts — an einer
19
+ * Stelle statt an dreien.
20
+ */
21
+ /** Endpunktname aus dem Vorbild — **nicht** `createStripeLink`. */
22
+ const ENDPUNKT_LINK = 'createPaymentLinkStripe';
23
+ const ENDPUNKT_CAPTURE = 'stripeCaptureIntent';
24
+ /**
25
+ * Erzeugt einen Stripe-Zahlungslink fuer [items] (Fernzahlung: Link per
26
+ * Nachricht, QR-Code oder Kurzlink).
27
+ *
28
+ * **Der Endpunkt heisst `createPaymentLinkStripe`**, nicht wie diese Funktion —
29
+ * Methodenname und Endpunktname fallen wie schon beim Monatsbericht
30
+ * auseinander (siehe client/reports.ts).
31
+ */
32
+ async function createStripeLink(rufen, options) {
33
+ const { items } = options;
34
+ // Vor dem Senden pruefen: ein Zahlungslink ist zwar folgenlos wiederholbar,
35
+ // eine abgewiesene Anfrage aber eine unnoetige Runde ueber das Netz — und der
36
+ // Backend-Fehlertext nennt den Grund weit weniger genau als diese Pruefung.
37
+ if (!Array.isArray(items) || items.length === 0) {
38
+ throw eingabefehler(ENDPUNKT_LINK, 'Positionen sind Pflicht und duerfen nicht leer sein.');
39
+ }
40
+ if (items.some((item) => !(0, index_js_2.receiptItemIsValid)(item))) {
41
+ throw eingabefehler(ENDPUNKT_LINK, 'Ungueltige Position uebergeben.');
42
+ }
43
+ const params = {
44
+ items: positionsNutzlast(items),
45
+ createReceiptAfterPayment: options.createReceiptAfterPayment,
46
+ // Im Vorbild `mode.name`; Schluessel und Wert sind hier identisch.
47
+ mode: gepruefterModus(options.mode),
48
+ };
49
+ // Die drei uebrigen Felder stehen im Vorbild unter `if (… != null)` — ohne
50
+ // Angabe geht kein leeres Feld raus.
51
+ if (options.webhookId != null) {
52
+ params['webhookId'] = options.webhookId;
53
+ }
54
+ // **Abweichung vom Vorbild, mit Absicht:** Dart sendet `customerPhone`/
55
+ // `customerEmail` in camelCase. Das Backend nimmt die beiden Felder aber
56
+ // ausschliesslich als `customer_phone`/`customer_email` entgegen (so stehen
57
+ // sie in den optionalParams von `createPaymentLinkStripe`, und nur so werden
58
+ // sie ausgewertet), und unbekannte Parameter weist `checkRequest` nicht ab —
59
+ // sie fallen still unter den Tisch. Wer die camelCase-Namen uebernaehme,
60
+ // gaebe dem Aufrufer zwei Felder, die nachweislich nichts bewirken.
61
+ if (options.customerPhone != null) {
62
+ params['customer_phone'] = options.customerPhone;
63
+ }
64
+ if (options.customerEmail != null) {
65
+ params['customer_email'] = options.customerEmail;
66
+ }
67
+ return sitzungAusNutzlast(await rufen(ENDPUNKT_LINK, params));
68
+ }
69
+ /**
70
+ * Zieht die zuvor nur reservierte Zahlung einer `authorization`-Sitzung ein.
71
+ *
72
+ * **Der Parameter heisst `stripe_sessions_id`** — mit "sessions" im Plural, so
73
+ * das Vorbild und so das Backend. Der naheliegende Singular waere ein fehlender
74
+ * Pflichtparameter.
75
+ */
76
+ async function stripeCaptureIntent(rufen, stripeSessionId) {
77
+ if (typeof stripeSessionId !== 'string' || !stripeSessionId.trim()) {
78
+ throw eingabefehler(ENDPUNKT_CAPTURE, 'stripeSessionId fehlt');
79
+ }
80
+ const daten = await rufen(ENDPUNKT_CAPTURE, { stripe_sessions_id: stripeSessionId });
81
+ return einzugAusNutzlast(daten);
82
+ }
83
+ /**
84
+ * Positionen in ihre Nutzlast wandeln und dabei die strenge Schreibpfad-
85
+ * Pruefung des Modells abfangen (unbekannter Steuersatz). Das Modell wirft dort
86
+ * ein nacktes `Error`; aus einem Endpunkt-Aufruf soll nur die Fehler-Union
87
+ * dieses Pakets herauskommen (dasselbe Vorgehen wie in client/receipts.ts).
88
+ */
89
+ function positionsNutzlast(items) {
90
+ try {
91
+ return items.map(index_js_2.toReceiptItemPayload);
92
+ }
93
+ catch (ursache) {
94
+ throw eingabefehler(ENDPUNKT_LINK, ursache instanceof Error ? ursache.message : 'Ungueltige Nutzlast uebergeben.');
95
+ }
96
+ }
97
+ /**
98
+ * Modus aufloesen. Bleibt streng: der Modus kommt vom Aufrufer, und das Backend
99
+ * kennt genau zwei Werte — ein dritter waere ein Programmierfehler, der sonst
100
+ * still als `payment` durchginge (das Backend setzt `capture_method: 'manual'`
101
+ * nur bei genau 'authorization').
102
+ */
103
+ function gepruefterModus(wert) {
104
+ if (!Object.prototype.hasOwnProperty.call(index_js_1.StripeLinkMode, wert)) {
105
+ throw eingabefehler(ENDPUNKT_LINK, `Stripe-Link-Modus: unbekannter Wert "${String(wert)}"`);
106
+ }
107
+ return index_js_1.StripeLinkMode[wert];
108
+ }
109
+ /**
110
+ * Zahlungslink-Sitzung aus der Antwort lesen. Alle vier Felder muessen da sein:
111
+ * eine Sitzung ohne `url` ist kein Zahlungslink, und ein unlesbares Ablaufdatum
112
+ * wuerde als `Invalid Date` weiterwandern und erst beim Anzeigen auffallen.
113
+ */
114
+ function sitzungAusNutzlast(daten) {
115
+ const roh = daten;
116
+ if (roh == null ||
117
+ typeof roh !== 'object' ||
118
+ typeof roh.id !== 'string' ||
119
+ typeof roh.url !== 'string' ||
120
+ typeof roh.shorten_payment_url !== 'string' ||
121
+ typeof roh.expires_at !== 'string') {
122
+ throw antwortfehler(ENDPUNKT_LINK, 'Antwort enthaelt keine Zahlungslink-Sitzung');
123
+ }
124
+ const sitzung = (0, index_js_2.fromStripeUrlSessionPayload)(roh);
125
+ if (Number.isNaN(sitzung.expiresAt.getTime())) {
126
+ throw antwortfehler(ENDPUNKT_LINK, 'Antwort enthaelt kein lesbares Ablaufdatum');
127
+ }
128
+ return sitzung;
129
+ }
130
+ /** Ergebnis des Einzugs aus der Antwort lesen (Felder siehe [StripeCaptureResult]). */
131
+ function einzugAusNutzlast(daten) {
132
+ const roh = daten;
133
+ if (roh == null ||
134
+ typeof roh !== 'object' ||
135
+ typeof roh.id !== 'string' ||
136
+ typeof roh.status !== 'string' ||
137
+ typeof roh.amount_received !== 'number' ||
138
+ typeof roh.currency !== 'string') {
139
+ throw antwortfehler(ENDPUNKT_CAPTURE, 'Antwort enthaelt kein eingezogenes Zahlungsversprechen');
140
+ }
141
+ return {
142
+ id: roh.id,
143
+ status: roh.status,
144
+ // Stripe fuehrt Betraege in der kleinsten Waehrungseinheit — hier bereits
145
+ // Cent, es wird also nichts umgerechnet (anders als bei Hobex).
146
+ amountReceivedCents: roh.amount_received,
147
+ currency: roh.currency,
148
+ };
149
+ }
150
+ /** Fehler in der Eingabe des Aufrufers — es geht keine Anfrage raus. */
151
+ function eingabefehler(functionName, grund) {
152
+ return new errors_js_1.KasseneckValidationError(functionName, grund, 'request');
153
+ }
154
+ /** Die Antwort meldete Erfolg, trug aber nicht, was der Aufruf zusagt. */
155
+ function antwortfehler(functionName, grund) {
156
+ return new errors_js_1.KasseneckValidationError(functionName, grund, 'response');
157
+ }