Postman-Collection
Direct-Fulfillment Schreiben

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

  1. Ein exklusiver Application-Lock pipiDFCreateInvoices wird mit 5 Sekunden Timeout angefordert, damit parallele Läufe nacheinander ausgeführt werden.

  2. Ist OrderlinesXML gesetzt (ein Leerstring gilt als NULL), werden die Elemente /Orderlines/Orderline mit den Unterelementen OrderlineKey, ShipVendor, ShipmentTrackingId und ReturnTrackingId gelesen.

  3. Bei ShowDetailedMessages = 1 wird die Eingabe zuerst geprüft:

    • Das XML muss vorhanden sein und mindestens ein Orderline enthalten.
    • 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 OrderlineKey muss in Orderlines existieren.

    Schlägt eine Prüfung fehl, werden alle Fehlerzeilen zurückgegeben und keine Rechnung angelegt.

  4. Die Rechnungen werden angelegt. Das Verhalten hängt von den Einstellungen EnableFulfilmentTypeOne und EnableFulfilmentTypeTwo ab:

    • Typ eins: Auftragspositionen aus dem XML mit Status FUT werden zuerst auf FUS gesetzt. Danach wird je Auftrag mit FUS-Positionen eine Rechnung erzeugt. Mit XML werden nur die übergebenen Positionen verwendet, ohne XML alle FUS-Positionen.
    • Typ zwei: Kandidaten sind Aufträge, deren Positionen alle FUS oder in einem Endstatus sind und die mindestens eine FUS-Position ohne Rechnung haben. Das XML schränkt die Kandidaten-Aufträge nicht ein. Es bestimmt nur, welche FUS-Positionen in die Rechnung übernommen werden. Positionen mit Status MIN werden immer übernommen.
  5. Jeder Auftrag wird in einer eigenen Transaktion verarbeitet:

    • Die Rechnung wird angelegt, mit Fulfillment = 1 gekennzeichnet 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 AUS mit InvRef und ShipDate gesetzt.
    • Eine Rechnungsnummer wird vergeben, eine Buchung im Kundenkonto angelegt und die Rechnung ausgescannt.
    • Ein Event InvoiceCreated wird veröffentlicht.
  6. Bei ShowDetailedMessages = 1 wird 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.

Bei ShowDetailedMessages = 0 wird keine Ergebnismenge geliefert.

Hinweise

  • Fehler werden verschluckt. Der gesamte Ablauf läuft in TRY/CATCH. Der CATCH-Block gibt nur den Application-Lock frei, SQL-Fehler erreichen den Aufrufer also nie. Bei ShowDetailedMessages = 0 erhält der Aufrufer gar keine Rückmeldung.
  • Lock-Ergebnis wird nicht geprüft. Der Rückgabewert von sp_getapplock wird 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. ErrorMessage ist varchar(512), und die Liste der Rechnungsnummern liegt in einer varchar(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 Prozedur ShipVendor als varchar(3) und die Tracking-IDs als varchar(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 ohne CanDoDirectFulfillment oder einen Positionsstatus ungleich FUT als typische Ursachen für eine fehlende Rechnung.
  • Einstellungen.
    • Ist weder EnableFulfilmentTypeOne noch EnableFulfilmentTypeTwo gleich 1, werden keine Rechnungen erzeugt.
    • Bei DoNotSendAUSmailOnFulfillment = 1/Y werden die Positionen zusätzlich mit CustomerEMailed = 'Y' markiert.
  • Rechnungsnummern. Eine vorhandene externe Rechnungsnummer an den Auftragspositionen (InvoiceNrExternal) wird bei der Anlage der Rechnung verwendet. Danach ruft die interne Prozedur Pixi_GetNextInvNr auf und schreibt deren Ergebnis in InvoiceNr. 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_EventPublish und Pixi_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: /Orderlines/Orderline, mit den Elementen OrderlineKey, ShipVendor (max. 3 Zeichen), ShipmentTrackingId und ReturnTrackingId. Mehrere Tracking-IDs können mit ; getrennt werden. Bei NULL oder Leerstring werden alle berechtigten Positionen verarbeitet. Bei ShowDetailedMessages = 1 ist das XML Pflicht.

Beispiel:

<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/>
  </Orderline>
</Orderlines>
ShowDetailedMessages
bit
boolean
0

Steuert die Eingabeprüfung und die Status-Ergebnismenge. NULL wird als 0 behandelt.

Erlaubte Werte

  • 0 – Keine Prüfung; Rechnungen werden angelegt, keine Ergebnismenge.
  • 1 – Prüft zuerst das XML und liefert Zeilen mit `ReturnCode`/`ErrorMessage`.

Beispiel: 1

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 ERROR.

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

OK oder ERROR.

ErrorMessage
Kann leer sein
varchar(512)
string

Statustext, z. B. die Liste der Rechnungsnummern, getrennt durch ; .

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>

Verwendete Tabellen

Orderlines · Schreiben Invlines · Schreiben Invoices · Schreiben InvoicePackage · Schreiben OrderHeader · Lesen Addresses · Lesen Customers · Lesen OrderStates · Lesen Currency · Lesen ShipVendor · Lesen
SQL-Objekt:
dbo.pipiDFCreateInvoices
Prozedur zuletzt geändert am 2026-10-05
Dokumentation von claude-opus-5-5 am 2026-10-30 geschrieben