@kreiseck/kasseneck-api 0.7.2 → 0.8.0

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.
@@ -10,3 +10,4 @@ export { verteileRabatt } from '../receipt/discount.js';
10
10
  export { cancelScopeOf, receiptsScopeOf, type RegisterScope, type RegisterUserPerms } from '../register/pairing.js';
11
11
  export { type NetzDrucker, type DruckJob, type DruckJobStatus, type CreatePrintJobOptions, listMyPrinters, createPrintJob, getPrintJob } from './drucker.js';
12
12
  export { listMyTipRecipients } from './trinkgeld.js';
13
+ export { MELDUNGEN, FEHLERREGELN, meldung, meldungGiltFuer, type Meldung, type MeldungsSchluessel, type Fehlerart, type Seite, } from './texte.js';
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPrintJob = exports.createPrintJob = exports.listMyPrinters = exports.receiptsScopeOf = exports.cancelScopeOf = exports.verteileRabatt = exports.setMyRegisterDeviceSettings = exports.setMyKasseSettings = exports.getKasseSettings = exports.mengeErlaubt = exports.mengenVorgabe = exports.mengenregelFuerEinheit = exports.listMyArticles = exports.listMyArticleGroups = exports.fromKasseArtikelPayload = exports.fromArticleGroupPayload = exports.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.TASTEN_AKTIONEN = 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.KASSIEREN_MODUS = exports.TG_MODUS = exports.MENGE = exports.WASSERZEICHEN = exports.SCHRIFT = exports.STIL = exports.mergeKasseSettings = exports.KASSE_GERAET_STANDARD = exports.KASSE_BETRIEB_STANDARD = exports.KASSE_TASTEN_STANDARD = exports.KASSE_TASTEN_AKTIONEN = exports.KARTENANBIETER = void 0;
4
- exports.listMyTipRecipients = void 0;
4
+ exports.meldungGiltFuer = exports.meldung = exports.FEHLERREGELN = exports.MELDUNGEN = exports.listMyTipRecipients = void 0;
5
5
  /**
6
6
  * Kachel-Kasse: Einstellungen, Artikelgruppen/Artikel fuer Kacheln,
7
7
  * Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
@@ -68,3 +68,9 @@ Object.defineProperty(exports, "createPrintJob", { enumerable: true, get: functi
68
68
  Object.defineProperty(exports, "getPrintJob", { enumerable: true, get: function () { return drucker_js_1.getPrintJob; } });
69
69
  var trinkgeld_js_1 = require("./trinkgeld.js");
70
70
  Object.defineProperty(exports, "listMyTipRecipients", { enumerable: true, get: function () { return trinkgeld_js_1.listMyTipRecipients; } });
71
+ // Was die Kasse selbst sagt — ein Katalog fuer Browser-Kasse und App.
72
+ var texte_js_1 = require("./texte.js");
73
+ Object.defineProperty(exports, "MELDUNGEN", { enumerable: true, get: function () { return texte_js_1.MELDUNGEN; } });
74
+ Object.defineProperty(exports, "FEHLERREGELN", { enumerable: true, get: function () { return texte_js_1.FEHLERREGELN; } });
75
+ Object.defineProperty(exports, "meldung", { enumerable: true, get: function () { return texte_js_1.meldung; } });
76
+ Object.defineProperty(exports, "meldungGiltFuer", { enumerable: true, get: function () { return texte_js_1.meldungGiltFuer; } });
@@ -0,0 +1,336 @@
1
+ /**
2
+ * Was die Kasse selbst sagt — auf dem Bildschirm, in beiden Huellen.
3
+ *
4
+ * Die Browser-Kasse und die Kassen-App sind eine Kasse. Was der Kassier bei
5
+ * einem Fehler liest, steht hier genau einmal; beide Apps beziehen den Satz
6
+ * von hier, und wer ihn aendert, aendert ihn auf beiden Seiten oder gar nicht.
7
+ *
8
+ * Nicht hier: die fachlichen Saetze des Backends („Kopplungs-Code ist
9
+ * abgelaufen.", „PIN falsch, noch 2 Versuche"). Die gehen unveraendert durch.
10
+ *
11
+ * Ein Satz sagt, was los ist, und was zu tun ist. Nie Innereien.
12
+ *
13
+ * Schluessel: `bereich.name`. Ein Schluessel wird nie umgedeutet — wer den
14
+ * Sinn aendert, legt einen neuen an. `nur` nennt die Seite, wenn ein Satz nur
15
+ * auf einer Plattform vorkommen kann.
16
+ */
17
+ export type Seite = 'web' | 'app';
18
+ export interface Meldung {
19
+ readonly text: string;
20
+ /** Erlaubte Platzhalter `{name}`; muessen exakt die im Text sein. */
21
+ readonly platzhalter?: readonly string[];
22
+ /** Fehlt es, gilt der Satz fuer beide Seiten. */
23
+ readonly nur?: readonly Seite[];
24
+ }
25
+ declare const MELDUNGEN_ROH: {
26
+ readonly 'netz.keine_verbindung': {
27
+ readonly text: "Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen.";
28
+ };
29
+ readonly 'netz.zeitablauf': {
30
+ readonly text: "Der Server antwortet nicht. Bitte die Internetverbindung prüfen und erneut versuchen.";
31
+ };
32
+ readonly 'server.unerwartet': {
33
+ readonly text: "Der Server hat unerwartet geantwortet (HTTP {status}). Bitte den Support verständigen.";
34
+ readonly platzhalter: readonly ["status"];
35
+ };
36
+ readonly 'kopplung.code_fehlt': {
37
+ readonly text: "Bitte den Kopplungs-Code eingeben.";
38
+ };
39
+ readonly 'kopplung.fehlgeschlagen': {
40
+ readonly text: "Die Kopplung ist fehlgeschlagen. Bitte erneut versuchen.";
41
+ };
42
+ readonly 'kopplung.unvollstaendig': {
43
+ readonly text: "Die Kopplung ist unvollständig zurückgekommen. Bitte im Panel einen neuen Code erzeugen und noch einmal versuchen.";
44
+ };
45
+ readonly 'geraet.browser_speicher': {
46
+ readonly text: "Dieses Gerät konnte nicht gespeichert werden — der Browser-Speicher steht nicht zur Verfügung. Bitte den privaten Modus verlassen.";
47
+ readonly nur: readonly ["web"];
48
+ };
49
+ readonly 'anmeldung.pin_fehlt': {
50
+ readonly text: "Bitte die PIN eingeben.";
51
+ };
52
+ readonly 'anmeldung.fehlgeschlagen': {
53
+ readonly text: "Die Anmeldung ist fehlgeschlagen. Bitte erneut versuchen.";
54
+ };
55
+ readonly 'anmeldung.nicht_abgeschlossen': {
56
+ readonly text: "Die Anmeldung konnte nicht abgeschlossen werden. Bitte erneut versuchen.";
57
+ };
58
+ readonly 'anmeldung.wird_abgeschlossen': {
59
+ readonly text: "Anmeldung wird gerade abgeschlossen — bitte gleich noch einmal drücken.";
60
+ };
61
+ readonly 'sitzung.abgelaufen': {
62
+ readonly text: "Die Sitzung ist abgelaufen. Bitte erneut anmelden.";
63
+ };
64
+ readonly 'sitzung.abgelaufen_ohne_netz': {
65
+ readonly text: "Keine Verbindung zum Server — die Sitzung ist abgelaufen. Bitte erneut anmelden.";
66
+ };
67
+ readonly 'sitzung.keine': {
68
+ readonly text: "Keine Sitzung.";
69
+ };
70
+ readonly 'rechte.nicht_aenderbar': {
71
+ readonly text: "Das darfst du nicht ändern — das Recht dafür vergibt der Inhaber im Panel.";
72
+ };
73
+ readonly 'kasse.laden_fehlgeschlagen': {
74
+ readonly text: "Die Kasse konnte nicht geladen werden.";
75
+ };
76
+ readonly 'artikel.laden_fehlgeschlagen': {
77
+ readonly text: "Die Artikel konnten nicht geladen werden.";
78
+ };
79
+ readonly 'artikel.keine_freigegeben': {
80
+ readonly text: "Keine Artikel an dieser Kasse. Im Panel unter „Kacheln & Gruppen“ freischalten.";
81
+ };
82
+ readonly 'artikel.keine_gefunden': {
83
+ readonly text: "Keine Artikel gefunden.";
84
+ };
85
+ readonly 'artikel.steuersatz_unbekannt': {
86
+ readonly text: "„{name}“ hat einen Steuersatz, den die Kasse nicht kennt.";
87
+ readonly platzhalter: readonly ["name"];
88
+ };
89
+ readonly 'position.betrag_fehlt': {
90
+ readonly text: "Bitte einen Betrag eingeben.";
91
+ };
92
+ readonly 'position.bezeichnung_fehlt': {
93
+ readonly text: "Bitte eine Bezeichnung eingeben — sie steht am Beleg.";
94
+ };
95
+ readonly 'rabatt.prozent_ungueltig': {
96
+ readonly text: "Bitte einen Prozentwert zwischen 0,1 und 100 eingeben.";
97
+ };
98
+ readonly 'abschluss.fehlgeschlagen': {
99
+ readonly text: "Der Abschluss ist fehlgeschlagen.";
100
+ };
101
+ readonly 'abschluss.unklar': {
102
+ readonly text: "Unklar, ob der Beleg entstanden ist — die Antwort kam nicht an. Bitte nicht noch einmal abschließen: der Beleg kann bereits erstellt und signiert sein. Im Panel unter „Belege“ nachsehen; nur wenn er dort fehlt, den Verkauf erneut abschließen.";
103
+ };
104
+ readonly 'abschluss.nullbeleg_fehlgeschlagen': {
105
+ readonly text: "Der Nullbeleg konnte nicht erstellt werden.";
106
+ };
107
+ readonly 'abschluss.signatur_ausgefallen': {
108
+ readonly text: "Die Signatureinheit hat nicht geantwortet. Der Beleg ist gültig und trägt den Vermerk „Sicherheitseinrichtung ausgefallen“.";
109
+ };
110
+ readonly 'kartenzahlung.nicht_moeglich': {
111
+ readonly text: "Kartenzahlung nicht möglich.";
112
+ };
113
+ readonly 'kartenzahlung.nicht_zustande': {
114
+ readonly text: "Die Kartenzahlung ist nicht zustande gekommen.";
115
+ };
116
+ readonly 'kartenzahlung.nicht_gestartet': {
117
+ readonly text: "Kartenzahlung nicht gestartet: {grund}";
118
+ readonly platzhalter: readonly ["grund"];
119
+ };
120
+ readonly 'kartenzahlung.unklar': {
121
+ readonly text: "Unklar, ob die Kartenzahlung durchgegangen ist — die Verbindung zum Terminal riss ab. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird: die Karte kann belastet sein.";
122
+ };
123
+ readonly 'kartenzahlung.unklar_mit_kennung': {
124
+ readonly text: "Unklar, ob die Kartenzahlung durchgegangen ist — die Verbindung zum Terminal riss ab. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird: die Karte kann belastet sein. Kennung der Zahlung: {kennung}.";
125
+ readonly platzhalter: readonly ["kennung"];
126
+ };
127
+ readonly 'kartenzahlung.connect_nicht_verbunden': {
128
+ readonly text: "Kartenzahlung nicht möglich: Kasseneck Connect ist nicht verbunden — Einstellungen → Kasseneck Connect.";
129
+ readonly nur: readonly ["web"];
130
+ };
131
+ readonly 'terminal.keines_gefunden': {
132
+ readonly text: "Kein Hobex-Terminal gefunden — ist es eingeschaltet und im selben Netz wie dieser Rechner?";
133
+ readonly nur: readonly ["web"];
134
+ };
135
+ readonly 'terminal.nicht_bereit': {
136
+ readonly text: "Terminal antwortet, ist aber nicht betriebsbereit: {antwort} — TID prüfen.";
137
+ readonly platzhalter: readonly ["antwort"];
138
+ readonly nur: readonly ["web"];
139
+ };
140
+ readonly 'gptom.app_fehlt': {
141
+ readonly text: "Die GP-Tom-App ist auf diesem Gerät nicht da.";
142
+ readonly nur: readonly ["app"];
143
+ };
144
+ readonly 'gptom.suche_fehlgeschlagen': {
145
+ readonly text: "GP Tom: Suche nach der App fehlgeschlagen: {grund}";
146
+ readonly platzhalter: readonly ["grund"];
147
+ readonly nur: readonly ["app"];
148
+ };
149
+ readonly 'gptom.zahlung_fehlgeschlagen': {
150
+ readonly text: "GP Tom: Zahlung fehlgeschlagen: {grund}";
151
+ readonly platzhalter: readonly ["grund"];
152
+ readonly nur: readonly ["app"];
153
+ };
154
+ readonly 'gptom.terminal_antwortet_nicht': {
155
+ readonly text: "Das Terminal hat nicht geantwortet: {grund}";
156
+ readonly platzhalter: readonly ["grund"];
157
+ readonly nur: readonly ["app"];
158
+ };
159
+ readonly 'gptom.zahlung_nicht_abgeschlossen': {
160
+ readonly text: "Die Zahlung wurde nicht abgeschlossen ({code}).";
161
+ readonly platzhalter: readonly ["code"];
162
+ readonly nur: readonly ["app"];
163
+ };
164
+ readonly 'belege.laden_fehlgeschlagen': {
165
+ readonly text: "Die Belege konnten nicht geladen werden.";
166
+ };
167
+ readonly 'belege.keine_im_zeitraum': {
168
+ readonly text: "Keine Belege in diesem Zeitraum.";
169
+ };
170
+ readonly 'beleg.laden_fehlgeschlagen': {
171
+ readonly text: "Der Beleg konnte nicht geladen werden.";
172
+ };
173
+ readonly 'beleg.nicht_gefunden': {
174
+ readonly text: "Der Beleg wurde nicht gefunden.";
175
+ };
176
+ readonly 'storno.fehlgeschlagen': {
177
+ readonly text: "Das Storno ist fehlgeschlagen.";
178
+ };
179
+ readonly 'storno.grund_fehlt': {
180
+ readonly text: "Bitte einen Grund wählen.";
181
+ };
182
+ readonly 'storno.position_fehlt': {
183
+ readonly text: "Bitte mindestens eine Position wählen.";
184
+ };
185
+ readonly 'druck.fehlgeschlagen': {
186
+ readonly text: "Der Ausdruck ist fehlgeschlagen.";
187
+ };
188
+ readonly 'druck.nicht_moeglich': {
189
+ readonly text: "Druck nicht möglich: {grund}";
190
+ readonly platzhalter: readonly ["grund"];
191
+ };
192
+ readonly 'druck.testdruck_fehlgeschlagen': {
193
+ readonly text: "Der Testdruck ist fehlgeschlagen.";
194
+ };
195
+ readonly 'druck.testdruck_nicht_moeglich': {
196
+ readonly text: "Der Testdruck ist fehlgeschlagen: {grund}";
197
+ readonly platzhalter: readonly ["grund"];
198
+ };
199
+ readonly 'druck.kein_drucker': {
200
+ readonly text: "Kein Bondrucker eingerichtet — in den Einstellungen unter Drucker & Lade.";
201
+ };
202
+ readonly 'druck.drucker_nicht_erreichbar': {
203
+ readonly text: "Drucker nicht erreichbar.";
204
+ };
205
+ readonly 'druck.job_abgelaufen': {
206
+ readonly text: "Drucker hat den Beleg nicht abgeholt (abgelaufen).";
207
+ readonly nur: readonly ["web"];
208
+ };
209
+ readonly 'druck.kein_drucker_gefunden': {
210
+ readonly text: "Kein Drucker gefunden — ist er eingeschaltet und im selben Netz wie dieser Rechner?";
211
+ readonly nur: readonly ["web"];
212
+ };
213
+ readonly 'druck.nur_chrome': {
214
+ readonly text: "{weg}-Druck geht nur in Chrome oder Edge (Windows, Mac, Android) — nicht in Safari und nicht am iPad.";
215
+ readonly platzhalter: readonly ["weg"];
216
+ readonly nur: readonly ["web"];
217
+ };
218
+ readonly 'druck.kein_weg_drucker': {
219
+ readonly text: "Kein {weg}-Drucker verbunden — „{weg}-Drucker verbinden“ und den Drucker im Dialog wählen.";
220
+ readonly platzhalter: readonly ["weg"];
221
+ readonly nur: readonly ["web"];
222
+ };
223
+ readonly 'bluetooth.aus': {
224
+ readonly text: "Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.";
225
+ readonly nur: readonly ["app"];
226
+ };
227
+ readonly 'bluetooth.freigabe_fehlt': {
228
+ readonly text: "Bitte die Freigabe in den Geräte-Einstellungen erteilen.";
229
+ readonly nur: readonly ["app"];
230
+ };
231
+ readonly 'bluetooth.suche_fehlgeschlagen': {
232
+ readonly text: "Die Suche ist fehlgeschlagen: {grund}";
233
+ readonly platzhalter: readonly ["grund"];
234
+ readonly nur: readonly ["app"];
235
+ };
236
+ readonly 'connect.antwortet_nicht': {
237
+ readonly text: "Kasseneck Connect antwortet nicht — läuft das Programm auf diesem Rechner?";
238
+ readonly nur: readonly ["web"];
239
+ };
240
+ readonly 'connect.code_abgelaufen': {
241
+ readonly text: "Der Kopplungs-Code ist abgelaufen — im Agent einen neuen erzeugen („kasseneck-connect pair“).";
242
+ readonly nur: readonly ["web"];
243
+ };
244
+ readonly 'connect.zu_viele_versuche': {
245
+ readonly text: "Zu viele Fehlversuche — eine Minute warten und noch einmal versuchen.";
246
+ readonly nur: readonly ["web"];
247
+ };
248
+ readonly 'connect.drucker_antwortet_nicht': {
249
+ readonly text: "Der Drucker antwortet nicht — Strom, Netzwerk und IP prüfen.";
250
+ readonly nur: readonly ["web"];
251
+ };
252
+ readonly 'connect.nicht_gekoppelt': {
253
+ readonly text: "Diese Kasse ist mit Kasseneck Connect nicht gekoppelt — in den Einstellungen „Koppeln“ drücken.";
254
+ readonly nur: readonly ["web"];
255
+ };
256
+ readonly 'connect.drucker_unbekannt': {
257
+ readonly text: "Diesen Drucker kennt Kasseneck Connect nicht (mehr) — bitte neu suchen.";
258
+ readonly nur: readonly ["web"];
259
+ };
260
+ readonly 'connect.ursprung_nicht_freigegeben': {
261
+ readonly text: "Kasseneck Connect nimmt von dieser Adresse nichts an (Ursprung nicht freigegeben).";
262
+ readonly nur: readonly ["web"];
263
+ };
264
+ readonly 'connect.nicht_installiert': {
265
+ readonly text: "Kasseneck Connect nicht gefunden — bitte installieren.";
266
+ readonly nur: readonly ["web"];
267
+ };
268
+ readonly 'einstellungen.laden_fehlgeschlagen': {
269
+ readonly text: "Die Einstellungen konnten nicht geladen werden.";
270
+ };
271
+ readonly 'einstellungen.speichern_fehlgeschlagen': {
272
+ readonly text: "Die Einstellung konnte nicht gespeichert werden.";
273
+ };
274
+ readonly 'einstellungen.noch_nicht_geladen': {
275
+ readonly text: "Noch nicht geladen — bitte kurz warten oder neu anmelden.";
276
+ };
277
+ readonly 'einstellungen.ip_ungueltig': {
278
+ readonly text: "Keine gültige IP-Adresse (z. B. 192.168.1.50).";
279
+ };
280
+ readonly 'entkopplung.fehlgeschlagen': {
281
+ readonly text: "Entkoppeln fehlgeschlagen.";
282
+ };
283
+ readonly 'logo.hochladen_fehlgeschlagen': {
284
+ readonly text: "Hochladen fehlgeschlagen.";
285
+ };
286
+ readonly 'logo.entfernen_fehlgeschlagen': {
287
+ readonly text: "Entfernen fehlgeschlagen.";
288
+ };
289
+ readonly 'app.nicht_im_browser': {
290
+ readonly text: "Die Kassen-App läuft nicht im Browser — dafür gibt es kasse.kasseneck.at.";
291
+ readonly nur: readonly ["app"];
292
+ };
293
+ readonly 'app.im_browser_oeffnen': {
294
+ readonly text: "Bitte im Browser öffnen: {ziel}";
295
+ readonly platzhalter: readonly ["ziel"];
296
+ readonly nur: readonly ["app"];
297
+ };
298
+ };
299
+ export type MeldungsSchluessel = keyof typeof MELDUNGEN_ROH;
300
+ export declare const MELDUNGEN: Record<MeldungsSchluessel, Meldung>;
301
+ /**
302
+ * In welcher Reihenfolge ein Fehler eingeordnet wird — auf beiden Seiten
303
+ * dieselbe. Die Arten:
304
+ * api — HTTP 200, `status:'error'`: der Satz des Backends, woertlich
305
+ * klartext — schon fuer den Bildschirm geschrieben: sein eigener Text
306
+ * zeitablauf — die Frist lief ab, die Anfrage war draussen
307
+ * netz — keine Verbindung zustande gekommen oder abgerissen
308
+ * unerwartet — der Server hat geantwortet, aber nicht wie zugesagt
309
+ * (HTML statt JSON, 500, fehlende Huelle); `status` = HTTP-Code
310
+ * sonst — alles Uebrige ist technisch: der Ersatzsatz des Vorgangs
311
+ */
312
+ export declare const FEHLERREGELN: readonly [{
313
+ readonly art: "api";
314
+ readonly verhalten: "server_text";
315
+ }, {
316
+ readonly art: "klartext";
317
+ readonly verhalten: "eigener_text";
318
+ }, {
319
+ readonly art: "zeitablauf";
320
+ readonly schluessel: "netz.zeitablauf";
321
+ }, {
322
+ readonly art: "netz";
323
+ readonly schluessel: "netz.keine_verbindung";
324
+ }, {
325
+ readonly art: "unerwartet";
326
+ readonly schluessel: "server.unerwartet";
327
+ }, {
328
+ readonly art: "sonst";
329
+ readonly verhalten: "ersatz";
330
+ }];
331
+ export type Fehlerart = (typeof FEHLERREGELN)[number]['art'];
332
+ /** Der Satz zum Schluessel, Platzhalter ersetzt. Fehlt ein Wert, wirft es — ein `{status}` am Tresen waere schlimmer. */
333
+ export declare function meldung(schluessel: MeldungsSchluessel, werte?: Record<string, string | number>): string;
334
+ /** Gilt der Satz auf dieser Seite? */
335
+ export declare function meldungGiltFuer(schluessel: MeldungsSchluessel, seite: Seite): boolean;
336
+ export {};
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ /**
3
+ * Was die Kasse selbst sagt — auf dem Bildschirm, in beiden Huellen.
4
+ *
5
+ * Die Browser-Kasse und die Kassen-App sind eine Kasse. Was der Kassier bei
6
+ * einem Fehler liest, steht hier genau einmal; beide Apps beziehen den Satz
7
+ * von hier, und wer ihn aendert, aendert ihn auf beiden Seiten oder gar nicht.
8
+ *
9
+ * Nicht hier: die fachlichen Saetze des Backends („Kopplungs-Code ist
10
+ * abgelaufen.", „PIN falsch, noch 2 Versuche"). Die gehen unveraendert durch.
11
+ *
12
+ * Ein Satz sagt, was los ist, und was zu tun ist. Nie Innereien.
13
+ *
14
+ * Schluessel: `bereich.name`. Ein Schluessel wird nie umgedeutet — wer den
15
+ * Sinn aendert, legt einen neuen an. `nur` nennt die Seite, wenn ein Satz nur
16
+ * auf einer Plattform vorkommen kann.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.FEHLERREGELN = exports.MELDUNGEN = void 0;
20
+ exports.meldung = meldung;
21
+ exports.meldungGiltFuer = meldungGiltFuer;
22
+ const MELDUNGEN_ROH = {
23
+ // --- Transport -----------------------------------------------------------
24
+ 'netz.keine_verbindung': { text: 'Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen.' },
25
+ 'netz.zeitablauf': { text: 'Der Server antwortet nicht. Bitte die Internetverbindung prüfen und erneut versuchen.' },
26
+ 'server.unerwartet': { text: 'Der Server hat unerwartet geantwortet (HTTP {status}). Bitte den Support verständigen.', platzhalter: ['status'] },
27
+ // --- Kopplung ------------------------------------------------------------
28
+ 'kopplung.code_fehlt': { text: 'Bitte den Kopplungs-Code eingeben.' },
29
+ 'kopplung.fehlgeschlagen': { text: 'Die Kopplung ist fehlgeschlagen. Bitte erneut versuchen.' },
30
+ 'kopplung.unvollstaendig': { text: 'Die Kopplung ist unvollständig zurückgekommen. Bitte im Panel einen neuen Code erzeugen und noch einmal versuchen.' },
31
+ 'geraet.browser_speicher': { text: 'Dieses Gerät konnte nicht gespeichert werden — der Browser-Speicher steht nicht zur Verfügung. Bitte den privaten Modus verlassen.', nur: ['web'] },
32
+ // --- Anmeldung und Sitzung -----------------------------------------------
33
+ 'anmeldung.pin_fehlt': { text: 'Bitte die PIN eingeben.' },
34
+ 'anmeldung.fehlgeschlagen': { text: 'Die Anmeldung ist fehlgeschlagen. Bitte erneut versuchen.' },
35
+ 'anmeldung.nicht_abgeschlossen': { text: 'Die Anmeldung konnte nicht abgeschlossen werden. Bitte erneut versuchen.' },
36
+ 'anmeldung.wird_abgeschlossen': { text: 'Anmeldung wird gerade abgeschlossen — bitte gleich noch einmal drücken.' },
37
+ 'sitzung.abgelaufen': { text: 'Die Sitzung ist abgelaufen. Bitte erneut anmelden.' },
38
+ 'sitzung.abgelaufen_ohne_netz': { text: 'Keine Verbindung zum Server — die Sitzung ist abgelaufen. Bitte erneut anmelden.' },
39
+ 'sitzung.keine': { text: 'Keine Sitzung.' },
40
+ 'rechte.nicht_aenderbar': { text: 'Das darfst du nicht ändern — das Recht dafür vergibt der Inhaber im Panel.' },
41
+ // --- Verkauf und Positionen ----------------------------------------------
42
+ 'kasse.laden_fehlgeschlagen': { text: 'Die Kasse konnte nicht geladen werden.' },
43
+ 'artikel.laden_fehlgeschlagen': { text: 'Die Artikel konnten nicht geladen werden.' },
44
+ 'artikel.keine_freigegeben': { text: 'Keine Artikel an dieser Kasse. Im Panel unter „Kacheln & Gruppen“ freischalten.' },
45
+ 'artikel.keine_gefunden': { text: 'Keine Artikel gefunden.' },
46
+ 'artikel.steuersatz_unbekannt': { text: '„{name}“ hat einen Steuersatz, den die Kasse nicht kennt.', platzhalter: ['name'] },
47
+ 'position.betrag_fehlt': { text: 'Bitte einen Betrag eingeben.' },
48
+ 'position.bezeichnung_fehlt': { text: 'Bitte eine Bezeichnung eingeben — sie steht am Beleg.' },
49
+ 'rabatt.prozent_ungueltig': { text: 'Bitte einen Prozentwert zwischen 0,1 und 100 eingeben.' },
50
+ // --- Abschluss -----------------------------------------------------------
51
+ 'abschluss.fehlgeschlagen': { text: 'Der Abschluss ist fehlgeschlagen.' },
52
+ 'abschluss.unklar': { text: 'Unklar, ob der Beleg entstanden ist — die Antwort kam nicht an. Bitte nicht noch einmal abschließen: der Beleg kann bereits erstellt und signiert sein. Im Panel unter „Belege“ nachsehen; nur wenn er dort fehlt, den Verkauf erneut abschließen.' },
53
+ 'abschluss.nullbeleg_fehlgeschlagen': { text: 'Der Nullbeleg konnte nicht erstellt werden.' },
54
+ 'abschluss.signatur_ausgefallen': { text: 'Die Signatureinheit hat nicht geantwortet. Der Beleg ist gültig und trägt den Vermerk „Sicherheitseinrichtung ausgefallen“.' },
55
+ // --- Kartenzahlung -------------------------------------------------------
56
+ 'kartenzahlung.nicht_moeglich': { text: 'Kartenzahlung nicht möglich.' },
57
+ 'kartenzahlung.nicht_zustande': { text: 'Die Kartenzahlung ist nicht zustande gekommen.' },
58
+ 'kartenzahlung.nicht_gestartet': { text: 'Kartenzahlung nicht gestartet: {grund}', platzhalter: ['grund'] },
59
+ 'kartenzahlung.unklar': { text: 'Unklar, ob die Kartenzahlung durchgegangen ist — die Verbindung zum Terminal riss ab. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird: die Karte kann belastet sein.' },
60
+ // Die Kennung ist der einzige Anker, um die Zahlung am Terminal-Beleg wiederzufinden — liegt sie vor, gilt dieser Satz statt kartenzahlung.unklar.
61
+ 'kartenzahlung.unklar_mit_kennung': { text: 'Unklar, ob die Kartenzahlung durchgegangen ist — die Verbindung zum Terminal riss ab. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird: die Karte kann belastet sein. Kennung der Zahlung: {kennung}.', platzhalter: ['kennung'] },
62
+ 'kartenzahlung.connect_nicht_verbunden': { text: 'Kartenzahlung nicht möglich: Kasseneck Connect ist nicht verbunden — Einstellungen → Kasseneck Connect.', nur: ['web'] },
63
+ 'terminal.keines_gefunden': { text: 'Kein Hobex-Terminal gefunden — ist es eingeschaltet und im selben Netz wie dieser Rechner?', nur: ['web'] },
64
+ 'terminal.nicht_bereit': { text: 'Terminal antwortet, ist aber nicht betriebsbereit: {antwort} — TID prüfen.', platzhalter: ['antwort'], nur: ['web'] },
65
+ 'gptom.app_fehlt': { text: 'Die GP-Tom-App ist auf diesem Gerät nicht da.', nur: ['app'] },
66
+ 'gptom.suche_fehlgeschlagen': { text: 'GP Tom: Suche nach der App fehlgeschlagen: {grund}', platzhalter: ['grund'], nur: ['app'] },
67
+ 'gptom.zahlung_fehlgeschlagen': { text: 'GP Tom: Zahlung fehlgeschlagen: {grund}', platzhalter: ['grund'], nur: ['app'] },
68
+ 'gptom.terminal_antwortet_nicht': { text: 'Das Terminal hat nicht geantwortet: {grund}', platzhalter: ['grund'], nur: ['app'] },
69
+ 'gptom.zahlung_nicht_abgeschlossen': { text: 'Die Zahlung wurde nicht abgeschlossen ({code}).', platzhalter: ['code'], nur: ['app'] },
70
+ // --- Belege und Storno ---------------------------------------------------
71
+ 'belege.laden_fehlgeschlagen': { text: 'Die Belege konnten nicht geladen werden.' },
72
+ 'belege.keine_im_zeitraum': { text: 'Keine Belege in diesem Zeitraum.' },
73
+ 'beleg.laden_fehlgeschlagen': { text: 'Der Beleg konnte nicht geladen werden.' },
74
+ 'beleg.nicht_gefunden': { text: 'Der Beleg wurde nicht gefunden.' },
75
+ 'storno.fehlgeschlagen': { text: 'Das Storno ist fehlgeschlagen.' },
76
+ 'storno.grund_fehlt': { text: 'Bitte einen Grund wählen.' },
77
+ 'storno.position_fehlt': { text: 'Bitte mindestens eine Position wählen.' },
78
+ // --- Druck ---------------------------------------------------------------
79
+ 'druck.fehlgeschlagen': { text: 'Der Ausdruck ist fehlgeschlagen.' },
80
+ 'druck.nicht_moeglich': { text: 'Druck nicht möglich: {grund}', platzhalter: ['grund'] },
81
+ 'druck.testdruck_fehlgeschlagen': { text: 'Der Testdruck ist fehlgeschlagen.' },
82
+ 'druck.testdruck_nicht_moeglich': { text: 'Der Testdruck ist fehlgeschlagen: {grund}', platzhalter: ['grund'] },
83
+ 'druck.kein_drucker': { text: 'Kein Bondrucker eingerichtet — in den Einstellungen unter Drucker & Lade.' },
84
+ 'druck.drucker_nicht_erreichbar': { text: 'Drucker nicht erreichbar.' },
85
+ 'druck.job_abgelaufen': { text: 'Drucker hat den Beleg nicht abgeholt (abgelaufen).', nur: ['web'] },
86
+ 'druck.kein_drucker_gefunden': { text: 'Kein Drucker gefunden — ist er eingeschaltet und im selben Netz wie dieser Rechner?', nur: ['web'] },
87
+ 'druck.nur_chrome': { text: '{weg}-Druck geht nur in Chrome oder Edge (Windows, Mac, Android) — nicht in Safari und nicht am iPad.', platzhalter: ['weg'], nur: ['web'] },
88
+ 'druck.kein_weg_drucker': { text: 'Kein {weg}-Drucker verbunden — „{weg}-Drucker verbinden“ und den Drucker im Dialog wählen.', platzhalter: ['weg'], nur: ['web'] },
89
+ 'bluetooth.aus': { text: 'Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.', nur: ['app'] },
90
+ 'bluetooth.freigabe_fehlt': { text: 'Bitte die Freigabe in den Geräte-Einstellungen erteilen.', nur: ['app'] },
91
+ 'bluetooth.suche_fehlgeschlagen': { text: 'Die Suche ist fehlgeschlagen: {grund}', platzhalter: ['grund'], nur: ['app'] },
92
+ // --- Kasseneck Connect (nur Browser) -------------------------------------
93
+ 'connect.antwortet_nicht': { text: 'Kasseneck Connect antwortet nicht — läuft das Programm auf diesem Rechner?', nur: ['web'] },
94
+ 'connect.code_abgelaufen': { text: 'Der Kopplungs-Code ist abgelaufen — im Agent einen neuen erzeugen („kasseneck-connect pair“).', nur: ['web'] },
95
+ 'connect.zu_viele_versuche': { text: 'Zu viele Fehlversuche — eine Minute warten und noch einmal versuchen.', nur: ['web'] },
96
+ 'connect.drucker_antwortet_nicht': { text: 'Der Drucker antwortet nicht — Strom, Netzwerk und IP prüfen.', nur: ['web'] },
97
+ 'connect.nicht_gekoppelt': { text: 'Diese Kasse ist mit Kasseneck Connect nicht gekoppelt — in den Einstellungen „Koppeln“ drücken.', nur: ['web'] },
98
+ 'connect.drucker_unbekannt': { text: 'Diesen Drucker kennt Kasseneck Connect nicht (mehr) — bitte neu suchen.', nur: ['web'] },
99
+ 'connect.ursprung_nicht_freigegeben': { text: 'Kasseneck Connect nimmt von dieser Adresse nichts an (Ursprung nicht freigegeben).', nur: ['web'] },
100
+ 'connect.nicht_installiert': { text: 'Kasseneck Connect nicht gefunden — bitte installieren.', nur: ['web'] },
101
+ // --- Einstellungen -------------------------------------------------------
102
+ 'einstellungen.laden_fehlgeschlagen': { text: 'Die Einstellungen konnten nicht geladen werden.' },
103
+ 'einstellungen.speichern_fehlgeschlagen': { text: 'Die Einstellung konnte nicht gespeichert werden.' },
104
+ 'einstellungen.noch_nicht_geladen': { text: 'Noch nicht geladen — bitte kurz warten oder neu anmelden.' },
105
+ 'einstellungen.ip_ungueltig': { text: 'Keine gültige IP-Adresse (z. B. 192.168.1.50).' },
106
+ 'entkopplung.fehlgeschlagen': { text: 'Entkoppeln fehlgeschlagen.' },
107
+ 'logo.hochladen_fehlgeschlagen': { text: 'Hochladen fehlgeschlagen.' },
108
+ 'logo.entfernen_fehlgeschlagen': { text: 'Entfernen fehlgeschlagen.' },
109
+ // --- Nur App -------------------------------------------------------------
110
+ 'app.nicht_im_browser': { text: 'Die Kassen-App läuft nicht im Browser — dafür gibt es kasse.kasseneck.at.', nur: ['app'] },
111
+ 'app.im_browser_oeffnen': { text: 'Bitte im Browser öffnen: {ziel}', platzhalter: ['ziel'], nur: ['app'] },
112
+ };
113
+ // Auf den gemeinsamen Typ gebracht: `Object.entries(MELDUNGEN)` liefert sonst
114
+ // pro Schluessel den engsten Literaltyp, und `platzhalter`/`nur` waeren nur
115
+ // auf manchen Zweigen der Vereinigung vorhanden.
116
+ exports.MELDUNGEN = MELDUNGEN_ROH;
117
+ /**
118
+ * In welcher Reihenfolge ein Fehler eingeordnet wird — auf beiden Seiten
119
+ * dieselbe. Die Arten:
120
+ * api — HTTP 200, `status:'error'`: der Satz des Backends, woertlich
121
+ * klartext — schon fuer den Bildschirm geschrieben: sein eigener Text
122
+ * zeitablauf — die Frist lief ab, die Anfrage war draussen
123
+ * netz — keine Verbindung zustande gekommen oder abgerissen
124
+ * unerwartet — der Server hat geantwortet, aber nicht wie zugesagt
125
+ * (HTML statt JSON, 500, fehlende Huelle); `status` = HTTP-Code
126
+ * sonst — alles Uebrige ist technisch: der Ersatzsatz des Vorgangs
127
+ */
128
+ exports.FEHLERREGELN = [
129
+ { art: 'api', verhalten: 'server_text' },
130
+ { art: 'klartext', verhalten: 'eigener_text' },
131
+ { art: 'zeitablauf', schluessel: 'netz.zeitablauf' },
132
+ { art: 'netz', schluessel: 'netz.keine_verbindung' },
133
+ { art: 'unerwartet', schluessel: 'server.unerwartet' },
134
+ { art: 'sonst', verhalten: 'ersatz' },
135
+ ];
136
+ /** Der Satz zum Schluessel, Platzhalter ersetzt. Fehlt ein Wert, wirft es — ein `{status}` am Tresen waere schlimmer. */
137
+ function meldung(schluessel, werte = {}) {
138
+ const eintrag = exports.MELDUNGEN[schluessel];
139
+ return eintrag.text.replace(/\{([a-z]+)\}/g, (_, name) => {
140
+ const wert = werte[name];
141
+ if (wert === undefined)
142
+ throw new Error(`meldung(${schluessel}): Platzhalter {${name}} ohne Wert`);
143
+ return String(wert);
144
+ });
145
+ }
146
+ /** Gilt der Satz auf dieser Seite? */
147
+ function meldungGiltFuer(schluessel, seite) {
148
+ const eintrag = exports.MELDUNGEN[schluessel];
149
+ return eintrag.nur === undefined || eintrag.nur.includes(seite);
150
+ }
@@ -10,3 +10,4 @@ export { verteileRabatt } from '../receipt/discount.js';
10
10
  export { cancelScopeOf, receiptsScopeOf, type RegisterScope, type RegisterUserPerms } from '../register/pairing.js';
11
11
  export { type NetzDrucker, type DruckJob, type DruckJobStatus, type CreatePrintJobOptions, listMyPrinters, createPrintJob, getPrintJob } from './drucker.js';
12
12
  export { listMyTipRecipients } from './trinkgeld.js';
13
+ export { MELDUNGEN, FEHLERREGELN, meldung, meldungGiltFuer, type Meldung, type MeldungsSchluessel, type Fehlerart, type Seite, } from './texte.js';
@@ -14,3 +14,5 @@ export { verteileRabatt } from '../receipt/discount.js';
14
14
  export { cancelScopeOf, receiptsScopeOf } from '../register/pairing.js';
15
15
  export { listMyPrinters, createPrintJob, getPrintJob } from './drucker.js';
16
16
  export { listMyTipRecipients } from './trinkgeld.js';
17
+ // Was die Kasse selbst sagt — ein Katalog fuer Browser-Kasse und App.
18
+ export { MELDUNGEN, FEHLERREGELN, meldung, meldungGiltFuer, } from './texte.js';