Allgemeine Informationen
ZR Price Calculator berechnet Produktpreise dynamisch anhand kundenseitig erfasster Eingaben (z. B. Fläche, Volumen, Laufmeter).
Dafür legen Sie Berechnungsregeln an – Formeln über Freitext-Variationen und weitere Parameter – und verknüpfen diese in der JTL-Wawi über das Funktionsattribut zr_pricing mit dem Artikel.
Auf der Artikeldetailseite aktualisiert sich der Preis live, sobald der Kunde Werte eingibt. Derselbe Preis wird serverseitig beim Hinzufügen in den Warenkorb neu berechnet und durchgesetzt.
Nach erfolgreicher Verknüpfung der Lizenz und Installation des Plugins finden Sie die Benutzeroberfläche des Plugins im JTL Shop Backend unter installierte Plugins -> ZR Price Calculator.
2. Vorbereitungen in JTL Wawi
Um das Plugin zu nutzen, müssen nachfolgende Einstellungen in der JTL-Wawi vorgenommen werden.
2.1 Funktionsattribut anlegen
In der JTL-Wawi unter Artikel → Attribute ein neues Funktionsattribut anlegen:
| Einstellung | Wert |
|---|---|
| Name | zr_pricing |
| Datentyp | Text (Freitext) |
| Onlineshop | für den betreffenden Shop aktivieren |
Der Wert des Attributs am Artikel ist später der technische Schlüssel der Berechnungsregel (z. B. quadratmeter). Im Plugin-Backend können Sie diesen Wert per Klick kopieren (zr_pricing = [ihr_schluessel]).
2.2 Freitext-Variationen am Artikel anlegen
Jeder Parameter einer Regel entspricht einer Freitext-Variation (Freifeld / Pflicht-Freifeld) am Artikel. Legen Sie also die Freitextvariationen am Artikel an, die Sie für Ihre Preisberechnung nutzen wollen. Der Variationsname muss mit dem Parameter-Key der Regel übereinstimmen (z. B. Freitext-Variation Breite wird im Plugin der Parameter Breite).
Dropdown-/Auswahl-Variationen werden als Formel-Eingaben nicht unterstützt – nur Freitext-Felder.
Wichtig: Die Regel wird auf der Artikelseite nur aktiv, wenn jeder Parameter der Regel eine passende Freitext-Variation am Artikel hat. Fehlt auch nur eine Zuordnung, bleibt die Live-Berechnung für diesen Artikel deaktiviert.
3. Berechnungsregel anlegen
Das Anlegen einer Regel erfolgt schrittweise im Plugin-Backend. Für diese Dokumentation nutzen wir als Praxisbeispiel einen Zuschnitt-Service (z. B. Plattenware): Der Kunde gibt Länge und Breite in cm ein, der Preis ergibt sich aus Fläche × Grundpreis.
3.1 Regeldaten
- Neue Regel wählen.
- Regelname vergeben (z. B. „Fläche Quadratmeter“).
- Technischen Schlüssel festlegen (z. B.
quadratmeter). Dieser Wert wird in der Wawi als Wert vonzr_pricingam Artikel eingetragen. - Den angezeigten Wawi-Wert kopieren und am Artikel hinterlegen.
3.2 Freie Parameter (Freitext-Variationen zur Kundeneingabe)
Definieren Sie die Freitextvariationen, für die der Kunde im Shop Werte eingibt und die zur Preisberechnung verwendet werden sollen. Jeder Parameter braucht:
| Feld | Bedeutung |
|---|---|
| Label / Key | Anzeigename und technischer Key (= Variationsname in der Wawi) |
| Einheit | z. B. cm, m, m² – optional im Shop anzeigen |
| Umrechnungsfaktor | Multiplikator vor der Formel (z. B. 0.01 für cm → m) |
| min / max | optionale Grenzwerte |
| Nachkommastellen | erlaubte Nachkommastellen bei der Eingabe |
Beispiel Parameter für Flächenpreis:
Länge– Einheitcm, Faktor0.01(→ Meter), min10, max250Breite– Einheitcm, Faktor0.01(→ Meter), min10, max250
Eingebaute Werte, die Sie nicht als Parameter anlegen:
grundpreis– Verkaufspreis des Artikels aus dem Shop (BruttofVK)
3.3 Formel
Bauen Sie die Formel zur Preisberechnung per Klick aus den Bausteinen Parameter, Operatoren, Funktionen und Zahlen zusammen.
Unterstützte Operatoren
| Gruppe | Zeichen |
|---|---|
| Rechnen | + - * / ^ (Potenz) % (Modulo) |
| Vergleich | > < >= <= == |
| Klammern / Argumente | ( ) , |
Unterstützte Funktionen
| Funktion | Bedeutung |
|---|---|
min(a, b) | kleinerer Wert |
max(a, b) | größerer Wert |
round(x) | runden |
if(bedingung, dann, sonst) | bedingte Berechnung |
Beispiel Flächenpreis:
Länge * Breite * grundpreis
Mit Umrechnungsfaktor 0.01 auf beiden Seiten entspricht das der Fläche in m² × Verkaufspreis (€/m²).
3.4 Verarbeitung
Hier haben Sie die Möglichkeit, weitere Optionen zur Preisverarbeitung festzulegen. Diese Schritte greifen nach der Formelauswertung:
| Option | Beschreibung |
|---|---|
| Rundung | kaufmännisch, abrunden, aufrunden, 5-Cent-, 10-Cent-Rundung |
| Nachkommastellen | Präzision der Rundung (außer Cash-Rundung) |
| Mindestpreis | Untergrenze des berechneten Preises |
| Aufschlag / Verschnitt % | prozentualer Zuschlag nach der Formel |
| Leerfall | normaler VK = ohne gültige Eingabe Shop-VK anzeigen; Kauf blockieren = Warenkorb-Add verhindern |
| Preisaufschlüsselung | Formel-/Preis-Erklärung unter dem Preis im Shop |
3.5 Test
Im Abschnitt Test geben Sie Beispielwerte für die Parameter ein. Das Ergebnis enthält Staffelauflösung, Formel, Zuschlag, Mindestpreis und Rundung – analog zur Shop- und Warenkorb-Logik.
Abschließend Speichern.
4. Weitere Artikel mit der Regel verknüpfen
- In der Wawi am gewünschten Artikel das Funktionsattribut
zr_pricingsetzen und als Wert den technischen Schlüssel der Regel eintragen (z. B.quadratmeter). - Freitext-Variationen anlegen, deren Namen den Parametern entsprechen.
- Artikelpreis (Grundpreis) so setzen, wie ihn die Formel erwartet (z. B. €/m²).
- Daten an den Onlineshop übertragen.
- Artikelseite im Frontend prüfen: Live-Preis, optionale Aufschlüsselung und Staffel-Tabelle.
5. Ausgabe im Shop-Frontend (Kundenansicht)
Sobald eine gültige Regel korrekt am Artikel hängt und alle Parameter-Variationen vorhanden sind, passieren folgende Dinge auf der Artikelseite:
- Freitextfelder erhalten Einheiten-Hinweis und Validierung (min/max, Pflicht).
- Der angezeigte Preis aktualisiert sich bei jeder Eingabe ohne zusätzliche AJAX-Anfrage.
- Optional erscheint die Preisaufschlüsselung unter dem Preis.
- Optional erscheint die Staffel-Tabelle; die erreichte Stufe ist farblich markiert.
- Beim Hinzufügen in den Warenkorb wird der Preis serverseitig neu berechnet – die Frontend-Anzeige ist eine Vorschau, der Warenkorb ist maßgeblich.
6. Anwendungsbeispiele
6.1 Anwendungsbeispiel 1: Zuschnitt nach Fläche
Use Case: Platten, Stoffe, Glas – Kunde misst in cm, Preis in €/m².
- Parameter:
Breite(Faktor 0.01),Länge(Faktor0.01) - Formel:
Breite * Länge * grundpreis - Wawi:
zr_pricing = quadratmeter, FreitextfelderBreiteundLänge
JSON-Import dieses Beispiels:
{
"key": "quadratmeter",
"name": "Fläche Quadratmeter",
"formulaTokens": [
{
"type": "param",
"key": "Breite"
},
{
"type": "operator",
"value": "*"
},
{
"type": "param",
"key": "Länge"
},
{
"type": "operator",
"value": "*"
},
{
"type": "param",
"key": "grundpreis"
}
],
"tierMetricKey": null,
"priceTiers": [],
"roundingMode": "round_half_up",
"roundingPrecision": 2,
"minPrice": 0,
"surchargePercent": 0,
"emptyInputBehavior": "fallback_vk",
"showBreakdown": true,
"showStaffel": false,
"isActive": true,
"parameters": [
{
"key": "Breite",
"label": "Breite",
"unit": "cm",
"showUnit": true,
"conversionFactor": 0.01,
"minValue": 10,
"maxValue": 250,
"step": 0.1,
"decimalPlaces": 1
},
{
"key": "Länge",
"label": "Länge",
"unit": "cm",
"showUnit": true,
"conversionFactor": 0.01,
"minValue": 10,
"maxValue": 250,
"step": 0.1,
"decimalPlaces": 1
}
]
}
6.2 Anwendungsbeispiel 2: Laufmeter mit Mindestpreis
Use Case: Profile, Leisten, Kabel – Preis pro Meter, kleiner Auftrag nicht unter Mindestpreis.
- Parameter:
Länge(Einheitm, Faktor1, min0,5, max50) - Formel:
Länge * grundpreis - Verarbeitung: Mindestpreis z. B.
25
emptyInputBehavior: "block" verhindert den Kauf ohne gültige Längenangabe.
JSON-Import dieses Beispiels:
{
"key": "laufmeter",
"name": "Laufmeter",
"formulaTokens": [
{
"type": "param",
"key": "Länge"
},
{
"type": "operator",
"value": "*"
},
{
"type": "param",
"key": "grundpreis"
}
],
"tierMetricKey": "Länge",
"priceTiers": [
{
"from": 10,
"value": 0.9
},
{
"from": 20,
"value": 0.85
}
],
"roundingMode": "round_half_up",
"roundingPrecision": 2,
"minPrice": 25,
"surchargePercent": 0,
"emptyInputBehavior": "block",
"showBreakdown": true,
"showStaffel": false,
"isActive": true,
"parameters": [
{
"key": "Länge",
"label": "Länge",
"unit": "m",
"showUnit": true,
"conversionFactor": 1,
"minValue": 0.5,
"maxValue": 50,
"step": 0.1,
"decimalPlaces": 1
}
]
}
Anwendungsbeispiel 3: Mengenstaffel über Fläche
Use Case: Je größer die bestellte Fläche, desto günstiger der Faktor.
- Parameter:
flaeche(m²) - Bezugsparameter Staffel:
flaeche - Formel:
staffel * flaeche - Staffel-Übersicht im Shop aktiv
Bei 12 m² greift die Stufe ab 5 → staffel = 42 → Preis 42 × 12 = 504.
{
"key": "flaeche_staffel",
"name": "Fläche mit Staffel",
"formulaTokens": [
{ "type": "param", "key": "staffel" },
{ "type": "operator", "value": "*" },
{ "type": "param", "key": "flaeche" }
],
"tierMetricKey": "flaeche",
"priceTiers": [
{ "from": 0, "value": 45 },
{ "from": 5, "value": 42 },
{ "from": 20, "value": 38 }
],
"roundingMode": "round_half_up",
"roundingPrecision": 2,
"minPrice": null,
"surchargePercent": null,
"emptyInputBehavior": "fallback_vk",
"showBreakdown": true,
"showStaffel": true,
"isActive": true,
"parameters": [
{
"key": "flaeche",
"label": "Fläche",
"unit": "m²",
"showUnit": true,
"conversionFactor": 1,
"minValue": 0.5,
"maxValue": 200,
"step": null,
"decimalPlaces": 2
}
]
}
Anwendungsbeispiel 4: Bedingte Formel mit if
Use Case: Rabatt ab einer bestimmten Fläche, sonst Normalpreis.
Entspricht: if(flaeche > 10, flaeche * grundpreis * 0.9, flaeche * grundpreis) mit 5-Cent-Rundung.
{
"key": "flaeche_rabatt",
"name": "Fläche mit Mengenrabatt",
"formulaTokens": [
{ "type": "function", "name": "if" },
{ "type": "operator", "value": "(" },
{ "type": "param", "key": "flaeche" },
{ "type": "operator", "value": ">" },
{ "type": "number", "value": 10 },
{ "type": "operator", "value": "," },
{ "type": "param", "key": "flaeche" },
{ "type": "operator", "value": "*" },
{ "type": "param", "key": "grundpreis" },
{ "type": "operator", "value": "*" },
{ "type": "number", "value": 0.9 },
{ "type": "operator", "value": "," },
{ "type": "param", "key": "flaeche" },
{ "type": "operator", "value": "*" },
{ "type": "param", "key": "grundpreis" },
{ "type": "operator", "value": ")" }
],
"tierMetricKey": null,
"priceTiers": [],
"roundingMode": "cash_05",
"roundingPrecision": 2,
"minPrice": null,
"surchargePercent": null,
"emptyInputBehavior": "fallback_vk",
"showBreakdown": true,
"showStaffel": false,
"isActive": true,
"parameters": [
{
"key": "flaeche",
"label": "Fläche",
"unit": "m²",
"showUnit": true,
"conversionFactor": 1,
"minValue": 1,
"maxValue": 100,
"step": null,
"decimalPlaces": 2
}
]
}
Import und Export
In der Regelübersicht können Sie Regeln:
- Als JSON exportieren – Datei zum Backup oder zur Übertragung in einen anderen Shop
- Importieren – JSON-Datei hochladen oder Inhalt einfügen
Der technische Schlüssel muss beim Import eindeutig sein. Das JSON-Format entspricht den Beispielen in Abschnitt 5 (ohne Datenbank-id).
Übersicht und Verwaltung
In der Regelübersicht sehen Sie alle angelegten Regeln mit Name, Schlüssel und Status. Sie können:
- suchen und nach Aktiv/Inaktiv filtern
- Regeln bearbeiten, duplizieren oder löschen
- den Status (aktiv/inaktiv) umschalten
- importieren und exportieren
Inaktive Regeln werden im Shop nicht angewendet, auch wenn zr_pricing am Artikel noch gesetzt ist.
Hinweise und Einschränkungen
- Die Formel und Verarbeitungsoptionen liegen als JSON in der Artikelseite (Live-Berechnung ohne Server-Roundtrip). Der Warenkorbpreis wird dennoch immer serverseitig neu ermittelt.
- Nur Freitext-Variationen (
FREIFELD/PFLICHT-FREIFELD) als Parameter. - Alle Parameter der Regel müssen am Artikel vorhanden sein – sonst keine Live-Berechnung.
- Texte für Validierung, Staffel und Aufschlüsselung lassen sich über die Plugin-Sprachvariablen im Shop anpassen (z. B.
zrPricingMsgRequired,zrPricingMsgStaffelFrom).







