@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,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hobexPay = hobexPay;
|
|
4
|
+
exports.hobexRefund = hobexRefund;
|
|
5
|
+
exports.newHobexTransactionId = newHobexTransactionId;
|
|
6
|
+
const index_js_1 = require("../models/index.js");
|
|
7
|
+
const errors_js_1 = require("../client/errors.js");
|
|
8
|
+
const vienna_time_js_1 = require("../vienna-time.js");
|
|
9
|
+
const money_js_1 = require("../money.js");
|
|
10
|
+
/**
|
|
11
|
+
* Hobex-Kartenzahlung ueber die **Cloud-API** — Zwilling der Hobex-Aufrufe in
|
|
12
|
+
* kasseneck_api/lib/kasseneck_api.dart (Zeilen 491-526).
|
|
13
|
+
*
|
|
14
|
+
* Der Ablauf hat zwei Schritte: eine Kennung erzeugen ([newHobexTransactionId])
|
|
15
|
+
* und damit belasten ([hobexPay]). Die Kennung ist der Faden, an dem das
|
|
16
|
+
* Backend eine haengende Zahlung wiederfindet (`getHobexStatusWithTimeout`,
|
|
17
|
+
* functions/payment-endpoints.js) — sie ist deshalb kein Schmuck, sondern die
|
|
18
|
+
* Absicherung gegen eine doppelte Belastung.
|
|
19
|
+
*
|
|
20
|
+
* **Nur der Cloud-Weg ist hier drin, und das bleibt so.** Hobex **HPS** ist ein
|
|
21
|
+
* physisches Terminal, mit dem die Kasse **lokal ueber TCP** spricht; **myPOS**
|
|
22
|
+
* und **SumUp** sind **Android-SDKs**. Ein Browser hat weder rohe TCP-Sockets
|
|
23
|
+
* noch eine Android-Laufzeit — das ist keine fehlende Umsetzung und kein
|
|
24
|
+
* Buendler-Problem, sondern eine Grenze der Umgebung. Wer diese drei Wege
|
|
25
|
+
* braucht, braucht die Flutter-App, nicht dieses Paket.
|
|
26
|
+
*
|
|
27
|
+
* **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** Keiner der
|
|
28
|
+
* beiden Endpunkte dieser Datei setzt `allowRegisterUser`; beide laufen nur
|
|
29
|
+
* mit `apiKeyAuth`. Ausgefuehrt steht das in payments/index.ts — an einer
|
|
30
|
+
* Stelle statt an dreien.
|
|
31
|
+
*/
|
|
32
|
+
/** Endpunktnamen aus dem Vorbild — beide mit Suffix `Api`. */
|
|
33
|
+
const ENDPUNKT_PAY = 'hobexPayApi';
|
|
34
|
+
const ENDPUNKT_REFUND = 'hobexRefundApi';
|
|
35
|
+
/**
|
|
36
|
+
* Belastet eine Karte ueber die **Hobex-Cloud-API** und liefert den
|
|
37
|
+
* entstandenen [HobexReceipt].
|
|
38
|
+
*
|
|
39
|
+
* **Der Endpunkt heisst `hobexPayApi`** — mit Suffix; ohne ihn gibt es ihn
|
|
40
|
+
* nicht.
|
|
41
|
+
*/
|
|
42
|
+
async function hobexPay(rufen, options) {
|
|
43
|
+
const params = zahlungsNutzlast(ENDPUNKT_PAY, options);
|
|
44
|
+
// `reference` steht im Vorbild **unbedingt** in der Nutzlast: ohne Angabe
|
|
45
|
+
// geht sie als null raus, nicht gar nicht. Der Transport wirft nur
|
|
46
|
+
// `undefined` weg, `null` bleibt erhalten — genau diese Unterscheidung.
|
|
47
|
+
params['reference'] = options.reference ?? null;
|
|
48
|
+
return belegAusNutzlast(await rufen(ENDPUNKT_PAY, params));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Erstattet eine zuvor ueber die Hobex-Cloud getaetigte Zahlung. Das Backend
|
|
52
|
+
* storniert zuerst (Void, solange der Tagesabschluss aussteht) und erstattet
|
|
53
|
+
* erst danach.
|
|
54
|
+
*
|
|
55
|
+
* **Ohne Rueckgabewert, mit Absicht.** Das Vorbild liefert
|
|
56
|
+
* `resJson['status'] == 'success'`; in diesem Paket wirft die Fehlerhuelle
|
|
57
|
+
* schon im Transport, sobald der Status nicht ausdruecklich Erfolg ist. Ein
|
|
58
|
+
* Wahrheitswert waere hier also immer `true` — eine Luege ueber den
|
|
59
|
+
* Informationsgehalt, an der ein Aufrufer ein `if` aufhaengt, das nie greift.
|
|
60
|
+
* Misserfolg kommt als geworfener Fehler.
|
|
61
|
+
*
|
|
62
|
+
* **Der Endpunkt heisst `hobexRefundApi`** — mit Suffix.
|
|
63
|
+
*/
|
|
64
|
+
async function hobexRefund(rufen, options) {
|
|
65
|
+
// Anders als die Zahlung sendet der Refund im Vorbild **keine** reference.
|
|
66
|
+
await rufen(ENDPUNKT_REFUND, zahlungsNutzlast(ENDPUNKT_REFUND, options));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Erzeugt eine neue Hobex-Transaktionskennung: 19 Ziffern aus Zeitanteil und
|
|
70
|
+
* Zufall (Zwilling von `newHobexTransactionId` im Vorbild, Zeile 522).
|
|
71
|
+
*
|
|
72
|
+
* Zwei bewusste Abweichungen:
|
|
73
|
+
*
|
|
74
|
+
* 1. **Wiener Wanduhrzeit statt Geraetezeit.** Das Vorbild nimmt
|
|
75
|
+
* `DateTime.now()` in der Zeitzone des Geraets; damit haetten zwei Kassen
|
|
76
|
+
* desselben Betriebs in verschiedenen Zeitzonen Kennungen, die sich um
|
|
77
|
+
* Stunden unterscheiden, und der Tageswechsel in der Kennung faende nicht
|
|
78
|
+
* zum Geschaeftstag statt. Fachlich ist Wien die Zeitzone (siehe
|
|
79
|
+
* vienna-time.ts) — und eine Browser-Kasse laeuft in der Zeitzone des Gasts,
|
|
80
|
+
* nicht des Betriebs.
|
|
81
|
+
* 2. **Millisekunden statt Mikrosekunden.** JavaScript hat keine
|
|
82
|
+
* Mikrosekunden-Uhr. Das Vorbild fuellt mit sechs Bruchteilsstellen auf und
|
|
83
|
+
* haengt zwei Zufallsziffern an, von denen die Laengenbegrenzung eine wieder
|
|
84
|
+
* abschneidet; hier stehen drei Bruchteilsstellen und vier Zufallsziffern.
|
|
85
|
+
* Laenge und Form (nur Ziffern, 19 Stellen, `JJMMTThhmmss` voran) bleiben
|
|
86
|
+
* gleich.
|
|
87
|
+
*
|
|
88
|
+
* Zeit- und Zufallsquelle sind einspeisbar, damit die Kennung pruefbar ist.
|
|
89
|
+
*/
|
|
90
|
+
function newHobexTransactionId(options = {}) {
|
|
91
|
+
const wand = (0, vienna_time_js_1.toViennaWallClock)(options.now ?? new Date());
|
|
92
|
+
const zufall = options.random ?? Math.random;
|
|
93
|
+
const zeitanteil = zweistellig(wand.year % 100) +
|
|
94
|
+
zweistellig(wand.month) +
|
|
95
|
+
zweistellig(wand.day) +
|
|
96
|
+
zweistellig(wand.hour) +
|
|
97
|
+
zweistellig(wand.minute) +
|
|
98
|
+
zweistellig(wand.second) +
|
|
99
|
+
String(wand.millisecond).padStart(3, '0');
|
|
100
|
+
// Vier Ziffern, immer vierstellig: eine kuerzere Zahl wuerde die Kennung
|
|
101
|
+
// verkuerzen und damit ihre Form verlassen. Der Wert wird auf [0, 1)
|
|
102
|
+
// begrenzt — eine fremde Zufallsquelle koennte 1 liefern.
|
|
103
|
+
const zufallsanteil = String(Math.floor(begrenzt(zufall()) * 10_000)).padStart(4, '0');
|
|
104
|
+
return zeitanteil + zufallsanteil;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Gemeinsame Nutzlast beider Hobex-Aufrufe: Kennung und die beiden Betraege in
|
|
108
|
+
* Euro. Prueft, bevor irgendetwas rausgeht — hier bewegt sich Geld auf einer
|
|
109
|
+
* fremden Karte, und ein NaN-Betrag oder eine leere Kennung ist an einem
|
|
110
|
+
* Zahlungsterminal nichts, was man dem Backend zum Ausprobieren schickt.
|
|
111
|
+
*/
|
|
112
|
+
function zahlungsNutzlast(functionName, options) {
|
|
113
|
+
if (typeof options.transactionId !== 'string' || !options.transactionId.trim()) {
|
|
114
|
+
throw eingabefehler(functionName, 'transactionId fehlt');
|
|
115
|
+
}
|
|
116
|
+
const amountCents = gepruefterBetrag(functionName, options.amountCents, 'amountCents', 1);
|
|
117
|
+
const tipCents = gepruefterBetrag(functionName, options.tipCents ?? 0, 'tipCents', 0);
|
|
118
|
+
return {
|
|
119
|
+
transactionId: options.transactionId,
|
|
120
|
+
// Euro-Umrechnung genau hier, an der Hobex-Grenze.
|
|
121
|
+
amount: (0, money_js_1.centsToEuro)(amountCents),
|
|
122
|
+
tip: (0, money_js_1.centsToEuro)(tipCents),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Ganzzahliger Cent-Betrag ab [mindestens]. `Number.isInteger` faengt NaN,
|
|
127
|
+
* Unendlich und Bruchteils-Cent in einem — ein halber Cent ergibt bei der
|
|
128
|
+
* Euro-Umrechnung eine dritte Nachkommastelle, die Hobex nicht kennt.
|
|
129
|
+
*/
|
|
130
|
+
function gepruefterBetrag(functionName, cents, feld, mindestens) {
|
|
131
|
+
if (!Number.isInteger(cents)) {
|
|
132
|
+
throw eingabefehler(functionName, `${feld} muss eine ganze Zahl in Cent sein.`);
|
|
133
|
+
}
|
|
134
|
+
if (cents < mindestens) {
|
|
135
|
+
throw eingabefehler(functionName, `${feld} muss mindestens ${mindestens} Cent betragen.`);
|
|
136
|
+
}
|
|
137
|
+
return cents;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Hobex-Beleg aus der Antwort lesen. Geprueft werden die beiden Felder, ohne
|
|
141
|
+
* die der Beleg nichts wert ist: die Kennung der Zahlung und der Zeitstempel
|
|
142
|
+
* (an ihm scheitert die Lesart des Modells sonst mit einem nackten TypeError,
|
|
143
|
+
* weil sie ihn zerlegt). Die uebrigen Felder bleiben so tolerant wie im
|
|
144
|
+
* Vorbild — ein Beleg, dem Hobex den Kartenaussteller schuldig bleibt, ist
|
|
145
|
+
* trotzdem eine erfolgte Zahlung.
|
|
146
|
+
*/
|
|
147
|
+
function belegAusNutzlast(daten) {
|
|
148
|
+
const roh = daten;
|
|
149
|
+
if (roh == null ||
|
|
150
|
+
typeof roh !== 'object' ||
|
|
151
|
+
typeof roh.transactionId !== 'string' ||
|
|
152
|
+
typeof roh.transactionDate !== 'string') {
|
|
153
|
+
throw antwortfehler(ENDPUNKT_PAY, 'Antwort enthaelt keinen Hobex-Beleg');
|
|
154
|
+
}
|
|
155
|
+
return (0, index_js_1.fromHobexReceiptPayload)(roh);
|
|
156
|
+
}
|
|
157
|
+
const zweistellig = (wert) => String(wert).padStart(2, '0');
|
|
158
|
+
/** Auf `[0, 1)` begrenzen — eine fremde Zufallsquelle haelt sich nicht daran. */
|
|
159
|
+
const begrenzt = (wert) => (Number.isFinite(wert) ? Math.min(Math.max(wert, 0), 0.999_999_9) : 0);
|
|
160
|
+
/** Fehler in der Eingabe des Aufrufers — es geht keine Anfrage raus. */
|
|
161
|
+
function eingabefehler(functionName, grund) {
|
|
162
|
+
return new errors_js_1.KasseneckValidationError(functionName, grund, 'request');
|
|
163
|
+
}
|
|
164
|
+
/** Die Antwort meldete Erfolg, trug aber nicht, was der Aufruf zusagt. */
|
|
165
|
+
function antwortfehler(functionName, grund) {
|
|
166
|
+
return new errors_js_1.KasseneckValidationError(functionName, grund, 'response');
|
|
167
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unterpfad `@kreiseck/kasseneck-api/payments` — die Zahlungswege, die ein
|
|
3
|
+
* Browser oder ein Node-Prozess wirklich gehen kann: **Stripe-Zahlungslinks**
|
|
4
|
+
* (Fernzahlung per Link/QR-Code) und die **Hobex-Cloud-API** (Kartenzahlung
|
|
5
|
+
* ueber ein bei Hobex registriertes Terminal, gesteuert ueber das Netz).
|
|
6
|
+
*
|
|
7
|
+
* **Was hier bewusst fehlt — und warum es auch nicht nachgeruestet wird:**
|
|
8
|
+
*
|
|
9
|
+
* - **Hobex HPS** spricht **lokal ueber TCP** mit einem angeschlossenen
|
|
10
|
+
* Terminal (roher Socket auf eine Geraete-IP im selben Netz).
|
|
11
|
+
* - **myPOS** und **SumUp** sind **Android-SDKs**; sie laufen als
|
|
12
|
+
* Bibliothek in einer Android-App und reden ueber Bluetooth bzw. das
|
|
13
|
+
* Hersteller-Geraet mit dem Terminal.
|
|
14
|
+
*
|
|
15
|
+
* Ein Browser hat weder rohe TCP-Sockets noch eine Android-Laufzeit. Das ist
|
|
16
|
+
* keine Luecke in diesem Paket und auch nichts, was ein anderer Buendler,
|
|
17
|
+
* ein Polyfill oder eine WebAssembly-Schicht aufloest — es ist eine Grenze der
|
|
18
|
+
* Umgebung. Diese drei Wege gibt es im Flutter-Paket `kasseneck_api`, und dort
|
|
19
|
+
* bleiben sie.
|
|
20
|
+
*
|
|
21
|
+
* **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** **Keiner** der
|
|
22
|
+
* vier Zahlungs-Endpunkte setzt `allowRegisterUser`; sie laufen alle ueber
|
|
23
|
+
* `checkRequest(req, 'user', …)` und damit nur mit `apiKeyAuth`. Dieses Paket
|
|
24
|
+
* bildet das **nicht** nach — wer darf, entscheidet allein das Backend. Der
|
|
25
|
+
* Hinweis steht **hier** und gilt fuer beide Dateien dieses Unterpfads.
|
|
26
|
+
*
|
|
27
|
+
* Welche **anderen** Endpunkte den Weg offen haben, steht bewusst nirgends in
|
|
28
|
+
* diesem Paket: eine abgeschriebene Liste veraltet still, und sie hat hier
|
|
29
|
+
* nichts zu entscheiden.
|
|
30
|
+
*/
|
|
31
|
+
export { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
|
|
32
|
+
export { type CreateStripeLinkOptions, type StripeCaptureResult, createStripeLink, stripeCaptureIntent, } from './stripe.js';
|
|
33
|
+
export { type HobexPayOptions, type HobexRefundOptions, type HobexTransactionIdOptions, hobexPay, hobexRefund, newHobexTransactionId, } from './hobex.js';
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unterpfad `@kreiseck/kasseneck-api/payments` — die Zahlungswege, die ein
|
|
4
|
+
* Browser oder ein Node-Prozess wirklich gehen kann: **Stripe-Zahlungslinks**
|
|
5
|
+
* (Fernzahlung per Link/QR-Code) und die **Hobex-Cloud-API** (Kartenzahlung
|
|
6
|
+
* ueber ein bei Hobex registriertes Terminal, gesteuert ueber das Netz).
|
|
7
|
+
*
|
|
8
|
+
* **Was hier bewusst fehlt — und warum es auch nicht nachgeruestet wird:**
|
|
9
|
+
*
|
|
10
|
+
* - **Hobex HPS** spricht **lokal ueber TCP** mit einem angeschlossenen
|
|
11
|
+
* Terminal (roher Socket auf eine Geraete-IP im selben Netz).
|
|
12
|
+
* - **myPOS** und **SumUp** sind **Android-SDKs**; sie laufen als
|
|
13
|
+
* Bibliothek in einer Android-App und reden ueber Bluetooth bzw. das
|
|
14
|
+
* Hersteller-Geraet mit dem Terminal.
|
|
15
|
+
*
|
|
16
|
+
* Ein Browser hat weder rohe TCP-Sockets noch eine Android-Laufzeit. Das ist
|
|
17
|
+
* keine Luecke in diesem Paket und auch nichts, was ein anderer Buendler,
|
|
18
|
+
* ein Polyfill oder eine WebAssembly-Schicht aufloest — es ist eine Grenze der
|
|
19
|
+
* Umgebung. Diese drei Wege gibt es im Flutter-Paket `kasseneck_api`, und dort
|
|
20
|
+
* bleiben sie.
|
|
21
|
+
*
|
|
22
|
+
* **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** **Keiner** der
|
|
23
|
+
* vier Zahlungs-Endpunkte setzt `allowRegisterUser`; sie laufen alle ueber
|
|
24
|
+
* `checkRequest(req, 'user', …)` und damit nur mit `apiKeyAuth`. Dieses Paket
|
|
25
|
+
* bildet das **nicht** nach — wer darf, entscheidet allein das Backend. Der
|
|
26
|
+
* Hinweis steht **hier** und gilt fuer beide Dateien dieses Unterpfads.
|
|
27
|
+
*
|
|
28
|
+
* Welche **anderen** Endpunkte den Weg offen haben, steht bewusst nirgends in
|
|
29
|
+
* diesem Paket: eine abgeschriebene Liste veraltet still, und sie hat hier
|
|
30
|
+
* nichts zu entscheiden.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.newHobexTransactionId = exports.hobexRefund = exports.hobexPay = exports.stripeCaptureIntent = exports.createStripeLink = exports.StripeLinkMode = void 0;
|
|
34
|
+
var index_js_1 = require("../enums/index.js");
|
|
35
|
+
Object.defineProperty(exports, "StripeLinkMode", { enumerable: true, get: function () { return index_js_1.StripeLinkMode; } });
|
|
36
|
+
var stripe_js_1 = require("./stripe.js");
|
|
37
|
+
Object.defineProperty(exports, "createStripeLink", { enumerable: true, get: function () { return stripe_js_1.createStripeLink; } });
|
|
38
|
+
Object.defineProperty(exports, "stripeCaptureIntent", { enumerable: true, get: function () { return stripe_js_1.stripeCaptureIntent; } });
|
|
39
|
+
var hobex_js_1 = require("./hobex.js");
|
|
40
|
+
Object.defineProperty(exports, "hobexPay", { enumerable: true, get: function () { return hobex_js_1.hobexPay; } });
|
|
41
|
+
Object.defineProperty(exports, "hobexRefund", { enumerable: true, get: function () { return hobex_js_1.hobexRefund; } });
|
|
42
|
+
Object.defineProperty(exports, "newHobexTransactionId", { enumerable: true, get: function () { return hobex_js_1.newHobexTransactionId; } });
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
|
|
2
|
+
import { type ReceiptItem, type StripeUrlSession } from '../models/index.js';
|
|
3
|
+
import type { KasseneckTransport } from '../client/transport.js';
|
|
4
|
+
export interface CreateStripeLinkOptions {
|
|
5
|
+
/** Positionen des Zahlungslinks; mindestens eine, alle gueltig. */
|
|
6
|
+
items: ReceiptItem[];
|
|
7
|
+
/** Soll das Backend nach bezahltem Link selbsttaetig einen Beleg erzeugen? */
|
|
8
|
+
createReceiptAfterPayment: boolean;
|
|
9
|
+
/** Sofort einziehen (`payment`) oder nur reservieren (`authorization`). */
|
|
10
|
+
mode: StripeLinkMode | StripeLinkModeKey;
|
|
11
|
+
/** Eigener Bezeichner fuer den Zahlungs-Webhook des Aufrufers. */
|
|
12
|
+
webhookId?: string;
|
|
13
|
+
/** Telefonnummer des Gasts (landet in den Stripe-Metadaten). */
|
|
14
|
+
customerPhone?: string;
|
|
15
|
+
/** E-Mail des Gasts (Stripe schickt die Zahlungsbestaetigung dorthin). */
|
|
16
|
+
customerEmail?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Ergebnis von [stripeCaptureIntent] — das eingezogene Zahlungsversprechen
|
|
20
|
+
* (Stripe PaymentIntent), **nicht** noch einmal die Zahlungslink-Sitzung.
|
|
21
|
+
*
|
|
22
|
+
* Das ist eine bewusste Abweichung vom Dart-Vorbild: dort steht
|
|
23
|
+
* `StripeUrlSession.fromJson(resJson['data'])`, das Backend antwortet an dieser
|
|
24
|
+
* Stelle aber mit `{id, status, amount_received, currency}` (successResponse in
|
|
25
|
+
* functions/payment-endpoints.js). Weder `url` noch `shorten_payment_url` noch
|
|
26
|
+
* `expires_at` sind darin — die Sitzungs-Lesart kann hier gar nicht gelingen.
|
|
27
|
+
*/
|
|
28
|
+
export interface StripeCaptureResult {
|
|
29
|
+
/** Bezeichner des PaymentIntent (`pi_…`), nicht der der Sitzung (`cs_…`). */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Stripe-Status des Einzugs, z. B. `succeeded`. */
|
|
32
|
+
status: string;
|
|
33
|
+
/**
|
|
34
|
+
* Tatsaechlich eingezogener Betrag in Cent. Stripe fuehrt Betraege in der
|
|
35
|
+
* kleinsten Waehrungseinheit; der Name unterstellt damit eine
|
|
36
|
+
* zweistellige Waehrung. Fuer diese Anlage stimmt das — das Backend legt
|
|
37
|
+
* `currency: 'eur'` fest (functions/payment-endpoints.js). Bei einer
|
|
38
|
+
* nullstelligen Waehrung (JPY) waere „Cent" der falsche Name; dann gehoert
|
|
39
|
+
* die Einheit aus `currency` abgeleitet und nicht in den Feldnamen.
|
|
40
|
+
*/
|
|
41
|
+
amountReceivedCents: number;
|
|
42
|
+
/** Waehrungscode, wie Stripe ihn fuehrt (klein geschrieben, z. B. `eur`). */
|
|
43
|
+
currency: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Erzeugt einen Stripe-Zahlungslink fuer [items] (Fernzahlung: Link per
|
|
47
|
+
* Nachricht, QR-Code oder Kurzlink).
|
|
48
|
+
*
|
|
49
|
+
* **Der Endpunkt heisst `createPaymentLinkStripe`**, nicht wie diese Funktion —
|
|
50
|
+
* Methodenname und Endpunktname fallen wie schon beim Monatsbericht
|
|
51
|
+
* auseinander (siehe client/reports.ts).
|
|
52
|
+
*/
|
|
53
|
+
export declare function createStripeLink(rufen: KasseneckTransport, options: CreateStripeLinkOptions): Promise<StripeUrlSession>;
|
|
54
|
+
/**
|
|
55
|
+
* Zieht die zuvor nur reservierte Zahlung einer `authorization`-Sitzung ein.
|
|
56
|
+
*
|
|
57
|
+
* **Der Parameter heisst `stripe_sessions_id`** — mit "sessions" im Plural, so
|
|
58
|
+
* das Vorbild und so das Backend. Der naheliegende Singular waere ein fehlender
|
|
59
|
+
* Pflichtparameter.
|
|
60
|
+
*/
|
|
61
|
+
export declare function stripeCaptureIntent(rufen: KasseneckTransport, stripeSessionId: string): Promise<StripeCaptureResult>;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createStripeLink = createStripeLink;
|
|
4
|
+
exports.stripeCaptureIntent = stripeCaptureIntent;
|
|
5
|
+
const index_js_1 = require("../enums/index.js");
|
|
6
|
+
const index_js_2 = require("../models/index.js");
|
|
7
|
+
const errors_js_1 = require("../client/errors.js");
|
|
8
|
+
/**
|
|
9
|
+
* Stripe-Zahlungslinks — Zwilling der Stripe-Aufrufe in
|
|
10
|
+
* kasseneck_api/lib/kasseneck_api.dart (Zeilen 443-484).
|
|
11
|
+
*
|
|
12
|
+
* Zwei Aufrufe: [createStripeLink] erzeugt eine Checkout-Sitzung samt Kurzlink
|
|
13
|
+
* (`pay.kasseneck.at/…`), den der Gast oeffnet; [stripeCaptureIntent] zieht die
|
|
14
|
+
* zuvor nur reservierte Zahlung eines `authorization`-Links spaeter ein.
|
|
15
|
+
*
|
|
16
|
+
* **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** Keiner der
|
|
17
|
+
* beiden Endpunkte dieser Datei setzt `allowRegisterUser`; beide laufen nur
|
|
18
|
+
* mit `apiKeyAuth`. Ausgefuehrt steht das in payments/index.ts — an einer
|
|
19
|
+
* Stelle statt an dreien.
|
|
20
|
+
*/
|
|
21
|
+
/** Endpunktname aus dem Vorbild — **nicht** `createStripeLink`. */
|
|
22
|
+
const ENDPUNKT_LINK = 'createPaymentLinkStripe';
|
|
23
|
+
const ENDPUNKT_CAPTURE = 'stripeCaptureIntent';
|
|
24
|
+
/**
|
|
25
|
+
* Erzeugt einen Stripe-Zahlungslink fuer [items] (Fernzahlung: Link per
|
|
26
|
+
* Nachricht, QR-Code oder Kurzlink).
|
|
27
|
+
*
|
|
28
|
+
* **Der Endpunkt heisst `createPaymentLinkStripe`**, nicht wie diese Funktion —
|
|
29
|
+
* Methodenname und Endpunktname fallen wie schon beim Monatsbericht
|
|
30
|
+
* auseinander (siehe client/reports.ts).
|
|
31
|
+
*/
|
|
32
|
+
async function createStripeLink(rufen, options) {
|
|
33
|
+
const { items } = options;
|
|
34
|
+
// Vor dem Senden pruefen: ein Zahlungslink ist zwar folgenlos wiederholbar,
|
|
35
|
+
// eine abgewiesene Anfrage aber eine unnoetige Runde ueber das Netz — und der
|
|
36
|
+
// Backend-Fehlertext nennt den Grund weit weniger genau als diese Pruefung.
|
|
37
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
38
|
+
throw eingabefehler(ENDPUNKT_LINK, 'Positionen sind Pflicht und duerfen nicht leer sein.');
|
|
39
|
+
}
|
|
40
|
+
if (items.some((item) => !(0, index_js_2.receiptItemIsValid)(item))) {
|
|
41
|
+
throw eingabefehler(ENDPUNKT_LINK, 'Ungueltige Position uebergeben.');
|
|
42
|
+
}
|
|
43
|
+
const params = {
|
|
44
|
+
items: positionsNutzlast(items),
|
|
45
|
+
createReceiptAfterPayment: options.createReceiptAfterPayment,
|
|
46
|
+
// Im Vorbild `mode.name`; Schluessel und Wert sind hier identisch.
|
|
47
|
+
mode: gepruefterModus(options.mode),
|
|
48
|
+
};
|
|
49
|
+
// Die drei uebrigen Felder stehen im Vorbild unter `if (… != null)` — ohne
|
|
50
|
+
// Angabe geht kein leeres Feld raus.
|
|
51
|
+
if (options.webhookId != null) {
|
|
52
|
+
params['webhookId'] = options.webhookId;
|
|
53
|
+
}
|
|
54
|
+
// **Abweichung vom Vorbild, mit Absicht:** Dart sendet `customerPhone`/
|
|
55
|
+
// `customerEmail` in camelCase. Das Backend nimmt die beiden Felder aber
|
|
56
|
+
// ausschliesslich als `customer_phone`/`customer_email` entgegen (so stehen
|
|
57
|
+
// sie in den optionalParams von `createPaymentLinkStripe`, und nur so werden
|
|
58
|
+
// sie ausgewertet), und unbekannte Parameter weist `checkRequest` nicht ab —
|
|
59
|
+
// sie fallen still unter den Tisch. Wer die camelCase-Namen uebernaehme,
|
|
60
|
+
// gaebe dem Aufrufer zwei Felder, die nachweislich nichts bewirken.
|
|
61
|
+
if (options.customerPhone != null) {
|
|
62
|
+
params['customer_phone'] = options.customerPhone;
|
|
63
|
+
}
|
|
64
|
+
if (options.customerEmail != null) {
|
|
65
|
+
params['customer_email'] = options.customerEmail;
|
|
66
|
+
}
|
|
67
|
+
return sitzungAusNutzlast(await rufen(ENDPUNKT_LINK, params));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Zieht die zuvor nur reservierte Zahlung einer `authorization`-Sitzung ein.
|
|
71
|
+
*
|
|
72
|
+
* **Der Parameter heisst `stripe_sessions_id`** — mit "sessions" im Plural, so
|
|
73
|
+
* das Vorbild und so das Backend. Der naheliegende Singular waere ein fehlender
|
|
74
|
+
* Pflichtparameter.
|
|
75
|
+
*/
|
|
76
|
+
async function stripeCaptureIntent(rufen, stripeSessionId) {
|
|
77
|
+
if (typeof stripeSessionId !== 'string' || !stripeSessionId.trim()) {
|
|
78
|
+
throw eingabefehler(ENDPUNKT_CAPTURE, 'stripeSessionId fehlt');
|
|
79
|
+
}
|
|
80
|
+
const daten = await rufen(ENDPUNKT_CAPTURE, { stripe_sessions_id: stripeSessionId });
|
|
81
|
+
return einzugAusNutzlast(daten);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Positionen in ihre Nutzlast wandeln und dabei die strenge Schreibpfad-
|
|
85
|
+
* Pruefung des Modells abfangen (unbekannter Steuersatz). Das Modell wirft dort
|
|
86
|
+
* ein nacktes `Error`; aus einem Endpunkt-Aufruf soll nur die Fehler-Union
|
|
87
|
+
* dieses Pakets herauskommen (dasselbe Vorgehen wie in client/receipts.ts).
|
|
88
|
+
*/
|
|
89
|
+
function positionsNutzlast(items) {
|
|
90
|
+
try {
|
|
91
|
+
return items.map(index_js_2.toReceiptItemPayload);
|
|
92
|
+
}
|
|
93
|
+
catch (ursache) {
|
|
94
|
+
throw eingabefehler(ENDPUNKT_LINK, ursache instanceof Error ? ursache.message : 'Ungueltige Nutzlast uebergeben.');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Modus aufloesen. Bleibt streng: der Modus kommt vom Aufrufer, und das Backend
|
|
99
|
+
* kennt genau zwei Werte — ein dritter waere ein Programmierfehler, der sonst
|
|
100
|
+
* still als `payment` durchginge (das Backend setzt `capture_method: 'manual'`
|
|
101
|
+
* nur bei genau 'authorization').
|
|
102
|
+
*/
|
|
103
|
+
function gepruefterModus(wert) {
|
|
104
|
+
if (!Object.prototype.hasOwnProperty.call(index_js_1.StripeLinkMode, wert)) {
|
|
105
|
+
throw eingabefehler(ENDPUNKT_LINK, `Stripe-Link-Modus: unbekannter Wert "${String(wert)}"`);
|
|
106
|
+
}
|
|
107
|
+
return index_js_1.StripeLinkMode[wert];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Zahlungslink-Sitzung aus der Antwort lesen. Alle vier Felder muessen da sein:
|
|
111
|
+
* eine Sitzung ohne `url` ist kein Zahlungslink, und ein unlesbares Ablaufdatum
|
|
112
|
+
* wuerde als `Invalid Date` weiterwandern und erst beim Anzeigen auffallen.
|
|
113
|
+
*/
|
|
114
|
+
function sitzungAusNutzlast(daten) {
|
|
115
|
+
const roh = daten;
|
|
116
|
+
if (roh == null ||
|
|
117
|
+
typeof roh !== 'object' ||
|
|
118
|
+
typeof roh.id !== 'string' ||
|
|
119
|
+
typeof roh.url !== 'string' ||
|
|
120
|
+
typeof roh.shorten_payment_url !== 'string' ||
|
|
121
|
+
typeof roh.expires_at !== 'string') {
|
|
122
|
+
throw antwortfehler(ENDPUNKT_LINK, 'Antwort enthaelt keine Zahlungslink-Sitzung');
|
|
123
|
+
}
|
|
124
|
+
const sitzung = (0, index_js_2.fromStripeUrlSessionPayload)(roh);
|
|
125
|
+
if (Number.isNaN(sitzung.expiresAt.getTime())) {
|
|
126
|
+
throw antwortfehler(ENDPUNKT_LINK, 'Antwort enthaelt kein lesbares Ablaufdatum');
|
|
127
|
+
}
|
|
128
|
+
return sitzung;
|
|
129
|
+
}
|
|
130
|
+
/** Ergebnis des Einzugs aus der Antwort lesen (Felder siehe [StripeCaptureResult]). */
|
|
131
|
+
function einzugAusNutzlast(daten) {
|
|
132
|
+
const roh = daten;
|
|
133
|
+
if (roh == null ||
|
|
134
|
+
typeof roh !== 'object' ||
|
|
135
|
+
typeof roh.id !== 'string' ||
|
|
136
|
+
typeof roh.status !== 'string' ||
|
|
137
|
+
typeof roh.amount_received !== 'number' ||
|
|
138
|
+
typeof roh.currency !== 'string') {
|
|
139
|
+
throw antwortfehler(ENDPUNKT_CAPTURE, 'Antwort enthaelt kein eingezogenes Zahlungsversprechen');
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
id: roh.id,
|
|
143
|
+
status: roh.status,
|
|
144
|
+
// Stripe fuehrt Betraege in der kleinsten Waehrungseinheit — hier bereits
|
|
145
|
+
// Cent, es wird also nichts umgerechnet (anders als bei Hobex).
|
|
146
|
+
amountReceivedCents: roh.amount_received,
|
|
147
|
+
currency: roh.currency,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/** Fehler in der Eingabe des Aufrufers — es geht keine Anfrage raus. */
|
|
151
|
+
function eingabefehler(functionName, grund) {
|
|
152
|
+
return new errors_js_1.KasseneckValidationError(functionName, grund, 'request');
|
|
153
|
+
}
|
|
154
|
+
/** Die Antwort meldete Erfolg, trug aber nicht, was der Aufruf zusagt. */
|
|
155
|
+
function antwortfehler(functionName, grund) {
|
|
156
|
+
return new errors_js_1.KasseneckValidationError(functionName, grund, 'response');
|
|
157
|
+
}
|