Warenkorbberechnung

Für Shopanbindungen kann ein ganzer Warenkorb gerechnet, und mit derselben Schnittstelle auch als Bestellung übermittelt werden. die Datenstruktur sieht wie folgt aus: 

Als Wurzelelement steht der Warenkorb, dem die Positionen und die Verträge (mit wiederum Positionen) angehängt sind (grüne Tabellen). Optional können diverse Adressen mitgegeben werden, wobei immer die Online*-Adressen verwendet werden sollen (blaue Tabellen). In die gelben Adress-Tabellen sollte geschrieben werden, wenn dies im Projekt explizit so definiert wird. 

Im Folgenden wird auf den Warenkorb und die angehängten Positionen und Verträge eingegangen. Die diversen Adressen verhalten sich gem. REST-Standard und haben keinen Einfluss auf die Berechnung haben.

Ein einfacher Warenkorb mit einer Onlinelieferadresse und einem Vertrag mit separater Teilnehmeradresse sieht folgendermaßen aus:

Warenkorb-Bestellung
{
  "WarenkorbAktion": 10,
  "AdresseID": 1,
  "ExterneID": "123",
  "FremdsystemID": 1,
  "id": 1,
  "WarenkorbPosition": [
    {
      "ID": 1,
      "ArtikelID": 1818,
      "Anzahl": 7
    },{
      "ID": 2,
      "ArtikelID": 1818,
      "Anzahl": 1,
      "EinzelPreisExkl": 5,
      "PreisErmittlung": 55
    }
  ],
  "WarenkorbVertrag": [
    {
      "ID": 5,
      "VertragDefID": 4488,
      "Anzahl": 1,
      "OnlineAdresse": [
      	{
      		"Name": "me"
      	}
      ]
    }
  ],
  "OnlineLieferAdresse": [
  	{
  	  "Name": "LA"
  	}
  ]
}

Die Antwort ist dann:

Antwort auf Warenkorb
{
  "ID": 1,
  "BereichID": null,
  "AdresseID": 1,
  "ExterneID": "123",
  "FremdsystemID": "1",
  "Hinweis": null,
  "InklMWST": true,
  "LieferAdresseID": null,
  "Lieferdatum": null,
  "OnlineAdresseID": null,
  "OnlineLieferAdresseID": null,
  "OnlineRechnungsAdresseID": null,
  "PreisgruppeID": null,
  "RechnungsAdresseID": null,
  "SaferPayBetrag": null,
  "SaferPayID": null,
  "SaferPayToken": null,
  "ZahlungswegKarteID": null,
  "WarenkorbAktion": 10,
  "OnlineLieferAdresse": [
    {
      "ID": null,
      "AdresseID": null,
      "Adressnummer": null,
      "AnredeID": null,
      "Beruf": null,
      "Briefanrede": null,
      "DatumErfassung": "2017-03-22T00:00:00.000Z",
      "Eintragtyp": 1,
      "EMail": null,
      "EMailD": null,
      "EMailG": null,
      "EMailNewsletter": null,
      "ErhaeltMailing": false,
      "FaxD": null,
      "FaxG": null,
      "FaxP": null,
      "Firma": null,
      "Firmenzusatz": null,
      "Geburtsdatum": null,
      "Heimatort": null,
      "Homepage": null,
      "HomepageD": null,
      "HomepageG": null,
      "Kommunikationsmittel": 10,
      "LandID": 1,
      "LandIDNationalitaet": 1,
      "Name": "LA",
      "Name2": null,
      "Natel": null,
      "NatelD": null,
      "NatelG": null,
      "Notizen": null,
      "OnlineAktiv": false,
      "OnlineBenutzername": null,
      "OnlineMail": null,
      "OnlineMailIstVerifiziert": false,
      "OnlinePasswort": null,
      "OnlinePasswortIstGeaendert": false,
      "OnlineSalt": null,
      "OnlineTransaktionID": null,
      "Ort": null,
      "PLZ": null,
      "PLZOrtID": null,
      "Sprache": "DE",
      "Strasse": null,
      "Suchbegriff": null,
      "TelD": null,
      "TelG": null,
      "TelP": null,
      "Titel": null,
      "Titelzusatz": null,
      "Verarbeitet": false,
      "VertrID": null,
      "VNR": null,
      "Vorname": null,
      "Zivilstand": null,
      "Zusatz1": null,
      "Zusatz2": null,
      "AufnahmeartID": null,
      "PreisgruppeID": null,
      "Art32": false,
      "Arbeitgeber": null,
      "Arbeitsort": null,
      "BeginnLehre": null,
      "BerufLernendeID": null,
      "Berufsschulklasse": null,
      "EndeLehre": null,
      "LandISO": "CH",
      "LehreID": null,
      "LehreStatus": null,
      "Notfalladresse": null,
      "NotizenLernender": null
    }
  ],
  "WarenkorbVertrag": [
    {
      "ID": 5,
      "AdresseID": null,
      "Anzahl": 1,
      "Bemerkungen": null,
      "KundenkonditionID": 44,
      "MWSTProzent": 2.5,
      "NamenPersonen": null,
      "OnlineGeschaeftsAdresseID": null,
      "PreisgruppeID": null,
      "TarifstufeID": null,
      "TotalBetragNettoExkl": 112.2,
      "TotalBetragNettoInkl": 115,
      "TotalRabattExkl": 0,
      "TotalRabattInkl": 0,
      "VertragDefID": 4488,
      "Vertragsbeginn": null,
      "Vertragsende": null,
      "VertriebswegID": null,
      "Warteliste": false,
      "WarenkorbVertragPosition": [
        {
          "ID": null,
          "Anzahl": -1,
          "ArtikelID": 2533,
          "Bezeichnung": "Promocode Abos/Lizenzen",
          "EinzelPreisExkl": 5,
          "MWSTProzent": 0,
          "PreisErmittlung": 50,
          "TotalBetragNettoExkl": -5,
          "TotalBetragNettoInkl": -5,
          "TotalRabatt": 0
        },
        {
          "ID": null,
          "Anzahl": 1,
          "ArtikelID": 2223,
          "Bezeichnung": "Fachblatt Jahresabo",
          "EinzelPreisExkl": 112.1951,
          "MWSTProzent": 2.5,
          "PreisErmittlung": 40,
          "TotalBetragNettoExkl": 56.1,
          "TotalBetragNettoInkl": 57.5,
          "TotalRabatt": 56.1
        }
      ],
      "OnlineAdresse": [
        {
          "ID": null,
          "AdresseID": null,
          "Adressnummer": null,
          "AnredeID": null,
          "Beruf": null,
          "Briefanrede": null,
          "DatumErfassung": "2017-03-24T00:00:00.000Z",
          "Eintragtyp": 1,
          "EMail": null,
          "EMailD": null,
          "EMailG": null,
          "EMailNewsletter": null,
          "ErhaeltMailing": false,
          "FaxD": null,
          "FaxG": null,
          "FaxP": null,
          "Firma": null,
          "Firmenzusatz": null,
          "Geburtsdatum": null,
          "Heimatort": null,
          "Homepage": null,
          "HomepageD": null,
          "HomepageG": null,
          "Kommunikationsmittel": 10,
          "LandID": 1,
          "LandIDNationalitaet": 1,
          "Name": "me",
          "Name2": null,
          "Natel": null,
          "NatelD": null,
          "NatelG": null,
          "Notizen": null,
          "OnlineAktiv": false,
          "OnlineBenutzername": null,
          "OnlineMail": null,
          "OnlineMailIstVerifiziert": false,
          "OnlinePasswort": null,
          "OnlinePasswortIstGeaendert": false,
          "OnlineSalt": null,
          "OnlineTransaktionID": null,
          "Ort": null,
          "PLZ": null,
          "PLZOrtID": null,
          "Sprache": "DE",
          "Strasse": null,
          "Suchbegriff": null,
          "TelD": null,
          "TelG": null,
          "TelP": null,
          "Titel": null,
          "Titelzusatz": null,
          "Verarbeitet": false,
          "VertrID": null,
          "VNR": null,
          "Vorname": null,
          "Zivilstand": null,
          "Zusatz1": null,
          "Zusatz2": null,
          "AufnahmeartID": null,
          "PreisgruppeID": null,
          "Art32": false,
          "Arbeitgeber": null,
          "Arbeitsort": null,
          "BeginnLehre": null,
          "BerufLernendeID": null,
          "Berufsschulklasse": null,
          "EndeLehre": null,
          "LandISO": "CH",
          "LehreID": null,
          "LehreStatus": null,
          "Notfalladresse": null,
          "NotizenLernender": null
        }
      ]
    }
  ],
  "WarenkorbPosition": [
    {
      "ID": 1,
      "Anzahl": 7,
      "ArtikelID": 1818,
      "Bezeichnung": "Plaited breads",
      "EinzelPreisExkl": 7.8049,
      "MWSTProzent": 2.5,
      "PreisErmittlung": 30,
      "TotalBetragNettoExkl": 54.65,
      "TotalBetragNettoInkl": 56,
      "TotalRabatt": 0
    },
    {
      "ID": 2,
      "Anzahl": 1,
      "ArtikelID": 1818,
      "Bezeichnung": "Plaited breads",
      "EinzelPreisExkl": 5,
      "MWSTProzent": 2.5,
      "PreisErmittlung": 55,
      "TotalBetragNettoExkl": 5,
      "TotalBetragNettoInkl": 5.15,
      "TotalRabatt": 0
    }
  ]
}

