@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,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modus eines Stripe-Zahlungslinks — Zwilling von `StripeLinkMode` in
|
|
3
|
+
* kasseneck_api/lib/enums/stripe_link_mode.dart.
|
|
4
|
+
*
|
|
5
|
+
* `payment` zieht den Betrag sofort ein, `authorization` reserviert ihn nur
|
|
6
|
+
* (Stripe `capture_method: 'manual'`); eingezogen wird er dann spaeter ueber
|
|
7
|
+
* `stripeCaptureIntent`.
|
|
8
|
+
*
|
|
9
|
+
* Der Wert IST die Nutzlast: das Vorbild sendet `mode.name`, das Backend
|
|
10
|
+
* vergleicht gegen 'authorization' (functions/payment-endpoints.js).
|
|
11
|
+
*/
|
|
12
|
+
export declare const StripeLinkMode: {
|
|
13
|
+
readonly payment: "payment";
|
|
14
|
+
readonly authorization: "authorization";
|
|
15
|
+
};
|
|
16
|
+
export type StripeLinkModeKey = keyof typeof StripeLinkMode;
|
|
17
|
+
export type StripeLinkMode = (typeof StripeLinkMode)[StripeLinkModeKey];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modus eines Stripe-Zahlungslinks — Zwilling von `StripeLinkMode` in
|
|
3
|
+
* kasseneck_api/lib/enums/stripe_link_mode.dart.
|
|
4
|
+
*
|
|
5
|
+
* `payment` zieht den Betrag sofort ein, `authorization` reserviert ihn nur
|
|
6
|
+
* (Stripe `capture_method: 'manual'`); eingezogen wird er dann spaeter ueber
|
|
7
|
+
* `stripeCaptureIntent`.
|
|
8
|
+
*
|
|
9
|
+
* Der Wert IST die Nutzlast: das Vorbild sendet `mode.name`, das Backend
|
|
10
|
+
* vergleicht gegen 'authorization' (functions/payment-endpoints.js).
|
|
11
|
+
*/
|
|
12
|
+
export const StripeLinkMode = {
|
|
13
|
+
payment: 'payment',
|
|
14
|
+
authorization: 'authorization',
|
|
15
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Steuersatz — Zwilling von `VatRate` in kasseneck_api/lib/enums/vat_rate.dart.
|
|
3
|
+
*
|
|
4
|
+
* `category` ist der RKSV-Kategorie-Buchstabe der Steuersaetze (A=20%, B=10%, C=13%,
|
|
5
|
+
* D=0%, E=19%, G=4,9%). Er haengt an der Signaturkette des Backends — unantastbar.
|
|
6
|
+
*/
|
|
7
|
+
export declare const VatRate: {
|
|
8
|
+
readonly vat0: {
|
|
9
|
+
readonly value: "vat0";
|
|
10
|
+
readonly rate: 0;
|
|
11
|
+
readonly category: "D";
|
|
12
|
+
};
|
|
13
|
+
readonly vat4komma9: {
|
|
14
|
+
readonly value: "vat4komma9";
|
|
15
|
+
readonly rate: 4.9;
|
|
16
|
+
readonly category: "G";
|
|
17
|
+
};
|
|
18
|
+
readonly vat10: {
|
|
19
|
+
readonly value: "vat10";
|
|
20
|
+
readonly rate: 10;
|
|
21
|
+
readonly category: "B";
|
|
22
|
+
};
|
|
23
|
+
readonly vat13: {
|
|
24
|
+
readonly value: "vat13";
|
|
25
|
+
readonly rate: 13;
|
|
26
|
+
readonly category: "C";
|
|
27
|
+
};
|
|
28
|
+
readonly vat19: {
|
|
29
|
+
readonly value: "vat19";
|
|
30
|
+
readonly rate: 19;
|
|
31
|
+
readonly category: "E";
|
|
32
|
+
};
|
|
33
|
+
readonly vat20: {
|
|
34
|
+
readonly value: "vat20";
|
|
35
|
+
readonly rate: 20;
|
|
36
|
+
readonly category: "A";
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
export type VatRateKey = keyof typeof VatRate;
|
|
40
|
+
export type VatRate = (typeof VatRate)[VatRateKey];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineEnum } from './define-enum.js';
|
|
2
|
+
/**
|
|
3
|
+
* Steuersatz — Zwilling von `VatRate` in kasseneck_api/lib/enums/vat_rate.dart.
|
|
4
|
+
*
|
|
5
|
+
* `category` ist der RKSV-Kategorie-Buchstabe der Steuersaetze (A=20%, B=10%, C=13%,
|
|
6
|
+
* D=0%, E=19%, G=4,9%). Er haengt an der Signaturkette des Backends — unantastbar.
|
|
7
|
+
*/
|
|
8
|
+
export const VatRate = defineEnum({
|
|
9
|
+
vat0: { value: 'vat0', rate: 0, category: 'D' },
|
|
10
|
+
// Grundnahrungsmittel ab 01.07.2026 -> Betrag-Satz-Besonders (BMF/RKSV)
|
|
11
|
+
vat4komma9: { value: 'vat4komma9', rate: 4.9, category: 'G' },
|
|
12
|
+
vat10: { value: 'vat10', rate: 10, category: 'B' },
|
|
13
|
+
vat13: { value: 'vat13', rate: 13, category: 'C' },
|
|
14
|
+
vat19: { value: 'vat19', rate: 19, category: 'E' },
|
|
15
|
+
vat20: { value: 'vat20', rate: 20, category: 'A' },
|
|
16
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gutschein-Aktion — Zwilling von `VoucherAction` in
|
|
3
|
+
* kasseneck_api/lib/enums/voucher_action.dart.
|
|
4
|
+
*/
|
|
5
|
+
export declare const VoucherAction: {
|
|
6
|
+
readonly sell: "sell";
|
|
7
|
+
readonly redeem: "redeem";
|
|
8
|
+
};
|
|
9
|
+
export type VoucherActionKey = keyof typeof VoucherAction;
|
|
10
|
+
export type VoucherAction = (typeof VoucherAction)[VoucherActionKey];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gutscheinart — Zwilling von `VoucherType` in kasseneck_api/lib/enums/voucher_type.dart.
|
|
3
|
+
*/
|
|
4
|
+
export declare const VoucherType: {
|
|
5
|
+
readonly value: "value";
|
|
6
|
+
readonly promo: "promo";
|
|
7
|
+
};
|
|
8
|
+
export type VoucherTypeKey = keyof typeof VoucherType;
|
|
9
|
+
export type VoucherType = (typeof VoucherType)[VoucherTypeKey];
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ReceiptType, type ReceiptTypeKey, VatRate, type VatRateKey, KeckPaymentMethod, type KeckPaymentMethodKey, CreditCardProvider, type CreditCardProviderKey, VoucherType, type VoucherTypeKey, VoucherAction, type VoucherActionKey, StripeLinkMode, type StripeLinkModeKey, } from './enums/index.js';
|
|
2
|
+
export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, istZeroKind, type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
|
|
3
|
+
export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, type ReceiptCommonOptions, type SellReceiptOptions, type CancelReceiptOptions, type CancelReceiptResult, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, listMyCashregisters, checkVoucherCombinationError, downloadDailyReport, downloadMonthlyReport, type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, type KasseneckApi, createKasseneckApi, } from './client/index.js';
|
|
4
|
+
export { parseServerTimeStamp, toViennaWallClock, type ViennaWallClock } from './vienna-time.js';
|
|
5
|
+
export { type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, type ArticleGroup, type KasseArtikel, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings, verteileRabatt, cancelScopeOf, receiptsScopeOf, } from './kasse/index.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ReceiptType, VatRate, KeckPaymentMethod, CreditCardProvider, VoucherType, VoucherAction, StripeLinkMode, } from './enums/index.js';
|
|
2
|
+
export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, toVoucherPayload, fromVoucherPayload, voucherIsValid, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, fromReceiptCompanyPayload, receiptCompanyTaxInfo, fromCashregisterPayload, fromReceiptSummaryPayload, ZERO_KINDS, istZeroKind, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
|
|
3
|
+
export { apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, listMyCashregisters, checkVoucherCombinationError, downloadDailyReport, downloadMonthlyReport, getCashboxStatus, getSignatureStatus, createKasseneckApi, } from './client/index.js';
|
|
4
|
+
export { parseServerTimeStamp, toViennaWallClock } from './vienna-time.js';
|
|
5
|
+
export { KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings, verteileRabatt, cancelScopeOf, receiptsScopeOf, } from './kasse/index.js';
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { KasseneckTransport } from '../client/transport.js';
|
|
2
|
+
/**
|
|
3
|
+
* Artikelgruppen (Kategorien der Kachel-Kasse) und Artikel in der Form, die
|
|
4
|
+
* die Kacheln brauchen — Backend: `article-endpoints.js`
|
|
5
|
+
* (`listMyArticleGroups`, `listMyArticles` mit `groupId`/`kasse`).
|
|
6
|
+
*/
|
|
7
|
+
export interface ArticleGroup {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
/** #RRGGBB */
|
|
11
|
+
color: string;
|
|
12
|
+
/** Kategorie-Symbol (Emoji, hoechstens zwei Zeichen) oder null. */
|
|
13
|
+
symbol: string | null;
|
|
14
|
+
sort: number;
|
|
15
|
+
vatRate: number | null;
|
|
16
|
+
}
|
|
17
|
+
export interface ArticleGroupPayload {
|
|
18
|
+
id?: string | null;
|
|
19
|
+
name?: string | null;
|
|
20
|
+
color?: string | null;
|
|
21
|
+
symbol?: string | null;
|
|
22
|
+
sort?: number | null;
|
|
23
|
+
vatRate?: number | null;
|
|
24
|
+
}
|
|
25
|
+
export declare function fromArticleGroupPayload(p: ArticleGroupPayload): ArticleGroup;
|
|
26
|
+
/**
|
|
27
|
+
* Mengenregel eines Artikels: `stueck` = ganze Stueck (1, 2, 3 ...),
|
|
28
|
+
* `dezimal` = Kommamenge in der Einheit (0,250 kg, 1,5 m). Beleg und DEP
|
|
29
|
+
* bleiben ganzzahlig: eine Kommamenge wird an der Kasse als EINE Position mit
|
|
30
|
+
* ausgerechnetem Betrag gebucht, die Bezeichnung traegt die Menge
|
|
31
|
+
* („Wurst 0,250 kg“). Siehe [mengenregelFuerEinheit] fuer die Vorgabe je Einheit.
|
|
32
|
+
*/
|
|
33
|
+
export type Mengenregel = 'stueck' | 'dezimal';
|
|
34
|
+
export interface MengenVorgabe {
|
|
35
|
+
regel: Mengenregel;
|
|
36
|
+
/** Kasse fragt beim Antippen nach der Menge (Wurst nach Gewicht: ja; Semmel: nein). */
|
|
37
|
+
fragen: boolean;
|
|
38
|
+
/** Nachkommastellen bei `dezimal`. */
|
|
39
|
+
stellen: number;
|
|
40
|
+
}
|
|
41
|
+
/** Vorgabe je Einheit -- was der Betrieb bei einem neuen Artikel bekommt und aendern darf. */
|
|
42
|
+
export declare function mengenregelFuerEinheit(unit: string | null | undefined): MengenVorgabe;
|
|
43
|
+
/** Wirksame Regel eines Artikels: gespeicherte Angabe schlaegt die Vorgabe der Einheit. */
|
|
44
|
+
export declare function mengenVorgabe(a: Pick<KasseArtikel, 'unit' | 'mengenregel' | 'mengeFragen'>): MengenVorgabe;
|
|
45
|
+
/** Artikel, wie ihn die Kasse fuer Kacheln und Belegpositionen braucht. */
|
|
46
|
+
export interface KasseArtikel {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
unitPriceCents: number | null;
|
|
50
|
+
vatRate: number | null;
|
|
51
|
+
unit: string;
|
|
52
|
+
groupId: string | null;
|
|
53
|
+
sichtbar: boolean;
|
|
54
|
+
sort: number;
|
|
55
|
+
active: boolean;
|
|
56
|
+
/** Gespeicherte Mengenregel; null = Vorgabe der Einheit. */
|
|
57
|
+
mengenregel: Mengenregel | null;
|
|
58
|
+
/** Gespeichert: Kasse fragt nach der Menge; null = Vorgabe der Einheit. */
|
|
59
|
+
mengeFragen: boolean | null;
|
|
60
|
+
/** Hoechstmenge je Beleg (bei kg/l/m auch Kommazahl); null = keine Grenze. */
|
|
61
|
+
maxMenge: number | null;
|
|
62
|
+
}
|
|
63
|
+
/** Deckelt eine gewuenschte Menge an der Hoechstmenge des Artikels (null = keine Grenze). */
|
|
64
|
+
export declare function mengeErlaubt(a: Pick<KasseArtikel, 'maxMenge'>, gewuenscht: number): number;
|
|
65
|
+
export interface KasseArtikelPayload {
|
|
66
|
+
id?: string | null;
|
|
67
|
+
name?: string | null;
|
|
68
|
+
unitPriceCents?: number | null;
|
|
69
|
+
vatRate?: number | null;
|
|
70
|
+
unit?: string | null;
|
|
71
|
+
groupId?: string | null;
|
|
72
|
+
kasse?: {
|
|
73
|
+
sichtbar?: boolean | null;
|
|
74
|
+
sort?: number | null;
|
|
75
|
+
} | null;
|
|
76
|
+
active?: boolean | null;
|
|
77
|
+
mengenregel?: string | null;
|
|
78
|
+
mengeFragen?: boolean | null;
|
|
79
|
+
maxMenge?: number | null;
|
|
80
|
+
}
|
|
81
|
+
export declare function fromKasseArtikelPayload(p: KasseArtikelPayload): KasseArtikel;
|
|
82
|
+
export declare function listMyArticleGroups(rufen: KasseneckTransport): Promise<ArticleGroup[]>;
|
|
83
|
+
export declare function listMyArticles(rufen: KasseneckTransport): Promise<KasseArtikel[]>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { KasseneckValidationError } from '../client/errors.js';
|
|
2
|
+
export function fromArticleGroupPayload(p) {
|
|
3
|
+
return {
|
|
4
|
+
id: p.id ?? '',
|
|
5
|
+
name: p.name ?? '',
|
|
6
|
+
color: p.color ?? '#6B7280',
|
|
7
|
+
symbol: p.symbol ?? null,
|
|
8
|
+
sort: typeof p.sort === 'number' ? p.sort : 0,
|
|
9
|
+
vatRate: typeof p.vatRate === 'number' ? p.vatRate : null,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Einheiten, die nach Menge verkauft werden (Kommazahl, Kasse fragt). */
|
|
13
|
+
const DEZIMAL_EINHEITEN = {
|
|
14
|
+
kg: 3, g: 0, l: 2, ml: 0, m: 2, lfm: 2, km: 1, 'm²': 2, m2: 2, 'm³': 3, m3: 3, std: 2, h: 2, min: 0, t: 3,
|
|
15
|
+
};
|
|
16
|
+
/** Vorgabe je Einheit -- was der Betrieb bei einem neuen Artikel bekommt und aendern darf. */
|
|
17
|
+
export function mengenregelFuerEinheit(unit) {
|
|
18
|
+
const u = (unit ?? '').trim().toLowerCase();
|
|
19
|
+
if (u in DEZIMAL_EINHEITEN) {
|
|
20
|
+
const stellen = DEZIMAL_EINHEITEN[u];
|
|
21
|
+
return stellen === 0
|
|
22
|
+
? { regel: 'stueck', fragen: true, stellen: 0 } // g, ml, min: ganze Zahl, aber die Menge wird gefragt
|
|
23
|
+
: { regel: 'dezimal', fragen: true, stellen };
|
|
24
|
+
}
|
|
25
|
+
return { regel: 'stueck', fragen: false, stellen: 0 };
|
|
26
|
+
}
|
|
27
|
+
/** Wirksame Regel eines Artikels: gespeicherte Angabe schlaegt die Vorgabe der Einheit. */
|
|
28
|
+
export function mengenVorgabe(a) {
|
|
29
|
+
const v = mengenregelFuerEinheit(a.unit);
|
|
30
|
+
return {
|
|
31
|
+
regel: a.mengenregel ?? v.regel,
|
|
32
|
+
fragen: a.mengeFragen ?? v.fragen,
|
|
33
|
+
stellen: (a.mengenregel ?? v.regel) === 'dezimal' ? Math.max(1, v.stellen || 2) : 0,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Deckelt eine gewuenschte Menge an der Hoechstmenge des Artikels (null = keine Grenze). */
|
|
37
|
+
export function mengeErlaubt(a, gewuenscht) {
|
|
38
|
+
return a.maxMenge != null && a.maxMenge > 0 ? Math.min(gewuenscht, a.maxMenge) : gewuenscht;
|
|
39
|
+
}
|
|
40
|
+
export function fromKasseArtikelPayload(p) {
|
|
41
|
+
return {
|
|
42
|
+
id: p.id ?? '',
|
|
43
|
+
name: p.name ?? '',
|
|
44
|
+
unitPriceCents: typeof p.unitPriceCents === 'number' ? p.unitPriceCents : null,
|
|
45
|
+
vatRate: typeof p.vatRate === 'number' ? p.vatRate : null,
|
|
46
|
+
unit: p.unit ?? '',
|
|
47
|
+
groupId: p.groupId ?? null,
|
|
48
|
+
sichtbar: p.kasse?.sichtbar !== false,
|
|
49
|
+
sort: typeof p.kasse?.sort === 'number' ? p.kasse.sort : 0,
|
|
50
|
+
active: p.active !== false,
|
|
51
|
+
mengenregel: p.mengenregel === 'stueck' || p.mengenregel === 'dezimal' ? p.mengenregel : null,
|
|
52
|
+
mengeFragen: typeof p.mengeFragen === 'boolean' ? p.mengeFragen : null,
|
|
53
|
+
maxMenge: typeof p.maxMenge === 'number' && Number.isFinite(p.maxMenge) && p.maxMenge > 0 ? p.maxMenge : null,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function liste(daten, feld, name, lesen) {
|
|
57
|
+
const roh = daten?.[feld];
|
|
58
|
+
if (!Array.isArray(roh)) {
|
|
59
|
+
throw new KasseneckValidationError(name, `Antwort enthaelt keine Liste (data.${feld} fehlt)`, 'response');
|
|
60
|
+
}
|
|
61
|
+
return roh.map((e) => lesen(typeof e === 'object' && e !== null ? e : {}));
|
|
62
|
+
}
|
|
63
|
+
export async function listMyArticleGroups(rufen) {
|
|
64
|
+
const daten = await rufen('listMyArticleGroups');
|
|
65
|
+
return liste(daten, 'groups', 'listMyArticleGroups', (e) => fromArticleGroupPayload(e));
|
|
66
|
+
}
|
|
67
|
+
export async function listMyArticles(rufen) {
|
|
68
|
+
const daten = await rufen('listMyArticles');
|
|
69
|
+
return liste(daten, 'articles', 'listMyArticles', (e) => fromKasseArtikelPayload(e));
|
|
70
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { KasseneckTransport } from '../client/transport.js';
|
|
2
|
+
import { type KasseSettings, type KasseSettingsBetrieb, type KasseSettingsGeraet } from './settings.js';
|
|
3
|
+
/** Einstellungen lesen — Standard + gespeichert (Backend: `getKasseSettings`). */
|
|
4
|
+
export declare function getKasseSettings(rufen: KasseneckTransport, options?: {
|
|
5
|
+
deviceId?: string;
|
|
6
|
+
}): Promise<KasseSettings>;
|
|
7
|
+
/** Betriebsweite Einstellungen schreiben (Recht `layout`); liefert den gemischten Stand. */
|
|
8
|
+
export declare function setMyKasseSettings(rufen: KasseneckTransport, betrieb: Partial<KasseSettingsBetrieb>): Promise<KasseSettingsBetrieb>;
|
|
9
|
+
/** Geraete-Einstellungen schreiben (Recht `layout`); liefert den gemischten Stand. */
|
|
10
|
+
export declare function setMyRegisterDeviceSettings(rufen: KasseneckTransport, deviceId: string, geraet: Partial<KasseSettingsGeraet>): Promise<KasseSettingsGeraet>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { KasseneckValidationError } from '../client/errors.js';
|
|
2
|
+
import { KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, } from './settings.js';
|
|
3
|
+
/** Einstellungen lesen — Standard + gespeichert (Backend: `getKasseSettings`). */
|
|
4
|
+
export async function getKasseSettings(rufen, options = {}) {
|
|
5
|
+
const params = {};
|
|
6
|
+
if (options.deviceId)
|
|
7
|
+
params.deviceId = options.deviceId;
|
|
8
|
+
const daten = await rufen('getKasseSettings', params);
|
|
9
|
+
return {
|
|
10
|
+
betrieb: mergeKasseSettings(KASSE_BETRIEB_STANDARD, (daten?.betrieb ?? null)),
|
|
11
|
+
geraet: mergeKasseSettings(KASSE_GERAET_STANDARD, (daten?.geraet ?? null)),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function nichtLeer(name, block) {
|
|
15
|
+
if (!block || typeof block !== 'object' || Object.keys(block).length === 0) {
|
|
16
|
+
throw new KasseneckValidationError(name, 'Keine Einstellungen uebergeben', 'request');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Betriebsweite Einstellungen schreiben (Recht `layout`); liefert den gemischten Stand. */
|
|
20
|
+
export async function setMyKasseSettings(rufen, betrieb) {
|
|
21
|
+
nichtLeer('setMyKasseSettings', betrieb);
|
|
22
|
+
const daten = await rufen('setMyKasseSettings', { betrieb });
|
|
23
|
+
return mergeKasseSettings(KASSE_BETRIEB_STANDARD, (daten?.betrieb ?? null));
|
|
24
|
+
}
|
|
25
|
+
/** Geraete-Einstellungen schreiben (Recht `layout`); liefert den gemischten Stand. */
|
|
26
|
+
export async function setMyRegisterDeviceSettings(rufen, deviceId, geraet) {
|
|
27
|
+
if (typeof deviceId !== 'string' || deviceId.trim() === '') {
|
|
28
|
+
throw new KasseneckValidationError('setMyRegisterDeviceSettings', 'deviceId fehlt', 'request');
|
|
29
|
+
}
|
|
30
|
+
nichtLeer('setMyRegisterDeviceSettings', geraet);
|
|
31
|
+
const daten = await rufen('setMyRegisterDeviceSettings', { deviceId, geraet });
|
|
32
|
+
return mergeKasseSettings(KASSE_GERAET_STANDARD, (daten?.geraet ?? null));
|
|
33
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { KasseneckTransport } from '../client/transport.js';
|
|
2
|
+
import type { ReceiptLayout } from '../receipt/layout.js';
|
|
3
|
+
/**
|
|
4
|
+
* Netzwerk-Bondrucker ueber Epson "Server Direct Print": das Backend fuehrt
|
|
5
|
+
* je Konto Drucker mit einer geheimen Abhol-URL; die Kasse legt Druckjobs
|
|
6
|
+
* aus einem Zeilenmodell an, der Drucker holt sie selbst ab (alle paar
|
|
7
|
+
* Sekunden) und meldet das Ergebnis. So druckt jeder Browser -- ohne lokale
|
|
8
|
+
* Software. Das ePOS-XML baut das Backend aus dem Zeichenraster (ein Setzweg).
|
|
9
|
+
*/
|
|
10
|
+
export interface NetzDrucker {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
art: string;
|
|
14
|
+
papier: 'mm58' | 'mm80';
|
|
15
|
+
aktiv: boolean;
|
|
16
|
+
erstellt: number | null;
|
|
17
|
+
/** Letzter Abruf des Druckers (ms); null = noch nie verbunden. */
|
|
18
|
+
zuletztGesehen: number | null;
|
|
19
|
+
zuletztErgebnis: {
|
|
20
|
+
erfolg: boolean;
|
|
21
|
+
code: string | null;
|
|
22
|
+
zeit: number;
|
|
23
|
+
} | null;
|
|
24
|
+
/** Kennung, die der Drucker selbst schickt (Feld ID im Drucker-Menue). */
|
|
25
|
+
druckerKennung: string | null;
|
|
26
|
+
/** Abhol-URL fuer das Drucker-Menue -- nur fuer den Chef/das Konto. */
|
|
27
|
+
sdpUrl?: string;
|
|
28
|
+
}
|
|
29
|
+
export type DruckJobStatus = 'offen' | 'gesendet' | 'gedruckt' | 'fehler' | 'abgelaufen';
|
|
30
|
+
export interface DruckJob {
|
|
31
|
+
jobId: string;
|
|
32
|
+
status: DruckJobStatus;
|
|
33
|
+
erstellt?: number | null;
|
|
34
|
+
gesendetAt?: number | null;
|
|
35
|
+
ergebnis: {
|
|
36
|
+
erfolg: boolean;
|
|
37
|
+
code: string | null;
|
|
38
|
+
status?: string | null;
|
|
39
|
+
zeit?: number;
|
|
40
|
+
} | null;
|
|
41
|
+
}
|
|
42
|
+
export declare function listMyPrinters(rufen: KasseneckTransport): Promise<NetzDrucker[]>;
|
|
43
|
+
export interface CreatePrintJobOptions {
|
|
44
|
+
druckerId: string;
|
|
45
|
+
layout: ReceiptLayout;
|
|
46
|
+
receiptId?: string;
|
|
47
|
+
titel?: string;
|
|
48
|
+
quelle?: string;
|
|
49
|
+
}
|
|
50
|
+
export declare function createPrintJob(rufen: KasseneckTransport, o: CreatePrintJobOptions): Promise<DruckJob>;
|
|
51
|
+
export declare function getPrintJob(rufen: KasseneckTransport, o: {
|
|
52
|
+
druckerId: string;
|
|
53
|
+
jobId: string;
|
|
54
|
+
}): Promise<DruckJob>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const text = (v) => (typeof v === 'string' && v ? v : null);
|
|
2
|
+
const zahl = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : null);
|
|
3
|
+
export async function listMyPrinters(rufen) {
|
|
4
|
+
const daten = await rufen('listMyPrinters', {});
|
|
5
|
+
return (daten?.drucker ?? []).map((r) => {
|
|
6
|
+
const d = (r ?? {});
|
|
7
|
+
const e = d.zuletztErgebnis && typeof d.zuletztErgebnis === 'object' ? d.zuletztErgebnis : null;
|
|
8
|
+
return {
|
|
9
|
+
id: String(d.id ?? ''), name: String(d.name ?? ''), art: String(d.art ?? 'epson-sdp'), papier: d.papier === 'mm58' ? 'mm58' : 'mm80',
|
|
10
|
+
aktiv: d.aktiv !== false, erstellt: zahl(d.erstellt), zuletztGesehen: zahl(d.zuletztGesehen),
|
|
11
|
+
zuletztErgebnis: e ? { erfolg: e.erfolg === true, code: text(e.code), zeit: zahl(e.zeit) ?? 0 } : null,
|
|
12
|
+
druckerKennung: text(d.druckerKennung),
|
|
13
|
+
...(text(d.sdpUrl) ? { sdpUrl: String(d.sdpUrl) } : {}),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export async function createPrintJob(rufen, o) {
|
|
18
|
+
const params = { druckerId: o.druckerId, layout: o.layout };
|
|
19
|
+
if (o.receiptId)
|
|
20
|
+
params.receiptId = o.receiptId;
|
|
21
|
+
if (o.titel)
|
|
22
|
+
params.titel = o.titel;
|
|
23
|
+
if (o.quelle)
|
|
24
|
+
params.quelle = o.quelle;
|
|
25
|
+
const daten = await rufen('createPrintJob', params);
|
|
26
|
+
return { jobId: String(daten?.jobId ?? ''), status: text(daten?.status) ?? 'offen', ergebnis: null };
|
|
27
|
+
}
|
|
28
|
+
export async function getPrintJob(rufen, o) {
|
|
29
|
+
const d = await rufen('getPrintJob', { druckerId: o.druckerId, jobId: o.jobId });
|
|
30
|
+
const e = d?.ergebnis && typeof d.ergebnis === 'object' ? d.ergebnis : null;
|
|
31
|
+
return {
|
|
32
|
+
jobId: String(d?.jobId ?? o.jobId), status: text(d?.status) ?? 'offen',
|
|
33
|
+
erstellt: zahl(d?.erstellt), gesendetAt: zahl(d?.gesendetAt),
|
|
34
|
+
ergebnis: e ? { erfolg: e.erfolg === true, code: text(e.code), status: text(e.status), zeit: zahl(e.zeit) ?? undefined } : null,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kachel-Kasse: Einstellungen, Artikelgruppen/Artikel fuer Kacheln,
|
|
3
|
+
* Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
|
|
4
|
+
* (die Rewrites-Waechter der Web-App leiten daraus ab).
|
|
5
|
+
*/
|
|
6
|
+
export { type KasseStil, type KasseSchrift, type KasseWasserzeichen, type KasseMenge, type KasseTgModus, type KasseKassierenModus, type KasseKartenanbieter, KARTENANBIETER, type KasseBelegAusgabe, type KasseTastenAktion, type KasseTastenkarte, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, type KasseLayout, type KasseKatpos, type KasseHoehe, type KasseDruckerArt, type KassePapier, type KasseZeichensatz, type KasseSchnitt, type KasseLadeAuto, type Schalterkarte, type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, } from './settings.js';
|
|
7
|
+
export { type ArticleGroup, type ArticleGroupPayload, fromArticleGroupPayload, type KasseArtikel, type KasseArtikelPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, type Mengenregel, type MengenVorgabe, mengenregelFuerEinheit, mengenVorgabe, mengeErlaubt, } from './artikel.js';
|
|
8
|
+
export { getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings } from './client.js';
|
|
9
|
+
export { verteileRabatt } from '../receipt/discount.js';
|
|
10
|
+
export { cancelScopeOf, receiptsScopeOf, type RegisterScope, type RegisterUserPerms } from '../register/pairing.js';
|
|
11
|
+
export { type NetzDrucker, type DruckJob, type DruckJobStatus, type CreatePrintJobOptions, listMyPrinters, createPrintJob, getPrintJob } from './drucker.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kachel-Kasse: Einstellungen, Artikelgruppen/Artikel fuer Kacheln,
|
|
3
|
+
* Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
|
|
4
|
+
* (die Rewrites-Waechter der Web-App leiten daraus ab).
|
|
5
|
+
*/
|
|
6
|
+
export { KARTENANBIETER, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, } from './settings.js';
|
|
7
|
+
export { fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, mengenregelFuerEinheit, mengenVorgabe, mengeErlaubt, } from './artikel.js';
|
|
8
|
+
export { getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings } from './client.js';
|
|
9
|
+
export { verteileRabatt } from '../receipt/discount.js';
|
|
10
|
+
// Reichweiten der Kassen-Rechte (Migration wie im Backend) -- bewusst NICHT im
|
|
11
|
+
// Register-Unterpfad: dessen Exportnamen sind 1:1 Function-Namen (Rewrites).
|
|
12
|
+
export { cancelScopeOf, receiptsScopeOf } from '../register/pairing.js';
|
|
13
|
+
export { listMyPrinters, createPrintJob, getPrintJob } from './drucker.js';
|
|
@@ -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,58 @@
|
|
|
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 const KARTENANBIETER = ['keiner', 'extern', 'hobex', 'mypos', 'stripe'];
|
|
11
|
+
export const KASSE_TASTEN_AKTIONEN = ['kassieren', 'abschliessen', 'abbrechen', 'frei', 'bar', 'karte', 'passend', 'belege', 'letzteZurueck'];
|
|
12
|
+
export const KASSE_TASTEN_STANDARD = Object.freeze({
|
|
13
|
+
kassieren: ['Enter'], abschliessen: ['Enter'], abbrechen: ['Escape'],
|
|
14
|
+
frei: ['Mod+F'], bar: ['Mod+B'], karte: ['Mod+K'], passend: ['Mod+P'],
|
|
15
|
+
belege: ['Mod+E'], letzteZurueck: ['Mod+Backspace'],
|
|
16
|
+
});
|
|
17
|
+
export const KASSE_BETRIEB_STANDARD = Object.freeze({
|
|
18
|
+
logoText: 'K', logoAn: true, logoGroesse: 'M', wasserzeichen: 'anmeldung', farbe: '#1B46F5',
|
|
19
|
+
stil: 'klar', schrift: 'M', schriftEinst: 'S', kachelstil: 'streifen', uhr: true,
|
|
20
|
+
sperrbild: true, foto: true, autoAbMin: 0, abNachVerkauf: false, schnellLogin: true,
|
|
21
|
+
preisAnzeigen: true, ustAnzeigen: false, emoji: true, katFarben: true, freiErlaubt: true,
|
|
22
|
+
saetze: { 20: true, 13: true, 10: true, 4.9: true, 0: true, 19: false },
|
|
23
|
+
menge: 'x', notiz: false, suche: false, rabatt: 'aus',
|
|
24
|
+
zahlBar: true, zahlKarte: false, kartenanbieter: 'keiner', trinkgeld: false, tgModus: 'beides',
|
|
25
|
+
tgStufen: { 5: true, 10: true, 15: false, 20: false }, tgChips: [5, 10], tgSplit: true, rueckgeld: true,
|
|
26
|
+
schnellbar: false, kassierenModus: 'seite',
|
|
27
|
+
belegAusgabe: 'qr', fertigSekunden: 0,
|
|
28
|
+
});
|
|
29
|
+
export const KASSE_GERAET_STANDARD = Object.freeze({
|
|
30
|
+
layout: 'rechts', katpos: 'oben', spaltenExtra: 0, hoehe: 'M', touch: false,
|
|
31
|
+
tasten: { ...KASSE_TASTEN_STANDARD },
|
|
32
|
+
druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerId: '', druckerDevid: 'local_printer',
|
|
33
|
+
papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial',
|
|
34
|
+
ladeAn: false, ladeAuto: 'bar',
|
|
35
|
+
terminalIp: '', terminalPort: 20008,
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Standard + gespeichert. Landkarten (`saetze`, `tgStufen`) werden je Schluessel
|
|
39
|
+
* gemischt, damit neue Saetze beim Altbestand ankommen; unbekannte Schluessel
|
|
40
|
+
* bleiben draussen (die Wahrheit ueber Gueltigkeit hat der Server).
|
|
41
|
+
*/
|
|
42
|
+
export function mergeKasseSettings(standard, gespeichert) {
|
|
43
|
+
const out = JSON.parse(JSON.stringify(standard));
|
|
44
|
+
if (gespeichert && typeof gespeichert === 'object') {
|
|
45
|
+
for (const [key, wert] of Object.entries(gespeichert)) {
|
|
46
|
+
if (!(key in out))
|
|
47
|
+
continue;
|
|
48
|
+
const alt = out[key];
|
|
49
|
+
if (alt && typeof alt === 'object' && !Array.isArray(alt) && wert && typeof wert === 'object' && !Array.isArray(wert)) {
|
|
50
|
+
out[key] = { ...alt, ...wert };
|
|
51
|
+
}
|
|
52
|
+
else if (wert !== undefined) {
|
|
53
|
+
out[key] = wert;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|