# Preismanipulation – Preis im Warenkorb falsch

**URL:** https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308
**Category:** Programmierung
**Created:** [25. April 2016 um 13:11 UTC](https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308 "2016-04-25T13:11:35Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![msslovi0](https://avatars.discourse-cdn.com/v4/letter/m/b2d939/32.png) [@msslovi0](https://forum.shopware.com/u/msslovi0)
#### Post date: [25. April 2016 um 13:11 UTC](https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308/1 "2016-04-25T13:11:35Z")

</div>

Hallo!

Ich versuche aus unserem bestehenden xt:Commerce-Shop eine Funktionalität nach Shopware zu übertragen: Schöne USD-Preise. Weil bei einem Europreis von 379 ein USD-Preis von 358,37 einfach nicht schön aussieht soll er auf 359 gerundet werden.&nbsp;

Ich hab mir dazu den price\_calculation\_service ersetzt (dekorieren geht nicht da alle Funktionen private):

```
$this->subscribeEvent(
    'Enlight_Bootstrap_AfterInitResource_shopware_storefront.price_calculation_service',
    'registerPriceCalculationService'
);

```

Die Function&nbsp;calculatePrice() hat eine entsprechende Änderung, dass bei Währung USD eine Rundung auf den nächsten 5er oder 9er stattfindet. Das funktioniert auch alles soweit prima, überall wird der gerundete USD-Preis angezeigt.  
Sobald man aber das Produkt in den Warenkorb legt landet es dort nicht mit den erwarteten 359 USD sondern es wird der Euro-Preis von 379 angezeigt.

Ich hab dann auf Twitter ([Link zur Diskussion](https://twitter.com/msslovi0/status/723530014759747585)) noch den Tipp bekommen, das über den Event&nbsp;Shopware\_Modules\_Basket\_getPriceForUpdateArticle\_FilterPrice zu lösen. Damit kann ich zwar den Preis überschreiben, aber die 359 tauchen nirgends auf. Selbst wenn ich mir die Preise hier nochmal hole für das Produkt tauchen leider nur die 379 auf:

```
$return = $arguments->getReturn();
$repository = Shopware()->Models()->getRepository('Shopware\Models\Article\Detail');
$article = $repository->findOneBy(array('id' => $return['articleID']));
\Doctrine\Common\Util\Debug::dump($article->getPrices());

```

(es gibt keine Doku zu dem Event, von daher ist mir leider unklar wie ich ohne erneuten Weg über das Repository an die Artikeldaten komme)

```
array(1) {
  [0]=>
  object(stdClass)#1792 (15) {
    [" __CLASS__"]=>
    string(29) "Shopware\Models\Article\Price"
    ["id"]=>
    int(7118)
    ["articleId"]=>
    int(38)
    ["articleDetailsId"]=>
    int(38)
    ["customerGroupKey"]=>
    string(2) "EK"
    ["from"]=>
    int(1)
    ["to"]=>
    string(8) "beliebig"
    ["price"]=>
    float(318.48739495798)
    ["pseudoPrice"]=>
    float(0)
    ["basePrice"]=>
    float(0)
    ["percent"]=>
    float(0)
    ["detail"]=>
    string(30) "Shopware\Models\Article\Detail"
    ["customerGroup"]=>
    string(54) "Shopware\Proxies\ __CG__ \Shopware\Models\Customer\Group"
    ["attribute"]=>
    NULL
    ["article"]=>
    string(55) "Shopware\Proxies\ __CG__ \Shopware\Models\Article\Article"
  }
}

```

Es scheint so als würde der Basket den&nbsp;price\_calculation\_service gar nicht erst benutzen. Die zentrale Frage ist jetzt: Wie kann ich es trotzdem erreichen, dass auch im Warenkorb der Preis angezeigt wird, den ich haben will?

Matt

---

<div class="post-metadata">

### Author: ![Heiner\_Lohaus](https://avatars.discourse-cdn.com/v4/letter/h/b5a626/32.png) [@Heiner\_Lohaus](https://forum.shopware.com/u/Heiner_Lohaus)
#### Post date: [25. April 2016 um 13:51 UTC](https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308/2 "2016-04-25T13:51:52Z")

</div>

Hi Matt,

das im Post genannte Event wird ja an dieser Stelle gefeuert:  
&nbsp;[shopware/sBasket.php at 5.1 · shopware/shopware · GitHub](https://github.com/shopware/shopware/blob/5.1/engine/Shopware/Core/sBasket.php#L2482)  
Es ist also ein Filter-Event und der Rückgabe-Wert&nbsp;wird als Preis im Warenkorb gespeichert.  
Mit:&nbsp;  
&nbsp;$return[‚price‘] = round($return[‚price‘]);  
&nbsp;return&nbsp;$return;  
solltest du also den Warenkrob-Preis bestimmen können.

Gruß Heiner

---

<div class="post-metadata">

### Author: ![msslovi0](https://avatars.discourse-cdn.com/v4/letter/m/b2d939/32.png) [@msslovi0](https://forum.shopware.com/u/msslovi0)
#### Post date: [25. April 2016 um 14:02 UTC](https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308/3 "2016-04-25T14:02:53Z")

</div>

Danke, das würde den Preis aber nur runden und nicht auf den nächsten 5er oder 9er aufrunden. Ich müsste also die Funktionalität duplizieren, die ich in&nbsp;calculatePrice() schon habe, was ich aber natürlich irgendwie vermeiden wollte…

---

<div class="post-metadata">

### Author: ![Heiner\_Lohaus](https://avatars.discourse-cdn.com/v4/letter/h/b5a626/32.png) [@Heiner\_Lohaus](https://forum.shopware.com/u/Heiner_Lohaus)
#### Post date: [25. April 2016 um 14:38 UTC](https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308/4 "2016-04-25T14:38:21Z")

</div>

Hi,

dafür kannst du dir ja ein Service anlegen:  
&nbsp;[Plugin services](https://developers.shopware.com/developers-guide/services/)

Gruß Heiner

---

<div class="post-metadata">

### Author: ![msslovi0](https://avatars.discourse-cdn.com/v4/letter/m/b2d939/32.png) [@msslovi0](https://forum.shopware.com/u/msslovi0)
#### Post date: [25. April 2016 um 14:43 UTC](https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308/5 "2016-04-25T14:43:44Z")

</div>

Ich hab ja aber schon den&nbsp;price\_calculation\_service, den ich überschreibe. Ich hab nur keine wirkliche Idee mit was ich dann den $context-Parameter füllen muss.

---

<div class="post-metadata">

### Author: ![DanielNogel](https://avatars.discourse-cdn.com/v4/letter/d/96bed5/32.png) [@DanielNogel](https://forum.shopware.com/u/DanielNogel)
#### Post date: [25. April 2016 um 16:30 UTC](https://forum.shopware.com/t/preismanipulation-preis-im-warenkorb-falsch/36308/6 "2016-04-25T16:30:57Z")

</div>

Hi,

du meinst den ProductContext in der&nbsp;\Shopware\Bundle\StoreFrontBundle\Service\Core\PriceCalculationService::calculateProduct? Das Context-Objekt kannst du dir aus dem Service&nbsp;shopware\_storefront.context\_service ziehen. Dahinter stecken letztlich Infos Steuerregeln und Preisgruppen, die wir zur Berechnung von Preisen benötigen.

Besten Gruß,

Daniel