Warenkorb

Der Warenkorb ist eine temporäre Struktur, die nicht abgespeichert werden kann. Sie wird für das Berechnen der Preise und die Umwandlung in eine Bestellung verwendet (= Verteilung der übermittelten Daten auf die diversen Online-Tabellen). In Folge ist nur ein POST möglich:

Aufruf

URI
Methode
Return
./WarenkorbPOSTWarenkorb vervollständigt mit den angehängten Objekten

Daten

Hier werden nur diejenigen Felder beschrieben, die irgendeine Logik hinterlegt haben, oder Einfluss auf die Berechnung haben. Die vollständige Beschreibung der Tabelle kan über die Metadaten abgefragt werden.

Feld
Funktion
Richtung
Format
Bemerkungen
idId des Warenkorbes, wird in der Antwort unverändert zurückgegeben. Kann zu Steuerzwecken verwendet werden.Ikey
InklMWSTGibt an, ob der Kunde MWSt-pflichtig ist.ObooleanAlle Preise verstehen sich immer ohne MWSt. 
Ausnahme sind einige berechnete (Komfort)Felder in der Ausgabe.
BereichIDId des Bereichs, in dem der Warenkorb gerechnet werden sollIkey

Kann leer gelassen werden, falls nicht mit Bereichen gearbeitet wird

Ref nach ../Bereich

AdresseIDID der Bestelladresse, ist massgebend für die Preisfindung (Preisgruppe, Rabatte etc.)IkeyRef nach ../Adresse
LieferAdresseIDID der LieferadresseIkeyRef nach ../Adresse
RechnungsAdresseIDID der RechnungsadresseIkeyRef nach ../Adresse
ExterneIDId/Schlüssel des Warenkorbes im Shop. Wird bei der Speicherung in die Folgetabellen weitergereicht.Istring[30]Über diese ID kann der Shop ein Tracking der Weiterverarbeitung der Bestellung machen, indem er in den Online-Tabellen die generierte Bestellung sucht und weiterverfolgt.
FremdsystemIDId des Shopsystems, muss im VinX/PerformX angelegt und mitgeteilt werden. Dient der Unterscheidung der angebundenen Systeme.Ikeyz.B. 1=Test, 2=Prod, 3=QS
PreisgruppeIDZu verwendende Preisgruppe. Wenn leer gelassen findet eine Preisgruppenfindung statt,I/OkeyRef nach ../Preisgruppe
WarenkorbAktionAuszuführende Aktion:
10: nur rechnen
20: rechnen und als Bestellung speichern 
Iinteger
ZahlungswegKarteIDFalls im Shop bezahlt wird muss hier der verwendetet Zahlweg angegeben werdenIkeyRef nach ../Zahlungsweg
SaferPayBetragBezahlter Betrag falls im Shop bezahltInumber[20,4]


WarenkorbPosition / WarenkorbVertragPosition

