pixiDFCreateInvoices
Legt Direct-Fulfillment-Rechnungen (DF) für bereite Auftragspositionen an, optional eingeschränkt auf und ergänzt um Versanddienstleister und Tracking-Daten aus XML.
Der Aufruf legt Rechnungen für Direct-Fulfillment-Aufträge an. Die eigentliche Verarbeitung übernimmt die interne Prozedur Pixi_CreateFulfillmentIncoices, die mit CreateEmp = 'API' läuft.
Ablauf
-
Ein exklusiver Application-Lock
pipiDFCreateInvoiceswird mit 5 Sekunden Timeout angefordert, damit parallele Läufe nacheinander ausgeführt werden. -
Ist
OrderlinesXMLgesetzt (ein Leerstring gilt als NULL), werden die Elemente/Orderlines/Orderlinemit den UnterelementenOrderlineKey,ShipVendor,ShipmentTrackingIdundReturnTrackingIdgelesen. -
Bei
ShowDetailedMessages = 1wird die Eingabe zuerst geprüft:- Das XML muss vorhanden sein und mindestens ein
Orderlineenthalten. - Der Versanddienstleister-Code (aus der ersten Zeile je Auftrag) darf höchstens 3 Zeichen lang sein.
- Alle Sendungs-Tracking-IDs eines Auftrags, mit
;verbunden, dürfen höchstens 512 Zeichen lang sein. Dieselbe Grenze gilt für die Retouren-Tracking-IDs. - Jeder
OrderlineKeymuss inOrderlinesexistieren.
Schlägt eine Prüfung fehl, werden alle Fehlerzeilen zurückgegeben und keine Rechnung angelegt.
- Das XML muss vorhanden sein und mindestens ein
-
Die Rechnungen werden angelegt. Das Verhalten hängt von den Einstellungen
EnableFulfilmentTypeOneundEnableFulfilmentTypeTwoab:- Typ eins: Auftragspositionen aus dem XML mit Status
FUTwerden zuerst aufFUSgesetzt. Danach wird je Auftrag mitFUS-Positionen eine Rechnung erzeugt. Mit XML werden nur die übergebenen Positionen verwendet, ohne XML alleFUS-Positionen. - Typ zwei: Kandidaten sind Aufträge, deren Positionen alle
FUSoder in einem Endstatus sind und die mindestens eineFUS-Position ohne Rechnung haben. Das XML schränkt die Kandidaten-Aufträge nicht ein. Es bestimmt nur, welcheFUS-Positionen in die Rechnung übernommen werden. Positionen mit StatusMINwerden immer übernommen.
- Typ eins: Auftragspositionen aus dem XML mit Status
-
Jeder Auftrag wird in einer eigenen Transaktion verarbeitet:
- Die Rechnung wird angelegt, mit
Fulfillment = 1gekennzeichnet und mit Rechnungspositionen versehen. - Der Versanddienstleister aus dem XML ersetzt den des Auftrags.
- Tracking-IDs aus dem XML werden an der Rechnung gespeichert. Mehrere IDs können mit
;getrennt werden, und jede eindeutige ID wird ein eigenes Rechnungspaket. - Die Auftragspositionen werden auf
AUSmitInvRefundShipDategesetzt. - Eine Rechnungsnummer wird vergeben, eine Buchung im Kundenkonto angelegt und die Rechnung ausgescannt.
- Ein Event
InvoiceCreatedwird veröffentlicht.
- Die Rechnung wird angelegt, mit
-
Bei
ShowDetailedMessages = 1wird eine Statustabelle zurückgegeben:- eine
OK-Zeile mit den Rechnungsnummern, die mit den übergebenen Positionen verknüpft sind; - eine
ERROR-Zeile mit Aufträgen, deren übergebene Positionen keine Rechnungsposition haben; - eine
ERROR-Zeile, wenn beides nicht zutrifft.
- eine
Bei ShowDetailedMessages = 0 wird keine Ergebnismenge geliefert.
Hinweise
- Fehler werden verschluckt. Der gesamte Ablauf läuft in
TRY/CATCH. DerCATCH-Block gibt nur den Application-Lock frei, SQL-Fehler erreichen den Aufrufer also nie. BeiShowDetailedMessages = 0erhält der Aufrufer gar keine Rückmeldung. - Lock-Ergebnis wird nicht geprüft. Der Rückgabewert von
sp_getapplockwird nicht ausgewertet. Kann der Lock nicht innerhalb von 5 Sekunden erlangt werden, läuft die Verarbeitung trotzdem weiter. - Lock wird bei Validierungsfehlern nicht freigegeben. Bei den vorzeitigen Rücksprüngen nach einem Validierungsfehler wird der Lock nicht explizit freigegeben. Er bleibt bis zum Ende der Session bestehen.
- Kürzungsrisiko.
ErrorMessageistvarchar(512), und die Liste der Rechnungsnummern liegt in einervarchar(512)-Variablen. Lange Listen von Auftrags- oder Rechnungsnummern können gekürzt werden oder einen Kürzungsfehler auslösen, der dann stillschweigend abgefangen wird. - Validierung ist optional. Sie läuft nur bei
ShowDetailedMessages = 1. Ohne sie liest die interne ProzedurShipVendoralsvarchar(3)und die Tracking-IDs alsvarchar(512), längere Werte können also abgeschnitten werden. - Bedeutung der
OK-Zeile. Sie nennt alle Rechnungen, die mit den übergebenen Positionen verknüpft sind, also unter Umständen auch früher erzeugte. Der Code-Kommentar nennt einen Lieferanten ohneCanDoDirectFulfillmentoder einen Positionsstatus ungleichFUTals typische Ursachen für eine fehlende Rechnung. - Einstellungen.
- Ist weder
EnableFulfilmentTypeOnenochEnableFulfilmentTypeTwogleich1, werden keine Rechnungen erzeugt. - Bei
DoNotSendAUSmailOnFulfillment=1/Ywerden die Positionen zusätzlich mitCustomerEMailed = 'Y'markiert.
- Ist weder
- Rechnungsnummern. Eine vorhandene externe Rechnungsnummer an den Auftragspositionen (
InvoiceNrExternal) wird bei der Anlage der Rechnung verwendet. Danach ruft die interne ProzedurPixi_GetNextInvNrauf und schreibt deren Ergebnis inInvoiceNr. Ob dabei die externe Nummer erhalten bleibt, ist nicht ersichtlich, da diese Prozedur nicht beigefügt ist. - Rollback je Auftrag. Eine Rechnung ohne Positionen wird zurückgerollt und gelöscht, ebenso ein Auftrag, bei dem Fehler aufgetreten sind. Andere Aufträge sind davon nicht betroffen.
- Weitere Nebeneffekte. Mehrere verschachtelte Prozeduren sind nicht beigefügt:
GOS_Qi_InvoiceNOD,Pixi_CA_AddPixiInvoice,GOSScanOutInvoice,Pixi_PollCreateRecords,Pixi_MQ_EventPublishundPixi_AddDataForSEPAExportToInvoice. Ihre Nebeneffekte sind hier nicht dokumentiert.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
OrderlinesXML
|
varchar(max) xml |
NULL |
XML mit den abzurechnenden Auftragspositionen sowie optionalem Versanddienstleister und Tracking-Daten. Erwarteter Pfad: Beispiel:
|
ShowDetailedMessages
|
bit boolean |
0 |
Steuert die Eingabeprüfung und die Status-Ergebnismenge. NULL wird als 0 behandelt. Erlaubte Werte
Beispiel: |
Antwort
Result-Set 1 · Nur bei ShowDetailedMessages = 1 und fehlgeschlagener Prüfung. Wird statt des Verarbeitungsergebnisses geliefert; keine Rechnungen werden angelegt.
Eine Zeile je Prüfungsfehler.
| Spalte | Typ | Beschreibung |
|---|---|---|
ReturnCode
Kann leer sein |
varchar(10) string |
In diesem Fall immer |
ErrorMessage
Kann leer sein |
varchar(512) string |
Fehlertext mit den betroffenen Auftragsnummern bzw. Positionsschlüsseln. |
Result-Set 2 · Bei ShowDetailedMessages = 1 und erfolgreicher Prüfung, nach der Rechnungserstellung.
Statuszeilen. Eine ERROR-Zeile nennt Aufträge ohne Rechnungspositionen, eine OK-Zeile die erzeugten bzw. verknüpften Rechnungsnummern. Beide können gemeinsam auftreten.
| Spalte | Typ | Beschreibung |
|---|---|---|
ReturnCode
Kann leer sein |
varchar(10) string |
|
ErrorMessage
Kann leer sein |
varchar(512) string |
Statustext, z. B. die Liste der Rechnungsnummern, getrennt durch |
Beispielantwort
<SqlRowSet1>
<row>
<ReturnCode>OK</ReturnCode>
<ErrorMessage>Direct fulfilment Invoice(s) created with invoice number(s): RE100234; RE100235</ErrorMessage>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| ERROR | XML is empty or not proper. Please review and adapt. | `ShowDetailedMessages` = 1, und `OrderlinesXML` ist leer oder enthält kein Element `/Orderlines/Orderline`. Gültiges XML mit mindestens einer Position senden. |
| ERROR | Ship vendor code is too long, field size max. of 3 characters was reached. Please review and adapt OrderNr(s): {OrderNrs} | Der `ShipVendor`-Wert der ersten Position eines Auftrags ist länger als 3 Zeichen. Den 3-stelligen Versanddienstleister-Code verwenden. |
| ERROR | TrackingId is too long, field size max. of 512 characters was reached. Please review and adapt OrderNr(s): {OrderNrs} | Die mit `;` verbundenen Sendungs-Tracking-IDs aller Positionen eines Auftrags überschreiten 512 Zeichen. Weniger oder kürzere IDs senden. |
| ERROR | ReturnTrackingId is too long, field size max. of 512 characters was reached. Please review and adapt OrderNr(s): {OrderNrs} | Die mit `;` verbundenen Retouren-Tracking-IDs aller Positionen eines Auftrags überschreiten 512 Zeichen. |
| ERROR | Orderline keys: {OrderlineKeys} do not exist in the database. Please check the input data. | Mindestens ein `OrderlineKey` aus dem XML existiert nicht in `Orderlines`. |
| ERROR | No direct fulfilment Invoice was created for order(s): {OrderNrs}. Please check the input data. | Übergebene Positionen dieser Aufträge haben nach der Verarbeitung keine Rechnungsposition. Typische Ursache ist ein Positionsstatus außer `FUT`/`FUS` oder ein nicht für Direct Fulfillment freigegebener Lieferant. |
| ERROR | No direct fulfilment Invoice(s) created | Mit den übergebenen Positionen ist keine Rechnung verknüpft, und es entstand keine andere Statusmeldung. |
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:pixiDFCreateInvoices>
<!-- <OrderlinesXML><![CDATA[<Orderlines><Orderline><OrderlineKey>123456</OrderlineKey><ShipVendor>DHL</ShipVendor><ShipmentTrackingId>00340434161234567890</ShipmentTrackingId><ReturnTrackingId>00340434169876543210</ReturnTrackingId></Orderline><Orderline><OrderlineKey>123457</OrderlineKey><ShipVendor>DHL</ShipVendor><ShipmentTrackingId>00340434161234567891</ShipmentTrackingId><ReturnTrackingId></ReturnTrackingId></Orderline></Orderlines>]]></OrderlinesXML> -->
<!-- <ShowDetailedMessages>1</ShowDetailedMessages> -->
</ns1:pixiDFCreateInvoices>
</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:pixiDFCreateInvoices>
<!-- <OrderlinesXML><![CDATA[<Orderlines><Orderline><OrderlineKey>123456</OrderlineKey><ShipVendor>DHL</ShipVendor><ShipmentTrackingId>00340434161234567890</ShipmentTrackingId><ReturnTrackingId>00340434169876543210</ReturnTrackingId></Orderline><Orderline><OrderlineKey>123457</OrderlineKey><ShipVendor>DHL</ShipVendor><ShipmentTrackingId>00340434161234567891</ShipmentTrackingId><ReturnTrackingId></ReturnTrackingId></Orderline></Orderlines>]]></OrderlinesXML> -->
<!-- <ShowDetailedMessages>1</ShowDetailedMessages> -->
</ns1:pixiDFCreateInvoices>
</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 = [
// 'OrderlinesXML' => '<Orderlines><Orderline><OrderlineKey>123456</OrderlineKey><ShipVendor>DHL</ShipVendor><ShipmentTrackingId>00340434161234567890</ShipmentTrackingId><ReturnTrackingId>00340434169876543210</ReturnTrackingId></Orderline><Orderline><OrderlineKey>123457</OrderlineKey><ShipVendor>DHL</ShipVendor><ShipmentTrackingId>00340434161234567891</ShipmentTrackingId><ReturnTrackingId></ReturnTrackingId></Orderline></Orderlines>',
// 'ShowDetailedMessages' => '1',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiDFCreateInvoices', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiDFCreateInvoices