Skip to content

Drupal Commerce Setup - Voedingsgeneeskunde.nl

Table of Contents

  • [[#Overzicht Commerce Setup]]
  • [[#Module Structuur]]
  • [[#Checkout Flow]]
  • [[#Facturen en PDF Generatie]]
  • [[#BTW en Verzending]]
  • [[#Email Notificaties]]
  • [[#Bekende Issues]]
  • [[#Deployment Checklist]]
  • [[#Recent Updates]]
  • [[#2025-11-07]]
  • [[#2025-11-21]]
  • [[#2025-11-24/25]]
  • [[#2025-12-01]]

Table of Contents

  • [[#Project Context|Project Context]]
  • [[#Sessie Overzicht|Sessie Overzicht]]
  • [[#Sessie 1 Commerce Structuur en BTW|Sessie 1: Commerce Structuur en BTW]]
  • [[#Sessie 2 Product Variaties en Velden|Sessie 2: Product Variaties en Velden]]
  • [[#Sessie 3 Checkout Flow Voorbereiding|Sessie 3: Checkout Flow Voorbereiding]]
  • [[#Sessie 4 Mollie Integratie en Facturatie|Sessie 4: Mollie Integratie en Facturatie]]
  • [[#Technische Architectuur|Technische Architectuur]]
  • [[#Product Structuur|Product Structuur]]
  • [[#BTW Automatisering|BTW Automatisering]]
  • [[#Checkout Flow|Checkout Flow]]
  • [[#Facturatie|Facturatie]]
  • [[#Geïnstalleerde Modules|Geïnstalleerde Modules]]
  • [[#Custom Code Locaties|Custom Code Locaties]]
  • [[#Configuratie|Configuratie]]
  • [[#Openstaande Issues|Openstaande Issues]]
  • [[#Toekomstige Features|Toekomstige Features]]
  • [[#Deployment Checklist|Deployment Checklist]]
  • [[#Update Logs|Update Logs]]

  • Product variation types gedefinieerd
  • SKU-structuur vastgesteld
  • ECK Editie ↔ Commerce Product koppeling opgezet

Belangrijke beslissingen: - Één producttype (Default), onderscheid via variation types - Variatietypes bepalen BTW automatisch via custom module - ECK Editie blijft apart van Commerce Product (content vs transactioneel) - Prijsweergave inclusief BTW (Nederlandse standaard)

Sessie 2: Product Variaties en Velden

Datum: 31 oktober 2025
Document: [[20251031-product-variaties-setup]]

Gerealiseerd: - Los nummer variation type (tijdschriften met editie referentie) - Uitgave variation type (boeken met ISBN en artikel referentie) - Conditional Fields vervangen door aparte variation types (compatibility issue) - Testproduct aangemaakt: "Voedingsgeneeskunde 4 - 2025" - View mode editie-shop voor cover weergave - ECK Editie veld field_gekoppelde_producten toegevoegd

Opgeloste problemen: - Conditional Fields incompatibel met Commerce inline entity forms - Variation types niet zichtbaar (koppeling aan product type ontbrak) - Variation velden niet zichtbaar (widget configuratie)

Sessie 3: Checkout Flow Voorbereiding

Datum: 3 november 2025
Document: [[20251103-checkout-en-facturen-setup]]

Gerealiseerd: - Checkout flow stappen geconfigureerd - Commerce Invoice module geïnstalleerd - Entity Print met DomPDF geïnstalleerd - Symfony Mailer geïnstalleerd - Commerce Mollie module geïnstalleerd (nog geen API keys) - Order type configuratie (ordernummering, workflows)

Belangrijke beslissingen: - Drupal-native facturen ipv WeFact integratie - Verplicht inloggen bij checkout (juridisch + consistent) - Direct payment capture (geen pre-authorization) - Mollie als enige payment provider

Sessie 4: Mollie Integratie en Facturatie

Datum: 6 november 2025
Document: [[20251106-checkout-mollie-facturatie]]

Gerealiseerd: - Mollie payment gateway volledig geconfigureerd en getest - Test checkout succesvol: product → cart → betaling → order completion - Automatische factuur generatie bij order completion - Wkhtmltopdf geïnstalleerd en geconfigureerd (upgrade van DomPDF) - QR-code library geïnstalleerd (endroid/qr-code) - Custom CSS voor factuur PDF aangemaakt - Composer patches systeem opgezet

Opgeloste problemen: - Drupal 10 compatibility: file_validate_extensions → FileExtension (patch) - Checkout flow conflicts (payment information vs payment process stappen) - Payment gateway niet gekoppeld aan order type - Base URL configuratie voor correcte logo URLs - Lege checkout pagina's (oude flow verwijderd, nieuwe aangemaakt)

Nog te verbeteren: - Custom font (GAP Zuid VG) laden in PDF (work in progress)

Technische Architectuur

Product Structuur

Product Type: Default
├── Variation Type: Los nummer (9% BTW)
│   └── field_editie_referentie → ECK Editie
├── Variation Type: Uitgave (9% BTW)
│   ├── field_isbn
│   └── field_gerelateerd_artikel → Artikel node
├── Variation Type: Ticket (21% BTW)
├── Variation Type: Merchandise (21% BTW)
├── Variation Type: Abonnement (9% BTW)
└── Variation Type: E-book (9% BTW)

BTW Automatisering

Custom module: vg_commerce_tax
Locatie: /web/modules/custom/vg_commerce_tax/

Automatische mapping: - 9% reduced: los_nummer, uitgave, abonnement, e-book - 21% standard: ticket, merchandise - 0% reverse charge: B2B met geldig EU BTW-nummer

Checkout Flow

Flow ID: mollie
Workflow: Default, with validation

Stappen: 1. Inloggen (verplicht) 2. Orderinformatie (contactinformatie + adres) 3. Overzicht (review + voorgang betaling) 4. Betaling (betaalinformatie) 5. Voltooid (afrondingsbericht)

Facturatie

Factuurnummering: VG-[jaar]-[nummer] (bijv. VG-2025-001)
PDF Engine: Wkhtmltopdf 0.12.6
Binary: /usr/bin/wkhtmltopdf

Automatisch bij order completion: - Factuur entity aangemaakt - PDF gegenereerd met logo en bedrijfsgegevens - Emails verzonden (order confirmation + factuur)

Geïnstalleerde Modules

Contrib Modules

  • drupal/commerce_shipping 2.15.0
  • drupal/physical 1.5.0
  • drupal/commerce 3.2.0
  • drupal/commerce_invoice 2.2.0
  • drupal/commerce_mollie 8.x-1.12
  • drupal/entity_print 2.18.0
  • drupal/symfony_mailer 1.6.2
  • drupal/eck (Entity Construction Kit)
  • drupal/conditional_fields

Custom Modules

  • vg_commerce_tax - Automatische BTW-tarieven per variation type

Composer Packages

  • mikehaertl/phpwkhtmltopdf 2.5.0
  • endroid/qr-code 6.0.9
  • cweagans/composer-patches 2.0.0
  • dompdf/dompdf 3.1.4

Custom Code Locaties

Patches

  • patches/commerce_invoice-file_validator_drupal10.patch

Theme Customization

  • web/themes/custom/vg25/css/invoice-pdf.css - Factuur PDF styling
  • web/themes/custom/vg25/vg25.theme - Hooks voor Entity Print CSS en wkhtmltopdf options

Modules

  • web/modules/custom/vg_commerce_tax/ - BTW automatisering

Configuratie

Settings.php

$base_url = 'https://dev.voedingsgeneeskunde.nl';

Belangrijke Admin Paden

  • Product variation types: /admin/commerce/config/product-variation-types
  • Invoice types: /admin/commerce/config/invoice-types
  • Number patterns: /admin/commerce/config/number-patterns
  • Checkout flows: /admin/commerce/config/checkout-flows
  • Payment gateways: /admin/commerce/config/payment-gateways
  • Order types: /admin/commerce/config/order-types
  • Entity Print: /admin/config/content/entityprint

Openstaande Issues

Hoge Prioriteit

  1. BTW display verbeteren in templates (totale BTW onderaan, transparante rekensom)
  2. Verzendkosten regels verfijnen (2-4 nummers €5,15, 5+ nummers TBD)
  3. GAP Zuid VG custom font laden in PDF
  4. Opties: Base64 embedding, wkhtmltopdf debug, terug naar DomPDF
  5. Product tabel verbeteren (stuksprijs + totaal tonen)
  6. Email templates styling aanpassen

Middel Prioriteit

  1. Tweede verzendmethode voor Merchandise (21% BTW)
  2. "Publicatie" references opruimen uit vg_commerce_tax module
  3. Invoice display bug (InvalidComponentDataException)
  4. User dashboard testen (facturen downloaden)
  5. Mollie webhook optimaliseren
  6. Views voor winkel afmaken

Lage Prioriteit

  1. Config export voor live deployment
  2. Live Mollie API keys
  3. Performance testing

Toekomstige Features

Ticket Systeem

  • QR-code generatie bij aankoop (endroid/qr-code library al geïnstalleerd)
  • Scanning systeem bij congres
  • Commerce License of custom fulfillment module

E-book Downloads

  • Commerce File module
  • Digital downloads fulfillment

Abonnementen

  • Commerce Recurring voor automatische verlengingen
  • Hybride: digitale toegang + papieren tijdschrift

Deployment Checklist

Development → Live

  • Config export: ddrush cex -y
  • Test API keys vervangen door Live keys
  • Base URL aanpassen in settings.php
  • SMTP configuratie
  • SSL certificaat verifiëren
  • Performance testing
  • BTW-tarieven verifiëren
  • Test volledige checkout flow
  • Backup strategie

Belangrijke Beslissingen

Architectuur

  • Één winkel ipv aparte winkels per categorie: eenvoudiger beheer, één checkout
  • Variation types bepalen BTW ipv handmatig: foutloos, automatisch, EU-compliant
  • ECK Editie apart van Commerce Product: content vs transactioneel gescheiden
  • Drupal-native facturen ipv WeFact: betere UX, privacy, controle

Gebruikerservaring

  • Verplicht inloggen: consistent met medische content, betere klantrelatie
  • Inclusief BTW prijzen: Nederlandse standaard, voorkomt verrassingen
  • Direct payment capture: passend voor digitale content

Technisch

  • Wkhtmltopdf ipv DomPDF: A-merk kwaliteit, pixel-perfect rendering
  • Composer patches: Drupal 10 compatibility voor contrib modules
  • Custom module BTW: geen geschikte contrib module beschikbaar

Geleerde Lessen

Checkout Flow Complexiteit

Commerce checkout architectuur vereist creatieve oplossingen voor betaling stappen. Payment information en payment process kunnen niet op dezelfde stap.

Drupal 10 Breaking Changes

Veel contrib modules gebruiken nog Drupal 9 syntax. Patches via Composer zijn essentieel voor compatibility.

PDF Font Loading

Wkhtmltopdf heeft strikte security restrictions. CSS laden en font embedding zijn aparte uitdagingen die specifieke workarounds vereisen.

Entity Print Library System

Entity Print laadt libraries anders dan normale Drupal pages. Custom hooks nodig voor CSS injectie.

Support & Documentatie

Drush Aliassen

  • ddrush - development site
  • ldrush - live/productie site
  • jdrush - redactie site

Externe Documentatie

  • Drupal Commerce: https://docs.drupalcommerce.org/
  • Mollie API: https://docs.mollie.com/
  • Wkhtmltopdf: https://wkhtmltopdf.org/usage/wkhtmltopdf.txt

Status

Huidige fase: Development & Testing
Volgende milestone: Los nummer product volledig werkend met perfecte factuur vormgeving
Live deployment: Na succesvolle test en font styling oplossing

Werkend: - Commerce winkel structuur - BTW automatisering - Product variation types - Checkout flow end-to-end - Mollie test betalingen - Automatische factuur generatie - Email notificaties

In progress: - Custom font in PDF - Template styling verfijning - Email template branding

Nog te doen: - Ticket systeem met QR-codes - Abonnement recurring billing - Views voor winkel - Live deployment

Live Deployment Procedure

Deze sectie beschrijft de stappen om de Commerce winkel van development naar live te verplaatsen.

Pre-deployment Checklist

Development Site Verificatie: - [ ] Alle functionaliteit grondig getest - [ ] Test orders succesvol afgerond - [ ] Facturen correct gegenereerd - [ ] Emails ontvangen en correct - [ ] BTW-berekeningen geverifieerd voor NL en BE - [ ] Custom font in PDF werkend - [ ] Geen PHP errors in logs - [ ] Performance acceptabel

Code & Database: - [ ] Alle custom code gecommit in version control - [ ] Database backup gemaakt - [ ] Config export: ddrush cex -y - [ ] Composer lock file up-to-date

Stap 1: Code Deployment

Custom modules kopiëren:

# Van dev naar live
scp -r web/modules/custom/vg_commerce_tax/ user@live:/var/www/sites/live.voedingsgeneeskunde.nl/web/modules/custom/

# Of via git (preferred)
git add web/modules/custom/vg_commerce_tax/
git commit -m "Add vg_commerce_tax module"
git push origin main

Theme customizations:

# Invoice PDF CSS
scp web/themes/custom/vg25/css/invoice-pdf.css user@live:/var/www/sites/live.voedingsgeneeskunde.nl/web/themes/custom/vg25/css/

# Theme hooks
scp web/themes/custom/vg25/vg25.theme user@live:/var/www/sites/live.voedingsgeneeskunde.nl/web/themes/custom/vg25/

Patches:

scp -r patches/ user@live:/var/www/sites/live.voedingsgeneeskunde.nl/
scp composer.json user@live:/var/www/sites/live.voedingsgeneeskunde.nl/

Stap 2: Dependencies Installeren

Op live server:

cd /var/www/sites/live.voedingsgeneeskunde.nl

# Composer packages
composer install --no-dev --optimize-autoloader

# Specifieke packages (indien nodig)
composer require drupal/commerce_mollie
composer require drupal/commerce_invoice
composer require drupal/entity_print
composer require mikehaertl/phpwkhtmltopdf
composer require endroid/qr-code
composer require cweagans/composer-patches

Wkhtmltopdf installeren:

# Check of al geïnstalleerd
which wkhtmltopdf

# Installeren indien nodig
sudo apt-get update
sudo apt-get install -y wkhtmltopdf

Stap 3: Modules Enablen

ldrush en commerce_invoice -y
ldrush en entity_print -y
ldrush en symfony_mailer -y
ldrush en commerce_mollie -y
ldrush en vg_commerce_tax -y

Stap 4: Configuration Import

Config exporteren van dev:

# Op dev server
cd /var/www/sites/dev.voedingsgeneeskunde
ddrush cex -y

Config sync directory identificeren:

# Op dev
ddrush status | grep "Drupal root"
ddrush status | grep "Configuration"

Config kopiëren naar live:

# Config bestanden
scp -r web/sites/default/files/config/sync/* user@live:/var/www/sites/live.voedingsgeneeskunde.nl/web/sites/default/files/config/sync/

# Of via git (preferred)
git add web/sites/default/files/config/sync/
git commit -m "Export commerce configuration"
git push origin main

Importeren op live:

ldrush config:import -y
ldrush cr

Stap 5: Live-Specifieke Configuratie

Settings.php aanpassen:

// Op live server: web/sites/default/settings.php
$base_url = 'https://live.voedingsgeneeskunde.nl';

Entity Print configureren: - Binary locatie: /usr/bin/wkhtmltopdf - Basis URL: https://live.voedingsgeneeskunde.nl

Commerce Invoice: - Email kopie: facturen@voedingsgeneeskunde.nl - Verifieer logo upload werkt

Stap 6: Mollie Live API Keys

Via Drupal UI:

/admin/commerce/config/payment-gateways/manage/betaling_via_mollie

Configuratie: - Mode: Live (niet Test!) - Live API key: live_... (van Thomas/Mollie dashboard) - Test API key: behouden voor toekomstige tests - Callback domain: https://live.voedingsgeneeskunde.nl

Mollie Dashboard controleren: - Webhook URL is automatisch (Commerce Mollie regelt dit) - Bevestig dat organisatie profiel compleet is - Verifieer bankrekeningnummer gekoppeld

Stap 7: Email Configuratie

SMTP instellingen:

/admin/config/system/mailer

Configureer: - From address: winkel@voedingsgeneeskunde.nl - From name: Voedingsgeneeskunde Webshop - SMTP server details (van hosting provider)

Test emails:

ldrush php:eval "
\$mailer = \Drupal::service('plugin.manager.mail');
\$message = [
  'to' => 'test@example.com',
  'subject' => 'Test email',
  'body' => 'Dit is een test',
];
\$mailer->mail('system', 'mail', 'test@example.com', 'nl', \$message);
"

Stap 8: Testen op Live

Test checklist: - [ ] Homepage laadt correct - [ ] Product pagina zichtbaar - [ ] "Add to cart" werkt - [ ] Cart pagina toont product - [ ] Checkout flow doorlopen - [ ] Live Mollie betaling (klein bedrag, bijv. €0,01) - [ ] Order completion pagina verschijnt - [ ] Factuur gegenereerd - [ ] Emails ontvangen (order + factuur) - [ ] Factuur PDF downloadbaar - [ ] BTW correct berekend - [ ] Logo in factuur zichtbaar - [ ] Custom font in factuur (indien opgelost)

Test met verschillende scenario's: - NL klant met NL adres (21%/9% BTW) - BE klant met BE adres (21%/6% BTW) - Zakelijke klant met BTW-nummer (reverse charge)

Stap 9: Monitoring & Logs

Error monitoring:

# PHP errors
tail -f /var/log/apache2/error.log | grep live.voedingsgeneeskunde

# Drupal watchdog
ldrush watchdog:show --severity=Error

Commerce order monitoring:

/admin/commerce/orders

Payment gateway logs:

/admin/commerce/config/payment-gateways/manage/betaling_via_mollie

Stap 10: Rollback Procedure

Bij problemen:

  1. Disable payment gateway (emergency):

    ldrush config:set commerce_payment.commerce_payment_gateway.betaling_via_mollie status false -y
    ldrush cr
    

  2. Revert configuration:

    # Terug naar vorige config
    ldrush config:import --partial --source=/path/to/backup/config/
    ldrush cr
    

  3. Database restore:

    # Restore from backup
    mysql -u user -p database_name < backup.sql
    ldrush cr
    ldrush updatedb -y
    

Post-Deployment

Monitoring eerste 24 uur: - [ ] Check order logs elk uur - [ ] Monitor email delivery - [ ] Check error logs - [ ] Verifieer Mollie payments dashboard - [ ] Test klantenservice email response

Communicatie: - [ ] Interne team informeren over go-live - [ ] Klantenservice briefen - [ ] Test klantcommunicatie - [ ] Social media aankondiging (indien van toepassing)

Optimalisatie: - [ ] Performance metrics baseline - [ ] Google Analytics / tracking verificeren - [ ] Cache instellingen optimaliseren - [ ] CDN configuratie (indien van toepassing)

Belangrijke Notities

Development vs Live verschillen: - Base URL in settings.php - Mollie API keys (test vs live) - Email SMTP settings - Mogelijk: database credentials - Mogelijk: file paths

Niet kopiëren naar live: - Test orders - Test facturen - Development-only modules - Debug configuratie - Test user accounts (optioneel)

Security checklist: - [ ] Debug mode uit - [ ] Display errors uit in php.ini - [ ] Drupal errors niet tonen aan eindgebruikers - [ ] File permissions correct (444 settings.php) - [ ] .htaccess / nginx config beveiligd - [ ] SSL certificaat geldig en actief - [ ] Security updates toegepast

Troubleshooting

"Payment gateway not found":

# Herinstall payment gateway config
ldrush config:import --partial --source=web/sites/default/files/config/sync/

"BTW niet correct":

# Verify custom module enabled
ldrush pm:list | grep vg_commerce_tax
# Should show: Enabled

# Rebuild cache
ldrush cr

"Fonts niet in PDF": - Verifieer wkhtmltopdf geïnstalleerd: which wkhtmltopdf - Check Entity Print settings: /admin/config/content/entityprint - Verifieer CSS hook in vg25.theme - Check fonts directory permissions

"Emails niet verzonden": - Test SMTP connectie - Check Symfony Mailer config - Verify from address not blacklisted - Check spam folders

Live Site Maintenance

Regelmatig: - Weekly: Error logs checken - Monthly: Test checkout flow - Quarterly: Security updates - Yearly: Review BTW-tarieven (EU changes)

Bij updates:

# Backup eerst
mysqldump database > backup-$(date +%Y%m%d).sql

# Update Drupal core en modules
composer update drupal/core-recommended --with-dependencies
ldrush updatedb -y
ldrush cr

# Test checkout flow na elke update

Update 2025-11-07 — PDF facturen font-styling (korte samenvatting)

  • CSS voor facturen wordt nu geladen via Entity Print (thema entity_print + subscriber-fix). Logo en kleuren OK.
  • Fonts (GAP Zuid VG) nog niet zichtbaar in PDF (DomPDF blijft op Helvetica/Times; wkhtmltopdf valt terug op DejaVu Sans).
  • Detailverslag en stappenplan: [[20251107-pdf-invoice-fonts]]
  • Next step (kies 1):
  • DomPDF: opties expliciet zetten (remote/html5/chroot/defaultFont) en/of fonts registreren in DomPDF; of
  • wkhtmltopdf: fonts als systeemfonts installeren en fc-cache draaien, of webfonts correct serveren.

Sessie 7: Users, Profielen en MailChimp

Datum: 13 november 2025
Document: [[20251113-users-profielen-mailchimp]]

Gerealiseerd: - Customer profiel uitgebreid met professionele/zakelijke velden - Twee profielen strategie: Customer (privé) + Openbaar (publiek) - Beroepslijst met 7 opties + conditional fields (Student/Anders) - Field Groups voor gestructureerd formulier - Zelf-registratie enabled met Honeypot spam protection - MailChimp API geconfigureerd en getest - Display configuratie (privé velden verborgen)

Belangrijke beslissingen: - Twee gescheiden profielen: transactioneel vs community - Customer profiel bij registratie (juridische compliance) - Beroepsvereniging: nu tekstveld, volgende week entity reference - String type voor KVK/BIG-nummers (leading zeros) - BTW-nummer optioneel bij registratie én checkout

Nog te doen (volgende sessie): - MailChimp ECA regel voor nieuwsbrief sync - Openbaar profiel form/display afmaken - User dashboard views - Label wijziging "Onderwijsinstelling" → "Opleiding" - Field validatie patronen

Voor live deployment: - ECK Beroepsvereniging entities aanmaken (12 verenigingen) - field_beroepsvereniging wijzigen naar entity_reference - MailChimp webhook URL aanpassen na domeinwissel - Config export/import


Update 19 november 2025

Openbaar Profiel Compleet ✅

  • Fields: foto, weergavenaam, bio, beroep, locatie, website
  • Status: Form display geconfigureerd, klaar voor gebruik
  • Label fix: "Onderwijsinstelling" → "Opleiding"

MailChimp Auto-Subscribe ✅

  • Custom module: vg_mailchimp_subscribe
  • Trigger: Bij user registratie met field_nieuwsbrief = TRUE
  • Functionaliteit:
  • Subscribe via MailChimp Lists API
  • Merge fields: EMAIL, FNAME, LNAME, BEROEP
  • Double opt-in enabled
  • Error logging

ECA Exploratie

  • BPMN modeller uitgeprobeerd
  • mailchimp_eca heeft geen subscribe action
  • Besloten: custom module is betere oplossing

TODO Morgen (20 nov)

  1. Testen:
  2. User registratie met nieuwsbrief
  3. MailChimp lijst verificatie
  4. Watchdog logs checken

  5. User Dashboard:

  6. Layout Builder configureren
  7. Views voor bestellingen/profielen
  8. Nieuwsbrief aan/afmelden block

  9. Registratie Flow:

  10. Welkomstmail
  11. Redirect naar profiel
  12. Help teksten

Technische Details

  • Module: /web/modules/custom/vg_mailchimp_subscribe/
  • Hook: vg_mailchimp_subscribe_user_insert()
  • DEV List: 0dc076aa56
  • Layout Builder: Al enabled voor user entity

Openstaande Issues

  • Field validatie KVK/BIG
  • Unsubscribe functionaliteit
  • Live MailChimp lijst configureerbaar maken
  • Admin config form

Sessie details: Zie [[20251119-mailchimp-eca-openbaar-profiel]]

Update: 2025-11-21 - Invoice Generation & Module Refactor

Invoice Duplication Fix

Probleem: Dubbele facturen (pending + paid) per order door automatische generatie bij zowel order placement als payment.

Oplossing: - Automatische generatie uitgeschakeld in order type config - Custom Event Subscriber (OrderPaidInvoiceSubscriber) genereert alleen bij betaalde orders - Duplicate check voorkomt meerdere invoices per order

Module Refactor: vg_commerce_tax → vg_commerce

Reden: Module naam was misleidend (meer dan alleen tax).

Nieuwe structuur:

web/modules/custom/vg_commerce/
├── src/TaxRateResolver.php
└── src/EventSubscriber/
    ├── ShippingTaxSubscriber.php
    └── OrderPaidInvoiceSubscriber.php

Services: - vg_commerce.tax_rate_resolver - BTW berekening (21% NL, 0% buiten NL) - vg_commerce.shipping_tax_subscriber - BTW op verzendkosten - vg_commerce.order_paid_invoice_subscriber - Invoice generatie bij betaling

Hooks in vg_commerce.module: - hook_menu_links_discovered_alter() - Menu redirects - hook_preprocess_page() - Gin theme SDC bug fix voor invoice pages - hook_form_alter() - Conditional fields in checkout (student instelling, beroep anders)

Zie: [[20251121-invoice-generation-fix]]

Update: 2025-11-21 - Duplicate Invoices Fix & Profile Cleanup

Duplicate Invoices Opgelost

Root cause: Mollie webhook + return URL race condition triggerde 2x commerce_order.place.post_transition event.

Oplossing: Commerce Mollie 1.x-dev branch (fix voor issue #3305714)

composer require drupal/commerce_mollie:1.x-dev

Resultaat: 1 invoice per order (tenzij user meerdere keren reload drukt op /mollie_return pagina).

Profile Restructuring

Nieuwe indeling:

User Account: name, mail, field_nieuwsbrief, user_picture

Customer Profile (billing): address, field_kvk_nummer

Openbaar Profile (community): field_weergavenaam, field_bio, field_website_praktijk, field_telefoon, field_beroep, field_student_instelling, field_beroep_anders, field_beroepsvereniging, field_big_nummer

Shipping Profile: Verwijderd (gebruikt customer address)

Rationale: Clean checkout (alleen billing), professionele info in community profiel.

Module Refactor

vg_commerce_tax → vg_commerce (naam was misleidend)

Services: vg_commerce.tax_rate_resolver, vg_commerce.shipping_tax_subscriber

UI Cleanup

  • Tab "Betaalwijzen" verwijderd
  • Tab "Verzendadres" verwijderd
  • Duplicate velden opgeschoond (nieuwsbrief, website, bedrijfsnaam, foto)

Open Issue: Checkout UX

/mollie_return pagina met "reload" button is niet professioneel. TODO volgende sessie: Auto-redirect of direct naar bevestigingspagina.

Zie: [[20251121-checkout-ux-duplicate-invoices]]

Update: 2025-11-24 - VGBC Ticket Systeem Planning

Ticket Verkoop Requirements

Context: VGBC2026 congres tickets via webshop.

Ticket types: 1. Early bird (manuele prijs aanpassing) 2. Gewone kaarten 3. Studenten (20% korting via field_beroep) 4. Standhouders (quotum via Partner entity) 5. Crew (gastenlijst, niet via shop)

Architectuur (zoals Los nummer ↔ Editie)

VGBC Entity (ECK): vgbc_editie - content (datum, vignet, beschrijving) Commerce Product: Ticket variation type - transactioneel (prijs, BTW, SKU) Link: field_vgbc reference

SKU: 1-CG2026-STD (Type 1=Ticket, CG2026=Congres 2026, STD=Standaard)

QR-code Systeem

Generatie: endroid/qr-code library (al geinstalleerd) Format: VGBC2026-USER[id]-LICENSE[id] Scanning: Web app op tablet, JavaScript (html5-qrcode), route /scan Validatie: AJAX naar /api/ticket/validate, Drupal checkt License entity

Implementatie (7 fases)

  1. VGBC2026 entity + product setup
  2. Commerce License installeren
  3. QR-code generatie bij aankoop
  4. Scanning interface (/scan route)
  5. Accreditatiebewijs PDF na scan
  6. Student korting + standhouder quotum
  7. Testing

Next: Commerce License setup en VGBC2026 entity aanmaken

Zie: [[20251124-vgbc-ticket-systeem-planning]]


Update 2025-11-25: VGBC Ticket Systeem Planning

Sessie: Complete Planning & Specificatie

Wat gebeurd is: - Volledige planning voor VGBC2026 ticket systeem - Alle ticketsoorten gedefinieerd (4 types) - Multi-ticket aankoopflow uitgewerkt - QR-scan workflow aan de deur gespecificeerd - Documentatie standaarden opgezet

Belangrijke beslissingen: 1. Student Ticket = Korting (geen apart product type) - Korting op Standaard Ticket via Price Rule - Percentage instelbaar via UI - Conditie: field_beroep = "student" in customer profile

  1. Multi-Ticket Toewijzing TIJDENS Checkout
  2. Custom Checkout Pane: TicketAssignmentPane
  3. Voor elk ticket: "Jezelf" of "Iemand anders"
  4. Bij ander: Naam, Email, Beroep (alleen field_beroep wordt ingevuld)
  5. Prijs herberekening automatisch (studentenkorting)

  6. Standhouder Tickets Gratis via Commerce

  7. Gekoppeld aan Partner ECK entity
  8. Quotum per Partner: field_vgbc2026_tickets (integer)
  9. Validatie tijdens checkout
  10. Direct completed (geen Mollie)

  11. Custom/Admin Tickets

  12. Voor VIP, cash, crew
  13. Order field: field_payment_method (mollie | custom)
  14. Direct completed state
  15. Invoice + QR wel gegenereerd

  16. Accreditatiebewijs via Symfony Mailer

  17. Na QR-scan bij deur
  18. PDF met datum + TIJD van scan
  19. Via Symfony Mailer (niet MailChimp)
  20. Consistentie met invoice emails

Ticketsoorten definitief: 1. Standaard Ticket (Mollie, prijs via UI) 2. Student Ticket (korting op Standaard, via Price Rule) 3. Standhouder Ticket (gratis, quotum via Partner) 4. Custom/Admin Ticket (direct completed, field_payment_method) 5. VIP/Gratis (buiten Commerce, handmatige gastenlijst)

QR-Scan Flow:

Bezoeker → QR tonen → Tablet /scan → jsQR camera scan
→ API /api/ticket/validate → Check status → Update License
→ UI feedback (groen/rood) → Accreditatiebewijs PDF
→ Email (Symfony Mailer) → Downloadbaar op account

Nieuwe documentatie: - [[20251125-vgbc-ticket-systeem-definitief]] - Complete specificatie (single source of truth) - _TEMPLATE-notities-rule.md - Documentatie richtlijnen - WARP.md - Project Rules (automatisch actief voor AI) - [[20251125-sessie-verslag]] - Volledig verslag van deze sessie

Implementatie Tijdslijn: - Fase 1: Commerce Basis [x] VOLTOOID - Fase 2: Ticket Products [ ] TODO VOLGENDE SESSIE - Rol "Winkel" - field_payment_method op order - Partner quotum velden - Standaard Ticket variation - Studentenkorting Price Rule - Standhouder + quotum validatie - Fase 3: Multi-ticket Checkout [ ] TODO - Fase 4: Commerce License [ ] TODO - Fase 5: Scan Interface [ ] TODO - Fase 6: Accreditatiebewijs [ ] TODO - Fase 7: Testing & Launch [ ] TODO

Technische Details: - field_beroep zit op Profile entity (customer), NIET op User - License generatie via Event Subscriber: commerce_order.place.post_transition - Checkout pane: TicketAssignmentPane.php in vg_commerce module - Scan module: vg_ticket_scanner (nieuw) - QR format: VGBC2026-USER{uid}-LICENSE{license_id} - Frontend: jsQR library + camera API - Backend: Custom controller met validatie endpoint

Open Vragen: - Partner quotum UI locatie? - Accreditatiebewijs design beschikbaar? - Scan interface hardware (tablets, WiFi)? - Early Bird automatisch of handmatig?

Volgende Sessie Start: 1. Lees [[20251125-vgbc-ticket-systeem-definitief]] 2. Begin Fase 2: Rol "Winkel" + product setup

Status: Planning voltooid, klaar voor implementatie Documentatie: Volledig, AI-vriendelijk format (geen emoji's, absolute paden)

2025-12-01: Live Site Sync - Profiles & MailChimp

Session Summary

Two-part session syncing dev configuration to live, fixing user profiles, and implementing MailChimp integration.

Major Accomplishments

Configuration & Module Sync: - Fixed configuration import dependency issues - Installed 16 missing modules on live (commerce_invoice, commerce_mollie, entity_print suite, etc.) - Updated commerce_mollie to 1.x-dev (commit cff6bc6) - critical duplicate invoice fix - Copied vg_invoice_styling custom module from dev

User Profile System: - Resolved profile access issue for user 51 - Fixed conditional fields on openbaar profile (field_beroep_anders, field_student_instelling) - Implemented proper "required + reset target" pattern for conditional validation - Profile fields now show/hide correctly based on beroep selection

MailChimp Integration: - Updated vg_mailchimp_subscribe module from MailChimp 2.x to 3.x API - Replaced obsolete mailchimp.lists service with mailchimp.api - Added configuration UI at /admin/config/services/vg-mailchimp-subscribe - List selection now via dropdown (fetched from MailChimp API) - Newsletter subscriptions now working correctly

Key Technical Changes

vg_mailchimp_subscribe Module Updates:

Old: $mailchimp_lists = \Drupal::service('mailchimp.lists');
New: $mailchimp_api = \Drupal::service('mailchimp.api');
     $mc_client = $mailchimp_api->getApiObject();
     $mc_client->request("lists/{list_id}/members/{hash}", $params, 'PUT');

Files Created: - web/modules/custom/vg_mailchimp_subscribe/src/Form/SettingsForm.php - web/modules/custom/vg_mailchimp_subscribe/vg_mailchimp_subscribe.routing.yml - web/modules/custom/vg_mailchimp_subscribe/vg_mailchimp_subscribe.links.menu.yml

Conditional Fields Best Practice: - Field with "required" + "reset target" = required when visible, skipped when hidden - Field without "reset target" = must NOT be required at field level

Module Status

Live and Dev Now Match: - Commerce: invoice, mollie (1.x-dev), shipping - Entity Print suite - Field permissions, Symfony Mailer - Custom modules: vg_commerce, vg_invoice_styling, vg_mailchimp_subscribe

Configuration Paths

  • MailChimp settings: /admin/config/services/vg-mailchimp-subscribe
  • Profile fields: /admin/config/people/profile-types/manage/openbaar/fields
  • Conditional fields: /admin/structure/conditional-fields/profile/openbaar

Next Steps

  1. Choose notification system (Block Dismiss vs Message Stack) for welcome messages
  2. Implement QR-code ticket product (dev)
  3. Migrate commerce setup to live

Reference

Full session notes: [[20251201-live-sync-profiles-mailchimp]]


Update 2025-12-15: VGBC Fase 2 - Ticket Product Setup

Status: Voltooid Referentie: 20251215-fase2-ticket-setup-sessie.md

Nieuwe Functionaliteit

VGBC Partner Quota Systeem - ECK entity type: vgbc_partner_quota - Admin UI: /admin/content/partner-quota - Velden: field_partner, field_vgbc_editie, field_quota - Doel: Herbruikbaar quota beheer per partner per VGBC editie - Views-compatible voor rapportage

Ticket Products - Product 5: VGBC 2026 - Standaard Ticket (EUR 49.95 excl. BTW) - SKU: vgbc2026-ticket - Variation type: vgbc_ticket - Product 6: VGBC 2026 - Standhouder Ticket (EUR 0.00) - SKU: vgbc2026-standhouder - Quota validatie actief

Studentenkorting - Promotion: Studentenkorting VGBC 2026 - Type: Order percentage off (40%) - Automatisch: checkt field_beroep in customer profile - Plugin: StudentProfessionCondition (vg_student_profession) - Resultaat: EUR 49.95 -> EUR 29.97 voor studenten

Standhouder Quota Validatie - Event subscriber: StandhouderQuotaValidator - Event: commerce_order.place.pre_transition - Functie: Blokkeert checkout bij quota overschrijding - Check: partner via field_partner, quota via vgbc_partner_quota

Winkel Views per Product Type - winkel_tickets (vgbc_ticket) - winkel_uitgaven (uitgave, 9% BTW) - winkel_merchandise (merchandise, 21% BTW) - winkel_abonnementen (abonnementen) - winkel_losse_nummers (los_nummer, bestaand)

vg_commerce Module Uitbreidingen

Nieuwe files: - src/Plugin/Commerce/Condition/StudentProfessionCondition.php - src/EventSubscriber/StandhouderQuotaValidator.php

Updated files: - vg_commerce.info.yml (dependencies) - vg_commerce.services.yml (service registratie)

Dependencies toegevoegd: - commerce:commerce_promotion - commerce:commerce_order - profile:profile

Configuration

Nieuwe velden: - field_payment_method op commerce_order (list_string) - Values: mollie, handmatig, standhouder_quota - Gebruikt voor: rapportage en custom flows

Nieuwe rol: - winkel (machine name: winkel) - Permissies: orders, products, partner quota beheer

VGBC Entities: - VGBC2026 editie aangemaakt (vgbc entity, bundle vgbc_editie, ID: 33)

Bekende Issues & Limitaties

  1. VGBC editie ID hardcoded (33) in StandhouderQuotaValidator.php:104
  2. TODO: Configureerbaar maken via settings form

  3. field_partner op customer profile optioneel

  4. Nodig voor standhouder quota validatie
  5. Handmatig toevoegen indien nodig

  6. Winkel Views geblokkeerd

  7. Views aangemaakt maar niet automatisch geplaatst
  8. Handmatig toevoegen via Layout Builder op /winkel

Testing Status

Nog niet volledig getest. Testplan beschikbaar in: - 20251215-fase2-ticket-setup-sessie.md (sectie Testing Checklist)

Test scenarios: - Normale ticket aankoop - Student discount activatie - Standhouder binnen/buiten quota - Error handling

Volgende Stappen: Fase 3

Doel: Multi-ticket checkout en attendee assignment

Belangrijkste features: - Custom checkout pane: TicketAssignmentPane - Per ticket attendee toewijzing (jezelf / iemand anders) - User/profile creatie voor nieuwe attendees - Student discount per attendee (niet per order) - commerce_license integratie voorbereiden

Referenties: - 20251125-vgbc-ticket-systeem-definitief.md (complete spec) - 20251215-fase2-ticket-setup-sessie.md (Fase 2 details)


Laatste update commerce-setup-overzicht: 2025-12-15 Versie: 1.3 (Fase 2 toegevoegd)