Die Warenkorbpositionen sind immer an den Warenkorb oder an den WarenkorbVertrag gebunden und sind als Unterelemente mitzugeben (siehe auch Beispiel-Aufruf oben).

Daten

Es werden wiederum nur diejenigen Felder beschrieben, die irgendeine Logik hinterlegt haben, oder Einfluss auf die Berechnung haben. Die vollständige Beschreibung der Tabelle kan über die Metadaten abgefragt werden.

Feld
Funktion
Richtung
Format
Bemerkungen
idId der Position, muss eindeutig seinIkey
AnzahlBestellmengeInumber[20,4]
ArtikelIDId des BestellartikelsIkey

Ref nach ../Artikel

BezeichnungArtikelbezeichnungOstring[40]
EinzelPreisExklWird bei Preisermittlung = [50, 55] übernommen, ansonsten ignoriert und ausgegebenI/OfloatVorgabe Exkl-Preis hat gegenüber Inkl-Preis Vorrang, falls beide angegeben werden
EinzelPreisInklWird bei Preisermittlung = [50, 55] übernommen, ansonsten ignoriert und ausgegebenI/Ofloat

Preise gelten immer vor Rabatt. Dieser wird im Total-Block separat ausgewiesen
MWSTProzentArtikelMWSt-Satz, der dem Artikel zugrunde liegtOnumber[20,4]
MWSTProzentInPreisMWSt-Satz, der zur Anwendung kommt (Export = 0)Onumber[20,4]
PreisErmittlung

Art des Preises, kann je nach Systemeinstellung übernommen oder ignoriert werden. Gültig sind:

10        Spezialpreis
20        Aktionspreis
30        Preis aus Preisgruppe
40        Basispreis
50        Preis überschreiben 

55        Internetpreis
I/Ointeger
PreisgruppeIDZu verwendende Preisgruppe, wenn 0 oder nicht übermittelt findet eine Preisgruppenfindung stattI/OkeyRef nach ../Preisgruppe
TotalBetragNettoExklTotal Nettobetrag der Position exkl MWStOnumber[20,4]= Anzahl * EinzelPreis - TotalRabatte
TotalBetragNettoInkldito inkl.Onumber[20,4]
TotalRabattExklTotal der Rabatte der Position exkl. MWStOnumber[20,4]
TotalRabattInkldito inkl.Onumber[20,4]



Beispiel Bestellung mit 5.- Promo-Code und 10.- Versandkosten
--Aufruf:
{
  "WarenkorbAktion": 10,
  "AdresseID": 39211,
  "BereichID": 2,
  "ExterneID": "123",
  "FremdsystemID": 1,
  "WarenkorbPosition": [
    {
      "ID": 3,
      "ArtikelID": 1871,
      "Anzahl": 1
    },
    {
      "ID": 1,
      "ArtikelID": 2228,
      "PreisErmittlung": 55,
      "EinzelPreisInkl": 10,
      "Anzahl": 1
    },
    {
      "ID": 2,
      "ArtikelID": 2532,
      "PreisErmittlung": 55,
      "EinzelPreisInkl": 5,
      "Anzahl": -1
    }
  ]
}
 
 
--Antwort:
{
  "ID": null,
  "BereichID": 2,
  "AdresseID": 39211,
  "ExterneID": "123",
  "FremdsystemID": "1",
  "Hinweis": null,
  "InklMWST": true,
  "KundenkonditionID": 44,
  "LieferAdresseID": null,
  "Lieferdatum": null,
  "OnlineAdresseID": null,
  "OnlineLieferAdresseID": null,
  "OnlineRechnungsAdresseID": null,
  "PreisgruppeID": 2,
  "RechnungsAdresseID": null,
  "SaferPayBetrag": null,
  "SaferPayID": null,
  "SaferPayToken": null,
  "TotalBetragNettoExkl": 521.35,
  "TotalBetragNettoInkl": 535,
  "ZahlungswegKarteID": null,
  "WarenkorbAktion": 10,
  "WarenkorbPosition": [
    {
      "ID": 3,
      "Anzahl": 1,
      "ArtikelID": 1871,
      "Bezeichnung": "Lehrmittelpaket 1",
      "EinzelPreisExkl": 517.049987792969,
      "EinzelPreisInkl": 530,
      "MWSTProzentArtikel": 2.5,
      "MWSTProzentInPreis": 2.5,
      "PreisErmittlung": null,
      "PreisgruppeID": null,
      "TotalBetragNettoExkl": 517.05,
      "TotalBetragNettoInkl": 530,
      "TotalRabattExkl": 0,
      "TotalRabattInkl": 0
    },
    {
      "ID": 1,
      "Anzahl": 1,
      "ArtikelID": 2228,
      "Bezeichnung": "Porto & Versandkostenanteil inkl. Verpackung B-Post",
      "EinzelPreisExkl": 9.25,
      "EinzelPreisInkl": 10,
      "MWSTProzentArtikel": 8,
      "MWSTProzentInPreis": 8,
      "PreisErmittlung": 55,
      "PreisgruppeID": null,
      "TotalBetragNettoExkl": 9.25,
      "TotalBetragNettoInkl": 10,
      "TotalRabattExkl": 0,
      "TotalRabattInkl": 0
    },
    {
      "ID": 2,
      "Anzahl": -1,
      "ArtikelID": 2532,
      "Bezeichnung": "Promocode Medien",
      "EinzelPreisExkl": 5,
      "EinzelPreisInkl": 5,
      "MWSTProzentArtikel": 0,
      "MWSTProzentInPreis": 0,
      "PreisErmittlung": 55,
      "PreisgruppeID": null,
      "TotalBetragNettoExkl": -5,
      "TotalBetragNettoInkl": -5,
      "TotalRabattExkl": 0,
      "TotalRabattInkl": 0
    }
  ],
  "WarenkorbVertrag": []
}

