Flexible Variantenpreise mit prozentualer Berechnung und fixen Aufschlägen für Shopware 6.6/6.7.
Live Demo: Teste alle Plugins für OXID eShop und Shopware von Markus Michalski live — ohne Installation, ohne Risiko. demo.markus-michalski.net
Ideal für Produkte mit größen- oder optionsabhängiger Preisgestaltung:
| Feature | Beschreibung |
|---|---|
| Prozentuale Berechnung | Variantenpreis = Hauptprodukt x Prozentsatz |
| Fixe Aufschläge | Absolute EUR-Beträge hinzufügen (positiv oder negativ) |
| Kombinierter Modus | Prozent UND Aufschlag gleichzeitig nutzen |
| Pro-Variante aktivierbar | Über Custom Fields individuell steuerbar |
| Field-Specific Inheritance | Variante erbt Custom-Field-Werte vom Parent wenn nicht explizit gesetzt |
| Storefront-optimiert | Nur im Frontend aktiv, kein Admin-Overhead |
| Warenkorb-Integration | Korrekte Preise auch im Warenkorb und Checkout |
| Konfigurierbares Rounding | Dezimalstellen und Rundungsmodus einstellbar |
| NaN/INF-Schutz | Robuste Validierung gegen ungültige Werte |
| Shopware 6.6 + 6.7 | Kompatibel mit beiden Versionen |
Variantenpreis = (Hauptprodukt-Preis + Fixer Aufschlag) x (Prozentsatz / 100)
Hauptprodukt-Preis: 100,00 EUR
| Variante | Prozent | Aufschlag | Berechnung | Ergebnis |
|---|---|---|---|---|
| Standard | 100% | 0 EUR | (100 + 0) x 1,00 | 100,00 EUR |
| Rabatt | 50% | 0 EUR | (100 + 0) x 0,50 | 50,00 EUR |
| Mit Reißverschluss | 100% | +8 EUR | (100 + 8) x 1,00 | 108,00 EUR |
| Premium XL | 120% | +10 EUR | (100 + 10) x 1,20 | 132,00 EUR |
| Sale-Artikel | 100% | -15 EUR | (100 - 15) x 1,00 | 85,00 EUR |
Sicherheit: Der berechnete Preis wird niemals negativ. Ergibt die Formel einen Wert unter 0, wird automatisch 0,00 EUR gesetzt.
| Anforderung | Version | Hinweis |
|---|---|---|
| Shopware | 6.6.x oder 6.7.x | Beide Major-Versionen unterstützt |
| PHP | 8.2+ | Getestet mit 8.2, 8.3 und 8.4 |
| Lizenz | Einzelinstallation | Inkl. Dev/Staging, alle Sales Channels |
1. Privates Repository hinzufügen
Füge das private Composer-Repository zur composer.json deines Shops hinzu:
{
"repositories": [
{
"type": "composer",
"url": "https://packeton.markus-michalski.net"
}
]
}
Hinweis: Die Repository-Zugangsdaten werden nach dem Lizenzkauf bereitgestellt. Private Repositories werden über Packeton verwaltet.
2. Plugin installieren
composer require mmd/sw6-variant-price-surcharge
Bei der Authentifizierungsabfrage die mit der Lizenz erhaltenen Zugangsdaten eingeben.
3. Plugin aktivieren
bin/console plugin:refresh
bin/console plugin:install --activate MmdVariantPriceSurcharge
bin/console cache:clear
Empfehlung: Shopware Store oder Composer-Installation bevorzugen für einfache Updates und Dependency-Management.
Update auf die neueste Version:
composer update mmd/sw6-variant-price-surcharge
bin/console cache:clear
Im Shopware Admin unter Erweiterungen > Meine Erweiterungen > Varianten-Preisaufschlag > Konfiguration:
| Einstellung | Standard | Beschreibung |
|---|---|---|
| Dezimalstellen | 2 | Anzahl Nachkommastellen für gerundete Preise |
| Rundungsmodus | HALF_UP | Rundungsverfahren (siehe unten) |
Verfügbare Rundungsmodi:
| Modus | Beschreibung | Beispiel (2,545) |
|---|---|---|
| HALF_UP | Kaufmännisch (Standard) | 2,55 |
| HALF_DOWN | Abrunden bei .5 | 2,54 |
| HALF_EVEN | Banker's Rounding | 2,54 |
| HALF_ODD | Auf ungerade runden | 2,55 |
Das Plugin erstellt automatisch bei der Installation drei Custom Fields auf Produktebene:
| Technischer Name | Typ | Bereich | Beschreibung |
|---|---|---|---|
mmd_surcharge_enabled |
Boolean | - | Preisaufschlag aktivieren |
mmd_surcharge_percentage |
Float | 0 - 1000 | Prozentsatz (z.B. 50 für 50%) |
mmd_surcharge_fixed |
Float | -100.000 bis +100.000 | Fixer Aufschlag in EUR |
Field-Specific Inheritance: Wenn ein Custom Field auf der Variante NICHT gesetzt ist, wird automatisch der Wert des Hauptprodukts verwendet. So kannst du z.B. den fixen Aufschlag nur auf dem Parent setzen und er gilt für alle Varianten.
100 für 100%)8.00 für +8 EUR oder -5.00 für -5 EUR Rabatt)Wichtig: Der Preis der Variante selbst wird ignoriert. Es zählt nur der Preis des Hauptprodukts mit Aufschlag und Prozentsatz.
Hauptprodukt "CRM Software": 49,00 EUR (1-User-Lizenz)
| Variante | Prozent | Aufschlag | Ergebnis |
|---|---|---|---|
| 1 User | 100% | 0 EUR | 49,00 EUR |
| 5 User | 200% | 0 EUR | 98,00 EUR |
| 10 User | 350% | 0 EUR | 171,50 EUR |
| Enterprise (unbegrenzt) | 800% | +50 EUR | 442,00 EUR |
Hauptprodukt "Kissenhülle": 12,00 EUR (Standardgröße 40x40)
| Variante | Prozent | Aufschlag | Berechnung | Ergebnis |
|---|---|---|---|---|
| 40x40 Standard | 100% | 0 EUR | (12 + 0) x 1,0 | 12,00 EUR |
| 40x40 + Reißverschluss | 100% | +3 EUR | (12 + 3) x 1,0 | 15,00 EUR |
| 50x50 | 130% | 0 EUR | (12 + 0) x 1,3 | 15,60 EUR |
| 50x50 + Reißverschluss | 130% | +3 EUR | (12 + 3) x 1,3 | 19,50 EUR |
Hauptprodukt "T-Shirt": 25,00 EUR
| Variante | Prozent | Aufschlag | Ergebnis |
|---|---|---|---|
| Einzelstück | 100% | 0 EUR | 25,00 EUR |
| 3er-Pack | 100% | -5 EUR | 20,00 EUR |
| 5er-Pack | 100% | -8 EUR | 17,00 EUR |
src/
├── Core/Checkout/Cart/
│ └── VariantPriceProcessor.php # Cart Processor (Priority 1000)
├── Exception/
│ └── ParentProductNotFoundException.php # HTTP 404 Exception
├── Migration/
│ └── Migration1705200000CreateCustomFields.php
├── Resources/config/
│ ├── config.xml # Rundungs-Einstellungen
│ └── services.xml # Service Container
├── Service/
│ ├── ParentPriceResolver.php # Parent-Lookup mit Request-Cache
│ ├── SurchargeConfig.php # Readonly Value Object
│ ├── SurchargeConfigReader.php # Custom Field Reader + Validierung
│ └── VariantPriceCalculator.php # Kern-Berechnungslogik
├── Subscriber/
│ └── ProductSubscriber.php # Storefront Event Listener
└── MmdVariantPriceSurcharge.php # Plugin-Hauptklasse
| Komponente | Event / Interface | Aufgabe |
|---|---|---|
| ProductSubscriber | sales_channel.product.loaded |
Storefront-Preisberechnung |
| VariantPriceProcessor | CartProcessorInterface (Prio 1000) |
Warenkorb-Preisberechnung |
| ParentPriceResolver | ResetInterface |
Request-Level Caching, N+1-Vermeidung |
Der ParentPriceResolver unterstützt Multi-Currency:
Symptom: Trotz gesetzter Custom Fields zeigt die Variante den Original-Preis.
Prüfung:
mmd_surcharge_enabled auf true gesetzt?Lösung:
bin/console cache:clear
Sicherstellen, dass alle drei Custom Fields korrekt befüllt sind. Prüfen ob der Wert auf der Variante oder dem Parent gesetzt ist (Inheritance).
Symptom: Produktseite zeigt korrekten Preis, aber im Warenkorb steht ein anderer.
Prüfung:
Lösung:
Der VariantPriceProcessor läuft mit Priority 1000 (spät), um nach den meisten anderen Processoren ausgeführt zu werden. Bei Konflikten mit anderen Preis-Plugins den Support kontaktieren.
Symptom: Die Custom Fields mmd_surcharge_* erscheinen nicht im Produkt.
Prüfung:
Lösung:
bin/console plugin:refresh
bin/console plugin:install --activate MmdVariantPriceSurcharge
bin/console cache:clear
Achtung: Falls die Custom Fields manuell gelöscht wurden, Plugin deinstallieren und neu installieren.
Symptom: Preise weichen minimal von der erwarteten Berechnung ab.
Prüfung: Welcher Rundungsmodus ist konfiguriert?
Lösung: Unter Erweiterungen > Varianten-Preisaufschlag > Konfiguration den Rundungsmodus und die Dezimalstellen prüfen. Standard: HALF_UP mit 2 Dezimalstellen (kaufmännische Rundung).
Warum sehe ich im Admin den Original-Preis?
Das ist gewollt. Das Plugin ist nur im Storefront aktiv, um Admin-Performance nicht zu beeinträchtigen. Im Frontend und Warenkorb wird der korrekte Preis angezeigt.
Was passiert wenn der berechnete Preis negativ wird?
Das Plugin stellt sicher, dass Preise nie unter 0,00 EUR fallen.
Kann ich nur Prozent ohne Aufschlag verwenden?
Ja, setze mmd_surcharge_fixed auf 0 oder lass es leer. Die Berechnung wird dann: Hauptprodukt-Preis x Prozentsatz.
Kann ich nur Aufschlag ohne Prozent verwenden?
Ja, setze mmd_surcharge_percentage auf 100 oder lass es leer. Die Berechnung wird dann: Hauptprodukt-Preis + Aufschlag.
Können Aufschläge negativ sein?
Ja, negative Aufschläge wirken als Rabatte. Beispiel: -10 EUR reduziert den Basispreis um 10 EUR vor der Prozentberechnung.
Was bedeutet Field-Specific Inheritance?
Wenn ein Custom Field auf der Variante nicht explizit gesetzt ist, wird automatisch der Wert des Parent-Produkts verwendet. So kann z.B. ein fixer Aufschlag zentral auf dem Hauptprodukt definiert werden.
Was ist der maximale Prozentsatz?
Das Plugin erlaubt bis zu 1000% (10x der Hauptprodukt-Preis).
Was ist der maximale Aufschlag?
Das Plugin erlaubt Aufschläge von -100.000 EUR bis +100.000 EUR.
Funktioniert das Plugin mit Multi-Currency?
Ja, der Parent-Preis wird währungsspezifisch geladen. Ist kein Preis in der aktuellen Währung vorhanden, wird die Default-Währung verwendet.
Kommerzielle Lizenz - Einzelinstallations-Lizenz inklusive:
Siehe LICENSE-Datei für vollständige Bedingungen.
Bei Fragen und Support:
Markus Michalski
E-Mail: support@markus-michalski.net
Siehe CHANGELOG.md im Repository für die vollständige Versionshistorie.