Magento Rechnung erstellen geht nicht

Es gibt verschiedene Situationen, da erlaubt Magento nicht das erstellen einer Rechnung und der Button "Rechnung" wird nicht angezeigt. Folgende Fälle sind denkbar

  1. Rechnung erstellt für gesamte Bestellung
  2. Bestellung geschlossen
  3. Gutschrift erstellt für Bestellung
  4. Abbruch PayPal Zahlungsgateway (-> pending_payment)
  5. 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.