pixiUpdateInvoicePackageTrackingIds
Setzt Sendungs- und Retouren-Tracking-IDs einer Rechnung und, falls eindeutig bestimmbar, des zugehörigen Rechnungspakets und publiziert ein `InvoiceChanged`-Event.
Aktualisiert Tracking-Informationen einer Rechnung (Invoices) und ihres Pakets (pixi.InvoicePackage). Als Ergebnis wird immer eine Statuszeile mit Status und Message geliefert.
Prüfungen
- Mindestens einer der Werte
PackageIdoderInvoiceNrund mindestens einer der WerteTrackingIdoderReturnTrackingIdmuss gefüllt sein. Andernfalls wird Status400geliefert. EinePackageIdvon0gilt als leer. - Bei
TrackingIdundReturnTrackingIdwird je ein führendes und ein abschließendes;entfernt.
Ermittlung von Rechnung und Paket
- Mit
InvoiceNrwird die Rechnung über die Rechnungsnummer gelesen. Alle Pakete mitId = PackageIdoder zur Rechnung gehörend werden geladen. - Nur mit
PackageIdwird das Paket geladen und die zugehörige Rechnung gelesen. - Wird nur
InvoiceNrübergeben, hat die Rechnung mehrere Pakete und istOverwrite = 1, wird Status400geliefert (PackageIdist erforderlich). - Wird kein Paket gefunden, wird Status
400geliefert. Das gilt auch, wenn die Rechnung nicht existiert oder kein Paket hat. Gleiches gilt, wennPackageIdundInvoiceNrbeide übergeben werden, das Paket aber nicht zur Rechnung gehört. - Überschreitet die Länge aus gespeichertem und neuem Wert 512 Zeichen, wird Status
411geliefert. Geprüft wird dies fürShipmentTrackingIDund fürretTrackIDhist.
Welche Datensätze aktualisiert werden
- Die Rechnung wird immer aktualisiert.
- Das Paket wird in drei Fällen zusätzlich aktualisiert:
PackageIdundInvoiceNrpassen zusammen.- Nur
InvoiceNrwird übergeben und die Rechnung hat genau ein Paket. - Nur
PackageIdwird übergeben.
- Wird nur
InvoiceNrübergeben, hat die Rechnung mehrere Pakete und istOverwrite = 0, wird nur die Rechnung aktualisiert.
Sendungs-Tracking (TrackingId)
Overwrite = 0:TrackingIdwird mit;getrennt anInvoices.ShipmentTrackingIDangehängt. Das geschieht nur, wenn der bestehende Wert sie noch nicht enthält (Teilstring-Vergleich).Overwrite = 1:ShipmentTrackingIDwird neu gebildet aus den Tracking-IDs aller anderen Pakete der Rechnung, jeweils gefolgt von;, plusTrackingId. IstTrackingIdbereits in dieser Liste enthalten, wirdShipmentTrackingIDaufTrackingIdallein gesetzt.- Das Paket erhält nur das letzte
;-getrennte Segment vonTrackingIdalsTrackingID.
Retouren-Tracking (ReturnTrackingId)
Overwritehat auf das Retouren-Tracking keinen Einfluss.- Ist
ReturnTrackingIdnoch nicht inInvoices.retTrackIDenthalten:retTrackIDwird auf das letzte;-getrennte Segment gesetzt.- Der vollständige Wert wird mit abschließendem
;anretTrackIDhistangehängt.
- Das Paket erhält das letzte Segment als
ReturnTrackingId.
Weitere Schritte
- Die Rechnung erhält
UpdateDate = GETDATE()undUpdateEmp = '(Return) TrackingID API Update'. - Das Paket erhält
RecordModifiedOnundRecordModifiedByUserId, die ID des BenutzersAPI. - Mit
ResetClientNotifiedFlag = 1wirdClientNotifiedaufNgesetzt, und zwar beim jeweils letztenAUS-Eintrag (ausgeliefert) inOrderHistoryjeder Auftragsposition der Rechnung. Dadurch wird die Sendung erneut exportiert bzw. gemeldet. - Zum Schluss wird das MQ-Event
InvoiceChangedmit dem Rechnungsschlüssel und dem ParameterSetTrackingIdpubliziert.
Hinweise
- Transaktion: Alle Änderungen laufen in einer Transaktion. Besteht beim Aufrufer bereits eine offene Transaktion, wird ein Savepoint verwendet. Validierungsfehler (
400/411) ändern nichts; die Transaktion wird trotzdem committet und die Statuszeile geliefert. - Unerwartete SQL-Fehler: Die Transaktion wird zurückgerollt und der Fehler über
log.InsertErrorprotokolliert. In diesem Fall wird keine Statuszeile geliefert. - Status als Zeichenkette:
Statusist eine Zeichenkette (200,400,411), kein HTTP-Status. Der SOAP-Aufruf selbst ist erfolgreich. - Duplikatprüfung: Die Prüfung, ob eine Tracking-ID bereits vorhanden ist, erfolgt per
LIKE '%…%'als Teilstring-Vergleich. Eine neue ID, die Teil einer längeren bestehenden ID ist oder%/_enthält, kann fälschlich als vorhanden gelten und wird dann nicht angehängt. - Meldungen: Sie nennen
InvoiceKey, der Parameter heißt jedochPackageId. - NOLOCK: Rechnungen und Pakete werden mit
NOLOCKgelesen. - Trigger: Während des Rechnungs-Updates wird
CONTEXT_INFOauf0x11111gesetzt, vermutlich damit Trigger dieses Update erkennen. Deren Verhalten ist hier nicht sichtbar. - Unbekannter API-Benutzer: Existiert kein Benutzer
APIinUCS_USERS, wirdRecordModifiedByUserIdaufNULLgesetzt. - MQ-Event:
InvoiceChangedwird nur gesendet, wenn die EinstellungpixiMQ_Enabledaktiv ist und das Event inEventConfigurationkonfiguriert und aktiviert ist. Zustellfehler landen inEventQueueund führen nicht zu einem Fehler dieses Aufrufs.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
PackageId
|
int | NULL |
ID des Rechnungspakets ( Beispiel: |
InvoiceNr
|
varchar(20) string |
NULL |
Rechnungsnummer ( Beispiel: |
TrackingId
|
varchar(512) string |
NULL |
Sendungs-Tracking-ID, optional mehrere IDs mit Beispiel: |
ReturnTrackingId
|
varchar(512) string |
NULL |
Retouren-Tracking-ID, optional mehrere IDs mit Beispiel: |
Overwrite
|
bit boolean |
0 |
Steuert, wie Erlaubte Werte
Beispiel: |
ResetClientNotifiedFlag
|
bit boolean |
0 |
Bei Erlaubte Werte
Beispiel: |
Antwort
Result-Set 1 · Immer, außer bei einem unerwarteten SQL-Fehler
Statuszeile mit dem Ergebnis der Aktualisierung.
| Spalte | Typ | Beschreibung |
|---|---|---|
Status
|
varchar(50) string |
|
Message
|
varchar(2000) string |
Erfolgs- oder Fehlermeldung. |
Beispielantwort
<SqlRowSet1>
<row>
<Status>200</Status>
<Message>TrackingId & ReturnTrackingId was updated successfully</Message>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| 400 | InvoiceKey and InvoiceNr are empty, you have to specified at least one parameter. | Weder `PackageId` noch `InvoiceNr` übergeben (oder `PackageId` ist 0). Mindestens einen der Werte übergeben. |
| 400 | TrackingId and ReturnTrackingId are empty, you have to specified at least one parameter. | Weder `TrackingId` noch `ReturnTrackingId` übergeben. Mindestens einen der Werte übergeben. |
| 400 | All parameters are empty, please review and adapt parameters. | `PackageId`, `InvoiceNr`, `TrackingId` und `ReturnTrackingId` sind alle leer. |
| 400 | Multiple packages found for this invoice. PackageId parameter is required to identify the specific package to update. | Nur `InvoiceNr` mit `Overwrite = 1` übergeben, und die Rechnung hat mehrere Pakete. Zusätzlich `PackageId` übergeben oder `Overwrite = 0` verwenden; dann wird nur die Rechnung aktualisiert. |
| 411 | TrackingId or ReturnTrackingId are too long, field size max. of 512 characters was reached. Please review and adapt. | Bestehende `ShipmentTrackingID` bzw. `retTrackIDhist` plus neuer Wert würde 512 Zeichen überschreiten. Kürzere Werte verwenden oder `Overwrite = 1`; Letzteres hilft nur bei `TrackingId`. |
| 400 | TrackingId or ReturnTrackingId could not be updated, please check if the InvoiceKey OR InvoiceNr is correct. | Für `PackageId`/`InvoiceNr` wurde kein Paket gefunden. Dazu zählen eine unbekannte Rechnung und eine Rechnung ohne Pakete. Der Fehler tritt auch auf, wenn das angegebene Paket nicht zur angegebenen Rechnung gehört. |
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:pixiUpdateInvoicePackageTrackingIds>
<!-- <PackageId>15832</PackageId> -->
<!-- <InvoiceNr>RE2024001234</InvoiceNr> -->
<!-- <TrackingId>00340434161094042557</TrackingId> -->
<!-- <ReturnTrackingId>00340434161094042564</ReturnTrackingId> -->
<!-- <Overwrite>0</Overwrite> -->
<!-- <ResetClientNotifiedFlag>1</ResetClientNotifiedFlag> -->
</ns1:pixiUpdateInvoicePackageTrackingIds>
</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:pixiUpdateInvoicePackageTrackingIds>
<!-- <PackageId>15832</PackageId> -->
<!-- <InvoiceNr>RE2024001234</InvoiceNr> -->
<!-- <TrackingId>00340434161094042557</TrackingId> -->
<!-- <ReturnTrackingId>00340434161094042564</ReturnTrackingId> -->
<!-- <Overwrite>0</Overwrite> -->
<!-- <ResetClientNotifiedFlag>1</ResetClientNotifiedFlag> -->
</ns1:pixiUpdateInvoicePackageTrackingIds>
</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 = [
// 'PackageId' => '15832',
// 'InvoiceNr' => 'RE2024001234',
// 'TrackingId' => '00340434161094042557',
// 'ReturnTrackingId' => '00340434161094042564',
// 'Overwrite' => '0',
// 'ResetClientNotifiedFlag' => '1',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiUpdateInvoicePackageTrackingIds', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiUpdateInvoicePackageTrackingIds