Magento 2 – Modis koppeling

18 september 2017 | Patrick
Back-end ontwikkelaar

BigBridge heeft een koppeling ontwikkeld voor Magento 2 en het kassasysteem Modis. Het Modis kassasysteem bestaat ruim 20 jaar en levert automatiseringsoplossingen van logistieke processen voor de modebranche. De koppeling met Magento 2 webshops voorziet in een hoge mate van automatisering waardoor veel tijd wordt bespaard en fouten worden voorkomen.

Functionaliteiten van de koppeling

Het gaat hier om de koppeling (synchronisatie, import) tussen het kassasysteem Modis en Magento 2. Informatie over producten en maten wordt omgezet in configurable products en bijbehorende varianten worden geïmporteerd binnen Magento 2. Product-prijzen en enkele tekst-velden krijgen in de diverse store views verschillende waarden. Afbeeldingen, categorieën en gerelateerde producten worden geïmporteerd, samen met een aantal klantspecifieke attributen.

Nieuwe en gewijzigde producten worden door Modis via FTP klaargezet op de Magento server. Het gaat om XML bestanden en om afbeeldingen. De import leest de bestanden in en zet ze om in nieuwe producten of past bestaande producten aan.

De Magento 2 Modis koppeling voorziet in een hoge mate van automatisering waardoor producten vanuit Modis automatisch in Magento verschijnen. Zaken als productinformatie, actuele voorraden en productafbeeldingen worden tevens gesynchroniseerd.

Magento 2 koppeling Modis

 

Het schrijven van imports

Magento 2 kent standaard al enkele imports, waaronder een producten-import. De Modis import bevat echter enkele speciale eigenschappen, waardoor maatwerk noodzakelijk is. Er wordt vaak over koppelingen gesproken alsof het een alles-of-niets ding is. In de praktijk wordt een koppeling meestal geschreven op een need-to-have basis. Alleen die onderdelen worden geschreven die voor de huidige klanten van belang zijn. De reden hiervoor is dat het veel tijd kost om zo’n stuk software te schrijven, dus je wilt dat niet doen als het niet nodig is. Daarnaast is het ook niet mogelijk een feature in de praktijk te testen als er geen klant is die het gebruikt.

Het is zelfs zo dat niet alle attributen die beschikbaar zijn in het import-bestand worden geïmporteerd. Er zijn vaak maar weinig eenvoudige tekst-attributen die één-op-één kunnen worden overgenomen. Voor de andere attributen is het nodig af te stemmen met de klant hoe mapping met Magento 2 plaats moet vinden, de import code zelf kan complex zijn, en dan heeft het nog vrij nieuwe Magento 2 nog een aantal bugs die je moet oplossen als je ze tegenkomt.

Als een nieuwe klant gebruik wil maken van deze koppeling, wordt die stukje bij beetje algemener gemaakt. De delen die eerst klantspecifiek waren, worden configurabel, en de nieuwe klant maakt direct gebruik van deze configureerbaarheid. Het hoofdbestanddeel van de code blijft gelijk en wordt niet gekopieerd. Op die manier is de import makkelijk aan te passen (bugs en features) zodat alle klanten er baat bij hebben.

XML import

PHP kent verschillende manieren om XML te importeren. De een is wat efficiënter met het geheugen. De ander is veel sneller. Door verschillende technieken (DomDocument en simplexml) te combineren kun je komen tot een manier die zowel snel, geheugenvriendelijk als gemakkelijk is voor de developer.

Importeren producten vanuit Modis naar Magento 2

We maken voor het importeren gebruik van FireGento’s FastSimpleImport, in combinatie met hun ExtendedImport. Deze tool is gebouwd om de eigen importer van Magento 2 heen en maakt het makkelijk om producten programmatisch in te voeren. ExtendedImport maakt automatisch attribuut opties aan tijdens het importeren.

De standaard import was niet snel genoeg voor ons. In het geval van onze klant was ieder product een kledingstuk (een configureerbaar product) met meerdere maten en voor iedere maat moest een variant (een simpel product) worden aangemaakt. Voor alle producten gold verder dat ze verschillende attributen hadden die voor elk van 8 store views andere waarden moesten krijgen. Het ging om prijzen, beschrijvingen, en url keys.

Op het globale niveau hebben we de configurables en varianten met FastSimpleImport geïmporteerd. De attributen die per store view verschilden hebben we via het product resource model ingevoerd. Dit is een veel snellere methode.

Url keys

