@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,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toHobexReceiptPayload = toHobexReceiptPayload;
|
|
4
|
+
exports.fromHobexReceiptPayload = fromHobexReceiptPayload;
|
|
5
|
+
exports.hobexReceiptToCardPaymentData = hobexReceiptToCardPaymentData;
|
|
6
|
+
exports.hobexReceiptNeedsSignature = hobexReceiptNeedsSignature;
|
|
7
|
+
const index_js_1 = require("../enums/index.js");
|
|
8
|
+
const money_js_1 = require("../money.js");
|
|
9
|
+
function toHobexReceiptPayload(beleg) {
|
|
10
|
+
return {
|
|
11
|
+
transactionId: beleg.transactionId,
|
|
12
|
+
tid: beleg.tid,
|
|
13
|
+
receipt: beleg.receipt,
|
|
14
|
+
approvalCode: beleg.approvalCode,
|
|
15
|
+
reference: beleg.reference ?? null,
|
|
16
|
+
transactionDate: beleg.transactionDate,
|
|
17
|
+
cardNumber: beleg.cardNumber,
|
|
18
|
+
cardExpiry: beleg.cardExpiry,
|
|
19
|
+
brand: beleg.brand,
|
|
20
|
+
cardIssuer: beleg.cardIssuer,
|
|
21
|
+
responseCode: beleg.responseCode,
|
|
22
|
+
transactionType: beleg.transactionType,
|
|
23
|
+
currency: beleg.currency,
|
|
24
|
+
// Euro-Umwandlung nur hier, an der Terminal-API-Grenze — siehe Kommentar oben.
|
|
25
|
+
amount: (0, money_js_1.centsToEuro)(beleg.amountCents),
|
|
26
|
+
tip: (0, money_js_1.centsToEuro)(beleg.tipCents),
|
|
27
|
+
cvm: beleg.cvm,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function fromHobexReceiptPayload(payload) {
|
|
31
|
+
return {
|
|
32
|
+
transactionId: payload.transactionId,
|
|
33
|
+
tid: payload.tid,
|
|
34
|
+
receipt: payload.receipt,
|
|
35
|
+
approvalCode: payload.approvalCode,
|
|
36
|
+
reference: payload.reference ?? undefined,
|
|
37
|
+
// Kappt Bruchteilssekunden/Offset und ersetzt "T" durch ein Leerzeichen,
|
|
38
|
+
// exakt wie im Dart-Vorbild (transactionDate.split('.')[0].replaceAll('T', ' ')).
|
|
39
|
+
transactionDate: payload.transactionDate.split('.')[0].split('T').join(' '),
|
|
40
|
+
cardNumber: payload.cardNumber,
|
|
41
|
+
cardExpiry: payload.cardExpiry,
|
|
42
|
+
brand: payload.brand,
|
|
43
|
+
cardIssuer: payload.cardIssuer,
|
|
44
|
+
responseCode: payload.responseCode,
|
|
45
|
+
transactionType: payload.transactionType,
|
|
46
|
+
currency: payload.currency,
|
|
47
|
+
amountCents: Math.round((payload.amount ?? 0) * 100),
|
|
48
|
+
tipCents: Math.round((payload.tip ?? 0) * 100),
|
|
49
|
+
cvm: String(payload.cvm),
|
|
50
|
+
// Die Cloud-API-Nutzlast traegt keinen eigenen Provider-Schluessel — der
|
|
51
|
+
// Provider ergibt sich aus dem Transportweg (Cloud vs. HPS), nicht aus
|
|
52
|
+
// dem JSON. Das Dart-Vorbild setzt ihn in `fromJson` deshalb ebenfalls
|
|
53
|
+
// nicht, sondern belaesst den Konstruktor-Default.
|
|
54
|
+
creditCardProvider: index_js_1.CreditCardProvider.hobexCloudApi,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Wandelt den Beleg in die `cardPaymentData`-Map, die auf dem Kasseneck-Beleg
|
|
59
|
+
* landet (siehe [Receipt.cardPaymentData]). Bei HPS-Zahlungen kommen weitere
|
|
60
|
+
* Felder dazu, die nur das lokale Terminal liefert.
|
|
61
|
+
*/
|
|
62
|
+
function hobexReceiptToCardPaymentData(beleg) {
|
|
63
|
+
const data = {
|
|
64
|
+
transactionId: beleg.transactionId,
|
|
65
|
+
date: beleg.transactionDate,
|
|
66
|
+
tid: beleg.tid,
|
|
67
|
+
no: beleg.receipt,
|
|
68
|
+
type: beleg.transactionType,
|
|
69
|
+
cardBrand: beleg.brand,
|
|
70
|
+
cardNumber: beleg.cardNumber,
|
|
71
|
+
responseCode: beleg.responseCode,
|
|
72
|
+
cvm: beleg.cvm,
|
|
73
|
+
};
|
|
74
|
+
if (beleg.creditCardProvider === index_js_1.CreditCardProvider.hobexHps) {
|
|
75
|
+
data.approvalCode = beleg.approvalCode;
|
|
76
|
+
data.cardExpiry = beleg.cardExpiry;
|
|
77
|
+
data.cardIssuer = beleg.cardIssuer;
|
|
78
|
+
data.amount = (0, money_js_1.centsToEuro)(beleg.amountCents).toFixed(2);
|
|
79
|
+
data.currency = beleg.currency;
|
|
80
|
+
}
|
|
81
|
+
return data;
|
|
82
|
+
}
|
|
83
|
+
/** Kartenzahlung erfordert eine Unterschrift (CVM-Code `"1"`). */
|
|
84
|
+
function hobexReceiptNeedsSignature(beleg) {
|
|
85
|
+
return beleg.cvm === '1';
|
|
86
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, } from './receipt-item.js';
|
|
2
|
+
export { type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid } from './voucher.js';
|
|
3
|
+
export { type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, } from './receipt.js';
|
|
4
|
+
export { type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, } from './cancellation.js';
|
|
5
|
+
export { type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, } from './receipt-company.js';
|
|
6
|
+
export { type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, } from './cashregister.js';
|
|
7
|
+
export { type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, istZeroKind } from './receipt-summary.js';
|
|
8
|
+
export { type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, } from './report-month.js';
|
|
9
|
+
export { type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, } from './stripe-url-session.js';
|
|
10
|
+
export { type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './hobex-receipt.js';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hobexReceiptNeedsSignature = exports.hobexReceiptToCardPaymentData = exports.fromHobexReceiptPayload = exports.toHobexReceiptPayload = exports.fromStripeUrlSessionPayload = exports.toStripeUrlSessionPayload = exports.reportMonthReadable = exports.reportMonthKey = exports.nextReportMonth = exports.previousReportMonth = exports.reportMonthFromDate = exports.istZeroKind = exports.ZERO_KINDS = exports.fromReceiptSummaryPayload = exports.fromCashregisterPayload = exports.receiptCompanyTaxInfo = exports.fromReceiptCompanyPayload = exports.remainingQuantities = exports.isCancellationReason = exports.CANCELLATION_RESERVATION_MS = exports.CANCELLATION_REASONS = exports.receiptSumCents = exports.receiptSubSumCents = exports.fromReceiptPayload = exports.toReceiptPayload = exports.voucherIsValid = exports.fromVoucherPayload = exports.toVoucherPayload = exports.negateReceiptItem = exports.receiptItemIsValid = exports.receiptItemTotalCents = exports.fromReceiptItemPayload = exports.toReceiptItemPayload = void 0;
|
|
4
|
+
var receipt_item_js_1 = require("./receipt-item.js");
|
|
5
|
+
Object.defineProperty(exports, "toReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.toReceiptItemPayload; } });
|
|
6
|
+
Object.defineProperty(exports, "fromReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.fromReceiptItemPayload; } });
|
|
7
|
+
Object.defineProperty(exports, "receiptItemTotalCents", { enumerable: true, get: function () { return receipt_item_js_1.receiptItemTotalCents; } });
|
|
8
|
+
Object.defineProperty(exports, "receiptItemIsValid", { enumerable: true, get: function () { return receipt_item_js_1.receiptItemIsValid; } });
|
|
9
|
+
Object.defineProperty(exports, "negateReceiptItem", { enumerable: true, get: function () { return receipt_item_js_1.negateReceiptItem; } });
|
|
10
|
+
var voucher_js_1 = require("./voucher.js");
|
|
11
|
+
Object.defineProperty(exports, "toVoucherPayload", { enumerable: true, get: function () { return voucher_js_1.toVoucherPayload; } });
|
|
12
|
+
Object.defineProperty(exports, "fromVoucherPayload", { enumerable: true, get: function () { return voucher_js_1.fromVoucherPayload; } });
|
|
13
|
+
Object.defineProperty(exports, "voucherIsValid", { enumerable: true, get: function () { return voucher_js_1.voucherIsValid; } });
|
|
14
|
+
var receipt_js_1 = require("./receipt.js");
|
|
15
|
+
Object.defineProperty(exports, "toReceiptPayload", { enumerable: true, get: function () { return receipt_js_1.toReceiptPayload; } });
|
|
16
|
+
Object.defineProperty(exports, "fromReceiptPayload", { enumerable: true, get: function () { return receipt_js_1.fromReceiptPayload; } });
|
|
17
|
+
Object.defineProperty(exports, "receiptSubSumCents", { enumerable: true, get: function () { return receipt_js_1.receiptSubSumCents; } });
|
|
18
|
+
Object.defineProperty(exports, "receiptSumCents", { enumerable: true, get: function () { return receipt_js_1.receiptSumCents; } });
|
|
19
|
+
var cancellation_js_1 = require("./cancellation.js");
|
|
20
|
+
Object.defineProperty(exports, "CANCELLATION_REASONS", { enumerable: true, get: function () { return cancellation_js_1.CANCELLATION_REASONS; } });
|
|
21
|
+
Object.defineProperty(exports, "CANCELLATION_RESERVATION_MS", { enumerable: true, get: function () { return cancellation_js_1.CANCELLATION_RESERVATION_MS; } });
|
|
22
|
+
Object.defineProperty(exports, "isCancellationReason", { enumerable: true, get: function () { return cancellation_js_1.isCancellationReason; } });
|
|
23
|
+
Object.defineProperty(exports, "remainingQuantities", { enumerable: true, get: function () { return cancellation_js_1.remainingQuantities; } });
|
|
24
|
+
var receipt_company_js_1 = require("./receipt-company.js");
|
|
25
|
+
Object.defineProperty(exports, "fromReceiptCompanyPayload", { enumerable: true, get: function () { return receipt_company_js_1.fromReceiptCompanyPayload; } });
|
|
26
|
+
Object.defineProperty(exports, "receiptCompanyTaxInfo", { enumerable: true, get: function () { return receipt_company_js_1.receiptCompanyTaxInfo; } });
|
|
27
|
+
var cashregister_js_1 = require("./cashregister.js");
|
|
28
|
+
Object.defineProperty(exports, "fromCashregisterPayload", { enumerable: true, get: function () { return cashregister_js_1.fromCashregisterPayload; } });
|
|
29
|
+
var receipt_summary_js_1 = require("./receipt-summary.js");
|
|
30
|
+
Object.defineProperty(exports, "fromReceiptSummaryPayload", { enumerable: true, get: function () { return receipt_summary_js_1.fromReceiptSummaryPayload; } });
|
|
31
|
+
Object.defineProperty(exports, "ZERO_KINDS", { enumerable: true, get: function () { return receipt_summary_js_1.ZERO_KINDS; } });
|
|
32
|
+
Object.defineProperty(exports, "istZeroKind", { enumerable: true, get: function () { return receipt_summary_js_1.istZeroKind; } });
|
|
33
|
+
var report_month_js_1 = require("./report-month.js");
|
|
34
|
+
Object.defineProperty(exports, "reportMonthFromDate", { enumerable: true, get: function () { return report_month_js_1.reportMonthFromDate; } });
|
|
35
|
+
Object.defineProperty(exports, "previousReportMonth", { enumerable: true, get: function () { return report_month_js_1.previousReportMonth; } });
|
|
36
|
+
Object.defineProperty(exports, "nextReportMonth", { enumerable: true, get: function () { return report_month_js_1.nextReportMonth; } });
|
|
37
|
+
Object.defineProperty(exports, "reportMonthKey", { enumerable: true, get: function () { return report_month_js_1.reportMonthKey; } });
|
|
38
|
+
Object.defineProperty(exports, "reportMonthReadable", { enumerable: true, get: function () { return report_month_js_1.reportMonthReadable; } });
|
|
39
|
+
var stripe_url_session_js_1 = require("./stripe-url-session.js");
|
|
40
|
+
Object.defineProperty(exports, "toStripeUrlSessionPayload", { enumerable: true, get: function () { return stripe_url_session_js_1.toStripeUrlSessionPayload; } });
|
|
41
|
+
Object.defineProperty(exports, "fromStripeUrlSessionPayload", { enumerable: true, get: function () { return stripe_url_session_js_1.fromStripeUrlSessionPayload; } });
|
|
42
|
+
var hobex_receipt_js_1 = require("./hobex-receipt.js");
|
|
43
|
+
Object.defineProperty(exports, "toHobexReceiptPayload", { enumerable: true, get: function () { return hobex_receipt_js_1.toHobexReceiptPayload; } });
|
|
44
|
+
Object.defineProperty(exports, "fromHobexReceiptPayload", { enumerable: true, get: function () { return hobex_receipt_js_1.fromHobexReceiptPayload; } });
|
|
45
|
+
Object.defineProperty(exports, "hobexReceiptToCardPaymentData", { enumerable: true, get: function () { return hobex_receipt_js_1.hobexReceiptToCardPaymentData; } });
|
|
46
|
+
Object.defineProperty(exports, "hobexReceiptNeedsSignature", { enumerable: true, get: function () { return hobex_receipt_js_1.hobexReceiptNeedsSignature; } });
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firmen- und Druckdaten eines Belegs — Zwilling der Metadaten von
|
|
3
|
+
* `KasseneckReceipt` in kasseneck_api/lib/models/kasseneck_receipt.dart
|
|
4
|
+
* (`toMetadataJson`/`fromMetadata`).
|
|
5
|
+
*
|
|
6
|
+
* Das Backend liefert sie **neben** dem Beleg: `getReceipt` und `createReceipt`
|
|
7
|
+
* legen Firma, Anschrift, Steuernummer, UID, Fusszeilen, Logo-Adresse und das
|
|
8
|
+
* Kleinunternehmer-Kennzeichen direkt in die Antwort (functions/index.js).
|
|
9
|
+
* Zum RKSV-Kernbeleg gehoeren sie nicht — sie betreffen ausschliesslich die
|
|
10
|
+
* Darstellung. Deshalb stehen sie hier als eigenes Modell und nicht in
|
|
11
|
+
* [Receipt]: derselbe Beleg, spaeter erneut gedruckt, kann eine
|
|
12
|
+
* zwischenzeitlich geaenderte Fusszeile tragen.
|
|
13
|
+
*
|
|
14
|
+
* **Gotcha:** `thanks_message` liefert nur `getReceipt`, `createReceipt`
|
|
15
|
+
* nicht (functions/index.js, Antwortbloecke von `getReceipt` bzw.
|
|
16
|
+
* `createReceipt`). Das Feld ist deshalb kein Pflichtfeld der Nutzlast; ohne
|
|
17
|
+
* es bleibt [thanksMessage] leer.
|
|
18
|
+
*/
|
|
19
|
+
export interface ReceiptCompany {
|
|
20
|
+
companyName: string;
|
|
21
|
+
street: string;
|
|
22
|
+
zip: string;
|
|
23
|
+
city: string;
|
|
24
|
+
phone: string;
|
|
25
|
+
/** UID (Umsatzsteuer-Identifikationsnummer); fehlt bei Kleinunternehmern. */
|
|
26
|
+
uid?: string;
|
|
27
|
+
/** Steuernummer des Finanzamts. */
|
|
28
|
+
taxnr: string;
|
|
29
|
+
/** Kleinunternehmer nach § 6 Abs 1 Z 27 UStG (keine USt im Ausweis). */
|
|
30
|
+
isSmallBusiness: boolean;
|
|
31
|
+
footer1: string;
|
|
32
|
+
footer2: string;
|
|
33
|
+
footer3?: string;
|
|
34
|
+
footer4?: string;
|
|
35
|
+
/** Adresse des Firmenlogos; dieses Paket laedt und zeichnet es nicht. */
|
|
36
|
+
logoUrl?: string;
|
|
37
|
+
/** Dankestext am Belegende, je Zeile ein Eintrag. */
|
|
38
|
+
thanksMessage: string[];
|
|
39
|
+
/** Kreiseck-Branding am Belegende (Firestore-Flag `branding.kreiseck_logo`). */
|
|
40
|
+
showKreiseckLogo: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Nutzlast-Form, die dieses Paket **liest** — die Feldnamen der Backend-
|
|
44
|
+
* Antwort. Alles ist optional: ein Kundendokument ohne gepflegte Anschrift
|
|
45
|
+
* oder Fusszeile liefert die Felder als `null` oder gar nicht, und ein
|
|
46
|
+
* fehlender Firmenname darf keinen Belegdruck verhindern.
|
|
47
|
+
*/
|
|
48
|
+
export interface ReceiptCompanyPayload {
|
|
49
|
+
company?: string | null;
|
|
50
|
+
street?: string | null;
|
|
51
|
+
zip?: string | null;
|
|
52
|
+
city?: string | null;
|
|
53
|
+
phone?: string | null;
|
|
54
|
+
uid?: string | null;
|
|
55
|
+
taxnr?: string | null;
|
|
56
|
+
is_small_business?: boolean | null;
|
|
57
|
+
footer1?: string | null;
|
|
58
|
+
footer2?: string | null;
|
|
59
|
+
footer3?: string | null;
|
|
60
|
+
footer4?: string | null;
|
|
61
|
+
logo_url?: string | null;
|
|
62
|
+
/** Nur `getReceipt` liefert dieses Feld — siehe Modulkommentar. */
|
|
63
|
+
thanks_message?: string | null;
|
|
64
|
+
kreiseck_logo?: boolean | null;
|
|
65
|
+
}
|
|
66
|
+
export declare function fromReceiptCompanyPayload(payload: ReceiptCompanyPayload): ReceiptCompany;
|
|
67
|
+
/**
|
|
68
|
+
* Steuerangabe im Belegkopf — Zwilling von `KasseneckReceipt.taxInfo`: die UID,
|
|
69
|
+
* wenn es eine gibt, sonst die Steuernummer.
|
|
70
|
+
*/
|
|
71
|
+
export declare function receiptCompanyTaxInfo(company: ReceiptCompany): string;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fromReceiptCompanyPayload = fromReceiptCompanyPayload;
|
|
4
|
+
exports.receiptCompanyTaxInfo = receiptCompanyTaxInfo;
|
|
5
|
+
/** Leere Zeichenkette statt `undefined` — siehe [ReceiptCompanyPayload]. */
|
|
6
|
+
const text = (wert) => (typeof wert === 'string' ? wert : '');
|
|
7
|
+
/**
|
|
8
|
+
* Zerlegt den Dankestext in Zeilen. Das Vorbild trennt an der **Zeichenfolge**
|
|
9
|
+
* `\n` (Backslash + n), nicht am Zeilenumbruch — so legt es die Flutter-Seite
|
|
10
|
+
* auch wieder ab (`toMetadataJson`). Ein echter Zeilenumbruch wird zusaetzlich
|
|
11
|
+
* getrennt: er kommt aus einem mehrzeiligen Eingabefeld im Panel und wuerde
|
|
12
|
+
* sonst als Umbruch **innerhalb** einer Layout-Zeile weiterwandern.
|
|
13
|
+
*/
|
|
14
|
+
function zeilen(wert) {
|
|
15
|
+
if (typeof wert !== 'string' || wert.length === 0) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
return wert.split(/\\n|\r?\n/);
|
|
19
|
+
}
|
|
20
|
+
function fromReceiptCompanyPayload(payload) {
|
|
21
|
+
const firma = {
|
|
22
|
+
companyName: text(payload.company),
|
|
23
|
+
street: text(payload.street),
|
|
24
|
+
zip: text(payload.zip),
|
|
25
|
+
city: text(payload.city),
|
|
26
|
+
phone: text(payload.phone),
|
|
27
|
+
taxnr: text(payload.taxnr),
|
|
28
|
+
isSmallBusiness: payload.is_small_business === true,
|
|
29
|
+
footer1: text(payload.footer1),
|
|
30
|
+
footer2: text(payload.footer2),
|
|
31
|
+
thanksMessage: zeilen(payload.thanks_message),
|
|
32
|
+
showKreiseckLogo: payload.kreiseck_logo === true,
|
|
33
|
+
};
|
|
34
|
+
// Die vier Kann-Felder bleiben weg, wenn sie leer sind — ein leerer String
|
|
35
|
+
// in `footer3` erzeugte sonst eine leere Zeile auf dem Beleg.
|
|
36
|
+
if (payload.uid)
|
|
37
|
+
firma.uid = payload.uid;
|
|
38
|
+
if (payload.footer3)
|
|
39
|
+
firma.footer3 = payload.footer3;
|
|
40
|
+
if (payload.footer4)
|
|
41
|
+
firma.footer4 = payload.footer4;
|
|
42
|
+
if (payload.logo_url)
|
|
43
|
+
firma.logoUrl = payload.logo_url;
|
|
44
|
+
return firma;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Steuerangabe im Belegkopf — Zwilling von `KasseneckReceipt.taxInfo`: die UID,
|
|
48
|
+
* wenn es eine gibt, sonst die Steuernummer.
|
|
49
|
+
*/
|
|
50
|
+
function receiptCompanyTaxInfo(company) {
|
|
51
|
+
return company.uid !== undefined && company.uid.length > 0 ? company.uid : company.taxnr;
|
|
52
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { VatRate } from '../enums/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Belegposition — Zwilling von `KasseneckItem` in
|
|
4
|
+
* kasseneck_api/lib/models/kasseneck_item.dart.
|
|
5
|
+
*
|
|
6
|
+
* `priceCents` ist der Einzelpreis in **Cent** (exakte Integer-Arithmetik,
|
|
7
|
+
* keine Gleitkomma-Rundungsfehler). Eine Euro-Variante gibt es hier bewusst
|
|
8
|
+
* nicht — anders als beim Gutschein oder Hobex-Beleg sendet die Nutzlast
|
|
9
|
+
* (v2-Format) den Preis bereits als ganze Cent.
|
|
10
|
+
*
|
|
11
|
+
* `vat` ist beim Lesen entweder der bekannte Steuersatz (Objekt) oder — falls
|
|
12
|
+
* die Nutzlast einen Satz traegt, den dieses Paket noch nicht kennt — der
|
|
13
|
+
* rohe `rate`-Wert als Zahl (siehe [readVatRateByRate]). Ein Aufrufer erkennt
|
|
14
|
+
* den unbekannten Fall am `typeof`: ein Objekt ist bekannt, eine Zahl nicht.
|
|
15
|
+
*
|
|
16
|
+
* `quantity` ist beim **Schreiben** eine ganze Menge; TypeScript kennt keinen
|
|
17
|
+
* Ganzzahltyp, deshalb prueft der Schreibpfad sie zur Laufzeit (siehe
|
|
18
|
+
* [receiptItemIsValid] und [toReceiptItemPayload]). Beim **Lesen** steht hier,
|
|
19
|
+
* was in der Nutzlast stand — auch eine gebrochene Menge aus fremder Hand:
|
|
20
|
+
* lesen tolerant, schreiben streng. `receiptItemTotalCents` liefert dann
|
|
21
|
+
* folgerichtig einen gebrochenen Cent-Betrag; das ist die Wahrheit des
|
|
22
|
+
* Belegs, nicht ein Fehler dieses Pakets.
|
|
23
|
+
*/
|
|
24
|
+
export interface ReceiptItem {
|
|
25
|
+
name: string;
|
|
26
|
+
/** Ganze Menge, > 0 zum Senden (siehe Klassenkommentar). */
|
|
27
|
+
quantity: number;
|
|
28
|
+
vat: VatRate | number;
|
|
29
|
+
priceCents: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Nutzlast-Form, die dieses Paket **schreibt** (v2):
|
|
33
|
+
* `{ name, quantity, unitPriceCents, vatRate }`.
|
|
34
|
+
*/
|
|
35
|
+
export interface ReceiptItemPayload {
|
|
36
|
+
name: string;
|
|
37
|
+
quantity: number;
|
|
38
|
+
unitPriceCents: number;
|
|
39
|
+
vatRate: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Nutzlast-Form, die dieses Paket **liest** — v2 und v1 nebeneinander, alles
|
|
43
|
+
* optional (Zwilling von `KasseneckItem.fromJson`).
|
|
44
|
+
*
|
|
45
|
+
* Das ist kein Entgegenkommen, sondern der Normalfall: Das Backend bildet die
|
|
46
|
+
* v2-Felder am Eingang auf v1 ab und **speichert v1** (`normalizeMoneyInputs`
|
|
47
|
+
* in functions/index.js — quantity->amount, vatRate->vat,
|
|
48
|
+
* unitPriceCents->priceOneCents, daraus priceOne). Ein gespeicherter Beleg
|
|
49
|
+
* traegt v1 also immer, v2 nur dann, wenn der erzeugende Client sie
|
|
50
|
+
* mitgesendet hat. Wer hier nur v2 liest, bekommt bei Belegen von
|
|
51
|
+
* Alt-Clients `undefined` in Menge, Steuersatz und Preis — ohne Fehler, aber
|
|
52
|
+
* mit `NaN` in jeder Summe und mit einem Beleg, der sich nicht mehr
|
|
53
|
+
* stornieren laesst.
|
|
54
|
+
*/
|
|
55
|
+
export interface ReceiptItemPayloadRead {
|
|
56
|
+
name?: string | null;
|
|
57
|
+
/** v2: Menge */
|
|
58
|
+
quantity?: number | null;
|
|
59
|
+
/** v2: Einzelpreis in Cent */
|
|
60
|
+
unitPriceCents?: number | null;
|
|
61
|
+
/** v2: Steuersatz */
|
|
62
|
+
vatRate?: number | null;
|
|
63
|
+
/** v1: Menge */
|
|
64
|
+
amount?: number | null;
|
|
65
|
+
/** v1: Einzelpreis in Cent */
|
|
66
|
+
priceOneCents?: number | null;
|
|
67
|
+
/** v1: Einzelpreis in Euro */
|
|
68
|
+
priceOne?: number | null;
|
|
69
|
+
/** v1: Steuersatz */
|
|
70
|
+
vat?: number | null;
|
|
71
|
+
}
|
|
72
|
+
export declare function toReceiptItemPayload(item: ReceiptItem): ReceiptItemPayload;
|
|
73
|
+
/**
|
|
74
|
+
* Liest beide Nutzlast-Formen (siehe [ReceiptItemPayloadRead]). Reihenfolge
|
|
75
|
+
* wie im Dart-Vorbild: v2 vor v1, Cent-Angabe vor Euro-Angabe (exakt vor
|
|
76
|
+
* gerundet); die Euro-Angabe wird genau einmal auf Cent gerundet.
|
|
77
|
+
*/
|
|
78
|
+
export declare function fromReceiptItemPayload(payload: ReceiptItemPayloadRead): ReceiptItem;
|
|
79
|
+
/**
|
|
80
|
+
* Zeilensumme in Cent. Bei einer selbst erzeugten Position ist sie exakt:
|
|
81
|
+
* ganze Menge mal ganze Cent. Bei einem fremd erzeugten Beleg mit gebrochener
|
|
82
|
+
* Menge ist sie folgerichtig gebrochen — das ist der signierte Betrag, und ihn
|
|
83
|
+
* zu runden hiesse, einen anderen zu drucken.
|
|
84
|
+
*/
|
|
85
|
+
export declare function receiptItemTotalCents(item: ReceiptItem): number;
|
|
86
|
+
/**
|
|
87
|
+
* Ist die Position an das Backend sendbar? Zwilling von `KasseneckItem.isValid`
|
|
88
|
+
* im Flutter-Vorbild: ein Name muss da sein und die Menge positiv **und ganz**.
|
|
89
|
+
* Der Preis darf negativ sein — genau das ist eine Stornoposition.
|
|
90
|
+
*
|
|
91
|
+
* Zur Ganzzahligkeit siehe [pruefeMenge]: im Dart-Vorbild ist `quantity` ein
|
|
92
|
+
* `int`, hier traegt der Typ das nicht, also muss es die Laufzeit tun.
|
|
93
|
+
*/
|
|
94
|
+
export declare function receiptItemIsValid(item: ReceiptItem): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Stornoposition zu dieser Position — Zwilling von `KasseneckItem.negative`:
|
|
97
|
+
* gleicher Name, gleiche Menge, gleicher Steuersatz, **negierter** Einzelpreis.
|
|
98
|
+
* Die Menge bleibt positiv; das Vorzeichen sitzt ausschliesslich im Preis.
|
|
99
|
+
*/
|
|
100
|
+
export declare function negateReceiptItem(item: ReceiptItem): ReceiptItem;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toReceiptItemPayload = toReceiptItemPayload;
|
|
4
|
+
exports.fromReceiptItemPayload = fromReceiptItemPayload;
|
|
5
|
+
exports.receiptItemTotalCents = receiptItemTotalCents;
|
|
6
|
+
exports.receiptItemIsValid = receiptItemIsValid;
|
|
7
|
+
exports.negateReceiptItem = negateReceiptItem;
|
|
8
|
+
const index_js_1 = require("../enums/index.js");
|
|
9
|
+
const enum_payload_js_1 = require("./enum-payload.js");
|
|
10
|
+
function toReceiptItemPayload(item) {
|
|
11
|
+
// Schreibpfad bleibt streng: ein unaufgeloester (unbekannter) Steuersatz
|
|
12
|
+
// darf nicht unbesehen wieder hinausgehen.
|
|
13
|
+
const vat = typeof item.vat === 'number' ? (0, enum_payload_js_1.requireVatRateByRate)(item.vat) : item.vat;
|
|
14
|
+
pruefeMenge(item.quantity);
|
|
15
|
+
return {
|
|
16
|
+
name: item.name,
|
|
17
|
+
quantity: item.quantity,
|
|
18
|
+
unitPriceCents: item.priceCents,
|
|
19
|
+
vatRate: vat.rate,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Liest beide Nutzlast-Formen (siehe [ReceiptItemPayloadRead]). Reihenfolge
|
|
24
|
+
* wie im Dart-Vorbild: v2 vor v1, Cent-Angabe vor Euro-Angabe (exakt vor
|
|
25
|
+
* gerundet); die Euro-Angabe wird genau einmal auf Cent gerundet.
|
|
26
|
+
*/
|
|
27
|
+
function fromReceiptItemPayload(payload) {
|
|
28
|
+
const cents = ersteZahl(payload.unitPriceCents, payload.priceOneCents);
|
|
29
|
+
const euro = ersteZahl(payload.priceOne);
|
|
30
|
+
const menge = ersteZahl(payload.quantity, payload.amount);
|
|
31
|
+
const satz = ersteZahl(payload.vatRate, payload.vat);
|
|
32
|
+
return {
|
|
33
|
+
name: payload.name ?? '',
|
|
34
|
+
// Die Menge kommt herein, wie sie in der Nutzlast steht — auch eine
|
|
35
|
+
// gebrochene. Sie abzuschneiden (das Dart-Vorbild tut es mit `toInt()`)
|
|
36
|
+
// waere hier falsch: dort erzwingt es das `int`-Modell der Sprache, hier
|
|
37
|
+
// gaebe es lautlos einen anderen Betrag als den signierten. Am HTTP-API
|
|
38
|
+
// haengt auch fremde Software, und das Backend prueft bei den Positionen
|
|
39
|
+
// allein `unitPriceCents` auf Ganzzahligkeit — ein solcher Beleg ist also
|
|
40
|
+
// ausstellbar. Er muss sich dann anzeigen und drucken lassen, wie er
|
|
41
|
+
// signiert wurde. Streng ist stattdessen der Schreibpfad (siehe
|
|
42
|
+
// [pruefeMenge]): aus diesem Paket geht keine gebrochene Menge hinaus.
|
|
43
|
+
quantity: menge ?? 0,
|
|
44
|
+
// Fehlt der Steuersatz voellig, gibt es keinen rohen Wert zum Erhalten;
|
|
45
|
+
// dann gilt wie im Dart-Vorbild 0 % (das Backend prueft `vat` als Pflicht,
|
|
46
|
+
// der Fall entsteht also nur bei einer kaputten Nutzlast).
|
|
47
|
+
vat: satz != null ? (0, enum_payload_js_1.readVatRateByRate)(satz) : index_js_1.VatRate.vat0,
|
|
48
|
+
priceCents: cents != null ? Math.round(cents) : euro != null ? Math.round(euro * 100) : 0,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Erster brauchbarer Zahlenwert der Reihe; `null`/`undefined`/NaN zaehlen nicht. */
|
|
52
|
+
function ersteZahl(...werte) {
|
|
53
|
+
for (const wert of werte) {
|
|
54
|
+
if (typeof wert === 'number' && Number.isFinite(wert)) {
|
|
55
|
+
return wert;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Zeilensumme in Cent. Bei einer selbst erzeugten Position ist sie exakt:
|
|
62
|
+
* ganze Menge mal ganze Cent. Bei einem fremd erzeugten Beleg mit gebrochener
|
|
63
|
+
* Menge ist sie folgerichtig gebrochen — das ist der signierte Betrag, und ihn
|
|
64
|
+
* zu runden hiesse, einen anderen zu drucken.
|
|
65
|
+
*/
|
|
66
|
+
function receiptItemTotalCents(item) {
|
|
67
|
+
return item.priceCents * item.quantity;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Ist die Position an das Backend sendbar? Zwilling von `KasseneckItem.isValid`
|
|
71
|
+
* im Flutter-Vorbild: ein Name muss da sein und die Menge positiv **und ganz**.
|
|
72
|
+
* Der Preis darf negativ sein — genau das ist eine Stornoposition.
|
|
73
|
+
*
|
|
74
|
+
* Zur Ganzzahligkeit siehe [pruefeMenge]: im Dart-Vorbild ist `quantity` ein
|
|
75
|
+
* `int`, hier traegt der Typ das nicht, also muss es die Laufzeit tun.
|
|
76
|
+
*/
|
|
77
|
+
function receiptItemIsValid(item) {
|
|
78
|
+
return item.name.length > 0 && Number.isInteger(item.quantity) && item.quantity > 0;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Wirft, wenn die Menge keine ganze Zahl ist.
|
|
82
|
+
*
|
|
83
|
+
* Der Grund ist keine Formstrenge, sondern die Belegwahrheit: Das Backend
|
|
84
|
+
* prueft **nur** `unitPriceCents` auf Ganzzahligkeit (`checkItemsIsValid` in
|
|
85
|
+
* functions/index.js), eine gebrochene Menge kaeme also durch und wuerde
|
|
86
|
+
* mitsigniert. Der gedruckte Beleg wiese dann einen anderen Betrag aus als der
|
|
87
|
+
* signierte, und ein Storno darauf traegt eine Menge, die es nie gab. Deshalb
|
|
88
|
+
* faellt die Menge hier, vor dem Senden, und nicht spaeter still.
|
|
89
|
+
*
|
|
90
|
+
* Der Lesepfad tut das ausdruecklich **nicht** (siehe
|
|
91
|
+
* [fromReceiptItemPayload]): ein fremd erzeugter Beleg muss sich anzeigen
|
|
92
|
+
* lassen, wie er signiert wurde.
|
|
93
|
+
*
|
|
94
|
+
* `Number.isInteger` faengt Bruchteile, NaN und Unendlich in einem.
|
|
95
|
+
*/
|
|
96
|
+
function pruefeMenge(quantity) {
|
|
97
|
+
if (!Number.isInteger(quantity)) {
|
|
98
|
+
throw new Error(`Menge: "${quantity}" ist keine ganze Zahl`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Stornoposition zu dieser Position — Zwilling von `KasseneckItem.negative`:
|
|
103
|
+
* gleicher Name, gleiche Menge, gleicher Steuersatz, **negierter** Einzelpreis.
|
|
104
|
+
* Die Menge bleibt positiv; das Vorzeichen sitzt ausschliesslich im Preis.
|
|
105
|
+
*/
|
|
106
|
+
function negateReceiptItem(item) {
|
|
107
|
+
return { ...item, priceCents: -item.priceCents };
|
|
108
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { KeckPaymentMethod, ReceiptType } from '../enums/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Belegzeile einer Liste — die Form, die `listMyReceipts` liefert
|
|
4
|
+
* (`projectReceiptForCustomer` in functions/index.js).
|
|
5
|
+
*
|
|
6
|
+
* **Das ist kein [Receipt].** Die Liste traegt bewusst nur, was eine Uebersicht
|
|
7
|
+
* braucht: keine Positionen, keine Gutscheine, keine Signatur, keinen QR-Code.
|
|
8
|
+
* Wer einen Beleg nachdrucken oder stornieren will, holt ihn ueber
|
|
9
|
+
* `getReceipt`/`getReceiptWithCompany` einzeln — dort steht der vollstaendige,
|
|
10
|
+
* signierte Beleg.
|
|
11
|
+
*
|
|
12
|
+
* `total` kommt vom Backend in **Euro** (auf zwei Stellen gerundet, `round2`).
|
|
13
|
+
* Dieses Paket rechnet ausnahmslos in ganzen Cent, deshalb wird der Betrag
|
|
14
|
+
* genau hier, an der Antwortgrenze, einmal umgerechnet — wie beim
|
|
15
|
+
* Hobex-Beleg.
|
|
16
|
+
*
|
|
17
|
+
* `receiptType` und `paymentMethod` sind wie ueberall beim Lesen entweder der
|
|
18
|
+
* bekannte Enum-Eintrag oder der rohe Nutzlast-Schluessel (siehe
|
|
19
|
+
* enum-payload.ts): eine Liste darf nicht daran scheitern, dass ein einzelner
|
|
20
|
+
* Beleg eine Zahlungsart traegt, die dieses Paket noch nicht kennt.
|
|
21
|
+
*/
|
|
22
|
+
/** Anlass eines Nullbelegs (Backend: cashregister-lifecycle ZERO_KINDS). */
|
|
23
|
+
export declare const ZERO_KINDS: readonly ["monthly", "annual", "annual_replacement", "outage_end", "final", "manual"];
|
|
24
|
+
export type ZeroKind = (typeof ZERO_KINDS)[number];
|
|
25
|
+
export declare function istZeroKind(w: unknown): w is ZeroKind;
|
|
26
|
+
export interface ReceiptSummary {
|
|
27
|
+
receiptId: string;
|
|
28
|
+
/** Fortlaufender Belegzaehler der Kasse; fehlt bei Alt-Belegen. */
|
|
29
|
+
counter?: number;
|
|
30
|
+
receiptType: ReceiptType | string;
|
|
31
|
+
/** Roher Belegzeitstempel; Deutung ueber `parseServerTimeStamp`. */
|
|
32
|
+
timeStamp: string;
|
|
33
|
+
/** Belegsumme in ganzen Cent. */
|
|
34
|
+
totalCents: number;
|
|
35
|
+
paymentMethod: KeckPaymentMethod | string;
|
|
36
|
+
/** `'success'`/`'failed'` der FinanzOnline-Uebermittlung, sofern bekannt. */
|
|
37
|
+
transmissionStatus?: string;
|
|
38
|
+
/** Zeitstempel der Uebermittlung, roh wie vom Finanzamt geliefert. */
|
|
39
|
+
transmissionTime?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Wurde der Beleg mit funktionierender Signatureinheit ausgestellt? Das
|
|
42
|
+
* Backend meldet hier `signatureSuccess !== false`, also `true`, solange
|
|
43
|
+
* nichts Gegenteiliges vermerkt ist.
|
|
44
|
+
*/
|
|
45
|
+
signatureOk: boolean;
|
|
46
|
+
/** Nur fuer Kassen-Benutzer geliefert: Positionen kurz (Name, Menge). */
|
|
47
|
+
items: Array<{
|
|
48
|
+
name: string;
|
|
49
|
+
quantity: number;
|
|
50
|
+
}>;
|
|
51
|
+
/** Bediener am Beleg, wenn bekannt. */
|
|
52
|
+
operator?: {
|
|
53
|
+
uid: string | null;
|
|
54
|
+
name: string;
|
|
55
|
+
};
|
|
56
|
+
/** Nur am Storno-Beleg: das Original. */
|
|
57
|
+
cancellationOf?: {
|
|
58
|
+
receiptId: string | null;
|
|
59
|
+
};
|
|
60
|
+
cancellationReason?: string;
|
|
61
|
+
/** offen | teil | voll -- Storno-Stand des Originals. */
|
|
62
|
+
stornoStand: 'offen' | 'teil' | 'voll';
|
|
63
|
+
/** Nur am Nullbeleg, nur fuer Kassen-Benutzer: Anlass (monthly, annual, annual_replacement, outage_end, final, manual). */
|
|
64
|
+
zeroKind?: ZeroKind;
|
|
65
|
+
}
|
|
66
|
+
export interface ReceiptSummaryPayload {
|
|
67
|
+
receiptId?: string | null;
|
|
68
|
+
counter?: number | null;
|
|
69
|
+
receiptType?: string | null;
|
|
70
|
+
timeStamp?: string | null;
|
|
71
|
+
/** Belegsumme in **Euro** (siehe Klassenkommentar). */
|
|
72
|
+
total?: number | null;
|
|
73
|
+
paymentMethod?: string | null;
|
|
74
|
+
transmission_status?: string | null;
|
|
75
|
+
ts_transmission?: string | null;
|
|
76
|
+
signature_ok?: boolean | null;
|
|
77
|
+
items?: Array<{
|
|
78
|
+
name?: string | null;
|
|
79
|
+
quantity?: number | null;
|
|
80
|
+
}> | null;
|
|
81
|
+
operator?: {
|
|
82
|
+
uid?: string | null;
|
|
83
|
+
name?: string | null;
|
|
84
|
+
} | null;
|
|
85
|
+
cancellationOf?: {
|
|
86
|
+
receiptId?: string | null;
|
|
87
|
+
} | null;
|
|
88
|
+
cancellationReason?: string | null;
|
|
89
|
+
stornoStand?: string | null;
|
|
90
|
+
zeroKind?: string | null;
|
|
91
|
+
}
|
|
92
|
+
export declare function fromReceiptSummaryPayload(payload: ReceiptSummaryPayload): ReceiptSummary;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZERO_KINDS = void 0;
|
|
4
|
+
exports.istZeroKind = istZeroKind;
|
|
5
|
+
exports.fromReceiptSummaryPayload = fromReceiptSummaryPayload;
|
|
6
|
+
const index_js_1 = require("../enums/index.js");
|
|
7
|
+
const money_js_1 = require("../money.js");
|
|
8
|
+
const enum_payload_js_1 = require("./enum-payload.js");
|
|
9
|
+
/**
|
|
10
|
+
* Belegzeile einer Liste — die Form, die `listMyReceipts` liefert
|
|
11
|
+
* (`projectReceiptForCustomer` in functions/index.js).
|
|
12
|
+
*
|
|
13
|
+
* **Das ist kein [Receipt].** Die Liste traegt bewusst nur, was eine Uebersicht
|
|
14
|
+
* braucht: keine Positionen, keine Gutscheine, keine Signatur, keinen QR-Code.
|
|
15
|
+
* Wer einen Beleg nachdrucken oder stornieren will, holt ihn ueber
|
|
16
|
+
* `getReceipt`/`getReceiptWithCompany` einzeln — dort steht der vollstaendige,
|
|
17
|
+
* signierte Beleg.
|
|
18
|
+
*
|
|
19
|
+
* `total` kommt vom Backend in **Euro** (auf zwei Stellen gerundet, `round2`).
|
|
20
|
+
* Dieses Paket rechnet ausnahmslos in ganzen Cent, deshalb wird der Betrag
|
|
21
|
+
* genau hier, an der Antwortgrenze, einmal umgerechnet — wie beim
|
|
22
|
+
* Hobex-Beleg.
|
|
23
|
+
*
|
|
24
|
+
* `receiptType` und `paymentMethod` sind wie ueberall beim Lesen entweder der
|
|
25
|
+
* bekannte Enum-Eintrag oder der rohe Nutzlast-Schluessel (siehe
|
|
26
|
+
* enum-payload.ts): eine Liste darf nicht daran scheitern, dass ein einzelner
|
|
27
|
+
* Beleg eine Zahlungsart traegt, die dieses Paket noch nicht kennt.
|
|
28
|
+
*/
|
|
29
|
+
/** Anlass eines Nullbelegs (Backend: cashregister-lifecycle ZERO_KINDS). */
|
|
30
|
+
exports.ZERO_KINDS = ['monthly', 'annual', 'annual_replacement', 'outage_end', 'final', 'manual'];
|
|
31
|
+
function istZeroKind(w) {
|
|
32
|
+
return typeof w === 'string' && exports.ZERO_KINDS.includes(w);
|
|
33
|
+
}
|
|
34
|
+
function fromReceiptSummaryPayload(payload) {
|
|
35
|
+
return {
|
|
36
|
+
receiptId: payload.receiptId ?? '',
|
|
37
|
+
...(typeof payload.counter === 'number' ? { counter: payload.counter } : {}),
|
|
38
|
+
receiptType: (0, enum_payload_js_1.readEnumKey)(index_js_1.ReceiptType, payload.receiptType ?? ''),
|
|
39
|
+
timeStamp: payload.timeStamp ?? '',
|
|
40
|
+
totalCents: (0, money_js_1.euroToCents)(payload.total),
|
|
41
|
+
paymentMethod: (0, enum_payload_js_1.readEnumKey)(index_js_1.KeckPaymentMethod, payload.paymentMethod ?? ''),
|
|
42
|
+
...(payload.transmission_status ? { transmissionStatus: payload.transmission_status } : {}),
|
|
43
|
+
...(payload.ts_transmission ? { transmissionTime: payload.ts_transmission } : {}),
|
|
44
|
+
// Nur ein ausdrueckliches `false` heisst "ausgefallen" — genau wie im
|
|
45
|
+
// Backend, das hier `signatureSuccess !== false` sendet.
|
|
46
|
+
signatureOk: payload.signature_ok !== false,
|
|
47
|
+
items: Array.isArray(payload.items) ? payload.items.map((i) => ({ name: i?.name ?? '', quantity: typeof i?.quantity === 'number' ? i.quantity : 0 })) : [],
|
|
48
|
+
...(payload.operator ? { operator: { uid: payload.operator.uid ?? null, name: payload.operator.name ?? '' } } : {}),
|
|
49
|
+
...(payload.cancellationOf ? { cancellationOf: { receiptId: payload.cancellationOf.receiptId ?? null } } : {}),
|
|
50
|
+
...(payload.cancellationReason ? { cancellationReason: payload.cancellationReason } : {}),
|
|
51
|
+
stornoStand: payload.stornoStand === 'teil' || payload.stornoStand === 'voll' ? payload.stornoStand : 'offen',
|
|
52
|
+
...(istZeroKind(payload.zeroKind) ? { zeroKind: payload.zeroKind } : {}),
|
|
53
|
+
};
|
|
54
|
+
}
|