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 | |
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 postenRabett = 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)