Skip to content

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_method op order
  • Partner ECK: field_vgbc2026_tickets quotum 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_beroep zit 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) en field_vgbc_editie (entity_reference)

Bestanden Aangemaakt Tijdens Sessie

  1. /var/www/sites/dev.voedingsgeneeskunde/Notities/20251125-vgbc-ticket-systeem-definitief.md
  2. Complete specificatie (versie 1.1)
  3. Single source of truth voor ticket systeem

  4. /var/www/sites/dev.voedingsgeneeskunde/Notities/_TEMPLATE-notities-rule.md

  5. Documentatie richtlijnen template
  6. Voor nieuwe docs en referentie

  7. /var/www/sites/dev.voedingsgeneeskunde/WARP.md

  8. Warp Project Rules
  9. Automatisch actief voor AI in deze directory

  10. /var/www/sites/dev.voedingsgeneeskunde/Notities/20251125-sessie-updates.md

  11. Tussentijdse updates tijdens sessie
  12. QR scan workflow correcties

  13. /var/www/sites/dev.voedingsgeneeskunde/Notities/20251125-sessie-verslag.md

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

  1. Planning eerst, code later - Complete specificatie voorkomt verwarring
  2. Beslissingen documenteren - Waarom we keuzes maken is belangrijk
  3. AI-vriendelijke docs - Geen emoji's, absolute paden, technische precisie
  4. Project Rules zijn handig - Context automatisch beschikbaar bij volgende sessies
  5. 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