Skip to content

Instantly share code, notes, and snippets.

@vanilla-thunder
Created February 18, 2018 13:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vanilla-thunder/2ae7bb67d93c5aa82cc0860292c57281 to your computer and use it in GitHub Desktop.
Save vanilla-thunder/2ae7bb67d93c5aa82cc0860292c57281 to your computer and use it in GitHub Desktop.
OXID eShop Bestellungen als XML exportieren
#!/opt/php-5.6.30/bin/php
<?php
/** Aufruf:
* ./export.php [einstellung]
* Einstellungen: "neu", heute", "gestern" und "alle"
*/
/* ********** configuration ********** */
$sShopRoot = "../dev/"; // Pfad zum Shop
$sExportDir = dirname(__FILE__); // Zielverzeichnis für XML Dateien
/* *********************************** */
require_once $sShopRoot . "/bootstrap.php";
// Aufrufparameter
$config = ($argv[1]) ? $argv[1] : "neu";
if ($config == "neu") export(getLastExportDate(), date("Y-m-d"), true, false); // nur unexportierte Bestellungen seit dem letzten Export
elseif ($config == "heute") export(date("Y-m-d"), date("Y-m-d"), false, true);
elseif ($config == "gestern") export(date("Y-m-d", time() - 86400), date("Y-m-d", time() - 86400), false, true);
elseif ($config == "alle") export("0000-00-00", date("Y-m-d"), false, true); // für Initialexport oder sowas
echo "\nXML Export ist durchgelaufen\n\n";
/**
* Damit exportierte Bestellungen markiert werden können, wird ein neues Feld in der Tabelle oxorder benötigt:
* ALTER TABLE `oxorder` ADD `EXPORTED` TINYINT(1) NOT NULL DEFAULT '0'
*
* $von - datum
* $bis - datum
* $markexported - true | false - sollen exportierte Bestellungen markiert werden?
* reexport muss true sein um bereits exportierte Bestellungen nochmal zu exportieren
*/
function export($von, $bis, $markexported = false, $reexport = false)
{
/* check for valid Y-m-d dates */
if (!(preg_match("/^[0-9]{4}-(0[0-9]|1[0-2])-(0[0-9]|[1-2][0-9]|3[0-1])$/", $von) && preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $bis)))
{
echo "\nDatum ist ungültig: $von - $bis \n\n";
exit(1);
}
// bei Reexport nie etwas an Exportmakrierung ändern
//if ($reexport) $markexported = false;
// OXID Liste mit Bestellungen
/** @var oxList _bestellungen */
$_bestellungen = oxNew('oxlist');
$_bestellungen->init("oxorder");
$_bestellungen->selectString("SELECT * FROM oxorder WHERE oxorderdate BETWEEN '$von 00:00:00' AND '$bis 23:59:59' " . ($reexport ? "" : "AND EXPORTED != 1") . " ORDER BY oxorderdate ASC");
// Wenn es keine Bestellungen gab generiere keine DOMDocuments damit auch keine leeren XML-Dateien generiert werden
if ($_bestellungen->count() == 0)
{
echo "\nes gab nichts zu exportieren\n\n";
exit(1);
}
// XML-Dokumente vorbereiten
$xml = (object)[
"AufDOM" => new DOMDocument,
"AdrDOM" => new DOMDocument
];
$xml->AufDOM->loadXML('<?xml version="1.0" encoding="UTF-8"?><AUFTRAEGE/>');
$xml->AdrDOM->loadXML('<?xml version="1.0" encoding="UTF-8"?><ADRESSEN/>');
$xml->AufDOM->formatOutput = true;
$xml->AdrDOM->formatOutput = true;
$auftraege = $xml->AufDOM->getElementsByTagName('AUFTRAEGE')->item(0);
$adressen = $xml->AdrDOM->getElementsByTagName('ADRESSEN')->item(0);
// alle gefundene Bestellungen durchgehen
foreach ($_bestellungen as $oOrder)
{
$oUser = $oOrder->getOrderUser();
$pos = $xml->AdrDOM->createElement('Rechnungsadresse');
$pos->setAttribute('ID', $oUser->oxuser__oxcustnr->value);
appendElement($xml->AdrDOM, $pos, 'kundennr', $oUser->oxuser__oxcustnr->value);
appendElement($xml->AdrDOM, $pos, "email", $oOrder->oxorder__oxbillemail->value);
appendElement($xml->AdrDOM, $pos, 'anrede', $oOrder->oxorder__oxbillsal->value);
appendElement($xml->AdrDOM, $pos, 'vorname', $oOrder->oxorder__oxbillfname->value);
appendElement($xml->AdrDOM, $pos, 'nachname', $oOrder->oxorder__oxbilllname->value);
appendElement($xml->AdrDOM, $pos, 'strasse', $oOrder->oxorder__oxbillstreet->value . " " . $oOrder->oxorder__oxbillstreetnr->value);
appendElement($xml->AdrDOM, $pos, 'plz', $oOrder->oxorder__oxbillzip->value);
appendElement($xml->AdrDOM, $pos, 'ort', $oOrder->oxorder__oxbillcity->value);
appendElement($xml->AdrDOM, $pos, 'geburt', ($oUser->oxuser__oxbirthdate == "0000-00-00" ? "" : $oUser->oxuser__oxbirthdate->value));
appendElement($xml->AdrDOM, $pos, 'telefon', $oOrder->oxorder__oxbillfon->value);
appendElement($xml->AdrDOM, $pos, 'fax', $oOrder->oxorder__oxbillfax->value);
$adressen->appendChild($pos);
// alternative Lieferanschrift
if ($oOrder->oxorder__oxdelstreet->value !== "" && $oOrder->oxorder__oxdelstreet->value !== $oOrder->oxorder__oxbillstreet->value && $oOrder->oxorder__oxdelzip->value !== $oOrder->oxorder__oxbillzip->value)
{
$pos = $xml->AdrDOM->createElement('Lieferadresse');
$pos->setAttribute('ID', $oUser->oxuser__oxcustnr->value);
appendElement($xml->AdrDOM, $pos, 'kundennr', $oUser->oxuser__oxcustnr->value);
appendElement($xml->AdrDOM, $pos, 'anrede', $oOrder->oxorder__oxbillsal->value);
appendElement($xml->AdrDOM, $pos, "vorname", $oOrder->oxorder__oxdelfname->value);
appendElement($xml->AdrDOM, $pos, "nachname", $oOrder->oxorder__oxdellname->value);
appendElement($xml->AdrDOM, $pos, "firma", $oOrder->oxorder__oxdelcompany->value);
appendElement($xml->AdrDOM, $pos, "strasse", $oOrder->oxorder__oxdelstreet->value . " " . $oOrder->oxorder__oxdelstreetnr->value);
appendElement($xml->AdrDOM, $pos, "plz", $oOrder->oxorder__oxdelzip->value);
appendElement($xml->AdrDOM, $pos, "ort", $oOrder->oxorder__oxdelcity->value);
appendElement($xml->AdrDOM, $pos, 'telefon', $oOrder->oxorder__oxdelfon->value);
appendElement($xml->AdrDOM, $pos, 'fax', $oOrder->oxorder__oxdelfax->value);
$adressen->appendChild($pos);
}
// Export der Bestelldaten.
$auftrag = $xml->AufDOM->createElement("AUFTRAG");
appendElement($xml->AufDOM, $auftrag, "kundennr", $oUser->oxuser__oxcustnr->value);
appendElement($xml->AufDOM, $auftrag, "bestellnr", $oOrder->oxorder__oxordernr->value);
// Datum der Bestellung
appendElement($xml->AufDOM, $auftrag, "best_am", date_format(date_create($oOrder->oxorder__oxorderdate->value), "Ymd"));
appendElement($xml->AufDOM, $auftrag, "best_zeit", date_format(date_create($oOrder->oxorder__oxorderdate->value), "H:i:s"));
// Zahlungsart
if ($oOrder->oxorder__oxpaymenttype->value)
{
$oPayment = oxNew("oxPayment");
if ($oPayment->load($oOrder->oxorder__oxpaymenttype->value)) appendElement($xml->AufDOM, $auftrag, "zahlart", $oPayment->oxpayments__oxdesc->value);
else appendElement($xml->AufDOM, $auftrag, "zahlart", $oPayment->oxorder__oxpaymenttype->value); // Zahlart existiert wohl nicht mehr
}
else appendElement($xml->AufDOM, $auftrag, "zahlart", "unbekannt"); // Feld ist leer? warum nur?
// Transaktions-ID der externen Bezahldienstanbieter als Referenztext mit übergeben
if ($oOrder->oxorder__oxtransid->value) appendElement($xml->AufDOM, $auftrag, "ref_text", $oOrder->oxorder__oxtransid->value);
// Amazon Payments hat keine Transaktions-ID, aber eine Amazonbestellid
elseif ($oOrder->oxorder__oxpaymenttype->value == "psamazonpayment") appendElement($xml->AufDOM, $auftrag, "ref_text", $oOrder->oxorder__psamazonorderid->value);
// Bezahlen mit Amazon hat eine Amazon Order Reference ID
elseif ($oOrder->oxorder__oxpaymenttype->value == "jagamazon") appendElement($xml->AufDOM, $auftrag, "ref_text", $oOrder->oxorder__jagamazonorderreferenceid->value);
appendElement($xml->AufDOM, $auftrag, "vsk", $oOrder->oxorder__oxdelcost->value);
appendElement($xml->AufDOM, $auftrag, "rabatt", $oOrder->oxorder__oxdiscount->value);
appendElement($xml->AufDOM, $auftrag, "gutschein", $oOrder->oxorder__oxvoucherdiscount->value);
// Artikelexport ==> Positionen im Auftrag
/** @var oxArticle $oArticle */
$oArticles = $oOrder->getOrderArticles();
foreach ($oArticles as $oArticle)
{
$pos = $xml->AufDOM->createElement("POSITIONEN");
appendElement($xml->AufDOM, $pos, "bestellnr", $oOrder->oxorder__oxordernr->value);
appendElement($xml->AufDOM, $pos, "artikelnr", $oArticle->oxorderarticles__oxartnum->value);
appendElement($xml->AufDOM, $pos, "bezeichng", $oArticle->oxorderarticles__oxtitle->value);
appendElement($xml->AufDOM, $pos, "menge", $oArticle->oxorderarticles__oxamount->value);
appendElement($xml->AufDOM, $pos, "preis", str_replace(".", ",", round($oArticle->oxorderarticles__oxnetprice->value, 2)));
appendElement($xml->AufDOM, $pos, "mwst", str_replace(".", ",", round($oArticle->oxorderarticles__oxvatprice->value, 2)));
appendElement($xml->AufDOM, $pos, "mwst_kz", $oArticle->oxorderarticles__oxvat->value);
$auftrag->appendChild($pos);
}
$auftraege->appendChild($auftrag);
$xml->AdrDOM->appendChild($adressen); // Adressdaten an XML DOM anhängen
$xml->AufDOM->appendChild($auftraege); // Auftragsdaten an XML DOM anhängen
// Bestellung als exportiert markieren?
if ($markexported)
{
$oOrder->assign(["oxorder__exported" => 1]);
$oOrder->save();
}
}
// XML speichern
if (!$xml->AdrDOM || !$xml->AufDOM)
{
echo "XML Daten sind nicht vorhanden";
exit(1);
}
global $sExportDir;
$cfg = oxRegistry::getConfig();
$file = $sExportDir . DIRECTORY_SEPARATOR . $von . ($bis && $bis != $von ? "_" . $bis : "");
$adressen = $file . "_adressen.xml";
if (!$fh = fopen($adressen, 'w'))
{
echo "Can't open file: " . $adressen;
exit(1);
}
$stringData = $xml->AdrDOM->saveXML();
fwrite($fh, $stringData);
fclose($fh);
$auftraege = $file . "_auftraege.xml";
if (!$fh = fopen($auftraege, 'w'))
{
echo "Can't open file: " . $auftraege;
exit(1);
}
$stringData = $xml->AufDOM->saveXML();
fwrite($fh, $stringData);
fclose($fh);
return true;
}
function appendElement(&$dom, &$ele, $name, $val)
{
$n = $dom->createElement(strtoupper($name));
// wenn es Probleme mit Sonderzeichen gibt, müssen die Werte ggf in UTF-8 konvertiert werden
// $val = iconv("iso-8859-1", "UTF-8", $val);
$t = $dom->createCDATASection($val);
$n->appendChild($t);
$ele->appendChild($n);
$dom->appendChild($ele);
}
/**
* Datum der neuesten exportierten Bestellung abfragen.
*
* @return Datum im ISO-Format der neuesten exportierten Bestellung
*/
function getLastExportDate()
{
return substr(oxDb::getDb()->getOne("SELECT MIN(oxorderdate) FROM oxorder WHERE exported = 1"), 0, 10);
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment