Nachkommastellen beim Preis

Hallo zusammen,

ich würde gerne noch mal das Thema Preis mit mehreren Nachkommastellen aufleben lassen. Vielleicht hat sich ja da jetzt was getan?

https://forum.shopware.com/discussion/comment/84381/#Comment_84381

Sagen wir mein Produkt(ArtikelID = 30) kostet 0,778157 pro 100cm. Sind bei 995 cm = 774,266215 => 774,27 Euro

In Shopware Backend kann ich leider nur 0,77 eingeben. Preis für den Kunden bei 995 cm = 766,15

Differenz 8,12 Euro.

Folgendes PlugIn(Auszug) bringt nur bedingt was:

public function onFilterPrice(\Enlight_Event_EventArgs $args)

    {
        $ordernumber = $args->getReturn();
        $price = $args->getReturn();

            if ($ordernumber['articleID'] == '30') {

        $price['price'] = $price['price'] + 0.008157;

        $args->setReturn($price);

        }
  }

Shopware rundet nämlich auf 0,78 auf und dann passt es wieder nicht.

Wo muss ich hinfassen? Würde es gerne generell für den ganzen Shop umstellen?

Shopware_Modules_Basket_GetBasket_FilterResult ?

Oder in der PriceCalculationService.php ?

 

Wer kann helfen?

Die Datenbank gibt es auf jeden Fall her - ist in den Artikeltabellen nicht auf eine bestimmte Nachkommastellenanzahl limitiert.

Auf jeden Fall musst du im Backend () einige Änderungen machen ähnlich wie diese:

./themes/Backend/ExtJs/backend/article/controller/detail.js:824

VON:

price = price.toFixed(2);

IN:

price = price.toFixed(4);

Das Backend limitiert bzw. rundet - das Frontend wäre der nächste Schritt, wahrscheinlich mehr prüfen als wirklich ändern, da die Preise in der Datenbank sicherlich 1:1 übernommen werden.

2 „Gefällt mir“

Hallo zusammen,

im Backend ist es mir nun gelungen Werte mit mehreren Kommastellen zu hinterlegen.

Beispiel: 0,7668479 wird in der s_articles_prices unter dem Artikel mit 0.64441008403361 hinterlegt. Klappt nun endlich!

Im Frontend auf der Artikeldetailseite wird es aber dennoch mit 0.77 € angeliefert. Das data.tpl holt den Wert $sArticles.price mit content 0.77.

Ich nehme an, dass in einer Php Datei aus s_articles_prices schon die 0.64441008403361 geholt werden und die MwSt draufgerechnet wird. 0.64441008403361 * 1,19 = 0.76684.

Mein Problem ist, dass hier jetzt wohl von Shopware wieder aufgerundet wird auf 0.77. Habe die sArticles.php im Core durchsucht. Nix gefunden! Hat jemand einen Tipp, wo ich da hingreifen muss?

 

Schau mal hier: shopware/PriceCalculator.php at 5.3 · shopware/shopware · GitHub

Ich glaube dort wird das für Listings und Detailseiten gemacht.

2 „Gefällt mir“

Ok, vielen Dank.

Ich habe jetzt mal die Stellen lokalisiert, die es anzugreifen gilt.(Hinweis: Grundeinstellung Shopkunden -> Bruttopreise)

Backend:

Damit eine Zahl mit mehreren Kommastellen eingegeben werden kann, muss folgender Wert beeinflusst werden.

themes -> backend -> ExtJs -> backend -> article -> view -> detail -> prices.js

xtype: 'numbercolumn',
                header: me.snippets.grid.columns.price,
                dataIndex: 'price',
                editor: {
                    xtype: 'numberfield',
                    decimalPrecision: 8,
                    minValue: 0
                }

Hier entscheidet der Wert decimalPrecision.

Frontend:

Hier wird es schon komplexer. Entscheidend sind die Core Dateien sBasket.php und sArticles.php

Natürlich auch hier nur die Baustelle an der was gemacht werden muss. Die Lösung muss ein PlugIn sein.

sBasket ->

private function getBasketArtciles($getArticles)

Zeile 2317 - 2386 alle Round, die die Preisberechnung betreffen den precision Wert auf gewünschten Wert verändern

 private function getTaxesForUpdateArticle....

