abas i XML cz. 2: Zamówienia i zaopatrzenie – cXML, UBL oraz reguły importu XML do abas
Przetwarzanie przychodzących zamówień cXML i UBL w abas ERP: transformacja XSLT do EDP-XML, automatyczne tworzenie zleceń sprzedaży, obsługa rozbieżności cenowych i reguły walidacyjne FOP.
W pierwszej części naszej serii omówiliśmy wewnętrzny model danych XML w abas ERP, zasady działania interfejsu EDP-XML oraz fundamentalne reguły składniowe. W drugiej części skupiamy się na jednym z kluczowych wyzwań integracyjnych B2B: jak odbierać i przetwarzać zamówienia klientów w nowoczesnych standardach XML (cXML, UBL / Peppol Order) oraz jak zapewnić w pełni zautomatyzowane tworzenie zamówień sprzedaży w systemie abas.
Obok klasycznych komunikatów EDIFACT ORDERS, nowoczesne platformy zakupowe (SAP Ariba, Coupa, Jaggaer) komunikują się niemal wyłącznie za pomocą cXML, natomiast w europejskich zamówieniach publicznych i obrocie międzynarodowym dominuje standard Peppol BIS Order 3.0 (oparty na OASIS UBL 2.1). Dzięki swojej elastyczności abas ERP potrafi bez problemu obsłużyć oba te formaty.
Porównanie standardów B2B XML: cXML vs UBL
Zanim przejdziemy do szczegółów technicznych w systemie abas, warto zestawić najważniejsze cechy obu formatów:
| Cecha | cXML (commerce eXtensible Markup Language) | UBL (Universal Business Language) Order 2.1 |
|---|---|---|
| Główne zastosowanie | SAP Ariba, Coupa, bezpośrednie katalogi B2B PunchOut | Sieć Peppol, europejski handel B2G oraz B2B |
| Nagłówek i autoryzacja | Wbudowane nagłówki Shared Secret i tożsamości (<Header><From>...</Header>) | Ustandaryzowane elementy EndpointID oraz PartyIdentification |
| Przestrzenie nazw (Namespaces) | Zazwyczaj oparte na DTD lub bez prefiksów | Ścisła hierarchia przestrzeni nazw (urn:oasis:names:specification:ubl:schema:xsd:Order-2) |
| Mechanizm potwierdzenia | Synchroniczna odpowiedź HTTP (200 OK + cXML Status) i asynchroniczne cXML Confirmation | UBL OrderResponse (Peppol BIS Order Response 3.0) |
Architektura procesu: Od przychodzącego XML do zamówienia w abas
Przetwarzanie zamówień XML w abas ERP przebiega w bezpiecznym, wieloetapowym procesie (pipeline):
- Odbiór i wstępna walidacja: Dokument cXML lub UBL dociera kanałem komunikacyjnym (AS2, API HTTPS REST lub SFTP) i natychmiast podlega walidacji schematu XSD w celu wyeliminowania błędów składniowych.
- Transformacja XSLT: Dedykowany arkusz XSLT przekształca zewnętrzną strukturę XML do natywnego formatu abas EDP-XML (warstwa Head oraz Table).
- Mapowanie danych podstawowych: Na podstawie tabel referencyjnych w abas Vartab kody klienta (GLN, NIP) i numery artykułów nabywcy są tłumaczone na wewnętrzne identyfikatory abas.
- Bezzalogowy import EDP (Headless Import): Serwer EDP otwiera transakcję w tle, wywołuje formatkę zamówienia sprzedaży, wykonuje logikę biznesową (weryfikacja limitu kredytowego, cenniki, reguły podatkowe) i generuje dokument.
- Sprzężenie zwrotne i powiadomienia: Po pomyślnym utworzeniu zapisywany jest numer zamówienia; w przypadku rozbieżności cenowych zamówienie otrzymuje status ostrzegawczy i trafia do opiekuna klienta.
Transformacja XSLT: Konwersja UBL / cXML do abas EDP-XML
Kluczem do niezawodnej integracji jest wydajna transformacja XSLT. Poniższy przykład ilustruje przekształcenie zamówienia UBL 2.1 w natywną strukturę <abasDocument>:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Order-2"
exclude-result-prefixes="cac cbc ubl">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="/ubl:Order">
<abasDocument type="SalesOrder" version="2026.1">
<head>
<!-- Numer zewnętrznego zamówienia i data -->
<bestellnr><xsl:value-of select="cbc:ID"/></bestellnr>
<vom><xsl:value-of select="cbc:IssueDate"/></vom>
<wtermin><xsl:value-of select="cac:Delivery/cac:RequestedDeliveryPeriod/cbc:EndDate"/></wtermin>
<!-- Identyfikacja klienta przez GLN / EndpointID -->
<ygln><xsl:value-of select="cac:BuyerCustomerParty/cac:Party/cbc:EndpointID"/></ygln>
<waehrung><xsl:value-of select="cbc:DocumentCurrencyCode"/></waehrung>
<!-- Wskaźnik statusu integracji -->
<yedistat>XML_IMPORT_NEW</yedistat>
</head>
<table>
<xsl:for-each select="cac:OrderLine">
<row n="{position()}">
<!-- Numer artykułu klienta i kod EAN/GTIN -->
<ycustomerno><xsl:value-of select="cac:LineItem/cac:Item/cac:BuyersItemIdentification/cbc:ID"/></ycustomerno>
<yean><xsl:value-of select="cac:LineItem/cac:Item/cac:StandardItemIdentification/cbc:ID"/></yean>
<mge><xsl:value-of select="cac:LineItem/cbc:Quantity"/></mge>
<he><xsl:value-of select="cac:LineItem/cbc:Quantity/@unitCode"/></he>
<preis><xsl:value-of select="cac:LineItem/cac:Price/cbc:PriceAmount"/></preis>
</row>
</xsl:for-each>
</table>
</abasDocument>
</xsl:template>
</xsl:stylesheet>
Mechanizm importu EDP w tle (Headless EDP) w abas ERP
Gdy arkusz XSLT wygeneruje czysty dokument abas XML, serwer EDP przeprowadza import z zachowaniem pełnej spójności transakcyjnej:
- Wyszukiwanie kontrahenta na podstawie
yglnlub NIP: Jeśli wewnętrzny numer klienta nie jest znany, EDP przeszukuje kartotekę odbiorców. W przypadku braku jednoznacznego dopasowania zamówienie przypisywane jest do konta tymczasowego (Clearing Account) z blokadą realizacji. - Referencje krzyżowe artykułów: Podczas przetwarzania pozycji abas analizuje pola
yean(GTIN) iycustomerno. Na podstawie tabeli Vartab automatycznie podstawiany jest wewnętrzny numer indeksu (artikel). - Normalizacja jednostek miary: Międzynarodowe kody UN/ECE Rec 20 (np.
H87= szt.,KGM= kg,MTR= m) tłumaczone są na wewnętrzne jednostki abas.
Obsługa rozbieżności cenowych i reguły tolerancji
Jednym z najczęstszych problemów w praktyce jest rozbieżność cenowa: cena jednostkowa przesłana w zamówieniu XML klienta różni się od ceny w obowiązującym cenniku lub umowie w abas ERP.
W systemie abas sytuację tę obsługuje reguła FOP (Format Optimization Program):
Jeśli
| Cena_XML - Cena_z_Umowy_abas | > Próg_Tolerancji (np. > 0.5% lub > 0.01 EUR):
- Pozycja zostaje zapisana z ceną z zamówienia klienta, aby zachować intencję zamawiającego.
- Pozycja i nagłówek zamówienia otrzymują status "Wymaga akceptacji ceny" (
yedistat = 'PRICE_DISCREPANCY'). - Zamówienie zostaje automatycznie zablokowane przed wystawieniem dokumentu WZ (Lieferschein), a do działu sprzedaży wysyłane jest powiadomienie.
Typowe pułapki podczas importu zamówień XML
- Błędy przestrzeni nazw w XSLT: Dokumenty UBL stosują ścisłe przestrzenie nazw (
xmlns:cac="..."). Brak ich zdefiniowania w szablonie sprawia, że ścieżki XPath zwracają pusty wynik, a pozycje zamówienia nie zostaną utworzone. - Niepożądana agregacja pozycji: Jeżeli klient zamawia ten sam artykuł w dwóch odrębnych liniach z różnymi terminami dostawy, domyślna logika łączenia pozycji zniszczy harmonogram zamawiającego. Łączenie pozycji musi być wyłączone.
- Precyzja zaokrągleń: Gdy zewnętrzny XML podaje cenę jednostkową z 4 miejscami po przecinku (np.
0.1235 EUR), a pole w abas ma 2 miejsca, suma netto może nie zgadzać się z oczekiwaniami nabywcy. - Brak obsługi korekt i anulowań: Gdy kontrahent przesyła zaktualizowany plik XML do istniejącego zamówienia, system musi rozpoznać pierwotne zamówienie zamiast tworzyć duplikat.
Podsumowanie
Automatyzacja importu zamówień cXML i UBL przy pomocy XSLT i EDP eliminuje ręczne wprowadzanie danych, skraca czas potwierdzania zamówień i gwarantuje pełną spójność danych w abas ERP.
W części 3 przejdziemy do logistyki wysyłkowej: omówimy eksport dokumentów WZ z hierarchią opakowań (Handling Units, SSCC) w formacie XML oraz integrację z systemami WMS i API kurierów (GLS, DPD, DHL).
Planujesz automatyzację przetwarzania zamówień cXML i UBL w systemie abas ERP? Skontaktuj się z naszym zespołem ekspertów!