@kreiseck/kasseneck-api 1.20.0 → 1.21.1

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 (57) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/client/aufrufe.d.ts +4 -3
  3. package/dist/cjs/client/aufrufe.js +9 -2
  4. package/dist/cjs/client/dep-export.d.ts +1 -1
  5. package/dist/cjs/client/dep-export.js +1 -0
  6. package/dist/cjs/client/transport.d.ts +4 -4
  7. package/dist/cjs/client/transport.js +3 -3
  8. package/dist/cjs/pos/dep.d.ts +10 -0
  9. package/dist/cjs/pos/dep.js +27 -0
  10. package/dist/cjs/pos/index.d.ts +1 -0
  11. package/dist/cjs/pos/index.js +5 -2
  12. package/dist/cjs/pos/texte.d.ts +109 -0
  13. package/dist/cjs/pos/texte.js +42 -0
  14. package/dist/cjs/receipt/gutschein-plan.js +6 -1
  15. package/dist/cjs/stored/vokabular.d.ts +1 -1
  16. package/dist/cjs/stored/vokabular.js +1 -1
  17. package/dist/cjs/version.d.ts +1 -1
  18. package/dist/cjs/version.js +1 -1
  19. package/dist/esm/client/aufrufe.d.ts +4 -3
  20. package/dist/esm/client/aufrufe.js +9 -2
  21. package/dist/esm/client/dep-export.d.ts +1 -1
  22. package/dist/esm/client/dep-export.js +1 -0
  23. package/dist/esm/client/transport.d.ts +4 -4
  24. package/dist/esm/client/transport.js +3 -3
  25. package/dist/esm/pos/dep.d.ts +10 -0
  26. package/dist/esm/pos/dep.js +24 -0
  27. package/dist/esm/pos/index.d.ts +1 -0
  28. package/dist/esm/pos/index.js +2 -0
  29. package/dist/esm/pos/texte.d.ts +109 -0
  30. package/dist/esm/pos/texte.js +42 -0
  31. package/dist/esm/receipt/gutschein-plan.js +6 -1
  32. package/dist/esm/stored/vokabular.d.ts +1 -1
  33. package/dist/esm/stored/vokabular.js +1 -1
  34. package/dist/esm/version.d.ts +1 -1
  35. package/dist/esm/version.js +1 -1
  36. package/fixtures/dep-folder-cases.json +14 -0
  37. package/fixtures/hobex-hps-codes.json +1 -1
  38. package/fixtures/invoice-api.schema.json +1 -1
  39. package/fixtures/invoice-texts.json +1 -1
  40. package/fixtures/pos-message-cases.json +9 -0
  41. package/fixtures/pos-texts.json +127 -1
  42. package/fixtures/receipt-due-voucher-generated.json +6 -2
  43. package/fixtures/surface.json +12 -2
  44. package/fixtures/v3/antworten/belege.json +1 -1
  45. package/fixtures/v3/antworten/belegmail.json +1 -1
  46. package/fixtures/v3/antworten/berichte.json +1 -1
  47. package/fixtures/v3/antworten/kasse-belege.json +1 -1
  48. package/fixtures/v3/antworten/kasse.json +802 -3
  49. package/fixtures/v3/antworten/lager.json +1 -1
  50. package/fixtures/v3/antworten/rechnungen.json +1 -1
  51. package/fixtures/v3/antworten/storno.json +1 -1
  52. package/fixtures/v3/stored/belege.json +1 -1
  53. package/fixtures/v3/stored/kasse.json +153 -6
  54. package/fixtures/v3/stored/rechnungen.json +1 -1
  55. package/fixtures/v3/v3-vokabular.json +81 -3
  56. package/fixtures/v3/zahlbetrag-faelle.json +1 -1
  57. package/package.json +1 -1
@@ -14,6 +14,7 @@ export { distributeDiscount } from '../receipt/discount.js';
14
14
  export { cancelScopeOf, receiptsScopeOf, stockViewOf, voucherPermsOf, type VoucherPerms, type RegisterScope, type RegisterUserPerms } from '../register/pairing.js';
15
15
  export { type NetworkPrinter, type PrintJob, type PrintJobStatus, PRINT_JOB_STATUSES, type PrintJobSource, PRINT_JOB_SOURCES, isPrintJobFinished, type CreatePrintJobOptions, listMyPrinters, createPrintJob, getPrintJob, } from './drucker.js';
16
16
  export { listMyTipRecipients } from './trinkgeld.js';
17
+ export { depFolderName } from './dep.js';
17
18
  export { STOCK_LOCATION_TYPES, type StockLocationType, type StockLocation, type StockLocationAddress, type StockLevel, type StockValue, type StockList, type ListMyStockOptions, type SetMyCashregisterStockLocationOptions, type CashregisterStockLocation, listMyStockLocations, listMyStock, setMyCashregisterStockLocation, } from './lager.js';
18
19
  export { type ListMyStocktakesOptions, type ListMyStocktakeItemsOptions, type ListMyStocktakeCountsOptions, type RecordMyStocktakeCountOptions, type VoidMyStocktakeCountOptions, listMyStocktakes, listMyStocktakeItems, listMyStocktakeCounts, recordMyStocktakeCount, voidMyStocktakeCount, parseQuantityMilli, } from './inventur.js';
19
20
  export type { Stocktake, StocktakeItem, StocktakeCount, StocktakeCountResult, StocktakeItemPage, StocktakeCountPage, StocktakeActor, StocktakeProgress, StocktakeReview, StocktakeRecount, StocktakeScope, } from '../inventory/typen.js';
@@ -18,6 +18,8 @@ export { distributeDiscount } from '../receipt/discount.js';
18
18
  export { cancelScopeOf, receiptsScopeOf, stockViewOf, voucherPermsOf } from '../register/pairing.js';
19
19
  export { PRINT_JOB_STATUSES, PRINT_JOB_SOURCES, isPrintJobFinished, listMyPrinters, createPrintJob, getPrintJob, } from './drucker.js';
20
20
  export { listMyTipRecipients } from './trinkgeld.js';
21
+ // Prüfung (DEP) an der Kasse: Ordner auf dem USB-Stick (gleich in Web-Kasse und Kassen-App).
22
+ export { depFolderName } from './dep.js';
21
23
  export { STOCK_LOCATION_TYPES, listMyStockLocations, listMyStock, setMyCashregisterStockLocation, } from './lager.js';
22
24
  export { listMyStocktakes, listMyStocktakeItems, listMyStocktakeCounts, recordMyStocktakeCount, voidMyStocktakeCount, parseQuantityMilli, } from './inventur.js';
23
25
  // Gutschein pruefen und Etikett nachdrucken an der Kasse; Gutschein-Sorten (Stufe 4b, 1.17.0).
@@ -802,6 +802,47 @@ declare const MELDUNGEN_ROH: {
802
802
  readonly text: "Es fehlen {amount} bis zum Wechselgeld von {total}.";
803
803
  readonly placeholders: readonly ["amount", "total"];
804
804
  };
