Shop | Ticket
Verkaufte Tickets können auf zwei Arten an die Kundschaft kommen:
Verkaufte Tickets können auf zwei Arten an die Kundschaft kommen:
- als A4-PDF-E-Ticket per E-Mail oder Download — druckbar auf jedem Drucker
- als BOCA-Direkt-Druck im Format 203 × 83 mm, direkt am Counter — setzt einen BOCA-Ticketdrucker voraus
Wenn du das PDF-E-Ticket oder die Bestellprozesse tiefer anpassen möchtest, gibt es im Shop-Modul mehrere Injection-Punkte (HTML-/CSS-/JS-Injection). Siehe dazu die Shop-Dokumentation.
Inhalt
E-Ticket (PDF)
Das E-Ticket ist ein A4-PDF, das beim Kauf automatisch erzeugt und an die Kundschaft per E-Mail verschickt sowie zum Download angeboten wird. Es kann auf jedem handelsüblichen Drucker (Tinte, Laser, mobile Drucker) gedruckt werden — der QR-Code am Einlass funktioniert genauso wie beim BOCA-Direkt-Druck.
Ticketfelder im Standard-Layout
Die auf dem Standard-Ticket abgedruckten Informationen werden aus folgenden Werten generiert:
| Feld | Beschreibung |
| 1. Titel | Titel aus dem Shop Event |
| 2. Ort | Ort aus dem Shop Event |
| 3. Datum | Datum des Events |
| 4. Beginn / Einlass | Beginn und Einlass aus dem Ablauf des Events |
| 5. Kategorie | Platzkategorie des Kontingents |
| 6. Preis | Preis des Kontingents |
| 7. Veranstalter | Kontakte mit der Rolle „Veranstalter:in" und „Örtl. Veranstalter:in" des Events |
| 8. Ticketinfo | Event-Information „Ticketinfo" |
| 9. Sponsoren | Eventbilder mit dem Tag „sponsor" |
| 10. Bestelldaten | Daten aus der Bestellung |
| 11. Stammdaten | Shop-Stammdaten |
| 12. Logo | Logo aus den Shop-Stammdaten |

