Laut Studie von ibi research, nimmt die Zahlart Rechnung zu 81% einen sehr großen Einfluß auf den Umsatz in Onlineshops. Aus diesem Grund greifen immer mehr Onlinehändler zur Zahlart Rechnung. Die Einschränkungen zur Unterstützung des Risikomagaments sind für diese Zahlart vielfältig.
Der eine möchte dass Kunden eine Mindestanzahl Aufträgen mit einem Warenwert der Summe X abgeschlossen haben. Andere haben einen Mindestbestellwert für Rechnungen oder begrenzen die Zahlart Rechnung auf einen Maximalbetrag.

Aus diesem Grund haben wir das Zahlungsmodul Mxperts – Invoice mit der Version 1.0.5 um einige Features erweitert. Folgende Einstellungen können nun vorgenommen werden:
- Rechnung nur für bestimmte Kundengruppen
- Rechnung nur bei einer Mindestanzahl abgeschlossener Aufträge
- Rechnung nur bei einem Mindestwarenwert abgeschlossener Aufträge
- Rechnung nur ab einem Mindestbestellwert
- Rechnung nur bis zu einem Maximalbestellwert

Das Modul kann über das Magento-Backend installiert/aktualisiert werden und ist auf Magento-Connect verfügbar.
SVN: http://www.mxperts.de/svn/mxperts-invoice/



Infos zur Programmierung:
Die zusätzlichen Einstellungen in unserem Rechnungsmodul sind auch für andere Zahlverfahren interessant. Deshalb werde ich diese Optionen hier im Detail erläutern.
Wer ein Zahlungsmodul entwickeln möchte, kann mit unseem Tutorial Payment-Modul “Rechnung” – Teil1 (Basismodul) beginnen.

Das Model unseres Payment-Moduls ist von der Klasse Mage_Payment_Model_Method_Abstract abgeleitet. Den PHP-Code dieser Klasse finden Sie in der Datei app\code\core\Mage\Payment\Model\Method\Abstract.php. Nehmen Sie sich die Zeit, dann sehen Sie welche Funktionen Sie überschreiben und einsetzen können.

Um die Anzeige eines Payment-Modul zu steuern benutzen wir die Funktion canUseCheckout(). Diese wird in unsere Klasse integriert und mit den notwendigen Abfragen ergänzt. Damit wir in Abhängigkeit zu bereits abgeschlossenen Aufträgen reagieren können, müssen die Kundenaufträge eingelesen werden. Dies erfolgt mit folgender Funktionen:

    public function initOrders() {
        $this->_orders = Mage::getResourceModel('sales/order_collection')
            ->addAttributeToSelect('*')
            ->joinAttribute('shipping_firstname', 'order_address/firstname', 'shipping_address_id', null, 'left')
            ->joinAttribute('shipping_lastname', 'order_address/lastname', 'shipping_address_id', null, 'left')
            ->addAttributeToFilter('customer_id', Mage::getSingleton('customer/session')->getCustomer()->getId())
            ->addAttributeToFilter('status', Mage_Sales_Model_Order::STATE_COMPLETE)
            ->addAttributeToFilter('state', array('in' => Mage::getSingleton('sales/order_config')->getVisibleOnFrontStates()))
            ->addAttributeToSort('created_at', 'desc')
            ->load();
    }

Beachten Sie den Filter STATE_COMPLETE, damit werden nur abgeschlossene Aufträge abgefragt.
Nachdem uns die Aufträge vorliegen, können wir die Anzeige des Rechnungsmoduls in Abhängigkeit abgeschlossener Aufträge sehr einfach realisieren. Denn wir müssen einfach nur die Anzahl der Aufträge ermitteln.

    public function ordersCount() {
      return count($this->_orders);
    }

Für die Begrenzung des Auftragswertes ermitteln wir den Bruttopreis der Produkte aller abgeschlossenen Bestellungen. Dafür ist die Funktion ordersValue() zuständig.

    public function ordersValue() {
      $total = 0;
      if (count($this->_orders) > 0) {
        foreach($this->_orders as $order) {
          $total += $order->getbase_subtotal();
        }
      }
      return $total;
    }

Nun folgen noch die Abfragen auf den aktuellen Warenkorb – genauer gesagt Mindest- und Maximalbestellwert. Dafür ermitteln wir den Gesamtbetrag aller Produkte aus dem Warenkorb.

    public function initAmount() {
      $sess = Mage::getSingleton('checkout/session');
      $items = $sess->getQuote()->getItemsCollection()->getItems();
      $value = 0;
      foreach($items as $item) {
        $value += $item->getCalculationPrice() * $item->getQty();
        $value += $item->getTaxAmount();
      }
      $this->_amount = $value;
    }

Schlußendlich können wir die canUseCheckout() mit den von uns erstellten Funktionen fertigstellten.

    public function canUseCheckout()
    {
        $canUse = true;

	      if($this->getConfigData('customergroups') != '') {
          $customer_groups = explode(',',$this->getConfigData('customergroups'));
          $activecustomer_groups_id = $this->getCurrentCustomerGroup();
          if (!in_array($activecustomer_groups_id,$customer_groups)) {
            $canUse = false;
          }
        }

        if ($canUse):
          $this->initOrders();
          $canUse = ( $this->ordersCount() >= (int)$this->getConfigData('orderscount') );
        endif;

        if ($canUse):
          $canUse = ( $this->ordersValue() >= (float)$this->getConfigData('ordersamount') );
        endif;

        if ($canUse):
          $this->initAmount();
          if ((int)$this->getConfigData('minamount') > 0) {
          $canUse = ( $this->_amount >= (float)$this->getConfigData('minamount') );
          }
        endif;

        if ($canUse):
          if ((int)$this->getConfigData('maxamount') > 0) {
          $canUse = ( $this->_amount < (float)$this->getConfigData('maxamount') );
          }
        endif;

        return $canUse;
	  }

Über die system.xml haben wir unser Modul fürs Backend erweitert.
invoice_screen

Damit wünsche ich viel Erfolg beim Einsatz mit dem Rechnungsmodul. Ich hoffe, dass wir eine Anregung für andere Zahlumgsmodule geben konnten.

Viele Grüße
Johannes Teitge