Rabattberechnung

Aus Mauve System3 Handbuch
Wechseln zu: Navigation, Suche


Einleitung

Rabattlogik.png

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") {Anweisung};
loop posten{<Anweisungen>} Geht die Posten eines Belegs in einer Schleife durch. Die <Anweisungen> in den geschweriften 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
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-ID's 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

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
string artikelNr Die Artikelnummer des Artikels für den hinzuzufügenden Posten
string artikelName Die Postenbezeichnung (Name des Artikels) für den hinzuzufügenden Posten
string bemerkung Die Postenbemerkung
string kennung Die eindeutige Kennung der Aktion, wird in ExterneReferenzNr beim Posten gespeichert
decimal stueck Die Stückzahl des Artikels
decimal einzelpreisButto Der Einzelpreis des Artikels incl. MwSt.
AddPosten("Artikelnr hier", "Artikelname hier", "Postenbemerkung hier", "Eindeutige Kennung der Aktion " + ArtikelNr, 1, 0);
SetPostenRabatt(PostenNr, rabatt) Setzt den Postenrabatt void
int PostenNr Die Postennummer des Postens, dessen Rabatt gesetzt werden soll
decimal rabatt Der zu setzende Postenrabatt in Prozent
SetPostenRabatt(PostenNr, 10);
EnthaeltArtikelNr(string artikelNr) Prüft, ob der Beleg einen Posten mit der Artikel-Nr. artikelNr besitzt Bool
string artikelNr Die Artikel-Nr. des Artikels, nach dem im Beleg gesucht werden soll
if (EnthaeltArtikelNr("123456")) {<Anweisungen>}
GetPersonFreifeldText(string freifeldName) Liefert den Inhalt des Personen-Freifelds mit dem Namen freifeldName zurück String
string freifeldName Der Name des gesuchten Freifelds
let freifeld1 = GetPersonFreifeldText("Freifeld1");
GetPostenArtikelHauptwarengruppeId(int PostenNr, int shopId) Ermittelt die Hauptwarengruppe des Artikels eines Postens für den angegebenen Shop shopId Int
int PostenNr Die Nummer des Postens, für den die Hauptwarengruppe ermittelt werden soll
int shopId Die Id des Shops, für den die Hauptwarengruppe ermittelt werden soll
let warengruppeId = GetPostenArtikelHauptwarengruppeId(1, 1);
IsPostenArtikelInWarengruppe(int PostenNr, int warengruppeId) Prüft, ob ein Postenartikel zu einer bestimmten Warengruppe gehört Bool
int PostenNr Die Nummer des Postens, für den die Warengruppenzugehörigkeit ermittelt werden soll
int warengruppeId Die Id der Warengruppe, auf dessen Zugehörigkeit der Posten geprüft werden soll
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
int PostenNr Die Nummer des Postens, für den das Freifeld ermittelt werden soll
string freifeldName Der Name des gesuchten Freifelds
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
string freifeldName Der Name des gesuchten Freifelds
string value Der gesuchte Wert
if (HasValueInArtikelFreifeldText("Freifeld1", "Gesuchter Wert") {<Anweisungen>};
Floor(decimal zahl) Abrundung eines Wertes auf die nächstkleinere Ganzzahl Int
decimal zahl Der abzurundende Wert
let anzahlGratisArtikel = Floor(Stueck / aktion);
Round(decimal zahl, int stellen) Rundung eines Wertes auf die angegebene Stellenzahl Decimal
decimal zahl Der zu rundende Wert
int stellen Die Nachkommastellen-Anzahl auf die der Wert gerundet werden soll
let gerundeterWert = Round(1.234567, 2);
IsVersandOrZahlungsweiseArtikel(int PostenNr) Ob ein Artikel ein Zahlungsweise- oder Versandkostenartikel ist Bool
int PostenNr Die Postennummer
if (IsVersandOrZahlungsweiseArtikel(1))

{<Anweisungen>}

GetPostenRabatt(int PostenNr) liefert den bereits vergebenen Postenrabatt in % zurück decimal
int PostenNr Die Postennummer
let postenRabett = GetPostenRabatt(1);
HasRabattSperre(int PostenNr) Ob der dem Posten zugeordnete Artikel eine Rabattsperre besitzt Bool
int PostenNr Die Postennummer
if (HasRabattSperre(1))

{<Anweisungen>}

StartsWithString(string WerbeaktionName, string x) Prüft ob der Name einer Werbeaktion mit einer bestimmten Zeichenfolge beginnt Bool
string WerbeaktionName Der Name der Werbeaktion
string x Die zu prüfende Zeichenkette
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)