Ga naar inhoud

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-ordersgetOrders.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:

  1. Artnr — intern artikelnummer
  2. EAN — barcode (article.Eancode)
  3. 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

  1. src/Tyre24/Command/Tyre24QueueOrdersCommand.php (t24:queue-orders) — pollt nieuwe orders bij Tyre24 en plaatst ze in de queue via QueueDAO.
  2. UpdatingPlatformOrderController::processOrder verwerkt ze.
  3. Artikel-matching in PlatformOrderService::makeOrderFromT24():
  4. supplier_item_number gesplitst op _ → Artnr + LevNr
  5. Tyre24 alzura_id
  6. EAN-attribuut
  7. Orderreferentie-formaat: {LandPrefix}:{orderNummer} (bijv. T24BE:12345).

Tracking & factuur (uitgaand)

src/Atraxion/Platform/Updater/Tyre24OrderUpdater.php

  • updateTracking(): roept setShippingInformation() aan, daarna setOrderStatus(reference, 3) (= verzonden). Carrier-mapping: DHL=6, DPD=1, GLS=3.
  • updateInvoice(): roept setInvoiceInformation() en setInvoiceFile() aan (PDF, max. 350 KB). Daarna wordt setOrderStatus(reference, 2) alleen aangeroepen als tyre24OrderStatus nog 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 factuurstatus FAILED wordt. Status_link en Date_link worden pas na een volledig succesvolle factuursend op SEND en de verzenddatum gezet.
  • t24:submit-invoice is de retry-cron voor late PDF's. Het commando selecteert uitsluitend order-gekoppelde Tyre24-facturen met HasPDF = 1 en Status_link IN (NEW, FAILED) en delegeert naar dezelfde AggregateOrderUpdater; het bevat geen tweede rechtstreekse API-implementatie.
  • Tyre24 heeft bewust geen channel_platform_export-rijen. Admin gebruikt daarom Platform::supportsExportType() voor de API-capability en toont de factuurstatus op basis van Status_link / Date_link, met FileUploadLog als 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 ExportId gekoppeld aan de leverancier.
  • Berekent prijs via ExportPriceCalculator.
  • Caps voorraad op 12; prijs moet > €20 zijn om success=1 te rapporteren.
  • Optioneel Odoo EDI-relay voor realtime voorraad als channel.useOdooEdiRelay is 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 /qweon in _cp/index.php zijn 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.

src/Qweon/Command/LinkTyresCommand.php — koppelt qweon_tyres aan article via:

  1. EAN (Eancode = ean OR Eancode2 = ean) → linkedOn='ean'
  2. 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:

  1. GET /vehicles → voertuiglijst met VIF-nummers → upsert evox_vehicles.
  2. Per voertuig: GET /vehicles/{VIF}/colors → upsert evox_vehicle_colors.
  3. Per voertuig: beeldproducten ophalen (zijkant/achterkant/voorkant) via producttype-IDs 790/792/794.
  4. 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).