@kreiseck/kasseneck-api 1.10.0 → 1.11.0

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 (150) hide show
  1. package/CHANGELOG.md +245 -0
  2. package/dist/cjs/client/aufrufe.d.ts +5 -5
  3. package/dist/cjs/client/aufrufe.js +22 -2
  4. package/dist/cjs/client/errors.js +2 -0
  5. package/dist/cjs/client/receipts.d.ts +34 -1
  6. package/dist/cjs/client/receipts.js +34 -1
  7. package/dist/cjs/client/reports.d.ts +4 -4
  8. package/dist/cjs/client/reports.js +4 -4
  9. package/dist/cjs/index.d.ts +1 -1
  10. package/dist/cjs/index.js +9 -2
  11. package/dist/cjs/inventory/vertrag.d.ts +1 -1
  12. package/dist/cjs/inventory/vertrag.js +2 -0
  13. package/dist/cjs/invoice/vertrag.d.ts +1 -1
  14. package/dist/cjs/invoice/vertrag.js +2 -0
  15. package/dist/cjs/models/cancellation.d.ts +49 -1
  16. package/dist/cjs/models/cancellation.js +139 -1
  17. package/dist/cjs/models/index.d.ts +1 -1
  18. package/dist/cjs/models/index.js +9 -2
  19. package/dist/cjs/models/payment-errors.d.ts +1 -1
  20. package/dist/cjs/models/payment-errors.js +2 -0
  21. package/dist/cjs/models/receipt-email.d.ts +1 -1
  22. package/dist/cjs/models/receipt-email.js +2 -0
  23. package/dist/cjs/models/receipt-errors.d.ts +1 -1
  24. package/dist/cjs/models/receipt-errors.js +2 -0
  25. package/dist/cjs/models/receipt-item.d.ts +10 -0
  26. package/dist/cjs/models/receipt-item.js +3 -0
  27. package/dist/cjs/pos/client.js +10 -0
  28. package/dist/cjs/pos/errors.d.ts +4 -3
  29. package/dist/cjs/pos/errors.js +21 -2
  30. package/dist/cjs/pos/index.d.ts +6 -2
  31. package/dist/cjs/pos/index.js +33 -3
  32. package/dist/cjs/pos/schicht-lesen.d.ts +39 -0
  33. package/dist/cjs/pos/schicht-lesen.js +405 -0
  34. package/dist/cjs/pos/schicht-typen.d.ts +380 -0
  35. package/dist/cjs/pos/schicht-typen.js +59 -0
  36. package/dist/cjs/pos/schicht.d.ts +208 -0
  37. package/dist/cjs/pos/schicht.js +235 -0
  38. package/dist/cjs/pos/settings.d.ts +37 -1
  39. package/dist/cjs/pos/settings.js +43 -3
  40. package/dist/cjs/pos/texte.d.ts +627 -0
  41. package/dist/cjs/pos/texte.js +236 -0
  42. package/dist/cjs/react/index.js +1 -1
  43. package/dist/cjs/receipt/grid.js +2 -2
  44. package/dist/cjs/receipt/layout.d.ts +5 -0
  45. package/dist/cjs/receipt/shift-sheet.d.ts +33 -0
  46. package/dist/cjs/receipt/shift-sheet.js +207 -0
  47. package/dist/cjs/register/errors.d.ts +1 -1
  48. package/dist/cjs/register/errors.js +2 -0
  49. package/dist/cjs/stored/draht.d.ts +1 -1
  50. package/dist/cjs/stored/draht.js +4 -3
  51. package/dist/cjs/stored/einstellungen.js +26 -3
  52. package/dist/cjs/stored/vokabular.d.ts +1 -1
  53. package/dist/cjs/stored/vokabular.js +118 -12
  54. package/dist/cjs/version.d.ts +1 -1
  55. package/dist/cjs/version.js +1 -1
  56. package/dist/esm/client/aufrufe.d.ts +5 -5
  57. package/dist/esm/client/aufrufe.js +22 -2
  58. package/dist/esm/client/errors.js +2 -0
  59. package/dist/esm/client/receipts.d.ts +34 -1
  60. package/dist/esm/client/receipts.js +35 -2
  61. package/dist/esm/client/reports.d.ts +4 -4
  62. package/dist/esm/client/reports.js +4 -4
  63. package/dist/esm/index.d.ts +1 -1
  64. package/dist/esm/index.js +1 -1
  65. package/dist/esm/inventory/vertrag.d.ts +1 -1
  66. package/dist/esm/inventory/vertrag.js +2 -0
  67. package/dist/esm/invoice/vertrag.d.ts +1 -1
  68. package/dist/esm/invoice/vertrag.js +2 -0
  69. package/dist/esm/models/cancellation.d.ts +49 -1
  70. package/dist/esm/models/cancellation.js +132 -0
  71. package/dist/esm/models/index.d.ts +1 -1
  72. package/dist/esm/models/index.js +1 -1
  73. package/dist/esm/models/payment-errors.d.ts +1 -1
  74. package/dist/esm/models/payment-errors.js +2 -0
  75. package/dist/esm/models/receipt-email.d.ts +1 -1
  76. package/dist/esm/models/receipt-email.js +2 -0
  77. package/dist/esm/models/receipt-errors.d.ts +1 -1
  78. package/dist/esm/models/receipt-errors.js +2 -0
  79. package/dist/esm/models/receipt-item.d.ts +10 -0
  80. package/dist/esm/models/receipt-item.js +3 -0
  81. package/dist/esm/pos/client.js +11 -1
  82. package/dist/esm/pos/errors.d.ts +4 -3
  83. package/dist/esm/pos/errors.js +21 -2
  84. package/dist/esm/pos/index.d.ts +6 -2
  85. package/dist/esm/pos/index.js +7 -2
  86. package/dist/esm/pos/schicht-lesen.d.ts +39 -0
  87. package/dist/esm/pos/schicht-lesen.js +392 -0
  88. package/dist/esm/pos/schicht-typen.d.ts +380 -0
  89. package/dist/esm/pos/schicht-typen.js +56 -0
  90. package/dist/esm/pos/schicht.d.ts +208 -0
  91. package/dist/esm/pos/schicht.js +222 -0
  92. package/dist/esm/pos/settings.d.ts +37 -1
  93. package/dist/esm/pos/settings.js +40 -2
  94. package/dist/esm/pos/texte.d.ts +627 -0
  95. package/dist/esm/pos/texte.js +236 -0
  96. package/dist/esm/react/index.js +1 -1
  97. package/dist/esm/receipt/grid.js +2 -2
  98. package/dist/esm/receipt/layout.d.ts +5 -0
  99. package/dist/esm/receipt/shift-sheet.d.ts +33 -0
  100. package/dist/esm/receipt/shift-sheet.js +203 -0
  101. package/dist/esm/register/errors.d.ts +1 -1
  102. package/dist/esm/register/errors.js +2 -0
  103. package/dist/esm/stored/draht.d.ts +1 -1
  104. package/dist/esm/stored/draht.js +4 -3
  105. package/dist/esm/stored/einstellungen.js +27 -4
  106. package/dist/esm/stored/vokabular.d.ts +1 -1
  107. package/dist/esm/stored/vokabular.js +118 -12
  108. package/dist/esm/version.d.ts +1 -1
  109. package/dist/esm/version.js +1 -1
  110. package/fixtures/cancellation-tip-cases.json +679 -0
  111. package/fixtures/expected/cash-movement.grid32.txt +15 -0
  112. package/fixtures/expected/cash-movement.grid48.txt +15 -0
  113. package/fixtures/expected/cash-movement.lines.json +171 -0
  114. package/fixtures/expected/shift-close-blind.grid32.txt +28 -0
  115. package/fixtures/expected/shift-close-blind.grid48.txt +27 -0
  116. package/fixtures/expected/shift-close-blind.lines.json +275 -0
  117. package/fixtures/expected/shift-close-put-in.grid32.txt +38 -0
  118. package/fixtures/expected/shift-close-put-in.grid48.txt +35 -0
  119. package/fixtures/expected/shift-close-put-in.lines.json +403 -0
  120. package/fixtures/expected/shift-close-take-out.grid32.txt +38 -0
  121. package/fixtures/expected/shift-close-take-out.grid48.txt +35 -0
  122. package/fixtures/expected/shift-close-take-out.lines.json +403 -0
  123. package/fixtures/expected/shift-close.grid32.txt +37 -0
  124. package/fixtures/expected/shift-close.grid48.txt +35 -0
  125. package/fixtures/expected/shift-close.lines.json +413 -0
  126. package/fixtures/expected/shift-interim.grid32.txt +28 -0
  127. package/fixtures/expected/shift-interim.grid48.txt +27 -0
  128. package/fixtures/expected/shift-interim.lines.json +293 -0
  129. package/fixtures/hobex-hps-codes.json +1 -1
  130. package/fixtures/invoice-api.schema.json +1 -1
  131. package/fixtures/invoice-texts.json +1 -1
  132. package/fixtures/pos-message-cases.json +45 -0
  133. package/fixtures/pos-texts.json +723 -1
  134. package/fixtures/receipt-due-generated.json +1 -1
  135. package/fixtures/shift-cases.json +87 -0
  136. package/fixtures/shift-receipts.json +41 -0
  137. package/fixtures/surface.json +119 -3
  138. package/fixtures/v3/antworten/belege.json +1 -1
  139. package/fixtures/v3/antworten/belegmail.json +1 -1
  140. package/fixtures/v3/antworten/kasse-belege.json +1 -1
  141. package/fixtures/v3/antworten/kasse.json +10874 -4865
  142. package/fixtures/v3/antworten/lager.json +1 -1
  143. package/fixtures/v3/antworten/rechnungen.json +1 -1
  144. package/fixtures/v3/antworten/storno.json +1 -1
  145. package/fixtures/v3/stored/belege.json +18 -6
  146. package/fixtures/v3/stored/kasse.json +4667 -183
  147. package/fixtures/v3/stored/rechnungen.json +1 -1
  148. package/fixtures/v3/v3-vokabular.json +739 -32
  149. package/fixtures/v3/zahlbetrag-faelle.json +1 -1
  150. package/package.json +1 -1
