Rabattberechnung
Zur Navigation springen
Zur Suche springen
Einleitung

Mittels des Reiters Programmlogik kann über die RabattDSL jede Art von Rabattstruktur abgebildet werden. Beispielsweise um Give-Aways bei bestimmten Kundenkategorien automatisch hinzuzufügen, oder auch um postenweise Rabatte zu gewähren.
- Code Das Textfeld in diesem Bereich ist der Programmeditor. In diesen geben Sie den Programmcode für die Rabattberechnung ein. Welche Optionen dafür zur Verfügung stehen finden Sie unter Sprachbeschreibung
- Prüfung
- In dem Textfeld wird das Ergebnis der Syntax-Prüfung angezeigt.
- Syntax prüfen Nach Klick auf diesen Button wird der in den Editor eingegebene Text einer Syntaxprüfung unterzogen.
Sprachbeschreibung
Allgemein
- Eigene Variablen müssen immer erst mit "let" dekaliert werden
- Anweisungen sind immer mit " ; " (Semikolon) zu beenden
- Dezimal-Zahlen sind immer mit . (Punkt), nicht mit , (Komma) getrennt werden
- Anweisungen innerhalb einer Abfrage müssen immer innerhalb der Klammern { } stehen
- Strings wie "Amzon" bei einer Abfrage if (VerkaufskanalName == "Amazon") sind immer in doppelte Anführungsstriche zu schreiben
- Liefer-Variablen enthalten immer die Lieferadresse, wenn diese leer ist, automatisch die Rechungsadresse
siehe Code-Beispiele
Farben
| Farbe | Bedeutung | Beispiel |
|---|---|---|
| rot | Text / String | "DE" , "AT" , "Amazon" |
| orange | lesbare Variable | BruttoGesamt, LieferlandIsoAlpha |
| blau | Funktion | let, if, else |
| grün | Definition einer Variable | Kommentar und beschreibbare Variable bspw. VersandArtid |
| schwarz | Definition einer Variable | Text in Kommentaren und eigene Variablen |
Befehle
| Befehl | Bemerkung | Beispiel | |
|---|---|---|---|
| let | Definition und Initialisierung einer Variablen | let AnzahlArtikel = 0; | |
| if (<Bedingung>){<Anweisungen>} | Auswertung einer Bedingung. Die <Bedingung> muss wahr oder falsch als Ergebnis liefern. Ist das Ergebnis wahr, werden die <Anweisungen> in den geschweiften Klammern ausgeführt. |
if (LieferlandIsoAlpha == "DE") {Anweisung}; | |
| else{<Anweisungen>} | Ist nur mit einem vorangehenden if erlaubt, die in den geschweiften Klammern enthaltenen <Anweisungen> werden nur ausgeführt, wenn die <Bedingung> falsch ist. | else {Anweisung}; | |
| else if (<Bedingung2>){<Anweisungen>} | So wie else, nur das zusätzlich noch die <Bedingung2> hinter dem else if geprüft wird. Die <Anweisungen> in den geschweiften Klammern werden nur ausgeführt, wenn <Bedingung> falsch und <Bedingung2> wahr ist. |
else if (LieferlandIsoAlpha == "AT" | LieferlandIsoAlpha == "NL") {Anweisung}; |
| loop posten{<Anweisungen>} | Geht die Posten eines Belegs in einer Schleife durch. Die <Anweisungen> in den geschweiften Klammern werden für jeden Posten des Belegs durchgeführt. Variablen mit der Sichtbarkeit Postenschleife sind nur innerhalb der geschweiften Klammern gültig. |
loop posten {Anweisung}; |
Operatoren
| Operator | Bemerkung | Beispiel |
|---|---|---|
| = | Zuweisung eines Wertes | porto = 3.99; |
| * | Multiplikation | porto = 0.49 * Stueck; |
| / | Division | if (KundenKategorieId == 2) {porto = porto / 2;} |
| // | Division mit Aufrundung des Ergebnisses | if (KundenKategorieId == 2) {porto = porto // 2;} |
| % | Modulo | AnzahlPakete = AnzahlArtikel % 5.3; |
| + | Plus | if (KundenKategorieName == "VIP") {porto = porto - 2;} |
| - | Minus | if (KundenKategorieName == "Ausland") {porto = porto + 2;} |
| <= | Kleiner gleich Vergleich | if (BruttoGesamt <= 100) {porto = 10;} |
| >= | Größer gleich Vergleich | if (BruttoGesamt >= 100) {porto = 0;} |
| < | Kleiner Vergleich | if (BruttoGesamt < 100) {porto = 10;} |
| > | Größer Vergleich | if (BruttoGesamt > 100) {porto = 0;} |
| == | Gleich-Vergleich von Strings | if (VerkaufskanalName == "Amazon") |
| != | Ungleich-Vergleich von Strings | if (VerkaufskanalName != "Amazon") |
| && | UND-Verknüpfung von Abfragen | if (VersandArtId == 2 && ZahlungsweiseId == 2) |
| || | Oder-Verknüpfung von Abfragen | if (LieferlandIsoAlpha == "DE" || LieferlandIsoAlpha == "AT") |
| IN | Wert in Bereich vorhanden | if (LieferlandIsoAlpha IN ("DE","AT","NL","BE")) |
| /* */ | Kommentar | /* Portobrechnung Deutschland DHL Paket national */ |
Variablen
| Name | Bemerkung | Typ | Sichtbarkeit | Zugriff |
|---|---|---|---|---|
| true | Wahr | Bool | Global | Lesbar |
| false | Falsch | Bool | Global | Lesbar |
| CurrentDay | Aktueller Tag (1-31) | Int | Global | Lesbar |
| CurrentMonth | Aktueller Monat (1-12) | Int | Global | Lesbar |
| CurrentYear | Aktuelles Jahr (vierstellig) | Int | Global | Lesbar |
| BruttoGesamt | Summe aller Posten-Bruttobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, inkl. Posten- und Belegrabatt. Rabatte werden jedoch nicht auf rezeptpflichtige Artikel angewandt. | Decimal | Global | Lesbar |
| BruttoGesamtOhneRabatt | Summe aller Posten-Bruttobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, ohne Posten- und Belegrabatt. | Decimal | Global | Lesbar |
| BruttoGesamtOhneRx | Summe aller Non-RX Posten-Bruttobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, inkl. Posten- und Belegrabatt. | Decimal | Global | Lesbar |
| BruttoGesamtOhneRxOhneRabatt | Summe aller Non-RX Posten-Bruttobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, ohne Posten- und Belegrabatt. | Decimal | Global | Lesbar |
| PostenNettoEinzel | Einzelpreis des Posten in netto | Decimal | Postenschleife | Lesbar |
| PostenNettoGesamt | Gesamtpreis des Posten in netto | Decimal | Postenschleife | Lesbar |
| PostenBruttoEinzel | Einzelpreis des Posten in brutto | Decimal | Postenschleife | Lesbar |
| PostenBruttoGesamt | Gesamtpreis des Posten in brutto | Decimal | Postenschleife | Lesbar |
| NettoGesamt | Summe aller Posten-Nettobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, inkl. Posten- und Belegrabatt. Rabatte werden jedoch nicht auf rezeptpflichtige Artikel angewandt. | Decimal | Global | Lesbar |
| NettoGesamtOhneRabatt | Summe aller Posten-Nettobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, ohne Posten- und Belegrabatt. | Decimal | Global | Lesbar |
| NettoGesamtOhneRx | Summe aller Non-RX Posten-Nettobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, inkl. Posten- und Belegrabatt. | Decimal | Global | Lesbar |
| NettoGesamtOhneRxOhneRabatt | Summe aller Non-RX Posten-Nettobeträge, die keine Versandkosten- oder Zahlungsweiseartikel enthalten, ohne Posten- und Belegrabatt. | Decimal | Global | Lesbar |
| LieferlandIsoAlpha | 2-Stelliger IsoAlphaCode | String | Global | Lesbar |
| LieferPlz | String | Global | Lesbar | |
| LieferPlzZone | Erste Stelle der Postleitzahl | String | Global | Lesbar |
| LieferPlzBereich | Die ersten zwei Stellen der Postleitzahl | String | Global | Lesbar |
| LieferStrasse | String | Global | Lesbar | |
| VersandArtName | String | Global | Les- und Schreibbar | |
| VersandArtId | Int | Global | Les- und Schreibbar | |
| GesamtGewicht | Decimal | Global | Lesbar | |
| GesamtVolumen | Decimal | Global | Lesbar | |
| KundenKategorieName | String | Global | Lesbar | |
| KundenKategorieId | Int | Global | Lesbar | |
| KundeEingeloggt | Bool | Global | Lesbar | |
| KundeHatShopAccount | Bool | Global | Lesbar | |
| ZahlungsweiseName | String | Global | Lesbar | |
| ZahlungsweiseId | Int | Global | Lesbar | |
| BelegtypName | String | Global | Lesbar | |
| BelegtypId | Int | Global | Lesbar | |
| VerkaufskanalName | Amazon, Mauve Webshopsystem, Unbekannt, Email etc. | String | Global | Lesbar |
| VerkaufskanalId | Int | Global | Lesbar | |
| BelegSprache | String | Global | Lesbar | |
| AnzahlEinnahmeBelege | String | Global | Lesbar | |
| SummeZahlungen | Decimal | Global | Lesbar | |
| PersonBelegRabatt | Der unter Adressen (F7)/Sonstiges angegebene Belegrabatt | Decimal | Global | Lesbar |
| PersonPostenRabatt | Der unter Adressen (F7)/Sonstiges angegebene Postenrabatt | Decimal | Global | Lesbar |
| Stueck | Int | Postenschleife | Lesbar | |
| PostenNr | Int | Postenschleife | Lesbar | |
| PostenRabatt | String | Postenschleife | Lesbar | |
| ArtikelNr | String | Postenschleife | Lesbar | |
| ArtikelName | String | Postenschleife | Lesbar | |
| ArtikelGewicht | Decimal | Postenschleife | Lesbar | |
| VerschreibungsPflichtig | nur Apotheke | Bool | Postenschleife | Lesbar |
| ApothekenPflichtig | nur Apotheke | Bool | Postenschleife | Lesbar |
| RezeptArt | nur Apotheke (Kein, Kassenrezept, Privat, Kassenrezept(befreit), Sprechstundenbedarf, Praxisbedarf | String | Postenschleife | Lesbar |
| ExterneReferenzNr | String | Postenschleife | Lesbar | |
| ArtikelHoehe | Decimal | Postenschleife | Lesbar | |
| ArtikelBreite | Decimal | Postenschleife | Lesbar | |
| ArtikelLaenge | Decimal | Postenschleife | Lesbar | |
| ArtikelVolumen | Decimal | Postenschleife | Lesbar | |
| ArtikelWarengruppeID | Warengruppen-IDs (nur Hauptwarengruppe) des Artikels | Decimal | Postenschleife | Lesbar |
| IstAbdaArtikel | nur Apotheke | Bool | Postenschleife | Lesbar |
| BelegWerbeaktionID | Int | Global | Lesbar | |
| BelegWerbeaktionName | String | Global | Lesbar | |
| PostenWerbeaktionID | Int | Postenschleife | Lesbar | |
| PostenWerbeaktionName | String | Postenschleife | Lesbar | |
| AuftragsDatumDay | Int | Global | Lesbar | |
| AuftragsDatumMonth | Int | Global | Lesbar | |
| AuftragsDatumYear | Int | Global | Lesbar | |
| WaehrungKurs | Umrechnungskurs der Belegwährung | Decimal | Global | Lesbar |
| WaehrungCode | ISO Alpha-Code der Belegwährung | String | Global | Lesbar |
| EnthaeltERezepte | Bool | Global | Lesbar | |
| EnthaeltRezepte | Bool | Global | Lesbar | |
| IstRezept | Bool | Postenschleife | Lesbar | |
| IstERezept | Bool | Postenschleife | Lesbar | |
| IstPapierRezept | Bool | Postenschleife | Lesbar |
Methoden
| Name | Bemerkung | Rückgabe-Typ | Parameter | Beispiel | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| AddPosten(string artikelNr, string artikelName, string bemerkung, string kennung, decimal stueck, decimal einzelpreisButto) | Fügt einen Posten hinzu | void |
|
AddPosten("Artikelnr hier", "Artikelname hier", "Postenbemerkung hier", "Eindeutige Kennung der Aktion " + ArtikelNr, 1, 0);
| ||||||||||||
| DeletePosten('Kennung') | Löscht den definierten Posten | String |
|
DeletePosten("BeispielAktion01");
| ||||||||||||
| SetPostenRabatt(PostenNr, rabatt) | Setzt den Postenrabatt | void |
|
SetPostenRabatt(PostenNr, 10);
| ||||||||||||
| EnthaeltArtikelNr(string artikelNr) | Prüft, ob der Beleg einen Posten mit der Artikel-Nr. artikelNr besitzt | Bool |
|
if (EnthaeltArtikelNr("123456")) {<Anweisungen>}
| ||||||||||||
| GetPersonFreifeldText(string freifeldName) | Liefert den Inhalt des Personen-Freifelds mit dem Namen freifeldName zurück | String |
|
let freifeld1 = GetPersonFreifeldText("Freifeld1");
| ||||||||||||
| GetArtikelHauptwarengruppeId(int PostenNr, int shopId) | Ermittelt die Hauptwarengruppe des Artikels eines Postens für den angegebenen Shop shopId | Int |
|
let warengruppeId = GetPostenArtikelHauptwarengruppeId(1, 1);
| ||||||||||||
| IsPostenArtikelInWarengruppe(int PostenNr, int warengruppeId) | Prüft, ob ein Postenartikel zu einer bestimmten Warengruppe gehört | Bool |
|
let inWarengruppe = IsPostenArtikelInWarengruppe(1, 1);
| ||||||||||||
| GetArtikelFreifeldText(int PostenNr, string freifeldName) | Liefert den Inhalt des Artikel-Freifelds für den Artikel des Postens mit der PostenNr PostenNr und dem Namen freifeldName zurück | String |
|
let freifeld1 = GetArtikelFreifeldText(1, "Freifeld1");
| ||||||||||||
| HasValueInArtikelFreifeldText(string freifeldName, string value) | Prüft, ob einer der Posten des Belegs im Artikel-Freifelds mit dem Namen freifeldName den Wert value besitzt | Bool |
|
if (HasValueInArtikelFreifeldText("Freifeld1", "Gesuchter Wert") {<Anweisungen>};
| ||||||||||||
| Floor(decimal zahl) | Abrundung eines Wertes auf die nächstkleinere Ganzzahl | Int |
|
let anzahlGratisArtikel = Floor(Stueck / aktion);
| ||||||||||||
| Round(decimal zahl, int stellen) | Rundung eines Wertes auf die angegebene Stellenzahl | Decimal |
|
let gerundeterWert = Round(1.234567, 2);
| ||||||||||||
| IsVersandOrZahlungsweiseArtikel(int PostenNr) | Ob ein Artikel ein Zahlungsweise- oder Versandkostenartikel ist | Bool |
|
if (IsVersandOrZahlungsweiseArtikel(1))
| ||||||||||||
| GetPostenRabatt(int PostenNr) | liefert den bereits vergebenen Postenrabatt in % zurück | decimal |
|
let postenRabatt = GetPostenRabatt(1);
| ||||||||||||
| HasRabattSperre(int PostenNr) | Ob der dem Posten zugeordnete Artikel eine Rabattsperre besitzt | Bool |
|
if (HasRabattSperre(1))
| ||||||||||||
| StartsWithString(string WerbeaktionName, string x) | Prüft ob der Name einer Werbeaktion mit einer bestimmten Zeichenfolge beginnt | Bool |
|
let beginntMitABC = StartsWithString(BelegWerbeaktionName, "ABC");
|
Code-Beispiel
Allgemeiner Code-Aufbau
/* Variablendeklaration */
let rabatt = 0;
/* Abfragen / Anweisungen */
if (KundenKategorieName == "Apotheke")
{
rabatt = 10;
}
else if (KundenKategorieName == "VIP-Kunde")
{
rabatt = 3;
}
else
{
rabatt = 0;
}
/* Setzen der Rabatte / Hinzufügen der Gratisartikel */
loop posten
{
SetPostenRabatt(PostenNr, rabatt);
}
Beispiel-Logik 1
let anzahlGratisArtikel = 0;
let aktion = 0;
if(KundenKategorieName == "Privat")
{
aktion = 10;
}
else if(KundenKategorieName == "Apotheke")
{
aktion = 5;
}
loop posten
{
/* Naturalrabatt - Warengruppen */
if(aktion > 0 && ArtikelWarengruppeID IN (47,49,23,24,25,40))
{
anzahlGratisArtikel = Floor(Stueck / aktion);
if(anzahlGratisArtikel > 0)
{
AddPosten(ArtikelNr, ArtikelName, "", "Test" + ArtikelNr, anzahlGratisArtikel, 0);
}
}
if(KundenKategorieName == "Apotheke" && ArtikelWarengruppeID IN (1143,97,96,1142,320,326))
{
SetPostenRabatt(PostenNr, 10);
}
}
- Siehe auch:
- Rabattberechnung Optionen
- Belege (F8)