Magento Rundungsfehler / Paypal

Gepostet am Dezember 23, 2011

PayPal Problem in aktuellen Versionen

In der aktuellen Version wurden die Fehler von der Version 1.4.1 beseitigt. Die komplette Neuinstallation von PayPal und Magento sollte Rundungsfehler an dieser Stelle aus dem Weg geräumt haben. Bei Update-Systemen kommt es ab und an trotzdem zu Rundungsfehlern, da Magento die Preise intern teilweise auf 2 Nachkommastellen rundet und nicht auf 4. Beispiel konfigurierbare Produkte mit Preisen inklusive Mehrwertsteuer.

Ein Weg zur Problembeseitigung ist die folgende:
Datei: /app/code/core/Mage/Core/Model/Store.php

1
2
3
4
public function roundPrice($price)
    {
        return round($price, 2);
    }

ersetzen durch:

1
2
3
4
public function roundPrice($price)
    {
        return round($price, 4);
    }

Wenn das den Fehler nicht behoben hat, ist eine genaue Fehlerbestimmung sehr schwierig, eventuell können auch „Konfigurationsfehler“ verantwortlich sein. Mit folgender Methode können die an PayPal übergebenen Werte einfach auslesen werden, ohne eine Bestellung zu erzeugen.

1. öffnen Sie folgende Datei:

1
/app/code/core/Mage/Paypal/Model/Standard.php

2. suchen Sie in der Datei folgende Funktion

1
public function getStandardCheckoutFormFields()

3. lassen Sie sich die Werte ausgeben und blockieren Sie den Bestellvorgang durch „exit;“

1
2
$result = $api->getStandardCheckoutRequest();
return $result;

ändern in:

1
2
3
4
5
$result = $api->getStandardCheckoutRequest();
echo "<pre>";		
print_r($result);
exit;
return $result;

In der Version 1.4 muss folgende Zeile verändert werden:

1
list($items, $totals, $discountAmount, $shippingAmount) = Mage::helper('paypal')->prepareLineItems($quote, false, true);

ändern in:

1
2
3
4
list($items, $totals, $discountAmount, $shippingAmount) = Mage::helper('paypal')->prepareLineItems($quote, false, true);
echo "<pre>";
print_r($items);
exit;

PayPal Problem bei Magento 1.4.1

Die Tage bin ich jedoch auf ein weiteres Problem in Verbindung mit PayPal gestoßen. Bei einem Betrag von Bsp: 12.50€ im Warenkorb wird ein falsch gerundeter Betrag an PayPal übergeben. Das Problem ist die Delta Rounding Funktion in der Quote/Tax. Die Lösung des Problems ist wie folgt:

1
2
\app\code\core\Mage\Tax\Model\Sales\Total\Quote\Tax.php
Zeile 600-625
1
2
3
4
5
6
7
8
9
10
11
/**
* "Delta" rounding
*/
        $delta      = isset($this->_roundingDeltas[$rateKey]) ? $this->_roundingDeltas[$rateKey] : 0;
        $baseDelta  = isset($this->_baseRoundingDeltas[$rateKey]) ? $this->_baseRoundingDeltas[$rateKey] : 0;
        $rowTax     += $delta;
        $baseRowTax += $baseDelta;
        $this->_roundingDeltas[$rateKey]     = $rowTax - $this->_calculator->round($rowTax);
        $this->_baseRoundingDeltas[$rateKey] = $baseRowTax - $this->_calculator->round($baseRowTax);
        $rowTax     = $this->_calculator->round($rowTax);
        $baseRowTax = $this->_calculator->round($baseRowTax);

ändern in

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* "Delta" rounding
*/
        $delta = 0;
        $baseDelta = 0;
        //$delta      = isset($this->_roundingDeltas[$rateKey]) ? $this->_roundingDeltas[$rateKey] : 0;
        //$baseDelta  = isset($this->_baseRoundingDeltas[$rateKey]) ? $this->_baseRoundingDeltas[$rateKey] : 0;
        $rowTax     += $delta;
        $baseRowTax += $baseDelta;
        $this->_roundingDeltas[$rateKey]     = $rowTax - $this->_calculator->round($rowTax);
        $this->_baseRoundingDeltas[$rateKey] = $baseRowTax - $this->_calculator->round($baseRowTax);
        $rowTax     = $this->_calculator->round($rowTax);
        $baseRowTax = $this->_calculator->round($baseRowTax);

