@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,21 @@
|
|
|
1
|
+
import { type Cashregister } from '../models/index.js';
|
|
2
|
+
import type { KasseneckTransport } from './transport.js';
|
|
3
|
+
/**
|
|
4
|
+
* Kassen-Endpunkte.
|
|
5
|
+
*
|
|
6
|
+
* **Anmeldeweg:** `listMyCashregisters` laeuft im Backend unter
|
|
7
|
+
* `checkRequest(req, 'customer', …, {allowRegisterUser: true})` — der Bearer
|
|
8
|
+
* muss also ein Firebase-ID-Token sein. Mit `apiKeyAuth` (api_key als Bearer)
|
|
9
|
+
* ist dieser Endpunkt **nicht** erreichbar; fuer die Browser-Kasse ist
|
|
10
|
+
* `registerUserAuth` der Weg. Dieses Paket bildet das nicht nach — wer darf,
|
|
11
|
+
* entscheidet allein das Backend. Der Hinweis steht hier, damit ein Leser
|
|
12
|
+
* nicht raten muss.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Die Kassen, die dem angemeldeten Benutzer offenstehen — fuer einen
|
|
16
|
+
* Kassen-Benutzer genau die ihm zugewiesenen (das Backend filtert, siehe
|
|
17
|
+
* `registerAuth.darfKasse`).
|
|
18
|
+
*
|
|
19
|
+
* Ohne diesen Aufruf kann eine Browser-Kasse ihre Kasse nicht auswaehlen.
|
|
20
|
+
*/
|
|
21
|
+
export declare function listMyCashregisters(rufen: KasseneckTransport): Promise<Cashregister[]>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listMyCashregisters = listMyCashregisters;
|
|
4
|
+
const index_js_1 = require("../models/index.js");
|
|
5
|
+
const errors_js_1 = require("./errors.js");
|
|
6
|
+
/**
|
|
7
|
+
* Kassen-Endpunkte.
|
|
8
|
+
*
|
|
9
|
+
* **Anmeldeweg:** `listMyCashregisters` laeuft im Backend unter
|
|
10
|
+
* `checkRequest(req, 'customer', …, {allowRegisterUser: true})` — der Bearer
|
|
11
|
+
* muss also ein Firebase-ID-Token sein. Mit `apiKeyAuth` (api_key als Bearer)
|
|
12
|
+
* ist dieser Endpunkt **nicht** erreichbar; fuer die Browser-Kasse ist
|
|
13
|
+
* `registerUserAuth` der Weg. Dieses Paket bildet das nicht nach — wer darf,
|
|
14
|
+
* entscheidet allein das Backend. Der Hinweis steht hier, damit ein Leser
|
|
15
|
+
* nicht raten muss.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Die Kassen, die dem angemeldeten Benutzer offenstehen — fuer einen
|
|
19
|
+
* Kassen-Benutzer genau die ihm zugewiesenen (das Backend filtert, siehe
|
|
20
|
+
* `registerAuth.darfKasse`).
|
|
21
|
+
*
|
|
22
|
+
* Ohne diesen Aufruf kann eine Browser-Kasse ihre Kasse nicht auswaehlen.
|
|
23
|
+
*/
|
|
24
|
+
async function listMyCashregisters(rufen) {
|
|
25
|
+
const daten = await rufen('listMyCashregisters');
|
|
26
|
+
const liste = daten?.cashregisters;
|
|
27
|
+
if (!Array.isArray(liste)) {
|
|
28
|
+
throw new errors_js_1.KasseneckValidationError('listMyCashregisters', 'Antwort enthaelt keine Kassenliste (data.cashregisters fehlt)', 'response');
|
|
29
|
+
}
|
|
30
|
+
return liste.map((eintrag, i) => {
|
|
31
|
+
const nutzlast = (typeof eintrag === 'object' && eintrag !== null ? eintrag : {});
|
|
32
|
+
// Die Dokument-ID steht in dieser Antwort im Eintrag selbst; der zweite
|
|
33
|
+
// Parameter ist nur der Rueckfall (siehe fromCashregisterPayload).
|
|
34
|
+
return (0, index_js_1.fromCashregisterPayload)(nutzlast, nutzlast.id ?? String(i));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
/** Verdichtete, geheimnisfreie Form einer fremden Fehlerursache. */
|
|
58
|
+
export interface CauseDigest {
|
|
59
|
+
causeName?: string | undefined;
|
|
60
|
+
causeCode?: string | undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reduziert eine fremde Ursache auf Name und Code — und verwirft beides, wenn
|
|
64
|
+
* es kein Bezeichner ist oder mit einem der uebergebenen Geheimnisse
|
|
65
|
+
* ueberlappt (ein Sitzungsbezeichner sieht durchaus bezeichner-artig aus).
|
|
66
|
+
*
|
|
67
|
+
* `geheimnisse` hat bewusst **keinen** Vorgabewert: eine Verdichtung ohne
|
|
68
|
+
* Abgleichliste waere nur ein Formfilter und damit keine Zusage. Wo die
|
|
69
|
+
* gesendeten Werte nicht bekannt sind, wird gar nicht verdichtet.
|
|
70
|
+
*/
|
|
71
|
+
export declare function causeDigest(ursache: unknown, geheimnisse: readonly string[]): CauseDigest;
|
|
72
|
+
/** Fachlicher Fehler: HTTP 200, aber `status: 'error'` im Rumpf. */
|
|
73
|
+
export declare class KasseneckApiError extends Error {
|
|
74
|
+
readonly name = "KasseneckApiError";
|
|
75
|
+
/** Aufgerufene Backend-Funktion, z. B. `createReceipt`. */
|
|
76
|
+
readonly functionName: string;
|
|
77
|
+
/** Meldung des Backends, unveraendert (`message` aus der Huelle). */
|
|
78
|
+
readonly serverMessage: string;
|
|
79
|
+
constructor(functionName: string, serverMessage: string);
|
|
80
|
+
}
|
|
81
|
+
/** Warum die Antwort keine verwertbare Huelle war. */
|
|
82
|
+
export type HttpFailureReason = 'server-error' | 'empty-body' | 'not-json' | 'missing-status';
|
|
83
|
+
/** Antwort ohne verwertbare Huelle (HTTP-Fehler, leerer Rumpf, HTML statt JSON). */
|
|
84
|
+
export declare class KasseneckHttpError extends Error {
|
|
85
|
+
readonly name = "KasseneckHttpError";
|
|
86
|
+
readonly functionName: string;
|
|
87
|
+
/** HTTP-Statuscode der Antwort (bei HTML-statt-JSON durchaus 200). */
|
|
88
|
+
readonly statusCode: number;
|
|
89
|
+
/** Inhaltstyp der Antwort, falls die Gegenstelle einen gesetzt hat. */
|
|
90
|
+
readonly contentType: string | undefined;
|
|
91
|
+
/** Maschinenlesbarer Grund — trennt den Rewrite-Fall vom 500er ohne Textparsen. */
|
|
92
|
+
readonly reason: HttpFailureReason;
|
|
93
|
+
constructor(functionName: string, statusCode: number, contentType: string | undefined, reason: HttpFailureReason);
|
|
94
|
+
}
|
|
95
|
+
/** Es kam keine Antwort: Netzfehler oder Zeitueberschreitung. */
|
|
96
|
+
export declare class KasseneckNetworkError extends Error {
|
|
97
|
+
readonly name = "KasseneckNetworkError";
|
|
98
|
+
readonly functionName: string;
|
|
99
|
+
/** true = das Zeitlimit lief ab und die Anfrage wurde abgebrochen. */
|
|
100
|
+
readonly timedOut: boolean;
|
|
101
|
+
/** Das geltende Zeitlimit in Millisekunden. */
|
|
102
|
+
readonly timeoutMs: number;
|
|
103
|
+
/** Name der zugrunde liegenden Ursache, sofern unbedenklich (s. `causeDigest`). */
|
|
104
|
+
readonly causeName: string | undefined;
|
|
105
|
+
/** Code der zugrunde liegenden Ursache, sofern unbedenklich (z. B. `ECONNREFUSED`). */
|
|
106
|
+
readonly causeCode: string | undefined;
|
|
107
|
+
constructor(functionName: string, timedOut: boolean, timeoutMs: number, ursache?: CauseDigest);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Die Anmeldung scheiterte — es ging keine Anfrage raus.
|
|
111
|
+
*
|
|
112
|
+
* Dieser Fehler traegt **nichts** aus der fremden Ursache: weder ihre Meldung
|
|
113
|
+
* (ein Token-Geber fuehrt gern den Token mit, den er gerade nicht erneuern
|
|
114
|
+
* konnte) noch eine Verdichtung ihres Namens/Codes. Zum Zeitpunkt des
|
|
115
|
+
* Anmeldefehlers ist noch nichts gesendet, es gibt also keine Liste der
|
|
116
|
+
* Geheimnisse, gegen die verdichtete Werte geprueft werden koennten — und ein
|
|
117
|
+
* reiner Formfilter laesst genau die Form durch, die ein Sitzungsbezeichner
|
|
118
|
+
* hat.
|
|
119
|
+
*/
|
|
120
|
+
export declare class KasseneckAuthError extends Error {
|
|
121
|
+
readonly name = "KasseneckAuthError";
|
|
122
|
+
/** Betroffene Backend-Funktion, falls der Fehler bei einem Aufruf entstand. */
|
|
123
|
+
readonly functionName: string | undefined;
|
|
124
|
+
/** Vom Paket formulierter Grund — geheimnisfrei, anders als fremde Meldungen. */
|
|
125
|
+
readonly reason: string;
|
|
126
|
+
constructor(reason: string, options?: {
|
|
127
|
+
functionName?: string;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/** Woran die Form haengt: an der Eingabe des Aufrufers oder an der Antwort. */
|
|
131
|
+
export type ValidationScope = 'request' | 'response';
|
|
132
|
+
/**
|
|
133
|
+
* Die Form stimmt nicht — bei `scope: 'request'` ging deshalb keine Anfrage
|
|
134
|
+
* raus, bei `scope: 'response'` kam eine unbrauchbare zurueck.
|
|
135
|
+
*
|
|
136
|
+
* Es gilt dieselbe Zusage wie fuer die uebrigen Fehlerarten: `reason` ist vom
|
|
137
|
+
* Paket formuliert und geheimnisfrei. Bei `'response'` wird insbesondere
|
|
138
|
+
* **nichts aus der Antwort** uebernommen — ein fremder Proxy koennte dort
|
|
139
|
+
* alles Moegliche zurueckspiegeln.
|
|
140
|
+
*/
|
|
141
|
+
export declare class KasseneckValidationError extends Error {
|
|
142
|
+
readonly name = "KasseneckValidationError";
|
|
143
|
+
/**
|
|
144
|
+
* Betroffener Vorgang — meist die Backend-Funktion, bei Pruefungen ohne
|
|
145
|
+
* Aufruf der Name der Paketfunktion (z. B. `buildReceiptLayout`).
|
|
146
|
+
*/
|
|
147
|
+
readonly functionName: string;
|
|
148
|
+
/** Vom Paket formulierter Grund. */
|
|
149
|
+
readonly reason: string;
|
|
150
|
+
readonly scope: ValidationScope;
|
|
151
|
+
constructor(functionName: string, reason: string, scope: ValidationScope);
|
|
152
|
+
}
|
|
153
|
+
/** Alle Fehler, die dieses Paket wirft. */
|
|
154
|
+
export type KasseneckError = KasseneckApiError | KasseneckHttpError | KasseneckNetworkError | KasseneckAuthError | KasseneckValidationError;
|
|
155
|
+
export declare function isKasseneckApiError(fehler: unknown): fehler is KasseneckApiError;
|
|
156
|
+
export declare function isKasseneckHttpError(fehler: unknown): fehler is KasseneckHttpError;
|
|
157
|
+
export declare function isKasseneckNetworkError(fehler: unknown): fehler is KasseneckNetworkError;
|
|
158
|
+
export declare function isKasseneckAuthError(fehler: unknown): fehler is KasseneckAuthError;
|
|
159
|
+
export declare function isKasseneckValidationError(fehler: unknown): fehler is KasseneckValidationError;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Die fuenf Fehlerarten des Kasseneck-Clients — bewusst getrennt, weil ein
|
|
4
|
+
* Aufrufer auf jede anders reagieren muss:
|
|
5
|
+
*
|
|
6
|
+
* - `KasseneckValidationError` — die **Form** stimmt nicht: entweder ging
|
|
7
|
+
* mangels brauchbarer Eingabe gar keine Anfrage raus, oder die Antwort war
|
|
8
|
+
* nicht verwertbar. `scope` trennt die beiden Richtungen. `'request'`: die
|
|
9
|
+
* Eingabe des Aufrufers verletzt eine Regel, die dieses Paket schon vor dem
|
|
10
|
+
* Senden kennt (Beleg ohne Positionen, unmoegliche Gutscheinkombination) —
|
|
11
|
+
* das ist ein Programmierfehler im Aufrufer, kein Betriebszustand.
|
|
12
|
+
* `'response'`: das Backend meldete Erfolg, die Nutzlast enthielt aber
|
|
13
|
+
* nicht, was der Aufruf zusagt.
|
|
14
|
+
*
|
|
15
|
+
* - `KasseneckApiError` — **fachlicher** Fehler. Das Backend antwortet immer
|
|
16
|
+
* mit HTTP 200 und legt Erfolg/Misserfolg in den Rumpf
|
|
17
|
+
* (`{status:'success'|'error', message, data}`, siehe `successResponse`/
|
|
18
|
+
* `errorResponse` im Backend). Ein `status:'error'` heisst: die Anfrage kam
|
|
19
|
+
* an und wurde abgelehnt (gesperrte Kasse, fehlendes Modul, ungueltiger
|
|
20
|
+
* Parameter). Wiederholen hilft nicht.
|
|
21
|
+
* - `KasseneckHttpError` — die Antwort war **keine** verwertbare Huelle:
|
|
22
|
+
* HTTP 500/404, leerer Rumpf, oder HTTP 200 mit HTML statt JSON (typisch,
|
|
23
|
+
* wenn ein Aufruf mangels Rewrite auf der Single-Page-App landet). Beim
|
|
24
|
+
* Bericht-Download gelten dieselben Gruende fuer alles, was kein PDF ist.
|
|
25
|
+
* `reason` trennt die Faelle maschinenlesbar.
|
|
26
|
+
* - `KasseneckNetworkError` — die Antwort kam gar nicht: Netz weg, DNS,
|
|
27
|
+
* abgebrochene Verbindung oder Zeitueberschreitung (`timedOut`).
|
|
28
|
+
* - `KasseneckAuthError` — es kam nicht einmal zur Anfrage, weil die Anmeldung
|
|
29
|
+
* scheiterte (fehlende Zugangsdaten, oder der Token-/Sitzungsgeber warf).
|
|
30
|
+
* In der Browser-Kasse mit ihrer 90-Sekunden-Sitzung ist das Alltag, kein
|
|
31
|
+
* Sonderfall.
|
|
32
|
+
*
|
|
33
|
+
* **Geheimnisse gehoeren in keinen dieser Fehler.** Fehlermeldungen landen in
|
|
34
|
+
* Protokollen und Fehlerdiensten; weder `api_key`, Kassen-Token, Firebase-
|
|
35
|
+
* ID-Token noch Sitzungsbezeichner duerfen dorthin. Deshalb tragen die Fehler
|
|
36
|
+
* ausschliesslich Funktionsname, HTTP-Status/Inhaltstyp, den vom Paket
|
|
37
|
+
* formulierten Grund und die vom Backend formulierte Meldung — nie Kopfzeilen,
|
|
38
|
+
* nie den gesendeten Rumpf und auch nicht den empfangenen Rumpf (der koennte
|
|
39
|
+
* bei einem fremden Proxy alles Moegliche zurueckspiegeln).
|
|
40
|
+
*
|
|
41
|
+
* Aus demselben Grund haengt **keine fremde Ursache** als `cause` an diesen
|
|
42
|
+
* Fehlern: `console.error(err)` und `util.inspect` drucken die Ursachenkette
|
|
43
|
+
* mit, und fremde HTTP-Bibliotheken haengen ihre Anfrage an ihre Fehler (axios
|
|
44
|
+
* `config.headers`, got `options.headers`) — mit dem Bearer-Schluessel darin.
|
|
45
|
+
* Statt der Ursache selbst traegt `KasseneckNetworkError` ihre **verdichtete**
|
|
46
|
+
* Form: `causeName`/`causeCode`, beide nur, wenn sie wie ein Bezeichner
|
|
47
|
+
* aussehen **und** mit keinem der gesendeten Geheimnisse ueberlappen (siehe
|
|
48
|
+
* `causeDigest`).
|
|
49
|
+
*
|
|
50
|
+
* Der Formfilter allein traegt diese Zusage naemlich nicht: der
|
|
51
|
+
* Sitzungsbezeichner der Browser-Kasse ist selbst bezeichner-foermig und kaeme
|
|
52
|
+
* durch. Verdichtet werden darf nur, wo die gesendeten Geheimnisse bekannt
|
|
53
|
+
* sind — also nach dem Bauen der Anfrage. `KasseneckAuthError` traegt darum
|
|
54
|
+
* **gar keine** Ursachen-Verdichtung: dort ist noch nichts gesendet, es gibt
|
|
55
|
+
* keine Liste zum Abgleichen, und Diagnose ist an dieser Stelle weniger wert
|
|
56
|
+
* als die Zusage.
|
|
57
|
+
*/
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.KasseneckValidationError = exports.KasseneckAuthError = exports.KasseneckNetworkError = exports.KasseneckHttpError = exports.KasseneckApiError = void 0;
|
|
60
|
+
exports.causeDigest = causeDigest;
|
|
61
|
+
exports.isKasseneckApiError = isKasseneckApiError;
|
|
62
|
+
exports.isKasseneckHttpError = isKasseneckHttpError;
|
|
63
|
+
exports.isKasseneckNetworkError = isKasseneckNetworkError;
|
|
64
|
+
exports.isKasseneckAuthError = isKasseneckAuthError;
|
|
65
|
+
exports.isKasseneckValidationError = isKasseneckValidationError;
|
|
66
|
+
// Bezeichner-artig: Buchstabe vorn, danach nur Bezeichnerzeichen, hoechstens
|
|
67
|
+
// 64 Zeichen. Das laesst `TypeError`, `ECONNREFUSED` und `auth/internal-error`
|
|
68
|
+
// durch, aber keinen Freitext und kein Firebase-ID-Token (~900 Zeichen).
|
|
69
|
+
const BEZEICHNER = /^[A-Za-z][A-Za-z0-9_./-]{0,63}$/;
|
|
70
|
+
/**
|
|
71
|
+
* Reduziert eine fremde Ursache auf Name und Code — und verwirft beides, wenn
|
|
72
|
+
* es kein Bezeichner ist oder mit einem der uebergebenen Geheimnisse
|
|
73
|
+
* ueberlappt (ein Sitzungsbezeichner sieht durchaus bezeichner-artig aus).
|
|
74
|
+
*
|
|
75
|
+
* `geheimnisse` hat bewusst **keinen** Vorgabewert: eine Verdichtung ohne
|
|
76
|
+
* Abgleichliste waere nur ein Formfilter und damit keine Zusage. Wo die
|
|
77
|
+
* gesendeten Werte nicht bekannt sind, wird gar nicht verdichtet.
|
|
78
|
+
*/
|
|
79
|
+
function causeDigest(ursache, geheimnisse) {
|
|
80
|
+
const roh = ursache;
|
|
81
|
+
return {
|
|
82
|
+
causeName: unbedenklich(roh?.name, geheimnisse),
|
|
83
|
+
causeCode: unbedenklich(roh?.code, geheimnisse),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function unbedenklich(wert, geheimnisse) {
|
|
87
|
+
if (typeof wert !== 'string' || !BEZEICHNER.test(wert)) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
for (const geheim of geheimnisse) {
|
|
91
|
+
if (geheim && (geheim.includes(wert) || wert.includes(geheim))) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return wert;
|
|
96
|
+
}
|
|
97
|
+
/** Fachlicher Fehler: HTTP 200, aber `status: 'error'` im Rumpf. */
|
|
98
|
+
class KasseneckApiError extends Error {
|
|
99
|
+
name = 'KasseneckApiError';
|
|
100
|
+
/** Aufgerufene Backend-Funktion, z. B. `createReceipt`. */
|
|
101
|
+
functionName;
|
|
102
|
+
/** Meldung des Backends, unveraendert (`message` aus der Huelle). */
|
|
103
|
+
serverMessage;
|
|
104
|
+
constructor(functionName, serverMessage) {
|
|
105
|
+
super(`${functionName} fehlgeschlagen: ${serverMessage}`);
|
|
106
|
+
this.functionName = functionName;
|
|
107
|
+
this.serverMessage = serverMessage;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.KasseneckApiError = KasseneckApiError;
|
|
111
|
+
const GRUND_TEXT = {
|
|
112
|
+
'server-error': 'Server-Fehler',
|
|
113
|
+
'empty-body': 'leere Antwort',
|
|
114
|
+
'not-json': 'Antwort ist kein JSON',
|
|
115
|
+
'missing-status': 'Antwort ohne Statusfeld',
|
|
116
|
+
};
|
|
117
|
+
/** Antwort ohne verwertbare Huelle (HTTP-Fehler, leerer Rumpf, HTML statt JSON). */
|
|
118
|
+
class KasseneckHttpError extends Error {
|
|
119
|
+
name = 'KasseneckHttpError';
|
|
120
|
+
functionName;
|
|
121
|
+
/** HTTP-Statuscode der Antwort (bei HTML-statt-JSON durchaus 200). */
|
|
122
|
+
statusCode;
|
|
123
|
+
/** Inhaltstyp der Antwort, falls die Gegenstelle einen gesetzt hat. */
|
|
124
|
+
contentType;
|
|
125
|
+
/** Maschinenlesbarer Grund — trennt den Rewrite-Fall vom 500er ohne Textparsen. */
|
|
126
|
+
reason;
|
|
127
|
+
constructor(functionName, statusCode, contentType, reason) {
|
|
128
|
+
const typHinweis = contentType ? `, Inhaltstyp ${contentType}` : '';
|
|
129
|
+
super(`${functionName} fehlgeschlagen: ${GRUND_TEXT[reason]} (HTTP ${statusCode}${typHinweis})`);
|
|
130
|
+
this.functionName = functionName;
|
|
131
|
+
this.statusCode = statusCode;
|
|
132
|
+
this.contentType = contentType;
|
|
133
|
+
this.reason = reason;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.KasseneckHttpError = KasseneckHttpError;
|
|
137
|
+
/** Es kam keine Antwort: Netzfehler oder Zeitueberschreitung. */
|
|
138
|
+
class KasseneckNetworkError extends Error {
|
|
139
|
+
name = 'KasseneckNetworkError';
|
|
140
|
+
functionName;
|
|
141
|
+
/** true = das Zeitlimit lief ab und die Anfrage wurde abgebrochen. */
|
|
142
|
+
timedOut;
|
|
143
|
+
/** Das geltende Zeitlimit in Millisekunden. */
|
|
144
|
+
timeoutMs;
|
|
145
|
+
/** Name der zugrunde liegenden Ursache, sofern unbedenklich (s. `causeDigest`). */
|
|
146
|
+
causeName;
|
|
147
|
+
/** Code der zugrunde liegenden Ursache, sofern unbedenklich (z. B. `ECONNREFUSED`). */
|
|
148
|
+
causeCode;
|
|
149
|
+
constructor(functionName, timedOut, timeoutMs, ursache = {}) {
|
|
150
|
+
const grund = timedOut ? `Zeitueberschreitung nach ${timeoutMs} ms` : 'Netzwerkfehler';
|
|
151
|
+
const codeHinweis = ursache.causeCode ? ` (${ursache.causeCode})` : '';
|
|
152
|
+
super(`${functionName} fehlgeschlagen: ${grund}${codeHinweis}`);
|
|
153
|
+
this.functionName = functionName;
|
|
154
|
+
this.timedOut = timedOut;
|
|
155
|
+
this.timeoutMs = timeoutMs;
|
|
156
|
+
this.causeName = ursache.causeName;
|
|
157
|
+
this.causeCode = ursache.causeCode;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.KasseneckNetworkError = KasseneckNetworkError;
|
|
161
|
+
/**
|
|
162
|
+
* Die Anmeldung scheiterte — es ging keine Anfrage raus.
|
|
163
|
+
*
|
|
164
|
+
* Dieser Fehler traegt **nichts** aus der fremden Ursache: weder ihre Meldung
|
|
165
|
+
* (ein Token-Geber fuehrt gern den Token mit, den er gerade nicht erneuern
|
|
166
|
+
* konnte) noch eine Verdichtung ihres Namens/Codes. Zum Zeitpunkt des
|
|
167
|
+
* Anmeldefehlers ist noch nichts gesendet, es gibt also keine Liste der
|
|
168
|
+
* Geheimnisse, gegen die verdichtete Werte geprueft werden koennten — und ein
|
|
169
|
+
* reiner Formfilter laesst genau die Form durch, die ein Sitzungsbezeichner
|
|
170
|
+
* hat.
|
|
171
|
+
*/
|
|
172
|
+
class KasseneckAuthError extends Error {
|
|
173
|
+
name = 'KasseneckAuthError';
|
|
174
|
+
/** Betroffene Backend-Funktion, falls der Fehler bei einem Aufruf entstand. */
|
|
175
|
+
functionName;
|
|
176
|
+
/** Vom Paket formulierter Grund — geheimnisfrei, anders als fremde Meldungen. */
|
|
177
|
+
reason;
|
|
178
|
+
constructor(reason, options = {}) {
|
|
179
|
+
super(options.functionName ? `${options.functionName} fehlgeschlagen: ${reason}` : reason);
|
|
180
|
+
this.functionName = options.functionName;
|
|
181
|
+
this.reason = reason;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.KasseneckAuthError = KasseneckAuthError;
|
|
185
|
+
/**
|
|
186
|
+
* Die Form stimmt nicht — bei `scope: 'request'` ging deshalb keine Anfrage
|
|
187
|
+
* raus, bei `scope: 'response'` kam eine unbrauchbare zurueck.
|
|
188
|
+
*
|
|
189
|
+
* Es gilt dieselbe Zusage wie fuer die uebrigen Fehlerarten: `reason` ist vom
|
|
190
|
+
* Paket formuliert und geheimnisfrei. Bei `'response'` wird insbesondere
|
|
191
|
+
* **nichts aus der Antwort** uebernommen — ein fremder Proxy koennte dort
|
|
192
|
+
* alles Moegliche zurueckspiegeln.
|
|
193
|
+
*/
|
|
194
|
+
class KasseneckValidationError extends Error {
|
|
195
|
+
name = 'KasseneckValidationError';
|
|
196
|
+
/**
|
|
197
|
+
* Betroffener Vorgang — meist die Backend-Funktion, bei Pruefungen ohne
|
|
198
|
+
* Aufruf der Name der Paketfunktion (z. B. `buildReceiptLayout`).
|
|
199
|
+
*/
|
|
200
|
+
functionName;
|
|
201
|
+
/** Vom Paket formulierter Grund. */
|
|
202
|
+
reason;
|
|
203
|
+
scope;
|
|
204
|
+
constructor(functionName, reason, scope) {
|
|
205
|
+
super(`${functionName} fehlgeschlagen: ${reason}`);
|
|
206
|
+
this.functionName = functionName;
|
|
207
|
+
this.reason = reason;
|
|
208
|
+
this.scope = scope;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.KasseneckValidationError = KasseneckValidationError;
|
|
212
|
+
function isKasseneckApiError(fehler) {
|
|
213
|
+
return fehler instanceof KasseneckApiError;
|
|
214
|
+
}
|
|
215
|
+
function isKasseneckHttpError(fehler) {
|
|
216
|
+
return fehler instanceof KasseneckHttpError;
|
|
217
|
+
}
|
|
218
|
+
function isKasseneckNetworkError(fehler) {
|
|
219
|
+
return fehler instanceof KasseneckNetworkError;
|
|
220
|
+
}
|
|
221
|
+
function isKasseneckAuthError(fehler) {
|
|
222
|
+
return fehler instanceof KasseneckAuthError;
|
|
223
|
+
}
|
|
224
|
+
function isKasseneckValidationError(fehler) {
|
|
225
|
+
return fehler instanceof KasseneckValidationError;
|
|
226
|
+
}
|
|
@@ -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,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createKasseneckApi = exports.getSignatureStatus = exports.getCashboxStatus = exports.downloadMonthlyReport = exports.downloadDailyReport = exports.listMyCashregisters = exports.checkVoucherCombinationError = exports.listMyReceipts = exports.getFirstReceiptDate = exports.generateFullReceiptId = exports.getReceiptWithCompany = exports.getReceipt = exports.zeroReceipt = exports.createCancelReceipt = exports.cancelReceipt = exports.sellReceiptWithCompany = exports.sellReceipt = exports.isKasseneckValidationError = exports.isKasseneckNetworkError = exports.isKasseneckHttpError = exports.isKasseneckAuthError = exports.isKasseneckApiError = exports.KasseneckValidationError = exports.KasseneckNetworkError = exports.KasseneckHttpError = exports.KasseneckAuthError = exports.KasseneckApiError = exports.createBinaryTransport = exports.createTransport = exports.DEFAULT_TIMEOUT_MS = exports.DEFAULT_BASE_URL = exports.registerUserAuth = exports.apiKeyAuth = void 0;
|
|
4
|
+
var auth_js_1 = require("./auth.js");
|
|
5
|
+
Object.defineProperty(exports, "apiKeyAuth", { enumerable: true, get: function () { return auth_js_1.apiKeyAuth; } });
|
|
6
|
+
Object.defineProperty(exports, "registerUserAuth", { enumerable: true, get: function () { return auth_js_1.registerUserAuth; } });
|
|
7
|
+
var transport_js_1 = require("./transport.js");
|
|
8
|
+
Object.defineProperty(exports, "DEFAULT_BASE_URL", { enumerable: true, get: function () { return transport_js_1.DEFAULT_BASE_URL; } });
|
|
9
|
+
Object.defineProperty(exports, "DEFAULT_TIMEOUT_MS", { enumerable: true, get: function () { return transport_js_1.DEFAULT_TIMEOUT_MS; } });
|
|
10
|
+
Object.defineProperty(exports, "createTransport", { enumerable: true, get: function () { return transport_js_1.createTransport; } });
|
|
11
|
+
Object.defineProperty(exports, "createBinaryTransport", { enumerable: true, get: function () { return transport_js_1.createBinaryTransport; } });
|
|
12
|
+
var errors_js_1 = require("./errors.js");
|
|
13
|
+
Object.defineProperty(exports, "KasseneckApiError", { enumerable: true, get: function () { return errors_js_1.KasseneckApiError; } });
|
|
14
|
+
Object.defineProperty(exports, "KasseneckAuthError", { enumerable: true, get: function () { return errors_js_1.KasseneckAuthError; } });
|
|
15
|
+
Object.defineProperty(exports, "KasseneckHttpError", { enumerable: true, get: function () { return errors_js_1.KasseneckHttpError; } });
|
|
16
|
+
Object.defineProperty(exports, "KasseneckNetworkError", { enumerable: true, get: function () { return errors_js_1.KasseneckNetworkError; } });
|
|
17
|
+
Object.defineProperty(exports, "KasseneckValidationError", { enumerable: true, get: function () { return errors_js_1.KasseneckValidationError; } });
|
|
18
|
+
Object.defineProperty(exports, "isKasseneckApiError", { enumerable: true, get: function () { return errors_js_1.isKasseneckApiError; } });
|
|
19
|
+
Object.defineProperty(exports, "isKasseneckAuthError", { enumerable: true, get: function () { return errors_js_1.isKasseneckAuthError; } });
|
|
20
|
+
Object.defineProperty(exports, "isKasseneckHttpError", { enumerable: true, get: function () { return errors_js_1.isKasseneckHttpError; } });
|
|
21
|
+
Object.defineProperty(exports, "isKasseneckNetworkError", { enumerable: true, get: function () { return errors_js_1.isKasseneckNetworkError; } });
|
|
22
|
+
Object.defineProperty(exports, "isKasseneckValidationError", { enumerable: true, get: function () { return errors_js_1.isKasseneckValidationError; } });
|
|
23
|
+
var receipts_js_1 = require("./receipts.js");
|
|
24
|
+
Object.defineProperty(exports, "sellReceipt", { enumerable: true, get: function () { return receipts_js_1.sellReceipt; } });
|
|
25
|
+
Object.defineProperty(exports, "sellReceiptWithCompany", { enumerable: true, get: function () { return receipts_js_1.sellReceiptWithCompany; } });
|
|
26
|
+
Object.defineProperty(exports, "cancelReceipt", { enumerable: true, get: function () { return receipts_js_1.cancelReceipt; } });
|
|
27
|
+
Object.defineProperty(exports, "createCancelReceipt", { enumerable: true, get: function () { return receipts_js_1.createCancelReceipt; } });
|
|
28
|
+
Object.defineProperty(exports, "zeroReceipt", { enumerable: true, get: function () { return receipts_js_1.zeroReceipt; } });
|
|
29
|
+
Object.defineProperty(exports, "getReceipt", { enumerable: true, get: function () { return receipts_js_1.getReceipt; } });
|
|
30
|
+
Object.defineProperty(exports, "getReceiptWithCompany", { enumerable: true, get: function () { return receipts_js_1.getReceiptWithCompany; } });
|
|
31
|
+
Object.defineProperty(exports, "generateFullReceiptId", { enumerable: true, get: function () { return receipts_js_1.generateFullReceiptId; } });
|
|
32
|
+
Object.defineProperty(exports, "getFirstReceiptDate", { enumerable: true, get: function () { return receipts_js_1.getFirstReceiptDate; } });
|
|
33
|
+
Object.defineProperty(exports, "listMyReceipts", { enumerable: true, get: function () { return receipts_js_1.listMyReceipts; } });
|
|
34
|
+
Object.defineProperty(exports, "checkVoucherCombinationError", { enumerable: true, get: function () { return receipts_js_1.checkVoucherCombinationError; } });
|
|
35
|
+
var cashregisters_js_1 = require("./cashregisters.js");
|
|
36
|
+
Object.defineProperty(exports, "listMyCashregisters", { enumerable: true, get: function () { return cashregisters_js_1.listMyCashregisters; } });
|
|
37
|
+
var reports_js_1 = require("./reports.js");
|
|
38
|
+
Object.defineProperty(exports, "downloadDailyReport", { enumerable: true, get: function () { return reports_js_1.downloadDailyReport; } });
|
|
39
|
+
Object.defineProperty(exports, "downloadMonthlyReport", { enumerable: true, get: function () { return reports_js_1.downloadMonthlyReport; } });
|
|
40
|
+
var status_js_1 = require("./status.js");
|
|
41
|
+
Object.defineProperty(exports, "getCashboxStatus", { enumerable: true, get: function () { return status_js_1.getCashboxStatus; } });
|
|
42
|
+
Object.defineProperty(exports, "getSignatureStatus", { enumerable: true, get: function () { return status_js_1.getSignatureStatus; } });
|
|
43
|
+
var api_js_1 = require("./api.js");
|
|
44
|
+
Object.defineProperty(exports, "createKasseneckApi", { enumerable: true, get: function () { return api_js_1.createKasseneckApi; } });
|