805
+ readonly 'dep.manager_only': {
806
+ readonly text: "Den Export für die Prüfung macht der Chef. Ist er nicht da, darf die Behörde bis zu zwei Werktage warten.";
807
+ };
808
+ readonly 'dep.offline': {
809
+ readonly text: "Ohne Internet ist kein Export möglich. Die Behörde muss dann bis zu zwei Werktage warten; der Export geht später hier oder unter mein.kasseneck.at.";
810
+ };
811
+ readonly 'dep.creating': {
812
+ readonly text: "Wird erstellt …";
813
+ };
814
+ readonly 'dep.running': {
815
+ readonly text: "Für diese Kasse läuft schon ein Export. Bitte kurz warten, er wird gleich fertig.";
816
+ };
817
+ readonly 'dep.failed': {
818
+ readonly text: "Der Export ist fehlgeschlagen. Bitte erneut erstellen.";
819
+ };
820
+ readonly 'dep.too_many_exports': {
821
+ readonly text: "Heute sind an diesem Konto keine weiteren Exporte möglich – morgen geht es wieder. Ein schon erstellter Export bleibt nutzbar.";
822
+ };
823
+ readonly 'dep.period_invalid': {
824
+ readonly text: "Bitte einen gültigen Zeitraum wählen: „Von“ nicht in der Zukunft, „Bis“ nicht vor „Von“.";
825
+ };
826
+ readonly 'dep.usb_hint': {
827
+ readonly text: "USB-Stick anstecken (FAT32 oder exFAT). Der Prüfer behält den Stick.";
828
+ };
829
+ readonly 'dep.saved': {
830
+ readonly text: "Gespeichert im Ordner {folder}.";
831
+ readonly placeholders: readonly ["folder"];
832
+ };
833
+ readonly 'dep.save_failed': {
834
+ readonly text: "Speichern hat nicht geklappt. Bitte den Stick prüfen und erneut speichern.";
835
+ };
836
+ readonly 'dep.zip_fallback': {
837
+ readonly text: "Dieser Browser kann keinen Ordner wählen – der Export kommt als ZIP-Datei in den Download-Ordner.";
838
+ readonly only: readonly ["web"];
839
+ };
840
+ readonly 'dep.code_once': {
841
+ readonly text: "Code und QR-Code gibt es nur auf diesem Bildschirm. Wer zurückgeht, erstellt beim nächsten Mal einen neuen Link.";
842
+ };
843
+ readonly 'dep.revoked': {
844
+ readonly text: "Der Link ist widerrufen.";
845
+ };
805
846
  readonly 'app.not_in_browser': {
806
847
  readonly text: "Die Kassen-App läuft nicht im Browser – dafür gibt es kasse.kasseneck.at.";
807
848
  readonly only: readonly ["app"];
@@ -935,6 +976,18 @@ export declare const ERROR_CODE_RULES: readonly [{
935
976
  readonly kind: "api";
936
977
  readonly codes: readonly ["drawer_inactive"];
937
978
  readonly key: "drawer.inactive";
979
+ }, {
980
+ readonly kind: "api";
981
+ readonly codes: readonly ["manager_only"];
982
+ readonly key: "dep.manager_only";
983
+ }, {
984
+ readonly kind: "api";
985
+ readonly codes: readonly ["export_running"];
986
+ readonly key: "dep.running";
987
+ }, {
988
+ readonly kind: "api";
989
+ readonly codes: readonly ["too_many_exports"];
990
+ readonly key: "dep.too_many_exports";
938
991
  }];
939
992
  /**
940
993
  * Regeln je Ausgang, nach den Code-Regeln und vor der Regel der Art: eine
@@ -1848,6 +1901,9 @@ declare const BESCHRIFTUNGEN_ROH: {
1848
1901
  readonly 'nav.stocktake': {
1849
1902
  readonly text: "Inventur";
1850
1903
  };
1904
+ readonly 'nav.dep': {
1905
+ readonly text: "Prüfung (DEP)";
1906
+ };
1851
1907
  readonly 'nav.settings': {
1852
1908
  readonly text: "Einstellungen";
1853
1909
  };
@@ -2133,6 +2189,59 @@ declare const BESCHRIFTUNGEN_ROH: {
2133
2189
  readonly 'receipt.output_failed': {
2134
2190
  readonly text: "fehlgeschlagen";
2135
2191
  };
2192
+ readonly 'dep.title': {
2193
+ readonly text: "Prüfung (DEP)";
2194
+ };
2195
+ readonly 'dep.period': {
2196
+ readonly text: "Zeitraum";
2197
+ };
2198
+ readonly 'dep.period_all': {
2199
+ readonly text: "Alles seit Inbetriebnahme";
2200
+ };
2201
+ readonly 'dep.period_year': {
2202
+ readonly text: "Ein Jahr";
2203
+ };
2204
+ readonly 'dep.period_quarter': {
2205
+ readonly text: "Ein Quartal";
2206
+ };
2207
+ readonly 'dep.period_custom': {
2208
+ readonly text: "Eigener Zeitraum";
2209
+ };
2210
+ readonly 'dep.from': {
2211
+ readonly text: "Von";
2212
+ };
2213
+ readonly 'dep.to': {
2214
+ readonly text: "Bis";
2215
+ };
2216
+ readonly 'dep.create': {
2217
+ readonly text: "Export erstellen";
2218
+ };
2219
+ readonly 'dep.receipts': {
2220
+ readonly text: "{count} Belege";
2221
+ readonly placeholders: readonly ["count"];
2222
+ };
2223
+ readonly 'dep.save_usb': {
2224
+ readonly text: "Auf USB-Stick speichern";
2225
+ };
2226
+ readonly 'dep.handover_link': {
2227
+ readonly text: "Link für den Prüfer";
2228
+ };
2229
+ readonly 'dep.code': {
2230
+ readonly text: "Code";
2231
+ };
2232
+ readonly 'dep.valid_until': {
2233
+ readonly text: "gültig bis {date}";
2234
+ readonly placeholders: readonly ["date"];
2235
+ };
2236
+ readonly 'dep.revoke': {
2237
+ readonly text: "Widerrufen";
2238
+ };
2239
+ readonly 'dep.checksum': {
2240
+ readonly text: "Prüfsumme (SHA-256)";
2241
+ };
2242
+ readonly 'dep.new_export': {
2243
+ readonly text: "Neuer Export";
2244
+ };
2136
2245
  };
2137
2246
  export type LabelKey = keyof typeof BESCHRIFTUNGEN_ROH;
2138
2247
  export declare const LABELS: Record<LabelKey, TextEntry>;
@@ -385,6 +385,22 @@ const MELDUNGEN_ROH = {
385
385
  // Wechselgeld der Lade (1.11.0): beim Öffnen der Schicht liegt weniger in der Lade als eingestellt.
386
386
  // `{amount}` was fehlt, `{total}` das eingestellte Wechselgeld, beide samt Euro-Zeichen.
387
387
  'shift.change_float_missing': { text: 'Es fehlen {amount} bis zum Wechselgeld von {total}.', placeholders: ['amount', 'total'] },
388
+ // --- Prüfung (DEP) bei der Kassennachschau ---------------------------------
389
+ // Nur der Chef exportiert (Inhaber oder Recht „Einstellungen“); ein Kassier
390
+ // sieht nur den Hinweis. Ohne Internet gilt die Frist von zwei Werktagen.
391
+ 'dep.manager_only': { text: 'Den Export für die Prüfung macht der Chef. Ist er nicht da, darf die Behörde bis zu zwei Werktage warten.' },
392
+ 'dep.offline': { text: 'Ohne Internet ist kein Export möglich. Die Behörde muss dann bis zu zwei Werktage warten; der Export geht später hier oder unter mein.kasseneck.at.' },
393
+ 'dep.creating': { text: 'Wird erstellt …' },
394
+ 'dep.running': { text: 'Für diese Kasse läuft schon ein Export. Bitte kurz warten, er wird gleich fertig.' },
395
+ 'dep.failed': { text: 'Der Export ist fehlgeschlagen. Bitte erneut erstellen.' },
396
+ 'dep.too_many_exports': { text: 'Heute sind an diesem Konto keine weiteren Exporte möglich – morgen geht es wieder. Ein schon erstellter Export bleibt nutzbar.' },
397
+ 'dep.period_invalid': { text: 'Bitte einen gültigen Zeitraum wählen: „Von“ nicht in der Zukunft, „Bis“ nicht vor „Von“.' },
398
+ 'dep.usb_hint': { text: 'USB-Stick anstecken (FAT32 oder exFAT). Der Prüfer behält den Stick.' },
399
+ 'dep.saved': { text: 'Gespeichert im Ordner {folder}.', placeholders: ['folder'] },
400
+ 'dep.save_failed': { text: 'Speichern hat nicht geklappt. Bitte den Stick prüfen und erneut speichern.' },
401
+ 'dep.zip_fallback': { text: 'Dieser Browser kann keinen Ordner wählen – der Export kommt als ZIP-Datei in den Download-Ordner.', only: ['web'] },
402
+ 'dep.code_once': { text: 'Code und QR-Code gibt es nur auf diesem Bildschirm. Wer zurückgeht, erstellt beim nächsten Mal einen neuen Link.' },
403
+ 'dep.revoked': { text: 'Der Link ist widerrufen.' },
388
404
  // --- Nur App -------------------------------------------------------------
389
405
  'app.not_in_browser': { text: 'Die Kassen-App läuft nicht im Browser – dafür gibt es kasse.kasseneck.at.', only: ['app'] },
390
406
  'app.open_in_browser': { text: 'Bitte im Browser öffnen: {target}', placeholders: ['target'], only: ['app'] },
@@ -455,6 +471,13 @@ export const ERROR_CODE_RULES = [
455
471
  { kind: 'api', codes: ['invalid_amount'], key: 'amount.invalid' },
456
472
  { kind: 'api', codes: ['drawer_not_found'], key: 'drawer.not_found' },
457
473
  { kind: 'api', codes: ['drawer_inactive'], key: 'drawer.inactive' },
474
+ // Prüfung (DEP, 1.21.0): nur der Chef; die Tagesgrenze und ein laufender
475
+ // Export sagen, was zu tun ist. Der Server hat nichts angelegt. Bewusst
476
+ // ohne export_failed (kommt auch von Zahlungswegen mit unklarem Ausgang)
477
+ // und ohne too_many_links (der Satz des Backends nennt die Grenze).
478
+ { kind: 'api', codes: ['manager_only'], key: 'dep.manager_only' },
479
+ { kind: 'api', codes: ['export_running'], key: 'dep.running' },
480
+ { kind: 'api', codes: ['too_many_exports'], key: 'dep.too_many_exports' },
458
481
  ];
459
482
  /**
460
483
  * Regeln je Ausgang, nach den Code-Regeln und vor der Regel der Art: eine
@@ -933,6 +956,7 @@ const BESCHRIFTUNGEN_ROH = {
933
956
  'nav.vouchers': { text: 'Gutscheine' },
934
957
  'nav.open_drawer': { text: 'Kassenlade öffnen' },
935
958
  'nav.stocktake': { text: 'Inventur' },
959
+ 'nav.dep': { text: 'Prüfung (DEP)' },
936
960
  'nav.settings': { text: 'Einstellungen' },
937
961
  'nav.settings_locked': { text: 'nur mit Chef-Anmeldung' },
938
962
  'nav.logout': { text: 'Abmelden' },
@@ -1034,6 +1058,24 @@ const BESCHRIFTUNGEN_ROH = {
1034
1058
  'receipt.output_pdf_shared': { text: 'PDF geteilt' },
1035
1059
  'receipt.output_opened': { text: 'Link geöffnet ({count}×)', placeholders: ['count'] },
1036
1060
  'receipt.output_failed': { text: 'fehlgeschlagen' },
1061
+ // --- Prüfung (DEP) bei der Kassennachschau -----------------------------------
1062
+ 'dep.title': { text: 'Prüfung (DEP)' },
1063
+ 'dep.period': { text: 'Zeitraum' },
1064
+ 'dep.period_all': { text: 'Alles seit Inbetriebnahme' },
1065
+ 'dep.period_year': { text: 'Ein Jahr' },
1066
+ 'dep.period_quarter': { text: 'Ein Quartal' },
1067
+ 'dep.period_custom': { text: 'Eigener Zeitraum' },
1068
+ 'dep.from': { text: 'Von' },
1069
+ 'dep.to': { text: 'Bis' },
1070
+ 'dep.create': { text: 'Export erstellen' },
1071
+ 'dep.receipts': { text: '{count} Belege', placeholders: ['count'] },
1072
+ 'dep.save_usb': { text: 'Auf USB-Stick speichern' },
1073
+ 'dep.handover_link': { text: 'Link für den Prüfer' },
1074
+ 'dep.code': { text: 'Code' },
1075
+ 'dep.valid_until': { text: 'gültig bis {date}', placeholders: ['date'] },
1076
+ 'dep.revoke': { text: 'Widerrufen' },
1077
+ 'dep.checksum': { text: 'Prüfsumme (SHA-256)' },
1078
+ 'dep.new_export': { text: 'Neuer Export' },
1037
1079
  };
1038
1080
  export const LABELS = BESCHRIFTUNGEN_ROH;
1039
1081
  /**
@@ -316,7 +316,12 @@ export function planeGutscheine(kunde, vouchers, art, o) {
316
316
  if ('fehler' in check)
317
317
  return check;
318
318
  if (v.action === 'payout') {
319
- // `gutschein-core.darfAuszahlen`: Auszahlung nicht gesperrt, aktiv oder abgelaufen bis zum Ende der Rueckzahlbarkeit.
319
+ // `gutschein-core.darfAuszahlen`: storniert und gesperrt zuerst (der Storno setzt den Saldo auf 0, die Kasse soll
320
+ // „storniert“ sagen, nicht „aufgebraucht“), dann Auszahlung nicht gesperrt, aktiv oder abgelaufen bis zum Ende der
321
+ // Rueckzahlbarkeit.
322
+ if (check.status === 'cancelled' || check.status === 'blocked') {
323
+ return nein(STATUS_FEHLER[check.status] ?? 'voucher_invalid', `Gutschein ${i + 1}: Status ${check.status}.`);
324
+ }
320
325
  if (check.payout === 'never')
321
326
  return nein('voucher_payout_not_allowed', `Gutschein ${i + 1}: dieser Gutschein wird nie ausgezahlt.`);
322
327
  if (!((check.balanceCents ?? 0) > 0))
@@ -1,5 +1,5 @@
1
1
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
2
- export declare const VOKABULAR_QUELLE = "b06a8be2fe8c96e7e266a4e237c77588e9bef4e3272a9343ed2969ba722a87f4";
2
+ export declare const VOKABULAR_QUELLE = "ff400b73f31d963cb2051ca8b7a06cef0bf126483b528320e2a503a6035a7c59";
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 {
@@ -1,7 +1,7 @@
1
1
  // Erzeugt von scripts/stored-vokabular.mjs aus fixtures/v3/v3-vokabular.json.
2
2
  // Nicht von Hand aendern: test/stored.test.ts vergleicht mit dem Vertrag.
3
3
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
4
- export const VOKABULAR_QUELLE = "b06a8be2fe8c96e7e266a4e237c77588e9bef4e3272a9343ed2969ba722a87f4";
4
+ export const VOKABULAR_QUELLE = "ff400b73f31d963cb2051ca8b7a06cef0bf126483b528320e2a503a6035a7c59";
5
5
  /** Schema je Endpunkt (aussen -> innen) und Wertverweise auf die Kataloge. */
6
6
  export const SCHEMAS = {
7
7
  "getReceipt": {
@@ -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.20.0";
7
+ export declare const PACKAGE_VERSION = "1.21.1";
@@ -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 const PACKAGE_VERSION = '1.20.0';
7
+ export const PACKAGE_VERSION = '1.21.1';
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 1,
3
+ "note": "Ordner für den USB-Stick bei der Prüfung (DEP): depFolderName(cashregisterId, from, to). Web-Kasse, Kassen-App und der Dart-Zwilling benennen ihn gleich.",
4
+ "cases": [
5
+ { "name": "Zeitraum mit Anfang und Ende", "cashregisterId": "KECK-1", "from": "2026-07-01", "to": "2026-09-30", "expected": "DEP_KECK-1_2026-07-01_2026-09-30" },
6
+ { "name": "ein Tag", "cashregisterId": "KECK-1", "from": "2026-10-31", "to": "2026-10-31", "expected": "DEP_KECK-1_2026-10-31_2026-10-31" },
7
+ { "name": "alles seit Inbetriebnahme", "cashregisterId": "KECK-1", "from": null, "to": null, "expected": "DEP_KECK-1_alles" },
8
+ { "name": "nur Ende", "cashregisterId": "KECK-1", "from": null, "to": "2026-10-31", "expected": "DEP_KECK-1_bis_2026-10-31" },
9
+ { "name": "nur Anfang", "cashregisterId": "KECK-1", "from": "2026-01-01", "to": null, "expected": "DEP_KECK-1_ab_2026-01-01" },
10
+ { "name": "leere Texte wie fehlend", "cashregisterId": "KECK-1", "from": "", "to": " ", "expected": "DEP_KECK-1_alles" },
11
+ { "name": "Zeichen, die ein Stick nicht nimmt, werden zu _", "cashregisterId": "Theke 1/2:\"A\"", "from": "2026-07-01", "to": "2026-07-31", "expected": "DEP_Theke_1_2__A__2026-07-01_2026-07-31" },
12
+ { "name": "ohne Kassen-ID", "cashregisterId": "", "from": "2026-07-01", "to": "2026-07-31", "expected": "DEP_Kasse_2026-07-01_2026-07-31" }
13
+ ]
14
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.20.0",
2
+ "version": "1.21.1",
3
3
  "measuredOn": {
4
4
  "tid": "3600335",
5
5
  "hpsVersion": "1.10.0",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "Kasseneck Rechnungs-API",
4
4
  "version": 2,
5
- "package": "1.20.0",
5
+ "package": "1.21.1",
6
6
  "endpoints": {
7
7
  "createCustomer": {
8
8
  "request": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.20.0",
2
+ "version": "1.21.1",
3
3
  "languages": [
4
4
  "de",
5
5
  "en"
@@ -28,6 +28,15 @@
28
28
  { "name": "api response_unreadable: Erfolg gemeldet, Antwort unlesbar, Ausgang unklar",
29
29
  "error": { "kind": "api", "code": "response_unreadable", "serverMessage": "Erfolg gemeldet, Antwort aber unlesbar (Antwort nicht lesbar). Der Vorgang kann ausgefuehrt sein: nicht wiederholen, sondern nachlesen." },
30
30
  "fallback": "Ersatz.", "expected": { "key": "server.response_unreadable" } },
31
+ { "name": "api manager_only: Prüfung (DEP), der Satz der Kasse statt des Backends",
32
+ "error": { "kind": "api", "code": "manager_only", "serverMessage": "Den Export für die Prüfung macht der Chef." },
33
+ "fallback": "Ersatz.", "expected": { "key": "dep.manager_only" } },
34
+ { "name": "api export_running: Prüfung (DEP), der Satz der Kasse statt des Backends",
35
+ "error": { "kind": "api", "code": "export_running", "serverMessage": "Für diese Kasse läuft bereits ein Export." },
36
+ "fallback": "Ersatz.", "expected": { "key": "dep.running" } },
37
+ { "name": "api too_many_exports: Prüfung (DEP), der Satz der Kasse statt des Backends",
38
+ "error": { "kind": "api", "code": "too_many_exports", "serverMessage": "Zu viele Exporte heute." },
39
+ "fallback": "Ersatz.", "expected": { "key": "dep.too_many_exports" } },
31
40
  { "name": "api shift_not_open: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
32
41
  "error": { "kind": "api", "code": "shift_not_open", "serverMessage": "Keine offene Schicht gefunden." },
33
42
  "fallback": "Ersatz.", "expected": { "key": "shift.required" } },
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.20.0",
2
+ "version": "1.21.1",
3
3
  "messages": {
4
4
  "network.no_connection": {
5
5
  "text": "Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen."
@@ -940,6 +940,51 @@
940
940
  "total"
941
941
  ]
942
942
  },
943
+ "dep.manager_only": {
944
+ "text": "Den Export für die Prüfung macht der Chef. Ist er nicht da, darf die Behörde bis zu zwei Werktage warten."
945
+ },
946
+ "dep.offline": {
947
+ "text": "Ohne Internet ist kein Export möglich. Die Behörde muss dann bis zu zwei Werktage warten; der Export geht später hier oder unter mein.kasseneck.at."
948
+ },
949
+ "dep.creating": {
950
+ "text": "Wird erstellt …"
951
+ },
952
+ "dep.running": {
953
+ "text": "Für diese Kasse läuft schon ein Export. Bitte kurz warten, er wird gleich fertig."
954
+ },
955
+ "dep.failed": {
956
+ "text": "Der Export ist fehlgeschlagen. Bitte erneut erstellen."
957
+ },
958
+ "dep.too_many_exports": {
959
+ "text": "Heute sind an diesem Konto keine weiteren Exporte möglich – morgen geht es wieder. Ein schon erstellter Export bleibt nutzbar."
960
+ },
961
+ "dep.period_invalid": {
962
+ "text": "Bitte einen gültigen Zeitraum wählen: „Von“ nicht in der Zukunft, „Bis“ nicht vor „Von“."
963
+ },
964
+ "dep.usb_hint": {
965
+ "text": "USB-Stick anstecken (FAT32 oder exFAT). Der Prüfer behält den Stick."
966
+ },
967
+ "dep.saved": {
968
+ "text": "Gespeichert im Ordner {folder}.",
969
+ "placeholders": [
970
+ "folder"
971
+ ]
972
+ },
973
+ "dep.save_failed": {
974
+ "text": "Speichern hat nicht geklappt. Bitte den Stick prüfen und erneut speichern."
975
+ },
976
+ "dep.zip_fallback": {
977
+ "text": "Dieser Browser kann keinen Ordner wählen – der Export kommt als ZIP-Datei in den Download-Ordner.",
978
+ "only": [
979
+ "web"
980
+ ]
981
+ },
982
+ "dep.code_once": {
983
+ "text": "Code und QR-Code gibt es nur auf diesem Bildschirm. Wer zurückgeht, erstellt beim nächsten Mal einen neuen Link."
984
+ },
985
+ "dep.revoked": {
986
+ "text": "Der Link ist widerrufen."
987
+ },
943
988
  "app.not_in_browser": {
944
989
  "text": "Die Kassen-App läuft nicht im Browser – dafür gibt es kasse.kasseneck.at.",
945
990
  "only": [
@@ -1105,6 +1150,27 @@
1105
1150
  "drawer_inactive"
1106
1151
  ],
1107
1152
  "key": "drawer.inactive"
1153
+ },
1154
+ {
1155
+ "kind": "api",
1156
+ "codes": [
1157
+ "manager_only"
1158
+ ],
1159
+ "key": "dep.manager_only"
1160
+ },
1161
+ {
1162
+ "kind": "api",
1163
+ "codes": [
1164
+ "export_running"
1165
+ ],
1166
+ "key": "dep.running"
1167
+ },
1168
+ {
1169
+ "kind": "api",
1170
+ "codes": [
1171
+ "too_many_exports"
1172
+ ],
1173
+ "key": "dep.too_many_exports"
1108
1174
  }
1109
1175
  ],
1110
1176
  "errorOutcomeRules": [
@@ -1997,6 +2063,9 @@
1997
2063
  "nav.stocktake": {
1998
2064
  "text": "Inventur"
1999
2065
  },
2066
+ "nav.dep": {
2067
+ "text": "Prüfung (DEP)"
2068
+ },
2000
2069
  "nav.settings": {
2001
2070
  "text": "Einstellungen"
2002
2071
  },
@@ -2335,6 +2404,63 @@
2335
2404
  },
2336
2405
  "receipt.output_failed": {
2337
2406
  "text": "fehlgeschlagen"
2407
+ },
2408
+ "dep.title": {
2409
+ "text": "Prüfung (DEP)"
2410
+ },
2411
+ "dep.period": {
2412
+ "text": "Zeitraum"
2413
+ },
2414
+ "dep.period_all": {
2415
+ "text": "Alles seit Inbetriebnahme"
2416
+ },
2417
+ "dep.period_year": {
2418
+ "text": "Ein Jahr"
2419
+ },
2420
+ "dep.period_quarter": {
2421
+ "text": "Ein Quartal"
2422
+ },
2423
+ "dep.period_custom": {
2424
+ "text": "Eigener Zeitraum"
2425
+ },
2426
+ "dep.from": {
2427
+ "text": "Von"
2428
+ },
2429
+ "dep.to": {
2430
+ "text": "Bis"
2431
+ },
2432
+ "dep.create": {
2433
+ "text": "Export erstellen"
2434
+ },
2435
+ "dep.receipts": {
2436
+ "text": "{count} Belege",
2437
+ "placeholders": [
2438
+ "count"
2439
+ ]
2440
+ },
2441
+ "dep.save_usb": {
2442
+ "text": "Auf USB-Stick speichern"
2443
+ },
2444
+ "dep.handover_link": {
2445
+ "text": "Link für den Prüfer"
2446
+ },
2447
+ "dep.code": {
2448
+ "text": "Code"
2449
+ },
2450
+ "dep.valid_until": {
2451
+ "text": "gültig bis {date}",
2452
+ "placeholders": [
2453
+ "date"
2454
+ ]
2455
+ },
2456
+ "dep.revoke": {
2457
+ "text": "Widerrufen"
2458
+ },
2459
+ "dep.checksum": {
2460
+ "text": "Prüfsumme (SHA-256)"
2461
+ },
2462
+ "dep.new_export": {
2463
+ "text": "Neuer Export"
2338
2464
  }
2339
2465
  },
2340
2466
  "returnDispositionLabels": {
@@ -3,7 +3,7 @@
3
3
  "_source": {
4
4
  "beleg-toepfe.js": "60630493a589469d1cdfeea6fef667d20feb8f3a156819ba4d90b21501fdc4ea",
5
5
  "gutschein-beleg.js": "36750aa4eec8d94f57c2eebce0d34d13c7ffb3f0f5ea558fac1f56f15ff50004",
6
- "gutschein-core.js": "8eeb04a12f771c6b70b23ab7a361354745182ab18235213d3c2f1f9191ebadef",
6
+ "gutschein-core.js": "b4d3188c666a43e3be8cc1c2c54e5b8de24e10db785e33bb2ce81aa38ae47929",
7
7
  "tip-core.js": "2d5b65c3cbe96935c8537d35f02b30906a7477afa340e18325b60bd60af1c7d9",
8
8
  "vat-buckets.js": "92c69632c0120dbb09a22cef5a36b052e81605d99907eeda7289b0d3db78454c",
9
9
  "zahlungen-core.js": "7ea8b07dfd222741049a47bec0149953d5696b0e1e089bf9919d4bd2cafff530"
@@ -491,6 +491,10 @@
491
491
  {"name":"gen_voucher_478_single_purpose_exempt","input":{"receiptType":"standard","items":[{"name":"P","quantity":1,"priceCents":2521,"vatRate":4.9,"articleId":"item_mani"},{"name":"P","quantity":2.75,"priceCents":2266,"vatRate":13},{"name":"P","quantity":2,"priceCents":64,"vatRate":10,"articleId":"item_mani"},{"name":"Discount","quantity":1,"priceCents":-146,"vatRate":13,"kind":"discount"}],"vouchers":[{"type":"single_purpose","action":"redeem","code":"DTD5-9ECF-5KNZ","amountCents":58}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"single_purpose","status":"active","codeSuffix":"5KNZ","balanceCents":2402,"vatRateBp":0,"exempt":true}}]},"expected":{"dueCents":8677,"counterDeltaCents":8677,"valueVoucherFlowCents":0,"bucketsCents":{"amountRateStandard":0,"amountRateReduced1":127,"amountRateReduced2":6046,"amountRateZero":0,"amountRateSpecial":2504,"amountRatOthers":0}}},
492
492
  {"name":"gen_voucher_479_sell_multi_purpose","input":{"receiptType":"standard","items":[{"name":"P","quantity":3,"priceCents":80,"vatRate":4.9}],"vouchers":[{"action":"sell","type":"multi_purpose","typeId":"vt_mehrzweck_479","amountCents":7217}],"today":"2100-01-04","voucherTypes":[{"id":"vt_mehrzweck_479","kind":"multi_purpose","vatRateBp":null,"amount":{"mode":"fixed","cents":7217}}],"smallBusiness":true},"expected":{"dueCents":7457,"counterDeltaCents":7457,"valueVoucherFlowCents":0,"bucketsCents":{"amountRateStandard":0,"amountRateReduced1":0,"amountRateReduced2":0,"amountRateZero":7217,"amountRateSpecial":240,"amountRatOthers":0}}},
493
493
  {"name":"gen_voucher_480_redeem_wrong_kind","input":{"receiptType":"standard","items":[{"name":"P","quantity":1,"priceCents":2000,"vatRate":20}],"vouchers":[{"type":"single_purpose","action":"redeem","code":"DTD5-9ECF-5KNZ","amountCents":1000}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"multi_purpose","status":"active","codeSuffix":"5KNZ","balanceCents":5000}}]},"expected":{"voucherError":"voucher_invalid"}},
494
- {"name":"gen_voucher_481_redeem_wrong_kind","input":{"receiptType":"standard","items":[{"name":"P","quantity":1,"priceCents":2000,"vatRate":20}],"vouchers":[{"type":"multi_purpose","action":"redeem","code":"DTD5-9ECF-5KNZ","amountCents":1000}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"single_purpose","status":"active","codeSuffix":"5KNZ","balanceCents":5000,"vatRateBp":2000}}]},"expected":{"voucherError":"voucher_invalid"}}
494
+ {"name":"gen_voucher_481_redeem_wrong_kind","input":{"receiptType":"standard","items":[{"name":"P","quantity":1,"priceCents":2000,"vatRate":20}],"vouchers":[{"type":"multi_purpose","action":"redeem","code":"DTD5-9ECF-5KNZ","amountCents":1000}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"single_purpose","status":"active","codeSuffix":"5KNZ","balanceCents":5000,"vatRateBp":2000}}]},"expected":{"voucherError":"voucher_invalid"}},
495
+ {"name":"gen_voucher_482_payout_multi_purpose_cancelled","input":{"receiptType":"standard","items":[],"vouchers":[{"type":"multi_purpose","action":"payout","code":"DTD5-9ECF-5KNZ","amountCents":1000,"reason":"Goodwill"}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"multi_purpose","status":"cancelled","codeSuffix":"5KNZ","balanceCents":0}}]},"expected":{"voucherError":"voucher_cancelled"}},
496
+ {"name":"gen_voucher_483_payout_single_purpose_cancelled","input":{"receiptType":"standard","items":[],"vouchers":[{"type":"single_purpose","action":"payout","code":"DTD5-9ECF-5KNZ","amountCents":1000,"reason":"Goodwill"}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"single_purpose","status":"cancelled","codeSuffix":"5KNZ","payout":"never","balanceCents":0,"vatRateBp":2000}}]},"expected":{"voucherError":"voucher_cancelled"}},
497
+ {"name":"gen_voucher_484_payout_multi_purpose_blocked","input":{"receiptType":"standard","items":[],"vouchers":[{"type":"multi_purpose","action":"payout","code":"DTD5-9ECF-5KNZ","amountCents":1000,"reason":"Goodwill"}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"multi_purpose","status":"blocked","codeSuffix":"5KNZ","payout":"never","balanceCents":5000}}]},"expected":{"voucherError":"voucher_blocked"}},
498
+ {"name":"gen_voucher_485_payout_multi_purpose_used_up","input":{"receiptType":"standard","items":[],"vouchers":[{"type":"multi_purpose","action":"payout","code":"DTD5-9ECF-5KNZ","amountCents":1000,"reason":"Goodwill"}],"today":"2026-10-19","voucherInfo":[{"code":"DTD5-9ECF-5KNZ","check":{"type":"multi_purpose","status":"used_up","codeSuffix":"5KNZ","balanceCents":0}}]},"expected":{"voucherError":"voucher_used_up"}}
495
499
  ]
