VGBC Fase 2 - Ticket Product Setup Sessie¶
Datum: 2025-12-15 Status: Voltooid Doel: Implementatie van basis ticketverkoop met studentenkorting en standhouder quota management
Context¶
Fase 2 van het VGBC ticketsysteem implementeert de productsetup en basisfunctionaliteit voor ticketverkoop. Dit bouwt voort op de bestaande Commerce setup met BTW automatisering en Mollie integratie.
Uitgevoerd Werk¶
1. ECK Entity: vgbc_partner_quota¶
Locatie: /admin/structure/eck/entity_type/vgbc_partner_quota
Nieuwe ECK entity type voor herbruikbaar quota beheer per partner per VGBC editie.
Velden:
- field_partner - Entity reference naar Partner ECK entity
- field_vgbc_editie - Entity reference naar vgbc entity (bundle: vgbc_editie)
- field_quota - Integer, aantal toegestane standhouder tickets
Bestaande VGBC structuur:
- ECK entity type: vgbc
- Bundle: vgbc_editie (VGBC2025, VGBC2024, VGBC2026 ID=33)
- Bundle: vgbc_spreker (sprekers)
- Node type: vgbc_event (workshops, keynotes - content)
Design keuze: ECK entity ipv Paragraphs voor betere Views integratie en query performance.
2. Custom Commerce Plugins¶
StudentProfessionCondition
- Locatie: /var/www/sites/dev.voedingsgeneeskunde/web/modules/custom/vg_commerce/src/Plugin/Commerce/Condition/StudentProfessionCondition.php
- Plugin ID: vg_student_profession
- Functie: Commerce Promotion condition die checkt of user field_beroep = "student" heeft in customer profile
- Case-insensitive check (student, Student, STUDENT werken allemaal)
StandhouderQuotaValidator
- Locatie: /var/www/sites/dev.voedingsgeneeskunde/web/modules/custom/vg_commerce/src/EventSubscriber/StandhouderQuotaValidator.php
- Event: commerce_order.place.pre_transition (priority: -100)
- Functie: Valideert standhouder ticket quota voor checkout
- Logica:
1. Check of order standhouder tickets bevat (SKU bevat 'standhouder')
2. Laad partner via user -> customer profile -> field_partner
3. Query vgbc_partner_quota voor partner + VGBC2026 (ID 33, hardcoded)
4. Tel verkochte tickets (orders met status completed)
5. Block checkout als (verkocht + nieuw) > quota
- Error messages: Nederlands, duidelijke quota feedback
Service registratie:
- Locatie: /var/www/sites/dev.voedingsgeneeskunde/web/modules/custom/vg_commerce/vg_commerce.services.yml
- Service: vg_commerce.standhouder_quota_validator
3. Products & Variations¶
Product Variation Type:
- vgbc_ticket - VGBC Ticket type (bestaand, reeds aangemaakt)
Products:
Product ID 5: VGBC 2026 - Standaard Ticket
- Type: default
- Variation: vgbc_ticket
- SKU: vgbc2026-ticket
- Prijs: EUR 49.95 (excl. BTW)
- Status: Published
- Store: 1
Product ID 6: VGBC 2026 - Standhouder Ticket
- Type: default
- Variation: vgbc_ticket
- SKU: vgbc2026-standhouder
- Prijs: EUR 0.00
- Status: Published
- Store: 1
- Validatie: StandhouderQuotaValidator actief
4. Commerce Promotion¶
Promotion ID 1: Studentenkorting VGBC 2026 - Type: Order percentage off - Percentage: 40% (EUR 49.95 -> EUR 29.97, bijna EUR 30.00) - Condition: vg_student_profession - Compatibility: any - Status: Enabled - Start date: 2024-01-01
Design keuze: 40% percentage korting ipv fixed amount EUR 20.00 omdat Commerce Promotions geen fixed amount offer type heeft zonder extra modules. Percentage is flexibel en UI-instelbaar.
5. Configuration Fields¶
field_payment_method op commerce_order - Type: list_string - Bundle: default order type - Values: - mollie: Mollie - handmatig: Handmatig - standhouder_quota: Standhouder quota - Required: FALSE - Gebruikt voor: rapportage en custom ticket flow tracking
Rol: Winkel
- Machine name: winkel
- Status: bestaand, reeds aangemaakt
- Permissies: (via UI ingesteld)
6. Winkel Views per Product Type¶
Nieuwe Views aangemaakt voor gestructureerde winkel display:
View: winkel_tickets - Label: Winkel - Tickets - Base: commerce_product_field_data - Filter: variation type = vgbc_ticket - Display: block_1 (beschikbaar in Layout Builder)
View: winkel_uitgaven - Label: Winkel - Uitgaven - Filter: variation type = uitgave - BTW: 9% laag tarief (boeken, publicaties) - Display: block_1
View: winkel_merchandise - Label: Winkel - Merchandise - Filter: variation type = merchandise - BTW: 21% hoog tarief - Display: block_1
View: winkel_abonnementen - Label: Winkel - Abonnementen - Filter: variation type = abonnementen - Display: block_1
Bestaande view:
- winkel_losse_nummers - filter: variation type = los_nummer
Implementatie: Views gedupliceerd van bestaande winkel_losse_nummers view, aangepast per variation type. Elk beschikbaar als block in Layout Builder voor plaatsing op /winkel pagina.
Technische Notities¶
Hardcoded Waarden¶
VGBC2026 editie ID: 33 - Locatie in code: StandhouderQuotaValidator.php regel 104 - TODO: Later configureerbaar maken via settings form of taxonomy
Store ID: 1 - Gebruikt bij product aanmaak - Assumptie: single store setup
Module Dependencies¶
vg_commerce module dependencies geupdate:
dependencies:
- commerce:commerce_product
- commerce:commerce_tax
- commerce:commerce_promotion
- commerce:commerce_order
- profile:profile
Variation Types Overzicht¶
Alle variation types in systeem:
- abonnementen - Abonnement
- los_nummer - Los nummer (tijdschrift edities)
- merchandise - Merchandise (21% BTW)
- tickets - Ticket (oud, niet gebruikt)
- uitgave - Uitgave (boeken, publicaties, 9% BTW)
- vgbc_ticket - VGBC ticket (nieuw, gebruikt voor VGBC2026 tickets)
Testing Checklist¶
Nog niet uitgevoerd - voor volgende sessie:
- Test 1: Normale ticket aankoop (niet-student, EUR 49.95)
- Test 2: Student ticket aankoop (field_beroep=student, EUR 29.97)
- Test 3: Standhouder binnen quota (maak test partner met quota=3)
- Test 4: Standhouder quota overschreden (probeer 4e ticket)
- Test 5: field_partner ontbreekt (error message check)
- Test 6: Winkel Views tonen correct per type
Bekende Issues¶
Issue 1: Tickets niet zichtbaar op /winkel - Oorzaak: /winkel gebruikt Layout Builder met handmatig geplaatste View blocks - Oplossing: Handmatig View blocks toevoegen via Layout Builder - Views beschikbaar: Winkel - Tickets, Winkel - Uitgaven, Winkel - Merchandise, Winkel - Abonnementen - Status: Views aangemaakt, placement door gebruiker
Issue 2: VGBC editie hardcoded
- Locatie: StandhouderQuotaValidator.php:104
- Waarde: $vgbc_editie_id = 33;
- Impact: Moet handmatig aangepast voor VGBC2027
- Prioriteit: Laag (voor Fase 3 of 4)
Issue 3: field_partner op customer profile
- Status: Niet aangemaakt (optioneel)
- Nodig voor: Standhouder quota validatie
- Workaround: Handmatig toevoegen indien nodig
- Locatie: /admin/config/people/profiles/types/manage/customer/fields/add-field
Config Export¶
Geexporteerd op 2025-12-15: - ECK entity type en bundle configs - Field storage en instance configs - Views configs (4 nieuwe) - Role config - Variation type configs - Module updated
Locatie: sites/default/files/config_[hash]/sync/
Volgende Sessie: Fase 3¶
Doel: Multi-ticket checkout en attendee assignment
Belangrijkste taken: 1. field_partner toevoegen aan customer profile (if needed) 2. Custom checkout pane: TicketAssignmentPane - Per ticket: "Voor jezelf" of "Voor iemand anders" - Collect: naam, email, beroep - Create users/profiles as needed - Store attendee_uid per order item 3. Student discount logic per attendee (niet per order) 4. Testen van Fase 2 functionaliteit 5. Begint aan License + QR code generatie (commerce_license integratie)
Referentie documenten:
- 20251125-vgbc-ticket-systeem-definitief.md - complete spec
- commerce-setup-overzicht.md - totaal overzicht
- 20251215-fase2-ui-configuratie.md - UI setup instructies
Changelog¶
2025-12-15 17:30: Sessie afgerond, document aangemaakt
Document eigenaar: Warp Agent + Robin Laatste update: 2025-12-15 Versie: 1.0
Voor AI: Dit document beschrijft Fase 2 implementatie. Lees ook 20251125-vgbc-ticket-systeem-definitief.md voor complete context.