Es gibt verschiedene Situationen, da erlaubt Magento nicht das erstellen einer Rechnung und der Button "Rechnung" wird nicht angezeigt. Folgende Fälle sind denkbar
- Rechnung erstellt für gesamte Bestellung
- Bestellung geschlossen
- Gutschrift erstellt für Bestellung
- Abbruch PayPal Zahlungsgateway (-> pending_payment)
- Abbruch PayPal (-> payment_canceled)
Wenn 4. oder 5. vorliegt aber trotzdem Zahlung erfolgt ist, gab ein Problem mit der Kommunikation Zahlungsmodul <--> Magento Shop
Vorstellbar sind Fehler in dem Zahlungsmodul (PayPal, Novalnet, PayOne usw.) oder Abbruch der Verbindung Zahlungsanbindung mit dem Magento Shop.
Payment Canceled / Zahlungsabruch
Geetzt der Fall Sie haben einen Zahlungsabruch im Magento eCommerce Shop aber z. B. PayPal zeigt trotzdem einen Zahlungeingang. Dann blockieren folgende Datenbank Tabellen die Möglichkeit eine Rechnung zu erstellen.
sales_flat_order sales_flat_order_item
MySQL Commands Canceled rückgängig
Der nachfolgende Ansatz ist mit Vorsicht zu genießen, da riskant. Die Regel: Backup - bzw. vorher denken, dann [enter] drücken.
Schritt 1
Gehen Sie sicher, dass Sie die richtige Order (Bestellung) bearbeiten. Angenommen die Bestellungsnummer ist 100
SELECT * FROM sales_flat_order WHERE increment_id=100;
Schritt 2
Vom Ergebnis, lesen Sie den Wert der entity_id aus. Alternativ kann man das in der URL im ShopAdmin auslesen. Wir nehmen an die entity_id ist 99.
Zuerst setzen wir die Felder mit den canceled werten auf NULL
UPDATE sales_flat_order SET base_discount_canceled=NULL, base_shipping_canceled=NULL, base_subtotal_canceled=NULL, base_tax_canceled=NULL, base_total_canceled=NULL, discount_canceled=NULL, shipping_canceled=NULL, subtotal_canceled=NULL, tax_canceled=NULL, total_canceled=NULL WHERE entity_id=99;
Das reicht aber nicht, das in der Datenbank Tabelle sales_flat_order_item Einträge die Freigabe des Buttons "Rechnung" sperrt. Aufgepasst hier wird nicht nach entity_id sondern nach order_id eingeschränkt.
UPDATE sales_flat_order_item SET qty_canceled='0', tax_canceled=NULL WHERE order_id=99;
Schritt 3
Unter Umständen stimmen jetzt noch nicht die Werte für den "state". Diese müssen auch geändert werden, da man ggf. nicht fortfahren kann mit der Bearbeitung der Bestellung.
PHP und Magento Model / API
Bei dieser besseren Lösung platziert man eine separate PHP Datei (z. B. setBackCanceled.php) in dem Magento Root Verzeichnis. Es muss der Wert incrementID angepasst werden.
<?php require_once '../app/Mage.php'; $storeId = Mage_Core_Model_App::ADMIN_STORE_ID; Mage::app()->setCurrentStore($storeId); Mage::app('admin'); umask(0); error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 1); $incrementId = 100; $order = Mage::getModel('sales/order')->loadByIncrementId($incrementId); $orderState = $order->getState(); echo('State of ' . $incrementId . ' is:"' . $orderState . '"'); // set back to processing $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true); $order->addStatusHistoryComment('Programatically changed state from "' . $orderState . '" to "PROCESSING"'); // set back canceled amount in table sales_flat_order_item foreach ($order->getAllItems() as $item) { $item->setQtyCanceled(0); $item->save(); } ?>
Beachten
Das manuelle manipulieren der Order Datensätze kann Fehler im Lebenszyklus einer Bestellung erzeugen. Man sollte diese Lösung nur machen, sofern erforderlich.
Fazit
Sollte der Button "Rechnung" oder Rechnung zu erstellen nicht möglich sein, weil z. B. ein ein Zahlungsmodul, die Zahlung als "abgebrochen" markiert hat obwohl bezahlt, kann das gelöst werden.
Werte in den Tabellen sales_flat_order, sales_flat_order_item müssen geändert werden. Der Weg über MySQL Commands außerhalb der Magento 1 API ist weniger elegant aber effizient. Eine sichere Lösung ist der Aufruf vom Order Oject und die Anwendung der Magento API Methoden.