496
500
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.20.0",
2
+ "version": "1.21.1",
3
3
  "baseUrls": {
4
4
  "public": "https://api.kasseneck.at/v3",
5
5
  "pos": "https://kasse.kasseneck.at/api/v3"
@@ -111,10 +111,14 @@
111
111
  ],
112
112
  "pos": [
113
113
  "cancelReceipt",
114
+ "createDepExport",
115
+ "createDepHandoverLink",
114
116
  "createPrintJob",
115
117
  "createReceipt",
116
118
  "endRegisterSession",
117
119
  "generateFullReceiptId",
120
+ "getDepExport",
121
+ "getDepExportFile",
118
122
  "getKasseSettings",
119
123
  "getPrintJob",
120
124
  "getReceipt",
@@ -132,6 +136,7 @@
132
136
  "registerPinLogin",
133
137
  "registerUserLogin",
134
138
  "renewRegisterSession",
139
+ "revokeDepHandoverLink",
135
140
  "sendReceiptEmail",
136
141
  "setMyCashregisterStockLocation",
137
142
  "setMyKasseLogo",
@@ -312,7 +317,12 @@
312
317
  "logMyDrawerOpenings",
313
318
  "getMyShiftReport",
314
319
  "closeMyShift",
315
- "logReceiptOutputs"
320
+ "logReceiptOutputs",
321
+ "createDepExport",
322
+ "getDepExport",
323
+ "getDepExportFile",
324
+ "createDepHandoverLink",
325
+ "revokeDepHandoverLink"
316
326
  ]
