@kreiseck/kasseneck-api 0.13.0 → 0.13.2

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 (54) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +96 -16
  3. package/dist/cjs/client/auth.d.ts +4 -4
  4. package/dist/cjs/client/auth.js +3 -3
  5. package/dist/cjs/client/cashregisters.d.ts +1 -1
  6. package/dist/cjs/client/cashregisters.js +1 -1
  7. package/dist/cjs/client/errors.d.ts +1 -1
  8. package/dist/cjs/client/errors.js +2 -2
  9. package/dist/cjs/client/receipts.d.ts +1 -1
  10. package/dist/cjs/client/receipts.js +1 -1
  11. package/dist/cjs/client/transport.d.ts +1 -1
  12. package/dist/cjs/client/transport.js +2 -2
  13. package/dist/cjs/models/cashregister.d.ts +2 -2
  14. package/dist/cjs/models/receipt-company.d.ts +1 -1
  15. package/dist/cjs/payments/hobex-hps/errors.d.ts +11 -0
  16. package/dist/cjs/payments/hobex-hps/errors.js +16 -0
  17. package/dist/cjs/payments/hobex-hps/index.d.ts +1 -1
  18. package/dist/cjs/payments/hobex-hps/index.js +2 -1
  19. package/dist/cjs/payments/hobex-hps/payments.js +6 -1
  20. package/dist/cjs/payments/hobex-hps/transaction-response.d.ts +12 -0
  21. package/dist/cjs/payments/hobex-hps/transaction-response.js +13 -1
  22. package/dist/cjs/payments/index.d.ts +1 -1
  23. package/dist/cjs/payments/index.js +2 -1
  24. package/dist/cjs/register/index.d.ts +1 -1
  25. package/dist/cjs/register/index.js +1 -1
  26. package/dist/cjs/register/pairing.d.ts +2 -2
  27. package/dist/esm/client/auth.d.ts +4 -4
  28. package/dist/esm/client/auth.js +3 -3
  29. package/dist/esm/client/cashregisters.d.ts +1 -1
  30. package/dist/esm/client/cashregisters.js +1 -1
  31. package/dist/esm/client/errors.d.ts +1 -1
  32. package/dist/esm/client/errors.js +2 -2
  33. package/dist/esm/client/receipts.d.ts +1 -1
  34. package/dist/esm/client/receipts.js +1 -1
  35. package/dist/esm/client/transport.d.ts +1 -1
  36. package/dist/esm/client/transport.js +2 -2
  37. package/dist/esm/models/cashregister.d.ts +2 -2
  38. package/dist/esm/models/receipt-company.d.ts +1 -1
  39. package/dist/esm/payments/hobex-hps/errors.d.ts +11 -0
  40. package/dist/esm/payments/hobex-hps/errors.js +17 -1
  41. package/dist/esm/payments/hobex-hps/index.d.ts +1 -1
  42. package/dist/esm/payments/hobex-hps/index.js +1 -1
  43. package/dist/esm/payments/hobex-hps/payments.js +6 -1
  44. package/dist/esm/payments/hobex-hps/transaction-response.d.ts +12 -0
  45. package/dist/esm/payments/hobex-hps/transaction-response.js +12 -0
  46. package/dist/esm/payments/index.d.ts +1 -1
  47. package/dist/esm/payments/index.js +1 -1
  48. package/dist/esm/register/index.d.ts +1 -1
  49. package/dist/esm/register/index.js +1 -1
  50. package/dist/esm/register/pairing.d.ts +2 -2
  51. package/fixtures/hobex-hps-codes.json +1 -1
  52. package/fixtures/kasse-texte.json +1 -1
  53. package/fixtures/oberflaeche.json +1 -1
  54. package/package.json +20 -5
package/CHANGELOG.md CHANGED
@@ -4,6 +4,43 @@ Was vor 0.7.0 geschah, steht in der Commit-Historie (`git log`); ab hier wird
4
4
  es hier geführt. Ein Eintrag nennt die Änderung **und ihren Grund** —
5
5
  nur der Grund überlebt den nächsten Umbau.
6
6
 
7
+ ## 0.13.2
8
+
9
+ ### Die Paketseite erklaert, wofuer das Paket da ist
10
+
11
+ **Anlass:** Wer auf npm landet, sah eine Wand aus Technik und nirgends, worum
12
+ es geht. Die Seite traegt jetzt das Kasseneck-Logo, einen englischen Einzeiler
13
+ fuer Besucher von aussen, und eine Tabelle, welche Pflichten einer
14
+ oesterreichischen Registrierkasse wo erledigt werden — mit Verweisen auf die
15
+ Wissensseiten und einem ausdruecklichen Hinweis, dass hier kein Rechtsrat steht
16
+ und die Verantwortung beim Unternehmer bleibt. Kopf und Fuss nennen Kreiseck
17
+ als Absender und verlinken dorthin. Am Code aendert sich nichts.
18
+
19
+ ### Der Vertrag nennt keinen Anmeldedienst mehr beim Namen
20
+
21
+ **Anlass:** Die Doku sprach an 16 Stellen von einem bestimmten Anbieter,
22
+ obwohl das Paket ihn gar nicht kennt: `registerUserAuth` bekommt eine Funktion,
23
+ die ein Token liefert — woher es stammt, geht das Paket nichts an. Ein
24
+ Implementierungsdetail im Vertrag bindet beide Seiten grundlos aneinander;
25
+ jetzt steht dort "ID-Token des Anmeldediensts". Damit verschwindet der Name
26
+ auch aus den ausgelieferten Typdeklarationen.
27
+
28
+ ## 0.13.1
29
+
30
+ ### Der 404 beim Abbruch wird benannt, nicht als Abriss gefuehrt
31
+
32
+ **Anlass:** Am Produktivterminal (TID 3556988, Firmware 2.3.9) antwortet der
33
+ Abbruch mit HTTP 404, am Testgeraet nie. Bisher war das im Nachweis nicht von
34
+ einem Leitungsabriss zu unterscheiden -- und `steps` ist der Text, der im
35
+ Belastungsstreit gelesen wird. Zwilling: kasseneck_api 6.12.1.
36
+
37
+ - **`NOT_FOUND_HTTP_STATUS`** und **`HpsConnectTerminalError.isNotFound`**
38
+ (wie `isTerminalBusy`: liest bevorzugt `terminalHttpStatus`).
39
+ - Der Abbruch schreibt beide Lesarten hin, ohne eine zu behaupten: das
40
+ Terminal kennt entweder den Vorgang nicht oder den Endpunkt nicht. Welche
41
+ zutrifft, ist ungemessen (bei hobex angefragt).
42
+ - **Verhalten unveraendert:** weiter klaeren, nie ein Ausgang.
43
+
7
44
  ## 0.13.0
8
45
 
9
46
  ### Beleg per E-Mail an den Gast (`sendReceiptEmail`)
package/README.md CHANGED
@@ -1,15 +1,87 @@
1
- # @kreiseck/kasseneck-api
2
-
3
- JavaScript-/TypeScript-Client für das Kasseneck-Backend — der Zwilling des
4
- Flutter-Pakets `kasseneck_api`. Er spricht dieselben Endpunkte, führt dieselben
5
- Modelle und dieselben Enum-Werte; ein eingecheckter Abzug der Dart-Enums wird
6
- im Test gegengeprüft, damit die beiden Pakete nicht auseinanderdriften.
7
-
8
- Das Paket deckt ab: Belege ausstellen und stornieren, Belege und Kassen
9
- auflisten, Berichte herunterladen, Status bei FinanzOnline abfragen,
10
- Stripe-Zahllinks und Hobex-Cloud-Zahlungen, das Beleg-Layout und die
11
- ESC/POS-Erzeugung für den Bondrucker — und unter `./partner` die
12
- **Partner-API**: Betriebe anlegen und bis zur laufenden Kasse begleiten.
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/kreiseck-at/kasseneck-api/main/doc/kasseneck.gif" alt="Kasseneck — RKSV-Registrierkasse aus Österreich" width="420">
3
+ </p>
4
+
5
+ <h1 align="center">@kreiseck/kasseneck-api</h1>
6
+
7
+ <p align="center">
8
+ <b>Austrian fiscal cash register (RKSV) for JavaScript and TypeScript — signed receipts, card payments, receipt printing.</b>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/@kreiseck/kasseneck-api"><img src="https://img.shields.io/npm/v/%40kreiseck%2Fkasseneck-api?color=136B6B&label=npm" alt="npm"></a>
13
+ <img src="https://img.shields.io/badge/RKSV-%C2%A7%20131b%20BAO-136B6B" alt="RKSV">
14
+ <img src="https://img.shields.io/badge/Lizenz-Apache--2.0-136B6B" alt="Apache-2.0">
15
+ <a href="https://kasseneck.at"><img src="https://img.shields.io/badge/Kasseneck-kasseneck.at-132A2A" alt="kasseneck.at"></a>
16
+ <a href="https://kreiseck.com"><img src="https://img.shields.io/badge/von-Kreiseck-132A2A" alt="Kreiseck Software Solutions"></a>
17
+ </p>
18
+
19
+ **Kasseneck** ist eine österreichische Registrierkasse nach RKSV. Dieses Paket ist
20
+ der JavaScript-/TypeScript-Client dafür: Ihr Code stellt Belege aus, storniert sie,
21
+ nimmt Kartenzahlungen entgegen und druckt Bons. Es ist der Zwilling des
22
+ Flutter-Pakets [`kasseneck_api`](https://pub.dev/packages/kasseneck_api):
23
+ dieselben Endpunkte, dieselben Modelle, dieselben Enum-Werte, im Test
24
+ gegeneinander geprüft.
25
+
26
+ ## Was eine Registrierkasse in Österreich können muss
27
+
28
+ Die Registrierkassen- und Belegerteilungspflicht steht in § 131b der
29
+ Bundesabgabenordnung, die technischen Anforderungen an die Sicherheitseinrichtung
30
+ in der Registrierkassensicherheitsverordnung (RKSV). Daraus ergibt sich eine
31
+ ganze Kette von Aufgaben — die Tabelle zeigt, welche davon **diese Software**
32
+ übernimmt und welche beim Betrieb selbst bleiben:
33
+
34
+ | Aufgabe | Wo sie erledigt wird |
35
+ | --- | --- |
36
+ | [Signaturerstellungseinheit](https://kasseneck.at/wissen/signaturerstellungseinheit) — jede Barzahlung wird signiert | Kasseneck, nichts zu installieren |
37
+ | [Verkettung und DEP](https://kasseneck.at/wissen/dep) — jeder Beleg trägt den vorigen, das Protokoll ist exportierbar | Kasseneck-Backend |
38
+ | [Startbeleg, Monatsbeleg, Jahresbeleg](https://kasseneck.at/wissen/startbeleg-monatsbeleg-jahresbeleg) | Kasseneck, automatisch |
39
+ | [Meldungen an FinanzOnline](https://kasseneck.at/wissen/finanzonline) — Anmeldung, Ausfall, Außerbetriebnahme | Kasseneck-Backend |
40
+ | [Belegerteilungspflicht](https://kasseneck.at/wissen/belegerteilungspflicht) — jeder Kunde bekommt einen Beleg | **dieses Paket** — Bon, PDF, Bildschirm oder Link |
41
+ | [Ausfall der Signatureinheit](https://kasseneck.at/wissen/ausfall) — Sammelbeleg, Meldung, Nachsignatur | Kasseneck, automatisch |
42
+ | [Kassennachschau](https://kasseneck.at/wissen/kassennachschau) — der Prüfer verlangt das DEP | Kasseneck, Export auf Knopfdruck |
43
+ | Anmeldung der Kasse, Aufbewahrung, steuerliche Würdigung | **beim Unternehmer** |
44
+
45
+ Kurz: Sie bauen die Kassenoberfläche, nicht die Sicherheitseinrichtung. Ein Aufruf
46
+ von `createReceipt(...)` erzeugt einen signierten, verketteten und im DEP
47
+ abgelegten Beleg. Die Signaturkette wird gegen das offizielle Prüfwerkzeug des
48
+ BMF getestet.
49
+
50
+ > **Kein Rechts- oder Steuerrat.** Dieser Abschnitt beschreibt, was die Software
51
+ > tut. Er ersetzt keine Beratung und begründet keine Zusicherung, dass ein
52
+ > bestimmter Betrieb damit alle Pflichten erfüllt. Verbindlich sind die
53
+ > Bundesabgabenordnung, die RKSV und die Erlässe des BMF; die Verantwortung für
54
+ > Anmeldung, Betrieb und Aufbewahrung bleibt beim Unternehmer. Ausführlicher und
55
+ > mit Quellen: [kasseneck.at/wissen](https://kasseneck.at/wissen).
56
+ > Stand: September 2026.
57
+
58
+ ## Erst ausprobieren
59
+
60
+ Es gibt eine Test-Umgebung mit eigenem Schlüssel und Test-Signaturen, getrennt
61
+ vom Echtbetrieb — die aktuellen Konditionen stehen auf
62
+ [kasseneck.at/preise](https://kasseneck.at/preise), die Schnittstelle ist unter
63
+ [kasseneck.at/api-doku](https://kasseneck.at/api-doku) beschrieben.
64
+
65
+ ## Lieber eine fertige Kasse?
66
+
67
+ Dieses Paket ist für alle, die eine eigene Anwendung bauen. Wer einfach kassieren
68
+ will, muss nichts davon programmieren:
69
+
70
+ - **[Kasseneck — die fertige Registrierkasse](https://kasseneck.at)** für Telefon,
71
+ Tablet und Browser, inklusive Signaturerstellungseinheit und
72
+ FinanzOnline-Anmeldung.
73
+ - **[Lösungen nach Branche](https://kasseneck.at/branchen)** — vom Lokal bis zum Taxi.
74
+ - **[Preise](https://kasseneck.at/preise)**
75
+ - **[Kontakt](https://kasseneck.at/kontakt)** — auch für Kassenwechsel,
76
+ Partnerschaften und eigene Integrationen.
77
+
78
+ ## Was drin ist
79
+
80
+ Belege ausstellen und stornieren, Belege und Kassen auflisten, Berichte
81
+ herunterladen, Status bei FinanzOnline abfragen, Stripe-Zahllinks und
82
+ Hobex-Cloud-Zahlungen, das Beleg-Layout und die ESC/POS-Erzeugung für den
83
+ Bondrucker — und unter `./partner` die **Partner-API**: Betriebe anlegen und bis
84
+ zur laufenden Kasse begleiten.
13
85
 
14
86
  **Es läuft im Browser und in Node.** ESM ist das Hauptformat, CommonJS liegt
15
87
  daneben; beides mit eigenen Typdeklarationen. Node ab 20.18 (`fetch` muss
@@ -33,7 +105,7 @@ bevorzugte:
33
105
  | Weg | Wer | Wie |
34
106
  |-----|-----|-----|
35
107
  | `apiKeyAuth` | Geräte, POS-Apps, Dritte | `api_key` als Bearer + `cashregister-token`-Kopfzeile |
36
- | `registerUserAuth` | Browser-Kasse | Firebase-ID-Token als Bearer + `register-session`-Kopfzeile, Kasse als Parameter |
108
+ | `registerUserAuth` | Browser-Kasse | ID-Token des Anmeldediensts als Bearer + `register-session`-Kopfzeile, Kasse als Parameter |
37
109
 
38
110
  ```ts
39
111
  import { apiKeyAuth, registerUserAuth } from '@kreiseck/kasseneck-api';
@@ -41,7 +113,7 @@ import { apiKeyAuth, registerUserAuth } from '@kreiseck/kasseneck-api';
41
113
  // Gerät/POS: der api_key gehört auf ein Gerät, nie in einen Browser.
42
114
  const geraet = apiKeyAuth({ apiKey: 'kr_live_…', cashregisterToken: 'cb_live_…' });
43
115
 
44
- // Browser-Kasse: das Paket kennt Firebase nicht — es bekommt Funktionen, die
116
+ // Browser-Kasse: das Paket kennt den Anmeldedienst nicht — es bekommt Funktionen, die
45
117
  // ein gültiges Token bzw. die laufende Sitzung liefern. Beide werden bei JEDEM
46
118
  // Aufruf befragt (ID-Tokens laufen nach einer Stunde ab, die Kassen-Sitzung
47
119
  // nach 90 Sekunden).
@@ -66,7 +138,7 @@ const geraet = await pairRegisterDevice({ code: 'K7NPQR34', label: 'Schank' });
66
138
  const sitzung = await registerUserLogin({ ...geraet, userId: 'ru-1', pin: '1234' });
67
139
  ```
68
140
 
69
- Mit `sitzung.customToken` meldet sich der Verbraucher bei Firebase an; das
141
+ Mit `sitzung.customToken` meldet sich der Verbraucher beim Anmeldedienst an; das
70
142
  daraus entstehende ID-Token und `sitzung.sessionId` ergeben `registerUserAuth`.
71
143
 
72
144
  Eine anmeldungsfreie Anmeldung gibt es dafür **nicht** — sie wäre ein
@@ -476,7 +548,7 @@ steht. Deshalb prüft das Skript auf ein `status`-Feld und nicht auf Erfolg.
476
548
  Bewusst außerhalb von `npm test`: Sie braucht Netz. Ist keines da, sagt sie es
477
549
  und endet mit 0. Aufrufe, die unter `/v1` absichtlich keine Weiterleitung
478
550
  haben — der Kassen-Weg über `kasse.kasseneck.at/api`, die Aufrufe mit
479
- Firebase-ID-Token — stehen mit Grund in `scripts/erreichbarkeit-ausnahmen.json`.
551
+ ID-Token — stehen mit Grund in `scripts/erreichbarkeit-ausnahmen.json`.
480
552
  Wird eine Ausnahme erreichbar, schlägt die Prüfung an: Sonst sänke die Zahl nie.
481
553
 
482
554
  ## Vertragsdateien für die Zwillinge
@@ -520,3 +592,11 @@ ankommt.
520
592
  ## Lizenz
521
593
 
522
594
  Apache-2.0 — siehe `LICENSE` und `NOTICE`.
595
+
596
+ ---
597
+
598
+ **Kasseneck** ist ein Produkt von
599
+ [Kreiseck Software Solutions](https://kreiseck.com) aus Salzburg — Apps,
600
+ Kassensysteme und Automatisierungen. Fragen zur Schnittstelle, zu eigenen
601
+ Integrationen oder zu einer Partnerschaft:
602
+ [kasseneck.at/kontakt](https://kasseneck.at/kontakt).
@@ -6,7 +6,7 @@
6
6
  * Bearer plus die Kopfzeile `cashregister-token` (wie im Flutter-Zwilling
7
7
  * `kasseneck_api`).
8
8
  * - `registerUserAuth` — der Weg der Browser-Kasse: ein Kassen-Benutzer, per
9
- * PIN an einem gekoppelten Geraet angemeldet. Firebase-ID-Token als Bearer,
9
+ * PIN an einem gekoppelten Geraet angemeldet. ID-Token als Bearer,
10
10
  * die laufende Sitzung als Kopfzeile `register-session`, die Kasse als
11
11
  * Parameter `cashregisterId` in der Nutzlast.
12
12
  *
@@ -14,9 +14,9 @@
14
14
  * fuehrt keine eigenen HTTP-Aufrufe, kennt den Transport nicht und haelt keinen
15
15
  * Zustand — genau deshalb ist sie austauschbar und einzeln testbar.
16
16
  *
17
- * Das Paket weiss **nichts** von Firebase: `registerUserAuth` bekommt eine
17
+ * Das Paket weiss **nichts** vom Anmeldedienst: `registerUserAuth` bekommt eine
18
18
  * Funktion, die ein gueltiges ID-Token liefert (darf `async` sein). Sie wird
19
- * bei **jedem** Aufruf befragt — Firebase-ID-Tokens laufen nach einer Stunde
19
+ * bei **jedem** Aufruf befragt — ID-Tokens laufen nach einer Stunde
20
20
  * ab, die Sitzung der Browser-Kasse lebt sogar nur 90 Sekunden und wird alle
21
21
  * 30 Sekunden erneuert; ein einmal gemerkter Wert waere also bald tot.
22
22
  */
@@ -39,7 +39,7 @@ export interface ApiKeyAuthOptions {
39
39
  cashregisterToken: string;
40
40
  }
41
41
  export interface RegisterUserAuthOptions {
42
- /** Liefert ein gueltiges Firebase-ID-Token; wird pro Anfrage befragt. */
42
+ /** Liefert ein gueltiges ID-Token des Anmeldediensts; wird pro Anfrage befragt. */
43
43
  getIdToken: () => string | Promise<string>;
44
44
  /** Liefert die laufende Kassen-Sitzung; wird pro Anfrage befragt. */
45
45
  getSessionId: () => string | Promise<string>;
@@ -7,7 +7,7 @@
7
7
  * Bearer plus die Kopfzeile `cashregister-token` (wie im Flutter-Zwilling
8
8
  * `kasseneck_api`).
9
9
  * - `registerUserAuth` — der Weg der Browser-Kasse: ein Kassen-Benutzer, per
10
- * PIN an einem gekoppelten Geraet angemeldet. Firebase-ID-Token als Bearer,
10
+ * PIN an einem gekoppelten Geraet angemeldet. ID-Token als Bearer,
11
11
  * die laufende Sitzung als Kopfzeile `register-session`, die Kasse als
12
12
  * Parameter `cashregisterId` in der Nutzlast.
13
13
  *
@@ -15,9 +15,9 @@
15
15
  * fuehrt keine eigenen HTTP-Aufrufe, kennt den Transport nicht und haelt keinen
16
16
  * Zustand — genau deshalb ist sie austauschbar und einzeln testbar.
17
17
  *
18
- * Das Paket weiss **nichts** von Firebase: `registerUserAuth` bekommt eine
18
+ * Das Paket weiss **nichts** vom Anmeldedienst: `registerUserAuth` bekommt eine
19
19
  * Funktion, die ein gueltiges ID-Token liefert (darf `async` sein). Sie wird
20
- * bei **jedem** Aufruf befragt — Firebase-ID-Tokens laufen nach einer Stunde
20
+ * bei **jedem** Aufruf befragt — ID-Tokens laufen nach einer Stunde
21
21
  * ab, die Sitzung der Browser-Kasse lebt sogar nur 90 Sekunden und wird alle
22
22
  * 30 Sekunden erneuert; ein einmal gemerkter Wert waere also bald tot.
23
23
  */
@@ -5,7 +5,7 @@ import type { InternerTransport } from './aufrufe.js';
5
5
  *
6
6
  * **Anmeldeweg:** `listMyCashregisters` laeuft im Backend unter
7
7
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})` — der Bearer
8
- * muss also ein Firebase-ID-Token sein. Mit `apiKeyAuth` (api_key als Bearer)
8
+ * muss also ein ID-Token des Anmeldediensts sein. Mit `apiKeyAuth` (api_key als Bearer)
9
9
  * ist dieser Endpunkt **nicht** erreichbar; fuer die Browser-Kasse ist
10
10
  * `registerUserAuth` der Weg. Dieses Paket bildet das nicht nach — wer darf,
11
11
  * entscheidet allein das Backend. Der Hinweis steht hier, damit ein Leser
@@ -8,7 +8,7 @@ const errors_js_1 = require("./errors.js");
8
8
  *
9
9
  * **Anmeldeweg:** `listMyCashregisters` laeuft im Backend unter
10
10
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})` — der Bearer
11
- * muss also ein Firebase-ID-Token sein. Mit `apiKeyAuth` (api_key als Bearer)
11
+ * muss also ein ID-Token des Anmeldediensts sein. Mit `apiKeyAuth` (api_key als Bearer)
12
12
  * ist dieser Endpunkt **nicht** erreichbar; fuer die Browser-Kasse ist
13
13
  * `registerUserAuth` der Weg. Dieses Paket bildet das nicht nach — wer darf,
14
14
  * entscheidet allein das Backend. Der Hinweis steht hier, damit ein Leser
@@ -30,7 +30,7 @@
30
30
  * Sonderfall.
31
31
  *
32
32
  * **Geheimnisse gehoeren in keinen dieser Fehler.** Fehlermeldungen landen in
33
- * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, Firebase-
33
+ * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, ID-
34
34
  * ID-Token noch Sitzungsbezeichner duerfen dorthin. Deshalb tragen die Fehler
35
35
  * ausschliesslich Funktionsname, HTTP-Status/Inhaltstyp, den vom Paket
36
36
  * formulierten Grund und die vom Backend formulierte Meldung — nie Kopfzeilen,
@@ -31,7 +31,7 @@
31
31
  * Sonderfall.
32
32
  *
33
33
  * **Geheimnisse gehoeren in keinen dieser Fehler.** Fehlermeldungen landen in
34
- * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, Firebase-
34
+ * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, ID-
35
35
  * ID-Token noch Sitzungsbezeichner duerfen dorthin. Deshalb tragen die Fehler
36
36
  * ausschliesslich Funktionsname, HTTP-Status/Inhaltstyp, den vom Paket
37
37
  * formulierten Grund und die vom Backend formulierte Meldung — nie Kopfzeilen,
@@ -66,7 +66,7 @@ exports.isKasseneckAuthError = isKasseneckAuthError;
66
66
  exports.isKasseneckValidationError = isKasseneckValidationError;
67
67
  // Bezeichner-artig: Buchstabe vorn, danach nur Bezeichnerzeichen, hoechstens
68
68
  // 64 Zeichen. Das laesst `TypeError`, `ECONNREFUSED` und `auth/internal-error`
69
- // durch, aber keinen Freitext und kein Firebase-ID-Token (~900 Zeichen).
69
+ // durch, aber keinen Freitext und kein ID-Token (~900 Zeichen).
70
70
  const BEZEICHNER = /^[A-Za-z][A-Za-z0-9_./-]{0,63}$/;
71
71
  /**
72
72
  * Reduziert eine fremde Ursache auf Name und Code — und verwirft beides, wenn
@@ -256,7 +256,7 @@ export interface ListMyReceiptsOptions {
256
256
  *
257
257
  * **Anmeldeweg:** Der Endpunkt laeuft im Backend unter
258
258
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})`, der Bearer
259
- * muss also ein Firebase-ID-Token sein — mit `apiKeyAuth` ist er nicht
259
+ * muss also ein ID-Token des Anmeldediensts sein — mit `apiKeyAuth` ist er nicht
260
260
  * erreichbar. Ausserdem prueft das Backend die Kassenzuweisung hier im Rumpf
261
261
  * (der Endpunkt laeuft mit `checkCashRegister: false`), ein Kassen-Benutzer
262
262
  * bekommt also nur die ihm zugewiesenen Kassen.
@@ -217,7 +217,7 @@ function zeroReceipt(rufen) {
217
217
  *
218
218
  * **Anmeldeweg:** Der Endpunkt laeuft im Backend unter
219
219
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})`, der Bearer
220
- * muss also ein Firebase-ID-Token sein — mit `apiKeyAuth` ist er nicht
220
+ * muss also ein ID-Token des Anmeldediensts sein — mit `apiKeyAuth` ist er nicht
221
221
  * erreichbar. Ausserdem prueft das Backend die Kassenzuweisung hier im Rumpf
222
222
  * (der Endpunkt laeuft mit `checkCashRegister: false`), ein Kassen-Benutzer
223
223
  * bekommt also nur die ihm zugewiesenen Kassen.
@@ -7,7 +7,7 @@ import type { KasseneckAuth } from './auth.js';
7
7
  * Der Transport macht drei Dinge und sonst nichts: Anfrage bauen (Kopfzeilen
8
8
  * von der Anmeldung, Nutzlast aus Auth-Parametern und Aufruferparametern),
9
9
  * Zeitlimit ueberwachen, und die Antworthuelle aufloesen. Er kennt keine
10
- * einzelne Backend-Funktion und keine Firebase-Details.
10
+ * einzelne Backend-Funktion und keine Details der Infrastruktur.
11
11
  *
12
12
  * Es gibt **zwei Einstiegspunkte** auf demselben Kern: [createTransport] fuer
13
13
  * die JSON-Aufrufe und [createBinaryTransport] fuer die beiden Bericht-
@@ -12,7 +12,7 @@ const errors_js_1 = require("./errors.js");
12
12
  * Der Transport macht drei Dinge und sonst nichts: Anfrage bauen (Kopfzeilen
13
13
  * von der Anmeldung, Nutzlast aus Auth-Parametern und Aufruferparametern),
14
14
  * Zeitlimit ueberwachen, und die Antworthuelle aufloesen. Er kennt keine
15
- * einzelne Backend-Funktion und keine Firebase-Details.
15
+ * einzelne Backend-Funktion und keine Details der Infrastruktur.
16
16
  *
17
17
  * Es gibt **zwei Einstiegspunkte** auf demselben Kern: [createTransport] fuer
18
18
  * die JSON-Aufrufe und [createBinaryTransport] fuer die beiden Bericht-
@@ -81,7 +81,7 @@ function createCore(options) {
81
81
  throw new errors_js_1.KasseneckNetworkError(fehlerName, true, zeitlimitMs);
82
82
  }
83
83
  // Eigene Pruefungen tragen ihren geheimnisfreien Grund weiter; von einer
84
- // fremden Ursache (Firebase & Co.) bleibt nichts uebrig — weder Meldung
84
+ // fremden Ursache bleibt nichts uebrig — weder Meldung
85
85
  // noch Verdichtung, siehe Klassenkommentar zu KasseneckAuthError.
86
86
  const grund = ursache instanceof errors_js_1.KasseneckAuthError ? ursache.reason : 'Anmeldung fehlgeschlagen';
87
87
  throw new errors_js_1.KasseneckAuthError(grund, { functionName: fehlerName });
@@ -2,7 +2,7 @@
2
2
  * Kasse — die Antwortform von `listMyCashregisters` (functions/index.js).
3
3
  *
4
4
  * Das Dart-Vorbild (`Cashregister` in kasseneck_api/lib/models/cashregister.dart)
5
- * liest das **Firestore-Dokument** direkt ueber das `cloud_firestore`-SDK und
5
+ * liest das **Datenbankdokument** direkt ueber das SDK der Echtzeit-Datenbank und
6
6
  * kommt deshalb an `token` und `aes_key`. Dieses Paket spricht das Backend
7
7
  * ausschliesslich ueber die HTTPS-Endpunkte, und die geben beides nicht her:
8
8
  *
@@ -20,7 +20,7 @@
20
20
  * fehlendes.
21
21
  *
22
22
  * Aus demselben Grund fehlt `userId`: das Dart-Vorbild traegt es, weil es den
23
- * Firestore-**Pfad** kennt (`users/{uid}/cashregisters/{id}`). In dieser
23
+ * **Pfad** in der Datenbank kennt (`users/{uid}/cashregisters/{id}`). In dieser
24
24
  * Antwort steht es nicht, und ein Kassen-Benutzer erfaehrt die Kennung seines
25
25
  * Betriebs bewusst nie — sie steckt allein im Token.
26
26
  */
@@ -36,7 +36,7 @@ export interface ReceiptCompany {
36
36
  logoUrl?: string;
37
37
  /** Dankestext am Belegende, je Zeile ein Eintrag. */
38
38
  thanksMessage: string[];
39
- /** Kreiseck-Branding am Belegende (Firestore-Flag `branding.kreiseck_logo`). */
39
+ /** Kreiseck-Branding am Belegende (Konto-Flag `branding.kreiseck_logo`). */
40
40
  showKreiseckLogo: boolean;
41
41
  }
42
42
  /**
@@ -101,6 +101,17 @@ export declare class HpsConnectTerminalError extends HpsConnectException {
101
101
  * niemals umgekehrt.
102
102
  */
103
103
  get isTerminalBusy(): boolean;
104
+ /**
105
+ * `true`, wenn dies ein HTTP `404` beim Terminal-Kontakt ist -- Lesart
106
+ * ungemessen, siehe [NOT_FOUND_HTTP_STATUS] und den Dart-Zwilling
107
+ * (`HpsHttpException.isNotFound`): es kann "diesen Vorgang kenne ich nicht"
108
+ * heissen oder "diesen Endpunkt gibt es hier nicht". `payments.ts` benennt
109
+ * beim Abbruch beide Lesarten, statt eine zu behaupten.
110
+ *
111
+ * Liest, wie [isTerminalBusy], bevorzugt [terminalHttpStatus] und faellt nur
112
+ * ohne dieses Feld auf den Meldungstext zurueck.
113
+ */
114
+ get isNotFound(): boolean;
104
115
  }
105
116
  /**
106
117
  * Connect selbst war nicht erreichbar, oder die Antwort hatte nicht die
@@ -130,6 +130,22 @@ class HpsConnectTerminalError extends HpsConnectException {
130
130
  }
131
131
  return this.connectCode === 'terminal_error' && new RegExp(`\\(HTTP ${transaction_response_js_1.TERMINAL_BUSY_HTTP_STATUS}\\)`).test(this.message);
132
132
  }
133
+ /**
134
+ * `true`, wenn dies ein HTTP `404` beim Terminal-Kontakt ist -- Lesart
135
+ * ungemessen, siehe [NOT_FOUND_HTTP_STATUS] und den Dart-Zwilling
136
+ * (`HpsHttpException.isNotFound`): es kann "diesen Vorgang kenne ich nicht"
137
+ * heissen oder "diesen Endpunkt gibt es hier nicht". `payments.ts` benennt
138
+ * beim Abbruch beide Lesarten, statt eine zu behaupten.
139
+ *
140
+ * Liest, wie [isTerminalBusy], bevorzugt [terminalHttpStatus] und faellt nur
141
+ * ohne dieses Feld auf den Meldungstext zurueck.
142
+ */
143
+ get isNotFound() {
144
+ if (this.terminalHttpStatus !== undefined) {
145
+ return this.terminalHttpStatus === transaction_response_js_1.NOT_FOUND_HTTP_STATUS;
146
+ }
147
+ return this.connectCode === 'terminal_error' && new RegExp(`\\(HTTP ${transaction_response_js_1.NOT_FOUND_HTTP_STATUS}\\)`).test(this.message);
148
+ }
133
149
  }
134
150
  exports.HpsConnectTerminalError = HpsConnectTerminalError;
135
151
  /**
@@ -23,5 +23,5 @@ export { type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver
23
23
  export { type CardPaymentOutcome, type HpsPaymentResult, isHostUncertainResult, mayRetrySafely, } from './outcome.js';
24
24
  export { type HpsCancelOptions, type HpsPaymentOptions, type HpsPayments, type HpsPaymentsOptions, type HpsRefundOptions, createHpsPayments, } from './payments.js';
25
25
  export { MAX_TRANSACTION_ID_LENGTH, createHpsTransactionIdGenerator, isValidHpsTransactionId, newHpsTransactionId, type HpsTransactionIdGeneratorOptions, } from './transaction-id.js';
26
- export { ABORTED_CODE, APP_SELECT_FAILED_CODE, APPROVED_CODE, BAD_REQUEST_CODE, CARD_DECLINED_CODE, CARD_INFO_NOT_ENTERED_CODE, CARD_NOT_PRESENT_CODE, CARD_NOT_SUPPORTED_CODE, CARD_READ_FAILED_CODE, CHIP_DATA_MISMATCH_CODE, COMPLETION_FAILED_CODE, DIAGNOSIS_FAILED_CODE, HOST_COMMUNICATION_FAILED_CODE, HOST_STEP_FAILED_CODE, HOST_TIMEOUT_REVERSED_CODE, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, INTERNAL_ERROR_CODE, INVALID_MESSAGE_TYPE_CODE, INVALID_TID_DOCUMENTED_CODE, INVALID_TX_TYPE_CODE, MAX_RETRIES_EXCEEDED_CODE, NOT_FOUND_CODE, PASSWORD_NOT_ENTERED_CODE, REFUND_DISABLED_CODE, REFUND_PASSWORD_INVALID_CODE, SCEP_ENROLLMENT_FAILED_CODE, TERMINAL_BLOCKED_CODE, TERMINAL_BUSY_CODE, TIP_SELECTION_FAILED_CODE, UNSUPPORTED_USER_DATA_CODE, hpsCodeInfo, hpsCodeReason, isHostUncertain, isHostUncertainReason, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isConclusiveAsStatus, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsTransactionResponse, } from './transaction-response.js';
26
+ export { ABORTED_CODE, APP_SELECT_FAILED_CODE, APPROVED_CODE, BAD_REQUEST_CODE, CARD_DECLINED_CODE, CARD_INFO_NOT_ENTERED_CODE, CARD_NOT_PRESENT_CODE, CARD_NOT_SUPPORTED_CODE, CARD_READ_FAILED_CODE, CHIP_DATA_MISMATCH_CODE, COMPLETION_FAILED_CODE, DIAGNOSIS_FAILED_CODE, HOST_COMMUNICATION_FAILED_CODE, HOST_STEP_FAILED_CODE, HOST_TIMEOUT_REVERSED_CODE, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, INTERNAL_ERROR_CODE, INVALID_MESSAGE_TYPE_CODE, INVALID_TID_DOCUMENTED_CODE, INVALID_TX_TYPE_CODE, MAX_RETRIES_EXCEEDED_CODE, NOT_FOUND_CODE, PASSWORD_NOT_ENTERED_CODE, REFUND_DISABLED_CODE, REFUND_PASSWORD_INVALID_CODE, SCEP_ENROLLMENT_FAILED_CODE, TERMINAL_BLOCKED_CODE, TERMINAL_BUSY_CODE, TIP_SELECTION_FAILED_CODE, UNSUPPORTED_USER_DATA_CODE, hpsCodeInfo, hpsCodeReason, isHostUncertain, isHostUncertainReason, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, NOT_FOUND_HTTP_STATUS, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isConclusiveAsStatus, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsTransactionResponse, } from './transaction-response.js';
27
27
  export { hobexReceiptFromHps } from './receipt.js';
@@ -20,7 +20,7 @@
20
20
  */
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.isHostUncertain = exports.hpsCodeReason = exports.hpsCodeInfo = exports.UNSUPPORTED_USER_DATA_CODE = exports.TIP_SELECTION_FAILED_CODE = exports.TERMINAL_BUSY_CODE = exports.TERMINAL_BLOCKED_CODE = exports.SCEP_ENROLLMENT_FAILED_CODE = exports.REFUND_PASSWORD_INVALID_CODE = exports.REFUND_DISABLED_CODE = exports.PASSWORD_NOT_ENTERED_CODE = exports.NOT_FOUND_CODE = exports.MAX_RETRIES_EXCEEDED_CODE = exports.INVALID_TX_TYPE_CODE = exports.INVALID_TID_DOCUMENTED_CODE = exports.INVALID_MESSAGE_TYPE_CODE = exports.INTERNAL_ERROR_CODE = exports.HPS_REASON_HINTS = exports.HPS_MEASURED_CODES = exports.HPS_CODES = exports.HOST_TIMEOUT_REVERSED_CODE = exports.HOST_STEP_FAILED_CODE = exports.HOST_COMMUNICATION_FAILED_CODE = exports.DIAGNOSIS_FAILED_CODE = exports.COMPLETION_FAILED_CODE = exports.CHIP_DATA_MISMATCH_CODE = exports.CARD_READ_FAILED_CODE = exports.CARD_NOT_SUPPORTED_CODE = exports.CARD_NOT_PRESENT_CODE = exports.CARD_INFO_NOT_ENTERED_CODE = exports.CARD_DECLINED_CODE = exports.BAD_REQUEST_CODE = exports.APPROVED_CODE = exports.APP_SELECT_FAILED_CODE = exports.ABORTED_CODE = exports.newHpsTransactionId = exports.isValidHpsTransactionId = exports.createHpsTransactionIdGenerator = exports.MAX_TRANSACTION_ID_LENGTH = exports.createHpsPayments = exports.mayRetrySafely = exports.isHostUncertainResult = exports.PREFLIGHT_CONNECT_CODES = exports.HpsTransactionIdError = exports.HpsPreflightError = exports.HpsConnectTransportError = exports.HpsConnectTerminalError = exports.HpsConnectException = exports.HpsClarifyTimeoutError = exports.createHpsConnectClient = void 0;
23
- exports.hobexReceiptFromHps = exports.parseHpsTransactionResponse = exports.isUnknownCode = exports.isTechnicalError = exports.isNotAbortable = exports.isNoStatement = exports.isInProgress = exports.isConclusiveAsStatus = exports.isConclusive = exports.isCanceled = exports.isApproved = exports.TRANSACTION_CANCELED_CODE = exports.TERMINAL_BUSY_HTTP_STATUS = exports.TECHNICAL_ERROR_CODE = exports.NO_STATEMENT_CODE = exports.WRONG_PIN_CODE = exports.INVALID_TID_CODE = exports.AMOUNT_OUT_OF_RANGE_CODE = exports.INVALID_AMOUNT_CODE = exports.NOT_ABORTABLE_CODE = exports.INVALID_TRANSACTION_CODE = exports.isHostUncertainReason = void 0;
23
+ exports.hobexReceiptFromHps = exports.parseHpsTransactionResponse = exports.isUnknownCode = exports.isTechnicalError = exports.isNotAbortable = exports.isNoStatement = exports.isInProgress = exports.isConclusiveAsStatus = exports.isConclusive = exports.isCanceled = exports.isApproved = exports.TRANSACTION_CANCELED_CODE = exports.TERMINAL_BUSY_HTTP_STATUS = exports.NOT_FOUND_HTTP_STATUS = exports.TECHNICAL_ERROR_CODE = exports.NO_STATEMENT_CODE = exports.WRONG_PIN_CODE = exports.INVALID_TID_CODE = exports.AMOUNT_OUT_OF_RANGE_CODE = exports.INVALID_AMOUNT_CODE = exports.NOT_ABORTABLE_CODE = exports.INVALID_TRANSACTION_CODE = exports.isHostUncertainReason = void 0;
24
24
  var connect_client_js_1 = require("./connect-client.js");
25
25
  Object.defineProperty(exports, "createHpsConnectClient", { enumerable: true, get: function () { return connect_client_js_1.createHpsConnectClient; } });
26
26
  var errors_js_1 = require("./errors.js");
@@ -86,6 +86,7 @@ Object.defineProperty(exports, "INVALID_TID_CODE", { enumerable: true, get: func
86
86
  Object.defineProperty(exports, "WRONG_PIN_CODE", { enumerable: true, get: function () { return transaction_response_js_1.WRONG_PIN_CODE; } });
87
87
  Object.defineProperty(exports, "NO_STATEMENT_CODE", { enumerable: true, get: function () { return transaction_response_js_1.NO_STATEMENT_CODE; } });
88
88
  Object.defineProperty(exports, "TECHNICAL_ERROR_CODE", { enumerable: true, get: function () { return transaction_response_js_1.TECHNICAL_ERROR_CODE; } });
89
+ Object.defineProperty(exports, "NOT_FOUND_HTTP_STATUS", { enumerable: true, get: function () { return transaction_response_js_1.NOT_FOUND_HTTP_STATUS; } });
89
90
  Object.defineProperty(exports, "TERMINAL_BUSY_HTTP_STATUS", { enumerable: true, get: function () { return transaction_response_js_1.TERMINAL_BUSY_HTTP_STATUS; } });
90
91
  Object.defineProperty(exports, "TRANSACTION_CANCELED_CODE", { enumerable: true, get: function () { return transaction_response_js_1.TRANSACTION_CANCELED_CODE; } });
91
92
  Object.defineProperty(exports, "isApproved", { enumerable: true, get: function () { return transaction_response_js_1.isApproved; } });
@@ -321,7 +321,12 @@ function createHpsPayments(client, target, options = {}) {
321
321
  res = await withinBudget(elapsedMs, () => client.abort({ ...target, transactionId: id }), abortBudgetMs);
322
322
  }
323
323
  catch (e) {
324
- steps.push(`Abbruch nicht bestaetigt (${describe(e)}) -- ob er wirkte, ist offen, Ausgang wird abgefragt`);
324
+ // Siehe Dart-Zwilling: ein 404 hat zwei Lesarten, und wir kennen die
325
+ // richtige nicht. Der Nachweistext benennt beide und behauptet keine.
326
+ steps.push(e instanceof errors_js_1.HpsConnectTerminalError && e.isNotFound
327
+ ? 'Abbruch nicht bestaetigt (HTTP 404) -- das Terminal kennt entweder diesen Vorgang nicht '
328
+ + 'oder den Abbruch-Endpunkt nicht; beides sagt nichts ueber die Zahlung, Ausgang wird abgefragt'
329
+ : `Abbruch nicht bestaetigt (${describe(e)}) -- ob er wirkte, ist offen, Ausgang wird abgefragt`);
325
330
  noteUnexpected(e, id);
326
331
  return null;
327
332
  }
@@ -216,6 +216,18 @@ export declare const INTERNAL_ERROR_CODE = "100999";
216
216
  * getrennte Auswertung.
217
217
  */
218
218
  export declare const TERMINAL_BUSY_HTTP_STATUS = 409;
219
+ /**
220
+ * HTTP `404` beim Terminal-Kontakt. **Lesart ungemessen:** am Produktivgeraet
221
+ * (TID 3556988, Firmware 2.3.9) antwortet `POST /api/transaction/abort/...`
222
+ * damit, am Testgeraet (3600335) nie. Es kann "diesen Vorgang kenne ich nicht"
223
+ * heissen oder "diesen Endpunkt gibt es hier nicht" -- beides sagt nichts ueber
224
+ * die Zahlung. Bei hobex angefragt; bis dahin benennt `payments.ts` beim
225
+ * Abbruch beide Lesarten, statt eine zu behaupten.
226
+ *
227
+ * Wie [TERMINAL_BUSY_HTTP_STATUS] bewusst KEIN Eintrag in [HPS_CODES]: ein
228
+ * HTTP-Status ist kein `responseCode`.
229
+ */
230
+ export declare const NOT_FOUND_HTTP_STATUS = 404;
219
231
  /** Der Eintrag zu [code] in [HPS_CODES], oder `undefined`, wenn seine Bedeutung nicht feststeht. */
220
232
  export declare function hpsCodeInfo(code: string | undefined): HpsCode | undefined;
221
233
  /**
@@ -28,7 +28,7 @@
28
28
  * sein kann, als `declined` gemeldet.
29
29
  */
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
- exports.TERMINAL_BUSY_HTTP_STATUS = exports.INTERNAL_ERROR_CODE = exports.TERMINAL_BUSY_CODE = exports.HOST_TIMEOUT_REVERSED_CODE = exports.TIP_SELECTION_FAILED_CODE = exports.UNSUPPORTED_USER_DATA_CODE = exports.CHIP_DATA_MISMATCH_CODE = exports.REFUND_DISABLED_CODE = exports.COMPLETION_FAILED_CODE = exports.INVALID_MESSAGE_TYPE_CODE = exports.TERMINAL_BLOCKED_CODE = exports.PASSWORD_NOT_ENTERED_CODE = exports.REFUND_PASSWORD_INVALID_CODE = exports.SCEP_ENROLLMENT_FAILED_CODE = exports.CARD_NOT_SUPPORTED_CODE = exports.CARD_DECLINED_CODE = exports.CARD_INFO_NOT_ENTERED_CODE = exports.DIAGNOSIS_FAILED_CODE = exports.MAX_RETRIES_EXCEEDED_CODE = exports.NOT_FOUND_CODE = exports.INVALID_TX_TYPE_CODE = exports.INVALID_TID_DOCUMENTED_CODE = exports.HOST_STEP_FAILED_CODE = exports.HOST_COMMUNICATION_FAILED_CODE = exports.APP_SELECT_FAILED_CODE = exports.CARD_READ_FAILED_CODE = exports.BAD_REQUEST_CODE = exports.WRONG_PIN_CODE = exports.INVALID_TID_CODE = exports.AMOUNT_OUT_OF_RANGE_CODE = exports.INVALID_AMOUNT_CODE = exports.NOT_ABORTABLE_CODE = exports.CARD_NOT_PRESENT_CODE = exports.ABORTED_CODE = exports.TECHNICAL_ERROR_CODE = exports.NO_STATEMENT_CODE = exports.TRANSACTION_CANCELED_CODE = exports.INVALID_TRANSACTION_CODE = exports.APPROVED_CODE = exports.HPS_MEASURED_CODES = exports.HPS_CODES = exports.HPS_REASON_HINTS = void 0;
31
+ exports.NOT_FOUND_HTTP_STATUS = exports.TERMINAL_BUSY_HTTP_STATUS = exports.INTERNAL_ERROR_CODE = exports.TERMINAL_BUSY_CODE = exports.HOST_TIMEOUT_REVERSED_CODE = exports.TIP_SELECTION_FAILED_CODE = exports.UNSUPPORTED_USER_DATA_CODE = exports.CHIP_DATA_MISMATCH_CODE = exports.REFUND_DISABLED_CODE = exports.COMPLETION_FAILED_CODE = exports.INVALID_MESSAGE_TYPE_CODE = exports.TERMINAL_BLOCKED_CODE = exports.PASSWORD_NOT_ENTERED_CODE = exports.REFUND_PASSWORD_INVALID_CODE = exports.SCEP_ENROLLMENT_FAILED_CODE = exports.CARD_NOT_SUPPORTED_CODE = exports.CARD_DECLINED_CODE = exports.CARD_INFO_NOT_ENTERED_CODE = exports.DIAGNOSIS_FAILED_CODE = exports.MAX_RETRIES_EXCEEDED_CODE = exports.NOT_FOUND_CODE = exports.INVALID_TX_TYPE_CODE = exports.INVALID_TID_DOCUMENTED_CODE = exports.HOST_STEP_FAILED_CODE = exports.HOST_COMMUNICATION_FAILED_CODE = exports.APP_SELECT_FAILED_CODE = exports.CARD_READ_FAILED_CODE = exports.BAD_REQUEST_CODE = exports.WRONG_PIN_CODE = exports.INVALID_TID_CODE = exports.AMOUNT_OUT_OF_RANGE_CODE = exports.INVALID_AMOUNT_CODE = exports.NOT_ABORTABLE_CODE = exports.CARD_NOT_PRESENT_CODE = exports.ABORTED_CODE = exports.TECHNICAL_ERROR_CODE = exports.NO_STATEMENT_CODE = exports.TRANSACTION_CANCELED_CODE = exports.INVALID_TRANSACTION_CODE = exports.APPROVED_CODE = exports.HPS_MEASURED_CODES = exports.HPS_CODES = exports.HPS_REASON_HINTS = void 0;
32
32
  exports.isHostUncertainReason = isHostUncertainReason;
33
33
  exports.hpsCodeInfo = hpsCodeInfo;
34
34
  exports.hpsCodeReason = hpsCodeReason;
@@ -332,6 +332,18 @@ exports.INTERNAL_ERROR_CODE = '100999';
332
332
  * getrennte Auswertung.
333
333
  */
334
334
  exports.TERMINAL_BUSY_HTTP_STATUS = 409;
335
+ /**
336
+ * HTTP `404` beim Terminal-Kontakt. **Lesart ungemessen:** am Produktivgeraet
337
+ * (TID 3556988, Firmware 2.3.9) antwortet `POST /api/transaction/abort/...`
338
+ * damit, am Testgeraet (3600335) nie. Es kann "diesen Vorgang kenne ich nicht"
339
+ * heissen oder "diesen Endpunkt gibt es hier nicht" -- beides sagt nichts ueber
340
+ * die Zahlung. Bei hobex angefragt; bis dahin benennt `payments.ts` beim
341
+ * Abbruch beide Lesarten, statt eine zu behaupten.
342
+ *
343
+ * Wie [TERMINAL_BUSY_HTTP_STATUS] bewusst KEIN Eintrag in [HPS_CODES]: ein
344
+ * HTTP-Status ist kein `responseCode`.
345
+ */
346
+ exports.NOT_FOUND_HTTP_STATUS = 404;
335
347
  const CODE_BY_ID = new Map(exports.HPS_CODES.map((c) => [c.code, c]));
336
348
  /** Der Eintrag zu [code] in [HPS_CODES], oder `undefined`, wenn seine Bedeutung nicht feststeht. */
337
349
  function hpsCodeInfo(code) {
@@ -42,4 +42,4 @@
42
42
  export { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
43
43
  export { type CreateStripeLinkOptions, type StripeCaptureResult, createStripeLink, stripeCaptureIntent, } from './stripe.js';
44
44
  export { type HobexPayOptions, type HobexRefundOptions, type HobexTransactionIdOptions, hobexPay, hobexRefund, newHobexTransactionId, } from './hobex.js';
45
- export { type CardPaymentOutcome, type HpsConnectClient, type HpsConnectClientOptions, type HpsConnectFetch, type HpsConnectFetchResponse, type HpsConnectPaymentOptions, type HpsConnectTarget, type HpsConnectTransactionOptions, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver, type HpsPaymentOptions, type HpsPayments, type HpsPaymentResult, type HpsPaymentsOptions, type HpsTransactionIdGeneratorOptions, type HpsTransactionResponse, ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, hpsCodeInfo, hpsCodeReason, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isConclusiveAsStatus, isHostUncertain, isHostUncertainResult, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
45
+ export { type CardPaymentOutcome, type HpsConnectClient, type HpsConnectClientOptions, type HpsConnectFetch, type HpsConnectFetchResponse, type HpsConnectPaymentOptions, type HpsConnectTarget, type HpsConnectTransactionOptions, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver, type HpsPaymentOptions, type HpsPayments, type HpsPaymentResult, type HpsPaymentsOptions, type HpsTransactionIdGeneratorOptions, type HpsTransactionResponse, ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, hpsCodeInfo, hpsCodeReason, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isConclusiveAsStatus, isHostUncertain, isHostUncertainResult, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, NOT_FOUND_HTTP_STATUS, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
@@ -41,7 +41,7 @@
41
41
  * nichts zu entscheiden.
42
42
  */
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.TRANSACTION_CANCELED_CODE = exports.TERMINAL_BUSY_HTTP_STATUS = exports.TECHNICAL_ERROR_CODE = exports.PREFLIGHT_CONNECT_CODES = exports.parseHpsTransactionResponse = exports.NO_STATEMENT_CODE = exports.NOT_ABORTABLE_CODE = exports.newHpsTransactionId = exports.MAX_TRANSACTION_ID_LENGTH = exports.mayRetrySafely = exports.isValidHpsTransactionId = exports.isUnknownCode = exports.isTechnicalError = exports.isNotAbortable = exports.isNoStatement = exports.isInProgress = exports.isHostUncertainResult = exports.isHostUncertain = exports.isConclusiveAsStatus = exports.isConclusive = exports.isApproved = exports.INVALID_TRANSACTION_CODE = exports.HpsTransactionIdError = exports.HpsPreflightError = exports.HpsConnectTransportError = exports.HpsConnectTerminalError = exports.HpsConnectException = exports.HpsClarifyTimeoutError = exports.hpsCodeReason = exports.hpsCodeInfo = exports.HPS_REASON_HINTS = exports.HPS_MEASURED_CODES = exports.HPS_CODES = exports.createHpsTransactionIdGenerator = exports.createHpsPayments = exports.createHpsConnectClient = exports.CARD_NOT_PRESENT_CODE = exports.APPROVED_CODE = exports.ABORTED_CODE = exports.newHobexTransactionId = exports.hobexRefund = exports.hobexPay = exports.stripeCaptureIntent = exports.createStripeLink = exports.StripeLinkMode = void 0;
44
+ exports.TRANSACTION_CANCELED_CODE = exports.TERMINAL_BUSY_HTTP_STATUS = exports.NOT_FOUND_HTTP_STATUS = exports.TECHNICAL_ERROR_CODE = exports.PREFLIGHT_CONNECT_CODES = exports.parseHpsTransactionResponse = exports.NO_STATEMENT_CODE = exports.NOT_ABORTABLE_CODE = exports.newHpsTransactionId = exports.MAX_TRANSACTION_ID_LENGTH = exports.mayRetrySafely = exports.isValidHpsTransactionId = exports.isUnknownCode = exports.isTechnicalError = exports.isNotAbortable = exports.isNoStatement = exports.isInProgress = exports.isHostUncertainResult = exports.isHostUncertain = exports.isConclusiveAsStatus = exports.isConclusive = exports.isApproved = exports.INVALID_TRANSACTION_CODE = exports.HpsTransactionIdError = exports.HpsPreflightError = exports.HpsConnectTransportError = exports.HpsConnectTerminalError = exports.HpsConnectException = exports.HpsClarifyTimeoutError = exports.hpsCodeReason = exports.hpsCodeInfo = exports.HPS_REASON_HINTS = exports.HPS_MEASURED_CODES = exports.HPS_CODES = exports.createHpsTransactionIdGenerator = exports.createHpsPayments = exports.createHpsConnectClient = exports.CARD_NOT_PRESENT_CODE = exports.APPROVED_CODE = exports.ABORTED_CODE = exports.newHobexTransactionId = exports.hobexRefund = exports.hobexPay = exports.stripeCaptureIntent = exports.createStripeLink = exports.StripeLinkMode = void 0;
45
45
  var index_js_1 = require("../enums/index.js");
46
46
  Object.defineProperty(exports, "StripeLinkMode", { enumerable: true, get: function () { return index_js_1.StripeLinkMode; } });
47
47
  var stripe_js_1 = require("./stripe.js");
@@ -89,5 +89,6 @@ Object.defineProperty(exports, "NO_STATEMENT_CODE", { enumerable: true, get: fun
89
89
  Object.defineProperty(exports, "parseHpsTransactionResponse", { enumerable: true, get: function () { return index_js_2.parseHpsTransactionResponse; } });
90
90
  Object.defineProperty(exports, "PREFLIGHT_CONNECT_CODES", { enumerable: true, get: function () { return index_js_2.PREFLIGHT_CONNECT_CODES; } });
91
91
  Object.defineProperty(exports, "TECHNICAL_ERROR_CODE", { enumerable: true, get: function () { return index_js_2.TECHNICAL_ERROR_CODE; } });
92
+ Object.defineProperty(exports, "NOT_FOUND_HTTP_STATUS", { enumerable: true, get: function () { return index_js_2.NOT_FOUND_HTTP_STATUS; } });
92
93
  Object.defineProperty(exports, "TERMINAL_BUSY_HTTP_STATUS", { enumerable: true, get: function () { return index_js_2.TERMINAL_BUSY_HTTP_STATUS; } });
93
94
  Object.defineProperty(exports, "TRANSACTION_CANCELED_CODE", { enumerable: true, get: function () { return index_js_2.TRANSACTION_CANCELED_CODE; } });
@@ -43,7 +43,7 @@
43
43
  * });
44
44
  * ```
45
45
  *
46
- * Mit `sitzung.customToken` meldet sich der Verbraucher bei Firebase an; das
46
+ * Mit `sitzung.customToken` meldet sich der Verbraucher beim Anmeldedienst an; das
47
47
  * daraus entstehende ID-Token und `sitzung.sessionId` ergeben zusammen
48
48
  * `registerUserAuth` — ab da laeuft alles Weitere ueber den ueblichen Weg.
49
49
  */
@@ -44,7 +44,7 @@
44
44
  * });
45
45
  * ```
46
46
  *
47
- * Mit `sitzung.customToken` meldet sich der Verbraucher bei Firebase an; das
47
+ * Mit `sitzung.customToken` meldet sich der Verbraucher beim Anmeldedienst an; das
48
48
  * daraus entstehende ID-Token und `sitzung.sessionId` ergeben zusammen
49
49
  * `registerUserAuth` — ab da laeuft alles Weitere ueber den ueblichen Weg.
50
50
  */
@@ -188,9 +188,9 @@ export interface RegisterUser {
188
188
  /** Ergebnis der PIN-Anmeldung. */
189
189
  export interface RegisterUserSession {
190
190
  /**
191
- * Firebase-Custom-Token. Damit meldet der Verbraucher sich bei Firebase an
191
+ * Custom-Token des Anmeldediensts. Damit meldet der Verbraucher sich dort an
192
192
  * und bekommt das ID-Token, das `registerUserAuth` braucht; dieses Paket
193
- * kennt Firebase nicht.
193
+ * kennt den Anmeldedienst nicht.
194
194
  */
195
195
  customToken: string;
196
196
  /** Laufende Sitzung — Kopfzeile `register-session` jedes weiteren Aufrufs. */
@@ -6,7 +6,7 @@
6
6
  * Bearer plus die Kopfzeile `cashregister-token` (wie im Flutter-Zwilling
7
7
  * `kasseneck_api`).
8
8
  * - `registerUserAuth` — der Weg der Browser-Kasse: ein Kassen-Benutzer, per
9
- * PIN an einem gekoppelten Geraet angemeldet. Firebase-ID-Token als Bearer,
9
+ * PIN an einem gekoppelten Geraet angemeldet. ID-Token als Bearer,
10
10
  * die laufende Sitzung als Kopfzeile `register-session`, die Kasse als
11
11
  * Parameter `cashregisterId` in der Nutzlast.
12
12
  *
@@ -14,9 +14,9 @@
14
14
  * fuehrt keine eigenen HTTP-Aufrufe, kennt den Transport nicht und haelt keinen
15
15
  * Zustand — genau deshalb ist sie austauschbar und einzeln testbar.
16
16
  *
17
- * Das Paket weiss **nichts** von Firebase: `registerUserAuth` bekommt eine
17
+ * Das Paket weiss **nichts** vom Anmeldedienst: `registerUserAuth` bekommt eine
18
18
  * Funktion, die ein gueltiges ID-Token liefert (darf `async` sein). Sie wird
19
- * bei **jedem** Aufruf befragt — Firebase-ID-Tokens laufen nach einer Stunde
19
+ * bei **jedem** Aufruf befragt — ID-Tokens laufen nach einer Stunde
20
20
  * ab, die Sitzung der Browser-Kasse lebt sogar nur 90 Sekunden und wird alle
21
21
  * 30 Sekunden erneuert; ein einmal gemerkter Wert waere also bald tot.
22
22
  */
@@ -39,7 +39,7 @@ export interface ApiKeyAuthOptions {
39
39
  cashregisterToken: string;
40
40
  }
41
41
  export interface RegisterUserAuthOptions {
42
- /** Liefert ein gueltiges Firebase-ID-Token; wird pro Anfrage befragt. */
42
+ /** Liefert ein gueltiges ID-Token des Anmeldediensts; wird pro Anfrage befragt. */
43
43
  getIdToken: () => string | Promise<string>;
44
44
  /** Liefert die laufende Kassen-Sitzung; wird pro Anfrage befragt. */
45
45
  getSessionId: () => string | Promise<string>;
@@ -6,7 +6,7 @@
6
6
  * Bearer plus die Kopfzeile `cashregister-token` (wie im Flutter-Zwilling
7
7
  * `kasseneck_api`).
8
8
  * - `registerUserAuth` — der Weg der Browser-Kasse: ein Kassen-Benutzer, per
9
- * PIN an einem gekoppelten Geraet angemeldet. Firebase-ID-Token als Bearer,
9
+ * PIN an einem gekoppelten Geraet angemeldet. ID-Token als Bearer,
10
10
  * die laufende Sitzung als Kopfzeile `register-session`, die Kasse als
11
11
  * Parameter `cashregisterId` in der Nutzlast.
12
12
  *
@@ -14,9 +14,9 @@
14
14
  * fuehrt keine eigenen HTTP-Aufrufe, kennt den Transport nicht und haelt keinen
15
15
  * Zustand — genau deshalb ist sie austauschbar und einzeln testbar.
16
16
  *
17
- * Das Paket weiss **nichts** von Firebase: `registerUserAuth` bekommt eine
17
+ * Das Paket weiss **nichts** vom Anmeldedienst: `registerUserAuth` bekommt eine
18
18
  * Funktion, die ein gueltiges ID-Token liefert (darf `async` sein). Sie wird
19
- * bei **jedem** Aufruf befragt — Firebase-ID-Tokens laufen nach einer Stunde
19
+ * bei **jedem** Aufruf befragt — ID-Tokens laufen nach einer Stunde
20
20
  * ab, die Sitzung der Browser-Kasse lebt sogar nur 90 Sekunden und wird alle
21
21
  * 30 Sekunden erneuert; ein einmal gemerkter Wert waere also bald tot.
22
22
  */
@@ -5,7 +5,7 @@ import type { InternerTransport } from './aufrufe.js';
5
5
  *
6
6
  * **Anmeldeweg:** `listMyCashregisters` laeuft im Backend unter
7
7
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})` — der Bearer
8
- * muss also ein Firebase-ID-Token sein. Mit `apiKeyAuth` (api_key als Bearer)
8
+ * muss also ein ID-Token des Anmeldediensts sein. Mit `apiKeyAuth` (api_key als Bearer)
9
9
  * ist dieser Endpunkt **nicht** erreichbar; fuer die Browser-Kasse ist
10
10
  * `registerUserAuth` der Weg. Dieses Paket bildet das nicht nach — wer darf,
11
11
  * entscheidet allein das Backend. Der Hinweis steht hier, damit ein Leser
@@ -5,7 +5,7 @@ import { KasseneckValidationError } from './errors.js';
5
5
  *
6
6
  * **Anmeldeweg:** `listMyCashregisters` laeuft im Backend unter
7
7
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})` — der Bearer
8
- * muss also ein Firebase-ID-Token sein. Mit `apiKeyAuth` (api_key als Bearer)
8
+ * muss also ein ID-Token des Anmeldediensts sein. Mit `apiKeyAuth` (api_key als Bearer)
9
9
  * ist dieser Endpunkt **nicht** erreichbar; fuer die Browser-Kasse ist
10
10
  * `registerUserAuth` der Weg. Dieses Paket bildet das nicht nach — wer darf,
11
11
  * entscheidet allein das Backend. Der Hinweis steht hier, damit ein Leser
@@ -30,7 +30,7 @@
30
30
  * Sonderfall.
31
31
  *
32
32
  * **Geheimnisse gehoeren in keinen dieser Fehler.** Fehlermeldungen landen in
33
- * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, Firebase-
33
+ * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, ID-
34
34
  * ID-Token noch Sitzungsbezeichner duerfen dorthin. Deshalb tragen die Fehler
35
35
  * ausschliesslich Funktionsname, HTTP-Status/Inhaltstyp, den vom Paket
36
36
  * formulierten Grund und die vom Backend formulierte Meldung — nie Kopfzeilen,
@@ -30,7 +30,7 @@
30
30
  * Sonderfall.
31
31
  *
32
32
  * **Geheimnisse gehoeren in keinen dieser Fehler.** Fehlermeldungen landen in
33
- * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, Firebase-
33
+ * Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, ID-
34
34
  * ID-Token noch Sitzungsbezeichner duerfen dorthin. Deshalb tragen die Fehler
35
35
  * ausschliesslich Funktionsname, HTTP-Status/Inhaltstyp, den vom Paket
36
36
  * formulierten Grund und die vom Backend formulierte Meldung — nie Kopfzeilen,
@@ -56,7 +56,7 @@
56
56
  */
57
57
  // Bezeichner-artig: Buchstabe vorn, danach nur Bezeichnerzeichen, hoechstens
58
58
  // 64 Zeichen. Das laesst `TypeError`, `ECONNREFUSED` und `auth/internal-error`
59
- // durch, aber keinen Freitext und kein Firebase-ID-Token (~900 Zeichen).
59
+ // durch, aber keinen Freitext und kein ID-Token (~900 Zeichen).
60
60
  const BEZEICHNER = /^[A-Za-z][A-Za-z0-9_./-]{0,63}$/;
61
61
  /**
62
62
  * Reduziert eine fremde Ursache auf Name und Code — und verwirft beides, wenn
@@ -256,7 +256,7 @@ export interface ListMyReceiptsOptions {
256
256
  *
257
257
  * **Anmeldeweg:** Der Endpunkt laeuft im Backend unter
258
258
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})`, der Bearer
259
- * muss also ein Firebase-ID-Token sein — mit `apiKeyAuth` ist er nicht
259
+ * muss also ein ID-Token des Anmeldediensts sein — mit `apiKeyAuth` ist er nicht
260
260
  * erreichbar. Ausserdem prueft das Backend die Kassenzuweisung hier im Rumpf
261
261
  * (der Endpunkt laeuft mit `checkCashRegister: false`), ein Kassen-Benutzer
262
262
  * bekommt also nur die ihm zugewiesenen Kassen.
@@ -202,7 +202,7 @@ export function zeroReceipt(rufen) {
202
202
  *
203
203
  * **Anmeldeweg:** Der Endpunkt laeuft im Backend unter
204
204
  * `checkRequest(req, 'customer', …, {allowRegisterUser: true})`, der Bearer
205
- * muss also ein Firebase-ID-Token sein — mit `apiKeyAuth` ist er nicht
205
+ * muss also ein ID-Token des Anmeldediensts sein — mit `apiKeyAuth` ist er nicht
206
206
  * erreichbar. Ausserdem prueft das Backend die Kassenzuweisung hier im Rumpf
207
207
  * (der Endpunkt laeuft mit `checkCashRegister: false`), ein Kassen-Benutzer
208
208
  * bekommt also nur die ihm zugewiesenen Kassen.
@@ -7,7 +7,7 @@ import type { KasseneckAuth } from './auth.js';
7
7
  * Der Transport macht drei Dinge und sonst nichts: Anfrage bauen (Kopfzeilen
8
8
  * von der Anmeldung, Nutzlast aus Auth-Parametern und Aufruferparametern),
9
9
  * Zeitlimit ueberwachen, und die Antworthuelle aufloesen. Er kennt keine
10
- * einzelne Backend-Funktion und keine Firebase-Details.
10
+ * einzelne Backend-Funktion und keine Details der Infrastruktur.
11
11
  *
12
12
  * Es gibt **zwei Einstiegspunkte** auf demselben Kern: [createTransport] fuer
13
13
  * die JSON-Aufrufe und [createBinaryTransport] fuer die beiden Bericht-
@@ -7,7 +7,7 @@ import { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNet
7
7
  * Der Transport macht drei Dinge und sonst nichts: Anfrage bauen (Kopfzeilen
8
8
  * von der Anmeldung, Nutzlast aus Auth-Parametern und Aufruferparametern),
9
9
  * Zeitlimit ueberwachen, und die Antworthuelle aufloesen. Er kennt keine
10
- * einzelne Backend-Funktion und keine Firebase-Details.
10
+ * einzelne Backend-Funktion und keine Details der Infrastruktur.
11
11
  *
12
12
  * Es gibt **zwei Einstiegspunkte** auf demselben Kern: [createTransport] fuer
13
13
  * die JSON-Aufrufe und [createBinaryTransport] fuer die beiden Bericht-
@@ -76,7 +76,7 @@ function createCore(options) {
76
76
  throw new KasseneckNetworkError(fehlerName, true, zeitlimitMs);
77
77
  }
78
78
  // Eigene Pruefungen tragen ihren geheimnisfreien Grund weiter; von einer
79
- // fremden Ursache (Firebase & Co.) bleibt nichts uebrig — weder Meldung
79
+ // fremden Ursache bleibt nichts uebrig — weder Meldung
80
80
  // noch Verdichtung, siehe Klassenkommentar zu KasseneckAuthError.
81
81
  const grund = ursache instanceof KasseneckAuthError ? ursache.reason : 'Anmeldung fehlgeschlagen';
82
82
  throw new KasseneckAuthError(grund, { functionName: fehlerName });
@@ -2,7 +2,7 @@
2
2
  * Kasse — die Antwortform von `listMyCashregisters` (functions/index.js).
3
3
  *
4
4
  * Das Dart-Vorbild (`Cashregister` in kasseneck_api/lib/models/cashregister.dart)
5
- * liest das **Firestore-Dokument** direkt ueber das `cloud_firestore`-SDK und
5
+ * liest das **Datenbankdokument** direkt ueber das SDK der Echtzeit-Datenbank und
6
6
  * kommt deshalb an `token` und `aes_key`. Dieses Paket spricht das Backend
7
7
  * ausschliesslich ueber die HTTPS-Endpunkte, und die geben beides nicht her:
8
8
  *
@@ -20,7 +20,7 @@
20
20
  * fehlendes.
21
21
  *
22
22
  * Aus demselben Grund fehlt `userId`: das Dart-Vorbild traegt es, weil es den
23
- * Firestore-**Pfad** kennt (`users/{uid}/cashregisters/{id}`). In dieser
23
+ * **Pfad** in der Datenbank kennt (`users/{uid}/cashregisters/{id}`). In dieser
24
24
  * Antwort steht es nicht, und ein Kassen-Benutzer erfaehrt die Kennung seines
25
25
  * Betriebs bewusst nie — sie steckt allein im Token.
26
26
  */
@@ -36,7 +36,7 @@ export interface ReceiptCompany {
36
36
  logoUrl?: string;
37
37
  /** Dankestext am Belegende, je Zeile ein Eintrag. */
38
38
  thanksMessage: string[];
39
- /** Kreiseck-Branding am Belegende (Firestore-Flag `branding.kreiseck_logo`). */
39
+ /** Kreiseck-Branding am Belegende (Konto-Flag `branding.kreiseck_logo`). */
40
40
  showKreiseckLogo: boolean;
41
41
  }
42
42
  /**
@@ -101,6 +101,17 @@ export declare class HpsConnectTerminalError extends HpsConnectException {
101
101
  * niemals umgekehrt.
102
102
  */
103
103
  get isTerminalBusy(): boolean;
104
+ /**
105
+ * `true`, wenn dies ein HTTP `404` beim Terminal-Kontakt ist -- Lesart
106
+ * ungemessen, siehe [NOT_FOUND_HTTP_STATUS] und den Dart-Zwilling
107
+ * (`HpsHttpException.isNotFound`): es kann "diesen Vorgang kenne ich nicht"
108
+ * heissen oder "diesen Endpunkt gibt es hier nicht". `payments.ts` benennt
109
+ * beim Abbruch beide Lesarten, statt eine zu behaupten.
110
+ *
111
+ * Liest, wie [isTerminalBusy], bevorzugt [terminalHttpStatus] und faellt nur
112
+ * ohne dieses Feld auf den Meldungstext zurueck.
113
+ */
114
+ get isNotFound(): boolean;
104
115
  }
105
116
  /**
106
117
  * Connect selbst war nicht erreichbar, oder die Antwort hatte nicht die
@@ -1,4 +1,4 @@
1
- import { TERMINAL_BUSY_HTTP_STATUS } from './transaction-response.js';
1
+ import { NOT_FOUND_HTTP_STATUS, TERMINAL_BUSY_HTTP_STATUS } from './transaction-response.js';
2
2
  /**
3
3
  * Fehlerarten auf dem Weg ueber **Kasseneck Connect** zum hobex-HPS-Terminal.
4
4
  *
@@ -124,6 +124,22 @@ export class HpsConnectTerminalError extends HpsConnectException {
124
124
  }
125
125
  return this.connectCode === 'terminal_error' && new RegExp(`\\(HTTP ${TERMINAL_BUSY_HTTP_STATUS}\\)`).test(this.message);
126
126
  }
127
+ /**
128
+ * `true`, wenn dies ein HTTP `404` beim Terminal-Kontakt ist -- Lesart
129
+ * ungemessen, siehe [NOT_FOUND_HTTP_STATUS] und den Dart-Zwilling
130
+ * (`HpsHttpException.isNotFound`): es kann "diesen Vorgang kenne ich nicht"
131
+ * heissen oder "diesen Endpunkt gibt es hier nicht". `payments.ts` benennt
132
+ * beim Abbruch beide Lesarten, statt eine zu behaupten.
133
+ *
134
+ * Liest, wie [isTerminalBusy], bevorzugt [terminalHttpStatus] und faellt nur
135
+ * ohne dieses Feld auf den Meldungstext zurueck.
136
+ */
137
+ get isNotFound() {
138
+ if (this.terminalHttpStatus !== undefined) {
139
+ return this.terminalHttpStatus === NOT_FOUND_HTTP_STATUS;
140
+ }
141
+ return this.connectCode === 'terminal_error' && new RegExp(`\\(HTTP ${NOT_FOUND_HTTP_STATUS}\\)`).test(this.message);
142
+ }
127
143
  }
128
144
  /**
129
145
  * Connect selbst war nicht erreichbar, oder die Antwort hatte nicht die
@@ -23,5 +23,5 @@ export { type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver
23
23
  export { type CardPaymentOutcome, type HpsPaymentResult, isHostUncertainResult, mayRetrySafely, } from './outcome.js';
24
24
  export { type HpsCancelOptions, type HpsPaymentOptions, type HpsPayments, type HpsPaymentsOptions, type HpsRefundOptions, createHpsPayments, } from './payments.js';
25
25
  export { MAX_TRANSACTION_ID_LENGTH, createHpsTransactionIdGenerator, isValidHpsTransactionId, newHpsTransactionId, type HpsTransactionIdGeneratorOptions, } from './transaction-id.js';
26
- export { ABORTED_CODE, APP_SELECT_FAILED_CODE, APPROVED_CODE, BAD_REQUEST_CODE, CARD_DECLINED_CODE, CARD_INFO_NOT_ENTERED_CODE, CARD_NOT_PRESENT_CODE, CARD_NOT_SUPPORTED_CODE, CARD_READ_FAILED_CODE, CHIP_DATA_MISMATCH_CODE, COMPLETION_FAILED_CODE, DIAGNOSIS_FAILED_CODE, HOST_COMMUNICATION_FAILED_CODE, HOST_STEP_FAILED_CODE, HOST_TIMEOUT_REVERSED_CODE, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, INTERNAL_ERROR_CODE, INVALID_MESSAGE_TYPE_CODE, INVALID_TID_DOCUMENTED_CODE, INVALID_TX_TYPE_CODE, MAX_RETRIES_EXCEEDED_CODE, NOT_FOUND_CODE, PASSWORD_NOT_ENTERED_CODE, REFUND_DISABLED_CODE, REFUND_PASSWORD_INVALID_CODE, SCEP_ENROLLMENT_FAILED_CODE, TERMINAL_BLOCKED_CODE, TERMINAL_BUSY_CODE, TIP_SELECTION_FAILED_CODE, UNSUPPORTED_USER_DATA_CODE, hpsCodeInfo, hpsCodeReason, isHostUncertain, isHostUncertainReason, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isConclusiveAsStatus, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsTransactionResponse, } from './transaction-response.js';
26
+ export { ABORTED_CODE, APP_SELECT_FAILED_CODE, APPROVED_CODE, BAD_REQUEST_CODE, CARD_DECLINED_CODE, CARD_INFO_NOT_ENTERED_CODE, CARD_NOT_PRESENT_CODE, CARD_NOT_SUPPORTED_CODE, CARD_READ_FAILED_CODE, CHIP_DATA_MISMATCH_CODE, COMPLETION_FAILED_CODE, DIAGNOSIS_FAILED_CODE, HOST_COMMUNICATION_FAILED_CODE, HOST_STEP_FAILED_CODE, HOST_TIMEOUT_REVERSED_CODE, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, INTERNAL_ERROR_CODE, INVALID_MESSAGE_TYPE_CODE, INVALID_TID_DOCUMENTED_CODE, INVALID_TX_TYPE_CODE, MAX_RETRIES_EXCEEDED_CODE, NOT_FOUND_CODE, PASSWORD_NOT_ENTERED_CODE, REFUND_DISABLED_CODE, REFUND_PASSWORD_INVALID_CODE, SCEP_ENROLLMENT_FAILED_CODE, TERMINAL_BLOCKED_CODE, TERMINAL_BUSY_CODE, TIP_SELECTION_FAILED_CODE, UNSUPPORTED_USER_DATA_CODE, hpsCodeInfo, hpsCodeReason, isHostUncertain, isHostUncertainReason, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, NOT_FOUND_HTTP_STATUS, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isConclusiveAsStatus, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsTransactionResponse, } from './transaction-response.js';
27
27
  export { hobexReceiptFromHps } from './receipt.js';
@@ -22,5 +22,5 @@ export { HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, H
22
22
  export { isHostUncertainResult, mayRetrySafely, } from './outcome.js';
23
23
  export { createHpsPayments, } from './payments.js';
24
24
  export { MAX_TRANSACTION_ID_LENGTH, createHpsTransactionIdGenerator, isValidHpsTransactionId, newHpsTransactionId, } from './transaction-id.js';
25
- export { ABORTED_CODE, APP_SELECT_FAILED_CODE, APPROVED_CODE, BAD_REQUEST_CODE, CARD_DECLINED_CODE, CARD_INFO_NOT_ENTERED_CODE, CARD_NOT_PRESENT_CODE, CARD_NOT_SUPPORTED_CODE, CARD_READ_FAILED_CODE, CHIP_DATA_MISMATCH_CODE, COMPLETION_FAILED_CODE, DIAGNOSIS_FAILED_CODE, HOST_COMMUNICATION_FAILED_CODE, HOST_STEP_FAILED_CODE, HOST_TIMEOUT_REVERSED_CODE, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, INTERNAL_ERROR_CODE, INVALID_MESSAGE_TYPE_CODE, INVALID_TID_DOCUMENTED_CODE, INVALID_TX_TYPE_CODE, MAX_RETRIES_EXCEEDED_CODE, NOT_FOUND_CODE, PASSWORD_NOT_ENTERED_CODE, REFUND_DISABLED_CODE, REFUND_PASSWORD_INVALID_CODE, SCEP_ENROLLMENT_FAILED_CODE, TERMINAL_BLOCKED_CODE, TERMINAL_BUSY_CODE, TIP_SELECTION_FAILED_CODE, UNSUPPORTED_USER_DATA_CODE, hpsCodeInfo, hpsCodeReason, isHostUncertain, isHostUncertainReason, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isConclusiveAsStatus, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, } from './transaction-response.js';
25
+ export { ABORTED_CODE, APP_SELECT_FAILED_CODE, APPROVED_CODE, BAD_REQUEST_CODE, CARD_DECLINED_CODE, CARD_INFO_NOT_ENTERED_CODE, CARD_NOT_PRESENT_CODE, CARD_NOT_SUPPORTED_CODE, CARD_READ_FAILED_CODE, CHIP_DATA_MISMATCH_CODE, COMPLETION_FAILED_CODE, DIAGNOSIS_FAILED_CODE, HOST_COMMUNICATION_FAILED_CODE, HOST_STEP_FAILED_CODE, HOST_TIMEOUT_REVERSED_CODE, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, INTERNAL_ERROR_CODE, INVALID_MESSAGE_TYPE_CODE, INVALID_TID_DOCUMENTED_CODE, INVALID_TX_TYPE_CODE, MAX_RETRIES_EXCEEDED_CODE, NOT_FOUND_CODE, PASSWORD_NOT_ENTERED_CODE, REFUND_DISABLED_CODE, REFUND_PASSWORD_INVALID_CODE, SCEP_ENROLLMENT_FAILED_CODE, TERMINAL_BLOCKED_CODE, TERMINAL_BUSY_CODE, TIP_SELECTION_FAILED_CODE, UNSUPPORTED_USER_DATA_CODE, hpsCodeInfo, hpsCodeReason, isHostUncertain, isHostUncertainReason, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, NOT_FOUND_HTTP_STATUS, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isConclusiveAsStatus, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, } from './transaction-response.js';
26
26
  export { hobexReceiptFromHps } from './receipt.js';
@@ -318,7 +318,12 @@ export function createHpsPayments(client, target, options = {}) {
318
318
  res = await withinBudget(elapsedMs, () => client.abort({ ...target, transactionId: id }), abortBudgetMs);
319
319
  }
320
320
  catch (e) {
321
- steps.push(`Abbruch nicht bestaetigt (${describe(e)}) -- ob er wirkte, ist offen, Ausgang wird abgefragt`);
321
+ // Siehe Dart-Zwilling: ein 404 hat zwei Lesarten, und wir kennen die
322
+ // richtige nicht. Der Nachweistext benennt beide und behauptet keine.
323
+ steps.push(e instanceof HpsConnectTerminalError && e.isNotFound
324
+ ? 'Abbruch nicht bestaetigt (HTTP 404) -- das Terminal kennt entweder diesen Vorgang nicht '
325
+ + 'oder den Abbruch-Endpunkt nicht; beides sagt nichts ueber die Zahlung, Ausgang wird abgefragt'
326
+ : `Abbruch nicht bestaetigt (${describe(e)}) -- ob er wirkte, ist offen, Ausgang wird abgefragt`);
322
327
  noteUnexpected(e, id);
323
328
  return null;
324
329
  }
@@ -216,6 +216,18 @@ export declare const INTERNAL_ERROR_CODE = "100999";
216
216
  * getrennte Auswertung.
217
217
  */
218
218
  export declare const TERMINAL_BUSY_HTTP_STATUS = 409;
219
+ /**
220
+ * HTTP `404` beim Terminal-Kontakt. **Lesart ungemessen:** am Produktivgeraet
221
+ * (TID 3556988, Firmware 2.3.9) antwortet `POST /api/transaction/abort/...`
222
+ * damit, am Testgeraet (3600335) nie. Es kann "diesen Vorgang kenne ich nicht"
223
+ * heissen oder "diesen Endpunkt gibt es hier nicht" -- beides sagt nichts ueber
224
+ * die Zahlung. Bei hobex angefragt; bis dahin benennt `payments.ts` beim
225
+ * Abbruch beide Lesarten, statt eine zu behaupten.
226
+ *
227
+ * Wie [TERMINAL_BUSY_HTTP_STATUS] bewusst KEIN Eintrag in [HPS_CODES]: ein
228
+ * HTTP-Status ist kein `responseCode`.
229
+ */
230
+ export declare const NOT_FOUND_HTTP_STATUS = 404;
219
231
  /** Der Eintrag zu [code] in [HPS_CODES], oder `undefined`, wenn seine Bedeutung nicht feststeht. */
220
232
  export declare function hpsCodeInfo(code: string | undefined): HpsCode | undefined;
221
233
  /**
@@ -315,6 +315,18 @@ export const INTERNAL_ERROR_CODE = '100999';
315
315
  * getrennte Auswertung.
316
316
  */
317
317
  export const TERMINAL_BUSY_HTTP_STATUS = 409;
318
+ /**
319
+ * HTTP `404` beim Terminal-Kontakt. **Lesart ungemessen:** am Produktivgeraet
320
+ * (TID 3556988, Firmware 2.3.9) antwortet `POST /api/transaction/abort/...`
321
+ * damit, am Testgeraet (3600335) nie. Es kann "diesen Vorgang kenne ich nicht"
322
+ * heissen oder "diesen Endpunkt gibt es hier nicht" -- beides sagt nichts ueber
323
+ * die Zahlung. Bei hobex angefragt; bis dahin benennt `payments.ts` beim
324
+ * Abbruch beide Lesarten, statt eine zu behaupten.
325
+ *
326
+ * Wie [TERMINAL_BUSY_HTTP_STATUS] bewusst KEIN Eintrag in [HPS_CODES]: ein
327
+ * HTTP-Status ist kein `responseCode`.
328
+ */
329
+ export const NOT_FOUND_HTTP_STATUS = 404;
318
330
  const CODE_BY_ID = new Map(HPS_CODES.map((c) => [c.code, c]));
319
331
  /** Der Eintrag zu [code] in [HPS_CODES], oder `undefined`, wenn seine Bedeutung nicht feststeht. */
320
332
  export function hpsCodeInfo(code) {
@@ -42,4 +42,4 @@
42
42
  export { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
43
43
  export { type CreateStripeLinkOptions, type StripeCaptureResult, createStripeLink, stripeCaptureIntent, } from './stripe.js';
44
44
  export { type HobexPayOptions, type HobexRefundOptions, type HobexTransactionIdOptions, hobexPay, hobexRefund, newHobexTransactionId, } from './hobex.js';
45
- export { type CardPaymentOutcome, type HpsConnectClient, type HpsConnectClientOptions, type HpsConnectFetch, type HpsConnectFetchResponse, type HpsConnectPaymentOptions, type HpsConnectTarget, type HpsConnectTransactionOptions, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver, type HpsPaymentOptions, type HpsPayments, type HpsPaymentResult, type HpsPaymentsOptions, type HpsTransactionIdGeneratorOptions, type HpsTransactionResponse, ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, hpsCodeInfo, hpsCodeReason, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isConclusiveAsStatus, isHostUncertain, isHostUncertainResult, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
45
+ export { type CardPaymentOutcome, type HpsConnectClient, type HpsConnectClientOptions, type HpsConnectFetch, type HpsConnectFetchResponse, type HpsConnectPaymentOptions, type HpsConnectTarget, type HpsConnectTransactionOptions, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver, type HpsPaymentOptions, type HpsPayments, type HpsPaymentResult, type HpsPaymentsOptions, type HpsTransactionIdGeneratorOptions, type HpsTransactionResponse, ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, hpsCodeInfo, hpsCodeReason, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isConclusiveAsStatus, isHostUncertain, isHostUncertainResult, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, NOT_FOUND_HTTP_STATUS, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
@@ -42,4 +42,4 @@
42
42
  export { StripeLinkMode } from '../enums/index.js';
43
43
  export { createStripeLink, stripeCaptureIntent, } from './stripe.js';
44
44
  export { hobexPay, hobexRefund, newHobexTransactionId, } from './hobex.js';
45
- export { ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, hpsCodeInfo, hpsCodeReason, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isConclusiveAsStatus, isHostUncertain, isHostUncertainResult, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
45
+ export { ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, hpsCodeInfo, hpsCodeReason, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isConclusiveAsStatus, isHostUncertain, isHostUncertainResult, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, NOT_FOUND_HTTP_STATUS, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
@@ -43,7 +43,7 @@
43
43
  * });
44
44
  * ```
45
45
  *
46
- * Mit `sitzung.customToken` meldet sich der Verbraucher bei Firebase an; das
46
+ * Mit `sitzung.customToken` meldet sich der Verbraucher beim Anmeldedienst an; das
47
47
  * daraus entstehende ID-Token und `sitzung.sessionId` ergeben zusammen
48
48
  * `registerUserAuth` — ab da laeuft alles Weitere ueber den ueblichen Weg.
49
49
  */
@@ -43,7 +43,7 @@
43
43
  * });
44
44
  * ```
45
45
  *
46
- * Mit `sitzung.customToken` meldet sich der Verbraucher bei Firebase an; das
46
+ * Mit `sitzung.customToken` meldet sich der Verbraucher beim Anmeldedienst an; das
47
47
  * daraus entstehende ID-Token und `sitzung.sessionId` ergeben zusammen
48
48
  * `registerUserAuth` — ab da laeuft alles Weitere ueber den ueblichen Weg.
49
49
  */
@@ -188,9 +188,9 @@ export interface RegisterUser {
188
188
  /** Ergebnis der PIN-Anmeldung. */
189
189
  export interface RegisterUserSession {
190
190
  /**
191
- * Firebase-Custom-Token. Damit meldet der Verbraucher sich bei Firebase an
191
+ * Custom-Token des Anmeldediensts. Damit meldet der Verbraucher sich dort an
192
192
  * und bekommt das ID-Token, das `registerUserAuth` braucht; dieses Paket
193
- * kennt Firebase nicht.
193
+ * kennt den Anmeldedienst nicht.
194
194
  */
195
195
  customToken: string;
196
196
  /** Laufende Sitzung — Kopfzeile `register-session` jedes weiteren Aufrufs. */
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.13.0",
2
+ "version": "0.13.2",
3
3
  "gemessenAn": {
4
4
  "tid": "3600335",
5
5
  "hpsVersion": "1.10.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.13.0",
2
+ "version": "0.13.2",
3
3
  "meldungen": {
4
4
  "netz.keine_verbindung": {
5
5
  "text": "Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen."
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.13.0",
2
+ "version": "0.13.2",
3
3
  "aufrufe": [
4
4
  "activateCashregister",
5
5
  "cancelReceipt",
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@kreiseck/kasseneck-api",
3
- "version": "0.13.0",
4
- "description": "JavaScript-Zwilling von kasseneck_api (Flutter) fuer das Kasseneck-Backend",
3
+ "version": "0.13.2",
4
+ "description": "RKSV-Registrierkasse fuer JavaScript und TypeScript: signierte Belege, Storno, Kartenzahlung, Bondruck. Austrian fiscal cash register (RKSV) API client.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Kreiseck",
7
- "homepage": "https://github.com/kreiseck-at/kasseneck-api#readme",
7
+ "homepage": "https://kasseneck.at/api-doku",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "git+https://github.com/kreiseck-at/kasseneck-api.git"
@@ -14,10 +14,25 @@
14
14
  "kasseneck",
15
15
  "rksv",
16
16
  "registrierkasse",
17
+ "kassensystem",
18
+ "kassensoftware",
19
+ "belegerteilungspflicht",
20
+ "finanzonline",
21
+ "dep",
22
+ "beleg",
23
+ "bon",
24
+ "bondrucker",
25
+ "escpos",
26
+ "oesterreich",
17
27
  "österreich",
18
28
  "austria",
19
- "beleg",
20
- "pos"
29
+ "austrian",
30
+ "fiscal",
31
+ "cash-register",
32
+ "point-of-sale",
33
+ "pos",
34
+ "receipt",
35
+ "typescript"
21
36
  ],
22
37
  "type": "module",
23
38
  "main": "./dist/cjs/index.js",