Skip to content

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);"

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.