Schnittstelle für den Lagerbestand aus SelectLine zu Magento2
Soll auf Magento2 Basis ein Shopsystem aufgebaut werden, so macht der Lagerbestandsabgleich oder auch der Preisabgleich mit den Daten aus dem eigenem ERP System naürlich Sinn. Wenn die Übertragung des Lagerbestands einmal in 24h ausreichend ist dann kommt folgende Option in Frage.
Der Export aus SelectLine ist vom ERP Betreiber leicht einzurichten. Die übliche XML Struktur sieht dabei meist so aus:
Dieser Export kann nun via FTP auf den Webserver übertragen werden - z.B. einmal in der Nacht. Auf dem Webserver muss nun per Script einmal am Tag (Nacht) der Import durchlaufen werden. Dieses Script lädt das XML File und aktualisiert den Lagerbestand in Magento2.
Dazu muss im Magento2 die REST Schnittstelle aktiviert sein und ein User zur Berechtigung eingerichtet sein.
Das PHP Script kann so aussehen: (Die BESTAND.xml ist der SelectLine Export)
<?php
// root domain
$rootDomain = "MAGENTO SHOP DOMAIN";
echo "<h3>BESTAND IMPORT</h3>";
$start = time();
if (file_exists('/ftp-folder/BESTAND.xml')) {
$xml = simplexml_load_file('/ftp-folder/BESTAND.xml');
foreach ( $xml->Daten->Datensatz as $ds ) {
$sku = $ds->Feld->Wert->__toString();
$bestand = $ds->Feld[1]->Wert->__toString();
if ($bestand < 0) {
$bestand = 0;
}
$restDomain = $rootDomain."/index.php/rest/V1/products/".$sku."/stockItems/1";
$productData = array("qty" => $bestand);
$data = json_encode(array('stockItem' => $productData));
echo $sku." -- ".$data."<br><br>";
$restCall = CallAPI($restDomain,$data);
unset($productData);
unset($data);
}
} else {
echo('Konnte BESTAND.xml nicht öffnen.');
}
$end = time();
$laufzeit = $end-$start;
echo "<br><br>Laufzeit: ".$laufzeit." Sekunden!";
function CallAPI($url, $data = false) {
$curl = curl_init();
// Authentication:
$authorization = "Authorization: Bearer xyz1234567890 (Hier der Auth Schlüssel)";
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization ));
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
?>
Die Laufzeit für das Script hängt natürlich von der Anzahl der Artikel ab. Sicher kann man das Script auch noch optimieren, für die Anzahl an Artikel in meinem Fall ist aber keine Optimierung notwendig, da die Laufzeit nur wenige Sekunden beträgt.
Der Export aus SelectLine ist vom ERP Betreiber leicht einzurichten. Die übliche XML Struktur sieht dabei meist so aus:
Dieser Export kann nun via FTP auf den Webserver übertragen werden - z.B. einmal in der Nacht. Auf dem Webserver muss nun per Script einmal am Tag (Nacht) der Import durchlaufen werden. Dieses Script lädt das XML File und aktualisiert den Lagerbestand in Magento2.
Dazu muss im Magento2 die REST Schnittstelle aktiviert sein und ein User zur Berechtigung eingerichtet sein.
Das PHP Script kann so aussehen: (Die BESTAND.xml ist der SelectLine Export)
<?php
// root domain
$rootDomain = "MAGENTO SHOP DOMAIN";
echo "<h3>BESTAND IMPORT</h3>";
$start = time();
if (file_exists('/ftp-folder/BESTAND.xml')) {
$xml = simplexml_load_file('/ftp-folder/BESTAND.xml');
foreach ( $xml->Daten->Datensatz as $ds ) {
$sku = $ds->Feld->Wert->__toString();
$bestand = $ds->Feld[1]->Wert->__toString();
if ($bestand < 0) {
$bestand = 0;
}
$restDomain = $rootDomain."/index.php/rest/V1/products/".$sku."/stockItems/1";
$productData = array("qty" => $bestand);
$data = json_encode(array('stockItem' => $productData));
echo $sku." -- ".$data."<br><br>";
$restCall = CallAPI($restDomain,$data);
unset($productData);
unset($data);
}
} else {
echo('Konnte BESTAND.xml nicht öffnen.');
}
$end = time();
$laufzeit = $end-$start;
echo "<br><br>Laufzeit: ".$laufzeit." Sekunden!";
function CallAPI($url, $data = false) {
$curl = curl_init();
// Authentication:
$authorization = "Authorization: Bearer xyz1234567890 (Hier der Auth Schlüssel)";
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization ));
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
?>
Die Laufzeit für das Script hängt natürlich von der Anzahl der Artikel ab. Sicher kann man das Script auch noch optimieren, für die Anzahl an Artikel in meinem Fall ist aber keine Optimierung notwendig, da die Laufzeit nur wenige Sekunden beträgt.
Kommentare
Kommentar veröffentlichen