2025-11-21: Checkout UX & Duplicate Invoices Fix¶
Sessie Overzicht¶
Begonnen met UX verbeteringen (tabs verwijderen, conditionele velden), ontdekten duplicate invoice probleem, diepgaande debugging, uiteindelijk opgelost met Commerce Mollie dev branch.
Problemen Aangepakt¶
1. User Interface Cleanup¶
Probleem: Onnodige tabs en duplicate velden verwarrend voor gebruikers.
Opgelost:
- Tab "Betaalwijzen" verwijderd (permission: manage own commerce_payment_method van authenticated role)
- Tab "Verzendadres" verwijderd (shipping profile type volledig verwijderd)
- Duplicate velden opgeschoond:
- field_nieuwsbrief: alleen in user account (verwijderd uit customer profile)
- field_website_praktijk: alleen in openbaar profiel (verwijderd uit customer)
- field_bedrijfsnaam: alleen in openbaar profiel (verwijderd uit customer)
- field_foto: verwijderd (user_picture blijft voor Drupal core integratie)
2. Profile Reorganisatie¶
Beslissing: Logische scheiding tussen billing, shipping en professionele gegevens.
Nieuwe structuur:
User Account: - name, mail, status, roles - field_nieuwsbrief - user_picture (profielfoto)
Customer Profile (billing/KVK): - address (inclusief BTW-nummer) - field_bedrijfsnaam (optioneel, alleen voor zakelijk) - field_kvk_nummer
Openbaar Profile (community/MailChimp): - field_weergavenaam - field_bio - field_website_praktijk - field_telefoon - field_beroep - field_student_instelling (conditional: beroep=student) - field_beroep_anders (conditional: beroep=anders) - field_beroepsvereniging - field_big_nummer
Shipping Profile: - Verwijderd - customer address wordt gebruikt voor verzending
Rationale: - Checkout: alleen billing info (clean, focus op bestellen) - Registratie: professionele info voor community/MailChimp - Geen conditionele velden meer in checkout (States API werkt niet goed in inline entity forms)
3. Module Refactor: vg_commerce_tax -> vg_commerce¶
Reden: Module naam was misleidend (bevatte meer dan alleen tax logic).
Hernoem proces: 1. Module uninstall (config behouden) 2. Directory + files hernoemen 3. Namespaces updaten 4. Services updaten 5. Hook functions hernoemen 6. Module reinstall
Resultaat:
web/modules/custom/vg_commerce/
├── vg_commerce.info.yml
├── vg_commerce.module (hooks: menu_links, preprocess_page)
├── vg_commerce.services.yml
└── src/
├── TaxRateResolver.php
└── EventSubscriber/
└── ShippingTaxSubscriber.php
Services: - vg_commerce.tax_rate_resolver - BTW berekening - vg_commerce.shipping_tax_subscriber - BTW op verzendkosten
4. Duplicate Invoices - Root Cause Analysis¶
Symptomen: - 2 invoices per order (1 pending, 1 paid) - 2 order bevestigingsmails - Order blijft stuck in "validation" state (niet "completed")
Initiële aanpak (FOUT):
1. Dachten: Commerce Invoice automatic generation maakt dubbele invoices
2. Uitgeschakeld: order_placed_generation: false
3. Custom EventSubscriber gebouwd: OrderPaidInvoiceSubscriber
4. Resultaat: Nog steeds duplicates
Debugging proces: 1. Ontdekt: BEIDE automatic generation + custom subscriber actief 2. Custom subscriber verwijderd 3. Automatic generation weer AAN 4. Resultaat: Nog steeds duplicates 5. Conclusie: Probleem zit dieper
Root Cause (uit Drupal.org issue queue): - Issue #3305714: "Mollie triggers 2 commerce_order.place.post_transition events" - Oorzaak: Webhook + Return URL race condition - Mollie stuurt: 1. Webhook naar /payment/notify/mollie (server-to-server) 2. Return URL naar /checkout/ORDER/payment/return (browser redirect) - Beide triggeren order state transition - Commerce Invoice luistert naar transition event - Resultaat: 2 invoices
Database Lock Issues: - SQLSTATE[HY000]: General error: 1205 Lock wait timeout - Webhook en Return proberen tegelijk order te updaten - Lock timeout voorkomt race, maar veroorzaakt errors
Echte oplossing: Drupal.org issue #3305714 meldt fix in Commerce Mollie dev branch.
5. Commerce Mollie Dev Branch Update¶
Oude versie: drupal/commerce_mollie 1.12.0 (Nov 2022) Nieuwe versie: drupal/commerce_mollie 1.x-dev (commit cff6bc6)
Installatie:
composer require drupal/commerce_mollie:1.x-dev --no-update
composer update drupal/commerce_mollie --with-dependencies
ddrush cache:rebuild
Resultaat: - Tweede testorder: 1 invoice (paid) - WERKT - Eerste testorder: 2 invoices (user drukte 2x reload)
Restprobleem: User kan te snel reloaden op /mollie_return pagina.
Checkout UX Issues (TODO)¶
Huidige Flow¶
- Betaling bij Mollie
- Redirect naar /mollie_return/ORDER_ID
- Pagina toont "Reload" button
- Na reload: redirect naar /checkout/ORDER/complete
Problemen¶
- User moet manueel reloaden (lelijk)
- Reload pagina traag (email generatie)
- User kan meerdere keren reloaden (race risk)
- Niet professioneel
Mogelijke Oplossingen (volgende sessie)¶
A) Automatic redirect - Auto-refresh elke 2 sec met JavaScript - Pro: Geen user actie nodig - Con: Nog steeds wacht-scherm
B) Disable reload button - Na eerste klik: disabled met spinner - Pro: Voorkomt dubbele reload - Con: Nog steeds lelijke tussenpagina
C) Direct naar bevestigingspagina (AANBEVOLEN) - Skip /mollie_return pagina - Direct naar "Bedankt" met order confirmatie - Webhook verwerkt invoice in background - Invoice komt via email binnen 1 min - Pro: Professioneel, geen wachten - Con: Custom code nodig
D) Progress indicator - "Even geduld, uw betaling wordt verwerkt..." - Websocket/polling voor real-time status - Pro: Transparantie voor user - Con: Meest complexe oplossing
Technische Details¶
MailChimp Module Update¶
field_beroep verplaatst naar openbaar profiel → vg_mailchimp_subscribe.module bijgewerkt:
Commerce Invoice Config¶
commerce_order.commerce_order_type.default:
third_party_settings:
commerce_invoice:
invoice_type: default
order_placed_generation: true # Standaard Commerce defaults
Lessons Learned¶
- NIET automatic generation uitschakelen - standaard Commerce werkt goed
- Probleem was Mollie module, niet Commerce Invoice
- Always check issue queues VOORDAT custom code schrijven
- Dev branches kunnen kritieke fixes bevatten
- Documentatie is cruciaal voor debugging (we vonden hints in eigen notities!)
Status¶
Opgelost: - Duplicate invoices (met Mollie dev branch) - Profile restructuring (clean scheiding) - Module hernoemen (vg_commerce) - UI cleanup (onnodige tabs weg)
TODO (volgende sessie): - Checkout UX verbeteren (/mollie_return pagina) - Testen met meerdere orders - Live deployment prep (Mollie live keys)
Testing¶
Test scenario: 1. Maak order als authenticated user 2. Betaal via Mollie sandbox 3. NIET meerdere keren reloaden op /mollie_return 4. Verifieer: 1 invoice met status "paid"
Test resultaten: - Order 35: 1 invoice (paid) - SUCCESS - Order 34: 2 invoices (user drukte 2x reload) - verwacht gedrag
Referenties¶
- Drupal.org Issue #3305714: Duplicate place transition
- Commerce Mollie dev branch: commit cff6bc6
- Commerce Invoice 2.2.0
- Commerce 3.2.0