2025-11-25: Sessie Verslag - VGBC Ticket Systeem Planning¶
Datum: 2025-11-25 Status: Voltooid Doel: Complete planning en specificatie voor VGBC2026 ticket systeem met Commerce, QR-scanning en accreditatiebewijs
Samenvatting¶
Vandaag hebben we een volledige planning gemaakt voor het VGBC ticket systeem. We hebben alle ticketsoorten gedefinieerd, de multi-ticket aankoopflow uitgewerkt, en het QR-scan proces aan de deur gespecificeerd. Daarnaast hebben we documentatie standaarden opgezet voor toekomstige sessies.
Wat We Hebben Gedaan¶
1. Ticketsoorten Definitie (4 types)¶
1.1 Standaard Ticket - Prijs instelbaar via Commerce UI - Betaling via Mollie - Normale checkout flow
1.2 Student Ticket
- GEEN apart product type, maar korting op Standaard Ticket
- Korting automatisch als field_beroep = "student" in customer profile
- Percentage instelbaar via Commerce UI (Price Rule)
- Controle aan deur: studentenpas
1.3 Standhouder Ticket
- Gratis (EUR 0)
- Gekoppeld aan Partner ECK entity met quotum
- Field: field_vgbc2026_tickets (integer)
- Quotum validatie tijdens checkout
- Geen Mollie (direct completed)
1.4 Custom/Admin Ticket
- Voor uitzonderingen (VIP, cash, crew)
- Aangemaakt door rol "Winkel" of "Administrator"
- Order field: field_payment_method (mollie | custom)
- Direct completed state
- Invoice en QR worden wel gegenereerd
1.5 VIP/Gratis (Gastenlijst) - Buiten Commerce systeem - Handmatige lijst - Geen Drupal accounts of QR-codes
2. Multi-Ticket Aankoop Flow¶
Probleem: Jan koopt 2 tickets (voor zichzelf en Marie). Elk ticket moet unieke QR hebben.
Oplossing: Custom Checkout Pane - "Deelnemers toewijzen"
- Voor elk ticket: radio "Jezelf" of "Iemand anders"
- Bij "Iemand anders": velden voor Naam, Email, Beroep
- ALLEEN field_beroep wordt ingevuld (rest vult ontvanger later in)
- Als email bestaat: koppel aan bestaande user
- Als email nieuw: maak user + customer profile aan
- Prijs herberekening gebeurt automatisch (studentenkorting)
- Na betaling: aparte License + QR per attendee
Technische implementatie:
- Checkout pane: TicketAssignmentPane.php in vg_commerce
- Opslaan: order_item->setData('attendee_uid', $uid)
- License generatie via Event Subscriber op commerce_order.place.post_transition
Belangrijke beslissing: field_beroep zit op Profile entity (customer), NIET op User!
3. QR-code Scan Workflow (Aan de Deur)¶
Complete flow:
Bezoeker arriveert
↓
Toont QR-code (via email op telefoon)
↓
Deur medewerker: tablet/phone → /scan
↓
Camera interface (jsQR library, elke 100ms scan)
↓
API: /api/ticket/validate?code=VGBC2026-USER45-LICENSE123
↓
Drupal validatie:
- Check: bestaat? al gescand? juist event?
- Update: status="scanned", timestamp, location
↓
UI feedback: GROEN (welkom) of ROOD (probleem)
↓
Accreditatiebewijs genereren:
- PDF met logo, naam, event, datum + TIJD van scan
- Email via Symfony Mailer (niet MailChimp)
- Downloadbaar op user account
Technisch: - Frontend: JavaScript + jsQR library + camera API - Backend: Custom controller in vg_ticket_scanner module - Event: LicenseScannedEvent triggert certificaat generatie - PDF: Entity Print + wkhtmltopdf
4. Documentatie & Tooling¶
4.1 Definitief Specificatie Document
Aangemaakt: 20251125-vgbc-ticket-systeem-definitief.md
- Complete beschrijving alle ticketsoorten
- Multi-ticket flow met code voorbeelden
- QR-scan workflow met error scenarios
- 7 fases implementatie tijdslijn
- AI Context sectie met huidige status
4.2 Documentatie Template & Rules
Aangemaakt: _TEMPLATE-notities-rule.md
- Richtlijnen voor Markdown format
- GEEN emoji's (AI-leesbaar)
- Absolute paden, technische precisie
- Structuur template voor nieuwe docs
4.3 Warp Project Rules
Aangemaakt: WARP.md in project root
- Automatisch actief voor deze directory
- Project context + documentatie standaarden
- Drupal specifieke info
- Response style richtlijnen
Belangrijke Technische Beslissingen¶
Beslissing 1: Student Ticket Implementatie¶
Gekozen: Korting op Standaard Ticket (geen apart product)
Reden: Eenvoudiger, flexibeler, minder producten, percentage via UI instelbaar
Impact: Commerce Price Rule nodig met conditie field_beroep = student
Beslissing 2: Ticket Toewijzing Timing¶
Gekozen: TIJDENS checkout (niet NA betaling) Reden: - Correcte prijs direct berekenen (met kortingen) - Geen "vergeten toewijzen" probleem - Invoice + QR direct naar juiste personen - Voorkomt studentenkorting edge cases
Beslissing 3: Minimale Profile Data bij Toewijzing¶
Gekozen: Alleen Naam, Email, Beroep invullen
Reden: Minimale friction, privacy, ontvanger vult rest later zelf in
Impact: Customer profile aangemaakt met alleen field_beroep, rest NULL
Beslissing 4: Email Verzending Accreditatiebewijs¶
Gekozen: Symfony Mailer (niet MailChimp) Reden: Consistentie met invoice emails, dezelfde templates, betrouwbaarder Impact: Event Subscriber triggert email zoals bij invoices
Beslissing 5: VIP Tickets Buiten Commerce¶
Gekozen: Handmatige gastenlijst, geen Drupal accounts Reden: Simpeler, minder overhead, VIPs zijn kleine groep Impact: Aparte lijst bij deur, geen QR-codes voor deze groep
Implementatie Tijdslijn (7 Fases)¶
Fase 1: Basis Commerce Setup [x] VOLTOOID¶
- Commerce modules, Mollie, invoices, BTW, Symfony Mailer
Fase 2: Ticket Product Setup [ ] TODO VOLGENDE SESSIE¶
- Rol "Winkel" aanmaken
field_payment_methodop order- Partner ECK:
field_vgbc2026_ticketsquotum velden - Standaard Ticket product variation
- Studentenkorting Price Rule (percentage via UI)
- Standhouder ticket + quotum validatie
Fase 3: Multi-ticket Checkout [ ] TODO¶
- Custom Checkout Pane: TicketAssignmentPane
- User + Profile creatie voor "iemand anders"
- Prijs herberekening met kortingen
- Testen: 2 tickets kopen (Jan + Marie scenario)
Fase 4: Commerce License Setup [ ] TODO¶
- Commerce License module configureren
- License type: "VGBC Ticket"
- Event Subscriber: Order Paid → License aanmaken
- QR-code generatie (endroid/qr-code)
- QR koppelen aan License entity
- QR toevoegen aan invoice PDF
Fase 5: Scan Interface [ ] TODO¶
- Custom module: vg_ticket_scanner
- Route: /scan (permission: "scan vgbc tickets")
- Frontend: jsQR library + camera interface
- Backend: /api/ticket/validate endpoint
- UI: groen/rood scherm feedback
- Logging: wie, wanneer, waar
Fase 6: Accreditatiebewijs [ ] TODO¶
- Certificate entity/node type
- Event Subscriber: License Scanned → Certificate
- PDF template (wkhtmltopdf)
- User dashboard: download link
- Email via Symfony Mailer met PDF attachment
Fase 7: Testing & Launch [ ] TODO¶
- E2E test: koop → betaal → email → scan → bewijs
- Test studentenkorting
- Test standhouder quotum
- Test multi-ticket (Jan + Marie)
- Test custom/admin tickets
- Scan interface UX test met tablet
- Training deur medewerkers
- Live deployment checklist
Open Vragen voor Volgende Sessies¶
Partner Quotum Beheer¶
- Welke rol kan quotum invullen? (Admin + Winkel?)
- UI locatie:
/admin/content/partner/{id}/edit? - Notificatie als quotum vol is?
Accreditatiebewijs Design¶
- Template design beschikbaar?
- Welke content/logo moet erop?
- PDF styling: wie doet dit?
Scan Interface Hardware¶
- Welke tablets worden gebruikt?
- WiFi op locatie geregeld?
- Backup plan bij internetuitval?
Early Bird Timing¶
- Handmatig prijs aanpassen of automatisch?
- Als automatisch: welke datum?
Technische Context voor AI¶
Project Structuur¶
- Drupal root:
/var/www/sites/dev.voedingsgeneeskunde/ - Web root:
/var/www/sites/dev.voedingsgeneeskunde/web/ - Custom modules:
/var/www/sites/dev.voedingsgeneeskunde/web/modules/custom/ - Notities:
/var/www/sites/dev.voedingsgeneeskunde/Notities/
Bestaande Custom Modules¶
- vg_commerce (BTW automatisering, pricing logic)
- vg_invoice_styling (Invoice PDF styling)
- vg_mailchimp_subscribe (MailChimp user sync)
Commerce Setup¶
- Order types: default
- Payment gateway: Mollie (id:
betaling_via_mollie) - Invoice numbering: VG-[jaar]-[nummer]
- PDF engine: wkhtmltopdf (
/usr/bin/wkhtmltopdf) - Email: Symfony Mailer
- Product variation types: los_nummer, uitgave, ticket, merchandise, abonnement, e-book
Profile Setup¶
- Profile type:
customer(via Profile module) - Belangrijk:
field_beroepzit op Profile entity, NIET op User! - Beroep opties: therapeut, dietist, leefstijlcoach, arts, onderzoeker, student, anders
Partner ECK Entity¶
- Entity type: partner (via ECK)
- Toe te voegen:
field_vgbc2026_tickets(integer) enfield_vgbc_editie(entity_reference)
Bestanden Aangemaakt Tijdens Sessie¶
/var/www/sites/dev.voedingsgeneeskunde/Notities/20251125-vgbc-ticket-systeem-definitief.md- Complete specificatie (versie 1.1)
-
Single source of truth voor ticket systeem
-
/var/www/sites/dev.voedingsgeneeskunde/Notities/_TEMPLATE-notities-rule.md - Documentatie richtlijnen template
-
Voor nieuwe docs en referentie
-
/var/www/sites/dev.voedingsgeneeskunde/WARP.md - Warp Project Rules
-
Automatisch actief voor AI in deze directory
-
/var/www/sites/dev.voedingsgeneeskunde/Notities/20251125-sessie-updates.md - Tussentijdse updates tijdens sessie
-
QR scan workflow correcties
-
/var/www/sites/dev.voedingsgeneeskunde/Notities/20251125-sessie-verslag.md - Dit document
Volgende Sessie¶
Start met:
1. Lees /var/www/sites/dev.voedingsgeneeskunde/Notities/20251125-vgbc-ticket-systeem-definitief.md
2. Check TODO list in sectie 9.6
3. Begin Fase 2: Rol "Winkel" aanmaken + permissions
Prioriteit:
- Rol "Winkel" met Commerce permissions
- field_payment_method toevoegen aan commerce_order
- Partner quotum velden (field_vgbc2026_tickets, field_vgbc_editie)
Lessons Learned¶
- Planning eerst, code later - Complete specificatie voorkomt verwarring
- Beslissingen documenteren - Waarom we keuzes maken is belangrijk
- AI-vriendelijke docs - Geen emoji's, absolute paden, technische precisie
- Project Rules zijn handig - Context automatisch beschikbaar bij volgende sessies
- Multi-ticket flow is complex - Goed doordacht met edge cases (studenten korting!)
Document eigenaar: Robin Laatste update: 2025-11-25 18:06 Versie: 1.0 Sessie duur: ~2 uur Status: Planning voltooid, implementatie volgende sessie