Commerce & Winkel - Domein Overzicht¶
Laatste update: 2025-12-15 Status: Living document Parent: [[00-PROJECT-INDEX]]
Quick Navigation¶
- [[#Product Catalog]] - Variatie types, BTW, pricing
- [[#Checkout & Betaling]] - Mollie, facturen, flows
- [[#VGBC Ticketsysteem]] - Event tickets met QR codes
- [[#Custom Modules]] - vg_commerce functionaliteit
- [[#Roadmap]] - Toekomstige features
Overzicht¶
Complete commerce implementatie voor verkoop van: - Tijdschrift edities (losse nummers, uitgaven) - Abonnementen - Merchandise - VGBC event tickets (in ontwikkeling)
Stack: - Drupal Commerce 2.x - Mollie payment gateway (test + live) - Custom BTW automatisering - PDF factuur generatie (wkhtmltopdf) - Email notificaties (Symfony Mailer)
Status: Productie-ready (Mollie test mode)
Product Catalog¶
Product Variation Types¶
| Type | Label | BTW | Gebruik | Status |
|---|---|---|---|---|
los_nummer |
Los nummer | 9% | Tijdschrift edities | Live |
uitgave |
Uitgave | 9% | Boeken, publicaties | Live |
abonnementen |
Abonnement | 9% | Jaarabonnementen | Live |
merchandise |
Merchandise | 21% | T-shirts, gadgets | Live |
vgbc_ticket |
VGBC Ticket | 21% | Event toegang | Dev |
BTW Logic:
- Automatisch via vg_commerce module
- TaxRateResolver checkt variation type
- 9% laag tarief: publicaties (los_nummer, uitgave, abonnementen)
- 21% hoog tarief: merchandise, tickets
- Verzending: 21% via ShippingTaxSubscriber
Key Documents: - [[commerce-setup-overzicht]] - Complete setup details - [[20251031-product-variaties-setup]] - Variation types setup
Product Management¶
Admin UI:
- Products: /admin/commerce/products
- Variations: /admin/commerce/config/product-variation-types
- Stores: /admin/commerce/config/stores
Current Products: - Losse nummers: Voedingsgeneeskunde edities - VGBC 2026 tickets (nieuw): - Standaard ticket: EUR 49.95 - Standhouder ticket: EUR 0.00 - Student korting: 40% automatisch
Checkout & Betaling¶
Checkout Flow¶
Type: Mollie (login required) - Stap 1: Login (existing user / register) - Stap 2: Order information - Stap 3: Order review - Stap 4: Mollie payment - Stap 5: Complete
Payment Gateway: - Mollie (commerce_mollie 1.x-dev) - Test mode: actief op dev - Live keys: configured op live - Custom patch: duplicate invoice fix (cff6bc6)
Order Completion: 1. Order state: draft -> placed -> completed 2. Payment via Mollie 3. Webhook triggers order completion 4. Invoice generatie (OrderPaidInvoiceSubscriber) 5. Email notificaties
Key Documents: - [[20251103-checkout-en-facturen-setup]] - Checkout configuratie - [[20251106-checkout-mollie-facturatie]] - Mollie integratie - [[20251121-checkout-ux-duplicate-invoices]] - Duplicate invoice fix
Factuur Generatie¶
Stack:
- Module: commerce_invoice
- Module: entity_print (wkhtmltopdf backend)
- Custom CSS: /web/themes/custom/vg25/css/invoice-pdf.css
- Event Subscriber: OrderPaidInvoiceSubscriber
Proces: 1. Order completed (paid via Mollie) 2. OrderPaidInvoiceSubscriber triggered 3. Invoice entity created 4. PDF generated via wkhtmltopdf 5. Email sent via Symfony Mailer
Factuur Details: - Nummer: automatisch incrementeel - Datum: order completion date - BTW: per line item (automatisch) - Template: commerce_invoice default + custom CSS - Opslag: private filesystem
Open Issues: - Font embedding in PDF (nog niet opgelost) - Template styling verfijnen
Key Documents: - [[20251121-invoice-generation-fix]] - Invoice workflow fix - [[20251107-pdf-invoice-fonts]] - Font embedding onderzoek
Email Notificaties¶
Stack: Symfony Mailer Templates: - Order confirmation - Invoice attachment - Custom ticket emails (toekomstig)
Configuratie: /admin/config/system/symfony-mailer
VGBC Ticketsysteem¶
Status: In ontwikkeling (Fase 2 voltooid) Master Document: [[20251125-vgbc-ticket-systeem-definitief]]
Fasen Overzicht¶
Fase 1: BTW & Basis [DONE] - BTW automatisering werkend - Commerce basis operationeel - Mollie integratie test
Fase 2: Products & Quota [DONE - 2025-12-15] - ECK entity: vgbc_partner_quota - Products: Standaard + Standhouder tickets - Studentenkorting: 40% automatisch - Standhouder quota validatie - Winkel Views per product type
Fase 3: Multi-ticket Checkout [TODO] - Custom checkout pane: TicketAssignmentPane - Per ticket attendee assignment - User/profile creatie voor attendees - Student discount per attendee - attendee_uid opslag per order item
Fase 4: QR Codes & Scanner [TODO] - commerce_license integratie - QR code generatie per ticket - Scanner module (vg_ticket_scanner) - Scan validation endpoint - Certificate generatie bij scan
Ticket Types¶
Standaard Ticket - Prijs: EUR 49.95 (excl. BTW) - SKU: vgbc2026-ticket - Betaling: Mollie - Korting: 40% voor studenten (EUR 29.97)
Standhouder Ticket - Prijs: EUR 0.00 - SKU: vgbc2026-standhouder - Quota check: via vgbc_partner_quota - Validatie: StandhouderQuotaValidator
Student Ticket - Geen apart product - Automatische korting op Standaard - Check: field_beroep = "student" in profile - Plugin: StudentProfessionCondition
Partner Quota Management¶
ECK Entity: vgbc_partner_quota - field_partner: reference naar Partner - field_vgbc_editie: reference naar vgbc_editie (VGBC2026 = ID 33) - field_quota: integer (aantal toegestane tickets)
Admin: /admin/content/partner-quota
Validatie Logic: 1. Check standhouder tickets in order 2. Laad partner via field_partner in customer profile 3. Query quota voor partner + editie 4. Count verkochte tickets (completed orders) 5. Block checkout als quota overschreden
Code: StandhouderQuotaValidator event subscriber
Recente Sessies¶
- [[20251215-fase2-ticket-setup-sessie]] - Fase 2 implementatie (2025-12-15)
- [[20251125-sessie-verslag]] - Planning & strategie (2025-11-25)
- [[20251124-vgbc-ticket-systeem-planning]] - Initiƫle planning (2025-11-24)
Custom Modules¶
vg_commerce¶
Locatie: /var/www/sites/dev.voedingsgeneeskunde/web/modules/custom/vg_commerce/
Functionaliteit:
TaxRateResolver
- Service: vg_commerce.tax_rate_resolver
- Functie: Automatische BTW bepaling per variation type
- Logic: 9% voor publicaties, 21% voor rest
- File: src/TaxRateResolver.php
ShippingTaxSubscriber
- Event: commerce_shipping.rates
- Functie: 21% BTW op verzendkosten
- File: src/EventSubscriber/ShippingTaxSubscriber.php
StudentProfessionCondition
- Plugin: vg_student_profession
- Type: Commerce Condition (Promotion)
- Functie: Check field_beroep = "student" in profile
- File: src/Plugin/Commerce/Condition/StudentProfessionCondition.php
StandhouderQuotaValidator
- Event: commerce_order.place.pre_transition
- Functie: Quota validatie standhouder tickets
- File: src/EventSubscriber/StandhouderQuotaValidator.php
User Routes & Controllers (Fase 3)
- ProfileViewController: /user/{uid}/profiel
- MyPageRedirectController: /my/* redirects
- Orders/invoices routes
- File: src/Controller/
Dependencies:
dependencies:
- commerce:commerce_product
- commerce:commerce_tax
- commerce:commerce_promotion
- commerce:commerce_order
- profile:profile
vg_invoice_styling¶
Locatie: /var/www/sites/dev.voedingsgeneeskunde/web/modules/custom/vg_invoice_styling/
Functie: - Custom CSS voor PDF invoices - Styling overrides voor commerce_invoice - Logo en huisstijl
vg_mailchimp_subscribe¶
Locatie: /var/www/sites/dev.voedingsgeneeskunde/web/modules/custom/vg_mailchimp_subscribe/
Zie: [[MAILCHIMP-overzicht]]
Winkel Display¶
Winkel Views¶
Locatie: /winkel (Layout Builder page)
Available View Blocks: - Winkel - Losse nummers (los_nummer) - Winkel - Uitgaven (uitgave) - Winkel - Tickets (vgbc_ticket) - Winkel - Merchandise (merchandise) - Winkel - Abonnementen (abonnementen)
Implementatie: - Base: commerce_product_field_data - Filter: variation type per view - Display: block_1 (Layout Builder compatible) - Styling: per theme
Status: Views aangemaakt, handmatig plaatsen via Layout Builder
Configuration¶
Order Types¶
Default Order Type:
- Machine name: default
- Checkout flow: mollie
- Fields:
- field_payment_method (list_string)
- Standard commerce fields
Stores¶
Store ID 1: Default store - Default currency: EUR - Email: configured - Address: Nederland
Tax Types¶
BTW Nederland: - Type: btw_nederland - Zones: Nederland (NL) - Rates: Automatically resolved via vg_commerce
Roadmap¶
Kortetermijn (Q1 2025)¶
VGBC Fase 3: - [ ] Multi-ticket checkout pane - [ ] Attendee assignment per ticket - [ ] Student discount per attendee - [ ] Profile creatie voor nieuwe attendees
VGBC Fase 4: - [ ] commerce_license integratie - [ ] QR code generatie - [ ] Scanner module - [ ] Certificate PDF's
Commerce Improvements: - [ ] PDF invoice font embedding - [ ] Template styling verfijning - [ ] Shipping rules verfijnen
Middellangetermijn¶
Admin Features: - [ ] Order management dashboard - [ ] Quota reporting views - [ ] Sales analytics - [ ] Bulk ticket operations
Customer Features: - [ ] Order history views - [ ] Invoice downloads - [ ] Ticket management dashboard - [ ] QR code display
Testing & Deployment¶
Testing Checklist¶
Basis Commerce: - [x] Product catalog display - [x] Add to cart - [x] Checkout flow (Mollie test) - [x] Invoice generatie - [x] Email notificaties - [x] BTW berekening
VGBC Tickets (Fase 2): - [ ] Standaard ticket aankoop - [ ] Student korting activatie - [ ] Standhouder quota check - [ ] View blocks display
Deployment Status¶
Dev Environment: - Mollie: test mode - All features: enabled - Debug: on
Live Environment: - Mollie: live keys configured - Core commerce: live - VGBC tickets: pending deployment - vg_commerce: deployed (deactivated, wacht op deployment)
Deployment Procedure:
- Config export via ddrush cex
- Code push naar git
- Live import via ldrush cim
- Enable vg_commerce module
- Test critical paths
Troubleshooting¶
Common Issues¶
Issue: Duplicate invoices - Oorzaak: commerce_mollie event firing meerdere keren - Oplossing: Update naar 1.x-dev commit cff6bc6 - Status: Opgelost - Doc: [[20251121-checkout-ux-duplicate-invoices]]
Issue: BTW incorrect - Check: TaxRateResolver loaded? - Check: Variation type correct? - Check: Tax zone Nederland actief?
Issue: Mollie webhook faalt
- Check: Webhook URL accessible?
- Check: Order state transitions?
- Logs: /admin/commerce/orders/[order-id]
Quick Reference¶
Key Paths¶
Admin:
- Products: /admin/commerce/products
- Orders: /admin/commerce/orders
- Config: /admin/commerce/config
- Variations: /admin/commerce/config/product-variation-types
Code:
- vg_commerce: /web/modules/custom/vg_commerce/
- Theme invoice CSS: /web/themes/custom/vg25/css/invoice-pdf.css
- wkhtmltopdf: /usr/bin/wkhtmltopdf
Config Export:
- Command: ddrush cex -y
- Location: sites/default/files/config_[hash]/sync/
Drush Commands¶
# Orders
ddrush ev "print_r(Order::load(123)->toArray());"
# Config
ddrush cex -y # Export
ddrush cim -y # Import
# Cache
ddrush cr
# Test invoice generation
ddrush ev "\$order = \Drupal\commerce_order\Entity\Order::load(123); \Drupal::service('commerce_invoice.invoice_generator')->generate(\$order);"
Related Documentation¶
Within Commerce Domain: - [[commerce-setup-overzicht]] - Complete technical documentation - [[20251125-vgbc-ticket-systeem-definitief]] - VGBC tickets specification - [[20251215-fase2-ticket-setup-sessie]] - Most recent session
Cross-Domain: - [[USER-EXPERIENCE-overzicht]] - Customer profiles & navigation - [[MAILCHIMP-overzicht]] - Newsletter integratie - [[00-PROJECT-INDEX]] - Master index
Document eigenaar: Team Voedingsgeneeskunde Laatste update: 2025-12-15 Versie: 1.0
Voor AI: Dit is het master overzicht voor Commerce/Winkel domein. Voor technische details zie [[commerce-setup-overzicht]]. Voor VGBC specifics zie [[20251125-vgbc-ticket-systeem-definitief]]. Gebruik dit document voor navigatie naar relevante sessie documenten.