@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,108 @@
|
|
|
1
|
+
import { ReceiptType, KeckPaymentMethod, CreditCardProvider } from '../enums/index.js';
|
|
2
|
+
import { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead } from './receipt-item.js';
|
|
3
|
+
import { type Voucher, type VoucherPayload } from './voucher.js';
|
|
4
|
+
import type { Cancellation, CancellationOf, CancellationReason } from './cancellation.js';
|
|
5
|
+
import { type ZeroKind } from './receipt-summary.js';
|
|
6
|
+
/**
|
|
7
|
+
* Beleg — Zwilling der Beleg-Nutzlast von `KasseneckReceipt` in
|
|
8
|
+
* kasseneck_api/lib/models/kasseneck_receipt.dart (nur der signatur-/
|
|
9
|
+
* positionsrelevante Teil, den `toReceiptJson()`/die `receipt`-Map von
|
|
10
|
+
* `fromJson()` traegt — nicht die Firmen-/Druckdaten wie Firma, Adresse oder
|
|
11
|
+
* Fusszeilen: die betreffen ausschliesslich das Beleg-Rendering und gehoeren
|
|
12
|
+
* nicht zum RKSV-Kernbeleg. Sie stehen als eigenes Modell daneben, siehe
|
|
13
|
+
* `ReceiptCompany` in ./receipt-company.ts).
|
|
14
|
+
*
|
|
15
|
+
* `timeStamp` bleibt bewusst der rohe Zeitstempel-String aus der Nutzlast;
|
|
16
|
+
* `parseServerTimeStamp` (`../vienna-time.js`) deutet ihn auf Wunsch in einen
|
|
17
|
+
* echten Zeitpunkt um (uneinheitliches Server-Format, siehe dort).
|
|
18
|
+
*
|
|
19
|
+
* `paymentMethod`/`receiptType`/`creditCardProvider` sind beim Lesen entweder
|
|
20
|
+
* der bekannte Enum-Eintrag oder — bei einem der Nutzlast unbekannten
|
|
21
|
+
* Schluessel — der rohe String (siehe `enum-payload.ts`, `readEnumKey`).
|
|
22
|
+
*/
|
|
23
|
+
export interface Receipt {
|
|
24
|
+
receiptId: string;
|
|
25
|
+
cashregisterId: string;
|
|
26
|
+
timeStamp: string;
|
|
27
|
+
items: ReceiptItem[];
|
|
28
|
+
vouchers: Voucher[];
|
|
29
|
+
paymentMethod: KeckPaymentMethod | string;
|
|
30
|
+
turnoverCounterAES256ICM: string;
|
|
31
|
+
signaturePreviousReceipt: string;
|
|
32
|
+
certificateSerialNumber: string;
|
|
33
|
+
receiptType: ReceiptType | string;
|
|
34
|
+
sig: string;
|
|
35
|
+
qr: string;
|
|
36
|
+
fullReceiptId: string;
|
|
37
|
+
creditCardProvider?: CreditCardProvider | string;
|
|
38
|
+
cardPaymentId?: string;
|
|
39
|
+
cardPaymentData?: Record<string, unknown>;
|
|
40
|
+
customerDetails: string[];
|
|
41
|
+
legalMessage: string[];
|
|
42
|
+
signatureSuccess?: boolean;
|
|
43
|
+
customProjectId?: string;
|
|
44
|
+
/** Nur am Storno-Beleg: das stornierte Original. */
|
|
45
|
+
cancellationOf?: CancellationOf;
|
|
46
|
+
/** Nur am Storno-Beleg: Grund-Code aus [CANCELLATION_REASONS]. */
|
|
47
|
+
cancellationReason?: CancellationReason | string;
|
|
48
|
+
/** Nur am Original: alle (Teil-)Stornos, Quelle der Restmengen. */
|
|
49
|
+
cancellations?: Cancellation[];
|
|
50
|
+
/** Nur an Nullbelegen: Anlass (monthly, annual, annual_replacement, outage_end, final, manual). */
|
|
51
|
+
zeroKind?: ZeroKind;
|
|
52
|
+
}
|
|
53
|
+
export interface ReceiptPayload {
|
|
54
|
+
qr: string;
|
|
55
|
+
sig: string;
|
|
56
|
+
certificateSerialNumber: string;
|
|
57
|
+
signaturePreviousReceipt: string;
|
|
58
|
+
turnoverCounterAES256ICM: string;
|
|
59
|
+
paymentMethod: string;
|
|
60
|
+
items: ReceiptItemPayload[];
|
|
61
|
+
vouchers: VoucherPayload[] | null;
|
|
62
|
+
timeStamp: string;
|
|
63
|
+
cashregisterId: string;
|
|
64
|
+
receiptType: string;
|
|
65
|
+
receiptId: string;
|
|
66
|
+
fullReceiptId: string;
|
|
67
|
+
creditCardProvider: string | null;
|
|
68
|
+
cardPaymentId: string | null;
|
|
69
|
+
cardPaymentData: Record<string, unknown> | null;
|
|
70
|
+
customerDetails: string;
|
|
71
|
+
legalMessage: string;
|
|
72
|
+
signatureSuccess: boolean | null;
|
|
73
|
+
customProjectId: string | null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Nutzlast-Form, die dieses Paket **liest**. Unterscheidet sich von
|
|
77
|
+
* [ReceiptPayload] bei den Positionen: ein gespeicherter Beleg traegt sie in
|
|
78
|
+
* der v1-Form, die das Backend ablegt (siehe [ReceiptItemPayloadRead]).
|
|
79
|
+
* Nullbelege haben ueberhaupt keine Positionen.
|
|
80
|
+
*/
|
|
81
|
+
export interface ReceiptPayloadRead extends Omit<ReceiptPayload, 'items' | 'vouchers'> {
|
|
82
|
+
items?: ReceiptItemPayloadRead[] | null;
|
|
83
|
+
vouchers?: VoucherPayload[] | null;
|
|
84
|
+
cancellationOf?: CancellationOf | null;
|
|
85
|
+
cancellationReason?: string | null;
|
|
86
|
+
zeroKind?: string | null;
|
|
87
|
+
cancellations?: Cancellation[] | null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Schreibt die Nutzlast in der **neuen** Form — sie **normalisiert, statt zu
|
|
91
|
+
* spiegeln**: ein Beleg, der in der v1-Positionsform gelesen wurde, geht hier
|
|
92
|
+
* in der v2-Form wieder hinaus (wie im Flutter-Vorbild, dessen `toJson` v2
|
|
93
|
+
* schreibt und dessen `fromJson` beide Formen liest). Nutzlast rein -> Beleg
|
|
94
|
+
* -> Nutzlast raus ist deshalb kein Rundtrip, wenn die Eingabe v1 war.
|
|
95
|
+
*
|
|
96
|
+
* Fuer dieses Paket ohne Folgen: Belege gehen ausschliesslich ueber
|
|
97
|
+
* `createReceipt` an den Server, das seine Nutzlast selbst baut.
|
|
98
|
+
*/
|
|
99
|
+
export declare function toReceiptPayload(receipt: Receipt): ReceiptPayload;
|
|
100
|
+
export declare function fromReceiptPayload(payload: ReceiptPayloadRead): Receipt;
|
|
101
|
+
/**
|
|
102
|
+
* Zwischensumme in **Cent** — Positionen plus verkaufte Wertgutscheine minus
|
|
103
|
+
* eingeloeste Promotionsgutscheine. Wertgutschein-Einloesungen wirken erst auf
|
|
104
|
+
* [receiptSumCents], nicht hier (siehe Dart-Vorbild `subSumCents`/`sumCents`).
|
|
105
|
+
*/
|
|
106
|
+
export declare function receiptSubSumCents(receipt: Receipt): number;
|
|
107
|
+
/** Gesamtsumme in **Cent** — Zwischensumme minus eingeloeste Wertgutscheine. */
|
|
108
|
+
export declare function receiptSumCents(receipt: Receipt): number;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toReceiptPayload = toReceiptPayload;
|
|
4
|
+
exports.fromReceiptPayload = fromReceiptPayload;
|
|
5
|
+
exports.receiptSubSumCents = receiptSubSumCents;
|
|
6
|
+
exports.receiptSumCents = receiptSumCents;
|
|
7
|
+
const index_js_1 = require("../enums/index.js");
|
|
8
|
+
const enum_payload_js_1 = require("./enum-payload.js");
|
|
9
|
+
const receipt_item_js_1 = require("./receipt-item.js");
|
|
10
|
+
const voucher_js_1 = require("./voucher.js");
|
|
11
|
+
const receipt_summary_js_1 = require("./receipt-summary.js");
|
|
12
|
+
/**
|
|
13
|
+
* Schreibt die Nutzlast in der **neuen** Form — sie **normalisiert, statt zu
|
|
14
|
+
* spiegeln**: ein Beleg, der in der v1-Positionsform gelesen wurde, geht hier
|
|
15
|
+
* in der v2-Form wieder hinaus (wie im Flutter-Vorbild, dessen `toJson` v2
|
|
16
|
+
* schreibt und dessen `fromJson` beide Formen liest). Nutzlast rein -> Beleg
|
|
17
|
+
* -> Nutzlast raus ist deshalb kein Rundtrip, wenn die Eingabe v1 war.
|
|
18
|
+
*
|
|
19
|
+
* Fuer dieses Paket ohne Folgen: Belege gehen ausschliesslich ueber
|
|
20
|
+
* `createReceipt` an den Server, das seine Nutzlast selbst baut.
|
|
21
|
+
*/
|
|
22
|
+
function toReceiptPayload(receipt) {
|
|
23
|
+
// Schreibpfad bleibt streng: ReceiptType/KeckPaymentMethod sind bekannt am
|
|
24
|
+
// Objekt-Charakter erkennbar (defineEnum-Eintraege); ein roher String muss
|
|
25
|
+
// erst durch den Lookup, sonst wirft er.
|
|
26
|
+
const paymentMethod = typeof receipt.paymentMethod === 'object' ? receipt.paymentMethod : (0, enum_payload_js_1.requireEnumKey)(index_js_1.KeckPaymentMethod, receipt.paymentMethod, 'Zahlungsart');
|
|
27
|
+
const receiptType = typeof receipt.receiptType === 'object' ? receipt.receiptType : (0, enum_payload_js_1.requireEnumKey)(index_js_1.ReceiptType, receipt.receiptType, 'Belegtyp');
|
|
28
|
+
return {
|
|
29
|
+
qr: receipt.qr,
|
|
30
|
+
sig: receipt.sig,
|
|
31
|
+
certificateSerialNumber: receipt.certificateSerialNumber,
|
|
32
|
+
signaturePreviousReceipt: receipt.signaturePreviousReceipt,
|
|
33
|
+
turnoverCounterAES256ICM: receipt.turnoverCounterAES256ICM,
|
|
34
|
+
paymentMethod: paymentMethod.value,
|
|
35
|
+
items: receipt.items.map(receipt_item_js_1.toReceiptItemPayload),
|
|
36
|
+
vouchers: receipt.vouchers.map(voucher_js_1.toVoucherPayload),
|
|
37
|
+
timeStamp: receipt.timeStamp,
|
|
38
|
+
cashregisterId: receipt.cashregisterId,
|
|
39
|
+
receiptType: receiptType.value,
|
|
40
|
+
receiptId: receipt.receiptId,
|
|
41
|
+
fullReceiptId: receipt.fullReceiptId,
|
|
42
|
+
// CreditCardProvider ist ein flacher String-Enum (kein Objekt-Charakter) —
|
|
43
|
+
// der Lookup entscheidet hier ausnahmslos, bekannt oder nicht.
|
|
44
|
+
creditCardProvider: receipt.creditCardProvider != null ? (0, enum_payload_js_1.requireEnumKey)(index_js_1.CreditCardProvider, receipt.creditCardProvider, 'Kartenanbieter') : null,
|
|
45
|
+
cardPaymentId: receipt.cardPaymentId ?? null,
|
|
46
|
+
cardPaymentData: receipt.cardPaymentData ?? null,
|
|
47
|
+
customerDetails: receipt.customerDetails.join('\n'),
|
|
48
|
+
legalMessage: receipt.legalMessage.join('\n'),
|
|
49
|
+
signatureSuccess: receipt.signatureSuccess ?? null,
|
|
50
|
+
customProjectId: receipt.customProjectId ?? null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Nullbelege haben keine Positionen -> items kann fehlen/null sein (siehe Dart-Vorbild).
|
|
54
|
+
const leereZeile = (text) => (text ? text.split('\n') : []);
|
|
55
|
+
function fromReceiptPayload(payload) {
|
|
56
|
+
return {
|
|
57
|
+
receiptId: payload.receiptId,
|
|
58
|
+
cashregisterId: payload.cashregisterId,
|
|
59
|
+
timeStamp: payload.timeStamp,
|
|
60
|
+
items: (payload.items ?? []).map(receipt_item_js_1.fromReceiptItemPayload),
|
|
61
|
+
vouchers: (payload.vouchers ?? []).map(voucher_js_1.fromVoucherPayload),
|
|
62
|
+
paymentMethod: (0, enum_payload_js_1.readEnumKey)(index_js_1.KeckPaymentMethod, payload.paymentMethod),
|
|
63
|
+
turnoverCounterAES256ICM: payload.turnoverCounterAES256ICM,
|
|
64
|
+
signaturePreviousReceipt: payload.signaturePreviousReceipt,
|
|
65
|
+
certificateSerialNumber: payload.certificateSerialNumber,
|
|
66
|
+
receiptType: (0, enum_payload_js_1.readEnumKey)(index_js_1.ReceiptType, payload.receiptType),
|
|
67
|
+
sig: payload.sig,
|
|
68
|
+
qr: payload.qr,
|
|
69
|
+
fullReceiptId: payload.fullReceiptId ?? '',
|
|
70
|
+
creditCardProvider: payload.creditCardProvider != null ? (0, enum_payload_js_1.readEnumKey)(index_js_1.CreditCardProvider, payload.creditCardProvider) : undefined,
|
|
71
|
+
cardPaymentId: payload.cardPaymentId ?? undefined,
|
|
72
|
+
cardPaymentData: payload.cardPaymentData ?? undefined,
|
|
73
|
+
customerDetails: leereZeile(payload.customerDetails),
|
|
74
|
+
legalMessage: leereZeile(payload.legalMessage),
|
|
75
|
+
signatureSuccess: payload.signatureSuccess ?? undefined,
|
|
76
|
+
customProjectId: payload.customProjectId ?? undefined,
|
|
77
|
+
...(payload.cancellationOf ? { cancellationOf: { receiptId: payload.cancellationOf.receiptId, fullReceiptId: payload.cancellationOf.fullReceiptId ?? null } } : {}),
|
|
78
|
+
...(payload.cancellationReason ? { cancellationReason: payload.cancellationReason } : {}),
|
|
79
|
+
...((0, receipt_summary_js_1.istZeroKind)(payload.zeroKind) ? { zeroKind: payload.zeroKind } : {}),
|
|
80
|
+
...(payload.cancellations ? { cancellations: payload.cancellations.map(leseStorno) } : {}),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function leseStorno(eintrag) {
|
|
84
|
+
return {
|
|
85
|
+
...(eintrag.receiptId !== undefined ? { receiptId: eintrag.receiptId } : {}),
|
|
86
|
+
...(eintrag.pending === true ? { pending: true } : {}),
|
|
87
|
+
at: Number(eintrag.at ?? 0),
|
|
88
|
+
by: eintrag.by ?? null,
|
|
89
|
+
note: eintrag.note ?? null,
|
|
90
|
+
items: (eintrag.items ?? []).map((p) => ({ index: Number(p.index), quantity: Number(p.quantity) })),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Zwischensumme in **Cent** — Positionen plus verkaufte Wertgutscheine minus
|
|
95
|
+
* eingeloeste Promotionsgutscheine. Wertgutschein-Einloesungen wirken erst auf
|
|
96
|
+
* [receiptSumCents], nicht hier (siehe Dart-Vorbild `subSumCents`/`sumCents`).
|
|
97
|
+
*/
|
|
98
|
+
function receiptSubSumCents(receipt) {
|
|
99
|
+
let cents = receipt.items.reduce((acc, item) => acc + (0, receipt_item_js_1.receiptItemTotalCents)(item), 0);
|
|
100
|
+
for (const voucher of receipt.vouchers) {
|
|
101
|
+
if (voucher.action === index_js_1.VoucherAction.redeem && voucher.type === index_js_1.VoucherType.promo) {
|
|
102
|
+
cents -= voucher.valueCents ?? 0;
|
|
103
|
+
}
|
|
104
|
+
if (voucher.action === index_js_1.VoucherAction.sell && voucher.type === index_js_1.VoucherType.value) {
|
|
105
|
+
cents += voucher.valueCents ?? 0;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return cents;
|
|
109
|
+
}
|
|
110
|
+
/** Gesamtsumme in **Cent** — Zwischensumme minus eingeloeste Wertgutscheine. */
|
|
111
|
+
function receiptSumCents(receipt) {
|
|
112
|
+
let cents = receiptSubSumCents(receipt);
|
|
113
|
+
for (const voucher of receipt.vouchers) {
|
|
114
|
+
if (voucher.action === index_js_1.VoucherAction.redeem && voucher.type === index_js_1.VoucherType.value) {
|
|
115
|
+
cents -= voucher.valueCents ?? 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return cents;
|
|
119
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Berichtsmonat — Zwilling von `ReportMonth` in
|
|
3
|
+
* kasseneck_api/lib/models/report_month.dart.
|
|
4
|
+
*
|
|
5
|
+
* Hat im Dart-Vorbild bewusst **keine** JSON-Nutzlast (kein `fromJson`/
|
|
6
|
+
* `toJson`) — es ist ein reiner Kalender-Werttyp fuer Monats-Arithmetik und
|
|
7
|
+
* Anzeige, kein Beleg-/Backend-Feld. `month` ist die Monatszahl 1-12
|
|
8
|
+
* (entspricht `KeckMonth.id` im Flutter-Paket) statt eines eigenen Enums —
|
|
9
|
+
* ein eigenes `KeckMonth`-Enum wuerde hier nur fuer diesen einen Werttyp
|
|
10
|
+
* Maschinerie aufbauen, die niemand sonst braucht.
|
|
11
|
+
*/
|
|
12
|
+
export interface ReportMonth {
|
|
13
|
+
month: number;
|
|
14
|
+
year: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Berichtsmonat eines Zeitpunkts — eingeordnet nach **Wiener** Zeit, nicht
|
|
18
|
+
* nach der Zeitzone des ausfuehrenden Rechners.
|
|
19
|
+
*
|
|
20
|
+
* Der Geschaeftsmonat ist ein oesterreichischer Kalenderwert: ein Beleg vom
|
|
21
|
+
* 1. Maerz 00:30 Wiener Zeit gehoert in den Maerz, auch wenn derselbe
|
|
22
|
+
* Zeitpunkt in UTC noch im Februar liegt. Die eingebauten
|
|
23
|
+
* `getMonth()`/`getFullYear()` wuerden ihn auf einer UTC-Maschine in den
|
|
24
|
+
* Februar legen und den Monatsbericht auf den falschen Monat schicken.
|
|
25
|
+
*/
|
|
26
|
+
export declare function reportMonthFromDate(date: Date): ReportMonth;
|
|
27
|
+
export declare function previousReportMonth(rm: ReportMonth): ReportMonth;
|
|
28
|
+
export declare function nextReportMonth(rm: ReportMonth): ReportMonth;
|
|
29
|
+
/** Schluessel-Format wie `ReportMonth.toString()` im Flutter-Paket, z. B. `"march_2026"`. */
|
|
30
|
+
export declare function reportMonthKey(rm: ReportMonth): string;
|
|
31
|
+
/** Deutsches Anzeige-Format wie `ReportMonth.readable` im Flutter-Paket, z. B. `"März 2026"`. */
|
|
32
|
+
export declare function reportMonthReadable(rm: ReportMonth): string;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reportMonthFromDate = reportMonthFromDate;
|
|
4
|
+
exports.previousReportMonth = previousReportMonth;
|
|
5
|
+
exports.nextReportMonth = nextReportMonth;
|
|
6
|
+
exports.reportMonthKey = reportMonthKey;
|
|
7
|
+
exports.reportMonthReadable = reportMonthReadable;
|
|
8
|
+
const vienna_time_js_1 = require("../vienna-time.js");
|
|
9
|
+
// Reihenfolge wie `KeckMonth.values` im Flutter-Paket (Index 0 = Januar).
|
|
10
|
+
const MONTH_KEYS = [
|
|
11
|
+
'january',
|
|
12
|
+
'february',
|
|
13
|
+
'march',
|
|
14
|
+
'april',
|
|
15
|
+
'may',
|
|
16
|
+
'june',
|
|
17
|
+
'july',
|
|
18
|
+
'august',
|
|
19
|
+
'september',
|
|
20
|
+
'october',
|
|
21
|
+
'november',
|
|
22
|
+
'december',
|
|
23
|
+
];
|
|
24
|
+
const MONTH_NAMES_DE = [
|
|
25
|
+
'Januar',
|
|
26
|
+
'Februar',
|
|
27
|
+
'März',
|
|
28
|
+
'April',
|
|
29
|
+
'Mai',
|
|
30
|
+
'Juni',
|
|
31
|
+
'Juli',
|
|
32
|
+
'August',
|
|
33
|
+
'September',
|
|
34
|
+
'Oktober',
|
|
35
|
+
'November',
|
|
36
|
+
'Dezember',
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Berichtsmonat eines Zeitpunkts — eingeordnet nach **Wiener** Zeit, nicht
|
|
40
|
+
* nach der Zeitzone des ausfuehrenden Rechners.
|
|
41
|
+
*
|
|
42
|
+
* Der Geschaeftsmonat ist ein oesterreichischer Kalenderwert: ein Beleg vom
|
|
43
|
+
* 1. Maerz 00:30 Wiener Zeit gehoert in den Maerz, auch wenn derselbe
|
|
44
|
+
* Zeitpunkt in UTC noch im Februar liegt. Die eingebauten
|
|
45
|
+
* `getMonth()`/`getFullYear()` wuerden ihn auf einer UTC-Maschine in den
|
|
46
|
+
* Februar legen und den Monatsbericht auf den falschen Monat schicken.
|
|
47
|
+
*/
|
|
48
|
+
function reportMonthFromDate(date) {
|
|
49
|
+
const wanduhr = (0, vienna_time_js_1.toViennaWallClock)(date);
|
|
50
|
+
return { month: wanduhr.month, year: wanduhr.year };
|
|
51
|
+
}
|
|
52
|
+
function previousReportMonth(rm) {
|
|
53
|
+
return rm.month === 1 ? { month: 12, year: rm.year - 1 } : { month: rm.month - 1, year: rm.year };
|
|
54
|
+
}
|
|
55
|
+
function nextReportMonth(rm) {
|
|
56
|
+
return rm.month === 12 ? { month: 1, year: rm.year + 1 } : { month: rm.month + 1, year: rm.year };
|
|
57
|
+
}
|
|
58
|
+
/** Schluessel-Format wie `ReportMonth.toString()` im Flutter-Paket, z. B. `"march_2026"`. */
|
|
59
|
+
function reportMonthKey(rm) {
|
|
60
|
+
return `${MONTH_KEYS[rm.month - 1]}_${rm.year}`;
|
|
61
|
+
}
|
|
62
|
+
/** Deutsches Anzeige-Format wie `ReportMonth.readable` im Flutter-Paket, z. B. `"März 2026"`. */
|
|
63
|
+
function reportMonthReadable(rm) {
|
|
64
|
+
return `${MONTH_NAMES_DE[rm.month - 1]} ${rm.year}`;
|
|
65
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stripe-Zahlungslink-Sitzung — Zwilling von `StripeUrlSession` in
|
|
3
|
+
* kasseneck_api/lib/models/stripe_url_seesion.dart.
|
|
4
|
+
*/
|
|
5
|
+
export interface StripeUrlSession {
|
|
6
|
+
id: string;
|
|
7
|
+
url: string;
|
|
8
|
+
shortenUrl: string;
|
|
9
|
+
expiresAt: Date;
|
|
10
|
+
}
|
|
11
|
+
export interface StripeUrlSessionPayload {
|
|
12
|
+
id: string;
|
|
13
|
+
url: string;
|
|
14
|
+
shorten_payment_url: string;
|
|
15
|
+
expires_at: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function toStripeUrlSessionPayload(session: StripeUrlSession): StripeUrlSessionPayload;
|
|
18
|
+
export declare function fromStripeUrlSessionPayload(payload: StripeUrlSessionPayload): StripeUrlSession;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toStripeUrlSessionPayload = toStripeUrlSessionPayload;
|
|
4
|
+
exports.fromStripeUrlSessionPayload = fromStripeUrlSessionPayload;
|
|
5
|
+
function toStripeUrlSessionPayload(session) {
|
|
6
|
+
return {
|
|
7
|
+
id: session.id,
|
|
8
|
+
url: session.url,
|
|
9
|
+
shorten_payment_url: session.shortenUrl,
|
|
10
|
+
expires_at: session.expiresAt.toISOString(),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function fromStripeUrlSessionPayload(payload) {
|
|
14
|
+
return {
|
|
15
|
+
id: payload.id,
|
|
16
|
+
url: payload.url,
|
|
17
|
+
shortenUrl: payload.shorten_payment_url,
|
|
18
|
+
expiresAt: new Date(payload.expires_at),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { VoucherAction, VoucherType } from '../enums/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Gutschein — Zwilling von `KeckVoucher` in
|
|
4
|
+
* kasseneck_api/lib/models/keck_voucher.dart.
|
|
5
|
+
*
|
|
6
|
+
* `valueCents` ist der Gutscheinwert in **Cent** (exakte Integer-Arithmetik).
|
|
7
|
+
*
|
|
8
|
+
* `action`/`type` sind schon im Dart-Vorbild reine Strings (keine
|
|
9
|
+
* Zusatzfelder) — beim Lesen bleibt ein unbekannter Wert deshalb ebenfalls
|
|
10
|
+
* einfach der rohe Nutzlast-String (siehe [readEnumKey]); ob er zu den
|
|
11
|
+
* bekannten Werten gehoert, entscheidet sich erst beim Schreiben.
|
|
12
|
+
*/
|
|
13
|
+
export interface Voucher {
|
|
14
|
+
name?: string;
|
|
15
|
+
code?: string;
|
|
16
|
+
action: VoucherAction | string;
|
|
17
|
+
type: VoucherType | string;
|
|
18
|
+
valueCents?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Nutzlast: traegt **beide** Felder, `value` (Euro) und `valueCents` (Cent).
|
|
22
|
+
* Das Backend erwartet das Euro-Feld weiterhin (Altkompatibilitaet) — die
|
|
23
|
+
* Umwandlung passiert nur hier, an dieser einen Stelle.
|
|
24
|
+
*/
|
|
25
|
+
export interface VoucherPayload {
|
|
26
|
+
name: string | null;
|
|
27
|
+
code: string | null;
|
|
28
|
+
action: string;
|
|
29
|
+
type: string;
|
|
30
|
+
value: number | null;
|
|
31
|
+
valueCents: number | null;
|
|
32
|
+
}
|
|
33
|
+
export declare function toVoucherPayload(voucher: Voucher): VoucherPayload;
|
|
34
|
+
/**
|
|
35
|
+
* Ist der Gutschein an das Backend sendbar? Zwilling von `KeckVoucher.isValid`
|
|
36
|
+
* im Flutter-Vorbild: Wert- und Promotionsgutscheine brauchen einen Wert,
|
|
37
|
+
* Promotionsgutscheine duerfen nur eingeloest (nicht verkauft) werden, und ein
|
|
38
|
+
* gesetzter Wert muss positiv sein.
|
|
39
|
+
*/
|
|
40
|
+
export declare function voucherIsValid(voucher: Voucher): boolean;
|
|
41
|
+
export declare function fromVoucherPayload(payload: VoucherPayload): Voucher;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toVoucherPayload = toVoucherPayload;
|
|
4
|
+
exports.voucherIsValid = voucherIsValid;
|
|
5
|
+
exports.fromVoucherPayload = fromVoucherPayload;
|
|
6
|
+
const index_js_1 = require("../enums/index.js");
|
|
7
|
+
const enum_payload_js_1 = require("./enum-payload.js");
|
|
8
|
+
function toVoucherPayload(voucher) {
|
|
9
|
+
return {
|
|
10
|
+
name: voucher.name ?? null,
|
|
11
|
+
code: voucher.code ?? null,
|
|
12
|
+
// Schreibpfad bleibt streng: action/type sehen fuer bekannte und
|
|
13
|
+
// unbekannte Werte gleich aus (reine Strings) — erst der Lookup hier
|
|
14
|
+
// entscheidet, ob geschrieben werden darf.
|
|
15
|
+
action: (0, enum_payload_js_1.requireEnumKey)(index_js_1.VoucherAction, voucher.action, 'Gutschein-Aktion'),
|
|
16
|
+
type: (0, enum_payload_js_1.requireEnumKey)(index_js_1.VoucherType, voucher.type, 'Gutscheinart'),
|
|
17
|
+
// Euro-Feld nur fuer Altbestand-Konsumenten des Backends — siehe Kommentar oben.
|
|
18
|
+
value: voucher.valueCents == null ? null : voucher.valueCents / 100,
|
|
19
|
+
valueCents: voucher.valueCents ?? null,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Ist der Gutschein an das Backend sendbar? Zwilling von `KeckVoucher.isValid`
|
|
24
|
+
* im Flutter-Vorbild: Wert- und Promotionsgutscheine brauchen einen Wert,
|
|
25
|
+
* Promotionsgutscheine duerfen nur eingeloest (nicht verkauft) werden, und ein
|
|
26
|
+
* gesetzter Wert muss positiv sein.
|
|
27
|
+
*/
|
|
28
|
+
function voucherIsValid(voucher) {
|
|
29
|
+
if (voucher.type === index_js_1.VoucherType.value && voucher.valueCents == null) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (voucher.type === index_js_1.VoucherType.promo && voucher.action !== index_js_1.VoucherAction.redeem) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (voucher.type === index_js_1.VoucherType.promo && voucher.valueCents == null) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
if (voucher.valueCents != null && voucher.valueCents <= 0) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
function fromVoucherPayload(payload) {
|
|
44
|
+
const valueCents = payload.valueCents != null
|
|
45
|
+
? payload.valueCents
|
|
46
|
+
: payload.value != null
|
|
47
|
+
? Math.round(payload.value * 100)
|
|
48
|
+
: undefined;
|
|
49
|
+
return {
|
|
50
|
+
name: payload.name ?? undefined,
|
|
51
|
+
code: payload.code ?? undefined,
|
|
52
|
+
action: (0, enum_payload_js_1.readEnumKey)(index_js_1.VoucherAction, payload.action),
|
|
53
|
+
type: (0, enum_payload_js_1.readEnumKey)(index_js_1.VoucherType, payload.type),
|
|
54
|
+
valueCents,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die Grenze zwischen Euro und Cent — an genau einer Stelle.
|
|
3
|
+
*
|
|
4
|
+
* Dieses Paket rechnet ausnahmslos in ganzen Cent (siehe README). Euro treten
|
|
5
|
+
* nur dort auf, wo eine fremde Schnittstelle sie verlangt oder liefert: die
|
|
6
|
+
* Belegliste des Backends sendet `total`/`umsatz` in Euro, das Hobex-Terminal
|
|
7
|
+
* nimmt `amount`/`tip` in Euro entgegen. Beide Richtungen stehen hier, damit
|
|
8
|
+
* die Umrechnung nicht in jeder Datei erneut auftaucht — und damit die
|
|
9
|
+
* Rundungsregel nur einmal entschieden ist.
|
|
10
|
+
*/
|
|
11
|
+
/** Cent -> Euro, fuer die Schnittstellen, die Euro verlangen. */
|
|
12
|
+
export declare function centsToEuro(cents: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Euro -> ganze Cent, fuer Betraege, die aus einer fremden Antwort kommen.
|
|
15
|
+
*
|
|
16
|
+
* Unbrauchbare Werte (fehlend, `null`, keine Zahl, NaN, Unendlich) ergeben 0:
|
|
17
|
+
* eine Belegliste darf nicht daran scheitern, dass ein einzelner Betrag fehlt.
|
|
18
|
+
*
|
|
19
|
+
* Gerundet wird **von der Null weg**, nicht mit `Math.round` — das schoebe
|
|
20
|
+
* `.5` immer Richtung +unendlich, und dann heben sich ein Beleg und sein
|
|
21
|
+
* Storno im Cent nicht mehr auf (dieselbe Regel wie in receipt/layout.ts).
|
|
22
|
+
*/
|
|
23
|
+
export declare function euroToCents(euro: unknown): number;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Die Grenze zwischen Euro und Cent — an genau einer Stelle.
|
|
4
|
+
*
|
|
5
|
+
* Dieses Paket rechnet ausnahmslos in ganzen Cent (siehe README). Euro treten
|
|
6
|
+
* nur dort auf, wo eine fremde Schnittstelle sie verlangt oder liefert: die
|
|
7
|
+
* Belegliste des Backends sendet `total`/`umsatz` in Euro, das Hobex-Terminal
|
|
8
|
+
* nimmt `amount`/`tip` in Euro entgegen. Beide Richtungen stehen hier, damit
|
|
9
|
+
* die Umrechnung nicht in jeder Datei erneut auftaucht — und damit die
|
|
10
|
+
* Rundungsregel nur einmal entschieden ist.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.centsToEuro = centsToEuro;
|
|
14
|
+
exports.euroToCents = euroToCents;
|
|
15
|
+
/** Cent -> Euro, fuer die Schnittstellen, die Euro verlangen. */
|
|
16
|
+
function centsToEuro(cents) {
|
|
17
|
+
return cents / 100;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Euro -> ganze Cent, fuer Betraege, die aus einer fremden Antwort kommen.
|
|
21
|
+
*
|
|
22
|
+
* Unbrauchbare Werte (fehlend, `null`, keine Zahl, NaN, Unendlich) ergeben 0:
|
|
23
|
+
* eine Belegliste darf nicht daran scheitern, dass ein einzelner Betrag fehlt.
|
|
24
|
+
*
|
|
25
|
+
* Gerundet wird **von der Null weg**, nicht mit `Math.round` — das schoebe
|
|
26
|
+
* `.5` immer Richtung +unendlich, und dann heben sich ein Beleg und sein
|
|
27
|
+
* Storno im Cent nicht mehr auf (dieselbe Regel wie in receipt/layout.ts).
|
|
28
|
+
*/
|
|
29
|
+
function euroToCents(euro) {
|
|
30
|
+
if (typeof euro !== 'number' || !Number.isFinite(euro)) {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
const cents = Math.round(Math.abs(euro) * 100);
|
|
34
|
+
return euro < 0 ? -cents : cents;
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type HobexReceipt } from '../models/index.js';
|
|
2
|
+
import type { KasseneckTransport } from '../client/transport.js';
|
|
3
|
+
/**
|
|
4
|
+
* Cent -> Euro. **Die einzige Umrechnungsstelle dieses Moduls.** Betraege
|
|
5
|
+
* werden im ganzen Paket in Cent gefuehrt (exakte Ganzzahl-Arithmetik); die
|
|
6
|
+
* Hobex-Schnittstelle erwartet dagegen Euro als Gleitkommazahl (`amount`,
|
|
7
|
+
* `tip`), und das Backend reicht sie unveraendert an Hobex weiter. Das
|
|
8
|
+
* Gegenstueck fuer die Antwortrichtung steht in models/hobex-receipt.ts.
|
|
9
|
+
*
|
|
10
|
+
* **Geerbte Ungenauigkeit, hier nicht behebbar:** das Backend addiert die
|
|
11
|
+
* beiden Euro-Werte serverseitig (`check.params.amount + check.params.tip`,
|
|
12
|
+
* functions/payment-endpoints.js) — aus 10,10 EUR und 0,20 EUR wird dort
|
|
13
|
+
* `10.299999999999999`. Jede Rundung auf dieser Seite wuerde daran nichts
|
|
14
|
+
* aendern, weil die Addition erst danach passiert; die saubere Loesung waere
|
|
15
|
+
* ein Cent-Feld am Backend.
|
|
16
|
+
*/
|
|
17
|
+
export interface HobexPayOptions {
|
|
18
|
+
/** Kennung der Zahlung — siehe [newHobexTransactionId]. */
|
|
19
|
+
transactionId: string;
|
|
20
|
+
/** Zu belastender Betrag in **Cent** (ohne Trinkgeld). */
|
|
21
|
+
amountCents: number;
|
|
22
|
+
/** Trinkgeld in **Cent**; Hobex belastet Betrag + Trinkgeld in einem. */
|
|
23
|
+
tipCents?: number;
|
|
24
|
+
/** Freier Verwendungszweck, den Hobex mitfuehrt (z. B. Tischnummer). */
|
|
25
|
+
reference?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface HobexRefundOptions {
|
|
28
|
+
/** Kennung der zu erstattenden Zahlung. */
|
|
29
|
+
transactionId: string;
|
|
30
|
+
/** Zu erstattender Betrag in **Cent** (ohne Trinkgeld). */
|
|
31
|
+
amountCents: number;
|
|
32
|
+
/** Zu erstattendes Trinkgeld in **Cent**. */
|
|
33
|
+
tipCents?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Zeit- und Zufallsquelle von [newHobexTransactionId] — fuer Tests einspeisbar. */
|
|
36
|
+
export interface HobexTransactionIdOptions {
|
|
37
|
+
/** Zeitpunkt der Kennung; ohne Angabe jetzt. */
|
|
38
|
+
now?: Date;
|
|
39
|
+
/** Zufallsquelle in `[0, 1)` wie `Math.random`; ohne Angabe `Math.random`. */
|
|
40
|
+
random?: () => number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Belastet eine Karte ueber die **Hobex-Cloud-API** und liefert den
|
|
44
|
+
* entstandenen [HobexReceipt].
|
|
45
|
+
*
|
|
46
|
+
* **Der Endpunkt heisst `hobexPayApi`** — mit Suffix; ohne ihn gibt es ihn
|
|
47
|
+
* nicht.
|
|
48
|
+
*/
|
|
49
|
+
export declare function hobexPay(rufen: KasseneckTransport, options: HobexPayOptions): Promise<HobexReceipt>;
|
|
50
|
+
/**
|
|
51
|
+
* Erstattet eine zuvor ueber die Hobex-Cloud getaetigte Zahlung. Das Backend
|
|
52
|
+
* storniert zuerst (Void, solange der Tagesabschluss aussteht) und erstattet
|
|
53
|
+
* erst danach.
|
|
54
|
+
*
|
|
55
|
+
* **Ohne Rueckgabewert, mit Absicht.** Das Vorbild liefert
|
|
56
|
+
* `resJson['status'] == 'success'`; in diesem Paket wirft die Fehlerhuelle
|
|
57
|
+
* schon im Transport, sobald der Status nicht ausdruecklich Erfolg ist. Ein
|
|
58
|
+
* Wahrheitswert waere hier also immer `true` — eine Luege ueber den
|
|
59
|
+
* Informationsgehalt, an der ein Aufrufer ein `if` aufhaengt, das nie greift.
|
|
60
|
+
* Misserfolg kommt als geworfener Fehler.
|
|
61
|
+
*
|
|
62
|
+
* **Der Endpunkt heisst `hobexRefundApi`** — mit Suffix.
|
|
63
|
+
*/
|
|
64
|
+
export declare function hobexRefund(rufen: KasseneckTransport, options: HobexRefundOptions): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Erzeugt eine neue Hobex-Transaktionskennung: 19 Ziffern aus Zeitanteil und
|
|
67
|
+
* Zufall (Zwilling von `newHobexTransactionId` im Vorbild, Zeile 522).
|
|
68
|
+
*
|
|
69
|
+
* Zwei bewusste Abweichungen:
|
|
70
|
+
*
|
|
71
|
+
* 1. **Wiener Wanduhrzeit statt Geraetezeit.** Das Vorbild nimmt
|
|
72
|
+
* `DateTime.now()` in der Zeitzone des Geraets; damit haetten zwei Kassen
|
|
73
|
+
* desselben Betriebs in verschiedenen Zeitzonen Kennungen, die sich um
|
|
74
|
+
* Stunden unterscheiden, und der Tageswechsel in der Kennung faende nicht
|
|
75
|
+
* zum Geschaeftstag statt. Fachlich ist Wien die Zeitzone (siehe
|
|
76
|
+
* vienna-time.ts) — und eine Browser-Kasse laeuft in der Zeitzone des Gasts,
|
|
77
|
+
* nicht des Betriebs.
|
|
78
|
+
* 2. **Millisekunden statt Mikrosekunden.** JavaScript hat keine
|
|
79
|
+
* Mikrosekunden-Uhr. Das Vorbild fuellt mit sechs Bruchteilsstellen auf und
|
|
80
|
+
* haengt zwei Zufallsziffern an, von denen die Laengenbegrenzung eine wieder
|
|
81
|
+
* abschneidet; hier stehen drei Bruchteilsstellen und vier Zufallsziffern.
|
|
82
|
+
* Laenge und Form (nur Ziffern, 19 Stellen, `JJMMTThhmmss` voran) bleiben
|
|
83
|
+
* gleich.
|
|
84
|
+
*
|
|
85
|
+
* Zeit- und Zufallsquelle sind einspeisbar, damit die Kennung pruefbar ist.
|
|
86
|
+
*/
|
|
87
|
+
export declare function newHobexTransactionId(options?: HobexTransactionIdOptions): string;
|