Magento: Bestellungen exportieren

Mit Magento Bestellungen exportieren ist einfach. Magento bietet bereits eine Übersicht und eine Exportfunktion für alle getätigten Bestellungen. Damit kann man auch bequem eine Auswahl an Bestellungen als CSV Datei speichen und z.B. in ein Buchhaltungsprogramm einspielen. Natürlich reichen diese Informationen meistens nicht aus und die Buchhalt ung hat spezielle Anforderungen. Der eigentlich bessere Weg wäre, Magento direkt an die Buchhaltungssoftware anzubinden. Nur ist das wieder eine Zeit- sowie Geldfrage. Einen günstigen und schnellen Weg, Bestelldaten nach speziellen Wünschen zu exportieren, zeige ich Euch hier.

Ein normaler Export für Bestellungen würde wie folgt aussehen:

"Bestellung #","Bestellt am","Rechnung an","Versand - Name","Gesamt (Basiswährung)","Gesamt (Fremdwährung)",Status
100000815,"01.01.2017 12:00:00","Max Mustermann","Max Mustermann","49,99 €","49,99 €",Complete

Das sind jetzt aber etwas wenig Informationen und diese reichen der Buchhaltung nicht. Um also einen speziellen Export zu erzeugen, benötigen wir zunächt die Magento Erweiterung Custom Export Orders. Installieren wir uns diese Extenstion, wird das Dropdown Menü der Aktionen um den Punkt “Custom Export Data to CSV” erweitert.

Verfügbare Informationen in template.csv

Jetzt hat man Zugriff auf diese Attribute, die man über die Datei /app/code/local/Lema21/CustomExport/Template/template.csv abrufen kann:

adjustment_negative, adjustment_positive, applied_rule_ids, base_adjustment_negative, base_adjustment_positive, base_currency_code, base_discount_amount, base_discount_canceled, base_discount_invoiced, base_discount_refunded, base_grand_total, base_hidden_tax_amount, base_hidden_tax_invoiced, base_hidden_tax_refunded, base_shipping_amount, base_shipping_canceled, base_shipping_discount_amount, base_shipping_hidden_tax_amnt, base_shipping_hidden_tax_amount, base_shipping_incl_tax, base_shipping_invoiced, base_shipping_refunded, base_shipping_tax_amount, base_shipping_tax_refunded, base_subtotal, base_subtotal_canceled, base_subtotal_incl_tax, base_subtotal_invoiced, base_subtotal_refunded, base_tax_amount, base_tax_canceled, base_tax_invoiced, base_tax_refunded, base_to_global_rate, base_to_order_rate, base_total_canceled, base_total_due, base_total_invoiced, base_total_invoiced_cost, base_total_offline_refunded, base_total_online_refunded, base_total_paid, base_total_qty_ordered, base_total_refunded, billing_address_id, can_ship_partially, can_ship_partially_item, coupon_code, coupon_rule_name, created_at, customer_dob, customer_email, customer_firstname, customer_gender, customer_group_id, customer_id, customer_is_guest, customer_lastname, customer_middlename, customer_note, customer_note_notify, customer_prefix, customer_suffix, customer_taxvat, discount_amount, discount_canceled, discount_description, discount_invoiced, discount_refunded, edit_increment, email_sent, entity_id, ext_customer_id, ext_order_id, forced_do_shipment_with_invoice, forced_shipment_with_invoice, gift_message_id, global_currency_code, grand_total, hidden_tax_amount, hidden_tax_invoiced, hidden_tax_refunded, hold_before_state, hold_before_status, increment_id, is_gogreen, is_virtual, order_currency_code, original_increment_id, payment_auth_expiration, payment_authorization_amount, payment_authorization_expiration, paypal_ipn_customer_notified, protect_code, quote_address_id, quote_id, relation_child_id, relation_child_real_id, relation_parent_id, relation_parent_real_id, remote_ip, shipping_address_id, shipping_amount, shipping_canceled, shipping_description, shipping_discount_amount, shipping_hidden_tax_amount, shipping_incl_tax, shipping_invoiced, shipping_method, shipping_refunded, shipping_tax_amount, shipping_tax_refunded, state, status, store_currency_code, store_id, store_name, store_to_base_rate, store_to_order_rate, subtotal, subtotal_canceled, subtotal_incl_tax, subtotal_invoiced, subtotal_refunded, tax_amount, tax_canceled, tax_invoiced, tax_refunded, total_canceled, total_due, total_invoiced, total_item_count, total_offline_refunded, total_online_refunded, total_paid, total_qty_ordered, total_refunded, updated_at, weight, x_forwarded_for

