@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,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPrintJob = exports.createPrintJob = exports.listMyPrinters = exports.receiptsScopeOf = exports.cancelScopeOf = exports.verteileRabatt = exports.setMyRegisterDeviceSettings = exports.setMyKasseSettings = exports.getKasseSettings = exports.mengeErlaubt = exports.mengenVorgabe = exports.mengenregelFuerEinheit = exports.listMyArticles = exports.listMyArticleGroups = exports.fromKasseArtikelPayload = exports.fromArticleGroupPayload = exports.mergeKasseSettings = exports.KASSE_GERAET_STANDARD = exports.KASSE_BETRIEB_STANDARD = exports.KASSE_TASTEN_STANDARD = exports.KASSE_TASTEN_AKTIONEN = exports.KARTENANBIETER = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Kachel-Kasse: Einstellungen, Artikelgruppen/Artikel fuer Kacheln,
|
|
6
|
+
* Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
|
|
7
|
+
* (die Rewrites-Waechter der Web-App leiten daraus ab).
|
|
8
|
+
*/
|
|
9
|
+
var settings_js_1 = require("./settings.js");
|
|
10
|
+
Object.defineProperty(exports, "KARTENANBIETER", { enumerable: true, get: function () { return settings_js_1.KARTENANBIETER; } });
|
|
11
|
+
Object.defineProperty(exports, "KASSE_TASTEN_AKTIONEN", { enumerable: true, get: function () { return settings_js_1.KASSE_TASTEN_AKTIONEN; } });
|
|
12
|
+
Object.defineProperty(exports, "KASSE_TASTEN_STANDARD", { enumerable: true, get: function () { return settings_js_1.KASSE_TASTEN_STANDARD; } });
|
|
13
|
+
Object.defineProperty(exports, "KASSE_BETRIEB_STANDARD", { enumerable: true, get: function () { return settings_js_1.KASSE_BETRIEB_STANDARD; } });
|
|
14
|
+
Object.defineProperty(exports, "KASSE_GERAET_STANDARD", { enumerable: true, get: function () { return settings_js_1.KASSE_GERAET_STANDARD; } });
|
|
15
|
+
Object.defineProperty(exports, "mergeKasseSettings", { enumerable: true, get: function () { return settings_js_1.mergeKasseSettings; } });
|
|
16
|
+
var artikel_js_1 = require("./artikel.js");
|
|
17
|
+
Object.defineProperty(exports, "fromArticleGroupPayload", { enumerable: true, get: function () { return artikel_js_1.fromArticleGroupPayload; } });
|
|
18
|
+
Object.defineProperty(exports, "fromKasseArtikelPayload", { enumerable: true, get: function () { return artikel_js_1.fromKasseArtikelPayload; } });
|
|
19
|
+
Object.defineProperty(exports, "listMyArticleGroups", { enumerable: true, get: function () { return artikel_js_1.listMyArticleGroups; } });
|
|
20
|
+
Object.defineProperty(exports, "listMyArticles", { enumerable: true, get: function () { return artikel_js_1.listMyArticles; } });
|
|
21
|
+
Object.defineProperty(exports, "mengenregelFuerEinheit", { enumerable: true, get: function () { return artikel_js_1.mengenregelFuerEinheit; } });
|
|
22
|
+
Object.defineProperty(exports, "mengenVorgabe", { enumerable: true, get: function () { return artikel_js_1.mengenVorgabe; } });
|
|
23
|
+
Object.defineProperty(exports, "mengeErlaubt", { enumerable: true, get: function () { return artikel_js_1.mengeErlaubt; } });
|
|
24
|
+
var client_js_1 = require("./client.js");
|
|
25
|
+
Object.defineProperty(exports, "getKasseSettings", { enumerable: true, get: function () { return client_js_1.getKasseSettings; } });
|
|
26
|
+
Object.defineProperty(exports, "setMyKasseSettings", { enumerable: true, get: function () { return client_js_1.setMyKasseSettings; } });
|
|
27
|
+
Object.defineProperty(exports, "setMyRegisterDeviceSettings", { enumerable: true, get: function () { return client_js_1.setMyRegisterDeviceSettings; } });
|
|
28
|
+
var discount_js_1 = require("../receipt/discount.js");
|
|
29
|
+
Object.defineProperty(exports, "verteileRabatt", { enumerable: true, get: function () { return discount_js_1.verteileRabatt; } });
|
|
30
|
+
// Reichweiten der Kassen-Rechte (Migration wie im Backend) -- bewusst NICHT im
|
|
31
|
+
// Register-Unterpfad: dessen Exportnamen sind 1:1 Function-Namen (Rewrites).
|
|
32
|
+
var pairing_js_1 = require("../register/pairing.js");
|
|
33
|
+
Object.defineProperty(exports, "cancelScopeOf", { enumerable: true, get: function () { return pairing_js_1.cancelScopeOf; } });
|
|
34
|
+
Object.defineProperty(exports, "receiptsScopeOf", { enumerable: true, get: function () { return pairing_js_1.receiptsScopeOf; } });
|
|
35
|
+
var drucker_js_1 = require("./drucker.js");
|
|
36
|
+
Object.defineProperty(exports, "listMyPrinters", { enumerable: true, get: function () { return drucker_js_1.listMyPrinters; } });
|
|
37
|
+
Object.defineProperty(exports, "createPrintJob", { enumerable: true, get: function () { return drucker_js_1.createPrintJob; } });
|
|
38
|
+
Object.defineProperty(exports, "getPrintJob", { enumerable: true, get: function () { return drucker_js_1.getPrintJob; } });
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kassen-Einstellungen der Browser-Kasse — Zwilling von
|
|
3
|
+
* `functions/kasse-settings-core.js` (Backend, dort mit Validator).
|
|
4
|
+
*
|
|
5
|
+
* Betriebsweit (`register_settings.kasse` am Konto) und je Geraet
|
|
6
|
+
* (`register_devices/{id}.kasse`). Die Standardwerte stehen hier UND im
|
|
7
|
+
* Backend; ein Test in beiden Repos haelt sie deckungsgleich. Trinkgeld ist
|
|
8
|
+
* bewusst AUS, bis die Buchung geklaert ist (Spec kachel-kasse § 9).
|
|
9
|
+
*/
|
|
10
|
+
export type KasseStil = 'klar' | 'warm' | 'nacht' | 'kontrast';
|
|
11
|
+
export type KasseSchrift = 'S' | 'M' | 'L' | 'XL';
|
|
12
|
+
export type KasseWasserzeichen = 'aus' | 'anmeldung' | 'ueberall';
|
|
13
|
+
export type KasseMenge = 'aus' | 'x' | 'kg';
|
|
14
|
+
export type KasseTgModus = 'betrag' | 'gesamt' | 'beides';
|
|
15
|
+
export type KasseKassierenModus = 'seite' | 'panel';
|
|
16
|
+
/** Kartenanbieter: Karte gibt es erst mit eingerichtetem Anbieter; 'extern' = eigenes Terminal ohne Anbindung. */
|
|
17
|
+
export type KasseKartenanbieter = 'keiner' | 'extern' | 'hobex' | 'mypos' | 'stripe';
|
|
18
|
+
export declare const KARTENANBIETER: readonly KasseKartenanbieter[];
|
|
19
|
+
export type KasseBelegAusgabe = 'qr' | 'druck' | 'mail' | 'sms' | 'fragen';
|
|
20
|
+
export type KasseLayout = 'rechts' | 'links' | 'vollbild';
|
|
21
|
+
export type KasseKatpos = 'oben' | 'links';
|
|
22
|
+
export type KasseHoehe = 'S' | 'M' | 'L';
|
|
23
|
+
/** `sdp` = Netzwerk ueber Epson Server Direct Print (der Drucker holt Jobs vom Backend, jeder Browser druckt). */
|
|
24
|
+
export type KasseDruckerArt = 'sdp' | 'netz' | 'bt' | 'usb';
|
|
25
|
+
export type KassePapier = 'mm58' | 'mm80';
|
|
26
|
+
export type KasseZeichensatz = 'CP1252' | 'CP437';
|
|
27
|
+
export type KasseSchnitt = 'partial' | 'full' | 'none';
|
|
28
|
+
export type KasseLadeAuto = 'bar' | 'immer' | 'nie';
|
|
29
|
+
/** Schalter-Landkarte: Steuersaetze / Trinkgeldstufen (Schluessel = Wert als Text). */
|
|
30
|
+
export type Schalterkarte = Record<string, boolean>;
|
|
31
|
+
export interface KasseSettingsBetrieb {
|
|
32
|
+
logoText: string;
|
|
33
|
+
logoAn: boolean;
|
|
34
|
+
logoGroesse: 'S' | 'M' | 'L';
|
|
35
|
+
wasserzeichen: KasseWasserzeichen;
|
|
36
|
+
farbe: string;
|
|
37
|
+
stil: KasseStil;
|
|
38
|
+
schrift: KasseSchrift;
|
|
39
|
+
schriftEinst: 'S' | 'M' | 'L';
|
|
40
|
+
kachelstil: 'streifen' | 'voll';
|
|
41
|
+
uhr: boolean;
|
|
42
|
+
sperrbild: boolean;
|
|
43
|
+
foto: boolean;
|
|
44
|
+
autoAbMin: 0 | 1 | 5 | 15 | 30;
|
|
45
|
+
abNachVerkauf: boolean;
|
|
46
|
+
/** Schnelles Entsperren mit gemerkter PIN (lokal, Server-Login laeuft nach); aus = streng, jeder Login wartet. */
|
|
47
|
+
schnellLogin: boolean;
|
|
48
|
+
preisAnzeigen: boolean;
|
|
49
|
+
ustAnzeigen: boolean;
|
|
50
|
+
emoji: boolean;
|
|
51
|
+
katFarben: boolean;
|
|
52
|
+
freiErlaubt: boolean;
|
|
53
|
+
saetze: Schalterkarte;
|
|
54
|
+
menge: KasseMenge;
|
|
55
|
+
notiz: boolean;
|
|
56
|
+
suche: boolean;
|
|
57
|
+
rabatt: 'aus' | 'an';
|
|
58
|
+
zahlBar: boolean;
|
|
59
|
+
zahlKarte: boolean;
|
|
60
|
+
kartenanbieter: KasseKartenanbieter;
|
|
61
|
+
trinkgeld: boolean;
|
|
62
|
+
tgModus: KasseTgModus;
|
|
63
|
+
tgStufen: Schalterkarte;
|
|
64
|
+
tgSplit: boolean;
|
|
65
|
+
rueckgeld: boolean;
|
|
66
|
+
schnellbar: boolean;
|
|
67
|
+
kassierenModus: KasseKassierenModus;
|
|
68
|
+
/** Trinkgeld-Chips in Prozent (eine Nachkommastelle, max 5, eindeutig, Reihenfolge des Chefs). */
|
|
69
|
+
tgChips: number[];
|
|
70
|
+
belegAusgabe: KasseBelegAusgabe;
|
|
71
|
+
fertigSekunden: 0 | 3 | 5 | 10 | 15 | 30 | 60;
|
|
72
|
+
}
|
|
73
|
+
/** Aktionen der Kasse, die eine Taste bekommen koennen. */
|
|
74
|
+
export type KasseTastenAktion = 'kassieren' | 'abschliessen' | 'abbrechen' | 'frei' | 'bar' | 'karte' | 'passend' | 'belege' | 'letzteZurueck';
|
|
75
|
+
export declare const KASSE_TASTEN_AKTIONEN: readonly KasseTastenAktion[];
|
|
76
|
+
/** Tastenkarte: Aktion -> Tasten (`Mod+F`, `Enter`, `Escape`, `F5` ...; `Mod` = ⌘ auf dem Mac, Strg sonst). */
|
|
77
|
+
export type KasseTastenkarte = Record<KasseTastenAktion, string[]>;
|
|
78
|
+
export declare const KASSE_TASTEN_STANDARD: Readonly<KasseTastenkarte>;
|
|
79
|
+
export interface KasseSettingsGeraet {
|
|
80
|
+
layout: KasseLayout;
|
|
81
|
+
katpos: KasseKatpos;
|
|
82
|
+
spaltenExtra: number;
|
|
83
|
+
hoehe: KasseHoehe;
|
|
84
|
+
touch: boolean;
|
|
85
|
+
/** Tastenbelegung dieses Geraets (Vorgabe KASSE_TASTEN_STANDARD, je Aktion mischbar). */
|
|
86
|
+
tasten: KasseTastenkarte;
|
|
87
|
+
druckerAn: boolean;
|
|
88
|
+
druckerArt: KasseDruckerArt;
|
|
89
|
+
druckerIp: string;
|
|
90
|
+
druckerPort: number;
|
|
91
|
+
druckerBt: string;
|
|
92
|
+
/** Kennung des Netzwerk-Druckers (Server Direct Print) aus `listMyPrinters`; '' = keiner gewaehlt. */
|
|
93
|
+
druckerId: string;
|
|
94
|
+
/** ePOS Device-ID bei `druckerArt 'netz'` (Epson direkt per IP), Vorgabe `local_printer`. */
|
|
95
|
+
druckerDevid: string;
|
|
96
|
+
papier: KassePapier;
|
|
97
|
+
zeichensatz: KasseZeichensatz;
|
|
98
|
+
schnitt: KasseSchnitt;
|
|
99
|
+
ladeAn: boolean;
|
|
100
|
+
ladeAuto: KasseLadeAuto;
|
|
101
|
+
terminalIp: string;
|
|
102
|
+
terminalPort: number;
|
|
103
|
+
}
|
|
104
|
+
export interface KasseSettings {
|
|
105
|
+
betrieb: KasseSettingsBetrieb;
|
|
106
|
+
geraet: KasseSettingsGeraet;
|
|
107
|
+
}
|
|
108
|
+
export declare const KASSE_BETRIEB_STANDARD: Readonly<KasseSettingsBetrieb>;
|
|
109
|
+
export declare const KASSE_GERAET_STANDARD: Readonly<KasseSettingsGeraet>;
|
|
110
|
+
/**
|
|
111
|
+
* Standard + gespeichert. Landkarten (`saetze`, `tgStufen`) werden je Schluessel
|
|
112
|
+
* gemischt, damit neue Saetze beim Altbestand ankommen; unbekannte Schluessel
|
|
113
|
+
* bleiben draussen (die Wahrheit ueber Gueltigkeit hat der Server).
|
|
114
|
+
*/
|
|
115
|
+
export declare function mergeKasseSettings<T extends object>(standard: Readonly<T>, gespeichert: Partial<T> | null | undefined): T;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Kassen-Einstellungen der Browser-Kasse — Zwilling von
|
|
4
|
+
* `functions/kasse-settings-core.js` (Backend, dort mit Validator).
|
|
5
|
+
*
|
|
6
|
+
* Betriebsweit (`register_settings.kasse` am Konto) und je Geraet
|
|
7
|
+
* (`register_devices/{id}.kasse`). Die Standardwerte stehen hier UND im
|
|
8
|
+
* Backend; ein Test in beiden Repos haelt sie deckungsgleich. Trinkgeld ist
|
|
9
|
+
* bewusst AUS, bis die Buchung geklaert ist (Spec kachel-kasse § 9).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.KASSE_GERAET_STANDARD = exports.KASSE_BETRIEB_STANDARD = exports.KASSE_TASTEN_STANDARD = exports.KASSE_TASTEN_AKTIONEN = exports.KARTENANBIETER = void 0;
|
|
13
|
+
exports.mergeKasseSettings = mergeKasseSettings;
|
|
14
|
+
exports.KARTENANBIETER = ['keiner', 'extern', 'hobex', 'mypos', 'stripe'];
|
|
15
|
+
exports.KASSE_TASTEN_AKTIONEN = ['kassieren', 'abschliessen', 'abbrechen', 'frei', 'bar', 'karte', 'passend', 'belege', 'letzteZurueck'];
|
|
16
|
+
exports.KASSE_TASTEN_STANDARD = Object.freeze({
|
|
17
|
+
kassieren: ['Enter'], abschliessen: ['Enter'], abbrechen: ['Escape'],
|
|
18
|
+
frei: ['Mod+F'], bar: ['Mod+B'], karte: ['Mod+K'], passend: ['Mod+P'],
|
|
19
|
+
belege: ['Mod+E'], letzteZurueck: ['Mod+Backspace'],
|
|
20
|
+
});
|
|
21
|
+
exports.KASSE_BETRIEB_STANDARD = Object.freeze({
|
|
22
|
+
logoText: 'K', logoAn: true, logoGroesse: 'M', wasserzeichen: 'anmeldung', farbe: '#1B46F5',
|
|
23
|
+
stil: 'klar', schrift: 'M', schriftEinst: 'S', kachelstil: 'streifen', uhr: true,
|
|
24
|
+
sperrbild: true, foto: true, autoAbMin: 0, abNachVerkauf: false, schnellLogin: true,
|
|
25
|
+
preisAnzeigen: true, ustAnzeigen: false, emoji: true, katFarben: true, freiErlaubt: true,
|
|
26
|
+
saetze: { 20: true, 13: true, 10: true, 4.9: true, 0: true, 19: false },
|
|
27
|
+
menge: 'x', notiz: false, suche: false, rabatt: 'aus',
|
|
28
|
+
zahlBar: true, zahlKarte: false, kartenanbieter: 'keiner', trinkgeld: false, tgModus: 'beides',
|
|
29
|
+
tgStufen: { 5: true, 10: true, 15: false, 20: false }, tgChips: [5, 10], tgSplit: true, rueckgeld: true,
|
|
30
|
+
schnellbar: false, kassierenModus: 'seite',
|
|
31
|
+
belegAusgabe: 'qr', fertigSekunden: 0,
|
|
32
|
+
});
|
|
33
|
+
exports.KASSE_GERAET_STANDARD = Object.freeze({
|
|
34
|
+
layout: 'rechts', katpos: 'oben', spaltenExtra: 0, hoehe: 'M', touch: false,
|
|
35
|
+
tasten: { ...exports.KASSE_TASTEN_STANDARD },
|
|
36
|
+
druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerId: '', druckerDevid: 'local_printer',
|
|
37
|
+
papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial',
|
|
38
|
+
ladeAn: false, ladeAuto: 'bar',
|
|
39
|
+
terminalIp: '', terminalPort: 20008,
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Standard + gespeichert. Landkarten (`saetze`, `tgStufen`) werden je Schluessel
|
|
43
|
+
* gemischt, damit neue Saetze beim Altbestand ankommen; unbekannte Schluessel
|
|
44
|
+
* bleiben draussen (die Wahrheit ueber Gueltigkeit hat der Server).
|
|
45
|
+
*/
|
|
46
|
+
function mergeKasseSettings(standard, gespeichert) {
|
|
47
|
+
const out = JSON.parse(JSON.stringify(standard));
|
|
48
|
+
if (gespeichert && typeof gespeichert === 'object') {
|
|
49
|
+
for (const [key, wert] of Object.entries(gespeichert)) {
|
|
50
|
+
if (!(key in out))
|
|
51
|
+
continue;
|
|
52
|
+
const alt = out[key];
|
|
53
|
+
if (alt && typeof alt === 'object' && !Array.isArray(alt) && wert && typeof wert === 'object' && !Array.isArray(wert)) {
|
|
54
|
+
out[key] = { ...alt, ...wert };
|
|
55
|
+
}
|
|
56
|
+
else if (wert !== undefined) {
|
|
57
|
+
out[key] = wert;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Receipt } from './receipt.js';
|
|
2
|
+
/**
|
|
3
|
+
* Storno-Metadaten — Zwilling von `functions/storno-core.js`.
|
|
4
|
+
*
|
|
5
|
+
* Ein Storno ist ein eigener, signierter Beleg vom Typ `cancellation` mit
|
|
6
|
+
* negativen Betraegen. Was NICHT signiert ist und hier als Metadaten laeuft:
|
|
7
|
+
* der Bezug zum Original (`cancellationOf`, `cancellationReason` am
|
|
8
|
+
* Storno-Beleg) und die Liste der Stornos am Original (`cancellations`), aus
|
|
9
|
+
* der sich die Restmengen ergeben.
|
|
10
|
+
*/
|
|
11
|
+
/** Grund-Katalog: Codes wie im Backend, Anzeigetext fuer Bon und Bedienung. */
|
|
12
|
+
export declare const CANCELLATION_REASONS: Readonly<{
|
|
13
|
+
readonly fehleingabe: "Fehleingabe";
|
|
14
|
+
readonly kunde_storniert: "Kunde hat storniert";
|
|
15
|
+
readonly falsche_zahlart: "Falsche Zahlart";
|
|
16
|
+
readonly doppelt_erfasst: "Doppelt erfasst";
|
|
17
|
+
readonly sonstiges: "Sonstiges";
|
|
18
|
+
}>;
|
|
19
|
+
export type CancellationReason = keyof typeof CANCELLATION_REASONS;
|
|
20
|
+
export declare function isCancellationReason(value: unknown): value is CancellationReason;
|
|
21
|
+
/** Bezug eines Storno-Belegs auf sein Original. */
|
|
22
|
+
export interface CancellationOf {
|
|
23
|
+
receiptId: string;
|
|
24
|
+
fullReceiptId: string | null;
|
|
25
|
+
}
|
|
26
|
+
/** Eine stornierte Position: Index im Original und Menge. */
|
|
27
|
+
export interface CancellationItem {
|
|
28
|
+
index: number;
|
|
29
|
+
quantity: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Eintrag in `cancellations[]` am Original. `pending` = Reservierung, die
|
|
33
|
+
* das Backend vor der Buchung setzt und danach ersetzt; sie zaehlt fuer die
|
|
34
|
+
* Restmengen nur, solange sie frisch ist (siehe [remainingQuantities]).
|
|
35
|
+
*/
|
|
36
|
+
export interface Cancellation {
|
|
37
|
+
receiptId?: string;
|
|
38
|
+
pending?: boolean;
|
|
39
|
+
at: number;
|
|
40
|
+
by: string | null;
|
|
41
|
+
note: string | null;
|
|
42
|
+
items: CancellationItem[];
|
|
43
|
+
}
|
|
44
|
+
/** Ab wann eine liegengebliebene Reservierung nicht mehr zaehlt (wie im Backend). */
|
|
45
|
+
export declare const CANCELLATION_RESERVATION_MS = 120000;
|
|
46
|
+
/**
|
|
47
|
+
* Restmenge je Position eines Belegs — Belegmenge minus alles, was storniert
|
|
48
|
+
* oder frisch reserviert ist; nie unter null. Fuer den Storno-Dialog der Kasse
|
|
49
|
+
* (Reste anzeigen, bevor der Server gefragt wird). Die Wahrheit hat der Server.
|
|
50
|
+
*/
|
|
51
|
+
export declare function remainingQuantities(receipt: Receipt, nowMs?: number): number[];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CANCELLATION_RESERVATION_MS = exports.CANCELLATION_REASONS = void 0;
|
|
4
|
+
exports.isCancellationReason = isCancellationReason;
|
|
5
|
+
exports.remainingQuantities = remainingQuantities;
|
|
6
|
+
/**
|
|
7
|
+
* Storno-Metadaten — Zwilling von `functions/storno-core.js`.
|
|
8
|
+
*
|
|
9
|
+
* Ein Storno ist ein eigener, signierter Beleg vom Typ `cancellation` mit
|
|
10
|
+
* negativen Betraegen. Was NICHT signiert ist und hier als Metadaten laeuft:
|
|
11
|
+
* der Bezug zum Original (`cancellationOf`, `cancellationReason` am
|
|
12
|
+
* Storno-Beleg) und die Liste der Stornos am Original (`cancellations`), aus
|
|
13
|
+
* der sich die Restmengen ergeben.
|
|
14
|
+
*/
|
|
15
|
+
/** Grund-Katalog: Codes wie im Backend, Anzeigetext fuer Bon und Bedienung. */
|
|
16
|
+
exports.CANCELLATION_REASONS = Object.freeze({
|
|
17
|
+
fehleingabe: 'Fehleingabe',
|
|
18
|
+
kunde_storniert: 'Kunde hat storniert',
|
|
19
|
+
falsche_zahlart: 'Falsche Zahlart',
|
|
20
|
+
doppelt_erfasst: 'Doppelt erfasst',
|
|
21
|
+
sonstiges: 'Sonstiges',
|
|
22
|
+
});
|
|
23
|
+
function isCancellationReason(value) {
|
|
24
|
+
return typeof value === 'string' && Object.prototype.hasOwnProperty.call(exports.CANCELLATION_REASONS, value);
|
|
25
|
+
}
|
|
26
|
+
/** Ab wann eine liegengebliebene Reservierung nicht mehr zaehlt (wie im Backend). */
|
|
27
|
+
exports.CANCELLATION_RESERVATION_MS = 120_000;
|
|
28
|
+
/**
|
|
29
|
+
* Restmenge je Position eines Belegs — Belegmenge minus alles, was storniert
|
|
30
|
+
* oder frisch reserviert ist; nie unter null. Fuer den Storno-Dialog der Kasse
|
|
31
|
+
* (Reste anzeigen, bevor der Server gefragt wird). Die Wahrheit hat der Server.
|
|
32
|
+
*/
|
|
33
|
+
function remainingQuantities(receipt, nowMs = Date.now()) {
|
|
34
|
+
const rest = receipt.items.map((item) => item.quantity);
|
|
35
|
+
for (const eintrag of receipt.cancellations ?? []) {
|
|
36
|
+
if (eintrag.pending === true && eintrag.at < nowMs - exports.CANCELLATION_RESERVATION_MS)
|
|
37
|
+
continue;
|
|
38
|
+
for (const pos of eintrag.items) {
|
|
39
|
+
if (Number.isInteger(pos.index) && pos.index >= 0 && pos.index < rest.length) {
|
|
40
|
+
rest[pos.index] = Math.max(0, (rest[pos.index] ?? 0) - pos.quantity);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return rest;
|
|
45
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kasse — die Antwortform von `listMyCashregisters` (functions/index.js).
|
|
3
|
+
*
|
|
4
|
+
* Das Dart-Vorbild (`Cashregister` in kasseneck_api/lib/models/cashregister.dart)
|
|
5
|
+
* liest das **Firestore-Dokument** direkt ueber das `cloud_firestore`-SDK und
|
|
6
|
+
* kommt deshalb an `token` und `aes_key`. Dieses Paket spricht das Backend
|
|
7
|
+
* ausschliesslich ueber die HTTPS-Endpunkte, und die geben beides nicht her:
|
|
8
|
+
*
|
|
9
|
+
* - **`aes_key` steht in dieser Antwort ueberhaupt nicht** (nur im
|
|
10
|
+
* Admin-Export). Ein Feld dafuer versprach hier einen `string` und lieferte
|
|
11
|
+
* `undefined` — deshalb gibt es keines mehr.
|
|
12
|
+
* - **`token` ist fuer Kassen-Benutzer bewusst `null`**: im Browser traegt die
|
|
13
|
+
* Sitzung die Identitaet, und ein einmal ausgelieferter Kassen-Token liesse
|
|
14
|
+
* sich ohne Sitzung und ohne PIN weiterverwenden (so steht es im Backend an
|
|
15
|
+
* der Stelle selbst).
|
|
16
|
+
*
|
|
17
|
+
* `create_time` kommt aus `isoTs(...)` und ist **`null`**, wenn das Dokument
|
|
18
|
+
* keinen Zeitstempel traegt. Aus `null` wird hier kein Zeitpunkt: `new Date(null)`
|
|
19
|
+
* ergaebe still den 1.1.1970, und ein erfundenes Datum ist schlechter als ein
|
|
20
|
+
* fehlendes.
|
|
21
|
+
*
|
|
22
|
+
* Aus demselben Grund fehlt `userId`: das Dart-Vorbild traegt es, weil es den
|
|
23
|
+
* Firestore-**Pfad** kennt (`users/{uid}/cashregisters/{id}`). In dieser
|
|
24
|
+
* Antwort steht es nicht, und ein Kassen-Benutzer erfaehrt die Kennung seines
|
|
25
|
+
* Betriebs bewusst nie — sie steckt allein im Token.
|
|
26
|
+
*/
|
|
27
|
+
export interface Cashregister {
|
|
28
|
+
id: string;
|
|
29
|
+
/** Anzeigename der Kasse, sofern gepflegt. */
|
|
30
|
+
label?: string;
|
|
31
|
+
/** Freie Beschreibung, sofern gepflegt. */
|
|
32
|
+
description?: string;
|
|
33
|
+
/** Anlagezeitpunkt; fehlt, wenn die Antwort keinen lesbaren traegt. */
|
|
34
|
+
createTime?: Date;
|
|
35
|
+
/** Kassen-Token; fuer Kassen-Benutzer nie enthalten (siehe Klassenkommentar). */
|
|
36
|
+
token?: string;
|
|
37
|
+
/** Zugeordnete Signatureinheit. */
|
|
38
|
+
signatureId?: string;
|
|
39
|
+
onboarding: CashregisterOnboarding;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Stand der Inbetriebnahme (RKSV): Kasse bei FinanzOnline registriert,
|
|
43
|
+
* Startbeleg erzeugt, Startbeleg uebermittelt. Die drei Kennzeichen entscheiden
|
|
44
|
+
* in der Browser-Kasse, ob ueberhaupt schon kassiert werden darf.
|
|
45
|
+
*/
|
|
46
|
+
export interface CashregisterOnboarding {
|
|
47
|
+
cashboxRegistered: boolean;
|
|
48
|
+
startbelegCreated: boolean;
|
|
49
|
+
startbelegTransmitted: boolean;
|
|
50
|
+
cashboxRegisteredAt?: Date;
|
|
51
|
+
startbelegCreatedAt?: Date;
|
|
52
|
+
startbelegTransmittedAt?: Date;
|
|
53
|
+
}
|
|
54
|
+
/** Nutzlast-Form, die dieses Paket liest — die Feldnamen von `listMyCashregisters`. */
|
|
55
|
+
export interface CashregisterPayload {
|
|
56
|
+
id?: string | null;
|
|
57
|
+
label?: string | null;
|
|
58
|
+
description?: string | null;
|
|
59
|
+
create_time?: string | null;
|
|
60
|
+
signature_id?: string | null;
|
|
61
|
+
token?: string | null;
|
|
62
|
+
onboarding?: CashregisterOnboardingPayload | null;
|
|
63
|
+
}
|
|
64
|
+
export interface CashregisterOnboardingPayload {
|
|
65
|
+
cashbox_registered?: boolean | null;
|
|
66
|
+
startbeleg_created?: boolean | null;
|
|
67
|
+
startbeleg_transmitted?: boolean | null;
|
|
68
|
+
cashbox_registered_at?: string | null;
|
|
69
|
+
startbeleg_created_at?: string | null;
|
|
70
|
+
startbeleg_transmitted_at?: string | null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Liest eine Kasse aus der Antwort. `id` gewinnt aus der Nutzlast, faellt aber
|
|
74
|
+
* auf den uebergebenen Wert zurueck — die Liste fuehrt die Dokument-ID mit,
|
|
75
|
+
* ein einzeln gelesenes Dokument nicht.
|
|
76
|
+
*/
|
|
77
|
+
export declare function fromCashregisterPayload(payload: CashregisterPayload, id: string): Cashregister;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fromCashregisterPayload = fromCashregisterPayload;
|
|
4
|
+
const vienna_time_js_1 = require("../vienna-time.js");
|
|
5
|
+
/**
|
|
6
|
+
* Liest eine Kasse aus der Antwort. `id` gewinnt aus der Nutzlast, faellt aber
|
|
7
|
+
* auf den uebergebenen Wert zurueck — die Liste fuehrt die Dokument-ID mit,
|
|
8
|
+
* ein einzeln gelesenes Dokument nicht.
|
|
9
|
+
*/
|
|
10
|
+
function fromCashregisterPayload(payload, id) {
|
|
11
|
+
const ob = payload.onboarding ?? {};
|
|
12
|
+
return {
|
|
13
|
+
id: payload.id ?? id,
|
|
14
|
+
...(payload.label ? { label: payload.label } : {}),
|
|
15
|
+
...(payload.description ? { description: payload.description } : {}),
|
|
16
|
+
...zeitfeld('createTime', payload.create_time),
|
|
17
|
+
...(payload.token ? { token: payload.token } : {}),
|
|
18
|
+
...(payload.signature_id ? { signatureId: payload.signature_id } : {}),
|
|
19
|
+
onboarding: {
|
|
20
|
+
cashboxRegistered: ob.cashbox_registered === true,
|
|
21
|
+
startbelegCreated: ob.startbeleg_created === true,
|
|
22
|
+
startbelegTransmitted: ob.startbeleg_transmitted === true,
|
|
23
|
+
...zeitfeld('cashboxRegisteredAt', ob.cashbox_registered_at),
|
|
24
|
+
...zeitfeld('startbelegCreatedAt', ob.startbeleg_created_at),
|
|
25
|
+
...zeitfeld('startbelegTransmittedAt', ob.startbeleg_transmitted_at),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Ein Zeitfeld, das es nur gibt, wenn die Nutzlast einen lesbaren Zeitstempel
|
|
31
|
+
* traegt. `null` (der Normalfall aus `isoTs`) und unlesbarer Unsinn ergeben
|
|
32
|
+
* **kein** Feld statt eines erfundenen Zeitpunkts — die Kassenliste soll sich
|
|
33
|
+
* auch dann anzeigen lassen, wenn ein einzelner Eintrag ein kaputtes Datum
|
|
34
|
+
* fuehrt (dieselbe tolerante Leserichtung wie beim Enum-Lesen).
|
|
35
|
+
*/
|
|
36
|
+
function zeitfeld(name, roh) {
|
|
37
|
+
const wert = zeitpunkt(roh);
|
|
38
|
+
return (wert === undefined ? {} : { [name]: wert });
|
|
39
|
+
}
|
|
40
|
+
function zeitpunkt(roh) {
|
|
41
|
+
if (typeof roh !== 'string' || roh.trim() === '') {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
// Ueber parseServerTimeStamp und nie ueber `new Date(text)`: ein
|
|
46
|
+
// offsetloser Zeitstempel waere sonst die lokale Zeit des ausfuehrenden
|
|
47
|
+
// Rechners (siehe ../vienna-time.ts).
|
|
48
|
+
return (0, vienna_time_js_1.parseServerTimeStamp)(roh);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { VatRate } from '../enums/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Loest einen Enum-Eintrag anhand seines Nutzlast-Schluessels auf (z. B.
|
|
4
|
+
* `receiptType: 'standard'` — bei den mit `defineEnum()` gebauten Enums ist
|
|
5
|
+
* der Objekt-Schluessel selbst die Nutzlast).
|
|
6
|
+
*
|
|
7
|
+
* Nur fuer den **Schreibpfad**: bevor dieses Paket selbst einen Wert nach
|
|
8
|
+
* aussen traegt, muss er bekannt sein — ein unbekannter Schluessel wirft.
|
|
9
|
+
* Fuer den Lesepfad (Daten, die vom Backend hereinkommen) siehe
|
|
10
|
+
* [readEnumKey]: dort darf ein einzelner unbekannter Wert nicht die ganze
|
|
11
|
+
* Belegliste zum Absturz bringen.
|
|
12
|
+
*/
|
|
13
|
+
export declare function requireEnumKey<T extends Record<string, unknown>>(enumObj: T, key: string, label: string): T[keyof T];
|
|
14
|
+
/**
|
|
15
|
+
* Lesepfad-Pendant zu [requireEnumKey]: ein unbekannter Schluessel (z. B. ein
|
|
16
|
+
* neuer Belegtyp oder eine neue Zahlungsart, die dieses Paket noch nicht
|
|
17
|
+
* kennt) wirft nicht und wird auch nicht still zu `undefined` — der rohe
|
|
18
|
+
* Nutzlast-Schluessel bleibt als String erhalten. Ein Aufrufer, der eine
|
|
19
|
+
* Belegliste anzeigt, kann so alle Positionen weiterlesen; nur die unbekannte
|
|
20
|
+
* bleibt (erkennbar) unaufgeloest.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readEnumKey<T extends Record<string, unknown>>(enumObj: T, key: string): T[keyof T] | string;
|
|
23
|
+
/** Schreibpfad: loest einen Steuersatz anhand seines `rate`-Werts auf, wirft bei unbekanntem Satz. */
|
|
24
|
+
export declare function requireVatRateByRate(rate: number): VatRate;
|
|
25
|
+
/** Lesepfad: unbekannter Satz bleibt als roher `rate`-Wert erhalten statt zu werfen oder `undefined` zu werden. */
|
|
26
|
+
export declare function readVatRateByRate(rate: number): VatRate | number;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireEnumKey = requireEnumKey;
|
|
4
|
+
exports.readEnumKey = readEnumKey;
|
|
5
|
+
exports.requireVatRateByRate = requireVatRateByRate;
|
|
6
|
+
exports.readVatRateByRate = readVatRateByRate;
|
|
7
|
+
const index_js_1 = require("../enums/index.js");
|
|
8
|
+
/**
|
|
9
|
+
* Loest einen Enum-Eintrag anhand seines Nutzlast-Schluessels auf (z. B.
|
|
10
|
+
* `receiptType: 'standard'` — bei den mit `defineEnum()` gebauten Enums ist
|
|
11
|
+
* der Objekt-Schluessel selbst die Nutzlast).
|
|
12
|
+
*
|
|
13
|
+
* Nur fuer den **Schreibpfad**: bevor dieses Paket selbst einen Wert nach
|
|
14
|
+
* aussen traegt, muss er bekannt sein — ein unbekannter Schluessel wirft.
|
|
15
|
+
* Fuer den Lesepfad (Daten, die vom Backend hereinkommen) siehe
|
|
16
|
+
* [readEnumKey]: dort darf ein einzelner unbekannter Wert nicht die ganze
|
|
17
|
+
* Belegliste zum Absturz bringen.
|
|
18
|
+
*/
|
|
19
|
+
function requireEnumKey(enumObj, key, label) {
|
|
20
|
+
if (!Object.prototype.hasOwnProperty.call(enumObj, key)) {
|
|
21
|
+
throw new Error(`${label}: unbekannter Schluessel "${key}" in der Nutzlast`);
|
|
22
|
+
}
|
|
23
|
+
return enumObj[key];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Lesepfad-Pendant zu [requireEnumKey]: ein unbekannter Schluessel (z. B. ein
|
|
27
|
+
* neuer Belegtyp oder eine neue Zahlungsart, die dieses Paket noch nicht
|
|
28
|
+
* kennt) wirft nicht und wird auch nicht still zu `undefined` — der rohe
|
|
29
|
+
* Nutzlast-Schluessel bleibt als String erhalten. Ein Aufrufer, der eine
|
|
30
|
+
* Belegliste anzeigt, kann so alle Positionen weiterlesen; nur die unbekannte
|
|
31
|
+
* bleibt (erkennbar) unaufgeloest.
|
|
32
|
+
*/
|
|
33
|
+
function readEnumKey(enumObj, key) {
|
|
34
|
+
return Object.prototype.hasOwnProperty.call(enumObj, key) ? enumObj[key] : key;
|
|
35
|
+
}
|
|
36
|
+
function findVatRate(rate) {
|
|
37
|
+
return Object.values(index_js_1.VatRate).find((v) => v.rate === rate);
|
|
38
|
+
}
|
|
39
|
+
/** Schreibpfad: loest einen Steuersatz anhand seines `rate`-Werts auf, wirft bei unbekanntem Satz. */
|
|
40
|
+
function requireVatRateByRate(rate) {
|
|
41
|
+
const eintrag = findVatRate(rate);
|
|
42
|
+
if (!eintrag) {
|
|
43
|
+
throw new Error(`Steuersatz: unbekannter Satz "${rate}" in der Nutzlast`);
|
|
44
|
+
}
|
|
45
|
+
return eintrag;
|
|
46
|
+
}
|
|
47
|
+
/** Lesepfad: unbekannter Satz bleibt als roher `rate`-Wert erhalten statt zu werfen oder `undefined` zu werden. */
|
|
48
|
+
function readVatRateByRate(rate) {
|
|
49
|
+
return findVatRate(rate) ?? rate;
|
|
50
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { CreditCardProvider } from '../enums/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Hobex-Kartenzahlungsbeleg — Zwilling von `HobexReceipt` in
|
|
4
|
+
* kasseneck_api/lib/models/hobex_receipt.dart.
|
|
5
|
+
*
|
|
6
|
+
* `amount`/`tip` kommen vom Hobex-Terminal als Euro-Gleitkommazahl ueber die
|
|
7
|
+
* Leitung (Terminal-API, nicht das Kasseneck-Backend) — das Nutzlast-Format
|
|
8
|
+
* bleibt deshalb bewusst Euro (siehe [toHobexReceiptPayload]/
|
|
9
|
+
* [fromHobexReceiptPayload]), intern wird ab hier exakt in Cent gefuehrt.
|
|
10
|
+
*
|
|
11
|
+
* Nur der Cloud-API-Pfad (`fromJson` im Dart-Vorbild) ist Teil dieses Pakets;
|
|
12
|
+
* das lokale HPS-Terminal (`fromHps`, TCP-Anbindung an ein physisches Geraet)
|
|
13
|
+
* ist wie SumUp/myPOS eine Android/Desktop-Geraete-Anbindung, die ein
|
|
14
|
+
* Browser-/Node-Paket nicht bedienen kann.
|
|
15
|
+
*/
|
|
16
|
+
export interface HobexReceipt {
|
|
17
|
+
transactionId: string;
|
|
18
|
+
tid: string;
|
|
19
|
+
receipt: string;
|
|
20
|
+
approvalCode: string;
|
|
21
|
+
reference?: string;
|
|
22
|
+
/** Normalisiert wie im Dart-Vorbild: `"YYYY-MM-DD HH:mm:ss"` (Bruchteil und `T` entfernt). */
|
|
23
|
+
transactionDate: string;
|
|
24
|
+
cardNumber: string;
|
|
25
|
+
cardExpiry: string;
|
|
26
|
+
brand: string;
|
|
27
|
+
cardIssuer: string;
|
|
28
|
+
responseCode: string;
|
|
29
|
+
transactionType: string;
|
|
30
|
+
currency: string;
|
|
31
|
+
amountCents: number;
|
|
32
|
+
tipCents: number;
|
|
33
|
+
cvm: string;
|
|
34
|
+
creditCardProvider: CreditCardProvider;
|
|
35
|
+
}
|
|
36
|
+
export interface HobexReceiptPayload {
|
|
37
|
+
transactionId: string;
|
|
38
|
+
tid: string;
|
|
39
|
+
receipt: string;
|
|
40
|
+
approvalCode: string;
|
|
41
|
+
reference: string | null | undefined;
|
|
42
|
+
transactionDate: string;
|
|
43
|
+
cardNumber: string;
|
|
44
|
+
cardExpiry: string;
|
|
45
|
+
brand: string;
|
|
46
|
+
cardIssuer: string;
|
|
47
|
+
responseCode: string;
|
|
48
|
+
transactionType: string;
|
|
49
|
+
currency: string;
|
|
50
|
+
amount: number;
|
|
51
|
+
tip: number;
|
|
52
|
+
cvm: string | number;
|
|
53
|
+
}
|
|
54
|
+
export declare function toHobexReceiptPayload(beleg: HobexReceipt): HobexReceiptPayload;
|
|
55
|
+
export declare function fromHobexReceiptPayload(payload: HobexReceiptPayload): HobexReceipt;
|
|
56
|
+
/**
|
|
57
|
+
* Wandelt den Beleg in die `cardPaymentData`-Map, die auf dem Kasseneck-Beleg
|
|
58
|
+
* landet (siehe [Receipt.cardPaymentData]). Bei HPS-Zahlungen kommen weitere
|
|
59
|
+
* Felder dazu, die nur das lokale Terminal liefert.
|
|
60
|
+
*/
|
|
61
|
+
export declare function hobexReceiptToCardPaymentData(beleg: HobexReceipt): Record<string, string>;
|
|
62
|
+
/** Kartenzahlung erfordert eine Unterschrift (CVM-Code `"1"`). */
|
|
63
|
+
export declare function hobexReceiptNeedsSignature(beleg: HobexReceipt): boolean;
|