pixiAutoMatchPayments
Ordnet die Bankzeilen eines Bank-Headers automatisch offenen Aufträgen oder Rechnungen zu, bestätigt die Zuordnung und gibt den Auftrag bei vollständiger Zahlung frei.
Führt den automatischen Zahlungsabgleich für einen Bank-Header (BankHeaderKey) aus und bestätigt bei einem Treffer die Zuordnung; anschließend wird versucht, den zugeordneten Auftrag freizugeben.
- Ist
BankHeaderKeyNULL, wird eine Zeile mit NULL-Werten und der MeldungParameter BankHeaderKey is mandatory!geliefert; sonst passiert nichts. - Der interne automatische Abgleich (
Pixi_BankAutomaticMatching) läuft für alle Bankzeilen dieses Headers, die noch keinen Eintrag inBankMatchhaben. Gesucht werden 100%-Treffer:- Aufträge, deren Zahlungsart einen Abgleich erlaubt (
Payments.MatchToOrders = 1) und die mindestens eine Auftragsposition im StatusHALhaben. Der Bankbetrag muss dem offenen Betrag (OrderTotal - PaidByCustomer, auf 2 Stellen gerundet) in derselben Währung entsprechen, und der Buchungstext (BankText01–BankText03) muss die externe Auftragsnummer (optional ohne Präfix), dieccpPayID, eine eindeutige externe Kundennummer oder eine eindeutige E-Mail-Adresse enthalten. - Rechnungen, die vollständig unbezahlt sind und deren Zahlungsart
MatchToInvoices = 1hat. Der Bankbetrag muss der Rechnungssumme entsprechen; der Buchungstext muss Rechnungsnummer, externe Auftragsnummer, Kundennummer oder E-Mail enthalten. - Mehrdeutige Kandidaten werden verworfen. Gefundene Treffer werden als Vorabzuordnung (
IsPrematch = 1) inBankMatchgeschrieben.
- Aufträge, deren Zahlungsart einen Abgleich erlaubt (
- Wurde kein Treffer gefunden, lautet
message0 matched orders/invoices found.gefolgt von einem Zeilenumbruch und dem Statistiktext des Abgleichs (Anzahl Bankzeilen, offene und zugeordnete Aufträge/Rechnungen). - Andernfalls wird der
BankMatch-Eintrag der Bankzeile dieses Headers gelesen, und alle Vorabzuordnungen dieser Bankzeile werden bestätigt (IsPrematchauf 0). - Für den zugeordneten Auftrag werden
OrderNrund die DifferenzABS(OrderTotal - PaidByCustomer)ausOrderHeadergelesen:- Differenz 0: Alle Auftragspositionen des Auftrags im Status
HALwerden aufANGgesetzt (BearbeiterIPN_API (payments)); MeldungDelta: 0; releasing order: {OrderNr}. - Sonst: Meldung
Delta: {Delta}; cannot release order:{OrderNr}; der Auftrag bleibt angehalten.
- Differenz 0: Alle Auftragspositionen des Auftrags im Status
- Sofern nicht
SuppressOutput = 1, wird eine Zeile mitOrderHeaderKey,OrderNr,AmountMatched,BankLineKeyundmessagegeliefert.
Hinweise
- Eine Bankzeile pro Header erwartet: Die Bankzeile wird über eine Unterabfrage auf
BankLinesmit FilterBankHeaderRefermittelt. Hat der Bank-Header mehrere Bankzeilen und wurde ein Treffer gefunden, löst SQL Server Fehler 512 aus (Unterabfrage liefert mehr als einen Wert), zurückgegeben alsSqlMessage. Zu diesem Zeitpunkt sind die Vorabzuordnungen bereits inBankMatchgeschrieben. Der Aufruf ist für Header mit genau einer Zeile gedacht (z. B. eine Zahlungsbenachrichtigung pro Header, BearbeiterIPN_API). - Keine Transaktion: Abgleich, Bestätigung und Auftragsfreigabe laufen als getrennte Schritte. Ein Fehler in einem späteren Schritt macht frühere Schritte nicht rückgängig.
- Der
BankMatch-Eintrag wird ohne Filter aufIsPrematchgelesen; existieren mehrere Einträge für die Bankzeile, wird ein beliebiger geliefert. - Betrifft der Treffer eine Rechnung statt eines Auftrags, sind
OrderHeaderKeyundOrderNrNULL, es wird kein Auftrag freigegeben undmessageist NULL (Verkettung mit NULL). - Wird trotz Treffer keine
BankMatch-Zeile gefunden (BankLineKeyNULL), läuft die Bestätigung in ihren Massenzweig und bestätigt bis zu 100 beliebige Vorabzuordnungen aller Bankzeilen. - Ob
PaidByCustomerbei der Differenzberechnung bereits aktualisiert ist, hängt von Logik ab, die im Code nicht sichtbar ist (z. B. Trigger aufBankMatch). - Das Abgleichsverhalten wird durch die Einstellungen
AutomatchBanklines_Enforce_CustomerNrExternal(Auftrags-/Rechnungsnummer muss zusätzlich mit Kundennummer vorkommen, außer bei0) undAutomatchBanklinesStrictOrderNrExternalMatchOnly(1deaktiviert den Abgleich über die externe Auftragsnummer ohne Präfix) beeinflusst. Auftragsnummern ohne Präfix werden erst ab 5 Zeichen verwendet. - Lesezugriffe erfolgen mit
NOLOCK; nicht festgeschriebene Daten können berücksichtigt werden. - Schlägt die Auftragsfreigabe fehl, wird der Fehler in
LogTableprotokolliert und erneut ausgelöst.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
BankHeaderKey
|
int | NULL |
Schlüssel des Bank-Headers, dessen Bankzeilen abgeglichen werden. Faktisch Pflicht; fehlt er, wird eine Fehlerzeile geliefert. Beispiel: |
SuppressOutput
|
bit boolean |
0 |
Unterdrückt die Ergebniszeile nach der Verarbeitung. NULL wird als 0 behandelt. Die Fehlerzeile bei fehlendem Erlaubte Werte
Beispiel: |
Antwort
Result-Set 1 · Immer, wenn BankHeaderKey NULL ist (Fehlerzeile); sonst nur bei SuppressOutput = 0.
Eine Zeile mit dem zugeordneten Auftrag, dem zugeordneten Betrag, der Bankzeile und einer Statusmeldung.
| Spalte | Typ | Beschreibung |
|---|---|---|
OrderHeaderKey
Kann leer sein |
int |
Schlüssel des zugeordneten Auftrags; NULL, wenn nichts zugeordnet wurde oder der Treffer eine Rechnung betrifft. |
OrderNr
Kann leer sein |
int |
Auftragsnummer des zugeordneten Auftrags. |
AmountMatched
Kann leer sein |
money decimal |
Im |
BankLineKey
Kann leer sein |
int |
Schlüssel der zugeordneten Bankzeile. |
message
Kann leer sein |
varchar(1000) string |
Statustext: fehlender Parameter, kein Treffer (mit Abgleichsstatistik), Auftrag freigegeben oder Auftrag nicht freigegeben mit verbleibender Differenz. |
Beispielantwort
<SqlRowSet1>
<row>
<OrderHeaderKey>215873</OrderHeaderKey>
<OrderNr>100482</OrderNr>
<AmountMatched>59.9000</AmountMatched>
<BankLineKey>88231</BankLineKey>
<message>Delta: 0; releasing order: 100482</message>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| message | Parameter BankHeaderKey is mandatory! | `BankHeaderKey` wurde nicht übergeben oder ist NULL. Den Schlüssel des Bank-Headers übergeben. |
| message | 0 matched orders/invoices found. Message: {MatchInfo} | Der automatische Abgleich hat für die nicht zugeordneten Bankzeilen des Headers keinen eindeutigen Auftrag und keine eindeutige Rechnung gefunden (oder alle Zeilen sind bereits zugeordnet). `{MatchInfo}` enthält die Abgleichsstatistik. |
| message | Delta: {Delta}; cannot release order:{OrderNr} | Die Zuordnung wurde bestätigt, aber Auftragssumme und vom Kunden bezahlter Betrag weichen ab; der Auftrag bleibt angehalten. |
| RAISERROR | {ERROR_MESSAGE} | Die Freigabe der Auftragspositionen aus dem Status `HAL` ist fehlgeschlagen (z. B. Sperr- oder Constraint-Fehler). Der ursprüngliche Fehler wird in `LogTable` protokolliert und erneut ausgelöst. |
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:pixiAutoMatchPayments>
<!-- <BankHeaderKey>40098</BankHeaderKey> -->
<!-- <SuppressOutput>0</SuppressOutput> -->
</ns1:pixiAutoMatchPayments>
</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:pixiAutoMatchPayments>
<!-- <BankHeaderKey>40098</BankHeaderKey> -->
<!-- <SuppressOutput>0</SuppressOutput> -->
</ns1:pixiAutoMatchPayments>
</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 = [
// 'BankHeaderKey' => '40098',
// 'SuppressOutput' => '0',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiAutoMatchPayments', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiAutoMatchPayments