Magento bug, dubbel totaal betaald bedrag oplossing

Door 15 november 2013Tips & Trucs

In Magento (versie 1.7.0.2), athans in de combinatie Magento en de iDEAL checkout module, zit een bug welke het totaal betaald bedrag verdubbeld na het aanmaken van een factuur in de backend. Na onderzoek gedaan te hebben naar deze bug schijnt dit in combinatie te zijn met verschillende betalings-modules, waaronder Paypal en de in mijn geval gebruikte iDEAL module.

Magento totaal betaald dubbel

Het probleem

Deze bug wordt veroorzaakt doordat de betaling geregistreerd wordt door de betalings-module en bij het aanmaken van een factuur nogmaals.

De oplossing

Op het moment dat een betaling geregistreerd wordt zou er gekeken moeten worden of er al een betaling geregistreerd is. Om dit voor elkaar te krijgen dient het “Order Invoice Model” ge-extend te worden waar de “pay” functie in zit. Om dit mooi op te lossen is het verstandig om een module te maken welke enkel die functie override. Een minder nette oplossing welke ik hier bespreek is de hele class kopiëren naar de “local” map en daar de functie aanpassen.

De eerste stap is de class kopiëren: “app/code/core/Mage/sales/model/order/Invoice.php”, maak hierna deze mappen structuur aan in de “local” folder, dus: “app/code/local/Mage/sales/model/order/” en zet de gekopieerde code in een nieuw bestand “Invoice.php”. Hierna de “pay” functie opzoeken en vervangen door:

<?php
/**
 * Pay invoice
 *
 * @return Mage_Sales_Model_Order_Invoice
 */
public function pay()
{
    if ($this->_wasPayCalled) {
        return $this;
    }
    $this->_wasPayCalled = true;

    $invoiceState = self::STATE_PAID;
    if ($this->getOrder()->getPayment()->hasForcedState()) {
        $invoiceState = $this->getOrder()->getPayment()->getForcedState();
    }

    $this->setState($invoiceState);

    $this->getOrder()->getPayment()->pay($this);

    if ($this->getOrder()->getTotalPaid() == $this->getOrder()->getGrandTotal()) {
        $this->getOrder()->setTotalPaid( $this->getOrder()->getTotalPaid() );
        $this->getOrder()->setBaseTotalPaid( $this->getOrder()->getBaseTotalPaid() );
    } else {
        $this->getOrder()->setTotalPaid( $this->getOrder()->getTotalPaid() + $this->getGrandTotal() );
        $this->getOrder()->setBaseTotalPaid( $this->getOrder()->getBaseTotalPaid() + $this->getBaseGrandTotal() );
    }

    Mage::dispatchEvent('sales_order_invoice_pay', array($this->_eventObject=>$this));
    return $this;
}

Toekomst

Of, en wanneer deze bug door Magento opgelost gaat worden is onbekend, maar mocht het opgelost worden in een toekomstige versie en je hebt bovenstaande oplossing gebruikt dan kan je tegen problemen aanlopen omdat mogelijk de class, of alleen de “pay” functie gewijzigd is. Nogmaals, het is aan te raden enkel de “pay” functie te override-n door zelf een module te maken!