Eine lange Liste. Wobei man hier noch ein Präfix (customer, order oder address) benötigt, je nach dem, aus welchem Umfeld das Attribut kommt. Also bei dem Nachnamen des Kunden verwenden wir customer.customer_lastname, bei der Gesamtsumme order.total_invoiced.

Die mitgeliederte Datei template.csv sieht folgendermaßen aus:
order.increment_id|order.status|order.created_at|customer.name|customer.email|customer.taxvat|address.street_1|address.street_2|address.street_3|address.street_4|address.city|address.region|address.postcode|address.telephone|order.shipping_description

Wunderbar. Aber das reicht der Buchhaltung nicht – war ja klar.

In meinem Fall hatte der Buchhaltung des Kunden andere Anforderungen: Belegdatum, Buchungstext, Umsatz, Konto Soll, Konto Haben, Kostenstelle Haben, Belegnummer, Steuerart, Steuercode. Und das pro bestelltem Produkt.

GenerateCSV.php anpassen

Um das zu erreichen, passen wir zunächst die Datei template.csv an und ziehen uns die relevanten Daten:order.created_at|customer.customer_firstname|customer.customer_lastname|order.total_invoiced|order.tax_invoiced|order.order_id|order.total_item_count|customer.customer_email

Und jetzt wird’s spannend. Die Datei /app/code/local/Lema21/CustomExport/Service/GenerateCSV.php muss jetzt verändert werden. Hier vorab der komplette Source Code:

 

class Lema21_CustomExport_Service_GenerateCSV {

    private $_orderIds;
    private $_collectionOrders;
    private $_contentCSV;
    private $_customerNames;

    public function __construct($ordersId) {
        $this->_orderIds = $ordersId;
    }

    private function _loadOrderObjects()
    {
        $this->_collectionOrders = array();
        
        foreach($this->_orderIds as $id) {
            $instance = Mage::getModel("sales/order")->load($id);

            $order_data = Mage::getModel('sales/order')->loadByIncrementId($instance->getData("increment_id"));
            $this->_customerNames[$instance->getData("entity_id")] = $order_data->getBillingAddress()->getName();
            array_push($this->_collectionOrders, $instance);
        }
    }

