Update des Lagerbestands von Extern

Bereits seit längerem hatte ich im Forum von Magento einen Artikel über die Automatisierung von Lägerbeständen geschrieben. Aktuell muss ich dies für einen Kunden wieder aufgreifen, weshalb ich Euch das auf keinen Fall vorenthalten möchte.
Bei Mxperts habe ich bisher das Thema API noch nicht angesprochen. Aus diesem Grund werde ich dieses Tutorial mit der Magento-API realisieren. Die Aufgabenstellung ist zeimlich einfach. Es soll der Warenbestand unseres Onlineshops von einem externen System neu eingelesen werden. Da wir mit fiktiven Daten arbeiten, erstelle ich zuerst ein Script, welches mit Zufallszahlen als Lagerbestand liefert.
Datei: getStock.php
<?php
mt_srand((double)microtime()*1000000);
if ($_POST['sku'] != '') {
echo mt_rand(0, 1000);
} else {
echo 'ERROR';
}
?>
Was wir als nächstes benötigen wir eine Funktion um Post-Requests senden und auswerten zu können.
Datei: fn_post.php
<?php
function PostRequest($url, $referer, $_data) {
// Variables Array in String konvertieren
$data = array();
while(list($n,$v) = each($_data)){
$data[] = "$n=$v";
}
$data = implode('&', $data);
// format --> test1=a&test2=b etc.
// URL parsen
$url = parse_url($url);
if ($url['scheme'] != 'http') {
die('Only HTTP request are supported !');
}
// Host und Path auslesen
$host = $url['host'];
$path = $url['path'];
// Sockt-Verbindung auf Port 80 herstellen
$fp = fsockopen($host, 80);
// Header-Requerst senden
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
$result = '';
while(!feof($fp)) {
// Ergebnisse des Requests auslesen
$result .= fgets($fp, 128);
}
// Socket schliessen
fclose($fp);
// Header und Inhalt trennen
$result = explode("\r\n\r\n", $result, 2);
$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';
// Array zurückgeben
return array($header, $content);
}
?>
Nun haben wir die Möglichkeit Lagerbestände via HTTP-Request von externen Seiten zu beziehen. Sie müssen die Übergabeparameter und die Auswertung nur noch den Bedürfnissen Ihrer Lieferanten anpassen. Nun folgt das Herzstück – die Steuerung über die Magento-API.
Datei: update_stock.php
<?php
require 'fn_post.php'; // Funktion für HTTP-Request
// Template für die Ausgabe
$template = '<div style="background-color:#%s;font-family:Verdana;font-size:11px;margin-bottom:4px;padding:2px;">';
$template .= '<div style="float:left;width:150px;">Position:</div><div>%s</div>';
$template .= '<div style="float:left;width:150px;">Produkt-ID:</div><div>%s</div>';
$template .= '<div style="float:left;width:150px;">Artikelnummer:</div><div>%s</div>';
$template .= '<div style="float:left;width:150px;">alter Lagerbestand:</div><div>%s</div>';
$template .= '<div style="float:left;width:150px;">neuer Lagerbestand:</div><div>%s</div>';
$template .= '<div style="float:left;width:150px;">Lieferbar alt:</div><div>%s</div>';
$template .= '<div style="float:left;width:150px;">Lieferbar neu:</div><div>%s</div>';
$template .= '</div';
$proxy = new SoapClient('http://domain.de/api/soap/?wsdl'); // ÄNDERN
$sessionId = $proxy->login('apiUser', 'apiKey'); // ÄNDERN
// Produktliste auslesen
$products = $proxy->call($sessionId, 'product.list');
$i = 0;
foreach ($products as $product) {
$products_id = $product['product_id'];
$sku = $product['sku'];
$i++;
$data = array('sku' => $sku);
// Lagerbestand extern via HTTP-Request einholen
list($header, $content) = PostRequest("http://seifert.tmedia-shop.de/getStock.php","http://seifert.tmedia-shop.de",$data);
$stock = $content;
// Wenn Bestand > 0 Lieferbar, sonst nicht
if ($stock > 0) { $in_stock = 1; } else { $in_stock = 0; }
// auslesen des alten Lagerbestandes
$old_stock = ($proxy->call($sessionId, 'product_stock.list', $products_id));
// Neuer Lagerbestand und Lieferstatus schreiben
$proxy->call($sessionId, 'product_stock.update', array($products_id, array('qty'=>$stock, 'is_in_stock'=>$in_stock)));
// alternierende Farben für die Ausgabe
if ($i % 2 == 0) { $color = 'DDD'; } else { $color = 'AAA'; }
// Werte ausgeben
printf($template,$color,$i,$products_id,$sku,$old_stock[0]['qty'],$stock,$old_stock[0]['is_in_stock'],$in_stock);
flush;
}
?>
Den Sourcecode habe ich dokumentiert und ich hoffe das ist selbsterklärend. Falls nicht – einfach eine PM an mich senden.
Um die API zu benutzen muss man im Backend zuerst einen Webservice erstellen.
Folgende Zeilen müssen dann im Sourcecode noch angepasst werden:
$proxy = new SoapClient(‘http://domain.de/api/soap/?wsdl‘); // ÄNDERN $sessionId = $proxy->login(’apiUser‘, ’apiKey‘); // ÄNDERN
Die Ausgabe ist dann wie folgt:

Die Ausgabe und das Einlesen des alten Betsandes kann man natürlich weglassen. Ich würde im Livebetrieb ein Log-File erstellen oder einen Mailer mit Reporting.
Viele Grüße
Johannes Teitge


Puh…
das ist ziemlich starker Tobak für mich!
Eine erste Nachfrage: ich habe einen kleinen Laden und einen Magento-Store.
Beide haben ein gemeinsames Lager.
Ich verkaufe etwas über den Magento-Store und bei aktivierter Lagerverwaltung wird automatisch bei jedem Verkauf die entsprchende Anzahl Artikel “ausgebucht”.
Mein Mitarbeiter im Laden, der mit Magento nicht umgehen kann (darf!), hat keine Ahnung davon dass von Artikel A nur noch 7 auf Lager sind, da 11 online verkauft wurden und verschickt werden müssen und verkauft an einen Kunden 15x A, dieser nimmt die Artikel sofort mit.
Wäre es mit dem von Dir beschriebenen System möglich online eine für den Mitarbeiter einfache(!!!) Lagerverwaltung zu führen die er vor der Verkaufszusage einsehen und nach dem Verkauf updaten kann, Magento übernimmt dann den neuen Bestand?
Puh, das war eine ganze menge Text, ich hoffe meine Frage wird klar!
Die Carmen
War diese Antwort hilfreich?
LikeDislikeEs wäre aber doch auch möglich für deinen Mitarbeiter einen Magento-Login anzulegen & Ihm ausschließlich Rechte für den Bereich Lager zuzuweisen oder?
Schon einmal drüber nachgedacht?
Liebe Grüße – Daniel
War diese Antwort hilfreich?
LikeDislike@Kai, welche Lagerverwaltung setzt ihr denn ein? oder gar eine komplette WaWi?
Grüße Thoralf
War diese Antwort hilfreich?
LikeDislikesuper, sowas suche ich. Echt genial das ihr hier soviel postet!
hoffe ich habe soweit alles angelegt… nur eins verstehe ich nicht ganz…
$proxy = new SoapClient(‘http://domain.de/api/soap/?wsdl‘);
api/soap = muss hier noch was erstellt werden oder wie ist dies zu verstehen?
Im Voraus vielen Dank
War diese Antwort hilfreich?
LikeDislikeok das war wohl die ordnerstruktur, jetzt habs ich es verstanden. Nur erscheint eine weisse seite.. schade… mache ich wohl was verkehrt
War diese Antwort hilfreich?
LikeDislikeSchau Dir erst mal folgendes an: http://www.magentocommerce.com/wiki/doc/webservices-api/introduction
Über Webdienste->Bewnutzer musst Du zuerst den Zugriff auf die API konfigurieren.
Viele Grüße
Johannes Teitge
War diese Antwort hilfreich?
LikeDislikeHallo Johannes,
das hatte ich schon von Anfang an.Die Berechtigungen für Person / Gruppe habe ich erneut kontrolliert + key.
Nur bekomme ich bei der Ausgabe immer eine blanke Seite.
offline server mamp(mac)
$proxy = new SoapClient(‘http://shop.loc/api/soap/?wsdl‘);
$sessionId = $proxy->login(‘superadmin’, ‘admin1′);
und dann rufe ich im browser:
http://shop.loc/getstock/update_stock.php
irgendwas übersehen?
War diese Antwort hilfreich?
LikeDislikeOk nach langen probieren und einer anderen Input einer anderen Seite..
Bei mir lag der Fehler: SoapClient(’http://shop.loc/api/soap/?wsdl’);
bei mit muss vor dem api noch ein index.php/ stehen… wieso auch immer… sicherlich irgendwo ein config-ding.
gruß
War diese Antwort hilfreich?
LikeDislike