WarenkorbVertrag

Die Warenkorbverträge sind immer an den Warenkorb gebunden und sind als Unterelemente mitzugeben (siehe auch Beispiel-Aufruf oben).

Verträge haben intern eine Artikelliste, die die Bestandteile abbilden (z.B. Übernachtung, Kurskosten, Unterlagen). Diese bilden die Berechnungsgrundlage und werden in der Antwort ausgegeben. Übersteuerungen können und Ergänzungen können damit aber auch mitgegeben werden. In diesem Fall werden die WarenkorbVertragPositionen mit der hinterlegten Stückliste verglichen. Wird derselbe Artikel gefunden, übersteuert die mitgegebene Position die vorgegebene Menge und die Preisfindung, analog zu den Bestellpositionen. Damit können z.B. Rabatte mitgegeben werden.

Daten

Es werden wiederum nur diejenigen Felder beschrieben, die irgendeine Logik hinterlegt haben, oder Einfluss auf die Berechnung haben. Die vollständige Beschreibung der Tabelle kan über die Metadaten abgefragt werden.

Feld
Funktion
Richtung
Format
Bemerkungen
idId der Position, muss eindeutig seinIkey
AnzahlAnzahl Personen oder Abos, Lizenzen etc., wird als Multiplikator bei der Preisberechnung verwendetIinteger
AdresseIDId der Teilnehmeradresse. Wenn leer gelassen, wird bei Abos diejenige des Warenkorbes verwendet.Ikey

Ref nach ../Adresse

KundenkonditionIDZu verwendende Kundenkondition. Wenn leer gelassen findet eine Konditionenfindung statt und der gefunden Wert wird ausgegeben.I/OkeyRef nach ../Kundenkondition
MWSTProzentMWSt-Prozent (= gewichteter Durchschnitt aus den einzelnen Positionen eines Vertrages)Onumber[20,4]
PreisgruppeIDZu verwendende Preisgruppe. Wenn leer gelassen findet eine Preisgruppenfindung statt und der gefunden Wert wird ausgegeben.I/OkeyRef nach ../Presigruppe
TarifstufeIDZu verwendende Tarifstufe. Wenn leer gelassen findet eine Tarifstufenfindung statt und der gefunden Wert wird ausgegeben.I/OkeyRef nach ../TarifstufeID
VertragDefIDId des Ereignisses/Kurses/Anlass/Abo etc.IkeyRef nach ../VertragDef
WartelisteAnmeldung auf WartelisteI/Oboolean