====== Bon-Routing-Regeln ====== Normalerweise druckt BonDroid jedes Produkt auf dem **Hauptdrucker seiner Produktgruppe** — alle Getränke auf die Schank, alle Speisen in die Küche. Mit **Bon-Routing-Regeln** legst du fest, dass bestimmte Bestellungen woanders gedruckt werden. Typische Einsätze: * **Eigene Station** für einzelne Produkte — z. B. Bier auf den Bierwagen, Waffeln auf den Waffelstand. * **Je Bereich** eine eigene Schank — Halle und Zelt auf Schank 1, Garten auf Schank 2. * **Last verteilen** (Lastverteilung, Loadbalancing) — Getränke abwechselnd auf zwei Schanken drucken. * **Eigener Bon** auf demselben Drucker — z. B. Nachspeisen getrennt von den Hauptspeisen. ^ Schritt ^ Was? ^ | **[[#so_entscheidet_bondroid|1. Verstehen]]** | wie BonDroid den Drucker für eine Position auswählt | | **[[#regel_anlegen|2. Anlegen]]** | Menü **Stammdaten → Drucker-Administration → Bon-Routingregeln** | | **[[#beispiele|3. Vorlage wählen]]** | passendes Beispiel kopieren und Namen anpassen | | **[[#testen_und_fehlersuche|4. Testen]]** | eine Testbestellung machen und den Bon prüfen |
---- ===== So entscheidet BonDroid ===== {{:routing_bon_ablauf.png?direct&800|}} Für **jede Position** einer Bestellung (z. B. „2× Bier“) geht BonDroid so vor: - **Standard:** Der Drucker kommt aus der Produktgruppe — **Hauptdrucker** und **Ersatzdrucker** (Stammdaten → Produkt-Administration → Produktgruppen). - **Regeln prüfen:** Alle Bon-Routingregeln mit Häkchen **Aktiv** werden **von oben nach unten** durchlaufen. - **Die erste Regel gewinnt:** Sobald eine Regel einen gültigen Drucker setzt, wird dieser verwendet. Die Regeln darunter werden für diese Position **nicht mehr geprüft**. - **Keine Regel passt:** Es bleibt beim Hauptdrucker der Produktgruppe. Der **Ersatzdrucker** springt nur ein, wenn der Drucker nicht erreichbar ist (z. B. ausgeschaltet oder kein Netzwerk): Nach ca. **11 Sekunden** wechselt BonDroid auf den Ersatzdrucker. Er dient nicht zum Verteilen der Last — dafür gibt es eine eigene Regel, siehe [[#last_auf_zwei_drucker_verteilen_round_robin|Last auf zwei Drucker verteilen]]. **Kein Papier?** Dann wechselt BonDroid **nicht** auf den Ersatzdrucker. Der Drucker sammelt die Bons und druckt sie, sobald wieder Papier drinnen ist. Änderungen an den Regeln wirken **sofort** bei der nächsten Bestellung — ein Neustart ist nicht nötig. ---- ===== Regel anlegen ===== - In der BonDroid Verwaltung **Stammdaten → Drucker-Administration → Bon-Routingregeln** öffnen. - Rechts oben **Bon-Routingregel hinzufügen** anklicken. - Formular ausfüllen und **Sichern**. \\ {{:routing_admin_bon_neu.png?direct&800|}} ^ Nr. ^ Feld ^ Bedeutung ^ | **1** | Name | Frei wählbar, damit du die Regel wiederfindest (max. 25 Zeichen, jeder Name nur einmal). | | **2** | Aktiv | Nur aktive Regeln werden ausgeführt. Häkchen entfernen = Regel vorübergehend ausschalten, ohne sie zu löschen. | | **3** | Rule | Der Regel-Code (siehe [[#aufbau_einer_regel|Aufbau einer Regel]] und [[#beispiele|Beispiele]]). | | **4** | Sichern | Speichert die Regel. Sie gilt ab der nächsten Bestellung. | ==== Reihenfolge und Übersicht ==== In der Liste der Bon-Routingregeln siehst du alle Regeln in der Reihenfolge, in der BonDroid sie prüft — **die oberste zuerst**. \\ {{:routing_admin_bon_liste.png?direct&800|}} ^ Nr. ^ Was? ^ Bedeutung ^ | **1** | Bon-Routingregel hinzufügen | neue Regel anlegen — sie wird **unten** angehängt | | **2** | Anordnen | mit den kleinen Pfeilen eine Regel **nach oben** bzw. **nach unten** schieben | | **3** | Aktiv | Regel ein- oder ausschalten | | **4** | Rule | den Code direkt in der Liste ändern | | **5** | Sichern | Änderungen in der Liste (Name, Aktiv, Rule) speichern | **Tipp:** Spezielle Regeln (ein einzelnes Produkt) gehören **nach oben**, allgemeine Regeln (eine ganze Produktgruppe) **nach unten**. Sonst „schluckt“ die allgemeine Regel die spezielle. Im Beispiel oben steht „Bier“ vor „Schank je Bereich“: Bier geht immer auf den Bierdrucker, alle anderen Getränke je nach Bereich auf Schank 1 oder Schank 2. ---- ===== Aufbau einer Regel ===== Fast jede Regel sieht so aus:
if BEDINGUNG:
printer_name = 'Druckername'
backup_printer_name = 'Ersatzdruckername'
* **Bedingung** — wann die Regel greifen soll, z. B. ''%%pos.product_name == 'Cola'%%''. Welche Angaben du verwenden kannst, steht unter [[#verfuegbare_angaben|Verfügbare Angaben]].
* **printer_name** — auf welchem Drucker die Position gedruckt wird.
* **backup_printer_name** — welcher Drucker einspringt, wenn dieser nicht druckt. Optional: Fehlt die Zeile, bleibt der Ersatzdrucker der Produktgruppe.
* Die Zeilen unter dem ''if'' müssen **eingerückt** sein (4 Leerzeichen) und das ''if'' endet mit einem **Doppelpunkt**.
==== Druckernamen ====
Als Druckername trägst du den **Namen** aus **Stammdaten → Drucker-Administration → Drucker** ein (Spalte 1) — **nicht** den CUPS-Druckernamen (Spalte 2). Groß-/Kleinschreibung und Leerzeichen müssen genau stimmen: ''%%'Schank 1'%%'' ist nicht dasselbe wie ''%%'Schank1'%%'' oder ''%%'schank 1'%%''. \\ {{:routing_admin_drucker.png?direct&800|}}
Spalte 3 **Virtuell**: Ein virtueller Drucker druckt nichts aus. Den zuletzt „gedruckten“ Bon siehst du in der Verwaltung unter **Drucker → Virtuelle Drucker**. So kannst du Produkte bewusst **gar nicht drucken** lassen (siehe [[#produkte_gar_nicht_drucken|Beispiel]]).
==== Kleine Bedingungs-Kunde ====
^ Schreibweise ^ Bedeutung ^ Beispiel ^
| ''%%==%%'' | ist gleich | ''%%pos.order.site_name == 'Garten'%%'' |
| ''%%!=%%'' | ist ungleich | ''%%pos.order.user_name != 'Kassa'%%'' |
| ''%%<, <=, >, >=%%'' | kleiner, größer (Zahlen, Uhrzeit) | ''%%pos.order.order_time.hour >= 22%%'' |
| ''%%in [...]%%'' | ist einer von mehreren Werten | ''%%pos.product_id in [22, 23, 36]%%'' |
| ''%%'Text' in ...%%'' | Text kommt im Namen vor | ''%%'Waffel' in pos.product_name%%'' |
| ''and'', ''or'', ''not'' | Bedingungen verknüpfen | ''%%pos.product_group_id == 1 and pos.order.site_name == 'Zelt'%%'' |
| ''%%else:%%'' | „sonst“ — wenn die Bedingung nicht zutrifft | siehe [[#schank_je_bereich|Schank je Bereich]] |
| ''#'' | Kommentar — alles danach ignoriert BonDroid | ''%%# Bier immer zum Bierwagen%%'' |
----
===== Verfügbare Angaben =====
Die Regel wird für **eine Position** der Bestellung ausgeführt. Über ''pos'' und ''pos.order'' kommst du an alles, was du über diese Position und ihre Bestellung wissen musst.
==== Die Position: pos ====
^ Angabe ^ Bedeutung ^ Beispielwert ^
| ''pos.product_id'' | ID des Produkts (Zahl) | ''22'' |
| ''pos.product_name'' | Name des Produkts | ''%%'Bier 0,5l'%%'' |
| ''pos.size_name'' | Größe bzw. Variante | ''%%'groß'%%'' |
| ''pos.count'' | Anzahl dieser Position in der Bestellung | ''2'' |
| ''pos.product_group_id'' | ID der Produktgruppe (Zahl) | ''1'' |
| ''pos.product_group_name'' | Name der Produktgruppe | ''%%u'Getränke'%%'' |
| ''pos.pos_price'' | Einzelpreis in Euro | ''4.20'' |
==== Die Bestellung: pos.order ====
^ Angabe ^ Bedeutung ^ Beispielwert ^
| ''pos.order.order_time'' | Zeitpunkt der Bestellung — ''.hour'' = Stunde, ''.minute'' = Minute, ''.second'' = Sekunde | ''pos.order.order_time.hour'' → ''21'' |
| ''pos.order.user_id'' | ID des Kellners (Zahl) | ''21'' |
| ''pos.order.user_name'' | Benutzername des Kellners | ''%%'Anna'%%'' |
| ''pos.order.site_id'' | ID des Bereichs (Zahl) | ''3'' |
| ''pos.order.site_name'' | Name des Bereichs | ''%%'Garten'%%'' |
| ''pos.order.table_id'' | ID des Tisches (Zahl) | ''57'' |
| ''pos.order.table_name'' | Name bzw. Nummer des Tisches | ''%%'05'%%'' |
==== Der Standarddrucker: printer ====
^ Angabe ^ Bedeutung ^ Beispielwert ^
| ''printer.name'' | Hauptdrucker der Produktgruppe — also der Drucker, auf dem ohne Regel gedruckt würde | ''%%'Schank'%%'' |
**IDs finden:** Öffne das Produkt (bzw. die Produktgruppe, den Bereich, den Benutzer) in der Verwaltung. Die ID ist die Zahl am Ende der Adresse im Browser, z. B. ''%%.../22/%%''. IDs sind sicherer als Namen: Ein umbenanntes Produkt behält seine ID.
----
===== Beispiele =====
Alle Druckernamen in den Beispielen (''Bier'', ''Schank 1'' …) musst du durch die Namen **deiner** Drucker ersetzen.
==== Bestimmte Produkte auf einen eigenen Drucker ====
Bier (Produkt-IDs 22, 23 und 36) wird am Bierwagen gedruckt. Druckt der nicht, springt Schank 1 ein.
if pos.product_id in [22, 23, 36]:
printer_name = 'Bier'
backup_printer_name = 'Schank 1'
==== Produkte nach Namen ====
Alles, in dessen Namen „Waffel“ vorkommt („Waffel“, „Waffel mit Eis“, „Schokowaffel“ …), geht an den Waffelstand. Achtung: Groß-/Kleinschreibung zählt — ''%%'Waffel'%%'' findet „Schokowaffel“ **nicht**. Mit ''%%'waffel' in pos.product_name.lower()%%'' ist die Schreibweise egal.
if 'waffel' in pos.product_name.lower():
printer_name = 'Waffeln'
backup_printer_name = 'Kueche'
==== Schank je Bereich ====
Getränke aus Halle und Zelt werden an Schank 1 gedruckt, Getränke aus allen anderen Bereichen an Schank 2. Die beiden Schanken sind gegenseitig Ersatzdrucker. \\ {{:routing_bon_bereich.png?direct&800|}}
if pos.product_group_name == u'Getränke':
if pos.order.site_name in ['Halle', 'Zelt']:
printer_name = 'Schank 1'
backup_printer_name = 'Schank 2'
else:
printer_name = 'Schank 2'
backup_printer_name = 'Schank 1'
==== Last auf zwei Drucker verteilen (Round Robin) ====
Bons **abwechselnd** auf mehrere Drucker aufteilen — auch **Lastverteilung**, **Loadbalancing** oder **Round Robin** genannt. Alles, was normalerweise auf dem Drucker „Schank“ landen würde, wird auf Schank 1 oder Schank 2 gedruckt — je nachdem, ob die Bestellung in einer geraden oder ungeraden Sekunde abgeschickt wurde. Das verteilt die Bons im Schnitt gleichmäßig.
if printer.name == 'Schank':
if pos.order.order_time.second % 2 == 0:
printer_name = 'Schank 1'
backup_printer_name = 'Schank 2'
else:
printer_name = 'Schank 2'
backup_printer_name = 'Schank 1'
Alle Positionen einer Bestellung haben dieselbe Bestellzeit — eine Bestellung wird also nie auf beide Schanken aufgeteilt.
**Achtung: Das ist kein echtes Round Robin.** Welche Schank druckt, hängt nur von der Sekunde ab, in der die Bestellung abgeschickt wurde. Über einen Abend gleicht sich das aus, eine strenge Abwechslung ist aber nicht garantiert: Mehrere Bestellungen hintereinander können auf derselben Schank landen.
==== Eigener Bon auf demselben Drucker ====
Hängst du an den Druckernamen ein ''%'' und einen beliebigen Zusatz an, druckt BonDroid diese Positionen auf **demselben Drucker**, aber auf einem **eigenen Bon**. Hier bekommen die Nachspeisen einen eigenen Bon in der Küche, damit sie erst später zubereitet werden. \\ {{:routing_bon_eigener_bon.png?direct&800|}}
if pos.product_group_name == 'Nachspeisen':
printer_name = 'Kueche%Nachspeise'
Der Teil vor dem ''%'' muss ein Druckername sein, der Teil danach ist frei wählbar. Positionen mit demselben Zusatz landen gemeinsam auf einem Bon.
==== Bestellungen eines Kellners umleiten ====
Alles, was der Benutzer „Kassa“ bestellt, wird am Drucker „Kassa“ gedruckt — z. B. für einen Abhol-Verkauf an der Kassa.
if pos.order.user_name == 'Kassa':
printer_name = 'Kassa'
Statt des Namens geht auch die ID: ''%%if pos.order.user_id == 21:%%''
==== Ab einer bestimmten Uhrzeit umleiten ====
Ab 22 Uhr ist der Bierwagen geschlossen — Bier geht dann an Schank 1.
if pos.product_id in [22, 23, 36]:
if pos.order.order_time.hour >= 22:
printer_name = 'Schank 1'
else:
printer_name = 'Bier'
backup_printer_name = 'Schank 1'
==== Produkte gar nicht drucken ====
Für Produkte, die keinen Bon brauchen (z. B. Pfand oder Eintritt), legst du einen Drucker mit Häkchen **Virtuell** an (hier „Nirvana“) und leitest die Produkte dorthin.
if pos.product_name in ['Pfand', 'Eintritt']:
printer_name = 'Nirvana'
----
===== Testen und Fehlersuche =====
Es gibt **keinen Testknopf** und **keine Fehlermeldung** beim Speichern. Eine Regel mit Tippfehler wird bei der Bestellung einfach **übersprungen** — die Bons kommen dann weiter aus dem alten Drucker. Mach deshalb nach jeder Änderung eine **Testbestellung** mit einem betroffenen Produkt und prüfe, wo der Bon herauskommt.
^ Problem ^ Mögliche Ursache ^
| Regel wirkt gar nicht | Häkchen **Aktiv** fehlt · Druckername falsch geschrieben (Groß-/Kleinschreibung, Leerzeichen) · Einrückung oder Doppelpunkt fehlt · Umlaut ohne ''u'' davor |
| Regel wirkt nur manchmal | Eine **weiter oben** stehende Regel greift zuerst — Reihenfolge prüfen |
| Ein Produkt wird plötzlich woanders gedruckt | Eine allgemeine Regel (z. B. für die ganze Produktgruppe) erfasst es mit — spezielle Regel **darüber** anlegen |
| Getränke kommen auf **zwei Bons** aus demselben Drucker | Positionen, die über eine Regel kommen, bekommen einen eigenen Bon — getrennt von denen, die ohne Regel auf diesem Drucker landen. Abhilfe: alle Produkte dieses Druckers über **dieselbe** Regel schicken |
| **Separater Bestell-Bon** wirkt nicht mehr | Greift eine Regel, hat sie Vorrang vor dem Häkchen beim Produkt. Abhilfe: in der Regel je Produkt einen eigenen Zusatz verwenden, z. B. ''%%'Kueche%Schnitzel'%%'' (siehe [[#eigener_bon_auf_demselben_drucker|Eigener Bon]]) |
| Bon kommt aus dem Ersatzdrucker | Der Drucker aus der Regel ist nicht erreichbar (Strom, Netzwerk) — BonDroid ist nach ca. 11 Sekunden ausgewichen |
Kommst du nicht weiter, schick uns den Regel-Code — wir schauen ihn uns gerne an.