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_shipping2.15.0drupal/physical1.5.0drupal/commerce3.2.0drupal/commerce_invoice2.2.0drupal/commerce_mollie8.x-1.12drupal/entity_print2.18.0drupal/symfony_mailer1.6.2drupal/eck(Entity Construction Kit)drupal/conditional_fields
Custom Modules¶
vg_commerce_tax- Automatische BTW-tarieven per variation type
Composer Packages¶
mikehaertl/phpwkhtmltopdf2.5.0endroid/qr-code6.0.9cweagans/composer-patches2.0.0dompdf/dompdf3.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 stylingweb/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¶
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¶
- BTW display verbeteren in templates (totale BTW onderaan, transparante rekensom)
- Verzendkosten regels verfijnen (2-4 nummers €5,15, 5+ nummers TBD)
- GAP Zuid VG custom font laden in PDF
- Opties: Base64 embedding, wkhtmltopdf debug, terug naar DomPDF
- Product tabel verbeteren (stuksprijs + totaal tonen)
- Email templates styling aanpassen
Middel Prioriteit¶
- Tweede verzendmethode voor Merchandise (21% BTW)
- "Publicatie" references opruimen uit vg_commerce_tax module
- Invoice display bug (
InvalidComponentDataException) - User dashboard testen (facturen downloaden)
- Mollie webhook optimaliseren
- Views voor winkel afmaken
Lage Prioriteit¶
- Config export voor live deployment
- Live Mollie API keys
- 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 siteldrush- live/productie sitejdrush- 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:
Config sync directory identificeren:
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:
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:
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:
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:
Payment gateway logs:
Stap 10: Rollback Procedure¶
Bij problemen:
-
Disable payment gateway (emergency):
-
Revert configuration:
-
Database restore:
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-cachedraaien, 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_ecaheeft geen subscribe action- Besloten: custom module is betere oplossing
TODO Morgen (20 nov)¶
- Testen:
- User registratie met nieuwsbrief
- MailChimp lijst verificatie
-
Watchdog logs checken
-
User Dashboard:
- Layout Builder configureren
- Views voor bestellingen/profielen
-
Nieuwsbrief aan/afmelden block
-
Registratie Flow:
- Welkomstmail
- Redirect naar profiel
- 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)
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)¶
- VGBC2026 entity + product setup
- Commerce License installeren
- QR-code generatie bij aankoop
- Scanning interface (/scan route)
- Accreditatiebewijs PDF na scan
- Student korting + standhouder quotum
- 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
- Multi-Ticket Toewijzing TIJDENS Checkout
- Custom Checkout Pane: TicketAssignmentPane
- Voor elk ticket: "Jezelf" of "Iemand anders"
- Bij ander: Naam, Email, Beroep (alleen
field_beroepwordt ingevuld) -
Prijs herberekening automatisch (studentenkorting)
-
Standhouder Tickets Gratis via Commerce
- Gekoppeld aan Partner ECK entity
- Quotum per Partner:
field_vgbc2026_tickets(integer) - Validatie tijdens checkout
-
Direct completed (geen Mollie)
-
Custom/Admin Tickets
- Voor VIP, cash, crew
- Order field:
field_payment_method(mollie | custom) - Direct completed state
-
Invoice + QR wel gegenereerd
-
Accreditatiebewijs via Symfony Mailer
- Na QR-scan bij deur
- PDF met datum + TIJD van scan
- Via Symfony Mailer (niet MailChimp)
- 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¶
- Choose notification system (Block Dismiss vs Message Stack) for welcome messages
- Implement QR-code ticket product (dev)
- 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¶
- VGBC editie ID hardcoded (33) in StandhouderQuotaValidator.php:104
-
TODO: Configureerbaar maken via settings form
-
field_partner op customer profile optioneel
- Nodig voor standhouder quota validatie
-
Handmatig toevoegen indien nodig
-
Winkel Views geblokkeerd
- Views aangemaakt maar niet automatisch geplaatst
- 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)