Anpassungen am E-Ticket
Das E-Ticket-Layout kannst du über die HTML-/CSS-/JS-Injection-Punkte des Shop-Moduls anpassen. Eine ausführliche Beschreibung findest du in der Shop-Dokumentation.
BOCA-Direkt-Druck
Für das Direkt-Drucken am Counter setzen wir einen Ticketdrucker der BOCA-Reihe voraus (getestet mit dem Boca Lemur). Der Drucker muss im Netzwerk per TCP/9100 erreichbar sein und die FGL-Sprache von BOCA verstehen.
Druckerkonfiguration
Die Druckerverbindung wird in den Shop-Stammdaten hinterlegt:
| Feld | Beschreibung |
| Drucker-IP / Host | Die im lokalen Netzwerk erreichbare Adresse des BOCA-Druckers (z.B. 192.168.1.50 oder ein Hostname). |
| Port | In der Regel 9100 (BOCA-Standardport für Raw-FGL). |
| Externer Pfad (optional) | HTTPS-Basis-URL für eigene Ticket-Layouts (siehe nächster Abschnitt). |
Ist die Drucker-Konfiguration unvollständig, schlägt der Druckauftrag mit einer eindeutigen Fehlermeldung fehl, ohne dass Tickets verloren gehen — der Auftrag kann nach Korrektur wiederholt werden.
Eigenes Ticket-Layout (Custom-FGL-Template)
Das Standard-Layout für den BOCA-Druck reicht für die meisten Anwendungsfälle. Wenn du ein eigenes Layout brauchst — z.B. anderes Logo-Arrangement, zusätzliche Hinweistexte, andere Schriftgrößen — kannst du eine eigene FGL-Vorlage in einem öffentlichen Ordner deiner Wahl hinterlegen.
Setup
- Externer Pfad konfigurieren: In den Shop-Stammdaten unter „Externer Pfad" eine HTTPS-Basis-URL eintragen, z.B.
https://meine-domain.de/copilot/. - Template-Datei ablegen: Unter dieser Basis-URL ein File
boca-ticket/base.fglöffentlich erreichbar bereitstellen (kein Auth-Schutz). - Drucken: Beim nächsten Druckauftrag wird das eigene Template verwendet. Änderungen am Template greifen nach max. 30 Sekunden (Cache).
Event-spezifische Layouts
Du kannst pro Event ein eigenes Layout hinterlegen. Die App sucht in dieser Reihenfolge — die erste gefundene Datei wird verwendet:
| Pfad | Wann |
{base}/boca-ticket/events/{eventId}/template.fgl | Event-spezifisch (höchste Priorität) |
{base}/boca-ticket/base.fgl | Globaler Fallback |
| Standard-Layout | Wenn keine Datei gefunden / „Externer Pfad" leer |
{eventId} ist die externe Event-ID, wie sie auch im Shop-Backend angezeigt wird.
Template-Format
Die Templates sind Handlebars-Templates mit FGL-Code drin. Variablen werden mit {{variable}} eingesetzt, Helper-Funktionen mit {{helper arg1 arg2 …}}. Datei-Encoding: UTF-8 — Texte werden automatisch in die BOCA-Codepage konvertiert.
Variablen und Helper
Verfügbare Variablen
| Variable | Beispiel |
eventName | Mozart-Galakonzert |
subTitle | mit dem Wiener Philharmonie-Quartett |
location | Konzerthaus Wien, Großer Saal |
category | Premium |
formattedPrice | 75,00 |
date | 30.04.2026 |
start | 20:00 |
doors | 19:00 |
token | ABC123DEF456 |
ticketInfo | Reihe 5, Platz 12 |
veranstalter | Wiener Konzertveranstaltungs GmbH |
order.firstName | Max |
order.lastName | Mustermann |
order.email | max@example.com |
Layout-Helper
| Helper | Signatur | Zweck |
text | {{text xMM yMM "F12" "Hello"}} | Text an Position rendern. Font siehe „Schriftarten" unten. |
qr | {{qr xMM yMM sizeMM "DATA"}} | QR-Code an Position. Größe in mm. |
logo | {{logo "shop" xMM yMM}} | Eingebettetes Logo. Name ∈ copilot, shop. |
sponsorLogos | {{sponsorLogos xMM yMM gapMM}} | Alle Sponsor-Logos nebeneinander, mit gapMM Abstand. |
priceLine | {{priceLine xMM yMM "Preis" formattedPrice}} | Preiszeile in Großschrift mit Euro-Zeichen. |
Position relativ zu vorigem Logo: Statt einer mm-Position kann ein String "after-{name}" übergeben werden. Beispiel: {{logo "shop" "after-copilot" 62}} setzt das Shop-Logo direkt rechts vom co*pilot-Logo (mit 3mm Abstand). Verfügbare Anker: after-copilot, after-shop, after-sponsors.
String-Helper
| Helper | Signatur | Zweck |
truncate | {{truncate eventName 40}} | String auf max. Länge kürzen. |
upper | {{upper eventName}} | Großbuchstaben. |
concat | {{concat "Hi " name}} | Strings konkatenieren. |
formatToken | {{formatToken token}} | 12-Zeichen-Token als XXX-XXXXXX-XXX. |
Koordinaten-System
- Ursprung: oben links, in Millimeter.
- Druckbarer Bereich: ungefähr 0–185 mm horizontal, 0–80 mm vertikal (abhängig vom Ticket-Format).
- Auflösung: ca. 8,1 Dots pro mm horizontal, 8 Dots pro mm vertikal.
Schriftarten und Umlaute
Nicht jede BOCA-Schriftart kann deutsche Umlaute (Ä Ö Ü ß) darstellen. Empirisch festgestellt am Lemur FGL-46N7:
| Font | Größe | Stil | Umlaute? |
F3 | klein | Courier (Monospace) | ✅ ja |
F8 | groß | Helvetica Bold (breit) | ✅ ja |
F9 | klein | Helvetica | ✅ ja |
F10 | mittel | Helvetica | ✅ ja |
F11 | sehr groß | Display Bold | ❌ nein |
F12 | sehr groß | Display Bold Condensed | ❌ nein |
F13 | groß | Helvetica Condensed Bold | ✅ ja |
F11 und F12 sind die einzigen typischen „Big-Display"-Fonts ohne Umlaut-Glyphen. Damit dein Layout trotzdem ohne Lücken druckt, transliteriert co*pilot Umlaute bei diesen Fonts automatisch:
Ü → UE,Ö → OE,Ä → AE,ß → SS- Kleinbuchstaben analog:
ü → ue,ö → oe,ä → ae
Beispiel: {{text 0 0 "F12" (upper eventName)}} mit eventName = "Parteitag Die Grünen" druckt PARTEITAG DIE GRUENEN.
Echte Umlaute statt Transliteration
Möchtest du im Titel echte Umlaut-Glyphen statt der Transliteration, nimm einen Font, der sie kann. Für einen großen Titel empfehlen wir F13 mit Skalierung <HW2,2> — sieht praktisch identisch zu F12 aus, hat aber echte Umlaute:
{{text 0 0 "F13><HW2,2" (upper (truncate eventName 30))}}
{{!-- Achtung: HW skaliert auch alle folgenden Text-Ausgaben! --}}
{{text 0 15 "F9><HW1,1" subTitle}}
Wichtig: <HW> ist ein FGL-Statusbefehl und gilt für alle folgenden Text-Ausgaben, bis er explizit zurückgesetzt wird. Setze beim nächsten Text deshalb <HW1,1> mit, damit die kleinen Schriften nicht ebenfalls skaliert werden.
Beispiel-Template
{{!-- Mein Festival-Ticket-Layout --}}
<TT2>
{{!-- Header: Event-Name groß --}}
{{text 0 5 "F13" (upper (truncate eventName 30))}}
{{text 0 15 "F9" subTitle}}
{{!-- Datum prominent --}}
{{text 0 25 "F12" (concat date " — Beginn " start " Uhr")}}
{{text 0 30 "F3" (concat "Einlass: " doors " Uhr")}}
{{!-- Preis & Kategorie --}}
{{priceLine 0 40 "Preis" formattedPrice}}
{{text 100 40 "F10" (concat "Kategorie: " category)}}
{{!-- Inhaber --}}
{{text 0 50 "F9" (concat "Ticketinhaber: " order.firstName " " order.lastName)}}
{{!-- Hinweistext --}}
{{text 0 56 "F3" "Eintritt nur mit gültigem Ticket"}}
{{!-- Logos unten links --}}
{{logo "copilot" 0 65}}
{{logo "shop" "after-copilot" 65}}
{{sponsorLogos "after-shop" 65 3}}
{{!-- QR-Code rechts --}}
{{qr 145 25 25 token}}
{{text 145 55 "F3" (formatToken token)}}
<p>
Fehlerbehandlung beim Custom-Template
- Template nicht erreichbar (Netzwerk-Fehler): Fällt auf das Standard-Layout zurück, Druck läuft weiter.
- Datei nicht gefunden (404): Nächste Hierarchie-Stufe wird probiert, am Ende das Standard-Layout.
- Syntax-Fehler im Template: Druck läuft mit dem Standard-Layout weiter — nicht der ganze Druckauftrag bricht ab.