De url_key van een product wordt gebruikt om de url van de product-pagina te maken. Standaard leidt FastSimpleImport de url_key af van de naam van het product. Veel producten van onze klant bleken echter dezelfde naam te hebben. Bij het opslaan van zo’n product krijg je dan een “url key exists” fout, omdat de url_key uniek moet zijn per store view.

We hebben dit opgelost door de url_key zelf te genereren op basis van de naam en de sku. Daarbij controleren we of de url_key al gebruikt wordt door een ander product. Als dit het geval is, voegen we de sku toe aan de url_key. Bij het maken van de url worden verder alle aparte tekens en spaties omgezet in tekens die mogelijk zijn in een url.

Laatst geïmporteerd datum

Bij ieder product dat we opslaan wordt een veld “from_modis” en “last_update_from_modis” bijgehouden. “from_modis” wordt op true gezet bij ieder product uit Modis. “last_update_from_modis” ontvangt de datum/tijd van het laatste import-bestand.

“last_update_from_modis” wordt gebruikt om te controleren of het import-bestand wel nieuwer is dan de gegevens die al in de database aanwezig zijn. Als de het import-bestand van een oudere datum is, wordt het gewoon overgeslagen. Deze aanpak heeft als voordeel dat wanneer per toeval een ouder import-bestand wordt aangeboden, dat deze niet wordt toegepast en daarmee de database vervuilt.

We verwerken de bestanden ook in aflopende tijdsvolgorde. Oudere bestanden worden eerder uitgevoerd. Mocht een koppeling een aantal dagen stil liggen, dan worden de producten direct bijgewerkt naar de meest recente versie. Het heeft immers geen zin om de oude gegevens in te voeren en die direct daarna weer te overschrijven met een nieuwere versie. Dezelfde producten in de oudere bestanden worden overgeslagen.

 

Backend van het Modis kassasysteem

 

Testen

Het schrijven van automatische tests doe je eigenlijk nooit genoeg, maar het is een afweging met aan de ene kant de tijdsinvestering voor het maken van de tests en aan de andere kant het risico dat er wat fout gaat. Voor deze import beperken we ons tot het inlezen van een test-xml-bestand en het opbouwen van een tijdelijke datastructuur voor elk product. Hier zit namelijk de belangrijkste business logic. Als daar wat fout zou gaan wordt met verkeerde informatie ingevoerd. Dit is moeilijk te herstellen. Problemen die samenhangen met het uitvallen van de sync zijn makkelijker te herstellen.

Console command

De import wordt regelmatig uitgevoerd via een Magento cron-job. Om hem makkelijk handmatig te starten hebben we een console command gemaakt. Daarmee kunnen we de import starten met het commando

Hieraan hebben we een optie -f (force) toegevoegd, om de controle op de “last_update_from_modis” te onderdrukken, zodat eenzelfde import-bestand nogmaals kan worden aangeboden. Handig bij het testen en bij het oplossen van fouten.

Foutafhandeling

Idealiter is een import gegarandeerd foutloos. In de praktijk is dit niet haalbaar, omdat de aangeleverde data corrupt kan zijn, de software fouten bevat, en Magento’s cron-jobs soms niet actief zijn. Het robuust maken van een import kost tijd. Een minimum-eis aan een import is wel dat er een log-bestand wordt gegenereerd met de activiteit en de fouten die daarbij optreden. Het oplossen van een import-probleem zonder log-bestand is namelijk zeer tijdrovend.

De resultaten van iedere import wordt gelogd in een apart log-bestand. Door dit in een apart bestand te doen (anders dan debug.log) is het makkelijker te gebruiken bij het oplossen van problemen.
Daarnaast worden de fouten van deze import ook gemaild naar configureerbare e-mail ontvangers. Deze zien dan dat er wat aan de hand is en kunnen er op reageren.

Ook gebruik maken van de Magento 2 Modis koppeling?

Voorkom fouten en bespaar veel tijd met onze Magento 2 Modis koppeling. De koppeling is volledig aan te passen aan uw eisen en wensen en wij kijken graag met u naar de mogelijkheden. Neem hiervoor contact met ons op.

Patrick
Back-end ontwikkelaar
Als Magento developer ontwikkel ik maatwerk-functionaliteiten en extensies voor onze klanten. Het is voor mij een uitdaging om de wensen van de klant op de meest elegante manier vorm te geven, lettend op snelheid, stabiliteit en uitbreidbaarheid. Daarnaast vind ik het leuk mezelf continu te verdiepen op het gebied van nieuwe innovaties en de laatste ontwikkelingen op development gebied. Benieuwd waarin BigBridge en Magento het verschil maken? Neem contact op