Zeile 2666 ebenfalls Round Wert verändern.

sArticles -> 

 public function sCalculatingPriceNum....

Zeile 694 - Zeile 696 Round Wert verändern

 public function sRound....

Zeile 1235 - Zeile 1239 Round Wert verändern.

 

Abschließende Frage: ist es überhaupt machbar die Werte mit einem PlugIn zu verändern? Backend wahrscheinlich weniger das Problem als die Frontend Veränderungen?

 

 

Man kommt an die Core sachen mit nem before, after oder replace hook dran. Beispiel für sArticles->sRound

public static function getSubscribedEvents()
{
        return [
           'sArticles::sRound::replace'
            => 'onTestSRound'
               ]
}

public function onTestSRound(\Enlight_Hook_HookArgs $args) {
        $input = $args->getArgs()[0];
        $args->setReturn($input * 1000);
    }

führt dazu dass im Warenkorb die Artikel nun 1000 fach so teuer sind

1 „Gefällt mir“

Naja, gerade im Hinblick auf Plugin- und Update-Kompatibilität ist ein Replace-Hook natürlich das schlechteste was man machen kann. Gerade bei Core-Klassen wird es aber schwierig hier einen guten Weg zu finden.

1 „Gefällt mir“

Leider ist mir gerade aufgefallen, dass ich hier nur die halbe Miete entdeckt habe.

In der info.tpl wird $sBasketAmount|currency ausgegeben. 

Die Ausgabe erfolgt in der Checkout.php(Controllers/Frontend) in Realtime über 

 public function ajaxAmountAction()

Leider zieht hier aber wohl eine ganz andere Berechnung. Denn mein Beträge stimmten nicht überein, d.h. der Betrag für die info.tpl, der in $sBasketAmount übergeben wird, wird noch ohne Nachkommastellen berechnet (Das ist nunmehr der einzige Fleck, wo das noch so ist, überall anders passt es).

In der sBasket.php kann das aber nicht passieren, aber wo dann? Jemand eine Idee?

In Shopware 5.3: wo kann man die Nachkommafelder einstellen. Wir haben ein ähnliches Problem. Am besten wäre es meiner Meinung nach im backend aufgehoben, damit es auch update kompatibel ist.

Gibt es hier diesbezüglich irgendwelche Neuigkeiten bzw. ist das wenigstens in Zukunft bei Shopware vorgesehen?

Hallo,

wir würden auch gerne auf 4 Nachkommastellen umstellen können.

Wir müsste ebenfalls die EK-Preise mit 4 Nachkommastellen in @Pickware‍ erfassen.

Gibt es hier inzwischen eine Möglichkeit?

In meinen Augen wird das durch das grundlegende DB-Design verursacht. Unter https://forum.shopware.com/discussion/55821/datenbankdesign hatte ich das schon mal bemängelt. Double ist für mich in Bezug auf Preise und Menge einfach der falsche Datentyp.

Hallo,

weiß jemand, ob es in Shopware 6 möglich ist, die Nachkommastellen der Einzelpreise einstellbar z.B. auf

4 Nachkommastellen zu stellen?

Leider finde ich bisher nichts dazu bei Shopware 6.

Irgendwie dachte ich, daß das dann möglich ist, zumindest hatte mir das ein Shopware-Mitarbeiter bei einem

Shopware-Meeting in München so mehr oder weniger bestätigt.

Oder wenn nicht einstellbar, dann doch wenigsten einfacher mit einem Plugin zu programmieren ist,

als daß das bisher in Shopware 5 der Fall ist.

Danke,

Werner.

Das Setting für Horizontal/Vertikal fehlt auch noch. Technisch ist beides vorgesehen, per Plugin solltest du das auch gut heute erweitern können, im späteren Verlauf ist das auch zur Konfiguration vorgesehen. 

Es gibt auf jeden Fall schonmal ein Rounding-Interface: https://github.com/shopware/platform/blob/master/src/Core/Checkout/Cart/Price/PriceRounding.php

1 „Gefällt mir“

Hallo Moritz,

stimmt, das horizontal/vertikal war ja auch ein Thema, danke für die Info dazu.

Okay, wenn das vorgesehen ist, ist das ja schon mal gut, das mit dem Rounding-Interface hört sich gut an.

Danke,

Werner.