    private function _prepareData($templateLine)
    {
        // headline
        $this->_contentCSV = "Belegdatum;Buchungstext;Umsatz;Konto Soll;Belegnummer;Steuerart;Steuercode;\n";
        
        
        foreach($this->_collectionOrders as $order) {
            $order->getCustomerGroupId();

            if ($order->hasInvoices()) {
                $invIncrementIDs = array();
                foreach ($order->getInvoiceCollection() as $inv) {
                    $invIncrementIDs[] = $inv->getIncrementId();
                }
            }
            date_default_timezone_set(Mage_Core_Model_Locale::DEFAULT_TIMEZONE);
            $invoice = Mage::getModel('sales/order_invoice')->loadByIncrementId($invIncrementIDs[0]);
            $invoice_date = Mage::getModel('core/date')->date($invoice->getCreatedAt());
            $invoice_id = $invIncrementIDs[0];
            $tax = 0;
            $customer = trim( utf8_decode( $this->_customerNames[ $order->getData( "entity_id" ) ] ) );
            
            // je nach Zahlungsmethode wird das Sachkonto ausgewählt
            $payment_method = $order->getPayment()->getMethodInstance()->getCode();

            $konto = "Bank"; // das Standardkonto
            if ( $payment_method == "banktransfer" ) { // Überweisung
                $konto = "Bank";
            } elseif ( $payment_method == "paypal_express" ) { // PayPal
                $konto = "PayPal";
            } elseif ( $payment_method == "cashondelivery" ) { // Rechnung / Nachnahme
                $konto = "Bank";
            }

            // weitere mögliche Zahlungsmethoden: free | checkmo
            
            // sollte man mal auf die Kundengruppe zurück greifen müssen: $customer_group = $order->getCustomerGroupId();
            
            // alle Produkte einer Bestellung abrufen
            $items = $order->getAllVisibleItems();
            // pro Produkt eine Zeile
            foreach ( $items as $item ) {
                // Datum
                $this->_contentCSV .= "\"" . explode( " ", $invoice_date )[0] . "\";";
                // customer name (workaround, wenn der Kundenname guest ist)
                $this->_contentCSV .= "\"" . $customer . "\";";
                // Gesamtpreis Produkt
                $this->_contentCSV .= "\"" . preg_replace( "/\./", ",", $item->getData( "row_total_incl_tax" ) ) . "\";";
                // sachkonto
                $this->_contentCSV .= "\"" . $konto . "\";";
                // Belegnummer
                $this->_contentCSV .= "\"" . $this->getInvoiceId($item)[0] . "\";";
                // Steuer
                if ( (int)$item->getData("tax_percent" ) == 7 ) {
                    $this->_contentCSV .= "\"UH\";\"2\";";
                } elseif ( (int)$item->getData("tax_percent" ) == 19 ) {
                    $this->_contentCSV .= "\"UH\";\"101\";";
                } elseif ( (int)$item->getData("tax_percent" ) == 0 ) {
                    $this->_contentCSV .= "\"\";\"0\";";
                }
                $tax = (int)$item->getData("tax_percent" );
                $this->_contentCSV .= $item->getData("shipping_amount") . ";";
                // end of line
                $this->_contentCSV .= "\n";    
            }
            // und die Versandkosten
            $this->_contentCSV .= "\"" . explode( " ", $invoice_date )[0] . "\";";
            $this->_contentCSV .= "\"" . $customer . "\";";
            $this->_contentCSV .= "\"" . preg_replace( "/\./", ",", $order->getData( "shipping_incl_tax" ) ) . "\";";
            $this->_contentCSV .= "\"" . $konto . "\";";
            $this->_contentCSV .= "\"" . $invoice_id . "\";";
            if ( $tax == 7 ) {
                $this->_contentCSV .= "\"UH\";\"2\";";
            } elseif ( $tax == 19 ) {
                $this->_contentCSV .= "\"UH\";\"101\";";
            } elseif ( $tax == 0 ) {
                $this->_contentCSV .= "\"\";\"0\";";
            }
            $this->_contentCSV .= "\n"; 
            
            /*           
            // Datum
            $this->_contentCSV .= "\"" . explode( " ", $order->getData("created_at") )[0] . "\";";
            
            // Nettobetrag
            $this->_contentCSV .= "\"" . $order->getData("subtotal_invoiced") . "\";";
            // Steuerbetrag
            $this->_contentCSV .= "\"" . $order->getData("tax_invoiced") . "\";";
            // Gesamtbetrag
            $this->_contentCSV .= "\"" . $order->getData("total_invoiced") . "\";";
            */
            
        }
    }
    
    
    private function getInvoiceId( $item ) {
        $invIncrementIDs = [];
        $order = $item->getOrder();
        if ($order->hasInvoices()) {
            $invIncrementIDs = array();
            foreach ($order->getInvoiceCollection() as $inv) {
                $invIncrementIDs[] = $inv->getIncrementId();
            }
        }
        return $invIncrementIDs;
    }
    
    public function call()
    {
        $this->_loadOrderObjects();
        
        $templateLine = Mage::helper("custom_export")->loadTemplate();

        $this->_prepareData($templateLine);

        return $this->_contentCSV;
    }

}

Die Funktion _loadOrdersObjects() habe ich verändert, da man bei einem Gastkonto keinen Zugriff auf den Namen hat, deswegen habe ich Variable $_customerNames eingefügt und befülle diese während des Loops.

Innerhalb der Funktion _prepareData() habe ich entsprechende Kommentare eingefügt, welche Codezeile was macht. Besonders wichtig zu erwähnen ist diese Zeile:

$customer = trim( utf8_decode( $this->_customerNames[ $order->getData( "entity_id" ) ] ) );

Hierbei greife ich auf die zuvor befüllte Variable $_customerNames zurück, die auch die Namen der Gäste enthält.

 

FAZIT

Mit Custom Export Orders von Lema21 kann man alle Attribute einer Bestellung exportieren. Allerdings reicht dies meistens nicht aus, um allen Bedürfnissen des Kunden gerecht zu werden. Hier muss man noch ins Detail gehen und die Datei GenerateCSV.php entsprechend anpassen. Aber diese Erweiterung ist eine sehr praktische Funktion.

Bitte bewerten Sie meinen Beitrag

Alexander Jungwirth ist Webentwickler bei einem Ingolstädter Verlagshaus und ist Inhaber der Firma Webdesign Manching. Seine Leidenschaft ist HTML, seine Passion PHP, seine Hingabe CSS und seine Inbrunst jQuery. Alexander lebt in Manching mit seiner liebevollen Frau und seinen wunderbaren Kindern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.