Hallo an alle erst einmal,
wir hatten nun Zeit uns noch einmal ausgiebig mit der Thematik zu beschäftigen.
Der erste Ansatz war die setPrice Methode in der oxBasketItem Klasse (line 332) anzupassen:
00332 public function setPrice( $oPrice )
00333 {
00334 $this->_oPrice = oxNew( 'oxprice' );
00335 [B]$this->_oPrice->setBruttoPriceMode();[/B]
00336 $this->_oPrice->setVat( $oPrice->getVAT() );
00337 $this->_oPrice->addPrice( $oPrice );
00338 $this->_oPrice->multiply( $this->getAmount() );
00339
00340 $this->_oUnitPrice = oxNew( 'oxprice' );
00341 [B]$this->_oUnitPrice->setBruttoPriceMode();[/B]
00342 $this->_oUnitPrice->setVat( $oPrice->getVAT() );
00343 $this->_oUnitPrice->addPrice( $oPrice );
00344
00345 $this->_setDeprecatedValues();
00346 }
Hier wird, völlig egal ob netto Preise im Backend verwendet werden, das $_blNetPriceMode Flag in einem oxPrice Objekt auf “false” gesetzt und anschließend berechnen alle folgenden Methoden als ob es sich um einen Brutto Wert handelt.
Nach auskommentieren/ändern dieser Zeile gabs es zumindest keine Rundungsfehler bei der Berechnung einzelner Shopitems mehr. Bei der Berechnung des kompletten Warenkorbs traten immernoch welche auf.
Das liegt wohl einfach daran, dass das besagte Forcen des setBruttoPriceMode bei allen möglichen Methoden zur Berechnung von Posten (Versandkosten, Rabatte, Gutscheine, etc.) angwendet wird.
Ich vermute mal, dass sich die Entwickler dabei etwas gedacht haben, aber ich kann bisher noch nicht nachvollziehen was.
Wenn jemand weiß, warum das so umgesetzt wurde und warum das vielleicht auch so bleiben sollte um bspw. Komplikationen zu vermeiden, dann wäre das super, wenn er hier Bescheid geben würde.
Als Lösung hierzu kann ich jedenfalls bisher folgendes vorschlagen:
(So haben wir es umgesetzt)
In der Klasse oxPrice alle Bedingung, die $_blPriceMode abfragen, ändern
if ($this->_blNetPriceMode)
ändern zu
if ($this->getConfig()->getConfigParam('blEnterNetPrice'))
So wird das blPriceMode Flag des Objekts ignoriert, stattdessen wird immer die Einstellung aus dem Backend verwendet und zwar überall wo ein Price Objekt zum Einsatz kommt.
Alternativ könnte man auch alle “setBruttoPriceMode()” Aufrufe in den anderen Klassen (oxBasket, oxBasketItem) auskommentieren oder druch “setNettoPriceMode()” ersetzten um sicherzugehen, dass auch in jedem Fall in Netto gearbeitet wird.
Hier sind wir uns allerdings nicht sicher, ob oxBasket und oxBasketItem die eizigen betroffenen Klassen sind.