@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,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toHobexReceiptPayload = toHobexReceiptPayload;
4
+ exports.fromHobexReceiptPayload = fromHobexReceiptPayload;
5
+ exports.hobexReceiptToCardPaymentData = hobexReceiptToCardPaymentData;
6
+ exports.hobexReceiptNeedsSignature = hobexReceiptNeedsSignature;
7
+ const index_js_1 = require("../enums/index.js");
8
+ const money_js_1 = require("../money.js");
9
+ function toHobexReceiptPayload(beleg) {
10
+ return {
11
+ transactionId: beleg.transactionId,
12
+ tid: beleg.tid,
13
+ receipt: beleg.receipt,
14
+ approvalCode: beleg.approvalCode,
15
+ reference: beleg.reference ?? null,
16
+ transactionDate: beleg.transactionDate,
17
+ cardNumber: beleg.cardNumber,
18
+ cardExpiry: beleg.cardExpiry,
19
+ brand: beleg.brand,
20
+ cardIssuer: beleg.cardIssuer,
21
+ responseCode: beleg.responseCode,
22
+ transactionType: beleg.transactionType,
23
+ currency: beleg.currency,
24
+ // Euro-Umwandlung nur hier, an der Terminal-API-Grenze — siehe Kommentar oben.
25
+ amount: (0, money_js_1.centsToEuro)(beleg.amountCents),
26
+ tip: (0, money_js_1.centsToEuro)(beleg.tipCents),
27
+ cvm: beleg.cvm,
28
+ };
29
+ }
30
+ function fromHobexReceiptPayload(payload) {
31
+ return {
32
+ transactionId: payload.transactionId,
33
+ tid: payload.tid,
34
+ receipt: payload.receipt,
35
+ approvalCode: payload.approvalCode,
36
+ reference: payload.reference ?? undefined,
37
+ // Kappt Bruchteilssekunden/Offset und ersetzt "T" durch ein Leerzeichen,
38
+ // exakt wie im Dart-Vorbild (transactionDate.split('.')[0].replaceAll('T', ' ')).
39
+ transactionDate: payload.transactionDate.split('.')[0].split('T').join(' '),
40
+ cardNumber: payload.cardNumber,
41
+ cardExpiry: payload.cardExpiry,
42
+ brand: payload.brand,
43
+ cardIssuer: payload.cardIssuer,
44
+ responseCode: payload.responseCode,
45
+ transactionType: payload.transactionType,
46
+ currency: payload.currency,
47
+ amountCents: Math.round((payload.amount ?? 0) * 100),
48
+ tipCents: Math.round((payload.tip ?? 0) * 100),
49
+ cvm: String(payload.cvm),
50
+ // Die Cloud-API-Nutzlast traegt keinen eigenen Provider-Schluessel — der
51
+ // Provider ergibt sich aus dem Transportweg (Cloud vs. HPS), nicht aus
52
+ // dem JSON. Das Dart-Vorbild setzt ihn in `fromJson` deshalb ebenfalls
53
+ // nicht, sondern belaesst den Konstruktor-Default.
54
+ creditCardProvider: index_js_1.CreditCardProvider.hobexCloudApi,
55
+ };
56
+ }
57
+ /**
58
+ * Wandelt den Beleg in die `cardPaymentData`-Map, die auf dem Kasseneck-Beleg
59
+ * landet (siehe [Receipt.cardPaymentData]). Bei HPS-Zahlungen kommen weitere
60
+ * Felder dazu, die nur das lokale Terminal liefert.
61
+ */
62
+ function hobexReceiptToCardPaymentData(beleg) {
63
+ const data = {
64
+ transactionId: beleg.transactionId,
65
+ date: beleg.transactionDate,
66
+ tid: beleg.tid,
67
+ no: beleg.receipt,
68
+ type: beleg.transactionType,
69
+ cardBrand: beleg.brand,
70
+ cardNumber: beleg.cardNumber,
71
+ responseCode: beleg.responseCode,
72
+ cvm: beleg.cvm,
73
+ };
74
+ if (beleg.creditCardProvider === index_js_1.CreditCardProvider.hobexHps) {
75
+ data.approvalCode = beleg.approvalCode;
76
+ data.cardExpiry = beleg.cardExpiry;
77
+ data.cardIssuer = beleg.cardIssuer;
78
+ data.amount = (0, money_js_1.centsToEuro)(beleg.amountCents).toFixed(2);
79
+ data.currency = beleg.currency;
80
+ }
81
+ return data;
82
+ }
83
+ /** Kartenzahlung erfordert eine Unterschrift (CVM-Code `"1"`). */
84
+ function hobexReceiptNeedsSignature(beleg) {
85
+ return beleg.cvm === '1';
86
+ }
@@ -0,0 +1,10 @@
1
+ export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, } from './receipt-item.js';
2
+ export { type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid } from './voucher.js';
3
+ export { type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, } from './receipt.js';
4
+ export { type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, } from './cancellation.js';
5
+ export { type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, } from './receipt-company.js';
6
+ export { type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, } from './cashregister.js';
7
+ export { type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, istZeroKind } from './receipt-summary.js';
8
+ export { type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, } from './report-month.js';
9
+ export { type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, } from './stripe-url-session.js';
10
+ export { type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './hobex-receipt.js';
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hobexReceiptNeedsSignature = exports.hobexReceiptToCardPaymentData = exports.fromHobexReceiptPayload = exports.toHobexReceiptPayload = exports.fromStripeUrlSessionPayload = exports.toStripeUrlSessionPayload = exports.reportMonthReadable = exports.reportMonthKey = exports.nextReportMonth = exports.previousReportMonth = exports.reportMonthFromDate = exports.istZeroKind = exports.ZERO_KINDS = exports.fromReceiptSummaryPayload = exports.fromCashregisterPayload = exports.receiptCompanyTaxInfo = exports.fromReceiptCompanyPayload = exports.remainingQuantities = exports.isCancellationReason = exports.CANCELLATION_RESERVATION_MS = exports.CANCELLATION_REASONS = exports.receiptSumCents = exports.receiptSubSumCents = exports.fromReceiptPayload = exports.toReceiptPayload = exports.voucherIsValid = exports.fromVoucherPayload = exports.toVoucherPayload = exports.negateReceiptItem = exports.receiptItemIsValid = exports.receiptItemTotalCents = exports.fromReceiptItemPayload = exports.toReceiptItemPayload = void 0;
4
+ var receipt_item_js_1 = require("./receipt-item.js");
5
+ Object.defineProperty(exports, "toReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.toReceiptItemPayload; } });
6
+ Object.defineProperty(exports, "fromReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.fromReceiptItemPayload; } });
7
+ Object.defineProperty(exports, "receiptItemTotalCents", { enumerable: true, get: function () { return receipt_item_js_1.receiptItemTotalCents; } });
8
+ Object.defineProperty(exports, "receiptItemIsValid", { enumerable: true, get: function () { return receipt_item_js_1.receiptItemIsValid; } });
9
+ Object.defineProperty(exports, "negateReceiptItem", { enumerable: true, get: function () { return receipt_item_js_1.negateReceiptItem; } });
10
+ var voucher_js_1 = require("./voucher.js");
11
+ Object.defineProperty(exports, "toVoucherPayload", { enumerable: true, get: function () { return voucher_js_1.toVoucherPayload; } });
12
+ Object.defineProperty(exports, "fromVoucherPayload", { enumerable: true, get: function () { return voucher_js_1.fromVoucherPayload; } });
13
+ Object.defineProperty(exports, "voucherIsValid", { enumerable: true, get: function () { return voucher_js_1.voucherIsValid; } });
14
+ var receipt_js_1 = require("./receipt.js");
15
+ Object.defineProperty(exports, "toReceiptPayload", { enumerable: true, get: function () { return receipt_js_1.toReceiptPayload; } });
16
+ Object.defineProperty(exports, "fromReceiptPayload", { enumerable: true, get: function () { return receipt_js_1.fromReceiptPayload; } });
17
+ Object.defineProperty(exports, "receiptSubSumCents", { enumerable: true, get: function () { return receipt_js_1.receiptSubSumCents; } });
18
+ Object.defineProperty(exports, "receiptSumCents", { enumerable: true, get: function () { return receipt_js_1.receiptSumCents; } });
19
+ var cancellation_js_1 = require("./cancellation.js");
20
+ Object.defineProperty(exports, "CANCELLATION_REASONS", { enumerable: true, get: function () { return cancellation_js_1.CANCELLATION_REASONS; } });
21
+ Object.defineProperty(exports, "CANCELLATION_RESERVATION_MS", { enumerable: true, get: function () { return cancellation_js_1.CANCELLATION_RESERVATION_MS; } });
22
+ Object.defineProperty(exports, "isCancellationReason", { enumerable: true, get: function () { return cancellation_js_1.isCancellationReason; } });
23
+ Object.defineProperty(exports, "remainingQuantities", { enumerable: true, get: function () { return cancellation_js_1.remainingQuantities; } });
24
+ var receipt_company_js_1 = require("./receipt-company.js");
25
+ Object.defineProperty(exports, "fromReceiptCompanyPayload", { enumerable: true, get: function () { return receipt_company_js_1.fromReceiptCompanyPayload; } });
26
+ Object.defineProperty(exports, "receiptCompanyTaxInfo", { enumerable: true, get: function () { return receipt_company_js_1.receiptCompanyTaxInfo; } });
27
+ var cashregister_js_1 = require("./cashregister.js");
28
+ Object.defineProperty(exports, "fromCashregisterPayload", { enumerable: true, get: function () { return cashregister_js_1.fromCashregisterPayload; } });
29
+ var receipt_summary_js_1 = require("./receipt-summary.js");
30
+ Object.defineProperty(exports, "fromReceiptSummaryPayload", { enumerable: true, get: function () { return receipt_summary_js_1.fromReceiptSummaryPayload; } });
31
+ Object.defineProperty(exports, "ZERO_KINDS", { enumerable: true, get: function () { return receipt_summary_js_1.ZERO_KINDS; } });
32
+ Object.defineProperty(exports, "istZeroKind", { enumerable: true, get: function () { return receipt_summary_js_1.istZeroKind; } });
33
+ var report_month_js_1 = require("./report-month.js");
34
+ Object.defineProperty(exports, "reportMonthFromDate", { enumerable: true, get: function () { return report_month_js_1.reportMonthFromDate; } });
35
+ Object.defineProperty(exports, "previousReportMonth", { enumerable: true, get: function () { return report_month_js_1.previousReportMonth; } });
36
+ Object.defineProperty(exports, "nextReportMonth", { enumerable: true, get: function () { return report_month_js_1.nextReportMonth; } });
37
+ Object.defineProperty(exports, "reportMonthKey", { enumerable: true, get: function () { return report_month_js_1.reportMonthKey; } });
38
+ Object.defineProperty(exports, "reportMonthReadable", { enumerable: true, get: function () { return report_month_js_1.reportMonthReadable; } });
39
+ var stripe_url_session_js_1 = require("./stripe-url-session.js");
40
+ Object.defineProperty(exports, "toStripeUrlSessionPayload", { enumerable: true, get: function () { return stripe_url_session_js_1.toStripeUrlSessionPayload; } });
41
+ Object.defineProperty(exports, "fromStripeUrlSessionPayload", { enumerable: true, get: function () { return stripe_url_session_js_1.fromStripeUrlSessionPayload; } });
42
+ var hobex_receipt_js_1 = require("./hobex-receipt.js");
43
+ Object.defineProperty(exports, "toHobexReceiptPayload", { enumerable: true, get: function () { return hobex_receipt_js_1.toHobexReceiptPayload; } });
44
+ Object.defineProperty(exports, "fromHobexReceiptPayload", { enumerable: true, get: function () { return hobex_receipt_js_1.fromHobexReceiptPayload; } });
45
+ Object.defineProperty(exports, "hobexReceiptToCardPaymentData", { enumerable: true, get: function () { return hobex_receipt_js_1.hobexReceiptToCardPaymentData; } });
46
+ Object.defineProperty(exports, "hobexReceiptNeedsSignature", { enumerable: true, get: function () { return hobex_receipt_js_1.hobexReceiptNeedsSignature; } });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Firmen- und Druckdaten eines Belegs — Zwilling der Metadaten von
3
+ * `KasseneckReceipt` in kasseneck_api/lib/models/kasseneck_receipt.dart
4
+ * (`toMetadataJson`/`fromMetadata`).
5
+ *
6
+ * Das Backend liefert sie **neben** dem Beleg: `getReceipt` und `createReceipt`
7
+ * legen Firma, Anschrift, Steuernummer, UID, Fusszeilen, Logo-Adresse und das
8
+ * Kleinunternehmer-Kennzeichen direkt in die Antwort (functions/index.js).
9
+ * Zum RKSV-Kernbeleg gehoeren sie nicht — sie betreffen ausschliesslich die
10
+ * Darstellung. Deshalb stehen sie hier als eigenes Modell und nicht in
11
+ * [Receipt]: derselbe Beleg, spaeter erneut gedruckt, kann eine
12
+ * zwischenzeitlich geaenderte Fusszeile tragen.
13
+ *
14
+ * **Gotcha:** `thanks_message` liefert nur `getReceipt`, `createReceipt`
15
+ * nicht (functions/index.js, Antwortbloecke von `getReceipt` bzw.
16
+ * `createReceipt`). Das Feld ist deshalb kein Pflichtfeld der Nutzlast; ohne
17
+ * es bleibt [thanksMessage] leer.
18
+ */
19
+ export interface ReceiptCompany {
20
+ companyName: string;
21
+ street: string;
22
+ zip: string;
23
+ city: string;
24
+ phone: string;
25
+ /** UID (Umsatzsteuer-Identifikationsnummer); fehlt bei Kleinunternehmern. */
26
+ uid?: string;
27
+ /** Steuernummer des Finanzamts. */
28
+ taxnr: string;
29
+ /** Kleinunternehmer nach § 6 Abs 1 Z 27 UStG (keine USt im Ausweis). */
30
+ isSmallBusiness: boolean;
31
+ footer1: string;
32
+ footer2: string;
33
+ footer3?: string;
34
+ footer4?: string;
35
+ /** Adresse des Firmenlogos; dieses Paket laedt und zeichnet es nicht. */
36
+ logoUrl?: string;
37
+ /** Dankestext am Belegende, je Zeile ein Eintrag. */
38
+ thanksMessage: string[];
39
+ /** Kreiseck-Branding am Belegende (Firestore-Flag `branding.kreiseck_logo`). */
40
+ showKreiseckLogo: boolean;
41
+ }
42
+ /**
43
+ * Nutzlast-Form, die dieses Paket **liest** — die Feldnamen der Backend-
44
+ * Antwort. Alles ist optional: ein Kundendokument ohne gepflegte Anschrift
45
+ * oder Fusszeile liefert die Felder als `null` oder gar nicht, und ein
46
+ * fehlender Firmenname darf keinen Belegdruck verhindern.
47
+ */
48
+ export interface ReceiptCompanyPayload {
49
+ company?: string | null;
50
+ street?: string | null;
51
+ zip?: string | null;
52
+ city?: string | null;
53
+ phone?: string | null;
54
+ uid?: string | null;
55
+ taxnr?: string | null;
56
+ is_small_business?: boolean | null;
57
+ footer1?: string | null;
58
+ footer2?: string | null;
59
+ footer3?: string | null;
60
+ footer4?: string | null;
61
+ logo_url?: string | null;
62
+ /** Nur `getReceipt` liefert dieses Feld — siehe Modulkommentar. */
63
+ thanks_message?: string | null;
64
+ kreiseck_logo?: boolean | null;
65
+ }
66
+ export declare function fromReceiptCompanyPayload(payload: ReceiptCompanyPayload): ReceiptCompany;
67
+ /**
68
+ * Steuerangabe im Belegkopf — Zwilling von `KasseneckReceipt.taxInfo`: die UID,
69
+ * wenn es eine gibt, sonst die Steuernummer.
70
+ */
71
+ export declare function receiptCompanyTaxInfo(company: ReceiptCompany): string;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fromReceiptCompanyPayload = fromReceiptCompanyPayload;
4
+ exports.receiptCompanyTaxInfo = receiptCompanyTaxInfo;
5
+ /** Leere Zeichenkette statt `undefined` — siehe [ReceiptCompanyPayload]. */
6
+ const text = (wert) => (typeof wert === 'string' ? wert : '');
7
+ /**
8
+ * Zerlegt den Dankestext in Zeilen. Das Vorbild trennt an der **Zeichenfolge**
9
+ * `\n` (Backslash + n), nicht am Zeilenumbruch — so legt es die Flutter-Seite
10
+ * auch wieder ab (`toMetadataJson`). Ein echter Zeilenumbruch wird zusaetzlich
11
+ * getrennt: er kommt aus einem mehrzeiligen Eingabefeld im Panel und wuerde
12
+ * sonst als Umbruch **innerhalb** einer Layout-Zeile weiterwandern.
13
+ */
14
+ function zeilen(wert) {
15
+ if (typeof wert !== 'string' || wert.length === 0) {
16
+ return [];
17
+ }
18
+ return wert.split(/\\n|\r?\n/);
19
+ }
20
+ function fromReceiptCompanyPayload(payload) {
21
+ const firma = {
22
+ companyName: text(payload.company),
23
+ street: text(payload.street),
24
+ zip: text(payload.zip),
25
+ city: text(payload.city),
26
+ phone: text(payload.phone),
27
+ taxnr: text(payload.taxnr),
28
+ isSmallBusiness: payload.is_small_business === true,
29
+ footer1: text(payload.footer1),
30
+ footer2: text(payload.footer2),
31
+ thanksMessage: zeilen(payload.thanks_message),
32
+ showKreiseckLogo: payload.kreiseck_logo === true,
33
+ };
34
+ // Die vier Kann-Felder bleiben weg, wenn sie leer sind — ein leerer String
35
+ // in `footer3` erzeugte sonst eine leere Zeile auf dem Beleg.
36
+ if (payload.uid)
37
+ firma.uid = payload.uid;
38
+ if (payload.footer3)
39
+ firma.footer3 = payload.footer3;
40
+ if (payload.footer4)
41
+ firma.footer4 = payload.footer4;
42
+ if (payload.logo_url)
43
+ firma.logoUrl = payload.logo_url;
44
+ return firma;
45
+ }
46
+ /**
47
+ * Steuerangabe im Belegkopf — Zwilling von `KasseneckReceipt.taxInfo`: die UID,
48
+ * wenn es eine gibt, sonst die Steuernummer.
49
+ */
50
+ function receiptCompanyTaxInfo(company) {
51
+ return company.uid !== undefined && company.uid.length > 0 ? company.uid : company.taxnr;
52
+ }
@@ -0,0 +1,100 @@
1
+ import { VatRate } from '../enums/index.js';
2
+ /**
3
+ * Belegposition — Zwilling von `KasseneckItem` in
4
+ * kasseneck_api/lib/models/kasseneck_item.dart.
5
+ *
6
+ * `priceCents` ist der Einzelpreis in **Cent** (exakte Integer-Arithmetik,
7
+ * keine Gleitkomma-Rundungsfehler). Eine Euro-Variante gibt es hier bewusst
8
+ * nicht — anders als beim Gutschein oder Hobex-Beleg sendet die Nutzlast
9
+ * (v2-Format) den Preis bereits als ganze Cent.
10
+ *
11
+ * `vat` ist beim Lesen entweder der bekannte Steuersatz (Objekt) oder — falls
12
+ * die Nutzlast einen Satz traegt, den dieses Paket noch nicht kennt — der
13
+ * rohe `rate`-Wert als Zahl (siehe [readVatRateByRate]). Ein Aufrufer erkennt
14
+ * den unbekannten Fall am `typeof`: ein Objekt ist bekannt, eine Zahl nicht.
15
+ *
16
+ * `quantity` ist beim **Schreiben** eine ganze Menge; TypeScript kennt keinen
17
+ * Ganzzahltyp, deshalb prueft der Schreibpfad sie zur Laufzeit (siehe
18
+ * [receiptItemIsValid] und [toReceiptItemPayload]). Beim **Lesen** steht hier,
19
+ * was in der Nutzlast stand — auch eine gebrochene Menge aus fremder Hand:
20
+ * lesen tolerant, schreiben streng. `receiptItemTotalCents` liefert dann
21
+ * folgerichtig einen gebrochenen Cent-Betrag; das ist die Wahrheit des
22
+ * Belegs, nicht ein Fehler dieses Pakets.
23
+ */
24
+ export interface ReceiptItem {
25
+ name: string;
26
+ /** Ganze Menge, > 0 zum Senden (siehe Klassenkommentar). */
27
+ quantity: number;
28
+ vat: VatRate | number;
29
+ priceCents: number;
30
+ }
31
+ /**
32
+ * Nutzlast-Form, die dieses Paket **schreibt** (v2):
33
+ * `{ name, quantity, unitPriceCents, vatRate }`.
34
+ */
35
+ export interface ReceiptItemPayload {
36
+ name: string;
37
+ quantity: number;
38
+ unitPriceCents: number;
39
+ vatRate: number;
40
+ }
41
+ /**
42
+ * Nutzlast-Form, die dieses Paket **liest** — v2 und v1 nebeneinander, alles
43
+ * optional (Zwilling von `KasseneckItem.fromJson`).
44
+ *
45
+ * Das ist kein Entgegenkommen, sondern der Normalfall: Das Backend bildet die
46
+ * v2-Felder am Eingang auf v1 ab und **speichert v1** (`normalizeMoneyInputs`
47
+ * in functions/index.js — quantity->amount, vatRate->vat,
48
+ * unitPriceCents->priceOneCents, daraus priceOne). Ein gespeicherter Beleg
49
+ * traegt v1 also immer, v2 nur dann, wenn der erzeugende Client sie
50
+ * mitgesendet hat. Wer hier nur v2 liest, bekommt bei Belegen von
51
+ * Alt-Clients `undefined` in Menge, Steuersatz und Preis — ohne Fehler, aber
52
+ * mit `NaN` in jeder Summe und mit einem Beleg, der sich nicht mehr
53
+ * stornieren laesst.
54
+ */
55
+ export interface ReceiptItemPayloadRead {
56
+ name?: string | null;
57
+ /** v2: Menge */
58
+ quantity?: number | null;
59
+ /** v2: Einzelpreis in Cent */
60
+ unitPriceCents?: number | null;
61
+ /** v2: Steuersatz */
62
+ vatRate?: number | null;
63
+ /** v1: Menge */
64
+ amount?: number | null;
65
+ /** v1: Einzelpreis in Cent */
66
+ priceOneCents?: number | null;
67
+ /** v1: Einzelpreis in Euro */
68
+ priceOne?: number | null;
69
+ /** v1: Steuersatz */
70
+ vat?: number | null;
71
+ }
72
+ export declare function toReceiptItemPayload(item: ReceiptItem): ReceiptItemPayload;
73
+ /**
74
+ * Liest beide Nutzlast-Formen (siehe [ReceiptItemPayloadRead]). Reihenfolge
75
+ * wie im Dart-Vorbild: v2 vor v1, Cent-Angabe vor Euro-Angabe (exakt vor
76
+ * gerundet); die Euro-Angabe wird genau einmal auf Cent gerundet.
77
+ */
78
+ export declare function fromReceiptItemPayload(payload: ReceiptItemPayloadRead): ReceiptItem;
79
+ /**
80
+ * Zeilensumme in Cent. Bei einer selbst erzeugten Position ist sie exakt:
81
+ * ganze Menge mal ganze Cent. Bei einem fremd erzeugten Beleg mit gebrochener
82
+ * Menge ist sie folgerichtig gebrochen — das ist der signierte Betrag, und ihn
83
+ * zu runden hiesse, einen anderen zu drucken.
84
+ */
85
+ export declare function receiptItemTotalCents(item: ReceiptItem): number;
86
+ /**
87
+ * Ist die Position an das Backend sendbar? Zwilling von `KasseneckItem.isValid`
88
+ * im Flutter-Vorbild: ein Name muss da sein und die Menge positiv **und ganz**.
89
+ * Der Preis darf negativ sein — genau das ist eine Stornoposition.
90
+ *
91
+ * Zur Ganzzahligkeit siehe [pruefeMenge]: im Dart-Vorbild ist `quantity` ein
92
+ * `int`, hier traegt der Typ das nicht, also muss es die Laufzeit tun.
93
+ */
94
+ export declare function receiptItemIsValid(item: ReceiptItem): boolean;
95
+ /**
96
+ * Stornoposition zu dieser Position — Zwilling von `KasseneckItem.negative`:
97
+ * gleicher Name, gleiche Menge, gleicher Steuersatz, **negierter** Einzelpreis.
98
+ * Die Menge bleibt positiv; das Vorzeichen sitzt ausschliesslich im Preis.
99
+ */
100
+ export declare function negateReceiptItem(item: ReceiptItem): ReceiptItem;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toReceiptItemPayload = toReceiptItemPayload;
4
+ exports.fromReceiptItemPayload = fromReceiptItemPayload;
5
+ exports.receiptItemTotalCents = receiptItemTotalCents;
6
+ exports.receiptItemIsValid = receiptItemIsValid;
7
+ exports.negateReceiptItem = negateReceiptItem;
8
+ const index_js_1 = require("../enums/index.js");
9
+ const enum_payload_js_1 = require("./enum-payload.js");
10
+ function toReceiptItemPayload(item) {
11
+ // Schreibpfad bleibt streng: ein unaufgeloester (unbekannter) Steuersatz
12
+ // darf nicht unbesehen wieder hinausgehen.
13
+ const vat = typeof item.vat === 'number' ? (0, enum_payload_js_1.requireVatRateByRate)(item.vat) : item.vat;
14
+ pruefeMenge(item.quantity);
15
+ return {
16
+ name: item.name,
17
+ quantity: item.quantity,
18
+ unitPriceCents: item.priceCents,
19
+ vatRate: vat.rate,
20
+ };
21
+ }
22
+ /**
23
+ * Liest beide Nutzlast-Formen (siehe [ReceiptItemPayloadRead]). Reihenfolge
24
+ * wie im Dart-Vorbild: v2 vor v1, Cent-Angabe vor Euro-Angabe (exakt vor
25
+ * gerundet); die Euro-Angabe wird genau einmal auf Cent gerundet.
26
+ */
27
+ function fromReceiptItemPayload(payload) {
28
+ const cents = ersteZahl(payload.unitPriceCents, payload.priceOneCents);
29
+ const euro = ersteZahl(payload.priceOne);
30
+ const menge = ersteZahl(payload.quantity, payload.amount);
31
+ const satz = ersteZahl(payload.vatRate, payload.vat);
32
+ return {
33
+ name: payload.name ?? '',
34
+ // Die Menge kommt herein, wie sie in der Nutzlast steht — auch eine
35
+ // gebrochene. Sie abzuschneiden (das Dart-Vorbild tut es mit `toInt()`)
36
+ // waere hier falsch: dort erzwingt es das `int`-Modell der Sprache, hier
37
+ // gaebe es lautlos einen anderen Betrag als den signierten. Am HTTP-API
38
+ // haengt auch fremde Software, und das Backend prueft bei den Positionen
39
+ // allein `unitPriceCents` auf Ganzzahligkeit — ein solcher Beleg ist also
40
+ // ausstellbar. Er muss sich dann anzeigen und drucken lassen, wie er
41
+ // signiert wurde. Streng ist stattdessen der Schreibpfad (siehe
42
+ // [pruefeMenge]): aus diesem Paket geht keine gebrochene Menge hinaus.
43
+ quantity: menge ?? 0,
44
+ // Fehlt der Steuersatz voellig, gibt es keinen rohen Wert zum Erhalten;
45
+ // dann gilt wie im Dart-Vorbild 0 % (das Backend prueft `vat` als Pflicht,
46
+ // der Fall entsteht also nur bei einer kaputten Nutzlast).
47
+ vat: satz != null ? (0, enum_payload_js_1.readVatRateByRate)(satz) : index_js_1.VatRate.vat0,
48
+ priceCents: cents != null ? Math.round(cents) : euro != null ? Math.round(euro * 100) : 0,
49
+ };
50
+ }
51
+ /** Erster brauchbarer Zahlenwert der Reihe; `null`/`undefined`/NaN zaehlen nicht. */
52
+ function ersteZahl(...werte) {
53
+ for (const wert of werte) {
54
+ if (typeof wert === 'number' && Number.isFinite(wert)) {
55
+ return wert;
56
+ }
57
+ }
58
+ return undefined;
59
+ }
60
+ /**
61
+ * Zeilensumme in Cent. Bei einer selbst erzeugten Position ist sie exakt:
62
+ * ganze Menge mal ganze Cent. Bei einem fremd erzeugten Beleg mit gebrochener
63
+ * Menge ist sie folgerichtig gebrochen — das ist der signierte Betrag, und ihn
64
+ * zu runden hiesse, einen anderen zu drucken.
65
+ */
66
+ function receiptItemTotalCents(item) {
67
+ return item.priceCents * item.quantity;
68
+ }
69
+ /**
70
+ * Ist die Position an das Backend sendbar? Zwilling von `KasseneckItem.isValid`
71
+ * im Flutter-Vorbild: ein Name muss da sein und die Menge positiv **und ganz**.
72
+ * Der Preis darf negativ sein — genau das ist eine Stornoposition.
73
+ *
74
+ * Zur Ganzzahligkeit siehe [pruefeMenge]: im Dart-Vorbild ist `quantity` ein
75
+ * `int`, hier traegt der Typ das nicht, also muss es die Laufzeit tun.
76
+ */
77
+ function receiptItemIsValid(item) {
78
+ return item.name.length > 0 && Number.isInteger(item.quantity) && item.quantity > 0;
79
+ }
80
+ /**
81
+ * Wirft, wenn die Menge keine ganze Zahl ist.
82
+ *
83
+ * Der Grund ist keine Formstrenge, sondern die Belegwahrheit: Das Backend
84
+ * prueft **nur** `unitPriceCents` auf Ganzzahligkeit (`checkItemsIsValid` in
85
+ * functions/index.js), eine gebrochene Menge kaeme also durch und wuerde
86
+ * mitsigniert. Der gedruckte Beleg wiese dann einen anderen Betrag aus als der
87
+ * signierte, und ein Storno darauf traegt eine Menge, die es nie gab. Deshalb
88
+ * faellt die Menge hier, vor dem Senden, und nicht spaeter still.
89
+ *
90
+ * Der Lesepfad tut das ausdruecklich **nicht** (siehe
91
+ * [fromReceiptItemPayload]): ein fremd erzeugter Beleg muss sich anzeigen
92
+ * lassen, wie er signiert wurde.
93
+ *
94
+ * `Number.isInteger` faengt Bruchteile, NaN und Unendlich in einem.
95
+ */
96
+ function pruefeMenge(quantity) {
97
+ if (!Number.isInteger(quantity)) {
98
+ throw new Error(`Menge: "${quantity}" ist keine ganze Zahl`);
99
+ }
100
+ }
101
+ /**
102
+ * Stornoposition zu dieser Position — Zwilling von `KasseneckItem.negative`:
103
+ * gleicher Name, gleiche Menge, gleicher Steuersatz, **negierter** Einzelpreis.
104
+ * Die Menge bleibt positiv; das Vorzeichen sitzt ausschliesslich im Preis.
105
+ */
106
+ function negateReceiptItem(item) {
107
+ return { ...item, priceCents: -item.priceCents };
108
+ }
@@ -0,0 +1,92 @@
1
+ import { KeckPaymentMethod, ReceiptType } from '../enums/index.js';
2
+ /**
3
+ * Belegzeile einer Liste — die Form, die `listMyReceipts` liefert
4
+ * (`projectReceiptForCustomer` in functions/index.js).
5
+ *
6
+ * **Das ist kein [Receipt].** Die Liste traegt bewusst nur, was eine Uebersicht
7
+ * braucht: keine Positionen, keine Gutscheine, keine Signatur, keinen QR-Code.
8
+ * Wer einen Beleg nachdrucken oder stornieren will, holt ihn ueber
9
+ * `getReceipt`/`getReceiptWithCompany` einzeln — dort steht der vollstaendige,
10
+ * signierte Beleg.
11
+ *
12
+ * `total` kommt vom Backend in **Euro** (auf zwei Stellen gerundet, `round2`).
13
+ * Dieses Paket rechnet ausnahmslos in ganzen Cent, deshalb wird der Betrag
14
+ * genau hier, an der Antwortgrenze, einmal umgerechnet — wie beim
15
+ * Hobex-Beleg.
16
+ *
17
+ * `receiptType` und `paymentMethod` sind wie ueberall beim Lesen entweder der
18
+ * bekannte Enum-Eintrag oder der rohe Nutzlast-Schluessel (siehe
19
+ * enum-payload.ts): eine Liste darf nicht daran scheitern, dass ein einzelner
20
+ * Beleg eine Zahlungsart traegt, die dieses Paket noch nicht kennt.
21
+ */
22
+ /** Anlass eines Nullbelegs (Backend: cashregister-lifecycle ZERO_KINDS). */
23
+ export declare const ZERO_KINDS: readonly ["monthly", "annual", "annual_replacement", "outage_end", "final", "manual"];
24
+ export type ZeroKind = (typeof ZERO_KINDS)[number];
25
+ export declare function istZeroKind(w: unknown): w is ZeroKind;
26
+ export interface ReceiptSummary {
27
+ receiptId: string;
28
+ /** Fortlaufender Belegzaehler der Kasse; fehlt bei Alt-Belegen. */
29
+ counter?: number;
30
+ receiptType: ReceiptType | string;
31
+ /** Roher Belegzeitstempel; Deutung ueber `parseServerTimeStamp`. */
32
+ timeStamp: string;
33
+ /** Belegsumme in ganzen Cent. */
34
+ totalCents: number;
35
+ paymentMethod: KeckPaymentMethod | string;
36
+ /** `'success'`/`'failed'` der FinanzOnline-Uebermittlung, sofern bekannt. */
37
+ transmissionStatus?: string;
38
+ /** Zeitstempel der Uebermittlung, roh wie vom Finanzamt geliefert. */
39
+ transmissionTime?: string;
40
+ /**
41
+ * Wurde der Beleg mit funktionierender Signatureinheit ausgestellt? Das
42
+ * Backend meldet hier `signatureSuccess !== false`, also `true`, solange
43
+ * nichts Gegenteiliges vermerkt ist.
44
+ */
45
+ signatureOk: boolean;
46
+ /** Nur fuer Kassen-Benutzer geliefert: Positionen kurz (Name, Menge). */
47
+ items: Array<{
48
+ name: string;
49
+ quantity: number;
50
+ }>;
51
+ /** Bediener am Beleg, wenn bekannt. */
52
+ operator?: {
53
+ uid: string | null;
54
+ name: string;
55
+ };
56
+ /** Nur am Storno-Beleg: das Original. */
57
+ cancellationOf?: {
58
+ receiptId: string | null;
59
+ };
60
+ cancellationReason?: string;
61
+ /** offen | teil | voll -- Storno-Stand des Originals. */
62
+ stornoStand: 'offen' | 'teil' | 'voll';
63
+ /** Nur am Nullbeleg, nur fuer Kassen-Benutzer: Anlass (monthly, annual, annual_replacement, outage_end, final, manual). */
64
+ zeroKind?: ZeroKind;
65
+ }
66
+ export interface ReceiptSummaryPayload {
67
+ receiptId?: string | null;
68
+ counter?: number | null;
69
+ receiptType?: string | null;
70
+ timeStamp?: string | null;
71
+ /** Belegsumme in **Euro** (siehe Klassenkommentar). */
72
+ total?: number | null;
73
+ paymentMethod?: string | null;
74
+ transmission_status?: string | null;
75
+ ts_transmission?: string | null;
76
+ signature_ok?: boolean | null;
77
+ items?: Array<{
78
+ name?: string | null;
79
+ quantity?: number | null;
80
+ }> | null;
81
+ operator?: {
82
+ uid?: string | null;
83
+ name?: string | null;
84
+ } | null;
85
+ cancellationOf?: {
86
+ receiptId?: string | null;
87
+ } | null;
88
+ cancellationReason?: string | null;
89
+ stornoStand?: string | null;
90
+ zeroKind?: string | null;
91
+ }
92
+ export declare function fromReceiptSummaryPayload(payload: ReceiptSummaryPayload): ReceiptSummary;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZERO_KINDS = void 0;
4
+ exports.istZeroKind = istZeroKind;
5
+ exports.fromReceiptSummaryPayload = fromReceiptSummaryPayload;
6
+ const index_js_1 = require("../enums/index.js");
7
+ const money_js_1 = require("../money.js");
8
+ const enum_payload_js_1 = require("./enum-payload.js");
9
+ /**
10
+ * Belegzeile einer Liste — die Form, die `listMyReceipts` liefert
11
+ * (`projectReceiptForCustomer` in functions/index.js).
12
+ *
13
+ * **Das ist kein [Receipt].** Die Liste traegt bewusst nur, was eine Uebersicht
14
+ * braucht: keine Positionen, keine Gutscheine, keine Signatur, keinen QR-Code.
15
+ * Wer einen Beleg nachdrucken oder stornieren will, holt ihn ueber
16
+ * `getReceipt`/`getReceiptWithCompany` einzeln — dort steht der vollstaendige,
17
+ * signierte Beleg.
18
+ *
19
+ * `total` kommt vom Backend in **Euro** (auf zwei Stellen gerundet, `round2`).
20
+ * Dieses Paket rechnet ausnahmslos in ganzen Cent, deshalb wird der Betrag
21
+ * genau hier, an der Antwortgrenze, einmal umgerechnet — wie beim
22
+ * Hobex-Beleg.
23
+ *
24
+ * `receiptType` und `paymentMethod` sind wie ueberall beim Lesen entweder der
25
+ * bekannte Enum-Eintrag oder der rohe Nutzlast-Schluessel (siehe
26
+ * enum-payload.ts): eine Liste darf nicht daran scheitern, dass ein einzelner
27
+ * Beleg eine Zahlungsart traegt, die dieses Paket noch nicht kennt.
28
+ */
29
+ /** Anlass eines Nullbelegs (Backend: cashregister-lifecycle ZERO_KINDS). */
30
+ exports.ZERO_KINDS = ['monthly', 'annual', 'annual_replacement', 'outage_end', 'final', 'manual'];
31
+ function istZeroKind(w) {
32
+ return typeof w === 'string' && exports.ZERO_KINDS.includes(w);
33
+ }
34
+ function fromReceiptSummaryPayload(payload) {
35
+ return {
36
+ receiptId: payload.receiptId ?? '',
37
+ ...(typeof payload.counter === 'number' ? { counter: payload.counter } : {}),
38
+ receiptType: (0, enum_payload_js_1.readEnumKey)(index_js_1.ReceiptType, payload.receiptType ?? ''),
39
+ timeStamp: payload.timeStamp ?? '',
40
+ totalCents: (0, money_js_1.euroToCents)(payload.total),
41
+ paymentMethod: (0, enum_payload_js_1.readEnumKey)(index_js_1.KeckPaymentMethod, payload.paymentMethod ?? ''),
42
+ ...(payload.transmission_status ? { transmissionStatus: payload.transmission_status } : {}),
43
+ ...(payload.ts_transmission ? { transmissionTime: payload.ts_transmission } : {}),
44
+ // Nur ein ausdrueckliches `false` heisst "ausgefallen" — genau wie im
45
+ // Backend, das hier `signatureSuccess !== false` sendet.
46
+ signatureOk: payload.signature_ok !== false,
47
+ items: Array.isArray(payload.items) ? payload.items.map((i) => ({ name: i?.name ?? '', quantity: typeof i?.quantity === 'number' ? i.quantity : 0 })) : [],
48
+ ...(payload.operator ? { operator: { uid: payload.operator.uid ?? null, name: payload.operator.name ?? '' } } : {}),
49
+ ...(payload.cancellationOf ? { cancellationOf: { receiptId: payload.cancellationOf.receiptId ?? null } } : {}),
50
+ ...(payload.cancellationReason ? { cancellationReason: payload.cancellationReason } : {}),
51
+ stornoStand: payload.stornoStand === 'teil' || payload.stornoStand === 'voll' ? payload.stornoStand : 'offen',
52
+ ...(istZeroKind(payload.zeroKind) ? { zeroKind: payload.zeroKind } : {}),
53
+ };
54
+ }