@kreiseck/kasseneck-api 0.6.7 → 0.6.9

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.
@@ -254,12 +254,24 @@ function pflichtfeld(functionName, daten, feld) {
254
254
  }
255
255
  return wert;
256
256
  }
257
- /** Rechte lesen: nur Wahrheitswerte, alles Fehlende gilt als nicht erteilt. */
257
+ /**
258
+ * Rechte lesen: Schalter werden zu Wahrheitswerten, alles Fehlende gilt als
259
+ * nicht erteilt.
260
+ *
261
+ * **Reichweiten sind keine Schalter.** `cancelScope` und `receiptsScope`
262
+ * tragen `none | own | all`; wer sie mit `=== true` liest, macht aus jedem
263
+ * `own` ein `false` — und [cancelScopeOf] liest daraus dann `none`. Der Kassier
264
+ * saehe seine eigenen Belege nicht mehr und der Chef koennte nicht stornieren,
265
+ * obwohl das Backend beides erlaubt. Diese beiden Felder kommen deshalb als
266
+ * Text durch, aber nur mit bekanntem Inhalt: ein unbekannter Wert wird nicht
267
+ * zur Reichweite erhoben (die Grenze zieht ohnehin das Backend, die Oberflaeche
268
+ * soll im Zweifel weniger anbieten).
269
+ */
258
270
  function rechte(wert) {
259
271
  const roh = (typeof wert === 'object' && wert !== null && !Array.isArray(wert) ? wert : {});
260
272
  const gelesen = {};
261
273
  for (const [name, inhalt] of Object.entries(roh)) {
262
- gelesen[name] = inhalt === true;
274
+ gelesen[name] = REICHWEITEN_FELDER.has(name) ? reichweite(inhalt) : inhalt === true;
263
275
  }
264
276
  return {
265
277
  sell: false,
@@ -271,6 +283,12 @@ function rechte(wert) {
271
283
  ...gelesen,
272
284
  };
273
285
  }
286
+ /** Felder, die eine Reichweite tragen statt eines Schalters. */
287
+ const REICHWEITEN_FELDER = new Set(['cancelScope', 'receiptsScope']);
288
+ /** Bekannte Reichweite oder `none` — dieselbe Zurueckhaltung wie [cancelScopeOf]. */
289
+ function reichweite(wert) {
290
+ return wert === 'own' || wert === 'all' || wert === 'none' ? wert : 'none';
291
+ }
274
292
  /** Leere Zeichenkette statt `undefined` — Anzeigefelder duerfen leer sein. */
275
293
  const text = (wert) => (typeof wert === 'string' ? wert : '');
276
294
  /** Die Antwort meldete Erfolg, trug aber nicht, was der Aufruf zusagt. */
@@ -245,12 +245,24 @@ function pflichtfeld(functionName, daten, feld) {
245
245
  }
246
246
  return wert;
247
247
  }