@@ -107,9 +107,10 @@ const ohneMarke = (o) => {
107
107
  /**
108
108
  * Interne Dokumentfelder eines Belegs, die keine Antwort traegt (Zwilling von
109
109
  * storno-core.INTERNE_BELEG_FELDER): der Lager-Standort der Kasse, den
110
- * createReceipt fuer die Lagerbuchung an den Beleg kopiert.
110
+ * createReceipt fuer die Lagerbuchung an den Beleg kopiert, sowie Lade und
111
+ * Schicht, in deren Kassenstand der Beleg zaehlt.
111
112
  */
112
- const INTERNE_BELEG_FELDER = ['lagerStandortId'];
113
+ const INTERNE_BELEG_FELDER = ['lagerStandortId', 'ladeId', 'schichtId', 'ausserhalbSchicht'];
113
114
  /** Rueckgabe-Wahl innen -> aussen (Katalog RUECKGABE; stored.test.ts vergleicht mit dem Vertrag). */
114
115
  exports._RUECKGABE_NACH_AUSSEN = Object.freeze({ lager: 'restock', defekt: 'defective', entsorgt: 'disposed' });
115
116
  /**
@@ -159,7 +160,7 @@ function alsIso(ts) {
159
160
  }
160
161
  /**
161
162
  * Ein Belegdokument, wie Handler und Rand es vor der Uebersetzung sehen:
162
- * ohne Storno-Marke und Lager-Standort (storno-core.ohneInterneBelegFelder,
163
+ * ohne Storno-Marke, Lager-Standort, Lade und Schicht (storno-core.ohneInterneBelegFelder,
163
164
  * Rand ohneStornoMarke). Alles andere bleibt woertlich, auch `pruefangaben` im
164
165
  * Beleg selbst (der Server reicht sie so durch). Wirft, wenn es kein
165
166
  * Belegdokument ist.
@@ -45,6 +45,19 @@ const PRUEFER = {
45
45
  drawerEnabled: bool, terminalIp: ip, terminalPort: ganz(1, 65535), terminalTid: tid, shortcutHints: bool,
46
46
  },
47
47
  };
48
+ /**
49
+ * Optionale Geraete-Einstellungen (Zwilling von `GERAET_OPTIONAL` und
50
+ * `mischeGeraet` in kasse-settings-core): sie gehen nur hinaus, wenn sie als
51
+ * gueltiger Text gespeichert sind; sonst fehlen sie still, ohne Eintrag in
52
+ * `weggelassen` (der Server meldet sie dann auch nicht).
53
+ */
54
+ const GERAET_OPTIONAL = Object.fromEntries(settings_js_1.POS_DEVICE_OPTIONAL_FIELDS.map((feld) => [feld, (v) => (0, settings_js_1._optionalerWert)(v, false)]));
55
+ /**
56
+ * Optionale Betriebs-Schalter (Zwilling von `BETRIEB_OPTIONAL` und
57
+ * `mischeBetrieb`): sie gehen nur hinaus, wenn sie als Wahrheitswert
58
+ * gespeichert sind; sonst fehlen sie still.
59
+ */
60
+ const BETRIEB_OPTIONAL = Object.fromEntries(settings_js_1.POS_BUSINESS_OPTIONAL_FIELDS.map((feld) => [feld, (v) => typeof v === 'boolean']));
48
61
  /** Aufzaehlungen (aussen, englisch) je Teil. */
49
62
  const AUFZAEHLUNGEN = {
50
63
  business: settings_js_1.POS_BUSINESS_VALUES, device: settings_js_1.POS_DEVICE_VALUES,
@@ -128,6 +141,16 @@ function teilNachAussen(teil, gespeichert, weg) {
128
141
  if (aussen === undefined || w === undefined)
129
142
  continue;
130
143
  const pfad = `${teil}.${aussen}`;
144
+ if (teil === 'device' && (0, draht_js_1.hat)(GERAET_OPTIONAL, aussen)) {
145
+ if (GERAET_OPTIONAL[aussen](w))
146
+ raus[aussen] = w;
147
+ continue;
148
+ }
149
+ if (teil === 'business' && (0, draht_js_1.hat)(BETRIEB_OPTIONAL, aussen)) {
150
+ if (BETRIEB_OPTIONAL[aussen](w))
151
+ raus[aussen] = w;
152
+ continue;
153
+ }
131
154
  if (aussen === 'shortcuts') {
132
155
  if (!w || typeof w !== 'object') {
133
156
  weg.push(pfad);
@@ -194,7 +217,7 @@ function _storedPosSettingsToWire(stored) {
194
217
  }
195
218
  /** Nur fuer den Test: die Feldliste der Pruefer (muss mit der Vorgabe deckungsgleich sein). */
196
219
  exports._PRUEFER_FELDER = Object.freeze({
197
- business: [...Object.keys(PRUEFER.business), ...Object.keys(settings_js_1.POS_BUSINESS_VALUES), ...Object.keys(KARTEN)],
198
- device: [...Object.keys(PRUEFER.device), ...Object.keys(settings_js_1.POS_DEVICE_VALUES), 'shortcuts'],
199
- standard: { business: Object.keys(settings_js_1.POS_BUSINESS_DEFAULTS), device: Object.keys(settings_js_1.POS_DEVICE_DEFAULTS) },
220
+ business: [...Object.keys(PRUEFER.business), ...Object.keys(settings_js_1.POS_BUSINESS_VALUES), ...Object.keys(BETRIEB_OPTIONAL), ...Object.keys(KARTEN)],
221
+ device: [...Object.keys(PRUEFER.device), ...Object.keys(settings_js_1.POS_DEVICE_VALUES), ...Object.keys(GERAET_OPTIONAL), 'shortcuts'],
222
+ standard: { business: [...Object.keys(settings_js_1.POS_BUSINESS_DEFAULTS), ...settings_js_1.POS_BUSINESS_OPTIONAL_FIELDS], device: [...Object.keys(settings_js_1.POS_DEVICE_DEFAULTS), ...settings_js_1.POS_DEVICE_OPTIONAL_FIELDS] },
200
223
  });
@@ -1,5 +1,5 @@
1
1
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
2
- export declare const VOKABULAR_QUELLE = "4b0152e546f6320ecc6dad18156ac91cc176426c71c57ecbf21c1192a714ecda";
2
+ export declare const VOKABULAR_QUELLE = "e061453f62c8f4af21528eb51a677d6f947553f5b78621d64497f45833dd8b09";
3
3
  /** Schema-Notation des Vertrags: Blatt 'aussen': 'innen', Objekt { __: 'innen', ... }, Liste [ { __: 'innen', ... } ]. */
4
4
  export type SchemaEintrag = string | SchemaObjekt | readonly [SchemaObjekt];
5
5
  export interface SchemaObjekt {
@@ -4,7 +4,7 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.KATALOGE = exports.ARTIKEL_FELDER = exports.SCHEMAS = exports.VOKABULAR_QUELLE = void 0;
6
6
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
7
- exports.VOKABULAR_QUELLE = "4b0152e546f6320ecc6dad18156ac91cc176426c71c57ecbf21c1192a714ecda";
7
+ exports.VOKABULAR_QUELLE = "e061453f62c8f4af21528eb51a677d6f947553f5b78621d64497f45833dd8b09";
8
8
  /** Schema je Endpunkt (aussen -> innen) und Wertverweise auf die Kataloge. */
9
9
  exports.SCHEMAS = {
10
10
  "getReceipt": {
@@ -21,7 +21,8 @@ exports.SCHEMAS = {
21
21
  "items": [
22
22
  {
23
23
  "__": "items",
24
- "receivedImmediately": "sofortErhalten"
24
+ "receivedImmediately": "sofortErhalten",
25
+ "keptByEmployee": "direkt"
25
26
  }
26
27
  ]
27
28
  },
@@ -96,6 +97,7 @@ exports.SCHEMAS = {
96
97
  "change": "rueckgeld",
97
98
  "tipChips": "tgChips",
98
99
  "exactCash": "schnellbar",
100
+ "tipKeptByDefault": "tgDirekt",
99
101
  "checkoutMode": "kassierenModus",
100
102
  "receiptOutput": "belegAusgabe",
101
103
  "doneScreenSeconds": "fertigSekunden",
@@ -151,6 +153,7 @@ exports.SCHEMAS = {
151
153
  "qrMode": "qrModus",
152
154
  "drawerEnabled": "ladeAn",
153
155
  "drawerAutoOpen": "ladeAuto",
156
+ "drawerId": "ladeId",
154
157
  "terminalIp": "terminalIp",
155
158
  "terminalPort": "terminalPort",
156
159
  "terminalTid": "terminalTid",
@@ -268,30 +271,133 @@ exports.ARTIKEL_FELDER = [
268
271
  /** Wertkataloge innen (deutsch) -> aussen (englisch). */
269
272
  exports.KATALOGE = {
270
273
  "E1A_GRUPPE": {
274
+ "erloese": "revenue",
275
+ "erloese_waren": "revenue_goods",
276
+ "erloese_leistungen": "revenue_services",
277
+ "eigenverbrauch": "own_use_withdrawal",
278
+ "trinkgeld_erhalten": "tips_received",
279
+ "erloese_109a": "revenue_109a",
280
+ "anlagenverkauf": "asset_sales_withdrawals",
281
+ "uebrige_einnahmen": "other_income",
282
+ "zinsertrag": "interest_income",
283
+ "versicherungsentschaedigung": "insurance_payout",
284
+ "foerderung": "subsidy",
285
+ "steuerrueckzahlung": "tax_refund",
286
+ "geschenk_erhalten": "gift_received",
287
+ "vertragsstrafe_erhalten": "penalty_received",
288
+ "ust_vereinnahmt": "vat_collected_gross_system",
289
+ "durchlaufend_einnahme": "pass_through_receipt",
271
290
  "waren": "goods_materials",
272
291
  "fremdleistungen": "third_party_services",
292
+ "subunternehmer": "subcontractors",
293
+ "leihpersonal": "temporary_staff",
273
294
  "personal": "staff_costs",
295
+ "loehne": "wages_salaries",
296
+ "lohnabgaben": "payroll_taxes",
297
+ "personal_sozialaufwand": "staff_welfare",
298
+ "kleidung_mitarbeiter": "staff_clothing",
299
+ "abschreibung": "depreciation_group",
274
300
  "afa": "depreciation",
275
301
  "gwg": "low_value_assets",
276
- "miete": "rent_lease",
302
+ "kfz_afa": "vehicle_depreciation",
303
+ "afa_degressiv": "declining_balance_depreciation",
304
+ "afa_gebaeude": "building_depreciation",
305
+ "anlagenabgang": "asset_disposal_book_value",
277
306
  "instandhaltung_gebaeude": "building_maintenance",
278
307
  "reise": "travel_expenses",
308
+ "fahrkarten": "travel_tickets",
309
+ "naechtigung_beleg": "lodging_invoice",
310
+ "reise_nebenkosten": "travel_incidentals",
311
+ "fortbildungsreise": "conference_travel",
312
+ "kilometergeld_pkw": "mileage_allowance_car",
313
+ "kilometergeld_motorrad": "mileage_allowance_motorcycle",
314
+ "kilometergeld_fahrrad": "mileage_allowance_bicycle",
315
+ "mitfahrerzuschlag": "passenger_allowance",
316
+ "tagesgeld_inland": "per_diem_domestic",
317
+ "tagesgeld_ausland": "per_diem_abroad",
318
+ "naechtigung_pauschal": "lodging_allowance",
279
319
  "oeffi_pauschale": "public_transport_allowance",
280
320
  "kfz": "vehicle_costs",
321
+ "treibstoff": "vehicle_fuel",
322
+ "kfz_service": "vehicle_service_repair",
323
+ "kfz_versicherung": "vehicle_insurance",
324
+ "kfz_steuer": "vehicle_tax",
325
+ "vignette_maut": "toll_vignette",
326
+ "parken_garage": "parking_garage",
327
+ "autofahrerklub": "motoring_club",
328
+ "miete": "rent_lease",
329
+ "miete_geschaeftsraum": "premises_rent",
330
+ "leasing_kfz": "vehicle_lease",
331
+ "leasing_geraete": "equipment_lease",
332
+ "coworking": "coworking_storage",
281
333
  "provisionen": "commissions_royalties",
282
334
  "werbung": "advertising_hospitality",
335
+ "werbung_anzeigen": "advertising",
336
+ "geschenke": "gifts",
337
+ "werbegeschenke": "promotional_gifts",
338
+ "geschenke_geschaeftsfreunde": "business_gifts",
339
+ "bewirtung": "hospitality",
340
+ "bewirtung_werbung": "hospitality_advertising",
341
+ "bewirtung_voll": "hospitality_full",
342
+ "bewirtung_repraesentation": "hospitality_representation",
343
+ "sponsoring": "sponsorship",
344
+ "trinkgeld_gegeben": "tips_given",
345
+ "kranz_blumen": "wreaths_flowers",
346
+ "spende_sonstige": "donation_non_qualifying",
347
+ "spenden": "donations_qualifying",
348
+ "spende_forschung_kultur": "donation_research_culture",
349
+ "spende_mildtaetig": "donation_charity",
350
+ "spende_umwelt_tier": "donation_environment_animals",
351
+ "spende_feuerwehr": "donation_fire_brigade",
352
+ "spende_sport": "donation_sports",
353
+ "spende_kindergarten": "donation_kindergarten",
354
+ "spende_schule": "donation_school",
355
+ "spende_sonstige_beguenstigt": "donation_other_qualifying",
356
+ "arbeitszimmer": "home_office_room",
357
+ "arbeitsplatzpauschale": "workspace_allowance_group",
358
+ "arbeitsplatz_gross": "workspace_allowance_large",
359
+ "arbeitsplatz_klein": "workspace_allowance_small",
360
+ "arbeitsplatz_mobiliar": "ergonomic_furniture",
283
361
  "zinsen": "interest",
362
+ "zinsen_kredit": "loan_interest",
363
+ "zinsen_stundung": "deferral_interest",
284
364
  "sv_beitraege": "social_insurance_contributions",
285
- "arbeitsplatz_klein": "workspace_allowance_small",
286
- "arbeitsplatz_gross": "workspace_allowance_large",
287
- "anlagenabgang": "asset_disposal_book_value",
288
- "telefon_buero": "phone_internet_office_supplies",
289
- "beratung": "legal_advisory",
365
+ "svs": "svs_contributions",
366
+ "vorsorgekasse": "self_employed_provision_fund",
367
+ "kammer_versorgung": "chamber_pension_fund",
368
+ "arbeitslosen_optin": "voluntary_unemployment_insurance",
290
369
  "uebrige_ausgaben": "other_expenses",
291
- "erloese": "revenue",
292
- "erloese_109a": "revenue_109a",
293
- "anlagenverkauf": "asset_sales_withdrawals",
294
- "uebrige_einnahmen": "other_income"
370
+ "telefon_internet": "phone_internet",
371
+ "buero": "office_supplies",
372
+ "software": "software_subscriptions",
373
+ "fachliteratur": "professional_literature",
374
+ "fortbildung": "training",
375
+ "beratung": "legal_advisory",
376
+ "steuerberatung": "tax_advisory",
377
+ "rechtsberatung": "legal_counsel",
378
+ "versicherung": "insurance",
379
+ "versicherung_betrieb": "business_insurance",
380
+ "mitgliedsbeitrag": "membership_fee",
381
+ "kammer_verbaende": "chamber_association_fees",
382
+ "betriebssteuern": "business_taxes_fees",
383
+ "bankspesen": "bank_charges",
384
+ "kleidung": "clothing",
385
+ "berufskleidung": "work_clothing",
386
+ "gruendung": "startup_costs",
387
+ "strafe": "penalty",
388
+ "schadenersatz_gezahlt": "damages_paid",
389
+ "ust_bezahlt": "vat_paid_gross_system",
390
+ "telefon_buero": "phone_internet_office_supplies",
391
+ "nicht_abzugsfaehig": "non_deductible",
392
+ "privat": "non_deductible_private",
393
+ "einkommensteuer": "non_deductible_income_tax",
394
+ "strafen": "non_deductible_fines",
395
+ "brille_uhr": "non_deductible_glasses_watch",
396
+ "kleidung_buergerlich": "non_deductible_clothing",
397
+ "zeitungen": "non_deductible_newspapers",
398
+ "fitness_fuehrerschein": "non_deductible_fitness_licence",
399
+ "ball_kultur": "non_deductible_events",
400
+ "durchlaufend_ausgabe": "pass_through_payment"
295
401
  },
296
402
  "KASSE_BETRIEB_WERTE.cardProvider": {
297
403
  "keiner": "none",
@@ -4,4 +4,4 @@
4
4
  * Client-Version, Nachtrag §6). Ein Test haelt sie gleich mit `package.json`;
5
5
  * beim Anheben der Version beide Stellen aendern.
6
6
  */
7
- export declare const PACKAGE_VERSION = "1.10.0";
7
+ export declare const PACKAGE_VERSION = "1.11.0";
@@ -7,4 +7,4 @@ exports.PACKAGE_VERSION = void 0;
7
7
  * Client-Version, Nachtrag §6). Ein Test haelt sie gleich mit `package.json`;
8
8
  * beim Anheben der Version beide Stellen aendern.
9
9
  */
10
- exports.PACKAGE_VERSION = '1.10.0';
10
+ exports.PACKAGE_VERSION = '1.11.0';
@@ -13,7 +13,7 @@
13
13
  * umhuellt, muss ihn weiterhin absetzen koennen.
14
14
  */
15
15
  import type { PdfOrData, TransportBodyFields, TransportCallOptions } from './transport.js';
16
- export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCashregisterReport", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations", "createVariantGroup", "updateVariantGroup", "getVariantGroup", "listVariantGroups", "addVariant", "createStocktake", "listStocktakes", "getStocktake", "listStocktakeItems", "recordStocktakeCount", "voidStocktakeCount", "listStocktakeCounts", "reviewStocktake", "recountStocktake", "closeStocktake", "cancelStocktake", "getStocktakePdf", "listMyStocktakes", "listMyStocktakeItems", "listMyStocktakeCounts", "recordMyStocktakeCount", "voidMyStocktakeCount"];
16
+ export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCashregisterReport", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations", "createVariantGroup", "updateVariantGroup", "getVariantGroup", "listVariantGroups", "addVariant", "createStocktake", "listStocktakes", "getStocktake", "listStocktakeItems", "recordStocktakeCount", "voidStocktakeCount", "listStocktakeCounts", "reviewStocktake", "recountStocktake", "closeStocktake", "cancelStocktake", "getStocktakePdf", "listMyStocktakes", "listMyStocktakeItems", "listMyStocktakeCounts", "recordMyStocktakeCount", "voidMyStocktakeCount", "getMyDrawerState", "openMyShift", "recordMyCashMovement", "logMyDrawerOpenings", "getMyShiftReport", "closeMyShift"];
17
17
  export type ApiCall = typeof ALL_CALLS[number];
18
18
  /**
19
19
  * Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
@@ -28,7 +28,7 @@ export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "can
28
28
  * `endpoints.register`. Sechs davon sind zugleich oeffentlich; die Kasse ruft
29
29
  * sie trotzdem ueber diesen Weg (ein Dialekt je Client, Nachtrag §5.2).
30
30
  */
31
- export declare const POS_CALLS: readonly ["pairRegisterDevice", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "registerUserLogin", "registerPinLogin", "renewRegisterSession", "endRegisterSession", "unpairRegisterDevice", "listMyCashregisters", "listMyReceipts", "getReceipt", "createReceipt", "generateFullReceiptId", "cancelReceipt", "sendReceiptEmail", "listMyArticleGroups", "listMyArticles", "getKasseSettings", "setMyKasseSettings", "setMyKasseLogo", "setMyRegisterDeviceSettings", "listMyPrinters", "createPrintJob", "getPrintJob", "listMyTipRecipients", "listMyStockLocations", "listMyStock", "setMyCashregisterStockLocation", "listMyStocktakes", "listMyStocktakeItems", "listMyStocktakeCounts", "recordMyStocktakeCount", "voidMyStocktakeCount"];
31
+ export declare const POS_CALLS: readonly ["pairRegisterDevice", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "registerUserLogin", "registerPinLogin", "renewRegisterSession", "endRegisterSession", "unpairRegisterDevice", "listMyCashregisters", "listMyReceipts", "getReceipt", "createReceipt", "generateFullReceiptId", "cancelReceipt", "sendReceiptEmail", "listMyArticleGroups", "listMyArticles", "getKasseSettings", "setMyKasseSettings", "setMyKasseLogo", "setMyRegisterDeviceSettings", "listMyPrinters", "createPrintJob", "getPrintJob", "listMyTipRecipients", "listMyStockLocations", "listMyStock", "setMyCashregisterStockLocation", "listMyStocktakes", "listMyStocktakeItems", "listMyStocktakeCounts", "recordMyStocktakeCount", "voidMyStocktakeCount", "getMyDrawerState", "openMyShift", "recordMyCashMovement", "logMyDrawerOpenings", "getMyShiftReport", "closeMyShift"];
32
32
  export type PublicCall = typeof PUBLIC_CALLS[number];
33
33
  export type PosCall = typeof POS_CALLS[number];
34
34
  /**
@@ -49,7 +49,7 @@ export type PosCall = typeof POS_CALLS[number];
49
49
  * [ALL_CALLS], [PUBLIC_CALLS] und [POS_CALLS] steht entweder hier oder in
50
50
  * [CALLS_WITHOUT_EFFECT] (Waechter `test/ausgang-einordnung.test.ts`).
51
51
  */
52
- export declare const UNKNOWN_OUTCOME_CALLS: readonly ["activateCashregister", "addVariant", "cancelInvoice", "cancelReceipt", "cancelStocktake", "changeStockCondition", "closeStocktake", "createArticle", "createCreditNote", "createCustomer", "createCustomerCashregister", "createInvoiceItem", "createPartnerCustomer", "createPartnerWebhook", "createPrintJob", "createReceipt", "createReservation", "createStocktake", "createVariantGroup", "createWebhook", "deactivateArticle", "deletePartnerWebhook", "deleteWebhook", "extendReservation", "financeWebService", "hobexPayApi", "hobexRefundApi", "issueInvoice", "pairRegisterDevice", "receiveGoods", "recordInvoicePayment", "recordMyStocktakeCount", "recordStockLoss", "recordStocktakeCount", "recountStocktake", "releaseReservation", "reportCustomerContract", "requestCustomerSignature", "reverseStockMovement", "reviewStocktake", "revokeCustomerMandate", "rotatePartnerWebhookSecret", "rotateWebhookSecret", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "sendWebhookTest", "setCustomerMandate", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "transferStock", "unpairRegisterDevice", "updateArticle", "updateCustomer", "updateInvoiceItem", "updatePartnerWebhook", "updateVariantGroup", "updateWebhook", "voidMyStocktakeCount", "voidStocktakeCount", "withdrawInvoiceItem"];
52
+ export declare const UNKNOWN_OUTCOME_CALLS: readonly ["activateCashregister", "addVariant", "cancelInvoice", "cancelReceipt", "cancelStocktake", "changeStockCondition", "closeMyShift", "closeStocktake", "createArticle", "createCreditNote", "createCustomer", "createCustomerCashregister", "createInvoiceItem", "createPartnerCustomer", "createPartnerWebhook", "createPrintJob", "createReceipt", "createReservation", "createStocktake", "createVariantGroup", "createWebhook", "deactivateArticle", "deletePartnerWebhook", "deleteWebhook", "extendReservation", "financeWebService", "hobexPayApi", "hobexRefundApi", "issueInvoice", "logMyDrawerOpenings", "openMyShift", "pairRegisterDevice", "receiveGoods", "recordInvoicePayment", "recordMyCashMovement", "recordMyStocktakeCount", "recordStockLoss", "recordStocktakeCount", "recountStocktake", "releaseReservation", "reportCustomerContract", "requestCustomerSignature", "reverseStockMovement", "reviewStocktake", "revokeCustomerMandate", "rotatePartnerWebhookSecret", "rotateWebhookSecret", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "sendWebhookTest", "setCustomerMandate", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "transferStock", "unpairRegisterDevice", "updateArticle", "updateCustomer", "updateInvoiceItem", "updatePartnerWebhook", "updateVariantGroup", "updateWebhook", "voidMyStocktakeCount", "voidStocktakeCount", "withdrawInvoiceItem"];
53
53
  /** Warum ein Aufruf keine Wirkung hat, die ein Zeitlimit offen lassen koennte. */
54
54
  export type CallWithoutEffectReason = 'read' | 'repeatable';
55
55
  /**
@@ -85,10 +85,10 @@ export declare const CALLS_WITHOUT_EFFECT: Readonly<Record<string, CallWithoutEf
85
85
  * absetzt, sagt es mit `hasEffect: true`.
86
86
  */
87
87
  export declare function isUnknownOutcomeCall(name: string): boolean;
88
- /** Einer der 33 Aufrufe des Kassenwegs. */
88
+ /** Einer der 39 Aufrufe des Kassenwegs. */
89
89
  export declare function isPosCall(name: string): boolean;
90
90
  /**
91
- * Nur ueber den Kassenweg erreichbar (27 Namen): unter `api.kasseneck.at/v3`
91
+ * Nur ueber den Kassenweg erreichbar (33 Namen): unter `api.kasseneck.at/v3`
92
92
  * gibt es sie nicht. Der Transport schickt sie darum ohne eigene Basis an
93
93
  * [POS_BASE_URL] statt an die oeffentliche Basis.
94
94
  */
@@ -125,6 +125,13 @@ export const ALL_CALLS = [
125
125
  'listMyStocktakeCounts',
126
126
  'recordMyStocktakeCount',
127
127
  'voidMyStocktakeCount',
128
+ // Schicht, Kassenstand und Lade-Protokoll an der Kasse (./pos)
129
+ 'getMyDrawerState',
130
+ 'openMyShift',
131
+ 'recordMyCashMovement',
132
+ 'logMyDrawerOpenings',
133
+ 'getMyShiftReport',
134
+ 'closeMyShift',
128
135
  ];
129
136
  /**
130
137
  * Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
@@ -288,6 +295,13 @@ export const POS_CALLS = [
288
295
  'listMyStocktakeCounts',
289
296
  'recordMyStocktakeCount',
290
297
  'voidMyStocktakeCount',
298
+ // Schicht, Kassenstand und Lade-Protokoll: nur ueber den Kassenweg.
299
+ 'getMyDrawerState',
300
+ 'openMyShift',
301
+ 'recordMyCashMovement',
302
+ 'logMyDrawerOpenings',
303
+ 'getMyShiftReport',
304
+ 'closeMyShift',
291
305
  ];
292
306
  /**
293
307
  * Die Aufrufe **mit Wirkung**, alphabetisch: sie legen etwas an, aendern oder
@@ -314,6 +328,7 @@ export const UNKNOWN_OUTCOME_CALLS = [
314
328
  'cancelReceipt',
315
329
  'cancelStocktake',
316
330
  'changeStockCondition',
331
+ 'closeMyShift',
317
332
  'closeStocktake',
318
333
  'createArticle',
319
334
  'createCreditNote',
@@ -336,9 +351,12 @@ export const UNKNOWN_OUTCOME_CALLS = [
336
351
  'hobexPayApi',
337
352
  'hobexRefundApi',
338
353
  'issueInvoice',
354
+ 'logMyDrawerOpenings',
355
+ 'openMyShift',
339
356
  'pairRegisterDevice',
340
357
  'receiveGoods',
341
358
  'recordInvoicePayment',
359
+ 'recordMyCashMovement',
342
360
  'recordMyStocktakeCount',
343
361
  'recordStockLoss',
344
362
  'recordStocktakeCount',
@@ -417,6 +435,8 @@ export const CALLS_WITHOUT_EFFECT = Object.freeze({
417
435
  getInvoiceSetupStatus: 'read',
418
436
  getInvoiceXml: 'read',
419
437
  getKasseSettings: 'read',
438
+ getMyDrawerState: 'read',
439
+ getMyShiftReport: 'read',
420
440
  getPartnerBilling: 'read',
421
441
  getPartnerBillingMonth: 'read',
422
442
  getPartnerCustomer: 'read',
@@ -481,12 +501,12 @@ export function isUnknownOutcomeCall(name) {
481
501
  const OEFFENTLICH = new Set(PUBLIC_CALLS);
482
502
  const KASSENWEG = new Set(POS_CALLS);
483
503
  const NUR_KASSE = new Set(POS_CALLS.filter((name) => !OEFFENTLICH.has(name)));
484
- /** Einer der 33 Aufrufe des Kassenwegs. */
504
+ /** Einer der 39 Aufrufe des Kassenwegs. */
485
505
  export function isPosCall(name) {
486
506
  return KASSENWEG.has(name);
487
507
  }
488
508
  /**
489
- * Nur ueber den Kassenweg erreichbar (27 Namen): unter `api.kasseneck.at/v3`
509
+ * Nur ueber den Kassenweg erreichbar (33 Namen): unter `api.kasseneck.at/v3`
490
510
  * gibt es sie nicht. Der Transport schickt sie darum ohne eigene Basis an
491
511
  * [POS_BASE_URL] statt an die oeffentliche Basis.
492
512
  */
@@ -272,6 +272,8 @@ export const PAYMENT_CALL_REJECTED_CODES = Object.freeze([
272
272
  'app_check_invalid',
273
273
  'unauthorized',
274
274
  'password_change_required', // Pflichtwechsel des Passworts offen: vor dem Handler abgewiesen
275
+ 'second_factor_required', // Anmeldung wartet auf die Bestaetigung in der Kasseneck-App: vor dem Handler abgewiesen
276
+ 'action_confirmation_required', // Aenderung wartet auf die Bestaetigung in der Kasseneck-App: vor dem Handler abgewiesen
275
277
  'mfa_required',
276
278
  'user_verification_failed',
277
279
  'admin_required',
@@ -1,5 +1,5 @@
1
1
  import { ReceiptType, type ReceiptTypeKey, KeckPaymentMethod, type KeckPaymentMethodKey } from '../enums/index.js';
2
- import { type Receipt, type ReceiptCompany, type ReceiptItem, type Voucher, type ReceiptSummary, type ReportMonth, type CancellationItem, type CancellationOf, type CancellationReason, type ReturnDisposition, type ReceiptPaymentInput, type RegistrationInfo, type ReceiptEmailVia } from '../models/index.js';
2
+ import { type Receipt, type ReceiptCompany, type ReceiptItem, type Voucher, type ReceiptSummary, type ReportMonth, type CancellationItem, type CancellationOf, type CancellationReason, type TipRefundSource, type ReturnDisposition, type ReceiptPaymentInput, type RegistrationInfo, type ReceiptEmailVia } from '../models/index.js';
3
3
  import type { InternerTransport } from './aufrufe.js';
4
4
  import { type ReceiptLayout } from '../receipt/layout.js';
5
5
  import type { PosPaperSize } from '../printing/escpos.js';
@@ -49,6 +49,12 @@ export interface ReceiptCommonOptions {
49
49
  * anteilig je Steuersatz). Nur auf `standard` und `training`.
50
50
  */
51
51
  tip?: number | TipOptions;
52
+ /**
53
+ * Lade, in deren Kassenstand der Beleg zaehlt (Schichtbetrieb, Geraete-
54
+ * Einstellung `drawerId`). Ohne Angabe gilt die Lade des Geraets bzw. die
55
+ * Hauptlade der Kasse. Leer oder kein Text: wirft vor dem Senden.
56
+ */
57
+ drawerId?: string;
52
58
  }
53
59
  /** Trinkgeld mit eigener Zahlart und/oder Empfaengern (Kassen-Benutzer-IDs, Summe = cents). */
54
60
  export interface TipOptions {
@@ -73,6 +79,15 @@ export interface TipOptions {
73
79
  * (ohne angemeldeten Kassen-Benutzer) gilt die Einschraenkung nicht.
74
80
  */
75
81
  receivedImmediately?: boolean;
82
+ /**
83
+ * Bar-Trinkgeld „gleich behalten“: die Mitarbeiterin steckt das Trinkgeld
84
+ * beim Verkauf gleich ein. Der Beleg bleibt, wie er ist (signiert, im DEP);
85
+ * nur im Kassenstand zaehlt der Betrag nicht ins Bar-Soll und gilt sofort als
86
+ * „schon genommen“. Nur `true` geht hinaus. Der Server nimmt es nur bei
87
+ * Mitarbeiter-Trinkgeld, bar und sofort erhalten; sonst faellt es still weg.
88
+ * Vorbelegung des Schalters: [posTipKeptByDefault] der Kassen-Einstellungen.
89
+ */
90
+ keptByEmployee?: boolean;
76
91
  }
77
92
  export interface TipRecipientShare {
78
93
  registerUserId: string;
@@ -135,6 +150,24 @@ export type CancelReceiptOptions = {
135
150
  * Kassenweg (Kanal `app`, `registerUserAuth`).
136
151
  */
137
152
  payments?: ReceiptPaymentInput[];
153
+ /** Lade, in deren Kassenstand der Storno zaehlt; wie bei [ReceiptCommonOptions.drawerId]. */
154
+ drawerId?: string;
155
+ /**
156
+ * Antwort auf „Trinkgeld auch zurueckgeben?“ (Schichten-Spec, Nachtrag 5). `false`: ohne das
157
+ * Mitarbeiter-Trinkgeld (ohne `items` = alle Restmengen ausser dem Trinkgeld); `true` mit `items`:
158
+ * das noch offene Trinkgeld kommt dazu. Fehlt = wie bisher (ein Vollstorno nimmt es mit). Die
159
+ * Positionen dazu rechnet [cancellationItemsForTip]. An einem Beleg mit Wertgutschein gibt es
160
+ * `false` nicht (`tip_keep_not_possible_with_voucher`, siehe [asksRefundTip]).
161
+ */
162
+ refundTip?: boolean;
163
+ /**
164
+ * Antwort auf „Woher kommt das Trinkgeld zurueck?“, nur bei Barrueckgabe ([asksTipRefundSource]):
165
+ * `drawer` aus der Lade, `employee` gibt die Mitarbeiterin direkt. Nicht zusammen mit
166
+ * `refundTip: false`. Der Server weist eine Quelle ohne Bargeld-Deckung ab
167
+ * (`tip_refund_source_requires_cash`). `refundTip: true` ohne Quelle heisst bei Barrueckgabe:
168
+ * aus der Lade (kein „gibt die Mitarbeiterin direkt“).
169
+ */
170
+ tipRefundSource?: TipRefundSource;
138
171
  } & ({
139
172
  receipt: Receipt;
140
173
  cashregisterId?: string;
@@ -1,5 +1,5 @@
1
1
  import { ReceiptType, KeckPaymentMethod, CreditCardProvider, VoucherAction, VoucherType, } from '../enums/index.js';
2
- import { fromReceiptCompanyPayload, fromReceiptPayload, toReceiptItemPayload, toVoucherPayload, receiptItemIsValid, voucherIsValid, fromReceiptSummaryPayload, isCancellationReason, isReturnDisposition, RETURN_DISPOSITIONS, RECEIPT_EMAIL_VIAS, readRegistrationInfo, } from '../models/index.js';
2
+ import { fromReceiptCompanyPayload, fromReceiptPayload, toReceiptItemPayload, toVoucherPayload, receiptItemIsValid, voucherIsValid, fromReceiptSummaryPayload, isCancellationReason, isReturnDisposition, RETURN_DISPOSITIONS, isTipRefundSource, TIP_REFUND_SOURCES, RECEIPT_EMAIL_VIAS, readRegistrationInfo, } from '../models/index.js';
3
3
  import { parseServerTimeStamp, toViennaWallClock } from '../vienna-time.js';
4
4
  import { euroToCents } from '../money.js';
5
5
  import { KasseneckValidationError, isKasseneckApiError, signiertGelesen } from './errors.js';
@@ -117,8 +117,18 @@ function createReceiptParams(options) {
117
117
  if (options.legalMessage != null) {
118
118
  params['legalMessage'] = options.legalMessage.join('\n');
119
119
  }
120
+ if (options.drawerId !== undefined) {
121
+ params['drawerId'] = ladeKennung('createReceipt', options.drawerId);
122
+ }
120
123
  return params;
121
124
  }
125
+ /** Die Lade eines Belegs: ein nicht leerer Text, sonst wirft der Aufruf vor dem Senden. */
126
+ function ladeKennung(name, wert) {
127
+ if (typeof wert !== 'string' || wert.trim() === '') {
128
+ throw new KasseneckValidationError(name, 'drawerId muss eine Kennung sein (oder weglassen)', 'request');
129
+ }
130
+ return wert;
131
+ }
122
132
  /** Felder des alten Einzel-Zahlungswegs; unter /v3 abgewiesen. */
123
133
  const ALTE_ZAHLFELDER = ['paymentMethod', 'paymentMethodFromServer', 'creditCardProvider', 'cardPaymentId', 'cardPaymentData'];
124
134
  /** Normalbeleg (Verkauf) nach RKSV. */
@@ -172,6 +182,15 @@ export async function cancelReceipt(transport, options) {
172
182
  if (options.note !== undefined && options.note.length > NOTE_MAX) {
173
183
  throw new KasseneckValidationError('cancelReceipt', `Anmerkung ist zu lang (hoechstens ${NOTE_MAX} Zeichen)`, 'request');
174
184
  }
185
+ if (options.refundTip !== undefined && typeof options.refundTip !== 'boolean') {
186
+ throw new KasseneckValidationError('cancelReceipt', 'refundTip muss true oder false sein (oder weglassen)', 'request');
187
+ }
188
+ if (options.tipRefundSource !== undefined && !isTipRefundSource(options.tipRefundSource)) {
189
+ throw new KasseneckValidationError('cancelReceipt', `tipRefundSource: erlaubt sind ${TIP_REFUND_SOURCES.join(', ')}`, 'request');
190
+ }
191
+ if (options.tipRefundSource !== undefined && options.refundTip === false) {
192
+ throw new KasseneckValidationError('cancelReceipt', 'tipRefundSource nur, wenn das Trinkgeld zurueckgeht (refundTip nicht false)', 'request');
193
+ }
175
194
  const altfeld = ALTE_ZAHLFELDER.find((feld) => options[feld] != null);
176
195
  if (altfeld != null) {
177
196
  throw new KasseneckValidationError('cancelReceipt', `${altfeld} gibt es unter /v3 nicht mehr: Rueckzahlungen gehen als payments hinaus.`, 'request');
@@ -194,6 +213,12 @@ export async function cancelReceipt(transport, options) {
194
213
  params.note = options.note;
195
214
  if (zahlungen !== undefined)
196
215
  params.payments = zahlungen;
216
+ if (options.drawerId !== undefined)
217
+ params.drawerId = ladeKennung('cancelReceipt', options.drawerId);
218
+ if (options.refundTip !== undefined)
219
+ params.refundTip = options.refundTip;
220
+ if (options.tipRefundSource !== undefined)
221
+ params.tipRefundSource = options.tipRefundSource;
197
222
  const daten = await transport('cancelReceipt', params);
198
223
  return signiertGelesen('cancelReceipt', () => stornoAusHuelle(daten));
199
224
  }
@@ -514,6 +539,14 @@ function gepruefterTip(tip) {
514
539
  }
515
540
  nutzlast['receivedImmediately'] = tip.receivedImmediately;
516
541
  }
542
+ if (tip.keptByEmployee != null) {
543
+ if (typeof tip.keptByEmployee !== 'boolean') {
544
+ throw eingabefehler('Trinkgeld: keptByEmployee muss true oder false sein.');
545
+ }
546
+ // `false` ist dasselbe wie weglassen: die Nutzlast bleibt wie bisher.
547
+ if (tip.keptByEmployee)
548
+ nutzlast['keptByEmployee'] = true;
549
+ }
517
550
  if (tip.recipients != null) {
518
551
  if (!Array.isArray(tip.recipients) || tip.recipients.length === 0) {
519
552
  throw eingabefehler('Trinkgeld: recipients darf nicht leer sein.');
@@ -538,7 +571,7 @@ function gepruefterTip(tip) {
538
571
  }
539
572
  return nutzlast;
540
573
  }
541
- const TIP_FELDER = ['cents', 'paymentMethod', 'recipients', 'receivedImmediately'];
574
+ const TIP_FELDER = ['cents', 'paymentMethod', 'recipients', 'receivedImmediately', 'keptByEmployee'];
542
575
  /**
543
576
  * Zahlungsart des Aufrufers pruefen — unbekannt wirft, bevor etwas rausgeht.
544
577
  * `mixed` wirft ebenfalls: den Wert vergibt nur der Server (Beleg mit
@@ -60,10 +60,10 @@ export type CashregisterReportPeriod = {
60
60
  end: string;
61
61
  };
62
62
  /**
63
- * Kassenbericht als PDF (v2) fuer einen abgeschlossenen Monat, einen Tag bis
64
- * heute oder einen Zeitraum (`end` ausschliesslich, hoechstens 366 Tage).
65
- * Laufender Monat und Zukunft liefern die Fehler `period_not_closed` bzw.
66
- * `period_in_future`. Nachfolger von [downloadMonthlyReport] und
63
+ * Kassenbericht als PDF (v2) fuer einen abgeschlossenen Monat, einen
64
+ * abgeschlossenen Tag (gestern oder frueher) oder einen Zeitraum (`end`
65
+ * ausschliesslich, hoechstens 366 Tage). Laufender Monat und heutiger Tag
66
+ * liefern `period_not_closed`, die Zukunft `period_in_future`. Nachfolger von [downloadMonthlyReport] und
67
67
  * [downloadDailyReport].
68
68
  */
69
69
  export declare function getCashregisterReport(transport: InternerBinaerTransport, options: CashregisterReportPeriod): Promise<Uint8Array>;
@@ -71,10 +71,10 @@ export async function downloadMonthlyReport(transport, reportMonth) {
71
71
  return transport('downloadReport', { month, year });
72
72
  }
73
73
  /**
74
- * Kassenbericht als PDF (v2) fuer einen abgeschlossenen Monat, einen Tag bis
75
- * heute oder einen Zeitraum (`end` ausschliesslich, hoechstens 366 Tage).
76
- * Laufender Monat und Zukunft liefern die Fehler `period_not_closed` bzw.
77
- * `period_in_future`. Nachfolger von [downloadMonthlyReport] und
74
+ * Kassenbericht als PDF (v2) fuer einen abgeschlossenen Monat, einen
75
+ * abgeschlossenen Tag (gestern oder frueher) oder einen Zeitraum (`end`
76
+ * ausschliesslich, hoechstens 366 Tage). Laufender Monat und heutiger Tag
77
+ * liefern `period_not_closed`, die Zukunft `period_in_future`. Nachfolger von [downloadMonthlyReport] und
78
78
  * [downloadDailyReport].
79
79
  */
80
80
  export async function getCashregisterReport(transport, options) {
@@ -1,5 +1,5 @@
1
1
  export { ReceiptType, type ReceiptTypeKey, VatRate, type VatRateKey, KeckPaymentMethod, type KeckPaymentMethodKey, CreditCardProvider, type CreditCardProviderKey, VoucherType, type VoucherTypeKey, VoucherAction, type VoucherActionKey, StripeLinkMode, type StripeLinkModeKey, } from './enums/index.js';
2
- export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type RegistrationInfo, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, type CancellationErrorCode, type CancellationStatus, type ReturnDisposition, RETURN_DISPOSITIONS, CANCELLATION_REASONS, CANCELLATION_STATUSES, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isReturnDisposition, isCancellationErrorCode, cancellationErrorCode, isCancellationError, cancellationFieldErrors, type CancellationFieldError, type ReceiptPayment, type ReceiptPaymentPayload, type ReceiptPaymentInput, fromReceiptPaymentPayload, toReceiptPaymentPayload, type PaymentErrorCode, PAYMENT_ERROR_CODES, isPaymentErrorCode, paymentErrorCode, isPaymentError, paymentFieldErrors, type PaymentFieldError, type ReceiptEmailErrorCode, type ReceiptEmailVia, RECEIPT_EMAIL_ERROR_CODES, RECEIPT_EMAIL_SEND_ERROR_CODES, type ReceiptEmailSendErrorCode, RECEIPT_EMAIL_VIAS, isReceiptEmailErrorCode, receiptEmailErrorCode, isReceiptEmailError, receiptEmailFieldErrors, type ReceiptEmailFieldError, type ReceiptErrorCode, type ReceiptFieldError, RECEIPT_ERROR_CODES, isReceiptErrorCode, receiptErrorCode, isReceiptError, receiptFieldErrors, remainingQuantities, type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, type CashregisterAutoLogout, type CashregisterAutoLogoutPayload, fromCashregisterPayload, type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, isZeroKind, type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
2
+ export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type RegistrationInfo, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, type CancellationErrorCode, type CancellationStatus, type ReturnDisposition, RETURN_DISPOSITIONS, CANCELLATION_REASONS, CANCELLATION_STATUSES, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isReturnDisposition, isCancellationErrorCode, cancellationErrorCode, isCancellationError, cancellationFieldErrors, type CancellationFieldError, type ReceiptPayment, type ReceiptPaymentPayload, type ReceiptPaymentInput, fromReceiptPaymentPayload, toReceiptPaymentPayload, type PaymentErrorCode, PAYMENT_ERROR_CODES, isPaymentErrorCode, paymentErrorCode, isPaymentError, paymentFieldErrors, type PaymentFieldError, type ReceiptEmailErrorCode, type ReceiptEmailVia, RECEIPT_EMAIL_ERROR_CODES, RECEIPT_EMAIL_SEND_ERROR_CODES, type ReceiptEmailSendErrorCode, RECEIPT_EMAIL_VIAS, isReceiptEmailErrorCode, receiptEmailErrorCode, isReceiptEmailError, receiptEmailFieldErrors, type ReceiptEmailFieldError, type ReceiptErrorCode, type ReceiptFieldError, RECEIPT_ERROR_CODES, isReceiptErrorCode, receiptErrorCode, isReceiptError, receiptFieldErrors, remainingQuantities, TIP_REFUND_SOURCES, type TipRefundSource, isTipRefundSource, openStaffTipCents, cancellationItemsForTip, cancellationCashRefundCents, asksTipRefundSource, asksRefundTip, type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, type CashregisterAutoLogout, type CashregisterAutoLogoutPayload, fromCashregisterPayload, type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, isZeroKind, type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
3
3
  export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, POS_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type TransportCallOptions, type KasseneckTransport, type KasseneckBinaryTransport, type KasseneckPdfOrDataTransport, type PdfOrData, ALL_CALLS, type ApiCall, PUBLIC_CALLS, POS_CALLS, UNKNOWN_OUTCOME_CALLS, type PublicCall, type PosCall, createTransport, createBinaryTransport, createPdfOrDataTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, type ErrorOutcome, CLIENT_ERROR_CODES, type ClientErrorCode, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, isOutcomeUnknown, type ReceiptCommonOptions, type SellReceiptOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type CancelReceiptResult, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, paymentsExpectedCents, cardRefundReference, receiptLayoutFromResult, cancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, listMyCashregisters, checkVoucherCombinationError, type SendReceiptEmailOptions, type SendReceiptEmailResult, sendReceiptEmail, downloadDailyReport, downloadMonthlyReport, getCashregisterReport, type CashregisterReportPeriod, getReportV2, type ReportV2, type ReportV2Metadata, type ReportV2Options, type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, type KasseneckApi, createKasseneckApi, } from './client/index.js';
4
4
  export { type ReceiptDueTip, type ReceiptDueTipRecipient, type ReceiptDueOptions, type ReceiptDueBuckets, type ReceiptDueBreakdown, type ReceiptDueErrorReason, receiptDueCents, receiptDueBreakdown, ReceiptDueError, RECEIPT_DUE_ERROR_REASONS, isReceiptDueError, } from './receipt/due.js';
5
5
  export { parseServerTimeStamp, toViennaWallClock, type ViennaWallClock } from './vienna-time.js';
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { ReceiptType, VatRate, KeckPaymentMethod, CreditCardProvider, VoucherType, VoucherAction, StripeLinkMode, } from './enums/index.js';
2
- export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, isTipItem, toVoucherPayload, fromVoucherPayload, voucherIsValid, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, RETURN_DISPOSITIONS, CANCELLATION_REASONS, CANCELLATION_STATUSES, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isReturnDisposition, isCancellationErrorCode, cancellationErrorCode, isCancellationError, cancellationFieldErrors, fromReceiptPaymentPayload, toReceiptPaymentPayload, PAYMENT_ERROR_CODES, isPaymentErrorCode, paymentErrorCode, isPaymentError, paymentFieldErrors, RECEIPT_EMAIL_ERROR_CODES, RECEIPT_EMAIL_SEND_ERROR_CODES, RECEIPT_EMAIL_VIAS, isReceiptEmailErrorCode, receiptEmailErrorCode, isReceiptEmailError, receiptEmailFieldErrors, RECEIPT_ERROR_CODES, isReceiptErrorCode, receiptErrorCode, isReceiptError, receiptFieldErrors, remainingQuantities, fromReceiptCompanyPayload, receiptCompanyTaxInfo, fromCashregisterPayload, fromReceiptSummaryPayload, ZERO_KINDS, isZeroKind, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
2
+ export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, isTipItem, toVoucherPayload, fromVoucherPayload, voucherIsValid, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, RETURN_DISPOSITIONS, CANCELLATION_REASONS, CANCELLATION_STATUSES, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isReturnDisposition, isCancellationErrorCode, cancellationErrorCode, isCancellationError, cancellationFieldErrors, fromReceiptPaymentPayload, toReceiptPaymentPayload, PAYMENT_ERROR_CODES, isPaymentErrorCode, paymentErrorCode, isPaymentError, paymentFieldErrors, RECEIPT_EMAIL_ERROR_CODES, RECEIPT_EMAIL_SEND_ERROR_CODES, RECEIPT_EMAIL_VIAS, isReceiptEmailErrorCode, receiptEmailErrorCode, isReceiptEmailError, receiptEmailFieldErrors, RECEIPT_ERROR_CODES, isReceiptErrorCode, receiptErrorCode, isReceiptError, receiptFieldErrors, remainingQuantities, TIP_REFUND_SOURCES, isTipRefundSource, openStaffTipCents, cancellationItemsForTip, cancellationCashRefundCents, asksTipRefundSource, asksRefundTip, fromReceiptCompanyPayload, receiptCompanyTaxInfo, fromCashregisterPayload, fromReceiptSummaryPayload, ZERO_KINDS, isZeroKind, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
3
3
  export { apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, POS_BASE_URL, DEFAULT_TIMEOUT_MS, ALL_CALLS, PUBLIC_CALLS, POS_CALLS, UNKNOWN_OUTCOME_CALLS, createTransport, createBinaryTransport, createPdfOrDataTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, CLIENT_ERROR_CODES, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, isOutcomeUnknown, sellReceipt, sellReceiptWithCompany, paymentsExpectedCents, cardRefundReference, receiptLayoutFromResult, cancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, listMyCashregisters, checkVoucherCombinationError, sendReceiptEmail, downloadDailyReport, downloadMonthlyReport, getCashregisterReport, getReportV2, getCashboxStatus, getSignatureStatus, createKasseneckApi, } from './client/index.js';
4
4
  export { receiptDueCents, receiptDueBreakdown, ReceiptDueError, RECEIPT_DUE_ERROR_REASONS, isReceiptDueError, } from './receipt/due.js';
5
5
  export { parseServerTimeStamp, toViennaWallClock } from './vienna-time.js';