Skip to content

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.