Ga naar inhoud

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.be of <subdomain>.wheelcloud.be, gekozen door de klant-eigenaar. De subdomain-to-domain mapping staat in _core/model/classes/atx/channels/Channel.php:112 als 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 de MiniShopLicenseExpirationNotifier een waarschuwingsmail aan de eigenaar via het e-mailtemplate minishop-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 SendOrdersTo op 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 AllowedMiniShop in zijn klantprofiel staat op true (ingesteld via de backoffice door Atraxion-medewerkers), of
  • De klant heeft een prepaid betalingscode (PaymentCode::isPrepaid() === true) — in dat geval retourneert isAllowedMiniShop() onvoorwaardelijk true, ongeacht AllowedMiniShop.

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