Basket (Warenkorb)

Allgemein

Der Basket (Warenkorb) ist die Schnittstelle, um Aufträge abzuhandeln.

Zwei Funktionen: → action

  1. Berechnen, ohne den Auftrag auszulösen → calculate
  2. Auftrag auslösen mit Berechnungen → order
    1. der Auftrag wird in die VinX-Tabelle Online-Bestellung geschrieben, welche es erlaubt die Aufträge in VinX zu übernehmen. Dokumentation Benutzersicht: Online- Bestellungen.

Datenschema

Adressen

Die Zuweisung eines Auftrages an eine Adresse erfolgt entweder direkt mit der Angabe der entsprechenden Id (Adress-Tabelle) oder als Unterobjekte von Onlineadressen.

  • orderingAddressId / orderingOnlineAddress = Bestelladresse (mindestens diese Adresse muss angegeben werden)
  • billingAddressId / billingOnlineAddress = Rechnungsadresse
  • deliveryAddressId / deliveryOnlineAddress = Lieferadresse

Sofern kein direkter Verweis per Id auf die Adress-Tabelle dem Warenkorb mitgegeben wird, wird versucht anhand des loginName (Onlineadresse) eine eindeutige Adresse zu finden und zuzuweisen. Dies betrifft ordering-, billing-, als auch deliveryAddress.

Falls die Zuweisung über diesen loginName erfolgt, muss der Onlineadresse den changeType = nop mitgegeben werden. Somit wird dieser Datensatz nicht persistiert.

Die Adresse für die Konditionen (für Berechnungen) wird wie folgt bestimmt:

  1. Übersteuerung der Konditionenadresse mit conditionAddressId 
  2. orderingAddressId
  3. Falls orderingAddressId nicht durch conditionAddressId übersteuert wurde, kann je nach Einstellung auf der VinX-Adresse (orderingAddressId) die Konditionenadresse nochmals übersteuert werden (VinX intern)
    1. hinterlegte Rechnungsadresse auf dieser Adresse
    2. hinterlegte Konditionenadresse auf dieser Adresse
  4. falls keine Adresse gefunden wird (z.B. Gastbestellung) wird die Konditionenadresse auf dem Service-Provider geholt

Bestellpositionen

Pro Bestellposition müssen zwingend folgende Werte mitgegeben werden:

  • articleId: Artikel-Id
  • orderedQuantity: Bestellmenge

Optional kann der Preis vom Shop vorgegeben werden:

  • unitPrice (oder unitPriceWithTax): Einheitspreis exkl. (oder inkl. MWSt)
  • priceCalculationRule = "fromShop"
  • specialConditionId: sobald eine specialConditionId mitgegeben wird, wird diese berücksichtigt. Falls eine Spezialkondition auf dem Kundenrabatt schon vorliegt, wird diese dann ignoriert. Spezialkonditionen - Hauptseite

Umgang mit Promocodes, Gutscheinen etc.

VinX unterstützt aktuell die Verwaltung von Promocodes, Gutscheinen, Einmalrabatten etc. nicht. Der Grund ist die enorme Vielvalt der Rabatt- und Aktionsmöglichkeiten, die nicht in einer allgmeinen Schnittstelle sinnvoll abgebildet werden können.

In der Warenkorbschnittstelle können diese Funktionalitäten aber ins VinX übergeben werden, wenn der Shop diese verwalten kann. Dazu muss wie folgt vorgegangen werden:

  • Im Shop müssen die Spezialkonditionen, Aktionen, Gutscheine etc. verwaltet werden.
  • Im VinX muss für die Fibu, Kostenrechnung oder Nachkalkulation je nach Anforderungen mindetstens ein Promo-Artikel angelegt werden. Dieser muss dem Shop bekannt sein, analog zu den Versandkosten.
  • Wird ein Rabatt eingelöst, muss der Shop wie folgt vorgehen:
    • Der Warenkorb muss im Modus "nur berechnen" übermittelt werden (Flag "action" = "calculate")
    • Rabatte bestimmen, Z.b. Fixpreis-Promo, z.B. 20.- ab 100.- Bestellwert:
    • Im Warenkorb ist eine neue Bestellposition hinzuzufügen, die 
      • als Artikel den obigen Promoartikel hat
      • als Preis den negative Rabatt hat, im Beispiel hier wären das -20.-
      • in der Preisregel (Feld priceCalculationRule) muss "fromShop" sein. Damit macht der Warenkorb keine Neuberechnung des Preises.
    • Der Warenkorb wird normal übermittelt

Lieferpauschale

Pro Basket gibt es eine Lieferzuschläge siehe Lieferzuschläge - Hauptseite. Für den Warenkorb sind nur die Zuschläge "Für Verkauf" relevant.

