@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,153 @@
|
|
|
1
|
+
import { StripeLinkMode } from '../enums/index.js';
|
|
2
|
+
import { fromStripeUrlSessionPayload, toReceiptItemPayload, receiptItemIsValid, } from '../models/index.js';
|
|
3
|
+
import { KasseneckValidationError } from '../client/errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Stripe-Zahlungslinks — Zwilling der Stripe-Aufrufe in
|
|
6
|
+
* kasseneck_api/lib/kasseneck_api.dart (Zeilen 443-484).
|
|
7
|
+
*
|
|
8
|
+
* Zwei Aufrufe: [createStripeLink] erzeugt eine Checkout-Sitzung samt Kurzlink
|
|
9
|
+
* (`pay.kasseneck.at/…`), den der Gast oeffnet; [stripeCaptureIntent] zieht die
|
|
10
|
+
* zuvor nur reservierte Zahlung eines `authorization`-Links spaeter ein.
|
|
11
|
+
*
|
|
12
|
+
* **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** Keiner der
|
|
13
|
+
* beiden Endpunkte dieser Datei setzt `allowRegisterUser`; beide laufen nur
|
|
14
|
+
* mit `apiKeyAuth`. Ausgefuehrt steht das in payments/index.ts — an einer
|
|
15
|
+
* Stelle statt an dreien.
|
|
16
|
+
*/
|
|
17
|
+
/** Endpunktname aus dem Vorbild — **nicht** `createStripeLink`. */
|
|
18
|
+
const ENDPUNKT_LINK = 'createPaymentLinkStripe';
|
|
19
|
+
const ENDPUNKT_CAPTURE = 'stripeCaptureIntent';
|
|
20
|
+
/**
|
|
21
|
+
* Erzeugt einen Stripe-Zahlungslink fuer [items] (Fernzahlung: Link per
|
|
22
|
+
* Nachricht, QR-Code oder Kurzlink).
|
|
23
|
+
*
|
|
24
|
+
* **Der Endpunkt heisst `createPaymentLinkStripe`**, nicht wie diese Funktion —
|
|
25
|
+
* Methodenname und Endpunktname fallen wie schon beim Monatsbericht
|
|
26
|
+
* auseinander (siehe client/reports.ts).
|
|
27
|
+
*/
|
|
28
|
+
export async function createStripeLink(rufen, options) {
|
|
29
|
+
const { items } = options;
|
|
30
|
+
// Vor dem Senden pruefen: ein Zahlungslink ist zwar folgenlos wiederholbar,
|
|
31
|
+
// eine abgewiesene Anfrage aber eine unnoetige Runde ueber das Netz — und der
|
|
32
|
+
// Backend-Fehlertext nennt den Grund weit weniger genau als diese Pruefung.
|
|
33
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
34
|
+
throw eingabefehler(ENDPUNKT_LINK, 'Positionen sind Pflicht und duerfen nicht leer sein.');
|
|
35
|
+
}
|
|
36
|
+
if (items.some((item) => !receiptItemIsValid(item))) {
|
|
37
|
+
throw eingabefehler(ENDPUNKT_LINK, 'Ungueltige Position uebergeben.');
|
|
38
|
+
}
|
|
39
|
+
const params = {
|
|
40
|
+
items: positionsNutzlast(items),
|
|
41
|
+
createReceiptAfterPayment: options.createReceiptAfterPayment,
|
|
42
|
+
// Im Vorbild `mode.name`; Schluessel und Wert sind hier identisch.
|
|
43
|
+
mode: gepruefterModus(options.mode),
|
|
44
|
+
};
|
|
45
|
+
// Die drei uebrigen Felder stehen im Vorbild unter `if (… != null)` — ohne
|
|
46
|
+
// Angabe geht kein leeres Feld raus.
|
|
47
|
+
if (options.webhookId != null) {
|
|
48
|
+
params['webhookId'] = options.webhookId;
|
|
49
|
+
}
|
|
50
|
+
// **Abweichung vom Vorbild, mit Absicht:** Dart sendet `customerPhone`/
|
|
51
|
+
// `customerEmail` in camelCase. Das Backend nimmt die beiden Felder aber
|
|
52
|
+
// ausschliesslich als `customer_phone`/`customer_email` entgegen (so stehen
|
|
53
|
+
// sie in den optionalParams von `createPaymentLinkStripe`, und nur so werden
|
|
54
|
+
// sie ausgewertet), und unbekannte Parameter weist `checkRequest` nicht ab —
|
|
55
|
+
// sie fallen still unter den Tisch. Wer die camelCase-Namen uebernaehme,
|
|
56
|
+
// gaebe dem Aufrufer zwei Felder, die nachweislich nichts bewirken.
|
|
57
|
+
if (options.customerPhone != null) {
|
|
58
|
+
params['customer_phone'] = options.customerPhone;
|
|
59
|
+
}
|
|
60
|
+
if (options.customerEmail != null) {
|
|
61
|
+
params['customer_email'] = options.customerEmail;
|
|
62
|
+
}
|
|
63
|
+
return sitzungAusNutzlast(await rufen(ENDPUNKT_LINK, params));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Zieht die zuvor nur reservierte Zahlung einer `authorization`-Sitzung ein.
|
|
67
|
+
*
|
|
68
|
+
* **Der Parameter heisst `stripe_sessions_id`** — mit "sessions" im Plural, so
|
|
69
|
+
* das Vorbild und so das Backend. Der naheliegende Singular waere ein fehlender
|
|
70
|
+
* Pflichtparameter.
|
|
71
|
+
*/
|
|
72
|
+
export async function stripeCaptureIntent(rufen, stripeSessionId) {
|
|
73
|
+
if (typeof stripeSessionId !== 'string' || !stripeSessionId.trim()) {
|
|
74
|
+
throw eingabefehler(ENDPUNKT_CAPTURE, 'stripeSessionId fehlt');
|
|
75
|
+
}
|
|
76
|
+
const daten = await rufen(ENDPUNKT_CAPTURE, { stripe_sessions_id: stripeSessionId });
|
|
77
|
+
return einzugAusNutzlast(daten);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Positionen in ihre Nutzlast wandeln und dabei die strenge Schreibpfad-
|
|
81
|
+
* Pruefung des Modells abfangen (unbekannter Steuersatz). Das Modell wirft dort
|
|
82
|
+
* ein nacktes `Error`; aus einem Endpunkt-Aufruf soll nur die Fehler-Union
|
|
83
|
+
* dieses Pakets herauskommen (dasselbe Vorgehen wie in client/receipts.ts).
|
|
84
|
+
*/
|
|
85
|
+
function positionsNutzlast(items) {
|
|
86
|
+
try {
|
|
87
|
+
return items.map(toReceiptItemPayload);
|
|
88
|
+
}
|
|
89
|
+
catch (ursache) {
|
|
90
|
+
throw eingabefehler(ENDPUNKT_LINK, ursache instanceof Error ? ursache.message : 'Ungueltige Nutzlast uebergeben.');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Modus aufloesen. Bleibt streng: der Modus kommt vom Aufrufer, und das Backend
|
|
95
|
+
* kennt genau zwei Werte — ein dritter waere ein Programmierfehler, der sonst
|
|
96
|
+
* still als `payment` durchginge (das Backend setzt `capture_method: 'manual'`
|
|
97
|
+
* nur bei genau 'authorization').
|
|
98
|
+
*/
|
|
99
|
+
function gepruefterModus(wert) {
|
|
100
|
+
if (!Object.prototype.hasOwnProperty.call(StripeLinkMode, wert)) {
|
|
101
|
+
throw eingabefehler(ENDPUNKT_LINK, `Stripe-Link-Modus: unbekannter Wert "${String(wert)}"`);
|
|
102
|
+
}
|
|
103
|
+
return StripeLinkMode[wert];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Zahlungslink-Sitzung aus der Antwort lesen. Alle vier Felder muessen da sein:
|
|
107
|
+
* eine Sitzung ohne `url` ist kein Zahlungslink, und ein unlesbares Ablaufdatum
|
|
108
|
+
* wuerde als `Invalid Date` weiterwandern und erst beim Anzeigen auffallen.
|
|
109
|
+
*/
|
|
110
|
+
function sitzungAusNutzlast(daten) {
|
|
111
|
+
const roh = daten;
|
|
112
|
+
if (roh == null ||
|
|
113
|
+
typeof roh !== 'object' ||
|
|
114
|
+
typeof roh.id !== 'string' ||
|
|
115
|
+
typeof roh.url !== 'string' ||
|
|
116
|
+
typeof roh.shorten_payment_url !== 'string' ||
|
|
117
|
+
typeof roh.expires_at !== 'string') {
|
|
118
|
+
throw antwortfehler(ENDPUNKT_LINK, 'Antwort enthaelt keine Zahlungslink-Sitzung');
|
|
119
|
+
}
|
|
120
|
+
const sitzung = fromStripeUrlSessionPayload(roh);
|
|
121
|
+
if (Number.isNaN(sitzung.expiresAt.getTime())) {
|
|
122
|
+
throw antwortfehler(ENDPUNKT_LINK, 'Antwort enthaelt kein lesbares Ablaufdatum');
|
|
123
|
+
}
|
|
124
|
+
return sitzung;
|
|
125
|
+
}
|
|
126
|
+
/** Ergebnis des Einzugs aus der Antwort lesen (Felder siehe [StripeCaptureResult]). */
|
|
127
|
+
function einzugAusNutzlast(daten) {
|
|
128
|
+
const roh = daten;
|
|
129
|
+
if (roh == null ||
|
|
130
|
+
typeof roh !== 'object' ||
|
|
131
|
+
typeof roh.id !== 'string' ||
|
|
132
|
+
typeof roh.status !== 'string' ||
|
|
133
|
+
typeof roh.amount_received !== 'number' ||
|
|
134
|
+
typeof roh.currency !== 'string') {
|
|
135
|
+
throw antwortfehler(ENDPUNKT_CAPTURE, 'Antwort enthaelt kein eingezogenes Zahlungsversprechen');
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
id: roh.id,
|
|
139
|
+
status: roh.status,
|
|
140
|
+
// Stripe fuehrt Betraege in der kleinsten Waehrungseinheit — hier bereits
|
|
141
|
+
// Cent, es wird also nichts umgerechnet (anders als bei Hobex).
|
|
142
|
+
amountReceivedCents: roh.amount_received,
|
|
143
|
+
currency: roh.currency,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Fehler in der Eingabe des Aufrufers — es geht keine Anfrage raus. */
|
|
147
|
+
function eingabefehler(functionName, grund) {
|
|
148
|
+
return new KasseneckValidationError(functionName, grund, 'request');
|
|
149
|
+
}
|
|
150
|
+
/** Die Antwort meldete Erfolg, trug aber nicht, was der Aufruf zusagt. */
|
|
151
|
+
function antwortfehler(functionName, grund) {
|
|
152
|
+
return new KasseneckValidationError(functionName, grund, 'response');
|
|
153
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESC/POS-Bytefolgen fuer Bondrucker — Zwilling von
|
|
3
|
+
* `kasseneck_api/lib/src/printing/escpos/` (Flutter).
|
|
4
|
+
*
|
|
5
|
+
* Dieses Modul erzeugt **nur Bytes**. Es kennt keinen Transport: kein
|
|
6
|
+
* Bluetooth, kein WLAN, kein USB, keine Verbindung. Wer die Bytes wohin
|
|
7
|
+
* schickt, entscheidet der Aufrufer.
|
|
8
|
+
*
|
|
9
|
+
* Die Steuerbefehle sind wortwoertlich aus `commands.dart`, `generator.dart`
|
|
10
|
+
* und `qrcode.dart` uebernommen. Bei ESC/POS zaehlt jedes Byte: ein
|
|
11
|
+
* "ungefaehr richtiger" Befehl druckt Unsinn oder gar nichts. Reihenfolge und
|
|
12
|
+
* Bytefolge deshalb nicht anpassen, ohne die Erwartungswerte in
|
|
13
|
+
* `test/escpos.test.ts` gegen das Flutter-Vorbild neu abzugleichen.
|
|
14
|
+
*
|
|
15
|
+
* **Zeichenkodierung.** Bondrucker sprechen kein UTF-8, sondern eine
|
|
16
|
+
* Codepage. Dieses Modul kodiert Text wie das Vorbild nach Latin-1 (ein Byte
|
|
17
|
+
* je Zeichen) und meldet dem Drucker dazu die passende Codepage ueber
|
|
18
|
+
* `ESC t n`. Vorgabe ist CP1252: dort stehen alle deutschen Umlaute an
|
|
19
|
+
* denselben Stellen wie in Latin-1, "ä" ist also genau 0xE4 — ein Byte, nicht
|
|
20
|
+
* zwei. Waeren es zwei (UTF-8), verschoeben sich zusaetzlich alle
|
|
21
|
+
* Spaltenbreiten, weil die Spaltenrechnung mit Byte-Laengen arbeitet.
|
|
22
|
+
* CP437 ist ebenfalls waehlbar — manche (Bluetooth-)Drucker ignorieren
|
|
23
|
+
* `ESC t 16` und bleiben in CP437; dann werden die Umlaute auf ihre
|
|
24
|
+
* CP437-Plaetze umkodiert (ä = 0x84, ü = 0x81, ß = 0xE1, ...). Zeichen ohne
|
|
25
|
+
* CP437-Platz werden zu `?` — weiterhin ein Byte je Zeichen.
|
|
26
|
+
*
|
|
27
|
+
* Nicht enthalten (bewusst): Rasterbilder/Logos, Capability-Profile einzelner
|
|
28
|
+
* Druckermodelle, Kassenlade, 1D-Barcodes.
|
|
29
|
+
*/
|
|
30
|
+
/** Papierbreite der Bonrolle. */
|
|
31
|
+
export type PosPaperSize = 'mm58' | 'mm80';
|
|
32
|
+
/** Ausrichtung einer Textzeile bzw. innerhalb einer Spalte. */
|
|
33
|
+
export type PosAlign = 'left' | 'center' | 'right';
|
|
34
|
+
/** Druckerschrift: A ist breiter, B schmaler (mehr Zeichen je Zeile). */
|
|
35
|
+
export type PosFont = 'fontA' | 'fontB';
|
|
36
|
+
/** Voller oder teilweiser Papierschnitt. */
|
|
37
|
+
export type PosCutMode = 'full' | 'partial';
|
|
38
|
+
/** Vom Drucker zu verwendende Codepage. */
|
|
39
|
+
export type PosCodeTable = 'CP437' | 'CP1252';
|
|
40
|
+
/** Zeichenvergroesserung (1 = einfach, 2 = doppelt, ... bis 8). */
|
|
41
|
+
export type PosTextSize = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
|
|
42
|
+
/** Modulgroesse des QR-Codes (Punkte je Modul). */
|
|
43
|
+
export type QrSize = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
|
|
44
|
+
/** Fehlerkorrekturstufe des QR-Codes. */
|
|
45
|
+
export type QrCorrection = 'L' | 'M' | 'Q' | 'H';
|
|
46
|
+
/** Textstil. Fehlende Felder gelten als Vorgabewert (nicht als "unveraendert"). */
|
|
47
|
+
export interface PosStyles {
|
|
48
|
+
bold?: boolean;
|
|
49
|
+
reverse?: boolean;
|
|
50
|
+
underline?: boolean;
|
|
51
|
+
turn90?: boolean;
|
|
52
|
+
align?: PosAlign;
|
|
53
|
+
height?: PosTextSize;
|
|
54
|
+
width?: PosTextSize;
|
|
55
|
+
fontType?: PosFont;
|
|
56
|
+
codeTable?: PosCodeTable;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Eine Spalte einer Zeile. `width` ist ein Zwoelftel-Anteil (1..12), die
|
|
60
|
+
* Breiten aller Spalten einer Zeile muessen zusammen 12 ergeben.
|
|
61
|
+
* Entweder `text` **oder** `textEncoded` angeben, nicht beides.
|
|
62
|
+
*/
|
|
63
|
+
export interface PosColumn {
|
|
64
|
+
text?: string;
|
|
65
|
+
textEncoded?: Uint8Array;
|
|
66
|
+
width: number;
|
|
67
|
+
styles?: PosStyles;
|
|
68
|
+
}
|
|
69
|
+
export interface EscPosOptions {
|
|
70
|
+
/** Papierbreite, Vorgabe `mm58`. */
|
|
71
|
+
paperSize?: PosPaperSize;
|
|
72
|
+
/** Globale Codepage, Vorgabe `CP1252`; `null` laesst die des Druckers stehen. */
|
|
73
|
+
codeTable?: PosCodeTable | null;
|
|
74
|
+
/** Abstand zwischen Spalten in Punkten, Vorgabe 5. */
|
|
75
|
+
spaceBetweenRows?: number;
|
|
76
|
+
}
|
|
77
|
+
export interface EscPosTextOptions {
|
|
78
|
+
styles?: PosStyles;
|
|
79
|
+
/** Zusaetzliche Leerzeilen nach dem Text (der eine Zeilenumbruch kommt immer). */
|
|
80
|
+
linesAfter?: number;
|
|
81
|
+
}
|
|
82
|
+
export interface EscPosHrOptions {
|
|
83
|
+
/** Fuellzeichen, Vorgabe `-`. */
|
|
84
|
+
ch?: string;
|
|
85
|
+
/** Laenge in Zeichen; ohne Angabe die volle Zeilenbreite. */
|
|
86
|
+
len?: number;
|
|
87
|
+
linesAfter?: number;
|
|
88
|
+
}
|
|
89
|
+
export interface EscPosQrOptions {
|
|
90
|
+
align?: PosAlign;
|
|
91
|
+
size?: QrSize;
|
|
92
|
+
correction?: QrCorrection;
|
|
93
|
+
}
|
|
94
|
+
/** Interner Stilzustand — immer vollstaendig, nie teilbefuellt. */
|
|
95
|
+
interface AktuelleStile {
|
|
96
|
+
bold: boolean;
|
|
97
|
+
reverse: boolean;
|
|
98
|
+
underline: boolean;
|
|
99
|
+
turn90: boolean;
|
|
100
|
+
align: PosAlign;
|
|
101
|
+
height: PosTextSize;
|
|
102
|
+
width: PosTextSize;
|
|
103
|
+
fontType: PosFont | null;
|
|
104
|
+
codeTable: PosCodeTable | null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Aufbauender Puffer. Die Felder ausser `paperSize`/`spaceBetweenRows` sind
|
|
108
|
+
* interner Zustand des Bytestroms — nicht von aussen aendern, sondern ueber
|
|
109
|
+
* die `escPos*`-Funktionen.
|
|
110
|
+
*/
|
|
111
|
+
export interface EscPosDocument {
|
|
112
|
+
readonly paperSize: PosPaperSize;
|
|
113
|
+
readonly spaceBetweenRows: number;
|
|
114
|
+
/** intern: bisher erzeugte Bytes */
|
|
115
|
+
readonly bytes: number[];
|
|
116
|
+
/** intern: global gesetzte Codepage (ueberlebt `escPosReset`) */
|
|
117
|
+
globalCodeTable: PosCodeTable | null;
|
|
118
|
+
/** intern: global gesetzte Schrift (ueberlebt `escPosReset`) */
|
|
119
|
+
globalFont: PosFont | null;
|
|
120
|
+
/** intern: Zeichen je Zeile aus der globalen Schrift */
|
|
121
|
+
maxCharsPerLine: number | null;
|
|
122
|
+
/** intern: zuletzt an den Drucker gesendeter Stil */
|
|
123
|
+
styles: AktuelleStile;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Kodiert Text so, wie ihn der Drucker erwartet: ein Byte je Zeichen nach
|
|
127
|
+
* Latin-1, vorher die vier Zeichenersetzungen des Vorbilds. Ein Umlaut wird
|
|
128
|
+
* damit zu genau einem Byte — Voraussetzung dafuer, dass die Spaltenrechnung
|
|
129
|
+
* stimmt.
|
|
130
|
+
*/
|
|
131
|
+
export declare function encodeEscPosText(text: string, codeTable?: PosCodeTable): Uint8Array;
|
|
132
|
+
/** Zeichen je Zeile fuer Papier und Schrift (`fontA`, wenn nichts gesetzt ist). */
|
|
133
|
+
export declare function escPosMaxCharsPerLine(paperSize: PosPaperSize, font?: PosFont | null): number;
|
|
134
|
+
/** Legt einen leeren Bytepuffer an. Der erste Befehl ist ueblicherweise `escPosReset`. */
|
|
135
|
+
export declare function createEscPosDocument(options?: EscPosOptions): EscPosDocument;
|
|
136
|
+
/** Die bisher erzeugten Bytes als Kopie. */
|
|
137
|
+
export declare function escPosBytes(doc: EscPosDocument): Uint8Array;
|
|
138
|
+
/**
|
|
139
|
+
* `ESC @`: Drucker initialisieren und den gemerkten Stil verwerfen. Danach
|
|
140
|
+
* werden globale Codepage und Schrift erneut gesendet — der Drucker vergisst
|
|
141
|
+
* sie beim Initialisieren.
|
|
142
|
+
*/
|
|
143
|
+
export declare function escPosReset(doc: EscPosDocument): void;
|
|
144
|
+
/**
|
|
145
|
+
* `ESC t n`: Codepage waehlen. Sie gilt bis zum naechsten `escPosReset` und
|
|
146
|
+
* wird von diesem erneut gesendet. `null` schaltet die Vorgabe ab; dann
|
|
147
|
+
* bleibt die Codepage des Druckers stehen und Umlaute werden unlesbar.
|
|
148
|
+
*/
|
|
149
|
+
export declare function escPosSetGlobalCodeTable(doc: EscPosDocument, codeTable: PosCodeTable | null): void;
|
|
150
|
+
/**
|
|
151
|
+
* `ESC M n`: Schrift waehlen. Die Schrift bestimmt auch, wie viele Zeichen in
|
|
152
|
+
* eine Zeile passen (32/42 bei 58 mm, 48/64 bei 80 mm).
|
|
153
|
+
*/
|
|
154
|
+
export declare function escPosSetGlobalFont(doc: EscPosDocument, font: PosFont | null, options?: {
|
|
155
|
+
maxCharsPerLine?: number;
|
|
156
|
+
}): void;
|
|
157
|
+
/**
|
|
158
|
+
* Sendet die Stilbefehle, die sich gegenueber dem zuletzt gesendeten Stand
|
|
159
|
+
* geaendert haben. Fehlende Felder in [styles] gelten als Vorgabe: wer fett
|
|
160
|
+
* weglaesst, schaltet fett also ab.
|
|
161
|
+
*/
|
|
162
|
+
export declare function escPosSetStyles(doc: EscPosDocument, styles?: PosStyles): void;
|
|
163
|
+
/**
|
|
164
|
+
* Interner Textdruck: absolute Position setzen (`ESC $`), Stil senden, Bytes
|
|
165
|
+
* ausgeben. [colInd]/[colWidth] beschreiben die Spalte im Zwoelftel-Raster.
|
|
166
|
+
*/
|
|
167
|
+
/**
|
|
168
|
+
* Wortweiser Umbruch von (kodierten) Text-Bytes auf hoechstens `max` Zeichen
|
|
169
|
+
* je Zeile: geschnitten wird am letzten Leerzeichen innerhalb der Grenze
|
|
170
|
+
* (das Leerzeichen selbst faellt weg); gibt es keines, hart bei `max` --
|
|
171
|
+
* sonst kaeme die Zeile nie voran. Ein Bondrucker bricht sonst hart mitten
|
|
172
|
+
* im Wort ("Kleinunter|nehmer", "0,7|9"); das soll nie aufs Papier.
|
|
173
|
+
*/
|
|
174
|
+
export declare function escPosWortzeilen(textBytes: Uint8Array, max: number): Uint8Array[];
|
|
175
|
+
/**
|
|
176
|
+
* Dieselbe Regel fuer Zeichenketten -- fuer Bildschirm-Vorschauen, die das
|
|
177
|
+
* Papier nachstellen, und fuer das Zeichenraster. Zusaetzlich:
|
|
178
|
+
* - geschuetztes Leerzeichen (U+00A0) ist kein Umbruchpunkt ("je 0,79" bleibt
|
|
179
|
+
* zusammen) und wird als normales Leerzeichen ausgegeben;
|
|
180
|
+
* - ein ueberlanges Wort bricht nach einem Bindestrich, wenn es einen hat
|
|
181
|
+
* ("Bio-" / "Dinkelvollkornsemmel"), sonst hart.
|
|
182
|
+
*/
|
|
183
|
+
export declare function wortzeilenText(text: string, max: number): string[];
|
|
184
|
+
/**
|
|
185
|
+
* Druckt Text und schliesst die Zeile ab. Nach dem Text folgt immer genau ein
|
|
186
|
+
* Zeilenumbruch, `linesAfter` haengt weitere an.
|
|
187
|
+
*/
|
|
188
|
+
export declare function escPosText(doc: EscPosDocument, text: string, options?: EscPosTextOptions): void;
|
|
189
|
+
/** [n] Zeilenumbrueche (0x0A) — nicht der Vorschubbefehl, sondern echte Umbrueche. */
|
|
190
|
+
export declare function escPosEmptyLines(doc: EscPosDocument, n: number): void;
|
|
191
|
+
/** `ESC d n`: Papier um [n] Zeilen vorschieben. */
|
|
192
|
+
export declare function escPosFeed(doc: EscPosDocument, n: number): void;
|
|
193
|
+
/**
|
|
194
|
+
* Papierschnitt: fuenf Leerzeilen (damit der Text ueber der Schneide steht)
|
|
195
|
+
* und danach `GS V 0` bzw. `GS V 1`.
|
|
196
|
+
*/
|
|
197
|
+
export declare function escPosCut(doc: EscPosDocument, mode?: PosCutMode): void;
|
|
198
|
+
/** Trennlinie ueber die volle Zeilenbreite (oder [len] Zeichen). */
|
|
199
|
+
export declare function escPosHr(doc: EscPosDocument, options?: EscPosHrOptions): void;
|
|
200
|
+
/**
|
|
201
|
+
* Druckt eine Zeile aus bis zu zwoelf Spalten. Die Breiten (Zwoelftel) muessen
|
|
202
|
+
* zusammen 12 ergeben. Passt der Inhalt einer Spalte nicht, laeuft der Rest in
|
|
203
|
+
* eine Folgezeile.
|
|
204
|
+
*/
|
|
205
|
+
export declare function escPosRow(doc: EscPosDocument, columns: readonly PosColumn[]): void;
|
|
206
|
+
/**
|
|
207
|
+
* Bytes des nativen QR-Befehls (`GS ( k`, Funktionen 167/169/180/182/181) —
|
|
208
|
+
* ohne Ausrichtung, ohne Zeilenumbruch. Der Drucker zeichnet den Code selbst;
|
|
209
|
+
* es wird kein Bild uebertragen.
|
|
210
|
+
*
|
|
211
|
+
* Bei Kasseneck-Belegen steht hier der maschinenlesbare RKSV-Code.
|
|
212
|
+
*/
|
|
213
|
+
export declare function qrCodeBytes(text: string, options?: {
|
|
214
|
+
size?: QrSize;
|
|
215
|
+
correction?: QrCorrection;
|
|
216
|
+
}): Uint8Array;
|
|
217
|
+
/** Setzt die Ausrichtung und haengt den nativen QR-Befehl an. */
|
|
218
|
+
export declare function escPosQrCode(doc: EscPosDocument, text: string, options?: EscPosQrOptions): void;
|
|
219
|
+
export {};
|