317
327
  },
318
328
  "unknownOutcomeCalls": [
@@ -2,7 +2,7 @@
2
2
  "_hinweis": "Vertrags-Export /v3, erzeugt aus den echten Handlern (npm run vertrag:v3 in functions/ und functions-kasse/). Nicht von Hand pflegen.",
3
3
  "_quelle": {
4
4
  "sha256": "7781447b4d50979c70a5d117afb9ef7e93a0d93f01d19b25bbfd1ab233dfff69",
5
- "inputsSha256": "3ee0bad6bd2e4b8c87412d7301d9862d0d79adf3494bde08ad8fc533c9a60b66",
5
+ "inputsSha256": "b008ce1c1465149f0748185704c3e593a6d537e869691bd0e60e3e4368142189",
6
6
  "backendPackage": "@kreiseck/kasseneck-api@0.36.0",
7
7
  "inputs": [
8
8
  "docs/api/fehlercodes.json",
@@ -2,7 +2,7 @@
2
2
  "_hinweis": "Vertrags-Export /v3, erzeugt aus den echten Handlern (npm run vertrag:v3 in functions/ und functions-kasse/). Nicht von Hand pflegen.",
3
3
  "_quelle": {
4
4
  "sha256": "265bcf3e14cdea33ec3c4df399eb487d40c0d7793ee23d2ee12bcf664bcad550",
5
- "inputsSha256": "3ee0bad6bd2e4b8c87412d7301d9862d0d79adf3494bde08ad8fc533c9a60b66",
5
+ "inputsSha256": "b008ce1c1465149f0748185704c3e593a6d537e869691bd0e60e3e4368142189",
6
6
  "backendPackage": "@kreiseck/kasseneck-api@0.36.0",
7
7
  "inputs": [
8
8
  "docs/api/fehlercodes.json",
@@ -2,7 +2,7 @@
2
2
  "_hinweis": "Vertrags-Export /v3, erzeugt aus den echten Handlern (npm run vertrag:v3 in functions/ und functions-kasse/). Nicht von Hand pflegen.",
3
3
  "_quelle": {
4
4
  "sha256": "497fe59db3414bf3143c0102eedfd371e165ad2f1878e74a9e1e31bd9413f1b0",
5
- "inputsSha256": "3ee0bad6bd2e4b8c87412d7301d9862d0d79adf3494bde08ad8fc533c9a60b66",
5
+ "inputsSha256": "b008ce1c1465149f0748185704c3e593a6d537e869691bd0e60e3e4368142189",
6
6
  "backendPackage": "@kreiseck/kasseneck-api@0.36.0",
7
7
  "inputs": [
8
8
  "docs/api/fehlercodes.json",
@@ -2,7 +2,7 @@
2
2
  "_hinweis": "Vertrags-Export /v3, erzeugt aus den echten Handlern (npm run vertrag:v3 in functions/ und functions-kasse/). Nicht von Hand pflegen.",
3
3
  "_quelle": {
4
4
  "sha256": "d354e8a1424c465dab37d166dbda8c9a9ed0b4021e0564dfe23f744ecc4f4918",
5
- "inputsSha256": "3ee0bad6bd2e4b8c87412d7301d9862d0d79adf3494bde08ad8fc533c9a60b66",
5
+ "inputsSha256": "b008ce1c1465149f0748185704c3e593a6d537e869691bd0e60e3e4368142189",
6
6
  "backendPackage": "@kreiseck/kasseneck-api@0.36.0",
7
7
  "inputs": [
8
8
  "docs/api/fehlercodes.json",