Strichcode mit dem Kassenartikel auf den Bon drucken

Der Kassierer musste den Artikel bisher von Hand in der Kasse suchen. Jetzt
steht er als Strichcode unter dem Betrag und wird gescannt.

CODE128 in Zeichensatz B, nicht das sonst uebliche CODE39: dort sind nur
Grossbuchstaben erlaubt, ein Artikel namens "techniker" waere damit nicht
darstellbar. Die Modulbreite waehlt escpos.js so gross, wie die Papierbreite
zulaesst - breitere Balken liest ein Handscanner zuverlaessiger, gerade auf
Thermopapier, das einen Tag in einer Hosentasche hinter sich hat. Daraus
ergibt sich die Laengengrenze von 17 Zeichen bei 80 mm Papier.

Artikelname und An/Aus liegen in den Einstellungen, nicht im Code: der Name
haengt am Artikelstamm der Kasse und kann sich aendern, ohne dass jemand an
die App muss.

Zwei Faelle, die sonst still danebengingen, melden sich jetzt:
- Umlaute und Sonderzeichen weist das Speichern ab, statt sie zu verschlucken
  und einen Code zu drucken, der einen anderen Artikel bedeutet.
- Passt der Name nicht auf die Papierbreite, druckt receipt.js ihn nur in
  Klarschrift. Ein abgeschnittener Code wird von keinem Scanner gelesen.

Geprueft auf dem Epson TM-T88IV: Zwischenbeleg und Endbeleg, ausgeschalteter
Strichcode, Laengengrenze, geschweifte Klammer im Namen (wird verdoppelt,
sonst liest der Drucker sie als Umschaltbefehl).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kerim (portable/claudecode)andClaude Opus 5 committed 2026-09-12 13:19:39 +02:00
1 parent b1c7d89a7d
commit 6ba0cdd07f
7 files changed
+229 -9

No files matched your search

+19 -1
View File
@@ -288,6 +288,24 @@ Drei Wege führen zu einem Bon:
| **✓ Beenden** | Endbeleg | ist beendet und in der Historie |
| **🖨** in der Historie | Nachdruck desselben Belegs | — |
#### Strichcode
Unter dem Betrag steht ein Strichcode mit dem Artikelnamen, den die Kasse führt
(ab Werk `techniker`). Name und An/Aus stehen in den Einstellungen, also in der
Datenbank — nicht im Code und nicht in der `.env`.
Symbologie ist **CODE128, Zeichensatz B**. CODE39, sonst der Standard für solche
Fälle, kennt nur Großbuchstaben und könnte `techniker` gar nicht abbilden.
Zeichensatz B deckt den druckbaren ASCII-Bereich ab; alles darüber — Umlaute
zumal — weist `PUT /api/settings` ab, statt es still zu verschlucken.
Die Modulbreite wählt `escpos.js` selbst: so breit, wie die Papierbreite es
zulässt (Ruhezonen eingerechnet), denn breitere Balken liest ein Handscanner
zuverlässiger. Daraus folgt die Längengrenze — bei 42 Zeichen je Zeile sind es
17 Zeichen, bei 32 noch 12. Passt der Name nicht, druckt `receipt.js` ihn nur
in Klarschrift: ein abgeschnittener Code würde ohnehin von keinem Scanner
gelesen.
**Reihenfolge ist Absicht:** Beim Beenden wird erst gespeichert, dann gedruckt.
Ein leerer Papierhalter ist damit ein Papierproblem und kein Datenproblem — der
Vorgang steht in der Historie und lässt sich von dort nachdrucken. Die
@@ -453,7 +471,7 @@ Alle Endpunkte außer `/health`, `/api/login`, `/api/auth/status` und
| `POST` | `/api/timers/:id/receipt` | Zwischenbon drucken, Timer bleibt unangetastet |
| `DELETE` | `/api/timers/:id` | verwerfen, **nichts** speichern |
| `GET` | `/api/settings` | Tarif, Bon-Texte und Druckerzustand lesen |
| `PUT` | `/api/settings` | `{rateAmount, rateInterval}` sowie optional `{receiptHeader, receiptFooter, printAutoOnStop}` |
| `PUT` | `/api/settings` | `{rateAmount, rateInterval}` sowie optional `{receiptHeader, receiptFooter, printAutoOnStop, receiptBarcodeEnabled, receiptBarcodeArticle}` |
| `GET` | `/api/printer/status` | Erreichbarkeit und Zustand des Druckers |
| `POST` | `/api/printer/test` | Probedruck |
| `POST` | `/api/printer/provision` | `{host, port, username, password}` → richtet den Pi ein und übernimmt ihn. Antwort enthält das Schrittprotokoll, nie die Zugangsdaten |