@kreiseck/kasseneck-api 0.6.9 → 0.6.45
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/README.md +21 -0
- package/dist/cjs/client/aufrufe.d.ts +21 -0
- package/dist/cjs/client/aufrufe.js +34 -0
- package/dist/cjs/client/cashregisters.d.ts +2 -2
- package/dist/cjs/client/index.d.ts +2 -1
- package/dist/cjs/client/index.js +3 -1
- package/dist/cjs/client/receipts.d.ts +31 -12
- package/dist/cjs/client/receipts.js +51 -0
- package/dist/cjs/client/reports.d.ts +3 -3
- package/dist/cjs/client/status.d.ts +3 -3
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/kasse/artikel.d.ts +3 -3
- package/dist/cjs/kasse/client.d.ts +4 -4
- package/dist/cjs/kasse/drucker.d.ts +4 -4
- package/dist/cjs/kasse/index.d.ts +1 -1
- package/dist/cjs/kasse/index.js +30 -1
- package/dist/cjs/kasse/settings.d.ts +113 -26
- package/dist/cjs/kasse/settings.js +91 -9
- package/dist/cjs/models/index.d.ts +1 -1
- package/dist/cjs/models/index.js +3 -1
- package/dist/cjs/models/receipt-item.d.ts +41 -0
- package/dist/cjs/models/receipt-item.js +41 -1
- package/dist/cjs/models/receipt.d.ts +7 -0
- package/dist/cjs/models/receipt.js +2 -0
- package/dist/cjs/payments/hobex.d.ts +3 -3
- package/dist/cjs/payments/stripe.d.ts +3 -3
- package/dist/cjs/printing/escpos.js +7 -0
- package/dist/cjs/react/index.js +11 -1
- package/dist/cjs/receipt/discount.js +1 -1
- package/dist/cjs/receipt/layout-escpos.js +9 -4
- package/dist/cjs/receipt/layout.d.ts +6 -3
- package/dist/cjs/receipt/layout.js +166 -14
- package/dist/cjs/register/index.d.ts +1 -1
- package/dist/cjs/register/index.js +2 -1
- package/dist/cjs/register/pairing.d.ts +17 -0
- package/dist/cjs/register/pairing.js +28 -3
- package/dist/cjs/register/session.d.ts +3 -3
- package/dist/esm/client/aufrufe.d.ts +21 -0
- package/dist/esm/client/aufrufe.js +31 -0
- package/dist/esm/client/cashregisters.d.ts +2 -2
- package/dist/esm/client/index.d.ts +2 -1
- package/dist/esm/client/index.js +1 -0
- package/dist/esm/client/receipts.d.ts +31 -12
- package/dist/esm/client/receipts.js +51 -0
- package/dist/esm/client/reports.d.ts +3 -3
- package/dist/esm/client/status.d.ts +3 -3
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/kasse/artikel.d.ts +3 -3
- package/dist/esm/kasse/client.d.ts +4 -4
- package/dist/esm/kasse/drucker.d.ts +4 -4
- package/dist/esm/kasse/index.d.ts +1 -1
- package/dist/esm/kasse/index.js +3 -1
- package/dist/esm/kasse/settings.d.ts +113 -26
- package/dist/esm/kasse/settings.js +90 -8
- package/dist/esm/models/index.d.ts +1 -1
- package/dist/esm/models/index.js +1 -1
- package/dist/esm/models/receipt-item.d.ts +41 -0
- package/dist/esm/models/receipt-item.js +39 -1
- package/dist/esm/models/receipt.d.ts +7 -0
- package/dist/esm/models/receipt.js +2 -0
- package/dist/esm/payments/hobex.d.ts +3 -3
- package/dist/esm/payments/stripe.d.ts +3 -3
- package/dist/esm/printing/escpos.js +7 -0
- package/dist/esm/react/index.js +11 -1
- package/dist/esm/receipt/discount.js +1 -1
- package/dist/esm/receipt/layout-escpos.js +9 -4
- package/dist/esm/receipt/layout.d.ts +6 -3
- package/dist/esm/receipt/layout.js +167 -15
- package/dist/esm/register/index.d.ts +1 -1
- package/dist/esm/register/index.js +1 -1
- package/dist/esm/register/pairing.d.ts +17 -0
- package/dist/esm/register/pairing.js +27 -3
- package/dist/esm/register/session.d.ts +3 -3
- package/fixtures/belege/rabatt-chef-trinkgeld.json +89 -0
- package/fixtures/belege/rabatt-einfach.json +50 -0
- package/fixtures/belege/rabatt-trinkgeld.json +75 -0
- package/fixtures/belege/rabatt-wertgutschein.json +70 -0
- package/fixtures/belege/rabattzeilen.json +5 -3
- package/fixtures/belege/storno-rabatt.json +68 -0
- package/fixtures/erwartet/rabatt-chef-trinkgeld.grid32.txt +31 -0
- package/fixtures/erwartet/rabatt-chef-trinkgeld.grid48.txt +30 -0
- package/fixtures/erwartet/rabatt-chef-trinkgeld.lines.json +317 -0
- package/fixtures/erwartet/rabatt-einfach.grid32.txt +26 -0
- package/fixtures/erwartet/rabatt-einfach.grid48.txt +25 -0
- package/fixtures/erwartet/rabatt-einfach.lines.json +250 -0
- package/fixtures/erwartet/rabatt-trinkgeld.grid32.txt +31 -0
- package/fixtures/erwartet/rabatt-trinkgeld.grid48.txt +30 -0
- package/fixtures/erwartet/rabatt-trinkgeld.lines.json +336 -0
- package/fixtures/erwartet/rabatt-wertgutschein.grid32.txt +32 -0
- package/fixtures/erwartet/rabatt-wertgutschein.grid48.txt +31 -0
- package/fixtures/erwartet/rabatt-wertgutschein.lines.json +330 -0
- package/fixtures/erwartet/rabattzeilen.grid32.txt +4 -2
- package/fixtures/erwartet/rabattzeilen.grid48.txt +4 -2
- package/fixtures/erwartet/rabattzeilen.lines.json +18 -8
- package/fixtures/erwartet/storno-rabatt.grid32.txt +34 -0
- package/fixtures/erwartet/storno-rabatt.grid48.txt +32 -0
- package/fixtures/erwartet/storno-rabatt.lines.json +317 -0
- package/fixtures/kasse-settings-standard.json +44 -5
- package/fixtures/manifest.json +34 -4
- package/fixtures/oberflaeche.json +216 -0
- package/package.json +3 -2
|
@@ -7,41 +7,95 @@
|
|
|
7
7
|
* Backend; ein Test in beiden Repos haelt sie deckungsgleich. Trinkgeld ist
|
|
8
8
|
* bewusst AUS, bis die Buchung geklaert ist (Spec kachel-kasse § 9).
|
|
9
9
|
*/
|
|
10
|
-
export
|
|
11
|
-
export type
|
|
12
|
-
export
|
|
13
|
-
export type
|
|
14
|
-
export
|
|
15
|
-
export type
|
|
10
|
+
export declare const STIL: readonly ["klar", "warm", "nacht", "kontrast"];
|
|
11
|
+
export type KasseStil = typeof STIL[number];
|
|
12
|
+
export declare const SCHRIFT: readonly ["S", "M", "L", "XL"];
|
|
13
|
+
export type KasseSchrift = typeof SCHRIFT[number];
|
|
14
|
+
export declare const WASSERZEICHEN: readonly ["aus", "anmeldung", "ueberall"];
|
|
15
|
+
export type KasseWasserzeichen = typeof WASSERZEICHEN[number];
|
|
16
|
+
export declare const MENGE: readonly ["aus", "x", "kg"];
|
|
17
|
+
export type KasseMenge = typeof MENGE[number];
|
|
18
|
+
export declare const TG_MODUS: readonly ["betrag", "gesamt", "beides"];
|
|
19
|
+
export type KasseTgModus = typeof TG_MODUS[number];
|
|
20
|
+
export declare const KASSIEREN_MODUS: readonly ["seite", "panel"];
|
|
21
|
+
export type KasseKassierenModus = typeof KASSIEREN_MODUS[number];
|
|
16
22
|
/** Kartenanbieter: Karte gibt es erst mit eingerichtetem Anbieter; 'extern' = eigenes Terminal ohne Anbindung. */
|
|
17
|
-
export
|
|
18
|
-
export
|
|
19
|
-
export
|
|
20
|
-
export type
|
|
21
|
-
export
|
|
22
|
-
export type
|
|
23
|
-
|
|
24
|
-
export type
|
|
25
|
-
export
|
|
26
|
-
export type
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
export declare const KARTENANBIETER: readonly ["keiner", "extern", "gptom", "hobex", "mypos", "stripe"];
|
|
24
|
+
export type KasseKartenanbieter = typeof KARTENANBIETER[number];
|
|
25
|
+
export declare const BELEG_AUSGABE: readonly ["qr", "druck", "mail", "sms", "fragen"];
|
|
26
|
+
export type KasseBelegAusgabe = typeof BELEG_AUSGABE[number];
|
|
27
|
+
export declare const LAYOUT: readonly ["rechts", "links", "vollbild"];
|
|
28
|
+
export type KasseLayout = typeof LAYOUT[number];
|
|
29
|
+
export declare const KATPOS: readonly ["oben", "links"];
|
|
30
|
+
export type KasseKatpos = typeof KATPOS[number];
|
|
31
|
+
export declare const HOEHE: readonly ["S", "M", "L"];
|
|
32
|
+
export type KasseHoehe = typeof HOEHE[number];
|
|
33
|
+
/**
|
|
34
|
+
* `sdp` = Netzwerk ueber Epson Server Direct Print (der Drucker holt Jobs vom Backend, jeder Browser druckt).
|
|
35
|
+
* `connect` = Kasseneck Connect (lokaler Agent auf dem Kassen-Rechner druckt fuer die Browser-Kasse).
|
|
36
|
+
*/
|
|
37
|
+
export declare const DRUCKER_ART: readonly ["sdp", "netz", "bt", "usb", "connect"];
|
|
38
|
+
export type KasseDruckerArt = typeof DRUCKER_ART[number];
|
|
39
|
+
/** Terminal-Ansprache: direkt per IP (wie bisher) oder ueber Kasseneck Connect (Agent leitet weiter). */
|
|
40
|
+
export declare const TERMINAL_VIA: readonly ["direkt", "connect"];
|
|
41
|
+
export type KasseTerminalVia = typeof TERMINAL_VIA[number];
|
|
42
|
+
/** Art des Kartenterminals an dieser Kasse: keines oder Hobex HPS (JSON-REST am Geraet). */
|
|
43
|
+
export declare const TERMINAL_ART: readonly ["keins", "hps"];
|
|
44
|
+
export type KasseTerminalArt = typeof TERMINAL_ART[number];
|
|
45
|
+
export declare const PAPIER: readonly ["mm58", "mm80"];
|
|
46
|
+
export type KassePapier = typeof PAPIER[number];
|
|
47
|
+
export declare const ZEICHENSATZ: readonly ["CP1252", "CP437"];
|
|
48
|
+
export type KasseZeichensatz = typeof ZEICHENSATZ[number];
|
|
49
|
+
export declare const SCHNITT: readonly ["partial", "full", "none"];
|
|
50
|
+
export type KasseSchnitt = typeof SCHNITT[number];
|
|
51
|
+
export declare const LADE_AUTO: readonly ["bar", "immer", "nie"];
|
|
52
|
+
export type KasseLadeAuto = typeof LADE_AUTO[number];
|
|
53
|
+
/** Groesse des Kuerzel-Logos in der Kopfzeile der Kasse. */
|
|
54
|
+
export declare const LOGO_GROESSE: readonly ["S", "M", "L"];
|
|
55
|
+
export type KasseLogoGroesse = typeof LOGO_GROESSE[number];
|
|
56
|
+
/** Schriftgroesse in den Chef-Einstellungen — getrennt von der Schrift der Kasse. */
|
|
57
|
+
export declare const SCHRIFT_EINST: readonly ["S", "M", "L"];
|
|
58
|
+
export type KasseSchriftEinst = typeof SCHRIFT_EINST[number];
|
|
59
|
+
/** Kachel-Optik: farbiger Streifen am Rand oder ganz gefuellte Kachel. */
|
|
60
|
+
export declare const KACHELSTIL: readonly ["streifen", "voll"];
|
|
61
|
+
export type KasseKachelstil = typeof KACHELSTIL[number];
|
|
62
|
+
/** Automatisches Abmelden nach Minuten Ruhe; 0 = nie. */
|
|
63
|
+
export declare const AUTO_AB_MIN: readonly [0, 1, 5, 15, 30];
|
|
64
|
+
export type KasseAutoAbMin = typeof AUTO_AB_MIN[number];
|
|
65
|
+
/** Rabatt am Beleg erlaubt. */
|
|
66
|
+
export declare const RABATT: readonly ["aus", "an"];
|
|
67
|
+
export type KasseRabatt = typeof RABATT[number];
|
|
68
|
+
/** Seite des Wasserzeichens — ALT, abgeloest von wzPos. */
|
|
69
|
+
export declare const WZ_SEITE: readonly ["links", "mitte", "rechts"];
|
|
70
|
+
export type KasseWzSeite = typeof WZ_SEITE[number];
|
|
71
|
+
/** Deckkraft des Wasserzeichens in Prozent — bewusst Stufen, kein Schieberegler. */
|
|
72
|
+
export declare const WZ_STAERKE: readonly [3, 6, 10, 16];
|
|
73
|
+
export type KasseWzStaerke = typeof WZ_STAERKE[number];
|
|
74
|
+
/** Groesse des Bild-Logos am Beleg. */
|
|
75
|
+
export declare const LOGO_SKALA: readonly ["S", "M", "L", "XL"];
|
|
76
|
+
export type KasseLogoSkala = typeof LOGO_SKALA[number];
|
|
77
|
+
/** Groesse des Wasserzeichens — getrennt vom Beleg-Logo. */
|
|
78
|
+
export declare const WZ_SKALA: readonly ["S", "M", "L", "XL"];
|
|
79
|
+
export type KasseWzSkala = typeof WZ_SKALA[number];
|
|
80
|
+
/** Wie lange die Fertig-Seite stehen bleibt, in Sekunden; 0 = bis zum Tippen. */
|
|
81
|
+
export declare const FERTIG_SEKUNDEN: readonly [0, 3, 5, 10, 15, 30, 60];
|
|
82
|
+
export type KasseFertigSekunden = typeof FERTIG_SEKUNDEN[number];
|
|
29
83
|
/** Schalter-Landkarte: Steuersaetze / Trinkgeldstufen (Schluessel = Wert als Text). */
|
|
30
84
|
export type Schalterkarte = Record<string, boolean>;
|
|
31
85
|
export interface KasseSettingsBetrieb {
|
|
32
86
|
logoText: string;
|
|
33
87
|
logoAn: boolean;
|
|
34
|
-
logoGroesse:
|
|
88
|
+
logoGroesse: KasseLogoGroesse;
|
|
35
89
|
wasserzeichen: KasseWasserzeichen;
|
|
36
90
|
farbe: string;
|
|
37
91
|
stil: KasseStil;
|
|
38
92
|
schrift: KasseSchrift;
|
|
39
|
-
schriftEinst:
|
|
40
|
-
kachelstil:
|
|
93
|
+
schriftEinst: KasseSchriftEinst;
|
|
94
|
+
kachelstil: KasseKachelstil;
|
|
41
95
|
uhr: boolean;
|
|
42
96
|
sperrbild: boolean;
|
|
43
97
|
foto: boolean;
|
|
44
|
-
autoAbMin:
|
|
98
|
+
autoAbMin: KasseAutoAbMin;
|
|
45
99
|
abNachVerkauf: boolean;
|
|
46
100
|
/** Schnelles Entsperren mit gemerkter PIN (lokal, Server-Login laeuft nach); aus = streng, jeder Login wartet. */
|
|
47
101
|
schnellLogin: boolean;
|
|
@@ -54,7 +108,21 @@ export interface KasseSettingsBetrieb {
|
|
|
54
108
|
menge: KasseMenge;
|
|
55
109
|
notiz: boolean;
|
|
56
110
|
suche: boolean;
|
|
57
|
-
rabatt:
|
|
111
|
+
rabatt: KasseRabatt;
|
|
112
|
+
/** Bild-Logo (Download-URL aus dem Kasse-Upload); '' = Kuerzel verwenden. */
|
|
113
|
+
logoBild: string;
|
|
114
|
+
/** Seite des Wasserzeichens — ALT: abgeloest von wzPos, bleibt fuers Mischen alter Staende. */
|
|
115
|
+
wzSeite: KasseWzSeite;
|
|
116
|
+
/** Horizontale Lage der Wasserzeichen-MITTE in Prozent (-25 bis 125 — darf ueber den Rand hinaus). */
|
|
117
|
+
wzPos: number;
|
|
118
|
+
/** Vertikale Lage der Wasserzeichen-Mitte in Prozent (-25 bis 125). */
|
|
119
|
+
wzPosV: number;
|
|
120
|
+
/** Deckkraft des Wasserzeichens in Prozent — bewusst Stufen, kein Schieberegler. */
|
|
121
|
+
wzStaerke: KasseWzStaerke;
|
|
122
|
+
/** Groesse des Bild-Logos am BELEG (Ansicht, PDF, Kopfzeile). */
|
|
123
|
+
logoSkala: KasseLogoSkala;
|
|
124
|
+
/** Groesse des Wasserzeichens — getrennt vom Beleg-Logo. */
|
|
125
|
+
wzSkala: KasseWzSkala;
|
|
58
126
|
zahlBar: boolean;
|
|
59
127
|
zahlKarte: boolean;
|
|
60
128
|
kartenanbieter: KasseKartenanbieter;
|
|
@@ -67,12 +135,20 @@ export interface KasseSettingsBetrieb {
|
|
|
67
135
|
kassierenModus: KasseKassierenModus;
|
|
68
136
|
/** Trinkgeld-Chips in Prozent (eine Nachkommastelle, max 5, eindeutig, Reihenfolge des Chefs). */
|
|
69
137
|
tgChips: number[];
|
|
138
|
+
/** Rabatt-Chips in Prozent — dieselben Regeln wie tgChips, vom Chef einstellbar. */
|
|
139
|
+
rabattChips: number[];
|
|
70
140
|
belegAusgabe: KasseBelegAusgabe;
|
|
71
|
-
fertigSekunden:
|
|
141
|
+
fertigSekunden: KasseFertigSekunden;
|
|
142
|
+
/** Glas-Optik: Kacheln und Korb leicht durchscheinend (Wasserzeichen schimmert). */
|
|
143
|
+
glas: boolean;
|
|
144
|
+
/** Hilfetexte in den Chef-Einstellungen anzeigen. */
|
|
145
|
+
hinweise: boolean;
|
|
72
146
|
}
|
|
73
147
|
/** Aktionen der Kasse, die eine Taste bekommen koennen. */
|
|
74
|
-
export
|
|
75
|
-
export
|
|
148
|
+
export declare const KASSE_TASTEN_AKTIONEN: readonly ["kassieren", "abschliessen", "abbrechen", "frei", "bar", "karte", "passend", "belege", "letzteZurueck", "einstellungen", "abmelden", "trinkgeld", "vollbild", "gegebenLeeren", "korbLeeren"];
|
|
149
|
+
export type KasseTastenAktion = typeof KASSE_TASTEN_AKTIONEN[number];
|
|
150
|
+
/** Kurzer Name, damit alle Enum-Listen gleich heissen; der alte bleibt gueltig. */
|
|
151
|
+
export declare const TASTEN_AKTIONEN: readonly ["kassieren", "abschliessen", "abbrechen", "frei", "bar", "karte", "passend", "belege", "letzteZurueck", "einstellungen", "abmelden", "trinkgeld", "vollbild", "gegebenLeeren", "korbLeeren"];
|
|
76
152
|
/** Tastenkarte: Aktion -> Tasten (`Mod+F`, `Enter`, `Escape`, `F5` ...; `Mod` = ⌘ auf dem Mac, Strg sonst). */
|
|
77
153
|
export type KasseTastenkarte = Record<KasseTastenAktion, string[]>;
|
|
78
154
|
export declare const KASSE_TASTEN_STANDARD: Readonly<KasseTastenkarte>;
|
|
@@ -89,10 +165,14 @@ export interface KasseSettingsGeraet {
|
|
|
89
165
|
druckerIp: string;
|
|
90
166
|
druckerPort: number;
|
|
91
167
|
druckerBt: string;
|
|
168
|
+
/** Klartextname des gemerkten Druckers; sonst stuende dort eine nackte Bluetooth-Adresse. */
|
|
169
|
+
druckerName: string;
|
|
92
170
|
/** Kennung des Netzwerk-Druckers (Server Direct Print) aus `listMyPrinters`; '' = keiner gewaehlt. */
|
|
93
171
|
druckerId: string;
|
|
94
172
|
/** ePOS Device-ID bei `druckerArt 'netz'` (Epson direkt per IP), Vorgabe `local_printer`. */
|
|
95
173
|
druckerDevid: string;
|
|
174
|
+
/** Kennung des Druckers im lokalen Kasseneck-Connect-Agenten, bei `druckerArt 'connect'`. */
|
|
175
|
+
connectDruckerId: string;
|
|
96
176
|
papier: KassePapier;
|
|
97
177
|
zeichensatz: KasseZeichensatz;
|
|
98
178
|
schnitt: KasseSchnitt;
|
|
@@ -100,6 +180,13 @@ export interface KasseSettingsGeraet {
|
|
|
100
180
|
ladeAuto: KasseLadeAuto;
|
|
101
181
|
terminalIp: string;
|
|
102
182
|
terminalPort: number;
|
|
183
|
+
terminalVia: KasseTerminalVia;
|
|
184
|
+
/** Art des Terminals ('keins' = Kartenzahlung ohne Terminal-Anbindung gesperrt, sofern zahlKarte an). */
|
|
185
|
+
terminalArt: KasseTerminalArt;
|
|
186
|
+
/** Tastenmarken (die kleinen Kuerzel an den Knoepfen) anzeigen. */
|
|
187
|
+
tastenMarken: boolean;
|
|
188
|
+
/** Terminal-ID aus dem Hobex-Vertrag (ohne fuehrende Null); noetig fuer Diagnose und Zahlung. */
|
|
189
|
+
terminalTid: string;
|
|
103
190
|
}
|
|
104
191
|
export interface KasseSettings {
|
|
105
192
|
betrieb: KasseSettingsBetrieb;
|
|
@@ -9,17 +9,93 @@
|
|
|
9
9
|
* bewusst AUS, bis die Buchung geklaert ist (Spec kachel-kasse § 9).
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.KASSE_GERAET_STANDARD = exports.KASSE_BETRIEB_STANDARD = exports.KASSE_TASTEN_STANDARD = exports.KASSE_TASTEN_AKTIONEN = exports.KARTENANBIETER = void 0;
|
|
12
|
+
exports.KASSE_GERAET_STANDARD = exports.KASSE_BETRIEB_STANDARD = exports.KASSE_TASTEN_STANDARD = exports.TASTEN_AKTIONEN = exports.KASSE_TASTEN_AKTIONEN = exports.FERTIG_SEKUNDEN = exports.WZ_SKALA = exports.LOGO_SKALA = exports.WZ_STAERKE = exports.WZ_SEITE = exports.RABATT = exports.AUTO_AB_MIN = exports.KACHELSTIL = exports.SCHRIFT_EINST = exports.LOGO_GROESSE = exports.LADE_AUTO = exports.SCHNITT = exports.ZEICHENSATZ = exports.PAPIER = exports.TERMINAL_ART = exports.TERMINAL_VIA = exports.DRUCKER_ART = exports.HOEHE = exports.KATPOS = exports.LAYOUT = exports.BELEG_AUSGABE = exports.KARTENANBIETER = exports.KASSIEREN_MODUS = exports.TG_MODUS = exports.MENGE = exports.WASSERZEICHEN = exports.SCHRIFT = exports.STIL = void 0;
|
|
13
13
|
exports.mergeKasseSettings = mergeKasseSettings;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/*
|
|
15
|
+
* Jedes Enum steht als Liste zur Laufzeit da, der Typ leitet sich daraus ab
|
|
16
|
+
* (`typeof LISTE[number]`). So gibt es die Werte nur einmal, und die Zwillinge
|
|
17
|
+
* (Backend-Validator, Flutter-Paket) koennen gegen dieselben Listen pruefen,
|
|
18
|
+
* statt sie abzuschreiben.
|
|
19
|
+
*/
|
|
20
|
+
exports.STIL = ['klar', 'warm', 'nacht', 'kontrast'];
|
|
21
|
+
exports.SCHRIFT = ['S', 'M', 'L', 'XL'];
|
|
22
|
+
exports.WASSERZEICHEN = ['aus', 'anmeldung', 'ueberall'];
|
|
23
|
+
exports.MENGE = ['aus', 'x', 'kg'];
|
|
24
|
+
exports.TG_MODUS = ['betrag', 'gesamt', 'beides'];
|
|
25
|
+
exports.KASSIEREN_MODUS = ['seite', 'panel'];
|
|
26
|
+
/** Kartenanbieter: Karte gibt es erst mit eingerichtetem Anbieter; 'extern' = eigenes Terminal ohne Anbindung. */
|
|
27
|
+
exports.KARTENANBIETER = ['keiner', 'extern', 'gptom', 'hobex', 'mypos', 'stripe'];
|
|
28
|
+
exports.BELEG_AUSGABE = ['qr', 'druck', 'mail', 'sms', 'fragen'];
|
|
29
|
+
exports.LAYOUT = ['rechts', 'links', 'vollbild'];
|
|
30
|
+
exports.KATPOS = ['oben', 'links'];
|
|
31
|
+
exports.HOEHE = ['S', 'M', 'L'];
|
|
32
|
+
/**
|
|
33
|
+
* `sdp` = Netzwerk ueber Epson Server Direct Print (der Drucker holt Jobs vom Backend, jeder Browser druckt).
|
|
34
|
+
* `connect` = Kasseneck Connect (lokaler Agent auf dem Kassen-Rechner druckt fuer die Browser-Kasse).
|
|
35
|
+
*/
|
|
36
|
+
exports.DRUCKER_ART = ['sdp', 'netz', 'bt', 'usb', 'connect'];
|
|
37
|
+
/** Terminal-Ansprache: direkt per IP (wie bisher) oder ueber Kasseneck Connect (Agent leitet weiter). */
|
|
38
|
+
exports.TERMINAL_VIA = ['direkt', 'connect'];
|
|
39
|
+
/** Art des Kartenterminals an dieser Kasse: keines oder Hobex HPS (JSON-REST am Geraet). */
|
|
40
|
+
exports.TERMINAL_ART = ['keins', 'hps'];
|
|
41
|
+
exports.PAPIER = ['mm58', 'mm80'];
|
|
42
|
+
exports.ZEICHENSATZ = ['CP1252', 'CP437'];
|
|
43
|
+
exports.SCHNITT = ['partial', 'full', 'none'];
|
|
44
|
+
exports.LADE_AUTO = ['bar', 'immer', 'nie'];
|
|
45
|
+
/*
|
|
46
|
+
* Auch die uebrigen Wertemengen der Einstellungen stehen jetzt als Liste da —
|
|
47
|
+
* vorher waren sie nur als Union am Feld ausgeschrieben. Ein Zwilling konnte
|
|
48
|
+
* dadurch einen Wert (etwa `kachelstil: 'voll'`) gar nicht kennen, ohne dass es
|
|
49
|
+
* auffiel: der Vertrag fuehrte die Menge nicht, und die Standardwerte-Datei
|
|
50
|
+
* pinnt je Feld nur einen einzigen Wert.
|
|
51
|
+
*/
|
|
52
|
+
/** Groesse des Kuerzel-Logos in der Kopfzeile der Kasse. */
|
|
53
|
+
exports.LOGO_GROESSE = ['S', 'M', 'L'];
|
|
54
|
+
/** Schriftgroesse in den Chef-Einstellungen — getrennt von der Schrift der Kasse. */
|
|
55
|
+
exports.SCHRIFT_EINST = ['S', 'M', 'L'];
|
|
56
|
+
/** Kachel-Optik: farbiger Streifen am Rand oder ganz gefuellte Kachel. */
|
|
57
|
+
exports.KACHELSTIL = ['streifen', 'voll'];
|
|
58
|
+
/** Automatisches Abmelden nach Minuten Ruhe; 0 = nie. */
|
|
59
|
+
exports.AUTO_AB_MIN = [0, 1, 5, 15, 30];
|
|
60
|
+
/** Rabatt am Beleg erlaubt. */
|
|
61
|
+
exports.RABATT = ['aus', 'an'];
|
|
62
|
+
/** Seite des Wasserzeichens — ALT, abgeloest von wzPos. */
|
|
63
|
+
exports.WZ_SEITE = ['links', 'mitte', 'rechts'];
|
|
64
|
+
/** Deckkraft des Wasserzeichens in Prozent — bewusst Stufen, kein Schieberegler. */
|
|
65
|
+
exports.WZ_STAERKE = [3, 6, 10, 16];
|
|
66
|
+
/** Groesse des Bild-Logos am Beleg. */
|
|
67
|
+
exports.LOGO_SKALA = ['S', 'M', 'L', 'XL'];
|
|
68
|
+
/** Groesse des Wasserzeichens — getrennt vom Beleg-Logo. */
|
|
69
|
+
exports.WZ_SKALA = ['S', 'M', 'L', 'XL'];
|
|
70
|
+
/** Wie lange die Fertig-Seite stehen bleibt, in Sekunden; 0 = bis zum Tippen. */
|
|
71
|
+
exports.FERTIG_SEKUNDEN = [0, 3, 5, 10, 15, 30, 60];
|
|
72
|
+
/** Aktionen der Kasse, die eine Taste bekommen koennen. */
|
|
73
|
+
exports.KASSE_TASTEN_AKTIONEN = ['kassieren', 'abschliessen', 'abbrechen', 'frei', 'bar', 'karte', 'passend', 'belege', 'letzteZurueck', 'einstellungen', 'abmelden', 'trinkgeld', 'vollbild', 'gegebenLeeren', 'korbLeeren'];
|
|
74
|
+
/** Kurzer Name, damit alle Enum-Listen gleich heissen; der alte bleibt gueltig. */
|
|
75
|
+
exports.TASTEN_AKTIONEN = exports.KASSE_TASTEN_AKTIONEN;
|
|
16
76
|
exports.KASSE_TASTEN_STANDARD = Object.freeze({
|
|
17
77
|
kassieren: ['Enter'], abschliessen: ['Enter'], abbrechen: ['Escape'],
|
|
18
|
-
|
|
19
|
-
|
|
78
|
+
// Mod+F gehoert dem Vollbild; Betrag frei liegt auf D. Bar bleibt auf B,
|
|
79
|
+
// Belege auf E (Entscheidung vom 21.8., der Tausch von 0.6.25 ist zurueck).
|
|
80
|
+
frei: ['Mod+D'], bar: ['Mod+B'], karte: ['Mod+K'], passend: ['Mod+P'],
|
|
81
|
+
// NICHT Mod+E: das faengt Chrome auf dem Mac selbst ab („Auswahl fuer
|
|
82
|
+
// Suche verwenden") — am Geraet belegt. J wie Journal laesst er durch.
|
|
83
|
+
belege: ['Mod+J'], letzteZurueck: ['Mod+Backspace'],
|
|
84
|
+
// NICHT Mod+T: die Taste ist im Browser reserviert (neuer Tab) und kommt
|
|
85
|
+
// nie bei der Seite an. Mod+G laesst Chrome durch.
|
|
86
|
+
einstellungen: ['Mod+S'], abmelden: ['Mod+L'], trinkgeld: ['Mod+G'],
|
|
87
|
+
vollbild: ['Mod+F'],
|
|
88
|
+
// Mod+C = Kopieren des Browsers — im Kassieren-Schritt ist Kopieren fern,
|
|
89
|
+
// und die Bindung gilt nur dort (Bar + Rueckgeld-Rechner an).
|
|
90
|
+
gegebenLeeren: ['Mod+C'],
|
|
91
|
+
// Bewusst DIESELBE Taste wie gegebenLeeren: die beiden leben in
|
|
92
|
+
// verschiedenen Momenten (Korb vor dem Kassieren, Gegeben-Feld darin) —
|
|
93
|
+
// der Verteiler laesst die nicht zustaendige Aktion durchfallen.
|
|
94
|
+
korbLeeren: ['Mod+C'],
|
|
20
95
|
});
|
|
21
96
|
exports.KASSE_BETRIEB_STANDARD = Object.freeze({
|
|
22
|
-
|
|
97
|
+
// Petrol aus der Markenpalette ("Ecke, Aktion") — nicht das alte Blau.
|
|
98
|
+
logoText: 'K', logoAn: true, logoGroesse: 'M', wasserzeichen: 'anmeldung', farbe: '#116B6B',
|
|
23
99
|
stil: 'klar', schrift: 'M', schriftEinst: 'S', kachelstil: 'streifen', uhr: true,
|
|
24
100
|
sperrbild: true, foto: true, autoAbMin: 0, abNachVerkauf: false, schnellLogin: true,
|
|
25
101
|
preisAnzeigen: true, ustAnzeigen: false, emoji: true, katFarben: true, freiErlaubt: true,
|
|
@@ -28,15 +104,21 @@ exports.KASSE_BETRIEB_STANDARD = Object.freeze({
|
|
|
28
104
|
zahlBar: true, zahlKarte: false, kartenanbieter: 'keiner', trinkgeld: false, tgModus: 'beides',
|
|
29
105
|
tgStufen: { 5: true, 10: true, 15: false, 20: false }, tgChips: [5, 10], tgSplit: true, rueckgeld: true,
|
|
30
106
|
schnellbar: false, kassierenModus: 'seite',
|
|
31
|
-
|
|
107
|
+
// 'fragen' = Fertig-Seite bietet QR und Bon an — sicherster Standard.
|
|
108
|
+
logoBild: '', wzSeite: 'mitte', wzPos: 50, wzPosV: 50, wzStaerke: 6, logoSkala: 'M', wzSkala: 'M',
|
|
109
|
+
glas: true, hinweise: true,
|
|
110
|
+
rabattChips: [5, 10, 15, 20],
|
|
111
|
+
belegAusgabe: 'fragen', fertigSekunden: 0,
|
|
32
112
|
});
|
|
33
113
|
exports.KASSE_GERAET_STANDARD = Object.freeze({
|
|
34
114
|
layout: 'rechts', katpos: 'oben', spaltenExtra: 0, hoehe: 'M', touch: false,
|
|
35
115
|
tasten: { ...exports.KASSE_TASTEN_STANDARD },
|
|
36
|
-
druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerId: '', druckerDevid: 'local_printer',
|
|
116
|
+
druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerName: '', druckerId: '', druckerDevid: 'local_printer',
|
|
117
|
+
connectDruckerId: '',
|
|
37
118
|
papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial',
|
|
38
119
|
ladeAn: false, ladeAuto: 'bar',
|
|
39
|
-
terminalIp: '', terminalPort:
|
|
120
|
+
terminalIp: '', terminalPort: 8080, terminalVia: 'direkt',
|
|
121
|
+
terminalArt: 'keins', terminalTid: '', tastenMarken: true,
|
|
40
122
|
});
|
|
41
123
|
/**
|
|
42
124
|
* Standard + gespeichert. Landkarten (`saetze`, `tgStufen`) werden je Schluessel
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, } from './receipt-item.js';
|
|
1
|
+
export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, isDiscountItem, } from './receipt-item.js';
|
|
2
2
|
export { type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid } from './voucher.js';
|
|
3
3
|
export { type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, } from './receipt.js';
|
|
4
4
|
export { type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, } from './cancellation.js';
|
package/dist/cjs/models/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
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;
|
|
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.isDiscountItem = exports.isTipItem = exports.negateReceiptItem = exports.receiptItemIsValid = exports.receiptItemTotalCents = exports.fromReceiptItemPayload = exports.toReceiptItemPayload = void 0;
|
|
4
4
|
var receipt_item_js_1 = require("./receipt-item.js");
|
|
5
5
|
Object.defineProperty(exports, "toReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.toReceiptItemPayload; } });
|
|
6
6
|
Object.defineProperty(exports, "fromReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.fromReceiptItemPayload; } });
|
|
7
7
|
Object.defineProperty(exports, "receiptItemTotalCents", { enumerable: true, get: function () { return receipt_item_js_1.receiptItemTotalCents; } });
|
|
8
8
|
Object.defineProperty(exports, "receiptItemIsValid", { enumerable: true, get: function () { return receipt_item_js_1.receiptItemIsValid; } });
|
|
9
9
|
Object.defineProperty(exports, "negateReceiptItem", { enumerable: true, get: function () { return receipt_item_js_1.negateReceiptItem; } });
|
|
10
|
+
Object.defineProperty(exports, "isTipItem", { enumerable: true, get: function () { return receipt_item_js_1.isTipItem; } });
|
|
11
|
+
Object.defineProperty(exports, "isDiscountItem", { enumerable: true, get: function () { return receipt_item_js_1.isDiscountItem; } });
|
|
10
12
|
var voucher_js_1 = require("./voucher.js");
|
|
11
13
|
Object.defineProperty(exports, "toVoucherPayload", { enumerable: true, get: function () { return voucher_js_1.toVoucherPayload; } });
|
|
12
14
|
Object.defineProperty(exports, "fromVoucherPayload", { enumerable: true, get: function () { return voucher_js_1.fromVoucherPayload; } });
|
|
@@ -27,7 +27,36 @@ export interface ReceiptItem {
|
|
|
27
27
|
quantity: number;
|
|
28
28
|
vat: VatRate | number;
|
|
29
29
|
priceCents: number;
|
|
30
|
+
/**
|
|
31
|
+
* Trinkgeld-Position (vom Backend aus dem Parameter `tip` erzeugt, siehe
|
|
32
|
+
* [ReceiptCommonOptions.tip]) oder Rabatt-Position (`verteileRabatt`).
|
|
33
|
+
* Mitarbeiter-Trinkgeld ist Durchlaeufer (0 %, kein Umsatz),
|
|
34
|
+
* Inhaber-Trinkgeld (`recipient.owner`) Umsatz. Rabatt-Positionen sind
|
|
35
|
+
* negative Entgeltminderungen je Steuersatz; die Kennzeichnung steuert nur
|
|
36
|
+
* die Bon-Darstellung (Summenzeile mit Aufteilung), nie die Beträge.
|
|
37
|
+
*/
|
|
38
|
+
kind?: 'tip' | 'discount';
|
|
39
|
+
/** Empfaenger der Trinkgeld-Position; `null` = nicht zugeordnet. */
|
|
40
|
+
recipient?: TipRecipient | null;
|
|
41
|
+
/** Zahlart der Trinkgeld-Position (kann von der des Belegs abweichen). */
|
|
42
|
+
paymentMethod?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Artikel-Verweis (Artikelstamm) — Grundlage der Erloesgruppen-Zuordnung
|
|
45
|
+
* im Bericht. Optional; Handeingaben haben keinen.
|
|
46
|
+
*/
|
|
47
|
+
articleId?: string;
|
|
30
48
|
}
|
|
49
|
+
/** Empfaenger einer Trinkgeld-Position (Kassen-Benutzer, Snapshot des Namens). */
|
|
50
|
+
export interface TipRecipient {
|
|
51
|
+
registerUserId: string;
|
|
52
|
+
name: string;
|
|
53
|
+
/** true: Inhaber — das Trinkgeld ist Umsatz mit USt. */
|
|
54
|
+
owner?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** Trinkgeld-Position? Die eine Erkennungsstelle — niemand prueft `kind` selbst. */
|
|
57
|
+
export declare function isTipItem(item: ReceiptItem | ReceiptItemPayloadRead): boolean;
|
|
58
|
+
/** Rabatt-Position? Die eine Erkennungsstelle — niemand prueft `kind` selbst. */
|
|
59
|
+
export declare function isDiscountItem(item: ReceiptItem | ReceiptItemPayloadRead): boolean;
|
|
31
60
|
/**
|
|
32
61
|
* Nutzlast-Form, die dieses Paket **schreibt** (v2):
|
|
33
62
|
* `{ name, quantity, unitPriceCents, vatRate }`.
|
|
@@ -37,6 +66,12 @@ export interface ReceiptItemPayload {
|
|
|
37
66
|
quantity: number;
|
|
38
67
|
unitPriceCents: number;
|
|
39
68
|
vatRate: number;
|
|
69
|
+
/** Trinkgeld-/Rabatt-Kennzeichnung, siehe [ReceiptItem.kind]. */
|
|
70
|
+
kind?: 'tip' | 'discount';
|
|
71
|
+
recipient?: TipRecipient | null;
|
|
72
|
+
paymentMethod?: string;
|
|
73
|
+
/** Artikel-Verweis, siehe [ReceiptItem.articleId]. */
|
|
74
|
+
articleId?: string;
|
|
40
75
|
}
|
|
41
76
|
/**
|
|
42
77
|
* Nutzlast-Form, die dieses Paket **liest** — v2 und v1 nebeneinander, alles
|
|
@@ -54,6 +89,10 @@ export interface ReceiptItemPayload {
|
|
|
54
89
|
*/
|
|
55
90
|
export interface ReceiptItemPayloadRead {
|
|
56
91
|
name?: string | null;
|
|
92
|
+
/** Trinkgeld-Position (Backend), siehe [ReceiptItem.kind]. */
|
|
93
|
+
kind?: string | null;
|
|
94
|
+
recipient?: TipRecipient | null;
|
|
95
|
+
paymentMethod?: string | null;
|
|
57
96
|
/** v2: Menge */
|
|
58
97
|
quantity?: number | null;
|
|
59
98
|
/** v2: Einzelpreis in Cent */
|
|
@@ -68,6 +107,8 @@ export interface ReceiptItemPayloadRead {
|
|
|
68
107
|
priceOne?: number | null;
|
|
69
108
|
/** v1: Steuersatz */
|
|
70
109
|
vat?: number | null;
|
|
110
|
+
/** Artikel-Verweis, siehe [ReceiptItem.articleId]. */
|
|
111
|
+
articleId?: string | null;
|
|
71
112
|
}
|
|
72
113
|
export declare function toReceiptItemPayload(item: ReceiptItem): ReceiptItemPayload;
|
|
73
114
|
/**
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTipItem = isTipItem;
|
|
4
|
+
exports.isDiscountItem = isDiscountItem;
|
|
3
5
|
exports.toReceiptItemPayload = toReceiptItemPayload;
|
|
4
6
|
exports.fromReceiptItemPayload = fromReceiptItemPayload;
|
|
5
7
|
exports.receiptItemTotalCents = receiptItemTotalCents;
|
|
@@ -7,17 +9,42 @@ exports.receiptItemIsValid = receiptItemIsValid;
|
|
|
7
9
|
exports.negateReceiptItem = negateReceiptItem;
|
|
8
10
|
const index_js_1 = require("../enums/index.js");
|
|
9
11
|
const enum_payload_js_1 = require("./enum-payload.js");
|
|
12
|
+
/** Trinkgeld-Position? Die eine Erkennungsstelle — niemand prueft `kind` selbst. */
|
|
13
|
+
function isTipItem(item) {
|
|
14
|
+
return item != null && item.kind === 'tip';
|
|
15
|
+
}
|
|
16
|
+
/** Rabatt-Position? Die eine Erkennungsstelle — niemand prueft `kind` selbst. */
|
|
17
|
+
function isDiscountItem(item) {
|
|
18
|
+
return item != null && item.kind === 'discount';
|
|
19
|
+
}
|
|
10
20
|
function toReceiptItemPayload(item) {
|
|
11
21
|
// Schreibpfad bleibt streng: ein unaufgeloester (unbekannter) Steuersatz
|
|
12
22
|
// darf nicht unbesehen wieder hinausgehen.
|
|
13
23
|
const vat = typeof item.vat === 'number' ? (0, enum_payload_js_1.requireVatRateByRate)(item.vat) : item.vat;
|
|
14
24
|
pruefeMenge(item.quantity);
|
|
15
|
-
|
|
25
|
+
const nutzlast = {
|
|
16
26
|
name: item.name,
|
|
17
27
|
quantity: item.quantity,
|
|
18
28
|
unitPriceCents: item.priceCents,
|
|
19
29
|
vatRate: vat.rate,
|
|
20
30
|
};
|
|
31
|
+
// Trinkgeld-Kennzeichnung reist mit — sonst wuerde ein Storno dieser
|
|
32
|
+
// Position am Backend als Warenzeile ankommen und aus den Trinkgeld-
|
|
33
|
+
// Aggregaten nicht wieder herausgerechnet.
|
|
34
|
+
if (item.kind === 'tip') {
|
|
35
|
+
nutzlast.kind = 'tip';
|
|
36
|
+
nutzlast.recipient = item.recipient ?? null;
|
|
37
|
+
if (item.paymentMethod != null)
|
|
38
|
+
nutzlast.paymentMethod = item.paymentMethod;
|
|
39
|
+
}
|
|
40
|
+
// Rabatt-Kennzeichnung reist mit — sonst kaeme ein Storno dieser Position
|
|
41
|
+
// am Bon wieder als gewoehnliche Warenzeile mit "1 x" an.
|
|
42
|
+
if (item.kind === 'discount')
|
|
43
|
+
nutzlast.kind = 'discount';
|
|
44
|
+
// Artikel-Verweis reist mit (Erloesgruppen im Bericht); leere Werte nicht.
|
|
45
|
+
if (item.articleId != null && item.articleId !== '')
|
|
46
|
+
nutzlast.articleId = item.articleId;
|
|
47
|
+
return nutzlast;
|
|
21
48
|
}
|
|
22
49
|
/**
|
|
23
50
|
* Liest beide Nutzlast-Formen (siehe [ReceiptItemPayloadRead]). Reihenfolge
|
|
@@ -46,6 +73,19 @@ function fromReceiptItemPayload(payload) {
|
|
|
46
73
|
// der Fall entsteht also nur bei einer kaputten Nutzlast).
|
|
47
74
|
vat: satz != null ? (0, enum_payload_js_1.readVatRateByRate)(satz) : index_js_1.VatRate.vat0,
|
|
48
75
|
priceCents: cents != null ? Math.round(cents) : euro != null ? Math.round(euro * 100) : 0,
|
|
76
|
+
// Trinkgeld-Felder nur, wenn es wirklich eine Tip-Position ist: eine
|
|
77
|
+
// Warenzeile bleibt so schlank wie bisher (Golden-Belege, deepEqual).
|
|
78
|
+
...(payload.kind === 'tip'
|
|
79
|
+
? {
|
|
80
|
+
kind: 'tip',
|
|
81
|
+
recipient: payload.recipient ?? null,
|
|
82
|
+
...(payload.paymentMethod != null ? { paymentMethod: payload.paymentMethod } : {}),
|
|
83
|
+
}
|
|
84
|
+
: payload.kind === 'discount'
|
|
85
|
+
? { kind: 'discount' }
|
|
86
|
+
: {}),
|
|
87
|
+
// Artikel-Verweis erhalten (Storno-Spiegelung schreibt ihn wieder mit).
|
|
88
|
+
...(typeof payload.articleId === 'string' && payload.articleId !== '' ? { articleId: payload.articleId } : {}),
|
|
49
89
|
};
|
|
50
90
|
}
|
|
51
91
|
/** Erster brauchbarer Zahlenwert der Reihe; `null`/`undefined`/NaN zaehlen nicht. */
|
|
@@ -41,6 +41,11 @@ export interface Receipt {
|
|
|
41
41
|
legalMessage: string[];
|
|
42
42
|
signatureSuccess?: boolean;
|
|
43
43
|
customProjectId?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Summe aller Trinkgeld-Positionen in Cent (Storno negativ) — abgeleitetes
|
|
46
|
+
* Lesefeld des Backends, nur vorhanden, wenn der Beleg Trinkgeld traegt.
|
|
47
|
+
*/
|
|
48
|
+
tipCents?: number;
|
|
44
49
|
/** Nur am Storno-Beleg: das stornierte Original. */
|
|
45
50
|
cancellationOf?: CancellationOf;
|
|
46
51
|
/** Nur am Storno-Beleg: Grund-Code aus [CANCELLATION_REASONS]. */
|
|
@@ -71,6 +76,8 @@ export interface ReceiptPayload {
|
|
|
71
76
|
legalMessage: string;
|
|
72
77
|
signatureSuccess: boolean | null;
|
|
73
78
|
customProjectId: string | null;
|
|
79
|
+
/** Nur bei Belegen mit Trinkgeld (siehe [Receipt.tipCents]). */
|
|
80
|
+
tipCents?: number | null;
|
|
74
81
|
}
|
|
75
82
|
/**
|
|
76
83
|
* Nutzlast-Form, die dieses Paket **liest**. Unterscheidet sich von
|
|
@@ -48,6 +48,7 @@ function toReceiptPayload(receipt) {
|
|
|
48
48
|
legalMessage: receipt.legalMessage.join('\n'),
|
|
49
49
|
signatureSuccess: receipt.signatureSuccess ?? null,
|
|
50
50
|
customProjectId: receipt.customProjectId ?? null,
|
|
51
|
+
...(receipt.tipCents != null ? { tipCents: receipt.tipCents } : {}),
|
|
51
52
|
};
|
|
52
53
|
}
|
|
53
54
|
// Nullbelege haben keine Positionen -> items kann fehlen/null sein (siehe Dart-Vorbild).
|
|
@@ -74,6 +75,7 @@ function fromReceiptPayload(payload) {
|
|
|
74
75
|
legalMessage: leereZeile(payload.legalMessage),
|
|
75
76
|
signatureSuccess: payload.signatureSuccess ?? undefined,
|
|
76
77
|
customProjectId: payload.customProjectId ?? undefined,
|
|
78
|
+
...(typeof payload.tipCents === 'number' ? { tipCents: payload.tipCents } : {}),
|
|
77
79
|
...(payload.cancellationOf ? { cancellationOf: { receiptId: payload.cancellationOf.receiptId, fullReceiptId: payload.cancellationOf.fullReceiptId ?? null } } : {}),
|
|
78
80
|
...(payload.cancellationReason ? { cancellationReason: payload.cancellationReason } : {}),
|
|
79
81
|
...((0, receipt_summary_js_1.istZeroKind)(payload.zeroKind) ? { zeroKind: payload.zeroKind } : {}),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type HobexReceipt } from '../models/index.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { InternerTransport } from '../client/aufrufe.js';
|
|
3
3
|
/**
|
|
4
4
|
* Cent -> Euro. **Die einzige Umrechnungsstelle dieses Moduls.** Betraege
|
|
5
5
|
* werden im ganzen Paket in Cent gefuehrt (exakte Ganzzahl-Arithmetik); die
|
|
@@ -46,7 +46,7 @@ export interface HobexTransactionIdOptions {
|
|
|
46
46
|
* **Der Endpunkt heisst `hobexPayApi`** — mit Suffix; ohne ihn gibt es ihn
|
|
47
47
|
* nicht.
|
|
48
48
|
*/
|
|
49
|
-
export declare function hobexPay(rufen:
|
|
49
|
+
export declare function hobexPay(rufen: InternerTransport, options: HobexPayOptions): Promise<HobexReceipt>;
|
|
50
50
|
/**
|
|
51
51
|
* Erstattet eine zuvor ueber die Hobex-Cloud getaetigte Zahlung. Das Backend
|
|
52
52
|
* storniert zuerst (Void, solange der Tagesabschluss aussteht) und erstattet
|
|
@@ -61,7 +61,7 @@ export declare function hobexPay(rufen: KasseneckTransport, options: HobexPayOpt
|
|
|
61
61
|
*
|
|
62
62
|
* **Der Endpunkt heisst `hobexRefundApi`** — mit Suffix.
|
|
63
63
|
*/
|
|
64
|
-
export declare function hobexRefund(rufen:
|
|
64
|
+
export declare function hobexRefund(rufen: InternerTransport, options: HobexRefundOptions): Promise<void>;
|
|
65
65
|
/**
|
|
66
66
|
* Erzeugt eine neue Hobex-Transaktionskennung: 19 Ziffern aus Zeitanteil und
|
|
67
67
|
* Zufall (Zwilling von `newHobexTransactionId` im Vorbild, Zeile 522).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
|
|
2
2
|
import { type ReceiptItem, type StripeUrlSession } from '../models/index.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { InternerTransport } from '../client/aufrufe.js';
|
|
4
4
|
export interface CreateStripeLinkOptions {
|
|
5
5
|
/** Positionen des Zahlungslinks; mindestens eine, alle gueltig. */
|
|
6
6
|
items: ReceiptItem[];
|
|
@@ -50,7 +50,7 @@ export interface StripeCaptureResult {
|
|
|
50
50
|
* Methodenname und Endpunktname fallen wie schon beim Monatsbericht
|
|
51
51
|
* auseinander (siehe client/reports.ts).
|
|
52
52
|
*/
|
|
53
|
-
export declare function createStripeLink(rufen:
|
|
53
|
+
export declare function createStripeLink(rufen: InternerTransport, options: CreateStripeLinkOptions): Promise<StripeUrlSession>;
|
|
54
54
|
/**
|
|
55
55
|
* Zieht die zuvor nur reservierte Zahlung einer `authorization`-Sitzung ein.
|
|
56
56
|
*
|
|
@@ -58,4 +58,4 @@ export declare function createStripeLink(rufen: KasseneckTransport, options: Cre
|
|
|
58
58
|
* das Vorbild und so das Backend. Der naheliegende Singular waere ein fehlender
|
|
59
59
|
* Pflichtparameter.
|
|
60
60
|
*/
|
|
61
|
-
export declare function stripeCaptureIntent(rufen:
|
|
61
|
+
export declare function stripeCaptureIntent(rufen: InternerTransport, stripeSessionId: string): Promise<StripeCaptureResult>;
|
|
@@ -633,4 +633,11 @@ function escPosQrCode(doc, text, options = {}) {
|
|
|
633
633
|
if (options.correction !== undefined)
|
|
634
634
|
qrOptionen.correction = options.correction;
|
|
635
635
|
anhaengen(doc, qrCodeBytes(text, qrOptionen));
|
|
636
|
+
// Ausrichtung SOFORT zuruecksetzen: `ESC a` gilt nur am Zeilenanfang. Die
|
|
637
|
+
// Spalten-Positionierung (`ESC $`) schickt ihren Reset sonst mitten in der
|
|
638
|
+
// Zeile — Epson ignoriert ihn, und alles nach dem QR rueckte nach rechts
|
|
639
|
+
// (belegt am TM-T20, 2026-08-20).
|
|
640
|
+
if ((options.align ?? 'center') !== 'left') {
|
|
641
|
+
escPosSetStyles(doc, { align: 'left' });
|
|
642
|
+
}
|
|
636
643
|
}
|
package/dist/cjs/react/index.js
CHANGED
|
@@ -20,7 +20,12 @@ function ReceiptLayoutView({ layout, className, renderQr, qrVerdeckt = false, qr
|
|
|
20
20
|
*/
|
|
21
21
|
function QrVerdeckt({ data, text = 'Antippen zum Anzeigen', children }) {
|
|
22
22
|
const [offen, setOffen] = (0, react_1.useState)(false);
|
|
23
|
-
return ((0, jsx_runtime_1.jsxs)("button", { type: "button", className: offen ? 'keck-receipt-qr-toggle keck-receipt-qr-toggle--offen' : 'keck-receipt-qr-toggle', "aria-pressed": offen, "aria-label": offen ? 'QR-Code verdecken' :
|
|
23
|
+
return ((0, jsx_runtime_1.jsxs)("button", { type: "button", className: offen ? 'keck-receipt-qr-toggle keck-receipt-qr-toggle--offen' : 'keck-receipt-qr-toggle', "aria-pressed": offen, "aria-label": offen ? 'QR-Code verdecken' : text, "data-qr": data, onClick: () => setOffen((o) => !o), style: { position: 'relative', display: 'inline-block', border: 'none', background: 'transparent', padding: 0, cursor: 'pointer' }, children: [(0, jsx_runtime_1.jsx)("span", { style: { display: 'inline-block', filter: offen ? undefined : 'blur(3px)', transition: 'filter .15s ease' }, children: children }), !offen && (
|
|
24
|
+
// Tipp-Finger statt Textzeile: versteht jeder, verdeckt fast nichts.
|
|
25
|
+
// Der Text bleibt als aria-label fuer Hilfsmittel. Einfarbige
|
|
26
|
+
// Strichzeichnung statt Emoji — Emojis rendern je Plattform anders
|
|
27
|
+
// und stechen farblich aus dem Beleg heraus.
|
|
28
|
+
(0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", className: "keck-receipt-qr-toggle-text", style: { position: 'absolute', inset: 0, display: 'grid', placeItems: 'center' }, children: (0, jsx_runtime_1.jsx)("span", { style: { display: 'grid', placeItems: 'center', width: '2.2em', height: '2.2em', borderRadius: '50%', background: 'rgba(255,255,255,.92)', boxShadow: '0 1px 4px rgba(0,0,0,.25)', color: 'rgba(0,0,0,.72)' }, children: (0, jsx_runtime_1.jsxs)("svg", { className: "keck-receipt-qr-toggle-finger", width: "1.25em", height: "1.25em", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [(0, jsx_runtime_1.jsx)("path", { d: "M10 9.5V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v10" }), (0, jsx_runtime_1.jsx)("path", { d: "M14 10V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1" }), (0, jsx_runtime_1.jsx)("path", { d: "M18 11v-1a2 2 0 0 0-2-2a2 2 0 0 0-2 2" }), (0, jsx_runtime_1.jsx)("path", { d: "M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15" })] }) }) }))] }));
|
|
24
29
|
}
|
|
25
30
|
function Zeile({ zeile, renderQr, qrVerdeckt, qrVerdecktText }) {
|
|
26
31
|
switch (zeile.kind) {
|
|
@@ -32,6 +37,11 @@ function Zeile({ zeile, renderQr, qrVerdeckt, qrVerdecktText }) {
|
|
|
32
37
|
// so bleibt die Aufteilung auf allen Ausgabewegen dieselbe.
|
|
33
38
|
flex: `0 0 ${((spalte.width / 12) * 100).toFixed(4)}%`,
|
|
34
39
|
textAlign: AUSRICHTUNG[spalte.align],
|
|
40
|
+
// minWidth 0: Flex-Zellen haben sonst min-content-Breite --
|
|
41
|
+
// ein langes Wort ohne Leerzeichen (Hex-Seriennummer der
|
|
42
|
+
// Signaturkarte) wuerde die Zelle sprengen und abgeschnitten,
|
|
43
|
+
// statt per break-word umzubrechen.
|
|
44
|
+
minWidth: 0,
|
|
35
45
|
overflowWrap: 'break-word',
|
|
36
46
|
}, children: spalte.text }, index))) }));
|
|
37
47
|
case 'rule':
|