Die Lieferzuschläge werden zusätzlich zu anderen Rabatten als Positionen agezeigt. Lieferzuschläge werden nur mit Flag "action" = "calculate" berechnet.  "action" = "order" wird ohne berechnung ins VinX übernommen, dort findet dann die Berechnung statt. 

Beispiel

Warenkorb rechnen
{
    "action": "calculate",
    "conditionAddressId": 1002,
    "positions": [
        {
            "posNumber": "1",
            "orderedQuantity": 12,
            "articleId": 5000
        }
    ]
}
Antwort Berechnung
{
    "action": "calculate",
    "customerWithVat": true,
    "conditionAddressId": 1002,
    "orderingAddressId": 1002,
    "deliveryConditionId": 0,
    "amountPayed": 0.0,
    "validDate": "2022-03-17T16:15:38.6155297+01:00",
    "deliveryDateRequested": "2022-03-17T16:15:38.6155313+01:00",
    "providerId": 6,
    "positions": [
        {
            "stockQuantity": 0.0000,
            "charges": [],
            "discounts": [
                {
                    "posType": "discount",
                    "articleId": 0,
                    "orderedQuantity": 0.0,
                    "billedQuantity": 1.0,
                    "description": "LSVA",
                    "priceCalculationRule": "override",
                    "unitPrice": 0.369000,
                    "unitPriceWithTax": 0.378225,
                    "applicableTaxRate": 2.5000,
                    "lineTotalAmount": 0.3690,
                    "lineCumulativeTotalAmount": 0.3690,
                    "taxBaseTotalAmount": 0.3690,
                    "taxTotalAmount": 0.0092,
                    "grandTotalAmount": 0.3782
                }
            ],
            "packages": [
                {
                    "posType": "package",
                    "articleId": 50,
                    "orderedQuantity": 12.0,
                    "billedQuantity": 12.0,
                    "description": "Flaschen Fr. -.50",
                    "priceCalculationRule": "article",
                    "unitPrice": 0.500000,
                    "unitPriceWithTax": 0.500000,
                    "applicableTaxRate": 0.0,
                    "lineTotalAmount": 6.0000,
                    "lineCumulativeTotalAmount": 6.0000,
                    "taxBaseTotalAmount": 6.0000,
                    "taxTotalAmount": 0.0000,
                    "grandTotalAmount": 6.0000
                },
                {
                    "posType": "package",
                    "articleId": 5,
                    "orderedQuantity": 1.0,
                    "billedQuantity": 1.0,
                    "description": "Harasse",
                    "priceCalculationRule": "article",
                    "unitPrice": 5.000000,
                    "unitPriceWithTax": 5.000000,
                    "applicableTaxRate": 0.0,
                    "lineTotalAmount": 5.0000,
                    "lineCumulativeTotalAmount": 5.0000,
                    "taxBaseTotalAmount": 5.0000,
                    "taxTotalAmount": 0.0000,
                    "grandTotalAmount": 5.0000
                }
            ],
            "chargeTotalAmount": 0.0,
            "discountTotalAmount": 0.3690,
            "packagesTotalAmount": 11.0000,
            "posType": "orderPos",
            "posNumber": "1",
            "articleId": 5000,
            "orderedQuantity": 12.0,
            "billedQuantity": 12.0,
            "articleNumber": "5000",
            "description": "Adelbodner Nature",
            "priceCalculationRule": "priceGroup",
            "unitPrice": 0.829268,
            "unitPriceWithTax": 0.850000,
            "applicableTaxRate": 2.5000,
            "lineTotalAmount": 9.9512,
            "lineCumulativeTotalAmount": 21.3000,
            "taxBaseTotalAmount": 10.3000,
            "taxTotalAmount": 0.3000,
            "grandTotalAmount": 21.6000
        }
    ],
    "charges": [],
    "discounts": [],
    "packages": [],
    "vatSummations": [
        {
            "applicableTaxRate": 2.5000,
            "taxBaseTotalAmount": 10.3000,
            "taxTotalAmount": 0.3000
        },
        {
            "applicableTaxRate": 0.0,
            "taxBaseTotalAmount": 11.0000,
            "taxTotalAmount": 0.0000
        }
    ],
    "lineTotalAmount": 9.9512,
    "lineCumulativeTotalAmount": 21.3000,
    "chargeTotalAmount": 0.0,
    "discountTotalAmount": 0.3690,
    "packagesTotalAmount": 11.0000,
    "taxBaseTotalAmount": 21.3000,
    "taxTotalAmount": 0.3000,
    "roundingAmount": 0.0000,
    "grandTotalAmount": 21.6000
}