Magento dubbele betalingsbug opgelost

In Magento (1.6.1.2) zit een vervelende bug. Als je klant betaalt met een external payment provider zoals Paypal of iDEAL, dan wordt op de uiteindelijke factuur het totaal betaalde bedrag verdubbeld weergegeven.

Dit kan je als volgt oplossen:

Wijzig de pay() function in app/code/core/mage/sales/model/order/invoice.php als volgt.

Uiteraard beter om het in je local of community omgeving te doen :)

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);
// Check if order is already paid for. If so, it was paid for with an external payment provider
// so do not add Grandtotal to TotalPaid. This is a bugfix for a bug in the payment registration in Magento imho
// Fixed by Ed de Tollenaer http://www.webshops4all.nl
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;
}

Voer hierna de volgende SQL statements op je database uit in PHPMyAdmin:

UPDATE sales_flat_order SET total_paid = total_invoiced WHERE total_paid > total_invoiced
UPDATE sales_flat_order SET base_total_paid = base_total_invoiced WHERE base_total_paid > base_total_invoiced
UPDATE sales_flat_order_grid SET base_total_paid = base_grand_total WHERE base_total_paid > base_grand_total
UPDATE sales_flat_order_grid SET total_paid = grand_total WHERE total_paid > grand_total

Ga daarna naar Magento->Rapporten->Refresh statistics en refresh de lifetime statistics.

Je kan ook alle tabellen herindexeren, maar ik weet niet zeker of dit nodig is.

Hierna zal je bij Magento->Rapporten->Verkopen->gefactureerd zien dat alle betalingen netjes zijn bijgewerkt.

Uitleg:

Als een externe payment provider wordt gebruikt, wordt het betaalde bedrag al meteen opgenomen na succesvol afronden van de payment transactie. In dit geval iDEAL. Bij het aanmaken van de invoice wil magento deze betaling nogmaals registreren, maar dat is al gedaan. Ik heb een controle toegevoegd waarbij tijdens het aanmaken van de factuur eerst wordt gekeken of er al betaald is. Zo ja, dan wordt de betaling niet nogmaals geregistreerd.

Deel dit met anderen

Ed de Tollenaer

Geef uw reactie