Es gibt noch eine weitere Lösung für das PayPal Problem bei noch älteren Versionen als 1.4:

Das Problem mit Paypal lässt sich lösen, wenn man die Datei Abstract.php in app/code/core/Mage/Shipping/Model/Carrier/ (Zeile 262) folgendermaßen anpasst:

1
return round($finalMethodPrice,2);
1
vorher: return $finalMethodPrice;

Magento 1.4 und älter

In Magento 1.4 und älter wurden Beträge oft auf 2 Kommastellen gerundet und somit kam es zu unerwünschten Rundungsfehlern, die Lösung dazu ist in vielen Foren zu lesen und im folgenden noch mal kurz aufgeführt.

Leider gibt es einen derben Rundunsfehler in Magento, was bei größeren Beträgen einige Euros ausmachen kann. Hier die Lösung:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
In: /app/code/core/Mage/Core/Model/Store.php
Zeile 740
return round($price, 2);
ändern in:
return round($price, 4);
 
In: \app\design\adminhtml\default\default\template\catalog\product\edit\price\tier.phtml
Zeile 161
 
ändern in:
In: app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Price.php
Zeile 86
return number_format($value, 2, null, ‘’);
ändern in:
return number_format($value, 4, null, ‘’);
 
In: app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php
Zeile 285
if ($type == ‘percent’) {
return number_format($value, 2, null, ‘’);
} elseif ($type == ‘fixed’) {
return number_format($value, 2, null, ‘’);
ändern in:
if ($type == ‘percent’) {
return number_format($value, 4, null, ‘’);
} elseif ($type == ‘fixed’) {
return number_format($value, 4, null, ‘’);

Tags: , , , ,

10 Antworten bis “Magento Rundungsfehler / Paypal”

  1. Hawe
    Jan 23, 2012
    Reply

    Hi, hast Du evtl. irgend eine Ahnung, wie sich die Lösung für das Paypal-Problem in Magento 1.6.x gestalten würde? Die o.g. Codezeilen finde ich leider in dieser Version nicht in der Datei Tax.php.
    Danke Dir und schöne Grüße!


  2. admin
    Jan 24, 2012
    Reply

    Ab der Version 1.5 wurden einiges an den Rundungsproblemen von Magento beseitigt. Der core hat sich in Folge dessen etwas verändert.

    Ab 1.5 befindet sich die deltaRound in einer Funktion in der selben Datei:
    \app\code\core\Mage\Tax\Model\Sales\Total\Quote\Tax.php

    Die Rundung übernimmt nun die folgende Funktion:
    protected function _deltaRound($price, $rate, $direction, $type=’regular‘) (etwa Zeile 588)

    Hier müsste nun die Zeile
    $delta = isset($this->_roundingDeltas[$type][$rate]) ? $this->_roundingDeltas[$type][$rate] : 0;

    ersetzt werden durch:

    $delta = 0;

    Leider konnte ich den Fall nicht testen und würde um ein kurzes Feetback bitten.


    • Benedikt Wallmeyer
      Jan 31, 2012
      Reply

      Leider funktioniert diese Lösung nicht. Vielleicht hat noch jemand eine andere Idee?


  3. Hawe
    Jan 24, 2012
    Reply

    Vielen Dank erstmal für Deine Hilfe! Habe das mal ausprobiert – leider hatte es bei uns jetzt keine Veränderung gebracht. Aber das kann durchaus auch an einigen anderen Einstellungen bzgl. Berechnung liegen.
    Paypal bekommt einen Nettowert mit zwei Nachkommastellen übergeben (z.B. 10,19 € für ein Produkt anstatt korrekten 10,1869 €). Aus diesen (bereits aufgerundeten) 10,19 € (netto) und den 4,96 € Versandkosten (netto) berechnet Paypal die Bruttosumme 16,8057 €. Und dann wird von Paypal schwups auf 16,81 € aufgerundet.
    Wir haben es jetzt so gelöst, dass wir für die Versandkosten einen glatten Nettobetrag nehmen (5 €). Das macht brutto dann Versandkosten von 5,95 € anstatt 5,90 €. Aber dafür kann Paypal jetzt schlicht nichts mehr falsch rechnen.
    Beste Grüße!


  4. Denis
    Feb 13, 2012
    Reply

    Ich habe festgestellt, dass es zu Problemen beim Bestellabschluss kommt, wenn man folgenden Code-Fix anwendet:

    public function roundPrice($price)
    {
    return round($price, 4);
    }

    Dadurch werden zwar die teilweise auftretenden 1-Cent Probleme im Frontend gelöst, im Checkout allerdings entsteht dadurch ein Fehler.
    Mit den Fix (Fehler im Checkout tritt auf):

    Brutto Artikel: 17,50
    Brutto Versand: 3,90

    Netto Artikel: 16,36
    Netto Versand: 3,28

    Netto Summe: 19,63 <– da fehlt ein Cent!!!
    Steuern: 1,77

    Summe Brutto: 21,40 <– das stimmt zwar, wenn man Brutto Artikel und Brutto Versand addiert, allerdings rechnet Paypal 16,36 + 3,28 + 1,77 und kommt somit auf 21,41!!! Betrugsverdacht.
    Man sieht allein schon, dass die Summe der Netto-Beträge nicht passt.

    Wendet man den Fix nicht an (also lässt es bei Round ,2):

    Brutto Artikel: 17,50
    Brutto Versand: 3,90

    Netto Artikel: 16,36
    Netto Versand: 3,28

    Netto Summe: 19,64 <– jetzt passt die Netto-Summe
    Steuern: 1,76 <– macht jetzt auch Sinn

    Summe Brutto: 21,40 <– Summe Brutto stimmt weiterhin und Paypal rechnet jetzt auch richtig: 16,36 + 3,28 + 1,76 = 21,40

    Bei dem Rundungsfix werden im Checkout einfach so gerundet, dass 1 Cent des Netto-Betrages auf die Steuern übertragen wird. Dies wird sicherlich nicht immer auftreten (aufgrund der verschiedenen Einzelartikel-Nettopreisen … aber ich bin der festen Überzeugung, dass der Fix ein großes Problem darstellt)


  5. Fabian
    Sep 16, 2012
    Reply

    Der Rundungsfehler, der bei manchen Zahlungen über Paypal auftritt, lässt sich nicht in Magento beheben. Die Bestellungen müssen nachträglich angepasst werden. Der Fehler entsteht dadurch, dass die/der Nettopreis/e nur mit zwei Nachkommastellen nach Paypal übertragen werden und Paypal nicht richtig runden kann. Mehr dazu in diesem Blogartikel: http://fabiankrueger.de/blog/?p=5


  6. Marc
    Dez 17, 2012
    Reply

    Hallo,
    leider gibt es das Problem noch in Magento 1.7.
    Hat jemand dazu nun eine Lösung oder musss man die fehlerhaften (betrügerischen) Paypal-Zahlungen manuell bearbeiten?

    Da muss es doch irgendwie eine Lösung geben 🙁

    lg Marc


  7. nikl
    Okt 07, 2013
    Reply

    Übrigens der Hinweis von Fabian Bestellungen nachträglich anzupassen verwundert mich ein wenig – die Bestellungen gehen aufgrund der Ablehnung ja gar nicht ein befinden sich so weder im Backend noch im PayPal Admin, wie soll ich eine nicht existierende Bestellung anpassen?


  8. In Magento 1.8 ist der Rundungsfehler behoben. Für alle, die nicht updaten können/wollen, könnte diese Erweiterung helfen:
    http://www.magentocommerce.com/magento-connect/catalog/product/view/id/20012/


  9. xonu
    Okt 14, 2013
    Reply

    In Magento 1.8 wurde der Fehler behoben:
    http://magento.xonu.de/fehlerbehebung/magento-1-8-rundungsfehler-behoben/

    Für Magento 1.7.x.x gibt es von uns Lösung als Extension auf Magento Connect:
    http://www.magentocommerce.com/magento-connect/catalog/product/view/id/20012/



Leave a Reply

 

Posts of Current Category



Facebook: