pixiCreateInvoice
Legt eine Rechnung für eine gepackte Kiste (BoxNr an einem Lager) an und liefert die neue Rechnungs-ID und Rechnungsnummer mit einer Statuszeile.
Legt die Rechnung für den Inhalt einer Kiste an und liefert immer genau eine Statuszeile.
- Ist
BoxNroderLocIdNULL, wird eine Fehlerzeile geliefert. Ein leererUserNamewird durchAPIersetzt. - Die Kiste wird mit der internen Prozedur
GOS_BoxesRange(BereichBoxNr..BoxNram LagerLocId) auf Fakturierbarkeit geprüft. Die Kiste ist fakturierbar, wenn alle folgenden Bedingungen gelten:- sie ist noch nicht als versendet markiert (
WaitForSend<>Y) oder sie ist physisch voll und enthält Positionen ohne Rechnungspositionen; - der Kunde hat keine Versandsperre (
SLockednichtY/1); - keine Lieferadresse der Auftragspositionen in der Kiste hat eine Versandsperre (
ASlocked); - die Kistennummer ist nicht die eigene Kistennummer des Lagers (
LocBoxNumber); - haben Auftragspositionen der Kiste ein Bestätigungsdatum (
ConfDate), liegt mindestens eines davon auf dem heutigen Tag.
- sie ist noch nicht als versendet markiert (
- Ist die Kiste nicht fakturierbar, wird der Grund ermittelt und als Fehlerzeile geliefert: Kiste an diesem Lager nicht gefunden, Kiste leer, Rechnung existiert bereits, Versandsperre auf einer Auftragsadresse, Versandsperre beim Kunden; sonst ein allgemeines "Invoice creation failed." (deckt auch die Regeln zu
ConfDateund Lager-Kistennummer ab). - Ist die Kiste fakturierbar, legt die interne Prozedur
Pixi_CreateInvdie Rechnung mit ErstellungsmodusAPIund Sprach-ID1an. Dabei wird:- die Kiste als versendet markiert (
WaitForSend = 'Y') und gegen Doppelfakturierung gesperrt; - der Rechnungskopf (
Invoices) und je Kistenposition eine Rechnungsposition (Invlines) angelegt; zusätzlich noch nicht fakturierte Auftragspositionen desselben Auftrags mit StatusMINoder einem Status aus der EinstellungPutThisStatusesOnInvoice; Orderlines.InvRefgesetzt, die endgültige Rechnungsnummer je Shop vergeben, Bruttogewicht, Retouren-Tracking-ID und einInvoicePackage-Datensatz gespeichert;- optional die Kiste ausgescannt, offene Teillieferungen storniert, die Rechnung auf das Kundenkonto gebucht und das Ereignis
InvoiceCreatedveröffentlicht. Existiert für die Kiste bereits eine Entwurfsrechnung (InvoiceStatusId = 0), wird stattdessen dieser Entwurf finalisiert (ErstellungsmodusMobileShipOut).
- die Kiste als versendet markiert (
- Ergebnis: bei Erfolg eine Zeile mit
InvoiceId,InvoiceNrundStatus = 'SUCCESS'; bei Fehler sindInvoiceId/InvoiceNrNULLundStatus/Messageenthalten den Fehler.
Hinweise
- Die Rechnungserstellung läuft in einer eigenen Transaktion (bzw. einem Savepoint, falls der Aufrufer bereits eine Transaktion hat). Bei Deadlock (1205) oder doppeltem Schlüssel (2601) wird bis zu 5-mal wiederholt; Wiederholungen und Fehler werden in
LogTableund im Fehlerprotokoll erfasst. - Die Vorprüfungen verwenden
NOLOCK; der eigentliche Schutz vor Doppelrechnungen ist dasUPDLOCKauf die Kiste inPixi_CreateInv. - Der Statuswert unterscheidet sich in der Schreibweise: Fehler der Vorprüfung liefern
Error, Fehler aus der RechnungserstellungERROR(aus dem internen Ergebnis übernommen). - Fallstrick: Einige interne Fehler (z. B. "ERROR CREATING INVOICE Invoice Total empty", Fremdschlüsselfehler wie Aufträge verschiedener Kunden in einer Kiste) werden in
Pixi_CreateInvabgefangen, ohne dessen Fehlermeldung zu setzen. Dann liefert dieser AufrufStatus = 'SUCCESS'mitInvoiceId/InvoiceNr=NULL. Daher immer prüfen, dassInvoiceIdnichtNULList. - Das Verhalten hängt von zur Laufzeit gelesenen Einstellungen ab:
PutThisStatusesOnInvoice,Enforce_CheckKuhlung(Versandkostenanpassung für Kühlartikel),DefaultShippingWeight,CalculateWeightFromItems,Invoice_CancelPartialDelivery(offene Positionen mit StatusANG,HAL,BORwerden aufSTOgesetzt). - Das Ausscannen erfolgt automatisch, wenn der Versanddienstleister (
DoScanOutOnInvoiceCreate) oder die Zahlungsart (AutoScanOutInvoice) dies vorsieht. - Der Pfad zur Finalisierung von Entwürfen (
Pixi_CreateInvoiceFromDraft) liegt nicht vor; dessen genaues Verhalten und Meldungen sind hier nicht dokumentiert. - Die Fehlermeldung für fehlende Parameter nennt den Benutzernamen, geprüft werden aber nur
BoxNrundLocId.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
BoxNr
Pflicht
|
int | – |
Nummer der gepackten Kiste, die fakturiert werden soll. Beispiel: |
LocId
Pflicht
|
varchar(3) string |
– |
Lager-ID, zu der die Kiste gehört. Beispiel: |
UserName
|
varchar(50) string |
API |
Benutzername, der als Ersteller der Rechnung und ihrer Positionen gespeichert wird. Leer oder NULL wird durch Beispiel: |
Antwort
Result-Set 1 · Immer (genau eine Zeile, Erfolg oder Fehler)
Statuszeile mit der angelegten Rechnung oder dem Fehler.
| Spalte | Typ | Beschreibung |
|---|---|---|
InvoiceId
Kann leer sein |
int |
Interner Schlüssel der angelegten Rechnung ( |
InvoiceNr
Kann leer sein |
varchar(20) string |
Vergebene Rechnungsnummer der neuen Rechnung; NULL bei Fehler. |
Status
Kann leer sein |
varchar(50) string |
|
Message
Kann leer sein |
varchar(200) string |
Leer bei Erfolg, sonst die Fehlermeldung. |
Beispielantwort
<SqlRowSet1>
<row>
<InvoiceId>184532</InvoiceId>
<InvoiceNr>RE2024104871</InvoiceNr>
<Status>SUCCESS</Status>
<Message/>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| Error | Parameters Box number, Location Id and User Name must be specified. | `BoxNr` oder `LocId` wurde nicht übergeben oder ist NULL. |
| Error | Box could not be found. | Am Lager `LocId` existiert keine Kiste mit dieser `BoxNr`. |
| Error | Box is empty - no items. | Die Kiste enthält keine Positionen; vor der Fakturierung Artikel packen. |
| Error | Invoice creation failed. Invoice already exists. | Die Kiste ist bereits als versendet markiert (`WaitForSend = 'Y'`) und enthält keine unfakturierten Positionen in einer physisch vollen Kiste. |
| Error | Invoice creation failed. There is a "Ship lock" set for order in box {BoxNr}. | Eine Lieferadresse einer Auftragsposition in der Kiste hat eine Versandsperre (`ASlocked`). Sperre zuerst aufheben. |
| Error | Invoice creation failed. There is a "Ship lock" set for customer in box {BoxNr}. | Der Kunde der Kiste hat eine Versandsperre (`SLocked`). Sperre zuerst aufheben. |
| Error | Invoice creation failed. | Die Kiste ist aus einem anderen Grund nicht fakturierbar, z. B. Auftragspositionen mit Bestätigungsdatum ungleich heute oder die Kistennummer ist die eigene Kistennummer des Lagers. |
| Error | {ERROR_MESSAGE()} | Ein SQL-Fehler ist aus der internen Rechnungserstellung durchgeschlagen; der ursprüngliche SQL-Fehlertext wird geliefert. |
| ERROR | INVOICE ALREADY EXISTS | Bei der Erstellung wurde festgestellt, dass die Kiste bereits fakturiert ist (z. B. paralleler Aufruf). |
| ERROR | URGENT: Double invlines; BoxKey={BoxKey} currentLocation={LocId} User={UserName} | Für die Auftragspositionen wurden doppelte Rechnungspositionen erkannt; die Rechnung wird zurückgerollt. |
| ERROR | ERROR CREATING INVOICE; please check related addresses, country code could be missing | Der Rechnungskopf konnte nicht angelegt werden, meist weil die Lieferadresse keinen gültigen Ländercode hat. |
| ERROR | ERROR CREATING INVOICE BoxItems <> Invlines | Die Anzahl der Rechnungspositionen stimmt nicht mit der Anzahl der Kistenpositionen überein; die Rechnung wird zurückgerollt. |
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:pixiCreateInvoice>
<BoxNr>1042</BoxNr>
<LocId>001</LocId>
<!-- <UserName>shopconnector</UserName> -->
</ns1:pixiCreateInvoice>
</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:pixiCreateInvoice>
<BoxNr>1042</BoxNr>
<LocId>001</LocId>
<!-- <UserName>shopconnector</UserName> -->
</ns1:pixiCreateInvoice>
</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 = [
'BoxNr' => '1042',
'LocId' => '001',
// 'UserName' => 'shopconnector',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiCreateInvoice', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiCreateInvoice