@kreiseck/kasseneck-api 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +206 -0
- package/dist/cjs/client/api.d.ts +75 -0
- package/dist/cjs/client/api.js +40 -0
- package/dist/cjs/client/auth.d.ts +52 -0
- package/dist/cjs/client/auth.js +72 -0
- package/dist/cjs/client/cashregisters.d.ts +21 -0
- package/dist/cjs/client/cashregisters.js +36 -0
- package/dist/cjs/client/errors.d.ts +159 -0
- package/dist/cjs/client/errors.js +226 -0
- package/dist/cjs/client/index.d.ts +8 -0
- package/dist/cjs/client/index.js +44 -0
- package/dist/cjs/client/receipts.d.ts +245 -0
- package/dist/cjs/client/receipts.js +452 -0
- package/dist/cjs/client/reports.d.ts +43 -0
- package/dist/cjs/client/reports.js +73 -0
- package/dist/cjs/client/status.d.ts +43 -0
- package/dist/cjs/client/status.js +47 -0
- package/dist/cjs/client/transport.d.ts +117 -0
- package/dist/cjs/client/transport.js +312 -0
- package/dist/cjs/enums/credit-card-provider.d.ts +22 -0
- package/dist/cjs/enums/credit-card-provider.js +23 -0
- package/dist/cjs/enums/define-enum.d.ts +15 -0
- package/dist/cjs/enums/define-enum.js +16 -0
- package/dist/cjs/enums/index.d.ts +7 -0
- package/dist/cjs/enums/index.js +17 -0
- package/dist/cjs/enums/keck-payment-method.d.ts +57 -0
- package/dist/cjs/enums/keck-payment-method.js +23 -0
- package/dist/cjs/enums/receipt-type.d.ts +41 -0
- package/dist/cjs/enums/receipt-type.js +18 -0
- package/dist/cjs/enums/stripe-link-mode.d.ts +17 -0
- package/dist/cjs/enums/stripe-link-mode.js +18 -0
- package/dist/cjs/enums/vat-rate.d.ts +40 -0
- package/dist/cjs/enums/vat-rate.js +19 -0
- package/dist/cjs/enums/voucher-action.d.ts +10 -0
- package/dist/cjs/enums/voucher-action.js +11 -0
- package/dist/cjs/enums/voucher-type.d.ts +9 -0
- package/dist/cjs/enums/voucher-type.js +10 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.js +97 -0
- package/dist/cjs/kasse/artikel.d.ts +83 -0
- package/dist/cjs/kasse/artikel.js +79 -0
- package/dist/cjs/kasse/client.d.ts +10 -0
- package/dist/cjs/kasse/client.js +38 -0
- package/dist/cjs/kasse/drucker.d.ts +54 -0
- package/dist/cjs/kasse/drucker.js +41 -0
- package/dist/cjs/kasse/index.d.ts +11 -0
- package/dist/cjs/kasse/index.js +38 -0
- package/dist/cjs/kasse/settings.d.ts +115 -0
- package/dist/cjs/kasse/settings.js +62 -0
- package/dist/cjs/models/cancellation.d.ts +51 -0
- package/dist/cjs/models/cancellation.js +45 -0
- package/dist/cjs/models/cashregister.d.ts +77 -0
- package/dist/cjs/models/cashregister.js +53 -0
- package/dist/cjs/models/enum-payload.d.ts +26 -0
- package/dist/cjs/models/enum-payload.js +50 -0
- package/dist/cjs/models/hobex-receipt.d.ts +63 -0
- package/dist/cjs/models/hobex-receipt.js +86 -0
- package/dist/cjs/models/index.d.ts +10 -0
- package/dist/cjs/models/index.js +46 -0
- package/dist/cjs/models/receipt-company.d.ts +71 -0
- package/dist/cjs/models/receipt-company.js +52 -0
- package/dist/cjs/models/receipt-item.d.ts +100 -0
- package/dist/cjs/models/receipt-item.js +108 -0
- package/dist/cjs/models/receipt-summary.d.ts +92 -0
- package/dist/cjs/models/receipt-summary.js +54 -0
- package/dist/cjs/models/receipt.d.ts +108 -0
- package/dist/cjs/models/receipt.js +119 -0
- package/dist/cjs/models/report-month.d.ts +32 -0
- package/dist/cjs/models/report-month.js +65 -0
- package/dist/cjs/models/stripe-url-session.d.ts +18 -0
- package/dist/cjs/models/stripe-url-session.js +20 -0
- package/dist/cjs/models/voucher.d.ts +41 -0
- package/dist/cjs/models/voucher.js +56 -0
- package/dist/cjs/money.d.ts +23 -0
- package/dist/cjs/money.js +35 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/payments/hobex.d.ts +87 -0
- package/dist/cjs/payments/hobex.js +167 -0
- package/dist/cjs/payments/index.d.ts +33 -0
- package/dist/cjs/payments/index.js +42 -0
- package/dist/cjs/payments/stripe.d.ts +61 -0
- package/dist/cjs/payments/stripe.js +157 -0
- package/dist/cjs/printing/escpos.d.ts +219 -0
- package/dist/cjs/printing/escpos.js +636 -0
- package/dist/cjs/printing/index.d.ts +3 -0
- package/dist/cjs/printing/index.js +33 -0
- package/dist/cjs/printing/printable.d.ts +27 -0
- package/dist/cjs/printing/printable.js +90 -0
- package/dist/cjs/printing/webusb.d.ts +89 -0
- package/dist/cjs/printing/webusb.js +110 -0
- package/dist/cjs/react/index.d.ts +46 -0
- package/dist/cjs/react/index.js +51 -0
- package/dist/cjs/receipt/discount.d.ts +12 -0
- package/dist/cjs/receipt/discount.js +54 -0
- package/dist/cjs/receipt/epos.d.ts +53 -0
- package/dist/cjs/receipt/epos.js +95 -0
- package/dist/cjs/receipt/grid.d.ts +47 -0
- package/dist/cjs/receipt/grid.js +122 -0
- package/dist/cjs/receipt/index.d.ts +4 -0
- package/dist/cjs/receipt/index.js +29 -0
- package/dist/cjs/receipt/layout-escpos.d.ts +35 -0
- package/dist/cjs/receipt/layout-escpos.js +67 -0
- package/dist/cjs/receipt/layout.d.ts +180 -0
- package/dist/cjs/receipt/layout.js +594 -0
- package/dist/cjs/register/index.d.ts +51 -0
- package/dist/cjs/register/index.js +61 -0
- package/dist/cjs/register/pairing.d.ts +248 -0
- package/dist/cjs/register/pairing.js +279 -0
- package/dist/cjs/register/session.d.ts +37 -0
- package/dist/cjs/register/session.js +52 -0
- package/dist/cjs/vienna-time.d.ts +23 -0
- package/dist/cjs/vienna-time.js +114 -0
- package/dist/esm/client/api.d.ts +75 -0
- package/dist/esm/client/api.js +37 -0
- package/dist/esm/client/auth.d.ts +52 -0
- package/dist/esm/client/auth.js +68 -0
- package/dist/esm/client/cashregisters.d.ts +21 -0
- package/dist/esm/client/cashregisters.js +33 -0
- package/dist/esm/client/errors.d.ts +159 -0
- package/dist/esm/client/errors.js +212 -0
- package/dist/esm/client/index.d.ts +8 -0
- package/dist/esm/client/index.js +8 -0
- package/dist/esm/client/receipts.d.ts +245 -0
- package/dist/esm/client/receipts.js +438 -0
- package/dist/esm/client/reports.d.ts +43 -0
- package/dist/esm/client/reports.js +69 -0
- package/dist/esm/client/status.d.ts +43 -0
- package/dist/esm/client/status.js +43 -0
- package/dist/esm/client/transport.d.ts +117 -0
- package/dist/esm/client/transport.js +307 -0
- package/dist/esm/enums/credit-card-provider.d.ts +22 -0
- package/dist/esm/enums/credit-card-provider.js +20 -0
- package/dist/esm/enums/define-enum.d.ts +15 -0
- package/dist/esm/enums/define-enum.js +13 -0
- package/dist/esm/enums/index.d.ts +7 -0
- package/dist/esm/enums/index.js +7 -0
- package/dist/esm/enums/keck-payment-method.d.ts +57 -0
- package/dist/esm/enums/keck-payment-method.js +20 -0
- package/dist/esm/enums/receipt-type.d.ts +41 -0
- package/dist/esm/enums/receipt-type.js +15 -0
- package/dist/esm/enums/stripe-link-mode.d.ts +17 -0
- package/dist/esm/enums/stripe-link-mode.js +15 -0
- package/dist/esm/enums/vat-rate.d.ts +40 -0
- package/dist/esm/enums/vat-rate.js +16 -0
- package/dist/esm/enums/voucher-action.d.ts +10 -0
- package/dist/esm/enums/voucher-action.js +8 -0
- package/dist/esm/enums/voucher-type.d.ts +9 -0
- package/dist/esm/enums/voucher-type.js +7 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/kasse/artikel.d.ts +83 -0
- package/dist/esm/kasse/artikel.js +70 -0
- package/dist/esm/kasse/client.d.ts +10 -0
- package/dist/esm/kasse/client.js +33 -0
- package/dist/esm/kasse/drucker.d.ts +54 -0
- package/dist/esm/kasse/drucker.js +36 -0
- package/dist/esm/kasse/index.d.ts +11 -0
- package/dist/esm/kasse/index.js +13 -0
- package/dist/esm/kasse/settings.d.ts +115 -0
- package/dist/esm/kasse/settings.js +58 -0
- package/dist/esm/models/cancellation.d.ts +51 -0
- package/dist/esm/models/cancellation.js +40 -0
- package/dist/esm/models/cashregister.d.ts +77 -0
- package/dist/esm/models/cashregister.js +50 -0
- package/dist/esm/models/enum-payload.d.ts +26 -0
- package/dist/esm/models/enum-payload.js +44 -0
- package/dist/esm/models/hobex-receipt.d.ts +63 -0
- package/dist/esm/models/hobex-receipt.js +80 -0
- package/dist/esm/models/index.d.ts +10 -0
- package/dist/esm/models/index.js +10 -0
- package/dist/esm/models/receipt-company.d.ts +71 -0
- package/dist/esm/models/receipt-company.js +48 -0
- package/dist/esm/models/receipt-item.d.ts +100 -0
- package/dist/esm/models/receipt-item.js +101 -0
- package/dist/esm/models/receipt-summary.d.ts +92 -0
- package/dist/esm/models/receipt-summary.js +49 -0
- package/dist/esm/models/receipt.d.ts +108 -0
- package/dist/esm/models/receipt.js +113 -0
- package/dist/esm/models/report-month.d.ts +32 -0
- package/dist/esm/models/report-month.js +58 -0
- package/dist/esm/models/stripe-url-session.d.ts +18 -0
- package/dist/esm/models/stripe-url-session.js +16 -0
- package/dist/esm/models/voucher.d.ts +41 -0
- package/dist/esm/models/voucher.js +51 -0
- package/dist/esm/money.d.ts +23 -0
- package/dist/esm/money.js +31 -0
- package/dist/esm/payments/hobex.d.ts +87 -0
- package/dist/esm/payments/hobex.js +162 -0
- package/dist/esm/payments/index.d.ts +33 -0
- package/dist/esm/payments/index.js +33 -0
- package/dist/esm/payments/stripe.d.ts +61 -0
- package/dist/esm/payments/stripe.js +153 -0
- package/dist/esm/printing/escpos.d.ts +219 -0
- package/dist/esm/printing/escpos.js +616 -0
- package/dist/esm/printing/index.d.ts +3 -0
- package/dist/esm/printing/index.js +3 -0
- package/dist/esm/printing/printable.d.ts +27 -0
- package/dist/esm/printing/printable.js +87 -0
- package/dist/esm/printing/webusb.d.ts +89 -0
- package/dist/esm/printing/webusb.js +101 -0
- package/dist/esm/react/index.d.ts +46 -0
- package/dist/esm/react/index.js +47 -0
- package/dist/esm/receipt/discount.d.ts +12 -0
- package/dist/esm/receipt/discount.js +51 -0
- package/dist/esm/receipt/epos.d.ts +53 -0
- package/dist/esm/receipt/epos.js +86 -0
- package/dist/esm/receipt/grid.d.ts +47 -0
- package/dist/esm/receipt/grid.js +116 -0
- package/dist/esm/receipt/index.d.ts +4 -0
- package/dist/esm/receipt/index.js +4 -0
- package/dist/esm/receipt/layout-escpos.d.ts +35 -0
- package/dist/esm/receipt/layout-escpos.js +64 -0
- package/dist/esm/receipt/layout.d.ts +180 -0
- package/dist/esm/receipt/layout.js +583 -0
- package/dist/esm/register/index.d.ts +51 -0
- package/dist/esm/register/index.js +51 -0
- package/dist/esm/register/pairing.d.ts +248 -0
- package/dist/esm/register/pairing.js +270 -0
- package/dist/esm/register/session.d.ts +37 -0
- package/dist/esm/register/session.js +48 -0
- package/dist/esm/vienna-time.d.ts +23 -0
- package/dist/esm/vienna-time.js +110 -0
- package/fixtures/belege/langer-artikelname.json +43 -0
- package/fixtures/belege/null-ausfall.json +41 -0
- package/fixtures/belege/null-jahr.json +41 -0
- package/fixtures/belege/null-monat.json +41 -0
- package/fixtures/belege/null-pruef.json +41 -0
- package/fixtures/belege/null-schluss.json +41 -0
- package/fixtures/belege/null-start.json +40 -0
- package/fixtures/belege/rabattzeilen.json +61 -0
- package/fixtures/belege/signaturausfall-verkauf.json +49 -0
- package/fixtures/belege/storno-teil.json +48 -0
- package/fixtures/belege/storno-voll.json +54 -0
- package/fixtures/belege/testkasse-verkauf.json +50 -0
- package/fixtures/belege/testsignatur-verkauf.json +50 -0
- package/fixtures/belege/training.json +49 -0
- package/fixtures/belege/verkauf-bar.json +49 -0
- package/fixtures/belege/verkauf-karte.json +49 -0
- package/fixtures/belege/verkauf-kleinunternehmer.json +42 -0
- package/fixtures/erwartet/langer-artikelname.grid32.txt +25 -0
- package/fixtures/erwartet/langer-artikelname.grid48.txt +24 -0
- package/fixtures/erwartet/langer-artikelname.lines.json +216 -0
- package/fixtures/erwartet/null-ausfall.grid32.txt +28 -0
- package/fixtures/erwartet/null-ausfall.grid48.txt +25 -0
- package/fixtures/erwartet/null-ausfall.lines.json +220 -0
- package/fixtures/erwartet/null-jahr.grid32.txt +29 -0
- package/fixtures/erwartet/null-jahr.grid48.txt +25 -0
- package/fixtures/erwartet/null-jahr.lines.json +220 -0
- package/fixtures/erwartet/null-monat.grid32.txt +28 -0
- package/fixtures/erwartet/null-monat.grid48.txt +25 -0
- package/fixtures/erwartet/null-monat.lines.json +220 -0
- package/fixtures/erwartet/null-pruef.grid32.txt +28 -0
- package/fixtures/erwartet/null-pruef.grid48.txt +25 -0
- package/fixtures/erwartet/null-pruef.lines.json +220 -0
- package/fixtures/erwartet/null-schluss.grid32.txt +28 -0
- package/fixtures/erwartet/null-schluss.grid48.txt +25 -0
- package/fixtures/erwartet/null-schluss.lines.json +220 -0
- package/fixtures/erwartet/null-start.grid32.txt +28 -0
- package/fixtures/erwartet/null-start.grid48.txt +25 -0
- package/fixtures/erwartet/null-start.lines.json +220 -0
- package/fixtures/erwartet/rabattzeilen.grid32.txt +27 -0
- package/fixtures/erwartet/rabattzeilen.grid48.txt +26 -0
- package/fixtures/erwartet/rabattzeilen.lines.json +286 -0
- package/fixtures/erwartet/signaturausfall-verkauf.grid32.txt +28 -0
- package/fixtures/erwartet/signaturausfall-verkauf.grid48.txt +26 -0
- package/fixtures/erwartet/signaturausfall-verkauf.lines.json +266 -0
- package/fixtures/erwartet/storno-teil.grid32.txt +27 -0
- package/fixtures/erwartet/storno-teil.grid48.txt +26 -0
- package/fixtures/erwartet/storno-teil.lines.json +237 -0
- package/fixtures/erwartet/storno-voll.grid32.txt +29 -0
- package/fixtures/erwartet/storno-voll.grid48.txt +28 -0
- package/fixtures/erwartet/storno-voll.lines.json +277 -0
- package/fixtures/erwartet/testkasse-verkauf.grid32.txt +28 -0
- package/fixtures/erwartet/testkasse-verkauf.grid48.txt +27 -0
- package/fixtures/erwartet/testkasse-verkauf.lines.json +270 -0
- package/fixtures/erwartet/testsignatur-verkauf.grid32.txt +30 -0
- package/fixtures/erwartet/testsignatur-verkauf.grid48.txt +27 -0
- package/fixtures/erwartet/testsignatur-verkauf.lines.json +270 -0
- package/fixtures/erwartet/training.grid32.txt +33 -0
- package/fixtures/erwartet/training.grid48.txt +30 -0
- package/fixtures/erwartet/training.lines.json +277 -0
- package/fixtures/erwartet/verkauf-bar.grid32.txt +25 -0
- package/fixtures/erwartet/verkauf-bar.grid48.txt +24 -0
- package/fixtures/erwartet/verkauf-bar.lines.json +256 -0
- package/fixtures/erwartet/verkauf-karte.grid32.txt +25 -0
- package/fixtures/erwartet/verkauf-karte.grid48.txt +24 -0
- package/fixtures/erwartet/verkauf-karte.lines.json +256 -0
- package/fixtures/erwartet/verkauf-kleinunternehmer.grid32.txt +26 -0
- package/fixtures/erwartet/verkauf-kleinunternehmer.grid48.txt +25 -0
- package/fixtures/erwartet/verkauf-kleinunternehmer.lines.json +226 -0
- package/fixtures/manifest.json +107 -0
- package/package.json +135 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die fuenf Fehlerarten des Kasseneck-Clients — bewusst getrennt, weil ein
|
|
3
|
+
* Aufrufer auf jede anders reagieren muss:
|
|
4
|
+
*
|
|
5
|
+
* - `KasseneckValidationError` — die **Form** stimmt nicht: entweder ging
|
|
6
|
+
* mangels brauchbarer Eingabe gar keine Anfrage raus, oder die Antwort war
|
|
7
|
+
* nicht verwertbar. `scope` trennt die beiden Richtungen. `'request'`: die
|
|
8
|
+
* Eingabe des Aufrufers verletzt eine Regel, die dieses Paket schon vor dem
|
|
9
|
+
* Senden kennt (Beleg ohne Positionen, unmoegliche Gutscheinkombination) —
|
|
10
|
+
* das ist ein Programmierfehler im Aufrufer, kein Betriebszustand.
|
|
11
|
+
* `'response'`: das Backend meldete Erfolg, die Nutzlast enthielt aber
|
|
12
|
+
* nicht, was der Aufruf zusagt.
|
|
13
|
+
*
|
|
14
|
+
* - `KasseneckApiError` — **fachlicher** Fehler. Das Backend antwortet immer
|
|
15
|
+
* mit HTTP 200 und legt Erfolg/Misserfolg in den Rumpf
|
|
16
|
+
* (`{status:'success'|'error', message, data}`, siehe `successResponse`/
|
|
17
|
+
* `errorResponse` im Backend). Ein `status:'error'` heisst: die Anfrage kam
|
|
18
|
+
* an und wurde abgelehnt (gesperrte Kasse, fehlendes Modul, ungueltiger
|
|
19
|
+
* Parameter). Wiederholen hilft nicht.
|
|
20
|
+
* - `KasseneckHttpError` — die Antwort war **keine** verwertbare Huelle:
|
|
21
|
+
* HTTP 500/404, leerer Rumpf, oder HTTP 200 mit HTML statt JSON (typisch,
|
|
22
|
+
* wenn ein Aufruf mangels Rewrite auf der Single-Page-App landet). Beim
|
|
23
|
+
* Bericht-Download gelten dieselben Gruende fuer alles, was kein PDF ist.
|
|
24
|
+
* `reason` trennt die Faelle maschinenlesbar.
|
|
25
|
+
* - `KasseneckNetworkError` — die Antwort kam gar nicht: Netz weg, DNS,
|
|
26
|
+
* abgebrochene Verbindung oder Zeitueberschreitung (`timedOut`).
|
|
27
|
+
* - `KasseneckAuthError` — es kam nicht einmal zur Anfrage, weil die Anmeldung
|
|
28
|
+
* scheiterte (fehlende Zugangsdaten, oder der Token-/Sitzungsgeber warf).
|
|
29
|
+
* In der Browser-Kasse mit ihrer 90-Sekunden-Sitzung ist das Alltag, kein
|
|
30
|
+
* Sonderfall.
|
|
31
|
+
*
|
|
32
|
+
* **Geheimnisse gehoeren in keinen dieser Fehler.** Fehlermeldungen landen in
|
|
33
|
+
* Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, Firebase-
|
|
34
|
+
* ID-Token noch Sitzungsbezeichner duerfen dorthin. Deshalb tragen die Fehler
|
|
35
|
+
* ausschliesslich Funktionsname, HTTP-Status/Inhaltstyp, den vom Paket
|
|
36
|
+
* formulierten Grund und die vom Backend formulierte Meldung — nie Kopfzeilen,
|
|
37
|
+
* nie den gesendeten Rumpf und auch nicht den empfangenen Rumpf (der koennte
|
|
38
|
+
* bei einem fremden Proxy alles Moegliche zurueckspiegeln).
|
|
39
|
+
*
|
|
40
|
+
* Aus demselben Grund haengt **keine fremde Ursache** als `cause` an diesen
|
|
41
|
+
* Fehlern: `console.error(err)` und `util.inspect` drucken die Ursachenkette
|
|
42
|
+
* mit, und fremde HTTP-Bibliotheken haengen ihre Anfrage an ihre Fehler (axios
|
|
43
|
+
* `config.headers`, got `options.headers`) — mit dem Bearer-Schluessel darin.
|
|
44
|
+
* Statt der Ursache selbst traegt `KasseneckNetworkError` ihre **verdichtete**
|
|
45
|
+
* Form: `causeName`/`causeCode`, beide nur, wenn sie wie ein Bezeichner
|
|
46
|
+
* aussehen **und** mit keinem der gesendeten Geheimnisse ueberlappen (siehe
|
|
47
|
+
* `causeDigest`).
|
|
48
|
+
*
|
|
49
|
+
* Der Formfilter allein traegt diese Zusage naemlich nicht: der
|
|
50
|
+
* Sitzungsbezeichner der Browser-Kasse ist selbst bezeichner-foermig und kaeme
|
|
51
|
+
* durch. Verdichtet werden darf nur, wo die gesendeten Geheimnisse bekannt
|
|
52
|
+
* sind — also nach dem Bauen der Anfrage. `KasseneckAuthError` traegt darum
|
|
53
|
+
* **gar keine** Ursachen-Verdichtung: dort ist noch nichts gesendet, es gibt
|
|
54
|
+
* keine Liste zum Abgleichen, und Diagnose ist an dieser Stelle weniger wert
|
|
55
|
+
* als die Zusage.
|
|
56
|
+
*/
|
|
57
|
+
// Bezeichner-artig: Buchstabe vorn, danach nur Bezeichnerzeichen, hoechstens
|
|
58
|
+
// 64 Zeichen. Das laesst `TypeError`, `ECONNREFUSED` und `auth/internal-error`
|
|
59
|
+
// durch, aber keinen Freitext und kein Firebase-ID-Token (~900 Zeichen).
|
|
60
|
+
const BEZEICHNER = /^[A-Za-z][A-Za-z0-9_./-]{0,63}$/;
|
|
61
|
+
/**
|
|
62
|
+
* Reduziert eine fremde Ursache auf Name und Code — und verwirft beides, wenn
|
|
63
|
+
* es kein Bezeichner ist oder mit einem der uebergebenen Geheimnisse
|
|
64
|
+
* ueberlappt (ein Sitzungsbezeichner sieht durchaus bezeichner-artig aus).
|
|
65
|
+
*
|
|
66
|
+
* `geheimnisse` hat bewusst **keinen** Vorgabewert: eine Verdichtung ohne
|
|
67
|
+
* Abgleichliste waere nur ein Formfilter und damit keine Zusage. Wo die
|
|
68
|
+
* gesendeten Werte nicht bekannt sind, wird gar nicht verdichtet.
|
|
69
|
+
*/
|
|
70
|
+
export function causeDigest(ursache, geheimnisse) {
|
|
71
|
+
const roh = ursache;
|
|
72
|
+
return {
|
|
73
|
+
causeName: unbedenklich(roh?.name, geheimnisse),
|
|
74
|
+
causeCode: unbedenklich(roh?.code, geheimnisse),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function unbedenklich(wert, geheimnisse) {
|
|
78
|
+
if (typeof wert !== 'string' || !BEZEICHNER.test(wert)) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
for (const geheim of geheimnisse) {
|
|
82
|
+
if (geheim && (geheim.includes(wert) || wert.includes(geheim))) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return wert;
|
|
87
|
+
}
|
|
88
|
+
/** Fachlicher Fehler: HTTP 200, aber `status: 'error'` im Rumpf. */
|
|
89
|
+
export class KasseneckApiError extends Error {
|
|
90
|
+
name = 'KasseneckApiError';
|
|
91
|
+
/** Aufgerufene Backend-Funktion, z. B. `createReceipt`. */
|
|
92
|
+
functionName;
|
|
93
|
+
/** Meldung des Backends, unveraendert (`message` aus der Huelle). */
|
|
94
|
+
serverMessage;
|
|
95
|
+
constructor(functionName, serverMessage) {
|
|
96
|
+
super(`${functionName} fehlgeschlagen: ${serverMessage}`);
|
|
97
|
+
this.functionName = functionName;
|
|
98
|
+
this.serverMessage = serverMessage;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const GRUND_TEXT = {
|
|
102
|
+
'server-error': 'Server-Fehler',
|
|
103
|
+
'empty-body': 'leere Antwort',
|
|
104
|
+
'not-json': 'Antwort ist kein JSON',
|
|
105
|
+
'missing-status': 'Antwort ohne Statusfeld',
|
|
106
|
+
};
|
|
107
|
+
/** Antwort ohne verwertbare Huelle (HTTP-Fehler, leerer Rumpf, HTML statt JSON). */
|
|
108
|
+
export class KasseneckHttpError extends Error {
|
|
109
|
+
name = 'KasseneckHttpError';
|
|
110
|
+
functionName;
|
|
111
|
+
/** HTTP-Statuscode der Antwort (bei HTML-statt-JSON durchaus 200). */
|
|
112
|
+
statusCode;
|
|
113
|
+
/** Inhaltstyp der Antwort, falls die Gegenstelle einen gesetzt hat. */
|
|
114
|
+
contentType;
|
|
115
|
+
/** Maschinenlesbarer Grund — trennt den Rewrite-Fall vom 500er ohne Textparsen. */
|
|
116
|
+
reason;
|
|
117
|
+
constructor(functionName, statusCode, contentType, reason) {
|
|
118
|
+
const typHinweis = contentType ? `, Inhaltstyp ${contentType}` : '';
|
|
119
|
+
super(`${functionName} fehlgeschlagen: ${GRUND_TEXT[reason]} (HTTP ${statusCode}${typHinweis})`);
|
|
120
|
+
this.functionName = functionName;
|
|
121
|
+
this.statusCode = statusCode;
|
|
122
|
+
this.contentType = contentType;
|
|
123
|
+
this.reason = reason;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Es kam keine Antwort: Netzfehler oder Zeitueberschreitung. */
|
|
127
|
+
export class KasseneckNetworkError extends Error {
|
|
128
|
+
name = 'KasseneckNetworkError';
|
|
129
|
+
functionName;
|
|
130
|
+
/** true = das Zeitlimit lief ab und die Anfrage wurde abgebrochen. */
|
|
131
|
+
timedOut;
|
|
132
|
+
/** Das geltende Zeitlimit in Millisekunden. */
|
|
133
|
+
timeoutMs;
|
|
134
|
+
/** Name der zugrunde liegenden Ursache, sofern unbedenklich (s. `causeDigest`). */
|
|
135
|
+
causeName;
|
|
136
|
+
/** Code der zugrunde liegenden Ursache, sofern unbedenklich (z. B. `ECONNREFUSED`). */
|
|
137
|
+
causeCode;
|
|
138
|
+
constructor(functionName, timedOut, timeoutMs, ursache = {}) {
|
|
139
|
+
const grund = timedOut ? `Zeitueberschreitung nach ${timeoutMs} ms` : 'Netzwerkfehler';
|
|
140
|
+
const codeHinweis = ursache.causeCode ? ` (${ursache.causeCode})` : '';
|
|
141
|
+
super(`${functionName} fehlgeschlagen: ${grund}${codeHinweis}`);
|
|
142
|
+
this.functionName = functionName;
|
|
143
|
+
this.timedOut = timedOut;
|
|
144
|
+
this.timeoutMs = timeoutMs;
|
|
145
|
+
this.causeName = ursache.causeName;
|
|
146
|
+
this.causeCode = ursache.causeCode;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Die Anmeldung scheiterte — es ging keine Anfrage raus.
|
|
151
|
+
*
|
|
152
|
+
* Dieser Fehler traegt **nichts** aus der fremden Ursache: weder ihre Meldung
|
|
153
|
+
* (ein Token-Geber fuehrt gern den Token mit, den er gerade nicht erneuern
|
|
154
|
+
* konnte) noch eine Verdichtung ihres Namens/Codes. Zum Zeitpunkt des
|
|
155
|
+
* Anmeldefehlers ist noch nichts gesendet, es gibt also keine Liste der
|
|
156
|
+
* Geheimnisse, gegen die verdichtete Werte geprueft werden koennten — und ein
|
|
157
|
+
* reiner Formfilter laesst genau die Form durch, die ein Sitzungsbezeichner
|
|
158
|
+
* hat.
|
|
159
|
+
*/
|
|
160
|
+
export class KasseneckAuthError extends Error {
|
|
161
|
+
name = 'KasseneckAuthError';
|
|
162
|
+
/** Betroffene Backend-Funktion, falls der Fehler bei einem Aufruf entstand. */
|
|
163
|
+
functionName;
|
|
164
|
+
/** Vom Paket formulierter Grund — geheimnisfrei, anders als fremde Meldungen. */
|
|
165
|
+
reason;
|
|
166
|
+
constructor(reason, options = {}) {
|
|
167
|
+
super(options.functionName ? `${options.functionName} fehlgeschlagen: ${reason}` : reason);
|
|
168
|
+
this.functionName = options.functionName;
|
|
169
|
+
this.reason = reason;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Die Form stimmt nicht — bei `scope: 'request'` ging deshalb keine Anfrage
|
|
174
|
+
* raus, bei `scope: 'response'` kam eine unbrauchbare zurueck.
|
|
175
|
+
*
|
|
176
|
+
* Es gilt dieselbe Zusage wie fuer die uebrigen Fehlerarten: `reason` ist vom
|
|
177
|
+
* Paket formuliert und geheimnisfrei. Bei `'response'` wird insbesondere
|
|
178
|
+
* **nichts aus der Antwort** uebernommen — ein fremder Proxy koennte dort
|
|
179
|
+
* alles Moegliche zurueckspiegeln.
|
|
180
|
+
*/
|
|
181
|
+
export class KasseneckValidationError extends Error {
|
|
182
|
+
name = 'KasseneckValidationError';
|
|
183
|
+
/**
|
|
184
|
+
* Betroffener Vorgang — meist die Backend-Funktion, bei Pruefungen ohne
|
|
185
|
+
* Aufruf der Name der Paketfunktion (z. B. `buildReceiptLayout`).
|
|
186
|
+
*/
|
|
187
|
+
functionName;
|
|
188
|
+
/** Vom Paket formulierter Grund. */
|
|
189
|
+
reason;
|
|
190
|
+
scope;
|
|
191
|
+
constructor(functionName, reason, scope) {
|
|
192
|
+
super(`${functionName} fehlgeschlagen: ${reason}`);
|
|
193
|
+
this.functionName = functionName;
|
|
194
|
+
this.reason = reason;
|
|
195
|
+
this.scope = scope;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function isKasseneckApiError(fehler) {
|
|
199
|
+
return fehler instanceof KasseneckApiError;
|
|
200
|
+
}
|
|
201
|
+
export function isKasseneckHttpError(fehler) {
|
|
202
|
+
return fehler instanceof KasseneckHttpError;
|
|
203
|
+
}
|
|
204
|
+
export function isKasseneckNetworkError(fehler) {
|
|
205
|
+
return fehler instanceof KasseneckNetworkError;
|
|
206
|
+
}
|
|
207
|
+
export function isKasseneckAuthError(fehler) {
|
|
208
|
+
return fehler instanceof KasseneckAuthError;
|
|
209
|
+
}
|
|
210
|
+
export function isKasseneckValidationError(fehler) {
|
|
211
|
+
return fehler instanceof KasseneckValidationError;
|
|
212
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, } from './auth.js';
|
|
2
|
+
export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, createTransport, createBinaryTransport, } from './transport.js';
|
|
3
|
+
export { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, } from './errors.js';
|
|
4
|
+
export { type ReceiptCommonOptions, type SellReceiptOptions, type CancelReceiptOptions, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, type CancelReceiptResult, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, checkVoucherCombinationError, } from './receipts.js';
|
|
5
|
+
export { listMyCashregisters } from './cashregisters.js';
|
|
6
|
+
export { downloadDailyReport, downloadMonthlyReport } from './reports.js';
|
|
7
|
+
export { type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, } from './status.js';
|
|
8
|
+
export { type KasseneckApi, createKasseneckApi } from './api.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { apiKeyAuth, registerUserAuth, } from './auth.js';
|
|
2
|
+
export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, createTransport, createBinaryTransport, } from './transport.js';
|
|
3
|
+
export { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, } from './errors.js';
|
|
4
|
+
export { sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, checkVoucherCombinationError, } from './receipts.js';
|
|
5
|
+
export { listMyCashregisters } from './cashregisters.js';
|
|
6
|
+
export { downloadDailyReport, downloadMonthlyReport } from './reports.js';
|
|
7
|
+
export { getCashboxStatus, getSignatureStatus, } from './status.js';
|
|
8
|
+
export { createKasseneckApi } from './api.js';
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { ReceiptType, type ReceiptTypeKey, KeckPaymentMethod, type KeckPaymentMethodKey, CreditCardProvider } from '../enums/index.js';
|
|
2
|
+
import { type Receipt, type ReceiptCompany, type ReceiptItem, type Voucher, type ReceiptSummary, type ReportMonth, type CancellationItem, type CancellationOf, type CancellationReason } from '../models/index.js';
|
|
3
|
+
import type { KasseneckTransport } from './transport.js';
|
|
4
|
+
import type { Pruefangaben, ReceiptLayout } from '../receipt/layout.js';
|
|
5
|
+
/**
|
|
6
|
+
* Beleg-Endpunkte — Zwilling der Beleg-Aufrufe in
|
|
7
|
+
* kasseneck_api/lib/kasseneck_api.dart.
|
|
8
|
+
*
|
|
9
|
+
* **Verkauf, freier Storno und Nullbeleg laufen ueber einen einzigen
|
|
10
|
+
* Backend-Endpunkt `createReceipt`.** `sellReceipt`, `createCancelReceipt` und
|
|
11
|
+
* `zeroReceipt` sind — wie im Flutter-Vorbild — benannte Bequemlichkeits-
|
|
12
|
+
* schichten ueber [createReceipt]; sie legen den Belegtyp fest und reichen den
|
|
13
|
+
* Rest durch. **[cancelReceipt] geht an den eigenen Endpunkt `cancelReceipt`**:
|
|
14
|
+
* der Server negiert die Positionen des Originals, prueft Restmengen und
|
|
15
|
+
* Rechte und verkettet beide Belege (Storno-API).
|
|
16
|
+
*
|
|
17
|
+
* **Kein Wiederholen fehlgeschlagener Aufrufe** (siehe transport.ts): ein
|
|
18
|
+
* Beleg ist nicht folgenlos wiederholbar.
|
|
19
|
+
*
|
|
20
|
+
* **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** Von den
|
|
21
|
+
* Endpunkten dieser Datei setzen [listMyReceipts], [getReceipt],
|
|
22
|
+
* [createReceipt] und [generateFullReceiptId] ein `allowRegisterUser` — der
|
|
23
|
+
* Browser-Kasse steht hier also alles offen ausser [getFirstReceiptDate];
|
|
24
|
+
* siehe den Hinweis dort. Dieses Paket bildet das **nicht** nach — wer darf,
|
|
25
|
+
* entscheidet allein das Backend. Der Hinweis steht hier, damit ein Leser
|
|
26
|
+
* nicht raten muss.
|
|
27
|
+
*/
|
|
28
|
+
/** Gemeinsame Zusatzangaben aller Belegarten (Nutzlast von `createReceipt`). */
|
|
29
|
+
export interface ReceiptCommonOptions {
|
|
30
|
+
/** Kundendaten fuer den Belegkopf; gehen als `\n`-verbundene Zeichenkette raus. */
|
|
31
|
+
customerDetails?: string[];
|
|
32
|
+
/** Rechtshinweise (z. B. Reverse Charge); gehen als `\n`-verbundene Zeichenkette raus. */
|
|
33
|
+
legalMessage?: string[];
|
|
34
|
+
/** Kartenanbieter; ohne Angabe gilt `custom`. */
|
|
35
|
+
creditCardProvider?: CreditCardProvider;
|
|
36
|
+
/** Transaktionsbezeichner der Kartenzahlung. */
|
|
37
|
+
cardPaymentId?: string;
|
|
38
|
+
/** Freier Bezeichner des Aufrufers (Projekt, Auftrag, Schicht). */
|
|
39
|
+
customProjectId?: string;
|
|
40
|
+
/** Rohdaten der Kartenzahlung (Terminal-/Anbieterantwort). */
|
|
41
|
+
cardPaymentData?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
/** Belegtyp und Inhalt — die vollstaendige Eingabe von [createReceipt]. */
|
|
44
|
+
export interface CreateReceiptOptions extends ReceiptCommonOptions {
|
|
45
|
+
receiptType: ReceiptType | ReceiptTypeKey;
|
|
46
|
+
/** Zahlungsart des Aufrufers — wird vor dem Senden geprueft. */
|
|
47
|
+
paymentMethod?: KeckPaymentMethod | KeckPaymentMethodKey;
|
|
48
|
+
/**
|
|
49
|
+
* Zahlungsart, die aus einer **Serverantwort** stammt (Storno eines
|
|
50
|
+
* gelesenen Belegs). Geht ungeprueft hinaus: der
|
|
51
|
+
* Server hat den Wert selbst vergeben und weist unbekannte selbst ab —
|
|
52
|
+
* ergaenzt er eine Zahlungsart vor dem naechsten Paket-Update, waeren sonst
|
|
53
|
+
* alle Belege damit unstornierbar. Nur fuer diesen einen Weg gedacht; eine
|
|
54
|
+
* ausdruecklich uebergebene `paymentMethod` sticht.
|
|
55
|
+
*/
|
|
56
|
+
paymentMethodFromServer?: string;
|
|
57
|
+
items?: ReceiptItem[];
|
|
58
|
+
vouchers?: Voucher[];
|
|
59
|
+
}
|
|
60
|
+
export interface SellReceiptOptions extends ReceiptCommonOptions {
|
|
61
|
+
paymentMethod: KeckPaymentMethod | KeckPaymentMethodKey;
|
|
62
|
+
items?: ReceiptItem[];
|
|
63
|
+
vouchers?: Voucher[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* `customerDetails` fehlt hier absichtlich (wie im Flutter-Vorbild): die
|
|
67
|
+
* Kundendaten des Stornos sind die des stornierten Belegs, sonst stimmten
|
|
68
|
+
* Beleg und Storno nicht mehr ueberein.
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* Storno ueber den Endpunkt `cancelReceipt` (Backend: storno-endpoints.js).
|
|
72
|
+
* Der Server negiert die Positionen, prueft Restmengen und Rechte, verkettet
|
|
73
|
+
* Original und Storno-Beleg. Bezug entweder als Beleg-Objekt (`receipt`) oder
|
|
74
|
+
* als Kasse + Beleg-ID.
|
|
75
|
+
*/
|
|
76
|
+
export type CancelReceiptOptions = {
|
|
77
|
+
/** Grund aus dem Katalog — Pflicht, nur der Anzeigetext landet am Bon. */
|
|
78
|
+
reason: CancellationReason;
|
|
79
|
+
/** Teilstorno: Positionen (Index im Original) und Mengen. Fehlt = Vollstorno der Restmengen. */
|
|
80
|
+
items?: CancellationItem[];
|
|
81
|
+
/** Interne Anmerkung (≤ 200 Zeichen), wird gespeichert, nie gedruckt. */
|
|
82
|
+
note?: string;
|
|
83
|
+
/** Rueckzahlweg; ohne Angabe die Zahlungsart des stornierten Belegs. */
|
|
84
|
+
paymentMethod?: KeckPaymentMethod | KeckPaymentMethodKey;
|
|
85
|
+
} & ({
|
|
86
|
+
receipt: Receipt;
|
|
87
|
+
cashregisterId?: string;
|
|
88
|
+
originalReceiptId?: string;
|
|
89
|
+
} | {
|
|
90
|
+
receipt?: undefined;
|
|
91
|
+
cashregisterId: string;
|
|
92
|
+
originalReceiptId: string;
|
|
93
|
+
});
|
|
94
|
+
/** Antwort von [cancelReceipt]: Storno-Beleg, Bezug, Restmengen des Originals danach. */
|
|
95
|
+
export interface CancelReceiptResult {
|
|
96
|
+
receipt: Receipt;
|
|
97
|
+
cancellationOf: CancellationOf;
|
|
98
|
+
remaining: number[];
|
|
99
|
+
}
|
|
100
|
+
export interface CreateCancelReceiptOptions extends ReceiptCommonOptions {
|
|
101
|
+
paymentMethod: KeckPaymentMethod | KeckPaymentMethodKey;
|
|
102
|
+
/** Positionen, wie sie auf dem Storno stehen sollen — **nicht** negiert. */
|
|
103
|
+
items: ReceiptItem[];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Beleg **und** die Firmen-/Druckdaten derselben Antwort — das Ergebnis der
|
|
107
|
+
* `…WithCompany`-Varianten. Das Backend liefert beides in einem Aufruf
|
|
108
|
+
* (functions/index.js); wer den Beleg drucken oder anzeigen will, braucht
|
|
109
|
+
* beides und soll dafuer keinen zweiten Aufruf machen muessen.
|
|
110
|
+
*/
|
|
111
|
+
export interface ReceiptWithCompany {
|
|
112
|
+
receipt: Receipt;
|
|
113
|
+
/** Kopf/Fuss, wie sie fuer DIESEN Beleg gelten (eingefrorene Version des Backends). */
|
|
114
|
+
company: ReceiptCompany;
|
|
115
|
+
/** Beleg einer Testumgebung (Aufdruck TESTKASSE). */
|
|
116
|
+
testKasse: boolean;
|
|
117
|
+
/** Produktionskonto mit Test-Signatureinheit (Aufdruck TESTSIGNATUR). */
|
|
118
|
+
testSignatur: boolean;
|
|
119
|
+
/** Kennung der Kopf-Version; null bei altem Backend/Altbeleg ohne Zuordnung. */
|
|
120
|
+
kopfId: string | null;
|
|
121
|
+
/** Vom Backend gebautes Zeilenmodell (Regelwerk des Belegs); null, wenn nicht mitgeliefert. */
|
|
122
|
+
layout: ReceiptLayout | null;
|
|
123
|
+
/**
|
|
124
|
+
* Registrierdaten fuer den Block „Prüfangaben“ (Nullbelege, Regelwerk 2) --
|
|
125
|
+
* fuer Clients, die das Layout selbst bauen; null bei altem Backend.
|
|
126
|
+
*/
|
|
127
|
+
pruefangaben: Pruefangaben | null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Gemeinsame Umsetzung aller Belegarten (Zwilling von `_createReceipt`).
|
|
131
|
+
* Bewusst **nicht** Teil der Paketoberflaeche: der Belegtyp gehoert nicht in
|
|
132
|
+
* die Hand des Aufrufers, sondern zu einem der benannten Aufrufe darunter.
|
|
133
|
+
*/
|
|
134
|
+
export declare function createReceipt(rufen: KasseneckTransport, options: CreateReceiptOptions): Promise<Receipt>;
|
|
135
|
+
/** Normalbeleg (Verkauf) nach RKSV. */
|
|
136
|
+
export declare function sellReceipt(rufen: KasseneckTransport, options: SellReceiptOptions): Promise<Receipt>;
|
|
137
|
+
/**
|
|
138
|
+
* Normalbeleg wie [sellReceipt], liefert zusaetzlich die Firmen-/Druckdaten
|
|
139
|
+
* aus derselben Antwort — alles, was ein Belegdruck braucht, in einem Aufruf.
|
|
140
|
+
*/
|
|
141
|
+
export declare function sellReceiptWithCompany(rufen: KasseneckTransport, options: SellReceiptOptions): Promise<ReceiptWithCompany>;
|
|
142
|
+
/**
|
|
143
|
+
* Storno-Beleg zu einem bestehenden Beleg — voll oder in Teilen. Prueft die
|
|
144
|
+
* Eingabe, bevor etwas hinausgeht; der Server haelt die Restmengen und die
|
|
145
|
+
* Reichweite des Rechts (eigene/alle) und antwortet mit dem fertigen,
|
|
146
|
+
* signierten Storno-Beleg. Gutscheine des Originals wandern nicht mit.
|
|
147
|
+
*/
|
|
148
|
+
export declare function cancelReceipt(rufen: KasseneckTransport, options: CancelReceiptOptions): Promise<CancelReceiptResult>;
|
|
149
|
+
/**
|
|
150
|
+
* Stornobeleg aus frei uebergebenen Positionen — fuer den Fall, dass der
|
|
151
|
+
* Originalbeleg nicht als Objekt vorliegt. Die Positionen gehen **unveraendert**
|
|
152
|
+
* hinaus; das Vorzeichen setzt der Aufrufer.
|
|
153
|
+
*/
|
|
154
|
+
export declare function createCancelReceipt(rufen: KasseneckTransport, options: CreateCancelReceiptOptions): Promise<Receipt>;
|
|
155
|
+
/** Nullbeleg (RKSV-Pruefbeleg) — ohne Positionen und ohne Zahlungsart. */
|
|
156
|
+
export declare function zeroReceipt(rufen: KasseneckTransport): Promise<Receipt>;
|
|
157
|
+
/** Belegliste einer Kasse samt der Kennzahlen, die dieselbe Antwort mitliefert. */
|
|
158
|
+
export interface ReceiptList {
|
|
159
|
+
/** Letzte Belege, neueste zuerst (Backend: nach `counter` absteigend). */
|
|
160
|
+
receipts: ReceiptSummary[];
|
|
161
|
+
stats: ReceiptListStats;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Kennzahlen zur Kasse, die `listMyReceipts` neben der Liste liefert. Sie
|
|
165
|
+
* kommen aus den Tages-Aggregaten des Backends, nicht aus den gelisteten
|
|
166
|
+
* Belegen — die Reihe umfasst sieben Tage, die Liste nur die letzten `limit`
|
|
167
|
+
* Belege.
|
|
168
|
+
*/
|
|
169
|
+
export interface ReceiptListStats {
|
|
170
|
+
/** Heutiger Umsatz in Cent und Belegzahl (Wiener Kalendertag). */
|
|
171
|
+
today: {
|
|
172
|
+
revenueCents: number;
|
|
173
|
+
count: number;
|
|
174
|
+
};
|
|
175
|
+
/** Veraenderung gegenueber gestern in Prozent; `null`, wenn gestern 0 war. */
|
|
176
|
+
trendPercent: number | null;
|
|
177
|
+
/** Sieben Tage, aeltester zuerst; `date` als `YYYY-MM-DD` (Wiener Kalender). */
|
|
178
|
+
days: Array<{
|
|
179
|
+
date: string;
|
|
180
|
+
revenueCents: number;
|
|
181
|
+
}>;
|
|
182
|
+
}
|
|
183
|
+
export interface ListMyReceiptsOptions {
|
|
184
|
+
/**
|
|
185
|
+
* Kasse, deren Belege gelistet werden. Geht als Parameter **`cashregisterid`**
|
|
186
|
+
* hinaus — klein geschrieben, anders als das `cashregisterId` der Anmeldung:
|
|
187
|
+
* so heisst der Pflichtparameter dieses Endpunkts im Backend, und ein
|
|
188
|
+
* Tippfehler faellt sonst erst im Betrieb auf.
|
|
189
|
+
*/
|
|
190
|
+
cashregisterId: string;
|
|
191
|
+
/**
|
|
192
|
+
* Anzahl Belege; ohne Angabe nimmt das Backend 50. Es begrenzt den Wert
|
|
193
|
+
* selbst auf 1 bis 200 — ein groesserer Wunsch wird still gekappt.
|
|
194
|
+
*/
|
|
195
|
+
limit?: number;
|
|
196
|
+
/** Zeitfenster (Wiener Wanduhr, `YYYY-MM-DD` oder voller Zeitstempel); der Server deckelt auf 90 Tage. */
|
|
197
|
+
from?: string;
|
|
198
|
+
to?: string;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Belege einer Kasse auflisten — die Grundlage jeder Belegliste in der
|
|
202
|
+
* Browser-Kasse (Nachdruck, Storno, Tagesuebersicht).
|
|
203
|
+
*
|
|
204
|
+
* Die Eintraege sind **Zusammenfassungen**, keine vollstaendigen Belege (siehe
|
|
205
|
+
* [ReceiptSummary]); fuer Nachdruck oder Storno gehoert der Beleg ueber
|
|
206
|
+
* [getReceipt] bzw. [getReceiptWithCompany] einzeln geholt.
|
|
207
|
+
*
|
|
208
|
+
* **Anmeldeweg:** Der Endpunkt laeuft im Backend unter
|
|
209
|
+
* `checkRequest(req, 'customer', …, {allowRegisterUser: true})`, der Bearer
|
|
210
|
+
* muss also ein Firebase-ID-Token sein — mit `apiKeyAuth` ist er nicht
|
|
211
|
+
* erreichbar. Ausserdem prueft das Backend die Kassenzuweisung hier im Rumpf
|
|
212
|
+
* (der Endpunkt laeuft mit `checkCashRegister: false`), ein Kassen-Benutzer
|
|
213
|
+
* bekommt also nur die ihm zugewiesenen Kassen.
|
|
214
|
+
*/
|
|
215
|
+
export declare function listMyReceipts(rufen: KasseneckTransport, options: ListMyReceiptsOptions): Promise<ReceiptList>;
|
|
216
|
+
/** Einzelnen Beleg der angemeldeten Kasse holen. */
|
|
217
|
+
export declare function getReceipt(rufen: KasseneckTransport, receiptId: string): Promise<Receipt>;
|
|
218
|
+
/**
|
|
219
|
+
* Wie [getReceipt], liefert zusaetzlich die Firmen-/Druckdaten aus derselben
|
|
220
|
+
* Antwort (Firma, Anschrift, Steuernummer, UID, Fusszeilen, Logo-Adresse,
|
|
221
|
+
* Kleinunternehmer-Kennzeichen) — die Angaben, die ein Beleg im Kopf und Fuss
|
|
222
|
+
* traegt (siehe models/receipt-company.ts).
|
|
223
|
+
*/
|
|
224
|
+
export declare function getReceiptWithCompany(rufen: KasseneckTransport, receiptId: string): Promise<ReceiptWithCompany>;
|
|
225
|
+
/**
|
|
226
|
+
* Verschluesselte Volltext-Belegnummer erzeugen — der Bezeichner, unter dem der
|
|
227
|
+
* Beleg oeffentlich abrufbar ist (Beleg-Download, Pruefportal).
|
|
228
|
+
*/
|
|
229
|
+
export declare function generateFullReceiptId(rufen: KasseneckTransport, receiptId: string): Promise<string>;
|
|
230
|
+
/**
|
|
231
|
+
* Berichtsmonat des allerersten Belegs dieser Kasse — die untere Grenze aller
|
|
232
|
+
* Monatsberichte.
|
|
233
|
+
*
|
|
234
|
+
* **Nicht fuer den Kassen-Benutzer-Weg (`registerUserAuth`):** dieser Endpunkt
|
|
235
|
+
* fuehrt kein `allowRegisterUser`, das Backend weist die Browser-Kasse hier ab
|
|
236
|
+
* (siehe Modulkommentar oben). Mit `apiKeyAuth` ist er offen.
|
|
237
|
+
*/
|
|
238
|
+
export declare function getFirstReceiptDate(rufen: KasseneckTransport): Promise<ReportMonth>;
|
|
239
|
+
/**
|
|
240
|
+
* Prueft die Gutschein-Kombination eines Belegs und liefert den ersten
|
|
241
|
+
* Regelverstoss als Text (oder `null`) — Zwilling von
|
|
242
|
+
* `checkVoucherCombinationError`. Bewusst als Rueckgabewert statt als Fehler:
|
|
243
|
+
* eine Kassenoberflaeche will das pruefen, **bevor** sie den Beleg abschickt.
|
|
244
|
+
*/
|
|
245
|
+
export declare function checkVoucherCombinationError(vouchers: Voucher[], items: ReceiptItem[]): string | null;
|