Winkelwagen & checkout¶
De checkout-flow loopt via CartController (_core/controller/classes/atx/customers/cart/CartController.php) en is uitsluitend toegankelijk voor ingelogde klanten (CartController.php:117-123). De winkelwagen is gekoppeld aan het klantnummer; een klant kan vanuit meerdere sessies dezelfde winkelwagen inzien.
Er zijn twee fundamenteel verschillende bestelstromen:
- Atraxion-cart — de standaard winkelwagen voor ingelogde professionele klanten op
www.atraxion.com - Mini-shop order flow — een vereenvoudigde aankoopstroom voor anonieme bezoekers van een mini-shop (
*.tyrecloud.be/*.wheelcloud.be)
Atraxion-cart (standaard flow)¶
Winkelwageninhoud¶
De winkelwagen wordt opgebouwd uit CartArticle-objecten (_core/model/classes/atx/customers/cart/CartArticle.php). Elk artikel bevat:
- Artikelnummer, leverancier, hoeveelheid, prijs, leveringsdagen
- Optioneel: voertuigchassis-koppeling (
ChassisNumber), montagelocation, montage-installateur - Cadeauartikelen (
GiftAmount) voor promoties
Naast losse artikelen kan de winkelwagen ook voertuigsets bevatten (velgen + banden + TPMS per voertuig), beheerd via VehicleSetLineItemRepository.
Stap 1 — Winkelwagen bekijken (get)¶
De klant roept de winkelwagenpagina op. CartController::get() (CartController.php:532) haalt de winkelwageninhoud op via CartDAO, berekent transportkosten en past eventuele coupon-codes toe (applyCouponIfPresent).
Als de klant eerder een dropship-adres had ingegeven (opgeslagen in $_SESSION['saved_dropship_address']), worden de transportkosten herberekend voor dat alternatieve leveringsadres.
Stap 2 — Winkelwagen bijwerken (update / deleteArticle)¶
update— past de hoeveelheid aan, herberekent montagetijd bij "te-monteren"-artikelen en wist de transportcache (Cart::clearTransportCache())deleteArticle— verwijdert een artikel of een voertuigset (incl. eventuele montage-artikelen)
Stap 3 — Transportkeuze (transportDelivery)¶
De klant kiest een leveringsoptie. CartController::transportDelivery() (CartController.php:780) toont de beschikbare transportmethodes:
- Standaard verzending (code
00) - Klant-specifiek transport (eigen afhaaltransport of vaste transportcode)
- SEPA-transport (voor bepaalde landen)
De beschikbare landen zijn geconfigureerd in CountryColliPrice. Zie Verzending voor details over transportprijsberekening.
Stap 4 — Bevestiging (confirm)¶
CartController::confirm() (CartController.php:837) toont een bevestigingspagina met:
- Leveringsadrestype: eigen klantadres (type 1) of neutraal dropship-adres (type 2 of 3)
- Leveringsdag-voorkeur: zo snel mogelijk, alles samen, of vaste leveringsdatum
- Optionele notitie bij de bestelling
- Betaalmethode (via
CountryPaymentCostDAO)
Bij "te-monteren"-artikelen met een voertuigchassis worden hier ook de montageopties ingevuld:
- mountingLocation: montage bij de garage van een installateur (installer_garage) of bij de klant thuis (customer_garage)
- Keuze van installateur of mobiele installateur
- Lever- en terugbrengdatum, afspraakmails
Stap 5 — Bestelling aanmaken (createOrder)¶
CartController::createOrder() (CartController.php:1208) is het publieke startpunt. Het
controleert of de cart splitsing vereist (montage of productcategorie) en roept voor enkelvoudige
bestellingen doCreateOrder() aan. De werkelijke Order-objectconstructie via OrderBuilder
gebeurt in doCreateOrder() (CartController.php:1460). Na het opslaan van de order wordt
doFinishOrder() aangeroepen (CartController.php:1688).
Stappen:
- Controleert of de cart montagelijnen bevat (
cart->hasMountArticle()) → zo ja: splitorder per voertuigchassis viasplitCart() - Controleert of de bestelling gesplitst moet worden op productcategorie (
OrderSplittingService) → zo ja:splitCartByProductCategories() - Bij een enkelvoudige bestelling:
doCreateOrder()bouwt hetOrder-object en slaat het op; vervolgens roeptdoFinishOrder()de bevestigings- en afrondingslogica aan - Bij een betaalmethode via Pay.nl: genereert een betaal-URL via
PaynlService::getPaymentUriForOrder()→ klant wordt omgeleid naar de betaalpagina - Bij betaling op rekening of bankdomiciliëring: bestelling is direct bevestigd
Na succesvolle aanmaak:
- Winkelwagen wordt geleegd (cartArticleDao->deleteCart())
- Order-bevestigingsmail wordt verstuurd (OrderService::sendOrderMail())
- Order wordt doorgestuurd naar Odoo ERP (OrderService::sendOrderToErp())
Zie Bestellingen & orderverwerking voor de verdere lifecycle.
"Te monteren"-flow¶
Wanneer een klant banden of velgen toevoegt voor een specifiek voertuigchassis (via de voertuigzoeker) en de optie "te monteren" aanvinkt, voegt het systeem automatisch een montageartikel toe aan de winkelwagen.
Het montageartikel is identificeerbaar via CartArticle::isMountArticle() (CartArticle.php:303), dat controleert of het artikelnummer overeenkomt met Article::getDealerAccessoriesMountingArticleId().
De montageprijs wordt berekend op basis van het totale aantal montage-uren per voertuigchassis (Cart::getMountArticlePrice() × totale uren). Bij aanpassing van de hoeveelheid worden de montage-uren geherberekend (cartArticle->updateMountingHours()).
Als de winkelwagen montagelijnen bevat, wordt de bestelling automatisch gesplitst per voertuigchassis-nummer (splitCart(), CartController.php:1035). Elke split-order wordt afzonderlijk opgeslagen, bevestigd en naar Odoo gestuurd.
Mini-shop order flow¶
Afwijkende flow
Op een mini-shop (*.tyrecloud.be / *.wheelcloud.be) wordt de standaard Atraxion-cart niet gebruikt. De bestelknop op de artikelpagina heeft het attribuut data-mini-shop="true" (ArticleDetailView.php:2582), waardoor de JavaScript-afhandeling een mini-shop-order-form toont in plaats van het artikel aan de gewone winkelwagen toe te voegen.
De mini-shop order flow (ArticleDetailController.php) verloopt als volgt:
- De anonieme bezoeker vult een formulier in: naam, voornaam, e-mail, telefoonnummer, eventueel opmerking
- Een
VisitorOrderwordt aangemaakt en opgeslagen (ArticleDetailController.php:825) - Er worden twee e-mails verstuurd:
- Dealer-mail (
minishop_neworder-template): naar de ontvanger(s) bepaald via een fallback-keten (ArticleDetailController.php:773–785): eerstchannel->getSendOrdersTo()(de geconfigureerde adressen op het channel); als die lijst leeg of ongeldig is →$login->getMail(); als ook dat ontbreekt →$customer->getEmail() - Bevestigingsmail aan de bezoeker (
minishop_orderconfirmation-template) (ArticleDetailController.php:800-814)
De bestelling verschijnt niet in de Atraxion-backoffice als een reguliere order. De eigenaar-klant ontvangt de bestelling per e-mail en verwerkt ze zelf.
Important
Het data-mini-shop="true"-attribuut mag nooit verwijderd worden wanneer nieuwe functionaliteiten op .article--order-routes worden toegevoegd, anders verliest de mini-shop-bezoeker zijn bestelknop.
Dropship-adressen¶
Bij een neutrale levering (leveringsadres ≠ klantadres) geeft de klant een dropship-adres op tijdens de confirm-stap. Dit adres wordt:
- Tijdelijk opgeslagen in $_SESSION['saved_dropship_address']
- Gebruikt voor de transportprijsberekening (Transsmart/Odoo gebruikt het land van het dropship-adres)
- Opgeslagen als OrderAddress bij de aanmaak van de bestelling
Coupon-codes¶
Coupon-codes worden toegepast via de CouponService. De klant kan een code invoeren bij het bekijken van de winkelwagen. De code wordt bijgehouden in $_SESSION['coupon_code']. Bij validatie controleert CouponService::validate() de geldigheidsvoorwaarden; bij slagen past apply() de korting toe. Zie Kortingen & coupons.
Gerelateerde pagina's¶
- Bestellingen & orderverwerking — order lifecycle na checkout
- Betalingen — Pay.nl betaalflow
- Verzending — transportprijsberekening
- Mini-shops (Tyrecloud) — mini-shop concept en bestelstroom
- Loyaliteit — toekenning van punten bij checkout