248
- /** Rechte lesen: nur Wahrheitswerte, alles Fehlende gilt als nicht erteilt. */
248
+ /**
249
+ * Rechte lesen: Schalter werden zu Wahrheitswerten, alles Fehlende gilt als
250
+ * nicht erteilt.
251
+ *
252
+ * **Reichweiten sind keine Schalter.** `cancelScope` und `receiptsScope`
253
+ * tragen `none | own | all`; wer sie mit `=== true` liest, macht aus jedem
254
+ * `own` ein `false` — und [cancelScopeOf] liest daraus dann `none`. Der Kassier
255
+ * saehe seine eigenen Belege nicht mehr und der Chef koennte nicht stornieren,
256
+ * obwohl das Backend beides erlaubt. Diese beiden Felder kommen deshalb als
257
+ * Text durch, aber nur mit bekanntem Inhalt: ein unbekannter Wert wird nicht
258
+ * zur Reichweite erhoben (die Grenze zieht ohnehin das Backend, die Oberflaeche
259
+ * soll im Zweifel weniger anbieten).
260
+ */
249
261
  function rechte(wert) {
250
262
  const roh = (typeof wert === 'object' && wert !== null && !Array.isArray(wert) ? wert : {});
251
263
  const gelesen = {};
252
264
  for (const [name, inhalt] of Object.entries(roh)) {
253
- gelesen[name] = inhalt === true;
265
+ gelesen[name] = REICHWEITEN_FELDER.has(name) ? reichweite(inhalt) : inhalt === true;
254
266
  }
255
267
  return {
256
268
  sell: false,
@@ -262,6 +274,12 @@ function rechte(wert) {
262
274
  ...gelesen,
263
275
  };
264
276
  }
277
+ /** Felder, die eine Reichweite tragen statt eines Schalters. */
278
+ const REICHWEITEN_FELDER = new Set(['cancelScope', 'receiptsScope']);
279
+ /** Bekannte Reichweite oder `none` — dieselbe Zurueckhaltung wie [cancelScopeOf]. */
280
+ function reichweite(wert) {
281
+ return wert === 'own' || wert === 'all' || wert === 'none' ? wert : 'none';
282
+ }
265
283
  /** Leere Zeichenkette statt `undefined` — Anzeigefelder duerfen leer sein. */
266
284
  const text = (wert) => (typeof wert === 'string' ? wert : '');
267
285
  /** Die Antwort meldete Erfolg, trug aber nicht, was der Aufruf zusagt. */
@@ -0,0 +1,107 @@
1
+ {
2
+ "betrieb": {
3
+ "logoText": "K",
4
+ "logoAn": true,
5
+ "logoGroesse": "M",
6
+ "wasserzeichen": "anmeldung",
7
+ "farbe": "#1B46F5",
8
+ "stil": "klar",
9
+ "schrift": "M",
10
+ "schriftEinst": "S",
11
+ "kachelstil": "streifen",
12
+ "uhr": true,
13
+ "sperrbild": true,
14
+ "foto": true,
15
+ "autoAbMin": 0,
16
+ "abNachVerkauf": false,
17
+ "schnellLogin": true,
18
+ "preisAnzeigen": true,
19
+ "ustAnzeigen": false,
20
+ "emoji": true,
21
+ "katFarben": true,
22
+ "freiErlaubt": true,
23
+ "saetze": {
24
+ "0": true,
25
+ "10": true,
26
+ "13": true,
27
+ "19": false,
28
+ "20": true,
29
+ "4.9": true
30
+ },
31
+ "menge": "x",
32
+ "notiz": false,
33
+ "suche": false,
34
+ "rabatt": "aus",
35
+ "zahlBar": true,
36
+ "zahlKarte": false,
37
+ "kartenanbieter": "keiner",
38
+ "trinkgeld": false,
39
+ "tgModus": "beides",
40
+ "tgStufen": {
41
+ "5": true,
42
+ "10": true,
43
+ "15": false,
44
+ "20": false
45
+ },
46
+ "tgChips": [
47
+ 5,
48
+ 10
49
+ ],
50
+ "tgSplit": true,
51
+ "rueckgeld": true,
52
+ "schnellbar": false,
53
+ "kassierenModus": "seite",
54
+ "belegAusgabe": "qr",
55
+ "fertigSekunden": 0
56
+ },
57
+ "geraet": {
58
+ "layout": "rechts",
59
+ "katpos": "oben",
60
+ "spaltenExtra": 0,
61
+ "hoehe": "M",
62
+ "touch": false,
63
+ "tasten": {
64
+ "kassieren": [
65
+ "Enter"
66
+ ],
67
+ "abschliessen": [
68
+ "Enter"
69
+ ],
70
+ "abbrechen": [
71
+ "Escape"
72
+ ],
73
+ "frei": [
74
+ "Mod+F"
75
+ ],
76
+ "bar": [
77
+ "Mod+B"
78
+ ],
79
+ "karte": [
80
+ "Mod+K"
81
+ ],
82
+ "passend": [
83
+ "Mod+P"
84
+ ],
85
+ "belege": [
86
+ "Mod+E"
87
+ ],
88
+ "letzteZurueck": [
89
+ "Mod+Backspace"
90
+ ]
91
+ },
92
+ "druckerAn": false,
93
+ "druckerArt": "sdp",
94
+ "druckerIp": "",
95
+ "druckerPort": 9100,
96
+ "druckerBt": "",
97
+ "druckerId": "",
98
+ "druckerDevid": "local_printer",
99
+ "papier": "mm80",
100
+ "zeichensatz": "CP1252",
101
+ "schnitt": "partial",
102
+ "ladeAn": false,
103
+ "ladeAuto": "bar",
104
+ "terminalIp": "",
105
+ "terminalPort": 20008
106
+ }
107
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kreiseck/kasseneck-api",
3
- "version": "0.6.7",
3
+ "version": "0.6.9",
4
4
  "description": "JavaScript-Zwilling von kasseneck_api (Flutter) fuer das Kasseneck-Backend",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Kreiseck",
@@ -114,7 +114,8 @@
114
114
  "test": "tsc -p tsconfig.test.json && TZ=Europe/Vienna node --test $(find test-dist -name '*.test.js') && TZ=UTC node --test $(find test-dist -name '*.test.js') && TZ=Pacific/Kiritimati node --test $(find test-dist -name '*.test.js')",
115
115
  "check:consumer": "node scripts/check-consumer-types.mjs",
116
116
  "prepublishOnly": "npm run build",
117
- "fixtures:erneuern": "npm run build && node scripts/belege-fixtures.mjs"
117
+ "fixtures:erneuern": "npm run build && node scripts/belege-fixtures.mjs",
118
+ "fixtures:kasse": "npm run build && node scripts/kasse-settings-fixture.mjs"
118
119
  },
119
120
  "peerDependencies": {
120
121
  "react": ">=18.0.0"