API WMS - OPERACJE MAGAZYNOWE
Operacje magazynowe w API WMS umożliwiają przekazywanie do systemu magazynowego zleceń logistycznych generowanych w ERP, takich jak zlecenia wydań, awizacje przyjęć oraz przesunięcia międzymagazynowe. API WMS zapewnia ustandaryzowany model danych do obsługi dokumentów magazynowych, pozycji towarowych oraz stron operacji, gwarantując spójność informacji pomiędzy systemami. Dzięki integracji przez REST API WMS możliwe jest automatyczne uruchamianie procesów magazynowych – od przyjęcia i kompletacji po wydanie – przy zachowaniu pełnej kontroli, wersjonowania i audytowalności komunikacji.
Zakres funkcjonalny
System zapewnia:
Tworzenie nagłówka operacji (status IMPORT)
Dodawanie pozycji do operacji
Zmianę statusu na ACCEPTED po zakończeniu przesyłania
Walidację integralności operacji
Kontrolę przejść statusów
Monitoring zmian statusów (z mechanizmem ACK)
Kontrolę zmian statusu przez system zewnętrzny
Pełną historię zmian statusów
Model danych
Identyfikacja
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.
Tabela przesuwna w poziomie
| Pole | Charakter | Opis |
|---|---|---|
| OperationId | Techniczne ID | Jedyny identyfikator operacji |
| ReferenceNumber | Identyfikator biznesowy | Numer zewnętrzny (ERP / OMS) |
| OperationType | Typ | INBOUND / OUTBOUND / TRANSFER |
OperationId jest kluczem technicznym i nie podlega zmianie.
Wersjonowanie (Revision++)
Zmiana danych nagłówka operacji:
zwiększa numer wersji (Revision++)
podlega kontroli optimistic concurrency
zapobiega nadpisaniu równoległych zmian
W przypadku niezgodności wersji system zwraca błąd 409 Conflict.
Walidacja wielopoziomowa
System realizuje trzystopniową walidację:
Techniczna (IMPORT)
Kompletność (ACCEPTED)
Biznesowa (NEW)
Walidacja obejmuje m.in.:
istnienie pozycji
poprawność ilości
zgodność (batch/expiry)
wymagane strony operacji (SUPPLIER, SHIP_TO itd.)
Historia zmian
Zmiany statusów
System przechowuje historię:
poprzedni status
nowy status
data zmiany
użytkownik zmieniający
Zapewnia to pełną audytowalność procesu.
Zmiany danych operacji
W systemie WMS każda zmiana danych nagłówkowych operacji (np. OperationType, ReferenceNumber, kontrahent, daty, status) podlega pełnemu monitorowaniu i kontroli zgodności z obowiązującą polityką operacyjną.
Kontrola zgodności z polityką
Każda próba modyfikacji danych nagłówkowych jest weryfikowana pod kątem:
statusu operacji (np. brak możliwości zmiany po rozpoczęciu realizacji),
spójności procesowej (np. brak zmiany typu operacji po wygenerowaniu zadań),
reguł biznesowych (np. blokada zmiany kontrahenta po rezerwacji towaru),
uprawnień użytkownika (kontrola ról i zakresu odpowiedzialności).
Jeżeli zmiana narusza politykę systemową, operacja jest odrzucana, a użytkownik otrzymuje komunikat walidacyjny.
Rejestracja (logowanie) zmian
Każda zaakceptowana zmiana jest zapisywana w rejestrze audytowym (audit log), który obejmuje:
identyfikator operacji,
nazwę zmienionego pola,
wartość poprzednią i nową,
identyfikator użytkownika,
znacznik czasu,
źródło zmiany (UI / API / integracja).
Dzięki temu możliwe jest:
pełne odtworzenie historii operacji,
analiza przyczyn zmian,
wsparcie procesów kontrolnych i audytowych.
Transparentność i bezpieczeństwo
Mechanizm monitorowania zmian:
zwiększa bezpieczeństwo operacyjne magazynu,
ogranicza ryzyko nieautoryzowanych modyfikacji,
zapewnia zgodność z wymaganiami audytowymi i kontrolą wewnętrzną.
Takie podejście jest szczególnie istotne w środowiskach zintegrowanych z ERP/OMS, gdzie operacja magazynowa stanowi element szerszego łańcucha procesowego.
Specyfikacja struktury danych
Operation
Tabela przesuwna w poziomie
| Pole | Typ danych | Wymagalność | Opis |
|---|---|---|---|
| operationId | long | ✔ | Techniczny identyfikator operacji w systemie nadrzędnym. Jednoznacznie identyfikuje dokument w WMS. |
| revision | int | ✔ | Numer rewizji operacji. Pozwala kontrolować wersjonowanie dokumentu i wykrywać konflikty aktualizacji. |
| operationType | enum | ✔ | Typ operacji: INBOUND, OUTBOUND, TRANSFER. Określa logikę biznesową przetwarzania. |
| warehouseCode | string | ✔ | Identyfikator magazynu, którego dotyczy operacja. |
| referenceNumber | string | ✔ | Główny numer referencyjny dokumentu (np. SO, PO). |
| externalReference | string | ✖ | Dodatkowe odniesienie do systemu zewnętrznego. |
| priority | enum | ✖ | Priorytet realizacji (np. LOW, STANDARD, HIGH, URGENT). Wpływa na kolejność przetwarzania. |
| plannedDate | datetime | ✖ | Planowana data realizacji operacji. |
| currency | string (ISO 4217) | ✖ | Kod waluty dokumentu (np. PLN, EUR). |
| totalWeight | decimal(18,4) | ✖ | Łączna waga operacji (wyliczana lub przekazana referencyjnie). |
| totalVolume | decimal(18,4) | ✖ | Łączna objętość operacji. |
| createdAt | datetime | ✔ | Data utworzenia dokumentu w systemie źródłowym. |
| createdBy | string | ✔ | Identyfikator użytkownika lub systemu tworzącego dokument. |
| attributes | array<Attribute> | ✖ | Mechanizm rozszerzeń umożliwiający dodawanie pól niestandardowych. |
Line
Tabela przesuwna w poziomie
| Pole | Typ danych | Wymagalność | Opis |
|---|---|---|---|
| lineId | long | ✔ | Techniczny identyfikator linii operacji. |
| lineNumber | int | ✔ | Numer porządkowy linii w dokumencie. |
| itemId | long | ✔ | Identyfikator towaru (SKU) zgodny z kartoteką WMS. |
| quantity | decimal(18,4) | ✔ | Ilość planowana do realizacji. |
| uom | string | ✔ | Jednostka miary (np. PCS, KG). |
| batchNumber | string | ✖ | Numer partii (zgodny z GS1 AI 10). |
| expiryDate | date | ✖ | Data ważności (AI 17). |
| productionDate | date | ✖ | Data produkcji (AI 11). |
| countryOfOrigin | string | ✖ | Kraj pochodzenia towaru (ISO 3166-1). |
| fulfillmentType | enum | ✖ | Sposób realizacji: FULL, PARTIAL, BACKORDER_ALLOWED. |
| attributes | array<Attribute> | ✖ | Atrybuty rozszerzające poziomu linii. |
Party
Tabela przesuwna w poziomie
| Pole | Typ danych | Wymagalność | Opis |
|---|---|---|---|
| partyId | long | ✔ | Identyfikator strony operacji. |
| partyType | enum | ✔ | Typ strony: SUPPLIER, CUSTOMER, SHIP_FROM, SHIP_TO, CARRIER, OWNER. |
| name | string | ✔ | Nazwa podmiotu. |
| taxId | string | ✖ | Numer identyfikacji podatkowej. |
| gln | string | ✖ | Global Location Number (GS1). |
| externalCode | string | ✖ | Kod zewnętrzny partnera. |
| address | Address | ✔ | Struktura adresowa powiązana z podmiotem. |
| contactName | string | ✖ | Osoba kontaktowa. |
| string | ✖ | Adres e-mail kontaktowy. | |
| phone | string | ✖ | Numer telefonu. |
| attributes | array<Attribute> | ✖ | Atrybuty rozszerzające poziomu partnera. |
Address
Tabela przesuwna w poziomie
| Pole | Typ danych | Wymagalność | Opis |
|---|---|---|---|
| street | string | ✔ | Ulica i numer budynku. |
| city | string | ✔ | Miasto. |
| postalCode | string | ✔ | Kod pocztowy. |
| region | string | ✖ | Region / województwo. |
| country | string (ISO 3166-1 alpha-2) | ✔ | Dwuliterowy kod kraju. |
| latitude | decimal(9,6) | ✖ | Szerokość geograficzna. |
| longitude | decimal(9,6) | ✖ | Długość geograficzna. |
| addressType | enum | ✖ | Typ adresu: LEGAL, DELIVERY, BILLING. |
| note | string | ✖ | Dodatkowe informacje logistyczne (np. godziny dostawy). |
Reference
Tabela przesuwna w poziomie
| Pole | Typ danych | Wymagalność | Opis |
|---|---|---|---|
| referenceId | long | ✔ | Techniczny identyfikator referencji. |
| referenceType | enum | ✔ | Typ dokumentu: PO, SO, ASN, INVOICE, CONTRACT. |
| referenceNumber | string | ✔ | Numer dokumentu referencyjnego. |
| referenceDate | date | ✖ | Data dokumentu źródłowego. |
| sourceSystem | string | ✖ | Nazwa systemu źródłowego. |
| relationType | enum | ✖ | Relacja (PARENT, CHILD, RELATED). |
Attribute (mechanizm rozszerzeń)
Tabela przesuwna w poziomie
| Pole | Typ danych | Wymagalność | Opis |
|---|---|---|---|
| code | string | ✔ | Kod atrybutu. |
| value | string | ✔ | Wartość atrybutu. |
| scope | enum | ✔ | Zakres obowiązywania: HEADER, LINE, PARTY, ITEM. |
Dane przykładowe
Poniższy przykład przedstawia model danych operacji magazynowej przekazywanej z systemu nadrzędnego (np. ERP) do systemu WMS w ramach integracji API. Struktura obejmuje wyłącznie dane referencyjne i planistyczne, nie zawiera natomiast informacji wykonawczych generowanych w trakcie realizacji operacji przez WMS.
Model operacji został zaprojektowany zgodnie z zasadą rozdzielenia warstw:
warstwa integracyjna (ERP → WMS) przekazuje dane dokumentu, strony operacji, referencje oraz planowane ilości,
warstwa wykonawcza (WMS) odpowiada za realizację operacji, alokacje, potwierdzenia ilości, obsługę partii, numerów seryjnych oraz rejestrowanie postępu.
W przykładzie zastosowano podejście kanoniczne (canonical contract), w którym:
operacja stanowi agregat główny (
WarehouseOperation),struktury takie jak
parties,referencesorazlinessą zagnieżdżone bezpośrednio w operacji,wykorzystywane są kody biznesowe (np.
warehouseCode) zamiast identyfikatorów technicznych,pozycje operacji (
lines) znajdują się na końcu struktury, co zwiększa czytelność i jednoznaczność kontraktu.
Przedstawiony model może zostać wykorzystany jako wzorzec implementacyjny dla endpointów typu create / update operacji magazynowej w API WMS.
{
„operationId”: 3000456,
„revision”: 2,
„operationType”: „OUTBOUND”,
„status”: „RELEASED”,
„warehouseCode”: „PL-WAW-01”,
„referenceNumber”: „SO-2026-000350”,
„externalReference”: „ERP-998877”,
„priority”: „HIGH”,
„plannedDate”: „2026-04-15T07:00:00Z”,
„currency”: „PLN”,
„totalWeight”: 185.7500,
„totalVolume”: 2.4500,
„createdAt”: „2026-04-14T16:32:10Z”,
„createdBy”: „ERP”,
„attributes”: [
{
„code”: „SALES_CHANNEL”,
„value”: „B2B”,
„scope”: „HEADER”
}
],
„parties”: [
{
„partyType”: „CUSTOMER”,
„externalCode”: „CUST-001”,
„name”: „ABC Sp. z o.o.”,
„taxId”: „PL5250000000”,
„gln”: „5901234000005”,
„contactName”: „Jan Kowalski”,
„email”: „logistyka@abc.pl”,
„phone”: „+48 600 000 000”,
„address”: {
„street”: „ul. Logistyczna 15”,
„city”: „Warszawa”,
„postalCode”: „01-234”,
„region”: „Mazowieckie”,
„country”: „PL”,
„addressType”: „DELIVERY”
}
}
],
„references”: [
{
„referenceType”: „SO”,
„referenceNumber”: „SO-2026-000350”,
„referenceDate”: „2026-04-14”,
„sourceSystem”: „ERP”,
„relationType”: „PARENT”
}
],
„lines”: [
{
„lineNumber”: 1,
„itemId”: 5001,
„quantity”: 120.000000,
„uom”: „PCS”,
„batchNumber”: „BATCH-2026-04-A”,
„productionDate”: „2026-03-10”,
„expiryDate”: „2027-03-10”,
„countryOfOrigin”: „PL”,
„fulfillmentType”: „FULL”
},
{
„lineNumber”: 2,
„itemId”: 5002,
„quantity”: 25.000000,
„uom”: „PCS”,
„fulfillmentType”: „PARTIAL”
}
]
}
Transmisja danych - event envelope
Warstwa transportowa komunikatu
Event Envelope stanowi zewnętrzną warstwę komunikatu przesyłanego pomiędzy systemami (np. ERP → WMS, WMS → 3PL, WMS → ESB). Jego zadaniem nie jest przenoszenie danych biznesowych operacji, lecz zapewnienie kontroli transportowej, wersjonowania oraz bezpieczeństwa przetwarzania komunikatu.
W modelu integracyjnym rozróżniamy:
Payload biznesowy – dane operacji magazynowej (WarehouseOperation),
Event Envelope – metadane komunikatu odpowiedzialne za jego obsługę w warstwie integracyjnej.
Cel stosowania Event Envelope
Wprowadzenie warstwy eventowej pozwala:
zapewnić idempotentność przetwarzania komunikatów,
kontrolować wersjonowanie kontraktu,
śledzić komunikację między systemami,
wspierać architekturę event-driven,
separować dane operacyjne od mechanizmów transportowych.
Struktura danych
Tabela przesuwna w poziomie
| Pole | Typ danych | Wymagalność | Opis |
|---|---|---|---|
| eventId | UUID | ✔ | Unikalny identyfikator komunikatu. Służy do śledzenia komunikacji, audytu oraz eliminowania duplikatów na poziomie transportowym. |
| eventType | string | ✔ | Typ zdarzenia określający kontekst operacyjny, np. operation.created, operation.updated, operation.cancelled. Pozwala WMS interpretować charakter komunikatu. |
| eventTimestamp | datetime (UTC) | ✔ | Data i czas wygenerowania komunikatu w strefie UTC. Wykorzystywany do sekwencjonowania zdarzeń i analizy czasowej. |
| correlationId | string | ✖ | Identyfikator powiązania pomiędzy systemami (np. numer dokumentu ERP). Ułatwia śledzenie całego cyklu życia operacji. |
| tenantId | string | ✔ | Identyfikator klienta w architekturze multi-tenant. Pozwala separować dane pomiędzy różnymi podmiotami. |
| schemaVersion | string | ✔ | Wersja kontraktu integracyjnego (np. 2.1). Zapewnia kontrolę kompatybilności. |
| idempotencyKey | string | ✔ | Klucz idempotencji zapobiegający wielokrotnemu przetworzeniu tego samego komunikatu. WMS musi gwarantować przetwarzanie dokładnie raz. |
| payload | WarehouseOperation | ✔ | Właściwa treść operacji magazynowej. |
FAQ – Event Envelope w API WMS
1️⃣ Czym jest Event Envelope w integracji WMS?
Event Envelope to zewnętrzna warstwa komunikatu, która otacza dane biznesowe operacji magazynowej (payload). Zawiera metadane transportowe takie jak identyfikator zdarzenia, wersja schematu czy klucz idempotencji. Nie przenosi logiki operacyjnej, lecz zapewnia kontrolę komunikacji między systemami.
2️⃣ Czy Event Envelope jest obowiązkowy?
Nie zawsze.
W prostych integracjach synchronicznych REST (request/response) może zostać pominięty. Jest natomiast rekomendowany w integracjach asynchronicznych, event-driven oraz w architekturach opartych o message broker (np. Kafka, RabbitMQ).
3️⃣ Jaką rolę pełni idempotencyKey?
idempotencyKey zabezpiecza system przed wielokrotnym przetworzeniem tego samego komunikatu. Jest szczególnie istotny w przypadku retransmisji zdarzeń lub chwilowych problemów sieciowych.
4️⃣ Czy Event Envelope zastępuje dane operacyjne?
Nie.
Event Envelope zawiera wyłącznie metadane transportowe. Dane operacyjne, takie jak operacja magazynowa, linie dokumentu czy strony operacji, znajdują się w sekcji payload.
5️⃣ Dlaczego warto stosować wersjonowanie schematu (schemaVersion)?
schemaVersion umożliwia równoległe wspieranie kilku wersji kontraktu integracyjnego. Dzięki temu możliwe jest bezpieczne rozwijanie API bez przerywania działania istniejących integracji.
6️⃣ Jak Event Envelope wspiera architekturę multi-tenant?
Pole tenantId pozwala jednoznacznie określić, do którego klienta lub środowiska należy komunikat. Jest to kluczowe w systemach WMS obsługujących wielu klientów w jednej instancji (model multi-tenant).