Externe platformen¶
Naast de eigen webshop verkoopt Atraxion via externe verkoopplatformen. Elk platform is gekoppeld als een channel van het type PLATFORM (zie Datamodel & databases). Zes platformen zijn geïntegreerd: Tyre24, Autodoc, Amazon, Qweon, Rhinoman en Evox.
Overzichtstabel¶
| Platform | Richting | Protocol | Stock export | Order import | Tracking/factuur uit | Status |
|---|---|---|---|---|---|---|
| Tyre24 | Bi-directioneel | REST JSON (api-b2b.alzura.com) |
Pull-model (Tyre24 bevraagt ons) | t24:queue-orders → getOrders.php |
Tyre24OrderUpdater |
Actief |
| Autodoc | Bi-directioneel | REST JSON (wij exposeren de API via _autodoc/) |
GET /api/getstock (Autodoc vraagt ons) |
POST /api/createorder (Autodoc vraagt ons) |
GET /api/trackinfo |
Actief |
| Amazon | Tri-directioneel | SP-API OAuth2 REST | amazon/exportStock.php PATCH SP-API |
amazon/retrieveOrders.php poll SP-API |
amazon/uploadTrackings.php |
Uitgeschakeld (uitgecommentarieerd) |
| Qweon | Bi-directioneel | REST/XML | qweon:push-tyres (stub, onvolledig) |
qweon:pull-tyres catalogussync |
n.v.t. | Uitgeschakeld (uitgecommentarieerd) |
| Rhinoman | Inkomend | REST JSON (X-API-Key) |
app:rhinoman:generate:stock-file downloadt Rhinomans catalogus als CSV |
Niet gekoppeld | n.v.t. | Onduidelijk (geen vaste cron) |
| Evox | Inkomend | REST JSON (api_key-parameter) |
n.v.t. (voertuigafbeeldingen) | n.v.t. | n.v.t. | Uitgeschakeld (uitgecommentarieerd) |
Gedeelde infrastructuur¶
Channel.ExportId¶
Elk platform-channel heeft een ExportId (FK naar article_stock_export). Dit bepaalt welke artikelen — op basis van leverancier, merk en witte/zwarte lijsten — beschikbaar zijn voor dat platform. Als ExportId NULL is, zoekt CheapestSupplierFinder door alle leveranciers, wat kan leiden tot foutief gekozen leveranciers en prijsverlies.
Prijsberekening¶
src/Atraxion/Platform/Calculator/ExportPriceCalculator.php berekent exportprijzen: inkoopprijs (AK) + marge + transporttoeslag.
Order-import: matching-volgorde¶
Bij het importeren van platformorders zoekt het systeem het bijbehorende Atraxion-artikel op in de volgende volgorde:
- Artnr — intern artikelnummer
- EAN — barcode (
article.Eancode) - Fabcode — fabrikantcode (
article.Fabcode)
Als geen enkel identifier een overeenkomst oplevert, wordt de orderregel bewust leeg aangemaakt (niet atomair afgebroken). De lege regel is zichtbaar in de admin zodat een medewerker de mismatch kan oplossen. Dit is bewust gedrag — zie ook memory project_platform_order_matching.
Achtergrondverwerking orders¶
_shopupdating/cronjobs/atx/orders/getOrders.php delegeert naar atx\orders\UpdatingPlatformOrderController::getOrders. Accepteert --platform/-p om te filteren op één platform.
Tyre24¶
Client-locatie: src/Tyre24/
Tyre24 gebruikt de REST JSON-API van api-b2b.alzura.com. Authenticatie via HTTP Basic met dubbele encoding: base64(md5(password)) (src/Tyre24/Service/AbstractApi.php). De client throttelt op 250 ms tussen aanvragen (max. 4 req/s).
Stock export (pull-model)¶
Tyre24 bevraagt Atraxion dynamisch — er is geen push-cron voor voorraad. Via src/Tyre24/Service/TyresApi.php en WheelListingService.php zoekt het systeem artikelen op via EAN-code eerst, daarna via Fabcode. Er is een aparte command t24:listings:tyres die een vergelijkings-CSV (tyre24_prijzen.csv) genereert (rapportagedoeleinden, geen voorraadpush).
Order import¶
src/Tyre24/Command/Tyre24QueueOrdersCommand.php(t24:queue-orders) — pollt nieuwe orders bij Tyre24 en plaatst ze in de queue viaQueueDAO.UpdatingPlatformOrderController::processOrderverwerkt ze.- Artikel-matching in
PlatformOrderService::makeOrderFromT24(): supplier_item_numbergesplitst op_→ Artnr + LevNr- Tyre24
alzura_id - EAN-attribuut
- Orderreferentie-formaat:
{LandPrefix}:{orderNummer}(bijv.T24BE:12345).
Tracking & factuur (uitgaand)¶
src/Atraxion/Platform/Updater/Tyre24OrderUpdater.php
updateTracking(): roeptsetShippingInformation()aan, daarnasetOrderStatus(reference, 3)(= verzonden). Carrier-mapping: DHL=6, DPD=1, GLS=3.updateInvoice(): roeptsetInvoiceInformation()ensetInvoiceFile()aan (PDF, max. 350 KB). Daarna wordtsetOrderStatus(reference, 2)alleen aangeroepen alstyre24OrderStatusnog niet is ingesteld (d.w.z.updateTracking()niet eerder liep en status 3 heeft gezet).- Iedere document-API-call schrijft een
FileUploadLog: succes wordt als geverifieerd gemarkeerd, een API-fout wordt met foutmelding gelogd en daarna opnieuw opgegooid zodat de factuurstatusFAILEDwordt.Status_linkenDate_linkworden pas na een volledig succesvolle factuursend opSENDen de verzenddatum gezet. t24:submit-invoiceis de retry-cron voor late PDF's. Het commando selecteert uitsluitend order-gekoppelde Tyre24-facturen metHasPDF = 1enStatus_link IN (NEW, FAILED)en delegeert naar dezelfdeAggregateOrderUpdater; het bevat geen tweede rechtstreekse API-implementatie.- Tyre24 heeft bewust geen
channel_platform_export-rijen. Admin gebruikt daaromPlatform::supportsExportType()voor de API-capability en toont de factuurstatus op basis vanStatus_link/Date_link, metFileUploadLogals detailaudit.
Autodoc¶
Client-locatie: src/Autodoc/
Autodoc draait als een aparte Slim-applicatie op _autodoc/index.php. REST JSON, HTTP Basic Auth — gebruikersnaam = leveranciersnaam, wachtwoord gecontroleerd tegen het platformrecord waar username = 'Autodoc' (src/Autodoc/Middleware/AuthorizationMiddleware.php).
Endpoints die Autodoc bij Atraxion aanroept¶
| Methode | Pad | Doel |
|---|---|---|
GET |
/api/getstock/{productIdOrEanCode} |
Voorraad + prijs opvragen |
POST |
/api/createorder |
Order aanmaken |
GET |
/api/trackinfo/{orderId} |
Trackinginformatie opvragen |
GET |
/api/orderstatus/{orderId} |
Status (1=in behandeling, 2=verzonden, 3=geannuleerd, 6=geleverd) |
POST |
/api/cancelorder |
Order annuleren |
Stock response (src/Autodoc/Controller/Api/InventoryController.php)¶
- Zoekt artikel op via product-ID of EAN.
- Haalt exports op via
ExportIdgekoppeld aan de leverancier. - Berekent prijs via
ExportPriceCalculator. - Caps voorraad op 12; prijs moet > €20 zijn om
success=1te rapporteren. - Optioneel Odoo EDI-relay voor realtime voorraad als
channel.useOdooEdiRelayis ingesteld.
Order import (src/Autodoc/Controller/Api/OrderController.php)¶
- Idempotent op
{prefix}:{autodoc-order-id}. - Leveringsland wordt gemapt naar een factuurklant via een hardgecodeerde tabel van 24 landen (regels 32–57 van
OrderController.php). - Artikel-matching:
findOneByIdOrEanCode()— product-ID eerst, dan EAN. Bij niet gevonden: HTTP 400 (synchrone API, geen lege-regelpatroon).
Tracking (uitgaand)¶
getTrackingInfo() hersynct de order vanuit Odoo, retourneert pakketarray met carriernaam, tracking-URI en referentie. Markeert de leveringsbon als STATUS_LINK_SEND.
Amazon¶
Client-locatie: src/Amazon/
Amazon SP-API via OAuth2 (client_id/secret/refresh_token). Regio-bewuste endpoints (EU-standaard: sellingpartnerapi-eu.amazon.com). Rate-limiting via AmazonRateLimiter.
Let op: de Amazon ServiceProvider en CommandProvider zijn uitgecommentarieerd in de globale provider-configs. De cron-scripts en services bestaan en zijn functioneel, maar zijn niet standaard actief.
Stock export¶
src/Amazon/Fulfillment/Service/AmazonStockExportService.php
exportStock() → pushListings() → PATCH /listings/2021-08-01/items/{sellerId}/{sku} via SP-API. Patches: fulfillment_availability (hoeveelheid) en purchasable_offer (prijs in GBP = EUR × wisselkoers uit DB).
Cron: _shopupdating/cronjobs/atx/amazon/exportStock.php
Command: amazon:export-stock (ondersteunt dry-run en SKU-filter).
Order import¶
src/Amazon/Fulfillment/Service/AmazonOrderRetrievalService.php — pollt SP-API ordersV0()->getOrders() met createdAfter-tijdstempel, pagineert (max. 50 pagina's, 50 orders per pagina). Statussen: Unshipped,PartiallyShipped.
src/Amazon/Fulfillment/Service/AmazonOrderImporter.php — idempotent op AMZ:{amazonOrderId}.
Artikel-matching: SellerSKU is het Atraxion-Artnr — geen EAN/Fabcode-fallback. De retrieval-tijdstempel wordt alleen doorgeschoven als er nul importfouten zijn.
Cron: _shopupdating/cronjobs/atx/amazon/retrieveOrders.php
Tracking (uitgaand)¶
src/Amazon/Fulfillment/Service/AmazonOrderUpdater.php — bevraagt orders met OrderReference LIKE 'AMZ:%', batchlimiet 50. Roept SP-API ordersV0()->confirmShipment() aan via AmazonShipmentSender.
Cron: _shopupdating/cronjobs/atx/amazon/uploadTrackings.php
Qweon¶
Client-locatie: src/Qweon/
REST/XML. Qweon-endpoint: https://atraxion.qweon.com/webservice/?request=getalltyres&group=1&page={n}. XML-responses worden geparsed door GetAllTyresResponseParser. Geen authenticatieheader — de URL is een vast, Atraxion-specifiek endpoint bij Qweon (het subdomein atraxion is de klant-id bij Qweon). Zie src/Qweon/Service/QweonService.php:61.
Let op: ServiceProvider en CommandProvider zijn uitgecommentarieerd. CP/admin-routes onder
/qweonin_cp/index.phpzijn nog actief.
Catalogussync IN (qweon:pull-tyres)¶
src/Qweon/Service/SyncTyresService.php — pagineert getalltyres-pagina's, parset XML naar TyreDTO, upsert qweon_tyres op EAN.
Artikel-koppeling (qweon:link-tyres)¶
src/Qweon/Command/LinkTyresCommand.php — koppelt qweon_tyres aan article via:
- EAN (
Eancode = ean OR Eancode2 = ean) →linkedOn='ean' - Fabcode/MPN (
Fabcode = mpn OR Fabcode2 = mpn) →linkedOn='mpn'
Stock push UIT (qweon:push-tyres)¶
src/Qweon/Command/PushTyresCommand.php — bouwt ProductDTO-objecten voor gekoppelde banden, maar bevat geen daadwerkelijke HTTP-pushoproep. Stub/onvolledig.
Rhinoman¶
Client-locatie: src/Rhinoman/
REST JSON. PSR-18 HTTP-client met X-API-Key-header. Gepagineerd: GET /products?page={n}&page_size=100.
Catalogusdownload (app:rhinoman:generate:stock-file)¶
src/Rhinoman/Service/StockFileGenerator.php — pagineert RhinomanFacade::getProducts() via GET /products op de Rhinoman-API (paginagrootte 100, sleep(5) tussen pagina's) en schrijft de resultaten naar een CSV. Dit is een pull van Rhinomans catalogus — Atraxion stuurt geen eigen voorraad naar Rhinoman.
CSV-kolommen: EAN, Naam, Beschikbare hoeveelheid (Rhinoman), Prijs ex. btw, Prijs incl. btw, Publieke prijs ex./incl. btw, Afbeelding (Rhinoman), Waarschuwing.
Er is geen vaste cron in _shopupdating/cronjobs/atx/ — het script wordt ad hoc of via een externe cron uitgevoerd.
RhinomanFacade::createOrder()(POST/create_order) is gebouwd maar nergens aangeroepen — order-plaatsing is niet actief.
Evox¶
Client-locatie: src/Evox/
Evox levert voertuigafbeeldingen — geen verkoop of orders. REST JSON met api_key als queryparameter. Alle aanvragen en antwoorden worden gelogd in evox_api_log via RequestResponseRecorder.
Let op: ServiceProvider en CommandProvider zijn uitgecommentarieerd — standaard inactief.
Download (evox:download-vehicles)¶
src/Evox/Service/DownloadVehiclesService.php:
GET /vehicles→ voertuiglijst met VIF-nummers → upsertevox_vehicles.- Per voertuig:
GET /vehicles/{VIF}/colors→ upsertevox_vehicle_colors. - Per voertuig: beeldproducten ophalen (zijkant/achterkant/voorkant) via producttype-IDs 790/792/794.
- Per kleur: PNG downloaden via
file_get_contents(), opslaan in{downloadDirectory}/vehicles/{VIF}/{colorId}_{side}_profile.png.
DB-tabellen: evox_vehicles (VIF, merk, model, jaar, trim), evox_vehicle_colors (kleurcode, RGB-waarden, lokale bestandsnamen).
Kruislinks¶
- Integraties (technisch) — protocol-details per client-bibliotheek
- Crons & queue — platform-ordercrons en exportscripts
- Voorraadimport — hoe leveranciersvoorraden samenkomen vóór export naar platformen
- EDI / B2B — directe XML-koppeling voor B2B-klanten (geen platform-channel)