@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,108 @@
1
+ import { ReceiptType, KeckPaymentMethod, CreditCardProvider } from '../enums/index.js';
2
+ import { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead } from './receipt-item.js';
3
+ import { type Voucher, type VoucherPayload } from './voucher.js';
4
+ import type { Cancellation, CancellationOf, CancellationReason } from './cancellation.js';
5
+ import { type ZeroKind } from './receipt-summary.js';
6
+ /**
7
+ * Beleg — Zwilling der Beleg-Nutzlast von `KasseneckReceipt` in
8
+ * kasseneck_api/lib/models/kasseneck_receipt.dart (nur der signatur-/
9
+ * positionsrelevante Teil, den `toReceiptJson()`/die `receipt`-Map von
10
+ * `fromJson()` traegt — nicht die Firmen-/Druckdaten wie Firma, Adresse oder
11
+ * Fusszeilen: die betreffen ausschliesslich das Beleg-Rendering und gehoeren
12
+ * nicht zum RKSV-Kernbeleg. Sie stehen als eigenes Modell daneben, siehe
13
+ * `ReceiptCompany` in ./receipt-company.ts).
14
+ *
15
+ * `timeStamp` bleibt bewusst der rohe Zeitstempel-String aus der Nutzlast;
16
+ * `parseServerTimeStamp` (`../vienna-time.js`) deutet ihn auf Wunsch in einen
17
+ * echten Zeitpunkt um (uneinheitliches Server-Format, siehe dort).
18
+ *
19
+ * `paymentMethod`/`receiptType`/`creditCardProvider` sind beim Lesen entweder
20
+ * der bekannte Enum-Eintrag oder — bei einem der Nutzlast unbekannten
21
+ * Schluessel — der rohe String (siehe `enum-payload.ts`, `readEnumKey`).
22
+ */
23
+ export interface Receipt {
24
+ receiptId: string;
25
+ cashregisterId: string;
26
+ timeStamp: string;
27
+ items: ReceiptItem[];
28
+ vouchers: Voucher[];
29
+ paymentMethod: KeckPaymentMethod | string;
30
+ turnoverCounterAES256ICM: string;
31
+ signaturePreviousReceipt: string;
32
+ certificateSerialNumber: string;
33
+ receiptType: ReceiptType | string;
34
+ sig: string;
35
+ qr: string;
36
+ fullReceiptId: string;
37
+ creditCardProvider?: CreditCardProvider | string;
38
+ cardPaymentId?: string;
39
+ cardPaymentData?: Record<string, unknown>;
40
+ customerDetails: string[];
41
+ legalMessage: string[];
42
+ signatureSuccess?: boolean;
43
+ customProjectId?: string;
44
+ /** Nur am Storno-Beleg: das stornierte Original. */
45
+ cancellationOf?: CancellationOf;
46
+ /** Nur am Storno-Beleg: Grund-Code aus [CANCELLATION_REASONS]. */
47
+ cancellationReason?: CancellationReason | string;
48
+ /** Nur am Original: alle (Teil-)Stornos, Quelle der Restmengen. */
49
+ cancellations?: Cancellation[];
50
+ /** Nur an Nullbelegen: Anlass (monthly, annual, annual_replacement, outage_end, final, manual). */
51
+ zeroKind?: ZeroKind;
52
+ }
53
+ export interface ReceiptPayload {
54
+ qr: string;
55
+ sig: string;
56
+ certificateSerialNumber: string;
57
+ signaturePreviousReceipt: string;
58
+ turnoverCounterAES256ICM: string;
59
+ paymentMethod: string;
60
+ items: ReceiptItemPayload[];
61
+ vouchers: VoucherPayload[] | null;
62
+ timeStamp: string;
63
+ cashregisterId: string;
64
+ receiptType: string;
65
+ receiptId: string;
66
+ fullReceiptId: string;
67
+ creditCardProvider: string | null;
68
+ cardPaymentId: string | null;
69
+ cardPaymentData: Record<string, unknown> | null;
70
+ customerDetails: string;
71
+ legalMessage: string;
72
+ signatureSuccess: boolean | null;
73
+ customProjectId: string | null;
74
+ }
75
+ /**
76
+ * Nutzlast-Form, die dieses Paket **liest**. Unterscheidet sich von
77
+ * [ReceiptPayload] bei den Positionen: ein gespeicherter Beleg traegt sie in
78
+ * der v1-Form, die das Backend ablegt (siehe [ReceiptItemPayloadRead]).
79
+ * Nullbelege haben ueberhaupt keine Positionen.
80
+ */
81
+ export interface ReceiptPayloadRead extends Omit<ReceiptPayload, 'items' | 'vouchers'> {
82
+ items?: ReceiptItemPayloadRead[] | null;
83
+ vouchers?: VoucherPayload[] | null;
84
+ cancellationOf?: CancellationOf | null;
85
+ cancellationReason?: string | null;
86
+ zeroKind?: string | null;
87
+ cancellations?: Cancellation[] | null;
88
+ }
89
+ /**
90
+ * Schreibt die Nutzlast in der **neuen** Form — sie **normalisiert, statt zu
91
+ * spiegeln**: ein Beleg, der in der v1-Positionsform gelesen wurde, geht hier
92
+ * in der v2-Form wieder hinaus (wie im Flutter-Vorbild, dessen `toJson` v2
93
+ * schreibt und dessen `fromJson` beide Formen liest). Nutzlast rein -> Beleg
94
+ * -> Nutzlast raus ist deshalb kein Rundtrip, wenn die Eingabe v1 war.
95
+ *
96
+ * Fuer dieses Paket ohne Folgen: Belege gehen ausschliesslich ueber
97
+ * `createReceipt` an den Server, das seine Nutzlast selbst baut.
98
+ */
99
+ export declare function toReceiptPayload(receipt: Receipt): ReceiptPayload;
100
+ export declare function fromReceiptPayload(payload: ReceiptPayloadRead): Receipt;
101
+ /**
102
+ * Zwischensumme in **Cent** — Positionen plus verkaufte Wertgutscheine minus
103
+ * eingeloeste Promotionsgutscheine. Wertgutschein-Einloesungen wirken erst auf
104
+ * [receiptSumCents], nicht hier (siehe Dart-Vorbild `subSumCents`/`sumCents`).
105
+ */
106
+ export declare function receiptSubSumCents(receipt: Receipt): number;
107
+ /** Gesamtsumme in **Cent** — Zwischensumme minus eingeloeste Wertgutscheine. */
108
+ export declare function receiptSumCents(receipt: Receipt): number;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toReceiptPayload = toReceiptPayload;
4
+ exports.fromReceiptPayload = fromReceiptPayload;
5
+ exports.receiptSubSumCents = receiptSubSumCents;
6
+ exports.receiptSumCents = receiptSumCents;
7
+ const index_js_1 = require("../enums/index.js");
8
+ const enum_payload_js_1 = require("./enum-payload.js");
9
+ const receipt_item_js_1 = require("./receipt-item.js");
10
+ const voucher_js_1 = require("./voucher.js");
11
+ const receipt_summary_js_1 = require("./receipt-summary.js");
12
+ /**
13
+ * Schreibt die Nutzlast in der **neuen** Form — sie **normalisiert, statt zu
14
+ * spiegeln**: ein Beleg, der in der v1-Positionsform gelesen wurde, geht hier
15
+ * in der v2-Form wieder hinaus (wie im Flutter-Vorbild, dessen `toJson` v2
16
+ * schreibt und dessen `fromJson` beide Formen liest). Nutzlast rein -> Beleg
17
+ * -> Nutzlast raus ist deshalb kein Rundtrip, wenn die Eingabe v1 war.
18
+ *
19
+ * Fuer dieses Paket ohne Folgen: Belege gehen ausschliesslich ueber
20
+ * `createReceipt` an den Server, das seine Nutzlast selbst baut.
21
+ */
22
+ function toReceiptPayload(receipt) {
23
+ // Schreibpfad bleibt streng: ReceiptType/KeckPaymentMethod sind bekannt am
24
+ // Objekt-Charakter erkennbar (defineEnum-Eintraege); ein roher String muss
25
+ // erst durch den Lookup, sonst wirft er.
26
+ const paymentMethod = typeof receipt.paymentMethod === 'object' ? receipt.paymentMethod : (0, enum_payload_js_1.requireEnumKey)(index_js_1.KeckPaymentMethod, receipt.paymentMethod, 'Zahlungsart');
27
+ const receiptType = typeof receipt.receiptType === 'object' ? receipt.receiptType : (0, enum_payload_js_1.requireEnumKey)(index_js_1.ReceiptType, receipt.receiptType, 'Belegtyp');
28
+ return {
29
+ qr: receipt.qr,
30
+ sig: receipt.sig,
31
+ certificateSerialNumber: receipt.certificateSerialNumber,
32
+ signaturePreviousReceipt: receipt.signaturePreviousReceipt,
33
+ turnoverCounterAES256ICM: receipt.turnoverCounterAES256ICM,
34
+ paymentMethod: paymentMethod.value,
35
+ items: receipt.items.map(receipt_item_js_1.toReceiptItemPayload),
36
+ vouchers: receipt.vouchers.map(voucher_js_1.toVoucherPayload),
37
+ timeStamp: receipt.timeStamp,
38
+ cashregisterId: receipt.cashregisterId,
39
+ receiptType: receiptType.value,
40
+ receiptId: receipt.receiptId,
41
+ fullReceiptId: receipt.fullReceiptId,
42
+ // CreditCardProvider ist ein flacher String-Enum (kein Objekt-Charakter) —
43
+ // der Lookup entscheidet hier ausnahmslos, bekannt oder nicht.
44
+ creditCardProvider: receipt.creditCardProvider != null ? (0, enum_payload_js_1.requireEnumKey)(index_js_1.CreditCardProvider, receipt.creditCardProvider, 'Kartenanbieter') : null,
45
+ cardPaymentId: receipt.cardPaymentId ?? null,
46
+ cardPaymentData: receipt.cardPaymentData ?? null,
47
+ customerDetails: receipt.customerDetails.join('\n'),
48
+ legalMessage: receipt.legalMessage.join('\n'),
49
+ signatureSuccess: receipt.signatureSuccess ?? null,
50
+ customProjectId: receipt.customProjectId ?? null,
51
+ };
52
+ }
53
+ // Nullbelege haben keine Positionen -> items kann fehlen/null sein (siehe Dart-Vorbild).
54
+ const leereZeile = (text) => (text ? text.split('\n') : []);
55
+ function fromReceiptPayload(payload) {
56
+ return {
57
+ receiptId: payload.receiptId,
58
+ cashregisterId: payload.cashregisterId,
59
+ timeStamp: payload.timeStamp,
60
+ items: (payload.items ?? []).map(receipt_item_js_1.fromReceiptItemPayload),
61
+ vouchers: (payload.vouchers ?? []).map(voucher_js_1.fromVoucherPayload),
62
+ paymentMethod: (0, enum_payload_js_1.readEnumKey)(index_js_1.KeckPaymentMethod, payload.paymentMethod),
63
+ turnoverCounterAES256ICM: payload.turnoverCounterAES256ICM,
64
+ signaturePreviousReceipt: payload.signaturePreviousReceipt,
65
+ certificateSerialNumber: payload.certificateSerialNumber,
66
+ receiptType: (0, enum_payload_js_1.readEnumKey)(index_js_1.ReceiptType, payload.receiptType),
67
+ sig: payload.sig,
68
+ qr: payload.qr,
69
+ fullReceiptId: payload.fullReceiptId ?? '',
70
+ creditCardProvider: payload.creditCardProvider != null ? (0, enum_payload_js_1.readEnumKey)(index_js_1.CreditCardProvider, payload.creditCardProvider) : undefined,
71
+ cardPaymentId: payload.cardPaymentId ?? undefined,
72
+ cardPaymentData: payload.cardPaymentData ?? undefined,
73
+ customerDetails: leereZeile(payload.customerDetails),
74
+ legalMessage: leereZeile(payload.legalMessage),
75
+ signatureSuccess: payload.signatureSuccess ?? undefined,
76
+ customProjectId: payload.customProjectId ?? undefined,
77
+ ...(payload.cancellationOf ? { cancellationOf: { receiptId: payload.cancellationOf.receiptId, fullReceiptId: payload.cancellationOf.fullReceiptId ?? null } } : {}),
78
+ ...(payload.cancellationReason ? { cancellationReason: payload.cancellationReason } : {}),
79
+ ...((0, receipt_summary_js_1.istZeroKind)(payload.zeroKind) ? { zeroKind: payload.zeroKind } : {}),
80
+ ...(payload.cancellations ? { cancellations: payload.cancellations.map(leseStorno) } : {}),
81
+ };
82
+ }
83
+ function leseStorno(eintrag) {
84
+ return {
85
+ ...(eintrag.receiptId !== undefined ? { receiptId: eintrag.receiptId } : {}),
86
+ ...(eintrag.pending === true ? { pending: true } : {}),
87
+ at: Number(eintrag.at ?? 0),
88
+ by: eintrag.by ?? null,
89
+ note: eintrag.note ?? null,
90
+ items: (eintrag.items ?? []).map((p) => ({ index: Number(p.index), quantity: Number(p.quantity) })),
91
+ };
92
+ }
93
+ /**
94
+ * Zwischensumme in **Cent** — Positionen plus verkaufte Wertgutscheine minus
95
+ * eingeloeste Promotionsgutscheine. Wertgutschein-Einloesungen wirken erst auf
96
+ * [receiptSumCents], nicht hier (siehe Dart-Vorbild `subSumCents`/`sumCents`).
97
+ */
98
+ function receiptSubSumCents(receipt) {
99
+ let cents = receipt.items.reduce((acc, item) => acc + (0, receipt_item_js_1.receiptItemTotalCents)(item), 0);
100
+ for (const voucher of receipt.vouchers) {
101
+ if (voucher.action === index_js_1.VoucherAction.redeem && voucher.type === index_js_1.VoucherType.promo) {
102
+ cents -= voucher.valueCents ?? 0;
103
+ }
104
+ if (voucher.action === index_js_1.VoucherAction.sell && voucher.type === index_js_1.VoucherType.value) {
105
+ cents += voucher.valueCents ?? 0;
106
+ }
107
+ }
108
+ return cents;
109
+ }
110
+ /** Gesamtsumme in **Cent** — Zwischensumme minus eingeloeste Wertgutscheine. */
111
+ function receiptSumCents(receipt) {
112
+ let cents = receiptSubSumCents(receipt);
113
+ for (const voucher of receipt.vouchers) {
114
+ if (voucher.action === index_js_1.VoucherAction.redeem && voucher.type === index_js_1.VoucherType.value) {
115
+ cents -= voucher.valueCents ?? 0;
116
+ }
117
+ }
118
+ return cents;
119
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Berichtsmonat — Zwilling von `ReportMonth` in
3
+ * kasseneck_api/lib/models/report_month.dart.
4
+ *
5
+ * Hat im Dart-Vorbild bewusst **keine** JSON-Nutzlast (kein `fromJson`/
6
+ * `toJson`) — es ist ein reiner Kalender-Werttyp fuer Monats-Arithmetik und
7
+ * Anzeige, kein Beleg-/Backend-Feld. `month` ist die Monatszahl 1-12
8
+ * (entspricht `KeckMonth.id` im Flutter-Paket) statt eines eigenen Enums —
9
+ * ein eigenes `KeckMonth`-Enum wuerde hier nur fuer diesen einen Werttyp
10
+ * Maschinerie aufbauen, die niemand sonst braucht.
11
+ */
12
+ export interface ReportMonth {
13
+ month: number;
14
+ year: number;
15
+ }
16
+ /**
17
+ * Berichtsmonat eines Zeitpunkts — eingeordnet nach **Wiener** Zeit, nicht
18
+ * nach der Zeitzone des ausfuehrenden Rechners.
19
+ *
20
+ * Der Geschaeftsmonat ist ein oesterreichischer Kalenderwert: ein Beleg vom
21
+ * 1. Maerz 00:30 Wiener Zeit gehoert in den Maerz, auch wenn derselbe
22
+ * Zeitpunkt in UTC noch im Februar liegt. Die eingebauten
23
+ * `getMonth()`/`getFullYear()` wuerden ihn auf einer UTC-Maschine in den
24
+ * Februar legen und den Monatsbericht auf den falschen Monat schicken.
25
+ */
26
+ export declare function reportMonthFromDate(date: Date): ReportMonth;
27
+ export declare function previousReportMonth(rm: ReportMonth): ReportMonth;
28
+ export declare function nextReportMonth(rm: ReportMonth): ReportMonth;
29
+ /** Schluessel-Format wie `ReportMonth.toString()` im Flutter-Paket, z. B. `"march_2026"`. */
30
+ export declare function reportMonthKey(rm: ReportMonth): string;
31
+ /** Deutsches Anzeige-Format wie `ReportMonth.readable` im Flutter-Paket, z. B. `"März 2026"`. */
32
+ export declare function reportMonthReadable(rm: ReportMonth): string;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportMonthFromDate = reportMonthFromDate;
4
+ exports.previousReportMonth = previousReportMonth;
5
+ exports.nextReportMonth = nextReportMonth;
6
+ exports.reportMonthKey = reportMonthKey;
7
+ exports.reportMonthReadable = reportMonthReadable;
8
+ const vienna_time_js_1 = require("../vienna-time.js");
9
+ // Reihenfolge wie `KeckMonth.values` im Flutter-Paket (Index 0 = Januar).
10
+ const MONTH_KEYS = [
11
+ 'january',
12
+ 'february',
13
+ 'march',
14
+ 'april',
15
+ 'may',
16
+ 'june',
17
+ 'july',
18
+ 'august',
19
+ 'september',
20
+ 'october',
21
+ 'november',
22
+ 'december',
23
+ ];
24
+ const MONTH_NAMES_DE = [
25
+ 'Januar',
26
+ 'Februar',
27
+ 'März',
28
+ 'April',
29
+ 'Mai',
30
+ 'Juni',
31
+ 'Juli',
32
+ 'August',
33
+ 'September',
34
+ 'Oktober',
35
+ 'November',
36
+ 'Dezember',
37
+ ];
38
+ /**
39
+ * Berichtsmonat eines Zeitpunkts — eingeordnet nach **Wiener** Zeit, nicht
40
+ * nach der Zeitzone des ausfuehrenden Rechners.
41
+ *
42
+ * Der Geschaeftsmonat ist ein oesterreichischer Kalenderwert: ein Beleg vom
43
+ * 1. Maerz 00:30 Wiener Zeit gehoert in den Maerz, auch wenn derselbe
44
+ * Zeitpunkt in UTC noch im Februar liegt. Die eingebauten
45
+ * `getMonth()`/`getFullYear()` wuerden ihn auf einer UTC-Maschine in den
46
+ * Februar legen und den Monatsbericht auf den falschen Monat schicken.
47
+ */
48
+ function reportMonthFromDate(date) {
49
+ const wanduhr = (0, vienna_time_js_1.toViennaWallClock)(date);
50
+ return { month: wanduhr.month, year: wanduhr.year };
51
+ }
52
+ function previousReportMonth(rm) {
53
+ return rm.month === 1 ? { month: 12, year: rm.year - 1 } : { month: rm.month - 1, year: rm.year };
54
+ }
55
+ function nextReportMonth(rm) {
56
+ return rm.month === 12 ? { month: 1, year: rm.year + 1 } : { month: rm.month + 1, year: rm.year };
57
+ }
58
+ /** Schluessel-Format wie `ReportMonth.toString()` im Flutter-Paket, z. B. `"march_2026"`. */
59
+ function reportMonthKey(rm) {
60
+ return `${MONTH_KEYS[rm.month - 1]}_${rm.year}`;
61
+ }
62
+ /** Deutsches Anzeige-Format wie `ReportMonth.readable` im Flutter-Paket, z. B. `"März 2026"`. */
63
+ function reportMonthReadable(rm) {
64
+ return `${MONTH_NAMES_DE[rm.month - 1]} ${rm.year}`;
65
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Stripe-Zahlungslink-Sitzung — Zwilling von `StripeUrlSession` in
3
+ * kasseneck_api/lib/models/stripe_url_seesion.dart.
4
+ */
5
+ export interface StripeUrlSession {
6
+ id: string;
7
+ url: string;
8
+ shortenUrl: string;
9
+ expiresAt: Date;
10
+ }
11
+ export interface StripeUrlSessionPayload {
12
+ id: string;
13
+ url: string;
14
+ shorten_payment_url: string;
15
+ expires_at: string;
16
+ }
17
+ export declare function toStripeUrlSessionPayload(session: StripeUrlSession): StripeUrlSessionPayload;
18
+ export declare function fromStripeUrlSessionPayload(payload: StripeUrlSessionPayload): StripeUrlSession;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toStripeUrlSessionPayload = toStripeUrlSessionPayload;
4
+ exports.fromStripeUrlSessionPayload = fromStripeUrlSessionPayload;
5
+ function toStripeUrlSessionPayload(session) {
6
+ return {
7
+ id: session.id,
8
+ url: session.url,
9
+ shorten_payment_url: session.shortenUrl,
10
+ expires_at: session.expiresAt.toISOString(),
11
+ };
12
+ }
13
+ function fromStripeUrlSessionPayload(payload) {
14
+ return {
15
+ id: payload.id,
16
+ url: payload.url,
17
+ shortenUrl: payload.shorten_payment_url,
18
+ expiresAt: new Date(payload.expires_at),
19
+ };
20
+ }
@@ -0,0 +1,41 @@
1
+ import { VoucherAction, VoucherType } from '../enums/index.js';
2
+ /**
3
+ * Gutschein — Zwilling von `KeckVoucher` in
4
+ * kasseneck_api/lib/models/keck_voucher.dart.
5
+ *
6
+ * `valueCents` ist der Gutscheinwert in **Cent** (exakte Integer-Arithmetik).
7
+ *
8
+ * `action`/`type` sind schon im Dart-Vorbild reine Strings (keine
9
+ * Zusatzfelder) — beim Lesen bleibt ein unbekannter Wert deshalb ebenfalls
10
+ * einfach der rohe Nutzlast-String (siehe [readEnumKey]); ob er zu den
11
+ * bekannten Werten gehoert, entscheidet sich erst beim Schreiben.
12
+ */
13
+ export interface Voucher {
14
+ name?: string;
15
+ code?: string;
16
+ action: VoucherAction | string;
17
+ type: VoucherType | string;
18
+ valueCents?: number;
19
+ }
20
+ /**
21
+ * Nutzlast: traegt **beide** Felder, `value` (Euro) und `valueCents` (Cent).
22
+ * Das Backend erwartet das Euro-Feld weiterhin (Altkompatibilitaet) — die
23
+ * Umwandlung passiert nur hier, an dieser einen Stelle.
24
+ */
25
+ export interface VoucherPayload {
26
+ name: string | null;
27
+ code: string | null;
28
+ action: string;
29
+ type: string;
30
+ value: number | null;
31
+ valueCents: number | null;
32
+ }
33
+ export declare function toVoucherPayload(voucher: Voucher): VoucherPayload;
34
+ /**
35
+ * Ist der Gutschein an das Backend sendbar? Zwilling von `KeckVoucher.isValid`
36
+ * im Flutter-Vorbild: Wert- und Promotionsgutscheine brauchen einen Wert,
37
+ * Promotionsgutscheine duerfen nur eingeloest (nicht verkauft) werden, und ein
38
+ * gesetzter Wert muss positiv sein.
39
+ */
40
+ export declare function voucherIsValid(voucher: Voucher): boolean;
41
+ export declare function fromVoucherPayload(payload: VoucherPayload): Voucher;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toVoucherPayload = toVoucherPayload;
4
+ exports.voucherIsValid = voucherIsValid;
5
+ exports.fromVoucherPayload = fromVoucherPayload;
6
+ const index_js_1 = require("../enums/index.js");
7
+ const enum_payload_js_1 = require("./enum-payload.js");
8
+ function toVoucherPayload(voucher) {
9
+ return {
10
+ name: voucher.name ?? null,
11
+ code: voucher.code ?? null,
12
+ // Schreibpfad bleibt streng: action/type sehen fuer bekannte und
13
+ // unbekannte Werte gleich aus (reine Strings) — erst der Lookup hier
14
+ // entscheidet, ob geschrieben werden darf.
15
+ action: (0, enum_payload_js_1.requireEnumKey)(index_js_1.VoucherAction, voucher.action, 'Gutschein-Aktion'),
16
+ type: (0, enum_payload_js_1.requireEnumKey)(index_js_1.VoucherType, voucher.type, 'Gutscheinart'),
17
+ // Euro-Feld nur fuer Altbestand-Konsumenten des Backends — siehe Kommentar oben.
18
+ value: voucher.valueCents == null ? null : voucher.valueCents / 100,
19
+ valueCents: voucher.valueCents ?? null,
20
+ };
21
+ }
22
+ /**
23
+ * Ist der Gutschein an das Backend sendbar? Zwilling von `KeckVoucher.isValid`
24
+ * im Flutter-Vorbild: Wert- und Promotionsgutscheine brauchen einen Wert,
25
+ * Promotionsgutscheine duerfen nur eingeloest (nicht verkauft) werden, und ein
26
+ * gesetzter Wert muss positiv sein.
27
+ */
28
+ function voucherIsValid(voucher) {
29
+ if (voucher.type === index_js_1.VoucherType.value && voucher.valueCents == null) {
30
+ return false;
31
+ }
32
+ if (voucher.type === index_js_1.VoucherType.promo && voucher.action !== index_js_1.VoucherAction.redeem) {
33
+ return false;
34
+ }
35
+ if (voucher.type === index_js_1.VoucherType.promo && voucher.valueCents == null) {
36
+ return false;
37
+ }
38
+ if (voucher.valueCents != null && voucher.valueCents <= 0) {
39
+ return false;
40
+ }
41
+ return true;
42
+ }
43
+ function fromVoucherPayload(payload) {
44
+ const valueCents = payload.valueCents != null
45
+ ? payload.valueCents
46
+ : payload.value != null
47
+ ? Math.round(payload.value * 100)
48
+ : undefined;
49
+ return {
50
+ name: payload.name ?? undefined,
51
+ code: payload.code ?? undefined,
52
+ action: (0, enum_payload_js_1.readEnumKey)(index_js_1.VoucherAction, payload.action),
53
+ type: (0, enum_payload_js_1.readEnumKey)(index_js_1.VoucherType, payload.type),
54
+ valueCents,
55
+ };
56
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Die Grenze zwischen Euro und Cent — an genau einer Stelle.
3
+ *
4
+ * Dieses Paket rechnet ausnahmslos in ganzen Cent (siehe README). Euro treten
5
+ * nur dort auf, wo eine fremde Schnittstelle sie verlangt oder liefert: die
6
+ * Belegliste des Backends sendet `total`/`umsatz` in Euro, das Hobex-Terminal
7
+ * nimmt `amount`/`tip` in Euro entgegen. Beide Richtungen stehen hier, damit
8
+ * die Umrechnung nicht in jeder Datei erneut auftaucht — und damit die
9
+ * Rundungsregel nur einmal entschieden ist.
10
+ */
11
+ /** Cent -> Euro, fuer die Schnittstellen, die Euro verlangen. */
12
+ export declare function centsToEuro(cents: number): number;
13
+ /**
14
+ * Euro -> ganze Cent, fuer Betraege, die aus einer fremden Antwort kommen.
15
+ *
16
+ * Unbrauchbare Werte (fehlend, `null`, keine Zahl, NaN, Unendlich) ergeben 0:
17
+ * eine Belegliste darf nicht daran scheitern, dass ein einzelner Betrag fehlt.
18
+ *
19
+ * Gerundet wird **von der Null weg**, nicht mit `Math.round` — das schoebe
20
+ * `.5` immer Richtung +unendlich, und dann heben sich ein Beleg und sein
21
+ * Storno im Cent nicht mehr auf (dieselbe Regel wie in receipt/layout.ts).
22
+ */
23
+ export declare function euroToCents(euro: unknown): number;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Die Grenze zwischen Euro und Cent — an genau einer Stelle.
4
+ *
5
+ * Dieses Paket rechnet ausnahmslos in ganzen Cent (siehe README). Euro treten
6
+ * nur dort auf, wo eine fremde Schnittstelle sie verlangt oder liefert: die
7
+ * Belegliste des Backends sendet `total`/`umsatz` in Euro, das Hobex-Terminal
8
+ * nimmt `amount`/`tip` in Euro entgegen. Beide Richtungen stehen hier, damit
9
+ * die Umrechnung nicht in jeder Datei erneut auftaucht — und damit die
10
+ * Rundungsregel nur einmal entschieden ist.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.centsToEuro = centsToEuro;
14
+ exports.euroToCents = euroToCents;
15
+ /** Cent -> Euro, fuer die Schnittstellen, die Euro verlangen. */
16
+ function centsToEuro(cents) {
17
+ return cents / 100;
18
+ }
19
+ /**
20
+ * Euro -> ganze Cent, fuer Betraege, die aus einer fremden Antwort kommen.
21
+ *
22
+ * Unbrauchbare Werte (fehlend, `null`, keine Zahl, NaN, Unendlich) ergeben 0:
23
+ * eine Belegliste darf nicht daran scheitern, dass ein einzelner Betrag fehlt.
24
+ *
25
+ * Gerundet wird **von der Null weg**, nicht mit `Math.round` — das schoebe
26
+ * `.5` immer Richtung +unendlich, und dann heben sich ein Beleg und sein
27
+ * Storno im Cent nicht mehr auf (dieselbe Regel wie in receipt/layout.ts).
28
+ */
29
+ function euroToCents(euro) {
30
+ if (typeof euro !== 'number' || !Number.isFinite(euro)) {
31
+ return 0;
32
+ }
33
+ const cents = Math.round(Math.abs(euro) * 100);
34
+ return euro < 0 ? -cents : cents;
35
+ }
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,87 @@
1
+ import { type HobexReceipt } from '../models/index.js';
2
+ import type { KasseneckTransport } from '../client/transport.js';
3
+ /**
4
+ * Cent -> Euro. **Die einzige Umrechnungsstelle dieses Moduls.** Betraege
5
+ * werden im ganzen Paket in Cent gefuehrt (exakte Ganzzahl-Arithmetik); die
6
+ * Hobex-Schnittstelle erwartet dagegen Euro als Gleitkommazahl (`amount`,
7
+ * `tip`), und das Backend reicht sie unveraendert an Hobex weiter. Das
8
+ * Gegenstueck fuer die Antwortrichtung steht in models/hobex-receipt.ts.
9
+ *
10
+ * **Geerbte Ungenauigkeit, hier nicht behebbar:** das Backend addiert die
11
+ * beiden Euro-Werte serverseitig (`check.params.amount + check.params.tip`,
12
+ * functions/payment-endpoints.js) — aus 10,10 EUR und 0,20 EUR wird dort
13
+ * `10.299999999999999`. Jede Rundung auf dieser Seite wuerde daran nichts
14
+ * aendern, weil die Addition erst danach passiert; die saubere Loesung waere
15
+ * ein Cent-Feld am Backend.
16
+ */
17
+ export interface HobexPayOptions {
18
+ /** Kennung der Zahlung — siehe [newHobexTransactionId]. */
19
+ transactionId: string;
20
+ /** Zu belastender Betrag in **Cent** (ohne Trinkgeld). */
21
+ amountCents: number;
22
+ /** Trinkgeld in **Cent**; Hobex belastet Betrag + Trinkgeld in einem. */
23
+ tipCents?: number;
24
+ /** Freier Verwendungszweck, den Hobex mitfuehrt (z. B. Tischnummer). */
25
+ reference?: string;
26
+ }
27
+ export interface HobexRefundOptions {
28
+ /** Kennung der zu erstattenden Zahlung. */
29
+ transactionId: string;
30
+ /** Zu erstattender Betrag in **Cent** (ohne Trinkgeld). */
31
+ amountCents: number;
32
+ /** Zu erstattendes Trinkgeld in **Cent**. */
33
+ tipCents?: number;
34
+ }
35
+ /** Zeit- und Zufallsquelle von [newHobexTransactionId] — fuer Tests einspeisbar. */
36
+ export interface HobexTransactionIdOptions {
37
+ /** Zeitpunkt der Kennung; ohne Angabe jetzt. */
38
+ now?: Date;
39
+ /** Zufallsquelle in `[0, 1)` wie `Math.random`; ohne Angabe `Math.random`. */
40
+ random?: () => number;
41
+ }
42
+ /**
43
+ * Belastet eine Karte ueber die **Hobex-Cloud-API** und liefert den
44
+ * entstandenen [HobexReceipt].
45
+ *
46
+ * **Der Endpunkt heisst `hobexPayApi`** — mit Suffix; ohne ihn gibt es ihn
47
+ * nicht.
48
+ */
49
+ export declare function hobexPay(rufen: KasseneckTransport, options: HobexPayOptions): Promise<HobexReceipt>;
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
+ export declare function hobexRefund(rufen: KasseneckTransport, options: HobexRefundOptions): Promise<void>;
65
+ /**
66
+ * Erzeugt eine neue Hobex-Transaktionskennung: 19 Ziffern aus Zeitanteil und
67
+ * Zufall (Zwilling von `newHobexTransactionId` im Vorbild, Zeile 522).
68
+ *
69
+ * Zwei bewusste Abweichungen:
70
+ *
71
+ * 1. **Wiener Wanduhrzeit statt Geraetezeit.** Das Vorbild nimmt
72
+ * `DateTime.now()` in der Zeitzone des Geraets; damit haetten zwei Kassen
73
+ * desselben Betriebs in verschiedenen Zeitzonen Kennungen, die sich um
74
+ * Stunden unterscheiden, und der Tageswechsel in der Kennung faende nicht
75
+ * zum Geschaeftstag statt. Fachlich ist Wien die Zeitzone (siehe
76
+ * vienna-time.ts) — und eine Browser-Kasse laeuft in der Zeitzone des Gasts,
77
+ * nicht des Betriebs.
78
+ * 2. **Millisekunden statt Mikrosekunden.** JavaScript hat keine
79
+ * Mikrosekunden-Uhr. Das Vorbild fuellt mit sechs Bruchteilsstellen auf und
80
+ * haengt zwei Zufallsziffern an, von denen die Laengenbegrenzung eine wieder
81
+ * abschneidet; hier stehen drei Bruchteilsstellen und vier Zufallsziffern.
82
+ * Laenge und Form (nur Ziffern, 19 Stellen, `JJMMTThhmmss` voran) bleiben
83
+ * gleich.
84
+ *
85
+ * Zeit- und Zufallsquelle sind einspeisbar, damit die Kennung pruefbar ist.
86
+ */
87
+ export declare function newHobexTransactionId(options?: HobexTransactionIdOptions): string;