Mini-shops (Tyrecloud / Wheelcloud)¶
Mini-shops zijn het kernproduct dat Atraxion aanbiedt aan professionele klanten. Een klant-eigenaar
krijgt een eigen, anonieme webshop op een eigen subdomein — onder *.tyrecloud.be of
*.wheelcloud.be — waarmee hij zijn eigen klanten kan bedienen.
Concept¶
Een klant van Atraxion kan worden geactiveerd voor een mini-shop. Die mini-shop is:
- Eigen subdomein:
<subdomain>.tyrecloud.beof<subdomain>.wheelcloud.be, gekozen door de klant-eigenaar. De subdomain-to-domain mapping staat in_core/model/classes/atx/channels/Channel.php:112als statische array$MiniShopCloudDomainMap. - Anoniem: de bezoekers van de mini-shop zien de naam van de eigenaar-klant niet; de webshop presenteert zich als een neutrale Tyrecloud- of Wheelcloud-omgeving.
- Op licentie: een klant heeft een
LicenseEnd-datum. Nadert de vervaldatum (op 14, 7 of 1 dag), dan stuurt deMiniShopLicenseExpirationNotifiereen waarschuwingsmail aan de eigenaar via het e-mailtemplateminishop-licence-expired. Zie_core/model/classes/atx/customers/MiniShopLicenseExpirationNotifier.php:79–89. - Bestellingen per e-mail naar de eigenaar: wanneer een bezoeker een bestelling plaatst op de
mini-shop, gaat die bestelling per e-mail naar de klant-eigenaar. Het veld
SendOrdersToop het channel bevat de ontvangstadressen (_core/model/classes/atx/channels/Channel.php:227).
Channel-concept¶
Het centrale technische concept is atx\channels\Channel
(_core/model/classes/atx/channels/Channel.php). Een channel stelt een verkoopkanaal voor.
Er zijn twee channel-typen:
| Constante | Waarde | Betekenis |
|---|---|---|
Channel::WEB |
1 |
Webshop-kanaal: de hoofdshop (www.atraxion.com) én alle mini-shops |
Channel::PLATFORM |
2 |
Extern verkoopplatform (Tyre24, Autodoc, Amazon …) |
De hoofdshop is het channel met ID 14
(Channel::DEFAULT_CHANNEL = 14, _core/model/classes/atx/channels/Channel.php:44).
Een mini-shop is een channel van type WEB met de vlag MiniShop = true én een ingevuld
OwnedByCustomer-veld (het klantnummer van de eigenaar).
Relevante methoden:
| Methode | Bestand:regel |
|---|---|
isMiniShop() |
Channel.php:574 |
getMiniShop() |
Channel.php:566 |
getOwnedByCustomer() |
Channel.php:492 |
isOwned() — heeft channel een eigenaar? |
Channel.php:484 |
isOwnedByCustomer(Customer $c) — is de gegeven klant de eigenaar? |
Channel.php:514 |
De klant-eigenaar haalt zijn eigen mini-shops op via Customer::getMiniShopChannels()
(_core/model/classes/atx/customers/Customer.php:2143).
Subdomains en domeinen¶
De toegestane clouddomeinen zijn vastgelegd als statische array op het Channel-model:
// _core/model/classes/atx/channels/Channel.php:112
public static $MiniShopCloudDomainMap = [
'tyrecloudbe' => '.tyrecloud.be',
'wheelcloudbe' => '.wheelcloud.be',
];
Bij het opslaan van een channel bouwt updateChannelNameFromSubDomain() de volledige
ChannelName op als <subdomain> + <domain-suffix> (bv. garage-de-smet.tyrecloud.be).
Dit lifecycle-callback loopt op PRE_INSERT en PRE_UPDATE
(_core/model/classes/atx/channels/Channel.php:595–600).
Gereserveerde subdomains (zoals www, manage, api, test) zijn uitgesloten via de statische
array $ReservedSubDomains (_core/model/classes/atx/channels/Channel.php:67–108).
Marges instellen¶
De klant-eigenaar beheert zijn mini-shop via zijn profiel op www.atraxion.com (menu
E-mail > Mini-shop instellingen). Daarin stelt hij per productcategorie en velgdiameter
zijn verkoopmarges in.
De margins worden opgeslagen in het CustomerMargin-model
(_core/model/classes/atx/customers/CustomerMargin.php). Elke marge-rij bevat:
| Veld | Type | Betekenis |
|---|---|---|
Artcat |
int | Productcategorie (1 = accessoire, 2 = band, 3 = velg) |
Inch |
float | Velgdiameter (voor velgen: per inch-groep) |
Margin |
float | Marge in procenten |
Supplement |
float | Vast toeslag bovenop de marge |
priceBase |
string | Berekeningsbasis: net (nettoprijs) of tariff (tariefprijs) |
marginOperation |
string | add (opslaan) of subtract (aftrekken) |
De berekening zit in CustomerMarginCalculator
(_core/model/classes/atx/customers/CustomerMarginCalculator.php:64–73):
verkoopprijs = (basisprijs × margefactor) × btwfactor
Waarbij margefactor = (100 + marge%) / 100. Bij subtract deelt het model door de factor in
plaats van te vermenigvuldigen.
De Supplement (toeslag) wordt alleen opgeteld bij de prijs als de aanroeper expliciet
withSurcharge() aanroept op de calculator (RetailPriceCalculator.php:158–160). In dat geval
wordt de formule:
verkoopprijs = (basisprijs × margefactor + toeslag) × btwfactor
De toeslag is dus opt-in, niet altijd aanwezig.
De UI rendert het margeformulier als tabblad-structuur (tabs voor banden, velgen, accessoires,
sets) in _core/view/classes/atx/customers/UserView.php:163–230.
Zichtbare productcategorieën¶
Per mini-shop kan de eigenaar instellen welke productcategorieën zichtbaar zijn in het menu
(banden / velgen / accessoires). Dit is het veld VisibleMenuItems op het channel
(_core/model/classes/atx/channels/Channel.php:164), opgeslagen als JSON-array. De eigenaar
beheert dit in zijn profiel (_core/view/classes/atx/customers/UserView.php:369–386).
Homepage en "geen resultaten"-boodschap¶
De eigenaar kan per mini-shop een homepagina-afbeelding, een titel en een tekst instellen (in NL,
FR en EN). Tevens kan hij per taal een ErrorTitle en ErrorText instellen
(_core/model/classes/atx/channels/Channel.php:207–232, beheerd in zijn profiel). Dat is de
"geen resultaten gevonden"-boodschap die op de zoekresultatenpagina van de mini-shop verschijnt
wanneer een zoekopdracht geen artikelen oplevert. De zoek-views tonen die eigen tekst alleen voor
mini-shops met een ingevulde waarde voor de actieve taal en vallen anders terug op de
standaardteksten (_core/view/classes/atx/articles/acc/AccSearchView.php:217–229, en idem in
ArticleSearchView, TyreSearchView en WheelSearchView). Het is dus niet de offline-/
verloopmelding — die wordt apart afgehandeld (zie Licentieverloopmeldingen).
Licentieverloopmeldingen¶
De klasse MiniShopLicenseExpirationNotifier
(_core/model/classes/atx/customers/MiniShopLicenseExpirationNotifier.php) stuurt
proactief e-mails wanneer een licentie over 14, 7 of 1 dag verloopt. De notifier
wordt periodiek aangeroepen via de cronjob
_shopupdating/cronjobs/atx/customers/sendMailLicenceExpired.php.
Wanneer de klant geen e-mailadres heeft, gaat de mail naar het interne adres logs@atraxion.com
(_core/model/classes/atx/customers/MiniShopLicenseExpirationNotifier.php:35).
Toegang en activatie¶
Een klant kan een mini-shop aanmaken als aan één van de volgende voorwaarden is voldaan:
- Het veld
AllowedMiniShopin zijn klantprofiel staat optrue(ingesteld via de backoffice door Atraxion-medewerkers), of - De klant heeft een prepaid betalingscode (
PaymentCode::isPrepaid() === true) — in dat geval retourneertisAllowedMiniShop()onvoorwaardelijktrue, ongeachtAllowedMiniShop.
Daarnaast wordt het instellingenformulier ook getoond als de klant reeds eigen channels (mini-shops) heeft, ongeacht isAllowedMiniShop() (_core/view/classes/atx/customers/UserView.php:2326).
(_core/model/classes/atx/customers/Customer.php:2498)
Templatechannel¶
Wanneer een klant nog geen eigen mini-shop heeft aangemaakt, genereert
Customer::createTemplateMiniShopChannel() een tijdelijk template-channel met ID 65536
(MINI_SHOP_TEMPLATE_ID), zodat de UI altijd een instellingenformulier kan renderen zonder dat
er al een echt channel in de database bestaat
(_core/model/classes/atx/customers/Customer.php:2165).
Stroomdiagram¶
flowchart TD
A[Klant-eigenaar\nwww.atraxion.com\nE-mail > Mini-shop instellingen] -->|configureert marges\nen zichtbare categorieën| B[CustomerMargin\nper Artcat + Inch]
A -->|Channel: MiniShop=true\nOwnedByCustomer=klantnr| C["Channel\n<subdomain>.tyrecloud.be\nof .wheelcloud.be"]
E[Bezoeker mini-shop] -->|bezoekt anonieme shop| C
C -->|bestelling per e-mail\nSendOrdersTo| A
F[Cronjob\nsendMailLicenceExpired.php] -->|notificaties dag 14/7/1| A
G[LicenseEnd datum\nCustomer.getLicenseEnd] -->|controle in bulkNotify| F
H[Backoffice\nAtraxion-medewerker] -->|activeert AllowedMiniShop| A
Zie ook¶
- Klanten & accounts — klantprofiel, login en mini-shop activatie
- Productcatalogus — welke producten beschikbaar zijn in de mini-shop
- Notificaties & e-mails — e-mailtemplate
minishop-licence-expired - Technisch: Datamodel & databases —
channel-database - Technisch: Request lifecycle & routing — hoe subdomain-routing het juiste channel laadt