====== 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 |

💡 Gut zu wissen

---- ===== 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%%'' |

⚠ Umlaute: ein u vor den Text

---- ===== 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.