es gibt einen Bug in Shopware (Kunde Shopware 6.4.9.0, tritt aber auch in den aktuellsten Versionen auf), der dafür sorgt, dass man keinen absoluten Rabatt auf einzelne Positionen vergeben kann, wenn die Option „Nur auf ausgewählte Produkte anwenden“ aktiviert ist in Kombination mit einer Produktregel, die das gültige Sortiment entsprechend einschränkt. Alle anderen Rabattarten (Prozentual, Festpreis) funktionieren. Es gibt dafür bereits ein Ticket: Shopware Issuetracker allerdings keine Aussage dazu, ob/wann es behoben wird.
Wir stehen vor dem Problem, dass einer unserer Kunden genau eine solche Rabatt-Aktion benötigt und diese auch bereits öffentlich angekündigt hat und rechtlich zur Durchführung verpflichtet ist (Universität). In meiner Naivität habe ich dem Kunden „damals“ bestätigt, dass das mit Shopware möglich ist, da ich mit einem Bug an einer solchen wichtigen Kernfunktion für Online-Shops nicht gerechnet habe.
Leider ist das Budget des Kunden zeitgleich recht begrenzt. Ein eigener Fix könnte daher „zu teuer“ werden. Daher die Frage: Hatte jemand bereits dasselbe Problem und ggf. einen Lösungsvorschlag? Eventuell sind es ja lediglich irgendwo ein paar Zeilen, die überschrieben werden müssen…
Shopware nutzt verschiedene Calculator-Klassen, um einen Discount zu berechnen, z.B. PercentagePriceCalculator oder AbsolutePriceCalculator. Diese haben eine calculate-Methode mit einem prices-Array als Parameter. Das Array enthält nur Preise von Basketitems, die von einem Discount betroffen sind. Trifft ein Discount nicht zu (weil die Produktregel nicht greift), ist das prices-Array leer. Die Summe aller Preise ist dann 0 und beim PercentagePriceCalculator bspw. kommt dann entsprechend insgesamt ein Discount von 0.0 heraus. Später filtert Shopware dann Discounts raus, die 0.0 sind.
Beim AbsolutePriceCalculator wird dieses prices-Array aber einfach ignoriert und es wird der absolute Rabatt returned. Lösung ist also, einen Decorator zu schreiben, der vorab prüft, ob die Summe der affected prices 0 ist und wenn ja wird der Discount auf 0.0 gesetzt, sodass er herausgefiltert wird.
Noch zwei Ergänzungen: Wenn der absolute Rabatt für jedes zutreffende Produkt gewährt werden soll, muss die Anzahl noch berücksichtigt und mit eingerechnet werden, sonst wird der Rabatt nur einmalig vergeben. Außerdem wird der AbsolutePriceCalculator noch an anderen Stellen verwendet; für unseren Use case funktioniert es, für andere eventuell nicht.