Bei Auswahllisten kann ein Aufschlag definiert werden.
Wenn ich nun ein absoluter Aufschlag von 20 definiere, wird dieser beim Produkt im Warenkorb auch dazugerechnet.
Das problem aber ist, dass dieser Zuschlag nicht rabattierfähig sein sollte, bzw. der Aufschlag sollte auch bei einem globalen Rabatt gleich bleiben.
Hier ein Szenario dazu:
Standartpreis des Produktes 200
Aufschlag bei der Auswahl 20
Somit im Warenkorb 220
Mit einem Rabatt von 20%:
Produktpreis 160
Aufschlag 16
Somit im Warenkorb 176
=> Ich möchte aber den Preis von 180 (Aufschlag ohne Rabatt)
Leider habe ich im Forum und auch nicht im Code eine Lösung finden können, wie ich dies angehen könnte.
Ich habe auch das Problem… äh, die Herausforderung, dass die Auswahllisten nicht rabattiert werden sollen. Gab es für das Problem inzwischen schon eine Lösung?
Alternativ: wo werden denn die Rabatte für die Auswahllisten berechnet. Notfalls schreibe ich wieder ein Modul, habe aber noch keinen Ansatzpunkt gefunden.
Dafür wird die Methode calculateBasket() zuständig sein, die sehr umfangreich. Innerhalb der Methode werden 12 Punkte durchlaufen, die Preis im Warenkorb bestimmt.
Nachdem ich jetzt etwas Zeit hatte, mich wieder dem Thema zu widmen:
So wie ich es sehe, werden in der Funktion calculateBasket() zunächst alle Preise für den Artikel summiert (also Artikelpreis, ggf. mit Rabattstaffel und Auswahllisten) und später werden die Rabatte darauf angewendet. Klingt also nach einigem Aufwand, das zu ändern.
Ok, was anderes. Ich würde zunächst einmal gerne identifizieren, ob eine Auswahlliste überhaupt einen Aufschlag bewirkt. Mit getActiveSelection() bekomme ich die jeweilige Auswahl (foreach-Schleife). Mit getName() erhalte ich den ausgewählten Eintrag mit Preisänderung (z.B. “mit Druck +29,00 €”) getValue() ist 0
Hier hätte ich ein anderes Verhalten erwartet, nämlich dass bei getValue 29,-€ herauskommt.
Mache ich einen Denkfehler? Wie komme ich bitte an den Aufschlag im einzelnen heran?
Wenn ich mir angucke wie getValue() im Flow Theme bei CE 6.1.5 für die Detailseite verwendet wird verstehe ich es so, dass getValue() die OXID des ausgewählten Artikels zurückliefert. Da getValue() für ein input hidden Field genutzt wird welche Auswahl getroffen wurden ist, wenn noch keine Auswahl getroffen dann kommt wahrscheinlich null bzw. 0 zurück.
Ich betrachte aktuell den Warenkorb (mit der angezeigten Auswahl): <input type="hidden" name="aproducts[560c2b727331b9181246664da88705c3][sel][0]" value="0">
Hier kann ich die Nummer, die hinter aproducts steht, weder einer OXID vom Artikel, Basket, Basketitem oder Selectlist zuordnen. Vielleicht sehe ich die auch nur nicht - manchmal ist man ja blind - aber deshalb habe ich hier eigentlich ein Testsystem mit nur ein paar Artikeln drin. Auf jeden Fall ist die Klasse oxcmp_basket (die Nummer dürfte die id davon sein) zwar in der Version 4.9.4 vorhanden, nicht aber in der 6.1.
Gut, ich werde das vermutlich jetzt so lösen, dass ich mir den $oActiveSelection->getName() schnappe und per regex /+[0-9]*,[0-9]{2} €$/g auswerte. Aber wirklich schön ist das nicht :}
Die Nummer ist eine, für den Artikel mit seinen speziellen Eigenschaften (sel, Params usw.) immer gleiche Nummer im Warenkorb. Diese kannst über oxbasket::getItemKey($sProductId, $aSel, $aPersParam, $blBundle, $sAdditionalParam); bekommen.