Ga naar inhoud

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:

  1. Atraxion-cart — de standaard winkelwagen voor ingelogde professionele klanten op www.atraxion.com
  2. 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:

  1. Controleert of de cart montagelijnen bevat (cart->hasMountArticle()) → zo ja: splitorder per voertuigchassis via splitCart()
  2. Controleert of de bestelling gesplitst moet worden op productcategorie (OrderSplittingService) → zo ja: splitCartByProductCategories()
  3. Bij een enkelvoudige bestelling: doCreateOrder() bouwt het Order-object en slaat het op; vervolgens roept doFinishOrder() de bevestigings- en afrondingslogica aan
  4. Bij een betaalmethode via Pay.nl: genereert een betaal-URL via PaynlService::getPaymentUriForOrder() → klant wordt omgeleid naar de betaalpagina
  5. 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:

  1. De anonieme bezoeker vult een formulier in: naam, voornaam, e-mail, telefoonnummer, eventueel opmerking
  2. Een VisitorOrder wordt aangemaakt en opgeslagen (ArticleDetailController.php:825)
  3. Er worden twee e-mails verstuurd:
  4. Dealer-mail (minishop_neworder-template): naar de ontvanger(s) bepaald via een fallback-keten (ArticleDetailController.php:773–785): eerst channel->getSendOrdersTo() (de geconfigureerde adressen op het channel); als die lijst leeg of ongeldig is → $login->getMail(); als ook dat ontbreekt → $customer->getEmail()
  5. 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