@kreiseck/kasseneck-api 0.9.1 → 0.9.3
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/CHANGELOG.md +73 -0
- package/dist/cjs/kasse/index.d.ts +2 -2
- package/dist/cjs/kasse/index.js +5 -2
- package/dist/cjs/kasse/settings.d.ts +17 -0
- package/dist/cjs/kasse/settings.js +16 -2
- package/dist/cjs/kasse/texte.d.ts +83 -0
- package/dist/cjs/kasse/texte.js +75 -1
- package/dist/esm/kasse/index.d.ts +2 -2
- package/dist/esm/kasse/index.js +2 -2
- package/dist/esm/kasse/settings.d.ts +17 -0
- package/dist/esm/kasse/settings.js +15 -1
- package/dist/esm/kasse/texte.d.ts +83 -0
- package/dist/esm/kasse/texte.js +73 -0
- package/fixtures/hobex-hps-codes.json +1 -1
- package/fixtures/kasse-settings-standard.json +1 -0
- package/fixtures/kasse-texte.json +71 -2
- package/fixtures/oberflaeche.json +5 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,79 @@ Was vor 0.7.0 geschah, steht in der Commit-Historie (`git log`); ab hier wird
|
|
|
4
4
|
es hier geführt. Ein Eintrag nennt die Änderung **und ihren Grund** —
|
|
5
5
|
nur der Grund überlebt den nächsten Umbau.
|
|
6
6
|
|
|
7
|
+
## 0.9.3
|
|
8
|
+
|
|
9
|
+
### `qrModus` am Geraet: mit welchem Befehl der Signatur-QR auf den Bon kommt
|
|
10
|
+
|
|
11
|
+
**Anlass:** Der Drucker-Wizard laesst zwei Probedrucke machen — einen QR als
|
|
12
|
+
Rasterbild, einen ueber den nativen ESC/POS-Befehl — und fragt, welcher lesbar
|
|
13
|
+
war. Diese Antwort musste bisher nirgends hin: die Kassen druckten fest im
|
|
14
|
+
Rastermodus. An Geraeten, die GS v 0 nicht koennen, kam damit ein Bon ohne
|
|
15
|
+
lesbaren QR heraus, und das ist nach § 132a BAO keine Belegerteilung — der
|
|
16
|
+
Ausfall faellt am Tresen niemandem auf.
|
|
17
|
+
|
|
18
|
+
- `QR_MODUS` (`raster` | `escpos`) als Laufzeitliste und Typ `KasseQrModus`.
|
|
19
|
+
- `KasseSettingsGeraet.qrModus`, Vorgabe `raster` — der bisherige Weg bleibt
|
|
20
|
+
damit fuer jedes bestehende Geraet unveraendert.
|
|
21
|
+
- **Am Geraet und nicht am Betrieb:** welchen Befehl ein Thermodrucker
|
|
22
|
+
versteht, entscheidet das Modell an dieser einen Kasse.
|
|
23
|
+
|
|
24
|
+
## 0.9.2
|
|
25
|
+
|
|
26
|
+
### Sechzehn Saetze: einen Beleg weitergeben, und der Drucker-Wizard
|
|
27
|
+
|
|
28
|
+
**Anlass:** Ein alter Beleg soll sich weitergeben lassen — Link kopieren,
|
|
29
|
+
teilen, per E-Mail senden — und der Drucker richtet sich kuenftig ueber einen
|
|
30
|
+
Wizard ein, der erst testet und bestaetigen laesst und dann speichert. Beides
|
|
31
|
+
entsteht **gleichzeitig** in der Browser-Kasse und in der Kassen-App. Ohne
|
|
32
|
+
diese Schluessel haetten beide Seiten dieselben sieben Lagen unabhaengig
|
|
33
|
+
formuliert, und der Kassier haette zwei verschiedene Woerter fuer dieselbe
|
|
34
|
+
Sache gelesen — genau das, wogegen es diesen Katalog gibt.
|
|
35
|
+
|
|
36
|
+
- **Beleg weitergeben:** `beleg.link_kopiert`, `beleg.teilen_text`
|
|
37
|
+
(`betrieb`, `nummer`, `betrag`, `link`), `beleg.nicht_teilbar`,
|
|
38
|
+
`beleg.test_hinweis_teilen`.
|
|
39
|
+
- **Per E-Mail senden:** `beleg.mail_gesendet` (`an`) und die vier Ausgaenge
|
|
40
|
+
`beleg.mail_adresse_ungueltig`, `beleg.mail_zu_oft`,
|
|
41
|
+
`beleg.mail_fehlgeschlagen`, `beleg.mail_nicht_gefunden`.
|
|
42
|
+
- **Drucker-Wizard** (beide Kassen, deshalb ohne `nur`):
|
|
43
|
+
`druck.wizard_verbinden` (`name`), `druck.wizard_testdruck_frage`,
|
|
44
|
+
`druck.wizard_qr_frage`, `druck.wizard_qr_keiner_hinweis`,
|
|
45
|
+
`druck.wizard_nichts_gekommen`, `druck.wizard_gespeichert` (`name`),
|
|
46
|
+
`druck.wizard_abgebrochen`.
|
|
47
|
+
|
|
48
|
+
**Neu: `BELEG_MAIL_FEHLER` und `belegMailFehler(code)`** — die Zuordnung vom
|
|
49
|
+
`code` des Backends (`adresse_ungueltig`, `zu_oft`, `versand_fehlgeschlagen`,
|
|
50
|
+
`beleg_nicht_gefunden`) auf den Satz. Grund: die vier Ausgaenge verlangen vom
|
|
51
|
+
Kassier vier verschiedene Handlungen, und beide Kassen sollen am **Code**
|
|
52
|
+
entscheiden statt an einer Formulierung, die sich im Backend jederzeit aendern
|
|
53
|
+
darf. Ein unbekannter Code faellt auf `beleg.mail_fehlgeschlagen` zurueck — ein
|
|
54
|
+
leerer Schirm waere schlimmer als ein zu allgemeiner Satz. Die Zuordnung steht
|
|
55
|
+
als `belegMailFehler` mit in `fixtures/kasse-texte.json`, weil die App den
|
|
56
|
+
Katalog aus dem Tarball liest und das Web die Quelle direkt importiert.
|
|
57
|
+
|
|
58
|
+
Bewusst ein Objekt und **keine** Liste in Grossschrift: der
|
|
59
|
+
Oberflaechen-Vertrag liest jede exportierte Liste als Enum der
|
|
60
|
+
Kasseneinstellungen ein, und der Dart-Zwilling schickt deren Werte durch
|
|
61
|
+
`KasseSettings.aus`. Fehlercodes haetten dort nichts verloren.
|
|
62
|
+
|
|
63
|
+
**Abweichung von der Vorlage, bewusst:** `beleg.mail_nicht_gefunden` sagt
|
|
64
|
+
„Dieser Beleg wurde nicht gefunden — er konnte nicht gesendet werden." und
|
|
65
|
+
nicht denselben Satz wie das schon vorhandene `beleg.nicht_gefunden`. Dort
|
|
66
|
+
scheitert das Oeffnen, hier das Senden; der Kassier steht vor einem Adressfeld
|
|
67
|
+
und muss lesen, dass nichts hinausgegangen ist. Ein Satz zweimal im Katalog
|
|
68
|
+
faellt ohnehin schon seit 0.9.1 im Test auf.
|
|
69
|
+
|
|
70
|
+
**Neue abgeleitete Pruefungen:** kein Satz zum Weitergeben eines Belegs ist an
|
|
71
|
+
eine Seite gebunden; der Teilen-Text traegt den Link, und zwar am Schluss;
|
|
72
|
+
jeder platzhalterlose `beleg.mail_`-Satz haengt an genau einem Backend-Code (und
|
|
73
|
+
kein Code an zweien); der einzige `beleg.mail_`-Satz mit Platzhalter ist der
|
|
74
|
+
ueber das Gelingen; jeder Satz des Wizards gilt auf beiden Seiten.
|
|
75
|
+
|
|
76
|
+
`FEHLERREGELN` bleibt unveraendert: die Codes sind die Verfeinerung **eines**
|
|
77
|
+
Aufrufs (`sendReceiptEmail`), keine neue Art, einen Transportfehler
|
|
78
|
+
einzuordnen.
|
|
79
|
+
|
|
7
80
|
## 0.9.1
|
|
8
81
|
|
|
9
82
|
### Elf Saetze fuer die vier Ausgaenge einer Kartenzahlung und das Terminal-Protokoll
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
|
|
4
4
|
* (die Rewrites-Waechter der Web-App leiten daraus ab).
|
|
5
5
|
*/
|
|
6
|
-
export { type KasseStil, type KasseSchrift, type KasseWasserzeichen, type KasseMenge, type KasseTgModus, type KasseKassierenModus, type KasseKartenanbieter, KARTENANBIETER, type KasseBelegAusgabe, type KasseTastenAktion, type KasseTastenkarte, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, type KasseLayout, type KasseKatpos, type KasseHoehe, type KasseDruckerArt, type KasseTerminalVia, type KasseTerminalArt, type KassePapier, type KasseZeichensatz, type KasseSchnitt, type KasseLadeAuto, type KasseLogoGroesse, type KasseSchriftEinst, type KasseKachelstil, type KasseAutoAbMin, type KasseRabatt, type KasseWzSeite, type KasseWzStaerke, type KasseLogoSkala, type KasseWzSkala, type KasseFertigSekunden, type Schalterkarte, type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
|
|
6
|
+
export { type KasseStil, type KasseSchrift, type KasseWasserzeichen, type KasseMenge, type KasseTgModus, type KasseKassierenModus, type KasseKartenanbieter, KARTENANBIETER, type KasseBelegAusgabe, type KasseTastenAktion, type KasseTastenkarte, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, type KasseLayout, type KasseKatpos, type KasseHoehe, type KasseDruckerArt, type KasseTerminalVia, type KasseTerminalArt, type KassePapier, type KasseZeichensatz, type KasseSchnitt, type KasseLadeAuto, type KasseQrModus, type KasseLogoGroesse, type KasseSchriftEinst, type KasseKachelstil, type KasseAutoAbMin, type KasseRabatt, type KasseWzSeite, type KasseWzStaerke, type KasseLogoSkala, type KasseWzSkala, type KasseFertigSekunden, type Schalterkarte, type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, QR_MODUS, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
|
|
7
7
|
export { type ArticleGroup, type ArticleGroupPayload, fromArticleGroupPayload, type KasseArtikel, type KasseArtikelPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, type Mengenregel, type MengenVorgabe, mengenregelFuerEinheit, mengenVorgabe, mengeErlaubt, } from './artikel.js';
|
|
8
8
|
export { getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings } from './client.js';
|
|
9
9
|
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';
|
|
13
|
+
export { MELDUNGEN, FEHLERREGELN, meldung, meldungGiltFuer, BELEG_MAIL_FEHLER, belegMailFehler, type Meldung, type MeldungsSchluessel, type Fehlerart, type Seite, type BelegMailFehlercode, } from './texte.js';
|
package/dist/cjs/kasse/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.meldungGiltFuer = exports.meldung = exports.FEHLERREGELN = exports.MELDUNGEN = exports.listMyTipRecipients = void 0;
|
|
3
|
+
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.QR_MODUS = 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.belegMailFehler = exports.BELEG_MAIL_FEHLER = exports.meldungGiltFuer = exports.meldung = exports.FEHLERREGELN = exports.MELDUNGEN = exports.listMyTipRecipients = exports.getPrintJob = 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
|
|
@@ -32,6 +32,7 @@ Object.defineProperty(exports, "PAPIER", { enumerable: true, get: function () {
|
|
|
32
32
|
Object.defineProperty(exports, "ZEICHENSATZ", { enumerable: true, get: function () { return settings_js_1.ZEICHENSATZ; } });
|
|
33
33
|
Object.defineProperty(exports, "SCHNITT", { enumerable: true, get: function () { return settings_js_1.SCHNITT; } });
|
|
34
34
|
Object.defineProperty(exports, "LADE_AUTO", { enumerable: true, get: function () { return settings_js_1.LADE_AUTO; } });
|
|
35
|
+
Object.defineProperty(exports, "QR_MODUS", { enumerable: true, get: function () { return settings_js_1.QR_MODUS; } });
|
|
35
36
|
Object.defineProperty(exports, "TASTEN_AKTIONEN", { enumerable: true, get: function () { return settings_js_1.TASTEN_AKTIONEN; } });
|
|
36
37
|
Object.defineProperty(exports, "LOGO_GROESSE", { enumerable: true, get: function () { return settings_js_1.LOGO_GROESSE; } });
|
|
37
38
|
Object.defineProperty(exports, "SCHRIFT_EINST", { enumerable: true, get: function () { return settings_js_1.SCHRIFT_EINST; } });
|
|
@@ -74,3 +75,5 @@ Object.defineProperty(exports, "MELDUNGEN", { enumerable: true, get: function ()
|
|
|
74
75
|
Object.defineProperty(exports, "FEHLERREGELN", { enumerable: true, get: function () { return texte_js_1.FEHLERREGELN; } });
|
|
75
76
|
Object.defineProperty(exports, "meldung", { enumerable: true, get: function () { return texte_js_1.meldung; } });
|
|
76
77
|
Object.defineProperty(exports, "meldungGiltFuer", { enumerable: true, get: function () { return texte_js_1.meldungGiltFuer; } });
|
|
78
|
+
Object.defineProperty(exports, "BELEG_MAIL_FEHLER", { enumerable: true, get: function () { return texte_js_1.BELEG_MAIL_FEHLER; } });
|
|
79
|
+
Object.defineProperty(exports, "belegMailFehler", { enumerable: true, get: function () { return texte_js_1.belegMailFehler; } });
|
|
@@ -50,6 +50,21 @@ export declare const SCHNITT: readonly ["partial", "full", "none"];
|
|
|
50
50
|
export type KasseSchnitt = typeof SCHNITT[number];
|
|
51
51
|
export declare const LADE_AUTO: readonly ["bar", "immer", "nie"];
|
|
52
52
|
export type KasseLadeAuto = typeof LADE_AUTO[number];
|
|
53
|
+
/**
|
|
54
|
+
* Mit welchem Befehl der Signatur-QR auf den Bon kommt.
|
|
55
|
+
*
|
|
56
|
+
* `raster` = der QR wird als Bild gerastert (GS v 0) und geht darum durch jeden
|
|
57
|
+
* Drucker, der Bilder kann. `escpos` = der native QR-Befehl (GS ( k) — schaerfer
|
|
58
|
+
* und schneller, aber aeltere Geraete drucken dann gar keinen QR oder
|
|
59
|
+
* Zeichensalat.
|
|
60
|
+
*
|
|
61
|
+
* **Eine Geraete-Einstellung, keine des Betriebs:** derselbe Bon kommt an einer
|
|
62
|
+
* Kasse sauber heraus und an der Nebenkasse nicht. Und sie ist nicht
|
|
63
|
+
* kosmetisch — nach § 132a BAO ist der QR Teil des Belegs; wer den falschen
|
|
64
|
+
* Modus stehen laesst, erteilt Belege ohne lesbare Signatur.
|
|
65
|
+
*/
|
|
66
|
+
export declare const QR_MODUS: readonly ["raster", "escpos"];
|
|
67
|
+
export type KasseQrModus = typeof QR_MODUS[number];
|
|
53
68
|
/** Groesse des Kuerzel-Logos in der Kopfzeile der Kasse. */
|
|
54
69
|
export declare const LOGO_GROESSE: readonly ["S", "M", "L"];
|
|
55
70
|
export type KasseLogoGroesse = typeof LOGO_GROESSE[number];
|
|
@@ -176,6 +191,8 @@ export interface KasseSettingsGeraet {
|
|
|
176
191
|
papier: KassePapier;
|
|
177
192
|
zeichensatz: KasseZeichensatz;
|
|
178
193
|
schnitt: KasseSchnitt;
|
|
194
|
+
/** Befehl fuer den Signatur-QR auf dem Bon; der Drucker-Wizard probiert beide aus. */
|
|
195
|
+
qrModus: KasseQrModus;
|
|
179
196
|
ladeAn: boolean;
|
|
180
197
|
ladeAuto: KasseLadeAuto;
|
|
181
198
|
terminalIp: string;
|
|
@@ -9,7 +9,7 @@
|
|
|
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.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;
|
|
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.QR_MODUS = 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
14
|
/*
|
|
15
15
|
* Jedes Enum steht als Liste zur Laufzeit da, der Typ leitet sich daraus ab
|
|
@@ -42,6 +42,20 @@ exports.PAPIER = ['mm58', 'mm80'];
|
|
|
42
42
|
exports.ZEICHENSATZ = ['CP1252', 'CP437'];
|
|
43
43
|
exports.SCHNITT = ['partial', 'full', 'none'];
|
|
44
44
|
exports.LADE_AUTO = ['bar', 'immer', 'nie'];
|
|
45
|
+
/**
|
|
46
|
+
* Mit welchem Befehl der Signatur-QR auf den Bon kommt.
|
|
47
|
+
*
|
|
48
|
+
* `raster` = der QR wird als Bild gerastert (GS v 0) und geht darum durch jeden
|
|
49
|
+
* Drucker, der Bilder kann. `escpos` = der native QR-Befehl (GS ( k) — schaerfer
|
|
50
|
+
* und schneller, aber aeltere Geraete drucken dann gar keinen QR oder
|
|
51
|
+
* Zeichensalat.
|
|
52
|
+
*
|
|
53
|
+
* **Eine Geraete-Einstellung, keine des Betriebs:** derselbe Bon kommt an einer
|
|
54
|
+
* Kasse sauber heraus und an der Nebenkasse nicht. Und sie ist nicht
|
|
55
|
+
* kosmetisch — nach § 132a BAO ist der QR Teil des Belegs; wer den falschen
|
|
56
|
+
* Modus stehen laesst, erteilt Belege ohne lesbare Signatur.
|
|
57
|
+
*/
|
|
58
|
+
exports.QR_MODUS = ['raster', 'escpos'];
|
|
45
59
|
/*
|
|
46
60
|
* Auch die uebrigen Wertemengen der Einstellungen stehen jetzt als Liste da —
|
|
47
61
|
* vorher waren sie nur als Union am Feld ausgeschrieben. Ein Zwilling konnte
|
|
@@ -115,7 +129,7 @@ exports.KASSE_GERAET_STANDARD = Object.freeze({
|
|
|
115
129
|
tasten: { ...exports.KASSE_TASTEN_STANDARD },
|
|
116
130
|
druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerName: '', druckerId: '', druckerDevid: 'local_printer',
|
|
117
131
|
connectDruckerId: '',
|
|
118
|
-
papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial',
|
|
132
|
+
papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial', qrModus: 'raster',
|
|
119
133
|
ladeAn: false, ladeAuto: 'bar',
|
|
120
134
|
terminalIp: '', terminalPort: 8080, terminalVia: 'direkt',
|
|
121
135
|
terminalArt: 'keins', terminalTid: '', tastenMarken: true,
|
|
@@ -221,6 +221,35 @@ declare const MELDUNGEN_ROH: {
|
|
|
221
221
|
readonly 'storno.position_fehlt': {
|
|
222
222
|
readonly text: "Bitte mindestens eine Position wählen.";
|
|
223
223
|
};
|
|
224
|
+
readonly 'beleg.link_kopiert': {
|
|
225
|
+
readonly text: "Der Link zum Beleg liegt in der Zwischenablage.";
|
|
226
|
+
};
|
|
227
|
+
readonly 'beleg.teilen_text': {
|
|
228
|
+
readonly text: "Beleg {nummer} von {betrieb} über {betrag}: {link}";
|
|
229
|
+
readonly platzhalter: readonly ["betrieb", "nummer", "betrag", "link"];
|
|
230
|
+
};
|
|
231
|
+
readonly 'beleg.nicht_teilbar': {
|
|
232
|
+
readonly text: "Für diesen Beleg gibt es keinen Link — er stammt aus einer älteren Kasse.";
|
|
233
|
+
};
|
|
234
|
+
readonly 'beleg.test_hinweis_teilen': {
|
|
235
|
+
readonly text: "Test-Umgebung — der Beleg ist steuerlich nicht gültig.";
|
|
236
|
+
};
|
|
237
|
+
readonly 'beleg.mail_gesendet': {
|
|
238
|
+
readonly text: "Der Beleg wurde an {an} gesendet.";
|
|
239
|
+
readonly platzhalter: readonly ["an"];
|
|
240
|
+
};
|
|
241
|
+
readonly 'beleg.mail_adresse_ungueltig': {
|
|
242
|
+
readonly text: "Diese E-Mail-Adresse ist nicht gültig.";
|
|
243
|
+
};
|
|
244
|
+
readonly 'beleg.mail_zu_oft': {
|
|
245
|
+
readonly text: "Dieser Beleg wurde schon oft gesendet — bitte später noch einmal.";
|
|
246
|
+
};
|
|
247
|
+
readonly 'beleg.mail_fehlgeschlagen': {
|
|
248
|
+
readonly text: "Der Beleg konnte nicht gesendet werden. Bitte noch einmal versuchen.";
|
|
249
|
+
};
|
|
250
|
+
readonly 'beleg.mail_nicht_gefunden': {
|
|
251
|
+
readonly text: "Dieser Beleg wurde nicht gefunden — er konnte nicht gesendet werden.";
|
|
252
|
+
};
|
|
224
253
|
readonly 'druck.fehlgeschlagen': {
|
|
225
254
|
readonly text: "Der Ausdruck ist fehlgeschlagen.";
|
|
226
255
|
};
|
|
@@ -259,6 +288,29 @@ declare const MELDUNGEN_ROH: {
|
|
|
259
288
|
readonly platzhalter: readonly ["weg"];
|
|
260
289
|
readonly nur: readonly ["web"];
|
|
261
290
|
};
|
|
291
|
+
readonly 'druck.wizard_verbinden': {
|
|
292
|
+
readonly text: "Verbinde mit {name} …";
|
|
293
|
+
readonly platzhalter: readonly ["name"];
|
|
294
|
+
};
|
|
295
|
+
readonly 'druck.wizard_testdruck_frage': {
|
|
296
|
+
readonly text: "Ist der Testdruck gekommen?";
|
|
297
|
+
};
|
|
298
|
+
readonly 'druck.wizard_qr_frage': {
|
|
299
|
+
readonly text: "Welcher QR-Code ist sauber gedruckt?";
|
|
300
|
+
};
|
|
301
|
+
readonly 'druck.wizard_qr_keiner_hinweis': {
|
|
302
|
+
readonly text: "Kein QR-Code kam sauber — der Beleg zeigt den QR-Code dann am Bildschirm.";
|
|
303
|
+
};
|
|
304
|
+
readonly 'druck.wizard_nichts_gekommen': {
|
|
305
|
+
readonly text: "Nichts gekommen? Drucker an, Papier drin, richtiges Gerät gewählt?";
|
|
306
|
+
};
|
|
307
|
+
readonly 'druck.wizard_gespeichert': {
|
|
308
|
+
readonly text: "{name} ist eingerichtet.";
|
|
309
|
+
readonly platzhalter: readonly ["name"];
|
|
310
|
+
};
|
|
311
|
+
readonly 'druck.wizard_abgebrochen': {
|
|
312
|
+
readonly text: "Nichts gespeichert.";
|
|
313
|
+
};
|
|
262
314
|
readonly 'bluetooth.aus': {
|
|
263
315
|
readonly text: "Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.";
|
|
264
316
|
readonly nur: readonly ["app"];
|
|
@@ -368,6 +420,37 @@ export declare const FEHLERREGELN: readonly [{
|
|
|
368
420
|
readonly verhalten: "ersatz";
|
|
369
421
|
}];
|
|
370
422
|
export type Fehlerart = (typeof FEHLERREGELN)[number]['art'];
|
|
423
|
+
/**
|
|
424
|
+
* Beleg per E-Mail senden: welcher `code` des Backends welchen Satz bekommt.
|
|
425
|
+
*
|
|
426
|
+
* `FEHLERREGELN` bleibt davon unberuehrt — das hier ist keine neue Art, einen
|
|
427
|
+
* Transportfehler einzuordnen, sondern die Verfeinerung EINES Aufrufs
|
|
428
|
+
* (`sendReceiptEmail`). Die vier Ausgaenge sind fuer den Kassier vier
|
|
429
|
+
* verschiedene Handlungen: Adresse verbessern, spaeter noch einmal, noch
|
|
430
|
+
* einmal senden, Beleg suchen. Beide Kassen entscheiden am `code`, nicht am
|
|
431
|
+
* Satz des Backends — sonst haengt das Wort am Tresen an einer Formulierung,
|
|
432
|
+
* die sich im Backend jederzeit aendern darf.
|
|
433
|
+
*
|
|
434
|
+
* Bewusst ein Objekt und keine Liste in GROSSSCHRIFT: der
|
|
435
|
+
* Oberflaechen-Vertrag (`fixtures/oberflaeche.json`) liest jede exportierte
|
|
436
|
+
* Liste als Enum der Kasseneinstellungen ein, und der Dart-Zwilling schickt
|
|
437
|
+
* deren Werte durch `KasseSettings.aus`. Fehlercodes haben dort nichts
|
|
438
|
+
* verloren; sie stehen in `fixtures/kasse-texte.json`.
|
|
439
|
+
*/
|
|
440
|
+
export declare const BELEG_MAIL_FEHLER: {
|
|
441
|
+
readonly adresse_ungueltig: "beleg.mail_adresse_ungueltig";
|
|
442
|
+
readonly zu_oft: "beleg.mail_zu_oft";
|
|
443
|
+
readonly versand_fehlgeschlagen: "beleg.mail_fehlgeschlagen";
|
|
444
|
+
readonly beleg_nicht_gefunden: "beleg.mail_nicht_gefunden";
|
|
445
|
+
};
|
|
446
|
+
export type BelegMailFehlercode = keyof typeof BELEG_MAIL_FEHLER;
|
|
447
|
+
/**
|
|
448
|
+
* Der Satz zu einem `code` des Backends. Einen Code, den dieses Paket noch
|
|
449
|
+
* nicht kennt, faengt der allgemeine Satz auf: das Senden ist gescheitert und
|
|
450
|
+
* darf wiederholt werden. Ein leerer Schirm waere schlimmer als ein zu
|
|
451
|
+
* allgemeiner Satz.
|
|
452
|
+
*/
|
|
453
|
+
export declare function belegMailFehler(code: string | undefined | null): MeldungsSchluessel;
|
|
371
454
|
/** Der Satz zum Schluessel, Platzhalter ersetzt. Fehlt ein Wert, wirft es — ein `{status}` am Tresen waere schlimmer. */
|
|
372
455
|
export declare function meldung(schluessel: MeldungsSchluessel, werte?: Record<string, string | number>): string;
|
|
373
456
|
/** Gilt der Satz auf dieser Seite? */
|
package/dist/cjs/kasse/texte.js
CHANGED
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
* auf einer Plattform vorkommen kann.
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.FEHLERREGELN = exports.MELDUNGEN = void 0;
|
|
19
|
+
exports.BELEG_MAIL_FEHLER = exports.FEHLERREGELN = exports.MELDUNGEN = void 0;
|
|
20
|
+
exports.belegMailFehler = belegMailFehler;
|
|
20
21
|
exports.meldung = meldung;
|
|
21
22
|
exports.meldungGiltFuer = meldungGiltFuer;
|
|
22
23
|
const MELDUNGEN_ROH = {
|
|
@@ -95,6 +96,30 @@ const MELDUNGEN_ROH = {
|
|
|
95
96
|
'storno.fehlgeschlagen': { text: 'Das Storno ist fehlgeschlagen.' },
|
|
96
97
|
'storno.grund_fehlt': { text: 'Bitte einen Grund wählen.' },
|
|
97
98
|
'storno.position_fehlt': { text: 'Bitte mindestens eine Position wählen.' },
|
|
99
|
+
// --- Beleg weitergeben: Link, Teilen, E-Mail -----------------------------
|
|
100
|
+
// Kopieren, Teilen und Senden fuehren zu demselben Ziel: der oeffentlichen
|
|
101
|
+
// Belegseite (beleg.kasseneck.at/<fullReceiptId>). Kein Satz davon ist
|
|
102
|
+
// plattformgebunden — nur die Huelle unterscheidet sich, nicht das Wort.
|
|
103
|
+
'beleg.link_kopiert': { text: 'Der Link zum Beleg liegt in der Zwischenablage.' },
|
|
104
|
+
// Der Text, der beim Teilen mitgeht. Der Link steht am Schluss, damit ihn
|
|
105
|
+
// jede Huelle (SMS, Messenger, Mail) bis zum Ende als Link erkennt und nicht
|
|
106
|
+
// mitten im Satz abbricht.
|
|
107
|
+
'beleg.teilen_text': { text: 'Beleg {nummer} von {betrieb} über {betrag}: {link}', platzhalter: ['betrieb', 'nummer', 'betrag', 'link'] },
|
|
108
|
+
// Belege aus dem Altbestand tragen keine `fullReceiptId`; ohne sie gibt es
|
|
109
|
+
// keine Belegseite. Der Satz nennt den Grund, sonst sucht der Kassier den
|
|
110
|
+
// Fehler bei sich und versucht es ein zweites Mal.
|
|
111
|
+
'beleg.nicht_teilbar': { text: 'Für diesen Beleg gibt es keinen Link — er stammt aus einer älteren Kasse.' },
|
|
112
|
+
// Ein Testbeleg hat eine Belegseite, ist aber steuerlich nichts wert. Wer
|
|
113
|
+
// den Link weitergibt, muss das vorher lesen, nicht hinterher.
|
|
114
|
+
'beleg.test_hinweis_teilen': { text: 'Test-Umgebung — der Beleg ist steuerlich nicht gültig.' },
|
|
115
|
+
'beleg.mail_gesendet': { text: 'Der Beleg wurde an {an} gesendet.', platzhalter: ['an'] },
|
|
116
|
+
'beleg.mail_adresse_ungueltig': { text: 'Diese E-Mail-Adresse ist nicht gültig.' },
|
|
117
|
+
'beleg.mail_zu_oft': { text: 'Dieser Beleg wurde schon oft gesendet — bitte später noch einmal.' },
|
|
118
|
+
'beleg.mail_fehlgeschlagen': { text: 'Der Beleg konnte nicht gesendet werden. Bitte noch einmal versuchen.' },
|
|
119
|
+
// Bewusst nicht derselbe Satz wie `beleg.nicht_gefunden`: dort scheitert das
|
|
120
|
+
// Oeffnen, hier das Senden. Der Kassier steht vor einem Adressfeld und muss
|
|
121
|
+
// lesen, dass nichts hinausgegangen ist.
|
|
122
|
+
'beleg.mail_nicht_gefunden': { text: 'Dieser Beleg wurde nicht gefunden — er konnte nicht gesendet werden.' },
|
|
98
123
|
// --- Druck ---------------------------------------------------------------
|
|
99
124
|
'druck.fehlgeschlagen': { text: 'Der Ausdruck ist fehlgeschlagen.' },
|
|
100
125
|
'druck.nicht_moeglich': { text: 'Druck nicht möglich: {grund}', platzhalter: ['grund'] },
|
|
@@ -106,6 +131,22 @@ const MELDUNGEN_ROH = {
|
|
|
106
131
|
'druck.kein_drucker_gefunden': { text: 'Kein Drucker gefunden — ist er eingeschaltet und im selben Netz wie dieser Rechner?', nur: ['web'] },
|
|
107
132
|
'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'] },
|
|
108
133
|
'druck.kein_weg_drucker': { text: 'Kein {weg}-Drucker verbunden — „{weg}-Drucker verbinden“ und den Drucker im Dialog wählen.', platzhalter: ['weg'], nur: ['web'] },
|
|
134
|
+
// Der Drucker-Wizard: suchen, verbinden, Testdruck, QR-Probe, erst dann
|
|
135
|
+
// speichern. Derselbe Ablauf in beiden Kassen — deshalb hat kein Satz ein
|
|
136
|
+
// `nur`, obwohl der Weg zum Drucker verschieden ist (Bluetooth in der App,
|
|
137
|
+
// Web Bluetooth im Browser). Was der Chef liest, ist beidesmal dasselbe.
|
|
138
|
+
'druck.wizard_verbinden': { text: 'Verbinde mit {name} …', platzhalter: ['name'] },
|
|
139
|
+
'druck.wizard_testdruck_frage': { text: 'Ist der Testdruck gekommen?' },
|
|
140
|
+
'druck.wizard_qr_frage': { text: 'Welcher QR-Code ist sauber gedruckt?' },
|
|
141
|
+
// Kein Modus druckt einen lesbaren QR-Code: gespeichert wird trotzdem (mit
|
|
142
|
+
// Raster als Vorgabe), aber der Chef muss wissen, dass der QR-Code dann vom
|
|
143
|
+
// Bildschirm gelesen werden muss — nach RKSV gehoert er an den Beleg.
|
|
144
|
+
'druck.wizard_qr_keiner_hinweis': { text: 'Kein QR-Code kam sauber — der Beleg zeigt den QR-Code dann am Bildschirm.' },
|
|
145
|
+
'druck.wizard_nichts_gekommen': { text: 'Nichts gekommen? Drucker an, Papier drin, richtiges Gerät gewählt?' },
|
|
146
|
+
'druck.wizard_gespeichert': { text: '{name} ist eingerichtet.', platzhalter: ['name'] },
|
|
147
|
+
// Abbrechen an jeder Stelle: nichts gespeichert. Der Satz sagt genau das,
|
|
148
|
+
// damit niemand einen halb eingerichteten Drucker vermutet.
|
|
149
|
+
'druck.wizard_abgebrochen': { text: 'Nichts gespeichert.' },
|
|
109
150
|
'bluetooth.aus': { text: 'Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.', nur: ['app'] },
|
|
110
151
|
'bluetooth.freigabe_fehlt': { text: 'Bitte die Freigabe in den Geräte-Einstellungen erteilen.', nur: ['app'] },
|
|
111
152
|
'bluetooth.suche_fehlgeschlagen': { text: 'Die Suche ist fehlgeschlagen: {grund}', platzhalter: ['grund'], nur: ['app'] },
|
|
@@ -153,6 +194,39 @@ exports.FEHLERREGELN = [
|
|
|
153
194
|
{ art: 'unerwartet', schluessel: 'server.unerwartet' },
|
|
154
195
|
{ art: 'sonst', verhalten: 'ersatz' },
|
|
155
196
|
];
|
|
197
|
+
/**
|
|
198
|
+
* Beleg per E-Mail senden: welcher `code` des Backends welchen Satz bekommt.
|
|
199
|
+
*
|
|
200
|
+
* `FEHLERREGELN` bleibt davon unberuehrt — das hier ist keine neue Art, einen
|
|
201
|
+
* Transportfehler einzuordnen, sondern die Verfeinerung EINES Aufrufs
|
|
202
|
+
* (`sendReceiptEmail`). Die vier Ausgaenge sind fuer den Kassier vier
|
|
203
|
+
* verschiedene Handlungen: Adresse verbessern, spaeter noch einmal, noch
|
|
204
|
+
* einmal senden, Beleg suchen. Beide Kassen entscheiden am `code`, nicht am
|
|
205
|
+
* Satz des Backends — sonst haengt das Wort am Tresen an einer Formulierung,
|
|
206
|
+
* die sich im Backend jederzeit aendern darf.
|
|
207
|
+
*
|
|
208
|
+
* Bewusst ein Objekt und keine Liste in GROSSSCHRIFT: der
|
|
209
|
+
* Oberflaechen-Vertrag (`fixtures/oberflaeche.json`) liest jede exportierte
|
|
210
|
+
* Liste als Enum der Kasseneinstellungen ein, und der Dart-Zwilling schickt
|
|
211
|
+
* deren Werte durch `KasseSettings.aus`. Fehlercodes haben dort nichts
|
|
212
|
+
* verloren; sie stehen in `fixtures/kasse-texte.json`.
|
|
213
|
+
*/
|
|
214
|
+
exports.BELEG_MAIL_FEHLER = {
|
|
215
|
+
adresse_ungueltig: 'beleg.mail_adresse_ungueltig',
|
|
216
|
+
zu_oft: 'beleg.mail_zu_oft',
|
|
217
|
+
versand_fehlgeschlagen: 'beleg.mail_fehlgeschlagen',
|
|
218
|
+
beleg_nicht_gefunden: 'beleg.mail_nicht_gefunden',
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Der Satz zu einem `code` des Backends. Einen Code, den dieses Paket noch
|
|
222
|
+
* nicht kennt, faengt der allgemeine Satz auf: das Senden ist gescheitert und
|
|
223
|
+
* darf wiederholt werden. Ein leerer Schirm waere schlimmer als ein zu
|
|
224
|
+
* allgemeiner Satz.
|
|
225
|
+
*/
|
|
226
|
+
function belegMailFehler(code) {
|
|
227
|
+
const fehler = exports.BELEG_MAIL_FEHLER;
|
|
228
|
+
return (code !== undefined && code !== null && fehler[code]) || 'beleg.mail_fehlgeschlagen';
|
|
229
|
+
}
|
|
156
230
|
/** Der Satz zum Schluessel, Platzhalter ersetzt. Fehlt ein Wert, wirft es — ein `{status}` am Tresen waere schlimmer. */
|
|
157
231
|
function meldung(schluessel, werte = {}) {
|
|
158
232
|
const eintrag = exports.MELDUNGEN[schluessel];
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
|
|
4
4
|
* (die Rewrites-Waechter der Web-App leiten daraus ab).
|
|
5
5
|
*/
|
|
6
|
-
export { type KasseStil, type KasseSchrift, type KasseWasserzeichen, type KasseMenge, type KasseTgModus, type KasseKassierenModus, type KasseKartenanbieter, KARTENANBIETER, type KasseBelegAusgabe, type KasseTastenAktion, type KasseTastenkarte, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, type KasseLayout, type KasseKatpos, type KasseHoehe, type KasseDruckerArt, type KasseTerminalVia, type KasseTerminalArt, type KassePapier, type KasseZeichensatz, type KasseSchnitt, type KasseLadeAuto, type KasseLogoGroesse, type KasseSchriftEinst, type KasseKachelstil, type KasseAutoAbMin, type KasseRabatt, type KasseWzSeite, type KasseWzStaerke, type KasseLogoSkala, type KasseWzSkala, type KasseFertigSekunden, type Schalterkarte, type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
|
|
6
|
+
export { type KasseStil, type KasseSchrift, type KasseWasserzeichen, type KasseMenge, type KasseTgModus, type KasseKassierenModus, type KasseKartenanbieter, KARTENANBIETER, type KasseBelegAusgabe, type KasseTastenAktion, type KasseTastenkarte, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, type KasseLayout, type KasseKatpos, type KasseHoehe, type KasseDruckerArt, type KasseTerminalVia, type KasseTerminalArt, type KassePapier, type KasseZeichensatz, type KasseSchnitt, type KasseLadeAuto, type KasseQrModus, type KasseLogoGroesse, type KasseSchriftEinst, type KasseKachelstil, type KasseAutoAbMin, type KasseRabatt, type KasseWzSeite, type KasseWzStaerke, type KasseLogoSkala, type KasseWzSkala, type KasseFertigSekunden, type Schalterkarte, type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, QR_MODUS, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
|
|
7
7
|
export { type ArticleGroup, type ArticleGroupPayload, fromArticleGroupPayload, type KasseArtikel, type KasseArtikelPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, type Mengenregel, type MengenVorgabe, mengenregelFuerEinheit, mengenVorgabe, mengeErlaubt, } from './artikel.js';
|
|
8
8
|
export { getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings } from './client.js';
|
|
9
9
|
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';
|
|
13
|
+
export { MELDUNGEN, FEHLERREGELN, meldung, meldungGiltFuer, BELEG_MAIL_FEHLER, belegMailFehler, type Meldung, type MeldungsSchluessel, type Fehlerart, type Seite, type BelegMailFehlercode, } from './texte.js';
|
package/dist/esm/kasse/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { KARTENANBIETER, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings,
|
|
7
7
|
// Die Enums als Laufzeitlisten — dieselben Werte, die die Typen oben tragen.
|
|
8
|
-
STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
|
|
8
|
+
STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, QR_MODUS, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
|
|
9
9
|
export { fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, mengenregelFuerEinheit, mengenVorgabe, mengeErlaubt, } from './artikel.js';
|
|
10
10
|
export { getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings } from './client.js';
|
|
11
11
|
export { verteileRabatt } from '../receipt/discount.js';
|
|
@@ -15,4 +15,4 @@ export { cancelScopeOf, receiptsScopeOf } from '../register/pairing.js';
|
|
|
15
15
|
export { listMyPrinters, createPrintJob, getPrintJob } from './drucker.js';
|
|
16
16
|
export { listMyTipRecipients } from './trinkgeld.js';
|
|
17
17
|
// Was die Kasse selbst sagt — ein Katalog fuer Browser-Kasse und App.
|
|
18
|
-
export { MELDUNGEN, FEHLERREGELN, meldung, meldungGiltFuer, } from './texte.js';
|
|
18
|
+
export { MELDUNGEN, FEHLERREGELN, meldung, meldungGiltFuer, BELEG_MAIL_FEHLER, belegMailFehler, } from './texte.js';
|
|
@@ -50,6 +50,21 @@ export declare const SCHNITT: readonly ["partial", "full", "none"];
|
|
|
50
50
|
export type KasseSchnitt = typeof SCHNITT[number];
|
|
51
51
|
export declare const LADE_AUTO: readonly ["bar", "immer", "nie"];
|
|
52
52
|
export type KasseLadeAuto = typeof LADE_AUTO[number];
|
|
53
|
+
/**
|
|
54
|
+
* Mit welchem Befehl der Signatur-QR auf den Bon kommt.
|
|
55
|
+
*
|
|
56
|
+
* `raster` = der QR wird als Bild gerastert (GS v 0) und geht darum durch jeden
|
|
57
|
+
* Drucker, der Bilder kann. `escpos` = der native QR-Befehl (GS ( k) — schaerfer
|
|
58
|
+
* und schneller, aber aeltere Geraete drucken dann gar keinen QR oder
|
|
59
|
+
* Zeichensalat.
|
|
60
|
+
*
|
|
61
|
+
* **Eine Geraete-Einstellung, keine des Betriebs:** derselbe Bon kommt an einer
|
|
62
|
+
* Kasse sauber heraus und an der Nebenkasse nicht. Und sie ist nicht
|
|
63
|
+
* kosmetisch — nach § 132a BAO ist der QR Teil des Belegs; wer den falschen
|
|
64
|
+
* Modus stehen laesst, erteilt Belege ohne lesbare Signatur.
|
|
65
|
+
*/
|
|
66
|
+
export declare const QR_MODUS: readonly ["raster", "escpos"];
|
|
67
|
+
export type KasseQrModus = typeof QR_MODUS[number];
|
|
53
68
|
/** Groesse des Kuerzel-Logos in der Kopfzeile der Kasse. */
|
|
54
69
|
export declare const LOGO_GROESSE: readonly ["S", "M", "L"];
|
|
55
70
|
export type KasseLogoGroesse = typeof LOGO_GROESSE[number];
|
|
@@ -176,6 +191,8 @@ export interface KasseSettingsGeraet {
|
|
|
176
191
|
papier: KassePapier;
|
|
177
192
|
zeichensatz: KasseZeichensatz;
|
|
178
193
|
schnitt: KasseSchnitt;
|
|
194
|
+
/** Befehl fuer den Signatur-QR auf dem Bon; der Drucker-Wizard probiert beide aus. */
|
|
195
|
+
qrModus: KasseQrModus;
|
|
179
196
|
ladeAn: boolean;
|
|
180
197
|
ladeAuto: KasseLadeAuto;
|
|
181
198
|
terminalIp: string;
|
|
@@ -38,6 +38,20 @@ export const PAPIER = ['mm58', 'mm80'];
|
|
|
38
38
|
export const ZEICHENSATZ = ['CP1252', 'CP437'];
|
|
39
39
|
export const SCHNITT = ['partial', 'full', 'none'];
|
|
40
40
|
export const LADE_AUTO = ['bar', 'immer', 'nie'];
|
|
41
|
+
/**
|
|
42
|
+
* Mit welchem Befehl der Signatur-QR auf den Bon kommt.
|
|
43
|
+
*
|
|
44
|
+
* `raster` = der QR wird als Bild gerastert (GS v 0) und geht darum durch jeden
|
|
45
|
+
* Drucker, der Bilder kann. `escpos` = der native QR-Befehl (GS ( k) — schaerfer
|
|
46
|
+
* und schneller, aber aeltere Geraete drucken dann gar keinen QR oder
|
|
47
|
+
* Zeichensalat.
|
|
48
|
+
*
|
|
49
|
+
* **Eine Geraete-Einstellung, keine des Betriebs:** derselbe Bon kommt an einer
|
|
50
|
+
* Kasse sauber heraus und an der Nebenkasse nicht. Und sie ist nicht
|
|
51
|
+
* kosmetisch — nach § 132a BAO ist der QR Teil des Belegs; wer den falschen
|
|
52
|
+
* Modus stehen laesst, erteilt Belege ohne lesbare Signatur.
|
|
53
|
+
*/
|
|
54
|
+
export const QR_MODUS = ['raster', 'escpos'];
|
|
41
55
|
/*
|
|
42
56
|
* Auch die uebrigen Wertemengen der Einstellungen stehen jetzt als Liste da —
|
|
43
57
|
* vorher waren sie nur als Union am Feld ausgeschrieben. Ein Zwilling konnte
|
|
@@ -111,7 +125,7 @@ export const KASSE_GERAET_STANDARD = Object.freeze({
|
|
|
111
125
|
tasten: { ...KASSE_TASTEN_STANDARD },
|
|
112
126
|
druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerName: '', druckerId: '', druckerDevid: 'local_printer',
|
|
113
127
|
connectDruckerId: '',
|
|
114
|
-
papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial',
|
|
128
|
+
papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial', qrModus: 'raster',
|
|
115
129
|
ladeAn: false, ladeAuto: 'bar',
|
|
116
130
|
terminalIp: '', terminalPort: 8080, terminalVia: 'direkt',
|
|
117
131
|
terminalArt: 'keins', terminalTid: '', tastenMarken: true,
|
|
@@ -221,6 +221,35 @@ declare const MELDUNGEN_ROH: {
|
|
|
221
221
|
readonly 'storno.position_fehlt': {
|
|
222
222
|
readonly text: "Bitte mindestens eine Position wählen.";
|
|
223
223
|
};
|
|
224
|
+
readonly 'beleg.link_kopiert': {
|
|
225
|
+
readonly text: "Der Link zum Beleg liegt in der Zwischenablage.";
|
|
226
|
+
};
|
|
227
|
+
readonly 'beleg.teilen_text': {
|
|
228
|
+
readonly text: "Beleg {nummer} von {betrieb} über {betrag}: {link}";
|
|
229
|
+
readonly platzhalter: readonly ["betrieb", "nummer", "betrag", "link"];
|
|
230
|
+
};
|
|
231
|
+
readonly 'beleg.nicht_teilbar': {
|
|
232
|
+
readonly text: "Für diesen Beleg gibt es keinen Link — er stammt aus einer älteren Kasse.";
|
|
233
|
+
};
|
|
234
|
+
readonly 'beleg.test_hinweis_teilen': {
|
|
235
|
+
readonly text: "Test-Umgebung — der Beleg ist steuerlich nicht gültig.";
|
|
236
|
+
};
|
|
237
|
+
readonly 'beleg.mail_gesendet': {
|
|
238
|
+
readonly text: "Der Beleg wurde an {an} gesendet.";
|
|
239
|
+
readonly platzhalter: readonly ["an"];
|
|
240
|
+
};
|
|
241
|
+
readonly 'beleg.mail_adresse_ungueltig': {
|
|
242
|
+
readonly text: "Diese E-Mail-Adresse ist nicht gültig.";
|
|
243
|
+
};
|
|
244
|
+
readonly 'beleg.mail_zu_oft': {
|
|
245
|
+
readonly text: "Dieser Beleg wurde schon oft gesendet — bitte später noch einmal.";
|
|
246
|
+
};
|
|
247
|
+
readonly 'beleg.mail_fehlgeschlagen': {
|
|
248
|
+
readonly text: "Der Beleg konnte nicht gesendet werden. Bitte noch einmal versuchen.";
|
|
249
|
+
};
|
|
250
|
+
readonly 'beleg.mail_nicht_gefunden': {
|
|
251
|
+
readonly text: "Dieser Beleg wurde nicht gefunden — er konnte nicht gesendet werden.";
|
|
252
|
+
};
|
|
224
253
|
readonly 'druck.fehlgeschlagen': {
|
|
225
254
|
readonly text: "Der Ausdruck ist fehlgeschlagen.";
|
|
226
255
|
};
|
|
@@ -259,6 +288,29 @@ declare const MELDUNGEN_ROH: {
|
|
|
259
288
|
readonly platzhalter: readonly ["weg"];
|
|
260
289
|
readonly nur: readonly ["web"];
|
|
261
290
|
};
|
|
291
|
+
readonly 'druck.wizard_verbinden': {
|
|
292
|
+
readonly text: "Verbinde mit {name} …";
|
|
293
|
+
readonly platzhalter: readonly ["name"];
|
|
294
|
+
};
|
|
295
|
+
readonly 'druck.wizard_testdruck_frage': {
|
|
296
|
+
readonly text: "Ist der Testdruck gekommen?";
|
|
297
|
+
};
|
|
298
|
+
readonly 'druck.wizard_qr_frage': {
|
|
299
|
+
readonly text: "Welcher QR-Code ist sauber gedruckt?";
|
|
300
|
+
};
|
|
301
|
+
readonly 'druck.wizard_qr_keiner_hinweis': {
|
|
302
|
+
readonly text: "Kein QR-Code kam sauber — der Beleg zeigt den QR-Code dann am Bildschirm.";
|
|
303
|
+
};
|
|
304
|
+
readonly 'druck.wizard_nichts_gekommen': {
|
|
305
|
+
readonly text: "Nichts gekommen? Drucker an, Papier drin, richtiges Gerät gewählt?";
|
|
306
|
+
};
|
|
307
|
+
readonly 'druck.wizard_gespeichert': {
|
|
308
|
+
readonly text: "{name} ist eingerichtet.";
|
|
309
|
+
readonly platzhalter: readonly ["name"];
|
|
310
|
+
};
|
|
311
|
+
readonly 'druck.wizard_abgebrochen': {
|
|
312
|
+
readonly text: "Nichts gespeichert.";
|
|
313
|
+
};
|
|
262
314
|
readonly 'bluetooth.aus': {
|
|
263
315
|
readonly text: "Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.";
|
|
264
316
|
readonly nur: readonly ["app"];
|
|
@@ -368,6 +420,37 @@ export declare const FEHLERREGELN: readonly [{
|
|
|
368
420
|
readonly verhalten: "ersatz";
|
|
369
421
|
}];
|
|
370
422
|
export type Fehlerart = (typeof FEHLERREGELN)[number]['art'];
|
|
423
|
+
/**
|
|
424
|
+
* Beleg per E-Mail senden: welcher `code` des Backends welchen Satz bekommt.
|
|
425
|
+
*
|
|
426
|
+
* `FEHLERREGELN` bleibt davon unberuehrt — das hier ist keine neue Art, einen
|
|
427
|
+
* Transportfehler einzuordnen, sondern die Verfeinerung EINES Aufrufs
|
|
428
|
+
* (`sendReceiptEmail`). Die vier Ausgaenge sind fuer den Kassier vier
|
|
429
|
+
* verschiedene Handlungen: Adresse verbessern, spaeter noch einmal, noch
|
|
430
|
+
* einmal senden, Beleg suchen. Beide Kassen entscheiden am `code`, nicht am
|
|
431
|
+
* Satz des Backends — sonst haengt das Wort am Tresen an einer Formulierung,
|
|
432
|
+
* die sich im Backend jederzeit aendern darf.
|
|
433
|
+
*
|
|
434
|
+
* Bewusst ein Objekt und keine Liste in GROSSSCHRIFT: der
|
|
435
|
+
* Oberflaechen-Vertrag (`fixtures/oberflaeche.json`) liest jede exportierte
|
|
436
|
+
* Liste als Enum der Kasseneinstellungen ein, und der Dart-Zwilling schickt
|
|
437
|
+
* deren Werte durch `KasseSettings.aus`. Fehlercodes haben dort nichts
|
|
438
|
+
* verloren; sie stehen in `fixtures/kasse-texte.json`.
|
|
439
|
+
*/
|
|
440
|
+
export declare const BELEG_MAIL_FEHLER: {
|
|
441
|
+
readonly adresse_ungueltig: "beleg.mail_adresse_ungueltig";
|
|
442
|
+
readonly zu_oft: "beleg.mail_zu_oft";
|
|
443
|
+
readonly versand_fehlgeschlagen: "beleg.mail_fehlgeschlagen";
|
|
444
|
+
readonly beleg_nicht_gefunden: "beleg.mail_nicht_gefunden";
|
|
445
|
+
};
|
|
446
|
+
export type BelegMailFehlercode = keyof typeof BELEG_MAIL_FEHLER;
|
|
447
|
+
/**
|
|
448
|
+
* Der Satz zu einem `code` des Backends. Einen Code, den dieses Paket noch
|
|
449
|
+
* nicht kennt, faengt der allgemeine Satz auf: das Senden ist gescheitert und
|
|
450
|
+
* darf wiederholt werden. Ein leerer Schirm waere schlimmer als ein zu
|
|
451
|
+
* allgemeiner Satz.
|
|
452
|
+
*/
|
|
453
|
+
export declare function belegMailFehler(code: string | undefined | null): MeldungsSchluessel;
|
|
371
454
|
/** Der Satz zum Schluessel, Platzhalter ersetzt. Fehlt ein Wert, wirft es — ein `{status}` am Tresen waere schlimmer. */
|
|
372
455
|
export declare function meldung(schluessel: MeldungsSchluessel, werte?: Record<string, string | number>): string;
|
|
373
456
|
/** Gilt der Satz auf dieser Seite? */
|
package/dist/esm/kasse/texte.js
CHANGED
|
@@ -90,6 +90,30 @@ const MELDUNGEN_ROH = {
|
|
|
90
90
|
'storno.fehlgeschlagen': { text: 'Das Storno ist fehlgeschlagen.' },
|
|
91
91
|
'storno.grund_fehlt': { text: 'Bitte einen Grund wählen.' },
|
|
92
92
|
'storno.position_fehlt': { text: 'Bitte mindestens eine Position wählen.' },
|
|
93
|
+
// --- Beleg weitergeben: Link, Teilen, E-Mail -----------------------------
|
|
94
|
+
// Kopieren, Teilen und Senden fuehren zu demselben Ziel: der oeffentlichen
|
|
95
|
+
// Belegseite (beleg.kasseneck.at/<fullReceiptId>). Kein Satz davon ist
|
|
96
|
+
// plattformgebunden — nur die Huelle unterscheidet sich, nicht das Wort.
|
|
97
|
+
'beleg.link_kopiert': { text: 'Der Link zum Beleg liegt in der Zwischenablage.' },
|
|
98
|
+
// Der Text, der beim Teilen mitgeht. Der Link steht am Schluss, damit ihn
|
|
99
|
+
// jede Huelle (SMS, Messenger, Mail) bis zum Ende als Link erkennt und nicht
|
|
100
|
+
// mitten im Satz abbricht.
|
|
101
|
+
'beleg.teilen_text': { text: 'Beleg {nummer} von {betrieb} über {betrag}: {link}', platzhalter: ['betrieb', 'nummer', 'betrag', 'link'] },
|
|
102
|
+
// Belege aus dem Altbestand tragen keine `fullReceiptId`; ohne sie gibt es
|
|
103
|
+
// keine Belegseite. Der Satz nennt den Grund, sonst sucht der Kassier den
|
|
104
|
+
// Fehler bei sich und versucht es ein zweites Mal.
|
|
105
|
+
'beleg.nicht_teilbar': { text: 'Für diesen Beleg gibt es keinen Link — er stammt aus einer älteren Kasse.' },
|
|
106
|
+
// Ein Testbeleg hat eine Belegseite, ist aber steuerlich nichts wert. Wer
|
|
107
|
+
// den Link weitergibt, muss das vorher lesen, nicht hinterher.
|
|
108
|
+
'beleg.test_hinweis_teilen': { text: 'Test-Umgebung — der Beleg ist steuerlich nicht gültig.' },
|
|
109
|
+
'beleg.mail_gesendet': { text: 'Der Beleg wurde an {an} gesendet.', platzhalter: ['an'] },
|
|
110
|
+
'beleg.mail_adresse_ungueltig': { text: 'Diese E-Mail-Adresse ist nicht gültig.' },
|
|
111
|
+
'beleg.mail_zu_oft': { text: 'Dieser Beleg wurde schon oft gesendet — bitte später noch einmal.' },
|
|
112
|
+
'beleg.mail_fehlgeschlagen': { text: 'Der Beleg konnte nicht gesendet werden. Bitte noch einmal versuchen.' },
|
|
113
|
+
// Bewusst nicht derselbe Satz wie `beleg.nicht_gefunden`: dort scheitert das
|
|
114
|
+
// Oeffnen, hier das Senden. Der Kassier steht vor einem Adressfeld und muss
|
|
115
|
+
// lesen, dass nichts hinausgegangen ist.
|
|
116
|
+
'beleg.mail_nicht_gefunden': { text: 'Dieser Beleg wurde nicht gefunden — er konnte nicht gesendet werden.' },
|
|
93
117
|
// --- Druck ---------------------------------------------------------------
|
|
94
118
|
'druck.fehlgeschlagen': { text: 'Der Ausdruck ist fehlgeschlagen.' },
|
|
95
119
|
'druck.nicht_moeglich': { text: 'Druck nicht möglich: {grund}', platzhalter: ['grund'] },
|
|
@@ -101,6 +125,22 @@ const MELDUNGEN_ROH = {
|
|
|
101
125
|
'druck.kein_drucker_gefunden': { text: 'Kein Drucker gefunden — ist er eingeschaltet und im selben Netz wie dieser Rechner?', nur: ['web'] },
|
|
102
126
|
'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'] },
|
|
103
127
|
'druck.kein_weg_drucker': { text: 'Kein {weg}-Drucker verbunden — „{weg}-Drucker verbinden“ und den Drucker im Dialog wählen.', platzhalter: ['weg'], nur: ['web'] },
|
|
128
|
+
// Der Drucker-Wizard: suchen, verbinden, Testdruck, QR-Probe, erst dann
|
|
129
|
+
// speichern. Derselbe Ablauf in beiden Kassen — deshalb hat kein Satz ein
|
|
130
|
+
// `nur`, obwohl der Weg zum Drucker verschieden ist (Bluetooth in der App,
|
|
131
|
+
// Web Bluetooth im Browser). Was der Chef liest, ist beidesmal dasselbe.
|
|
132
|
+
'druck.wizard_verbinden': { text: 'Verbinde mit {name} …', platzhalter: ['name'] },
|
|
133
|
+
'druck.wizard_testdruck_frage': { text: 'Ist der Testdruck gekommen?' },
|
|
134
|
+
'druck.wizard_qr_frage': { text: 'Welcher QR-Code ist sauber gedruckt?' },
|
|
135
|
+
// Kein Modus druckt einen lesbaren QR-Code: gespeichert wird trotzdem (mit
|
|
136
|
+
// Raster als Vorgabe), aber der Chef muss wissen, dass der QR-Code dann vom
|
|
137
|
+
// Bildschirm gelesen werden muss — nach RKSV gehoert er an den Beleg.
|
|
138
|
+
'druck.wizard_qr_keiner_hinweis': { text: 'Kein QR-Code kam sauber — der Beleg zeigt den QR-Code dann am Bildschirm.' },
|
|
139
|
+
'druck.wizard_nichts_gekommen': { text: 'Nichts gekommen? Drucker an, Papier drin, richtiges Gerät gewählt?' },
|
|
140
|
+
'druck.wizard_gespeichert': { text: '{name} ist eingerichtet.', platzhalter: ['name'] },
|
|
141
|
+
// Abbrechen an jeder Stelle: nichts gespeichert. Der Satz sagt genau das,
|
|
142
|
+
// damit niemand einen halb eingerichteten Drucker vermutet.
|
|
143
|
+
'druck.wizard_abgebrochen': { text: 'Nichts gespeichert.' },
|
|
104
144
|
'bluetooth.aus': { text: 'Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.', nur: ['app'] },
|
|
105
145
|
'bluetooth.freigabe_fehlt': { text: 'Bitte die Freigabe in den Geräte-Einstellungen erteilen.', nur: ['app'] },
|
|
106
146
|
'bluetooth.suche_fehlgeschlagen': { text: 'Die Suche ist fehlgeschlagen: {grund}', platzhalter: ['grund'], nur: ['app'] },
|
|
@@ -148,6 +188,39 @@ export const FEHLERREGELN = [
|
|
|
148
188
|
{ art: 'unerwartet', schluessel: 'server.unerwartet' },
|
|
149
189
|
{ art: 'sonst', verhalten: 'ersatz' },
|
|
150
190
|
];
|
|
191
|
+
/**
|
|
192
|
+
* Beleg per E-Mail senden: welcher `code` des Backends welchen Satz bekommt.
|
|
193
|
+
*
|
|
194
|
+
* `FEHLERREGELN` bleibt davon unberuehrt — das hier ist keine neue Art, einen
|
|
195
|
+
* Transportfehler einzuordnen, sondern die Verfeinerung EINES Aufrufs
|
|
196
|
+
* (`sendReceiptEmail`). Die vier Ausgaenge sind fuer den Kassier vier
|
|
197
|
+
* verschiedene Handlungen: Adresse verbessern, spaeter noch einmal, noch
|
|
198
|
+
* einmal senden, Beleg suchen. Beide Kassen entscheiden am `code`, nicht am
|
|
199
|
+
* Satz des Backends — sonst haengt das Wort am Tresen an einer Formulierung,
|
|
200
|
+
* die sich im Backend jederzeit aendern darf.
|
|
201
|
+
*
|
|
202
|
+
* Bewusst ein Objekt und keine Liste in GROSSSCHRIFT: der
|
|
203
|
+
* Oberflaechen-Vertrag (`fixtures/oberflaeche.json`) liest jede exportierte
|
|
204
|
+
* Liste als Enum der Kasseneinstellungen ein, und der Dart-Zwilling schickt
|
|
205
|
+
* deren Werte durch `KasseSettings.aus`. Fehlercodes haben dort nichts
|
|
206
|
+
* verloren; sie stehen in `fixtures/kasse-texte.json`.
|
|
207
|
+
*/
|
|
208
|
+
export const BELEG_MAIL_FEHLER = {
|
|
209
|
+
adresse_ungueltig: 'beleg.mail_adresse_ungueltig',
|
|
210
|
+
zu_oft: 'beleg.mail_zu_oft',
|
|
211
|
+
versand_fehlgeschlagen: 'beleg.mail_fehlgeschlagen',
|
|
212
|
+
beleg_nicht_gefunden: 'beleg.mail_nicht_gefunden',
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Der Satz zu einem `code` des Backends. Einen Code, den dieses Paket noch
|
|
216
|
+
* nicht kennt, faengt der allgemeine Satz auf: das Senden ist gescheitert und
|
|
217
|
+
* darf wiederholt werden. Ein leerer Schirm waere schlimmer als ein zu
|
|
218
|
+
* allgemeiner Satz.
|
|
219
|
+
*/
|
|
220
|
+
export function belegMailFehler(code) {
|
|
221
|
+
const fehler = BELEG_MAIL_FEHLER;
|
|
222
|
+
return (code !== undefined && code !== null && fehler[code]) || 'beleg.mail_fehlgeschlagen';
|
|
223
|
+
}
|
|
151
224
|
/** Der Satz zum Schluessel, Platzhalter ersetzt. Fehlt ein Wert, wirft es — ein `{status}` am Tresen waere schlimmer. */
|
|
152
225
|
export function meldung(schluessel, werte = {}) {
|
|
153
226
|
const eintrag = MELDUNGEN[schluessel];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.9.
|
|
2
|
+
"version": "0.9.3",
|
|
3
3
|
"meldungen": {
|
|
4
4
|
"netz.keine_verbindung": {
|
|
5
5
|
"text": "Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen."
|
|
@@ -255,6 +255,42 @@
|
|
|
255
255
|
"storno.position_fehlt": {
|
|
256
256
|
"text": "Bitte mindestens eine Position wählen."
|
|
257
257
|
},
|
|
258
|
+
"beleg.link_kopiert": {
|
|
259
|
+
"text": "Der Link zum Beleg liegt in der Zwischenablage."
|
|
260
|
+
},
|
|
261
|
+
"beleg.teilen_text": {
|
|
262
|
+
"text": "Beleg {nummer} von {betrieb} über {betrag}: {link}",
|
|
263
|
+
"platzhalter": [
|
|
264
|
+
"betrieb",
|
|
265
|
+
"nummer",
|
|
266
|
+
"betrag",
|
|
267
|
+
"link"
|
|
268
|
+
]
|
|
269
|
+
},
|
|
270
|
+
"beleg.nicht_teilbar": {
|
|
271
|
+
"text": "Für diesen Beleg gibt es keinen Link — er stammt aus einer älteren Kasse."
|
|
272
|
+
},
|
|
273
|
+
"beleg.test_hinweis_teilen": {
|
|
274
|
+
"text": "Test-Umgebung — der Beleg ist steuerlich nicht gültig."
|
|
275
|
+
},
|
|
276
|
+
"beleg.mail_gesendet": {
|
|
277
|
+
"text": "Der Beleg wurde an {an} gesendet.",
|
|
278
|
+
"platzhalter": [
|
|
279
|
+
"an"
|
|
280
|
+
]
|
|
281
|
+
},
|
|
282
|
+
"beleg.mail_adresse_ungueltig": {
|
|
283
|
+
"text": "Diese E-Mail-Adresse ist nicht gültig."
|
|
284
|
+
},
|
|
285
|
+
"beleg.mail_zu_oft": {
|
|
286
|
+
"text": "Dieser Beleg wurde schon oft gesendet — bitte später noch einmal."
|
|
287
|
+
},
|
|
288
|
+
"beleg.mail_fehlgeschlagen": {
|
|
289
|
+
"text": "Der Beleg konnte nicht gesendet werden. Bitte noch einmal versuchen."
|
|
290
|
+
},
|
|
291
|
+
"beleg.mail_nicht_gefunden": {
|
|
292
|
+
"text": "Dieser Beleg wurde nicht gefunden — er konnte nicht gesendet werden."
|
|
293
|
+
},
|
|
258
294
|
"druck.fehlgeschlagen": {
|
|
259
295
|
"text": "Der Ausdruck ist fehlgeschlagen."
|
|
260
296
|
},
|
|
@@ -309,6 +345,33 @@
|
|
|
309
345
|
"web"
|
|
310
346
|
]
|
|
311
347
|
},
|
|
348
|
+
"druck.wizard_verbinden": {
|
|
349
|
+
"text": "Verbinde mit {name} …",
|
|
350
|
+
"platzhalter": [
|
|
351
|
+
"name"
|
|
352
|
+
]
|
|
353
|
+
},
|
|
354
|
+
"druck.wizard_testdruck_frage": {
|
|
355
|
+
"text": "Ist der Testdruck gekommen?"
|
|
356
|
+
},
|
|
357
|
+
"druck.wizard_qr_frage": {
|
|
358
|
+
"text": "Welcher QR-Code ist sauber gedruckt?"
|
|
359
|
+
},
|
|
360
|
+
"druck.wizard_qr_keiner_hinweis": {
|
|
361
|
+
"text": "Kein QR-Code kam sauber — der Beleg zeigt den QR-Code dann am Bildschirm."
|
|
362
|
+
},
|
|
363
|
+
"druck.wizard_nichts_gekommen": {
|
|
364
|
+
"text": "Nichts gekommen? Drucker an, Papier drin, richtiges Gerät gewählt?"
|
|
365
|
+
},
|
|
366
|
+
"druck.wizard_gespeichert": {
|
|
367
|
+
"text": "{name} ist eingerichtet.",
|
|
368
|
+
"platzhalter": [
|
|
369
|
+
"name"
|
|
370
|
+
]
|
|
371
|
+
},
|
|
372
|
+
"druck.wizard_abgebrochen": {
|
|
373
|
+
"text": "Nichts gespeichert."
|
|
374
|
+
},
|
|
312
375
|
"bluetooth.aus": {
|
|
313
376
|
"text": "Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen.",
|
|
314
377
|
"nur": [
|
|
@@ -440,5 +503,11 @@
|
|
|
440
503
|
"art": "sonst",
|
|
441
504
|
"verhalten": "ersatz"
|
|
442
505
|
}
|
|
443
|
-
]
|
|
506
|
+
],
|
|
507
|
+
"belegMailFehler": {
|
|
508
|
+
"adresse_ungueltig": "beleg.mail_adresse_ungueltig",
|
|
509
|
+
"zu_oft": "beleg.mail_zu_oft",
|
|
510
|
+
"versand_fehlgeschlagen": "beleg.mail_fehlgeschlagen",
|
|
511
|
+
"beleg_nicht_gefunden": "beleg.mail_nicht_gefunden"
|
|
512
|
+
}
|
|
444
513
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.9.
|
|
2
|
+
"version": "0.9.3",
|
|
3
3
|
"aufrufe": [
|
|
4
4
|
"activateCashregister",
|
|
5
5
|
"cancelReceipt",
|
|
@@ -138,6 +138,10 @@
|
|
|
138
138
|
"mm58",
|
|
139
139
|
"mm80"
|
|
140
140
|
],
|
|
141
|
+
"qrModus": [
|
|
142
|
+
"raster",
|
|
143
|
+
"escpos"
|
|
144
|
+
],
|
|
141
145
|
"rabatt": [
|
|
142
146
|
"aus",
|
|
143
147
|
"an"
|