Issue #3611638: Ticket generation submodule (yoyaku_ticket): PDF with QR code
Adds the yoyaku_ticket submodule: printable/emailable PDF tickets for confirmed bookings, each carrying an HMAC-signed QR code that a door scanner can validate offline.
What it adds
- One ticket per confirmed booking line (the QR names the booking and admits its quantity).
- A swappable
PdfRendererplugin type, with a bundled Dompdf renderer (dompdf/dompdf). - QR generation via
endroid/qr-code. - Two namespaced HMAC tokens (mirroring
CancelToken): a QR check-in token and a download-link token, so neither can be replayed as the other. The QR expiry is tied to the event end. - A public signed download route and a
[yoyaku-order:ticket-url]token. - A
hook_yoyaku_ticket_units_alterseam so other submodules can redefine the tickets.
Not in scope (follow-ups)
- Per-seat tickets and per-resource-type granularity: #3612561 (seating bridge).
- Attaching tickets to the Orchestra confirmation email: depends on Orchestra #3612558.
Tests
- Unit: token round-trip, tamper, expiry, cross-prefix rejection.
- Kernel: builder produces per-booking units and real PDF bytes.
- Functional: the signed download route streams the PDF; bad or forged tokens 404.
The PDF/QR libraries (dompdf/dompdf, endroid/qr-code) are added to require-dev and suggest. A documentation page, submodule README and French translations are included.