pixiAddOrderLine
Legt eine neue Auftragsposition für einen Artikel in einem bestehenden Auftrag an, berechnet Preise und Rabatte und liefert die neue Positions-ID oder Validierungsfehler.
Legt eine Auftragsposition (Zeile in Orderlines) im Auftrag PixiOrderNr an.
1. Normalisierung
ItemKey= 0 gilt als NULL,ItemNrInt= '' gilt als NULL.- Ein leeres
Datewird zum aktuellen Zeitpunkt. - Ein leerer
Statuswird zuNEW. - Ein NULL-Wert bei
UsePaymentStatuswird zu 0, ein NULL-Wert beiLocationIDwird zu001.
2. Prüfungen Alle fehlgeschlagenen Prüfungen werden gesammelt, jede erzeugt eine Fehlerzeile:
UsePaymentStatus= 1 zusammen mit einemStatusungleichNEWwird abgelehnt.Statusmuss einer der WerteNEW,ANG,HAL,FUT,STO,NLBsein.- Ist
ItemNrIntangegeben, wird der Artikel überItemNrIntgesucht. Der gefundene Schlüssel ersetztItemKey. Wird kein Artikel gefunden, entsteht ein Fehler. - Ist bis dahin kein Fehler aufgetreten, muss der Artikel einen Eintrag in
pixi.ItemCodehaben. - Ein
Discount(Gutscheinbetrag) ungleich 0 erfordert eineVoucherID. - Enthält der Auftrag bereits eine Position mit Gutschein, wird eine abweichende
VoucherIDabgelehnt. Pro Auftrag ist nur ein Gutschein erlaubt.
Schlägt eine Prüfung fehl, werden die Fehlerzeilen zurückgegeben und es wird nichts geschrieben.
3. Status aus der Zahlungsart
Bei UsePaymentStatus = 1 wird der Positionsstatus aus Payments.IniOrderStatus der Zahlungsart der Rechnungsadresse des Auftrags übernommen.
4. Dürfen Positionen ergänzt werden?
pipiCanAddOrderlines prüft, ob der Auftrag noch neue Positionen annimmt:
- Bei den Zahlungsarten
K/Cmüssen alle vorhandenen Positionen inNEW,ANG,HAL,MIN,OPH,BES,STOoderNLBstehen. - Bei anderen Zahlungsarten darf keine Position in
EINoderAUSstehen.
Nur bei Ergebnis 1 wird die Position angelegt.
5. Kopfdaten
- Kunde, Adressen, Auftragstyp, Währung und die bestehenden Kopfwerte werden aus dem Auftrag gelesen.
OrderNrExternalstammt aus dem Auftragskopf. Fehlt dort ein Wert, wird der Parameter verwendet. Fehlt auch dieser, wird eine Zeitstempel-Zeichenkette erzeugt.Employeewird als<Employee> (API)gespeichert, ohne Angabe alsAPI.
6. Währung
Ist die Einstellung MultiCurrencyEnabled aus oder hat der Auftrag keinen Wechselkurs, wird die Datenbankwährung mit Kurs 1 verwendet. Andernfalls:
- Die tagesaktuellen Kurse werden aus
pixi.ExchRategelesen. - Für die Datenbankwährung wird deren Kursquelle verwendet.
- Für die Basiswährung des Wechselkurs-Eintrags des Auftrags dient die
ExchRateSourceIDdes Shops als Quelle.
7. Preise
FullPrice(brutto) und das Netto-Gegenstück stammen aus dem Parameter, sofern er ungleich 0 ist.- Andernfalls wird der Artikelpreis verwendet: zuerst der Preis in Auftragswährung, dann der Basiswährungspreis × Kurs, dann der Datenbankwährungspreis × Kurs, sonst 0.
- Bei
B2B-Aufträgen gilt der ParameterFullPriceals Nettopreis, und der Bruttopreis wird immer aus den Artikelpreisen ermittelt. ItemNameüberschreibt die Artikelbezeichnung.
8. Positionsrabatt
- Ist
FullPriceDiscountValueangegeben, wird dieser Wert verwendet. - Sonst wird
DiscountPercent% vom Bruttopreis (B2C) bzw. vom Nettopreis (andere Auftragstypen) verwendet. - Sonst wird der volle Preis minus
DiscountedPriceverwendet. - Sonst ist der Rabatt 0.
Derselbe Rabattwert wird vom Brutto- und vom Nettopreis abgezogen und ergibt Price und Price_Net.
9. Kopfwerte des Auftrags
ShipCost,Discount,AddressRemarks,Verfahren,ProductundExtraswerden aus den Parametern übernommen, wenn sie nicht leer bzw. ungleich 0 sind. Andernfalls bleiben die bestehenden Kopfwerte erhalten.- Ein bereits vorhandener Gutschein des Auftrags hat immer Vorrang vor
VoucherID.
10. Anlage
Die Position wird über Pixi_InsertOrderline mit diesen festen Werten angelegt:
- Quelle
I - Positionstyp
ORD - 15 Wartetage
LocationIDals Lager und als letztes Bestelllager
Anschließend wird eine Zeile mit CanAdd = 1 und der neuen OrderlineId zurückgegeben.
Hinweise
- Kein Ergebnis, wenn keine Positionen ergänzt werden dürfen: Liefert
pipiCanAddOrderlines0 oder NULL, gibt der Aufruf überhaupt keine Zeilen zurück. Das ist der Fall, wenn der Auftrag nicht existiert oder eine Position bereits in einem sperrenden Status steht. Eine leere Antwort ist daher als „nicht angelegt“ zu werten. - Doppelte Fehlerzeile: Die Prüfung
UsePaymentStatus= 1 mitStatus≠NEWläuft zweimal, der Fehler erscheint daher doppelt im Ergebnis. - Status wird nicht erneut geprüft: Ein aus der Zahlungsart übernommener Status (
UsePaymentStatus= 1) wird nicht gegen die erlaubte Liste geprüft. - Artikelpreis erforderlich: Der Artikel benötigt eine Preiszeile in der Datenbankwährung (Inner Join auf
pixi.ItemPrice). Andernfalls werden Artikeldaten und Preise nicht gefüllt, und die Position kann ohne EAN oder Preis entstehen. - Auftragskopf wird überschrieben:
Pixi_InsertOrderlineaktualisiert die KopffelderGiftMessage,ShipInstruct,Discount,Address_Remarks,Verfahren,Product,Extras,Shipdateund die Steuersätze.GiftMessagehat den Standardwert '' und überschreibt damit eine vorhandene Geschenknachricht.ShipInstructwird auf '' undShipdateauf NULL gesetzt.
- Gutscheinanlage: Ist der resultierende
Discount> 0 und existiert noch keinVoucher-Eintrag mit dieser ID, wird ein Gutschein mit ShopGRMund der Auftragswährung angelegt. Das Ablaufdatum wird mitDATEADD(y, 1, …)berechnet; der Datumsteilysteht für den Tag des Jahres, das Datum liegt also einen Tag nach dem Bestelldatum. - Protokollierung: Weicht
OrderNrExternalvom Kopfwert ab, wird ein Eintrag inLogTablegeschrieben. - Transaktion: Die Anlage erfolgt in einer Transaktion innerhalb von
Pixi_InsertOrderline. - Positions-ID: Die neue ID wird aus einer temporären Tabelle gelesen, die ein
INSTEAD OF-Trigger aufOrderlinesfüllt. Der Trigger liegt nicht vor. Wird keine ID geliefert, istOrderlineIdNULL, obwohlCanAdd= 1 ist. - Lesezugriffe: Alle Lesezugriffe verwenden
NOLOCK. - Wechselkurse: Kurse werden nur für das aktuelle Datum gesucht. Fehlt ein Kurs für heute, werden umgerechnete Preise NULL.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
PixiOrderNr
Pflicht
|
int | – |
Pixi-Auftragsnummer des bestehenden Auftrags. Beispiel: |
ItemKey
|
int | NULL |
Interner Artikelschlüssel. 0 gilt als NULL. Wird durch den über Beispiel: |
ItemNrInt
|
varchar(50) string |
NULL |
Shop-Artikelnummer zur Suche des Artikels. Eine leere Zeichenkette gilt als NULL. Beispiel: |
Quantity
|
int | 1 |
Menge der Auftragsposition. Beispiel: |
ShipCost
|
money decimal |
0.0 |
Versandkosten der Position. Bei 0 werden die Versandkosten des Auftragskopfs verwendet. Beispiel: |
LocationID
|
varchar(3) string |
001 |
Lager-ID der Position. NULL wird zu Beispiel: |
GiftMessage
|
varchar(8000) string |
– |
Geschenknachricht. Wird in den Auftragskopf geschrieben und überschreibt den vorhandenen Wert, auch mit der leeren Zeichenkette als Standardwert. Beispiel: |
DiscountPercent
|
numeric(6, 2) decimal |
NULL |
Positionsrabatt in Prozent des vollen Preises (brutto bei B2C, sonst netto). Wird nur verwendet, wenn Beispiel: |
VoucherID
|
varchar(50) string |
NULL |
Gutscheincode. Pflicht, wenn Beispiel: |
Discount
|
money decimal |
NULL |
Gutscheinbetrag für den Auftragskopf. Bei NULL oder 0 bleibt der vorhandene Kopfwert erhalten. Ist der resultierende Wert > 0, wird ein Gutscheindatensatz angelegt, falls noch keiner existiert. Beispiel: |
AddressRemarks
|
varchar(255) string |
NULL |
Adressbemerkung für den Auftragskopf. Bei leerem Wert bleibt der vorhandene Wert erhalten. Beispiel: |
Verfahren
|
varchar(50) string |
NULL |
Wert für das Kopffeld |
Product
|
varchar(50) string |
NULL |
Wert für das Kopffeld |
Extras
|
varchar(50) string |
NULL |
Wert für das Kopffeld |
Employee
|
varchar(50) string |
NULL |
Anlegender Mitarbeiter. Wird mit dem Zusatz Beispiel: |
Date
|
datetime dateTime |
NULL |
Anlagedatum der Position ( Beispiel: |
Status
|
varchar(3) string |
NULL |
Status der neuen Position. Bei leerem Wert wird Erlaubte Werte
Beispiel: |
UsePaymentStatus
|
bit boolean |
0 |
Bei 1 wird der Positionsstatus aus dem initialen Auftragsstatus der Zahlungsart des Auftrags übernommen. Nicht kombinierbar mit einem Erlaubte Werte
Beispiel: |
ItemNrExternal
|
varchar(50) string |
N |
Externe Artikelnummer, die in der Position gespeichert wird. Beispiel: |
FullPrice
|
money decimal |
NULL |
Voller Bruttopreis vor Rabatt. Bei B2B-Aufträgen wird der Wert als Nettopreis verwendet. Bei NULL oder 0 wird der Artikelpreis verwendet. Beispiel: |
FullPriceDiscountValue
|
money decimal |
NULL |
Absoluter Rabatt je Einheit. Hat Vorrang vor Beispiel: |
DiscountedPrice
|
money decimal |
NULL |
Preis nach Rabatt. Der Rabatt ergibt sich aus vollem Preis minus diesem Wert; wird nur verwendet, wenn kein anderer Rabattparameter angegeben ist. Beispiel: |
ItemName
|
varchar(120) string |
NULL |
Artikelbezeichnung der Position. Bei NULL wird die Bezeichnung aus dem Artikelstamm verwendet. Beispiel: |
ItemSpecialNote
|
varchar(8000) string |
NULL |
Sonderhinweis zur Position ( Beispiel: |
OrderNrExternal
|
varchar(50) string |
NULL |
Externe Auftragsnummer. Wird nur verwendet, wenn der Auftragskopf keine hat; sonst gilt der Kopfwert. Ohne beides wird eine Zeitstempel-Zeichenkette erzeugt. Beispiel: |
DF_Type
|
varchar(1) string |
NULL |
Direct-Fulfillment-Typ, wird in |
SerialNumber
|
varchar(50) string |
NULL |
Seriennummer, wird in Beispiel: |
Antwort
Result-Set 1 · Wenn mindestens eine Prüfung fehlschlägt (anstelle des Erfolgsergebnisses).
Eine Zeile je fehlgeschlagener Prüfung.
| Spalte | Typ | Beschreibung |
|---|---|---|
CanAdd
|
bit boolean |
Immer 0. |
OrderNr
|
int |
Angefragte Auftragsnummer. |
ErrorMessage
Kann leer sein |
varchar(8000) string |
Fehlertext. |
OrderlineId
Kann leer sein |
int |
Immer NULL. |
OrderNrExternal
Kann leer sein |
string |
Immer NULL. |
Result-Set 2 · Wenn alle Prüfungen bestehen und pipiCanAddOrderlines 1 liefert. Bei 0 oder NULL wird keine Ergebnismenge geliefert.
Eine Zeile mit der angelegten Auftragsposition.
| Spalte | Typ | Beschreibung |
|---|---|---|
CanAdd
|
bit boolean |
Immer 1. |
OrderNr
|
int |
Pixi-Auftragsnummer. |
ErrorMessage
Kann leer sein |
varchar(8000) string |
Leere Zeichenkette. |
OrderlineId
Kann leer sein |
int |
Schlüssel ( |
OrderNrExternal
Kann leer sein |
varchar(50) string |
In der neuen Position gespeicherte externe Auftragsnummer. |
Beispielantwort
<SqlRowSet1>
<row>
<CanAdd>true</CanAdd>
<OrderNr>104532</OrderNr>
<ErrorMessage/>
<OrderlineId>887321</OrderlineId>
<OrderNrExternal>WEB-2024-000123</OrderNrExternal>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| CanAdd = 0 | Error: Use either @Status or @UsePaymentStatus parameter. | `UsePaymentStatus` = 1 wurde mit einem `Status` ungleich `NEW` kombiniert. Nur einen der beiden angeben. Die Zeile erscheint doppelt. |
| CanAdd = 0 | Error: Status {Status} is not allowed. | `Status` ist keiner der Werte `NEW`, `ANG`, `HAL`, `FUT`, `STO`, `NLB`. |
| CanAdd = 0 | Error: Item with shop item number ({ItemNrInt}) not found. | Es existiert kein Artikel mit der angegebenen `ItemNrInt`. |
| CanAdd = 0 | Error: No item found. | Kein `ItemKey` angegeben, oder der Artikel hat keinen Eintrag in `pixi.ItemCode`. |
| CanAdd = 0 | Error: Parameter @VoucherId not provided for the parameter @Discount (Voucher Amount):{Discount} | `Discount` ist ungleich 0, aber `VoucherID` fehlt. |
| CanAdd = 0 | Error: A voucher with VoucherId: ("{ExistingVoucherID}") is already present on the order. Only one voucher per order is allowed. | Der Auftrag enthält bereits eine Position mit einem anderen Gutschein. Die vorhandene Gutschein-ID oder keine angeben. |
Beispiele
POST https://apigateway.descartes.com/tms/pixi/
Content-Type: text/xml; charset=utf-8
Authorization: Basic BASE64(USERNAME:PASSWORD)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://apigateway.descartes.com/tms/pixi/">
<SOAP-ENV:Body>
<ns1:pixiAddOrderLine>
<PixiOrderNr>104532</PixiOrderNr>
<!-- <ItemKey>5821</ItemKey> -->
<!-- <ItemNrInt>ART-10045</ItemNrInt> -->
<!-- <Quantity>2</Quantity> -->
<!-- <ShipCost>4.90</ShipCost> -->
<!-- <LocationID>001</LocationID> -->
<!-- <GiftMessage>Happy Birthday!</GiftMessage> -->
<!-- <DiscountPercent>10.00</DiscountPercent> -->
<!-- <VoucherID>SUMMER2024</VoucherID> -->
<!-- <Discount>5.00</Discount> -->
<!-- <AddressRemarks>Please ring twice</AddressRemarks> -->
<!-- <Verfahren>?</Verfahren> -->
<!-- <Product>?</Product> -->
<!-- <Extras>?</Extras> -->
<!-- <Employee>jdoe</Employee> -->
<!-- <Date>2024-05-14T10:30:00</Date> -->
<!-- <Status>NEW</Status> -->
<!-- <UsePaymentStatus>0</UsePaymentStatus> -->
<!-- <ItemNrExternal>SHOP-4711</ItemNrExternal> -->
<!-- <FullPrice>29.90</FullPrice> -->
<!-- <FullPriceDiscountValue>3.00</FullPriceDiscountValue> -->
<!-- <DiscountedPrice>26.90</DiscountedPrice> -->
<!-- <ItemName>T-Shirt blue, size M</ItemName> -->
<!-- <ItemSpecialNote>Engraving: Anna</ItemSpecialNote> -->
<!-- <OrderNrExternal>WEB-2024-000123</OrderNrExternal> -->
<!-- <DF_Type>?</DF_Type> -->
<!-- <SerialNumber>SN-000981</SerialNumber> -->
</ns1:pixiAddOrderLine>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
curl -X POST 'https://apigateway.descartes.com/tms/pixi/' \
--user 'USERNAME:PASSWORD' \
--header 'Content-Type: text/xml; charset=utf-8' \
--data-binary @- <<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://apigateway.descartes.com/tms/pixi/">
<SOAP-ENV:Body>
<ns1:pixiAddOrderLine>
<PixiOrderNr>104532</PixiOrderNr>
<!-- <ItemKey>5821</ItemKey> -->
<!-- <ItemNrInt>ART-10045</ItemNrInt> -->
<!-- <Quantity>2</Quantity> -->
<!-- <ShipCost>4.90</ShipCost> -->
<!-- <LocationID>001</LocationID> -->
<!-- <GiftMessage>Happy Birthday!</GiftMessage> -->
<!-- <DiscountPercent>10.00</DiscountPercent> -->
<!-- <VoucherID>SUMMER2024</VoucherID> -->
<!-- <Discount>5.00</Discount> -->
<!-- <AddressRemarks>Please ring twice</AddressRemarks> -->
<!-- <Verfahren>?</Verfahren> -->
<!-- <Product>?</Product> -->
<!-- <Extras>?</Extras> -->
<!-- <Employee>jdoe</Employee> -->
<!-- <Date>2024-05-14T10:30:00</Date> -->
<!-- <Status>NEW</Status> -->
<!-- <UsePaymentStatus>0</UsePaymentStatus> -->
<!-- <ItemNrExternal>SHOP-4711</ItemNrExternal> -->
<!-- <FullPrice>29.90</FullPrice> -->
<!-- <FullPriceDiscountValue>3.00</FullPriceDiscountValue> -->
<!-- <DiscountedPrice>26.90</DiscountedPrice> -->
<!-- <ItemName>T-Shirt blue, size M</ItemName> -->
<!-- <ItemSpecialNote>Engraving: Anna</ItemSpecialNote> -->
<!-- <OrderNrExternal>WEB-2024-000123</OrderNrExternal> -->
<!-- <DF_Type>?</DF_Type> -->
<!-- <SerialNumber>SN-000981</SerialNumber> -->
</ns1:pixiAddOrderLine>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
XML
<?php
$soapClient = new SoapClient(null, [
'login' => 'USERNAME',
'password' => 'PASSWORD',
'location' => 'https://apigateway.descartes.com/tms/pixi/',
'uri' => 'https://apigateway.descartes.com/tms/pixi/',
]);
$arguments = [
'PixiOrderNr' => '104532',
// 'ItemKey' => '5821',
// 'ItemNrInt' => 'ART-10045',
// 'Quantity' => '2',
// 'ShipCost' => '4.90',
// 'LocationID' => '001',
// 'GiftMessage' => 'Happy Birthday!',
// 'DiscountPercent' => '10.00',
// 'VoucherID' => 'SUMMER2024',
// 'Discount' => '5.00',
// 'AddressRemarks' => 'Please ring twice',
// 'Verfahren' => '?',
// 'Product' => '?',
// 'Extras' => '?',
// 'Employee' => 'jdoe',
// 'Date' => '2024-05-14T10:30:00',
// 'Status' => 'NEW',
// 'UsePaymentStatus' => '0',
// 'ItemNrExternal' => 'SHOP-4711',
// 'FullPrice' => '29.90',
// 'FullPriceDiscountValue' => '3.00',
// 'DiscountedPrice' => '26.90',
// 'ItemName' => 'T-Shirt blue, size M',
// 'ItemSpecialNote' => 'Engraving: Anna',
// 'OrderNrExternal' => 'WEB-2024-000123',
// 'DF_Type' => '?',
// 'SerialNumber' => 'SN-000981',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiAddOrderLine', $soapArguments);
Verwandte Calls
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiAddOrderLine