Shopware-Plugin: Dropshipping mit XML Export-Plugin
Mit der Version 0.4.1 ist nun viel mehr in dem Bereich möglich (Veröffentlichung folgt in den nächsten Tagen)
Als erstes Beispiel wie man das Plugin nicht nur dafür verwenden kann für das eigene ERP Bestellungen zu exportieren, habe ich hier erotikgrosshandel.de . Deren Schnittstellen-Doku ist ziemlich gut und sie haben ein sehr minimalistisches Format, so dass man relativ schnell zum Ziel kommt. Die Voraussetzung waren:
- Ein eigenes passendes XSLT-Template (nach deren Doku)
- Der ApiClient muss FORM-Data per Post senden können (nicht nur wie bisher JSON)
- CronJob und CLI-Command müssen den Push an eine API auslösen
- Das Model muss die Lieferanten spezifischen Bestellnummern der Artikel enthalten (Puchase-Preise kamen gleich mit dazu...)
Das ganze war dann eigentlich nur viel Kleinkram und der POST als FORM-Data. War also an sich relativ schnell umgesetzt und lies sich gut testen.
Eingestellt muss sein:
- Format: eigene XSLT-Transformation
- Den Pfad zur eigenen XSLT angeben (absoluter Pfad vom /-Root aus!)
- Export-Pfad ist nicht nötig, aber sollte man doch setzen, falls man als Kontrolle die XML-Daten doch selbst noch mal vorhalten möchte (auch hier der absolute Pfad)
- nie automatisch exportieren (nur per CLI, CronJob oder API), man sollte den CronJob verwenden
- CronJob soll nur Bestellungen mit dem Status 0 und 12 (offen und vollständig bezahlt) verarbeiten: "0,!1,!2,!3,!4,!5,!6,!7,!8,!9,!10,!11,12,!13,!14"
- nach dem Export auf Status 1 (in Bearbeitung) setzen
- Host und URL setzen für erotikgrosshandel.de
- Content-Feldname auf "data" ändern
- Post-Format auf "FORM" setzen, damit in "data" die XML-Daten zu finden sind
Damit sendet er per CLI oder CronJob alle 0+12 Bestellungen im Lieferanten eigenen XML-Format an deren Schnittstelle und setzt danach die Bestellung auf 1+12, damit sie beim nächsten Durchlauf kein weiteres mal übertragen wird.
Ein passendes XSLT kann so aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<orderdetails>
<!-- replace with your data -->
<customerdetails>
<email>testaccount@edc-internet.nl</email>
<apikey>7651320RK8RD972HR966Z40752DDKZKK</apikey>
<output>advanced</output>
</customerdetails>
<!-- shopware customer -->
<receiver>
<own_ordernumber><xsl:value-of select="order/number"/></own_ordernumber>
<name><xsl:value-of select="order/shipping/firstName"/> <xsl:value-of select="order/shipping/lastName"/></name>
<street><xsl:value-of select="order/shipping/streetSimple"/></street>
<house_nr><xsl:value-of select="order/shipping/houseno"/></house_nr>
<postalcode><xsl:value-of select="order/shipping/zipCode"/></postalcode>
<city><xsl:value-of select="order/shipping/city"/></city>
<xsl:if test="order/shipping/country/iso = 'NL'">
<country>1</country>
</xsl:if>
<xsl:if test="order/shipping/country/iso = 'BE'">
<country>2</country>
</xsl:if>
<xsl:if test="order/shipping/country/iso = 'DE'">
<country>3</country>
</xsl:if>
<!-- TODO complet -->
<extra_email><xsl:value-of select="order/customer/email"/></extra_email>
</receiver>
<products>
<xsl:for-each select="order/details/detail">
<xsl:if test="purchaseInfo/supplierNumber != ''">
<artnr><xsl:value-of select="purchaseInfo/supplierNumber"/></artnr>
</xsl:if>
</xsl:for-each>
</products>
</orderdetails>
</xsl:template>
</xsl:stylesheet>
Den CronJob auf 10min stellen und dann sollten alle 10 Minuten alle "offenen" Bestellungen an den Server übertragen.
Über XSLT-Dateien kann man in anderen Fällen natürlich dann auch andere Formate wie GS1 oder OCI implementieren. Um die Daten zu den anderen Systemen übertragen zu können stehen der API-Client, Emails, Abruf über die Shopware-API oder der Export als Datei (und dann Übertragung per FTP oder SCP) zur Verfügung.
In den nächsten Wochen steht bei mir auf dem Plan, Bestellungen konsolidieren zu können, so dass bei einem CronJob-Lauf alle 2h nicht alle Bestellungen einzeln übertragen werden müssen, sondern auch zusammen gefasst werden können, wenn die Bestellungen für den selben Empfänger vorgesehen sind.