Rest API
Weaver WMS API
Weaver WMS działa w oparciu o API w architekturze REST, które wykorzystuje protokół HTTP i jego metody, takie jak:
- GET – służy do pobierania danych (np. wyświetlania listy materiałów),
- POST – tworzy nowe dane (np. dodaje nowego odbiorcę),
- PUT – aktualizuje wcześniej dodane zasoby (np. wprowadza zmiany do materiału),
- DELETE – służy do usuwania danych.
Dane wchodzące i wychodzące z API są w formacie JSON. Każdy obiekt zawarty jest pomiędzy nawiasami klamrowymi {}
, a jego poszczególne elementy oddzielane są przecinkami ,
. Wartości elementów są wpisywane po ich nazwach oraz dwukropku :
.
Podczas wysyłania zapytań do lokalnego API, program Weaver WMS musi być uruchomiony.
Swagger
Weaver WMS oferuje możliwość sprawdzenia działania poszczególnych adresów URI (endpoints) za pomocą narzędzia Swagger, które jest wbudowane w program.
-
Lokalizacja adresu API
Swój adres API możesz znaleźć na stronie Weaver WMS Account lub po wybraniu podmiotu klikając ikonę ołówka.
Przykładowy adres:
https://apidemo.weaver365.com/swagger/index.html -
Autoryzacja
Aby uzyskać pełny dostęp:- Przejdź do zakładki Authentication.
- Kliknij przycisk Try it out.
- W polach, gdzie widnieje
string
, wpisz login oraz hasło użytkownika WMS w cudzysłowie.
-
Wykonanie zapytania
- Po wypełnieniu pól kliknij przycisk Execute.
- Kod
200
w odpowiedzi oznacza, że zapytanie wykonano poprawnie.
Postman
Alternatywnym narzędziem do testowania zapytań jest Postman.
Importowanie kolekcji zapytań
-
Przejdź do Swagger.
-
Otwórz stronę w formacie JSON.
-
Skopiuj cały tekst (Ctrl + A, Ctrl + C).
-
W Postman kliknij przycisk Import w lewym górnym rogu.
-
Przejdź do zakładki Raw text i wklej tekst (Ctrl + V).
Po zaimportowaniu w zakładce Collections pojawi się kolekcja „WMS API”.
Konfiguracja środowiska
-
Kliknij ikonę Manage Environments w prawym górnym rogu.
-
Kliknij Add, wypełnij pola zgodnie z poniższym przykładem, i ponownie kliknij Add.
-
W prawym górnym rogu wybierz skonfigurowane środowisko z listy.
Autoryzacja w Postman
Przed wykonaniem kolejnych zapytań należy autoryzować użytkownika:
- W kolekcji „WMS API” wybierz endpoint
/auth/sign-in
. - Przejdź do sekcji Body.
- Zastąp domyślne wartości loginem i hasłem użytkownika WMS.
Ważne!
Podczas wykonywania zapytań usuń elementy, których wartości nie uzupełniasz. Niewypełnione elementy mogą generować błędy.
Dodawanie materiału
{"Selected":false,
"Type":3,
"Reference":" HD2285",
"Name":"Bezprzewodowy skaner 22Bluetooth HD85",
"DefaultQuantityInContainer":0.0,
"Removed":false,
"Inactive":false,
"SingleUnitPrice":0.0,
"Unit":
{
"Description":"szt.",
"DescriptionEng":"pcs",
"DescriptionDe":"psc",
"DescriptionRu":"psc",
"Details":"sztuka",
"IsLenght":false,
"Precision":4,
"IsDefault":false,
"Id":1
},
"TaxRate":{
"Value":0.23000,
"Name":"23%",
"IsDefault":false,
"TaxRateLegalType":0,
"Id":1
},
"SuggestedPlace":{
"Selected":false,
"Reference":"MAG_S1_0_0",
"Level":0,
"Number":0,
"QuantityOfMaterial":0.0,
"Id":1
},
"PercantageProfit":0.0,
"InitialQuantity":0.0,
"HasChildren":false,
"IsOnMachines":false,
"IsDangerous":false,
"CountSeparately":false,
"AdvisingQuantity":0.0,
"Length":0.0,"Width":0.0,
"Height":0.0,
"PackageRequireReference":false,
"PackageDoNotAddToShippingDocument":false,
"PackageIsTemporary":false,
"PackageType":0,
"RequiredQuantity":0.0,
"OnCustomOrder":false,
"LengthIsWidth":false,
"AbcClass":0,
"XyzClass":0,
"MaterialTradeInfo":{
"IsEcommerceShopPosition":true,
"IsEcommerceAuctionPosition":false,
"Id":0},"LengthStrategy":0,
"WidthStrategy":0,
"HeightStrategy":0,
"SplitPayment":false,
"RequireLotNumber":false,
"RequireLotExpiration":false,
"Id":0
}
Podgląd materiału dodanego przez program Postman
Dodanie odbiorcy
{
"reference": "HDWR",
"nameLine1": "HDWR",
"nameLine2": "Hardware for business",
"removed": false,
"address": {
"street": "Os. Piastowskie 53",
"postalCode": "63-000",
"city": "Środa Wlkp",
"id": 0
},
"companyDetail": {
"nip": "786-165-45-57",
"nipCleaned": "7861654557",
"ueVatPayer": false,
"id": 481
},
"mail": "[email protected]",
"shippingAddressesCount": 0,
"multiplyQuantityWhileImportEdi": false,
"notificationSetting": {
"newOrderEmailSend": false,
"newOrderEmailJoinAttachement": false,
"id": 3737
},
"currency": {
"symbol": "PLN",
"name": "PLN",
"id": 1
},
"paymentWay": 0,
"paymentDays": 0,
"salesBlockade": false,
"creditLimit": false,
"creditLimitAmout": 0.00000,
"nip": "786-165-45-57",
"name": "Waever Software Andrzej Lenkowski",
"id": 473
}
Przekazanie awizacji przyjęcia
W celu przekazania awizacji przyjęcia trzeba najpierw pobrać metodą GET dane z odpowiednich adresów.
Pierwszą z nich jest dostawca, pobierany z adresu „suppliers”.
/suppliers?IncludeAllId=false&IdList=1
Kolejną potrzebną informacją jest numeracja, pobierana z adresu „document-numbers”.
Dodatkowo możemy zastosować parametr „IncludeAllTypes” oraz „Types”.
Parametr "Types" dla przyjęć może przyjmować wartości:
- 0 - Zamówienie do dostawcy,
- 1 - Przyjęcie zewnętrzne,
- 2 - Przychód wewnętrzny.
/document-numbers?IncludeAllTypes=false&Types=1
Kolejnymi danymi są materiały oraz stawki VAT, pobierane z adresów odpowiednio „materials” oraz „tax-rates”.
W przypadku stawek VAT nie jesteśmy w stanie filtrować widoku, dlatego pobrać trzeba wszystkie stawki znajdujące się w systemie.
/materials?IncludeAllId=false&IdList=101
/tax-rates
Po pobraniu wszystkich danych możemy przejść do przesłania metodą POST awizacji przyjęcia poprzez adres „delivery-documents”.
W poniższym przykładzie dla większej przejrzystości zostały wpisane dane, które nie muszą być uzupełniane.
Dla sekcji, takich jak: supplier, material, unit, taxrate, document-number, currency wystarczy jedynie podanie id.
Dodanie Przyjęcia zewnętrznego
/delivery-documents
{"Selected":false,
"Number":"PZ/2021/4",
"IssueDate":"2021-03-08T11:23:14.08771+01:00",
"PlannedDate":"2021-03-08T11:23:14.08771+01:00",
"DocumentStatus":0,
"DocumentType":0,
"Supplier":{
"Reference":"Andrzej Lenkowski Weaver Software",
"NameLine1":"Andrzej Lenkowski Weaver Software",
"CompanyDetail":{
"Nip":"7861654557"
},
"Id":1
},
"Positions":[{
"PlannedQuantity":2.0,
"Material":{
"Reference":"MAT1",
"Name":"Testowy",
"Id":101
},
"NetUnitPrice":0.0,
"Unit":{
"Description":"szt.",
"Id":1
},
"TaxRate":{
"Value":0.23000,
"Id":11
},
"Status":0,
"Orgin":0,
"NetUnitPriceInCurrency":55.0,
"Page":0,
"PositionOrder":0,
"No":0,
"Id":-1
}],
"Owner":{
"Reference":"Andrzej Lenkowski Weaver Software",
"IsOwner":true,
"Id":1
},
"DocumentNumber":{
"DocumentType":1,
"DocumentName":"PZ",
"Number":3,
"Next":"PZ/2021/4",
"Id":3
},
"Currency":{
"Symbol":"PLN",
"Name":"PLN",
"Id":1
},
"Id":0}
Pobranie zrealizowanych dokumentów przyjęcia
W celu pobrania dokładnych danych dotyczących zrealizowanych dokumentów PZ należy najpierw pobrać dane z adresu „delivery-documents”.
/delivery-documents
Dzięki tej operacji uzyskamy listę dokumentów przyjęć wraz z ich statusami.
O statusie mówi nam parametr "documentStatus" i wyróżniamy w nim wartości:
- 0 - Oczekujący na realizację,
- 15 - Anulowany,
- 20 - W trakcie realizacji,
- 30 - Zrealizowany.
W tej chwili znamy już ID zrealizowanych dokumentów przyjęć, dlatego możemy przejść do adresu „delivery-documents/position-items” i filtrować go parametrami „IncludeAllDocuments” oraz „Documents”, w których wpisujemy odpowiednio „false” oraz ID dokumentu.
/delivery-documents/position-items?IncludeAllDocuments=false&Documents=105
Przekazanie awizacji wydania
W celu przekazania awizacji wydania schemat różni się jedynie tym, że zamiast dostawcy, pobrać należy odbiorcę z adresu „recipients”.
Podczas pobierania numeracji dla dokumentów wydania użyjemy dla parametru „Types” inne wartości.
Parametr "Types" dla wydań przyjmuje wartości:
- 3 - Zamówienia od odbiorców,
- 4 - Wydania zewnętrzne,
- 5 - Rozchody wewnętrzne.
Dodanie dokumentu Wydania Zewnętrznego
/shipping-documents
{
"Number":"WZ/2021/2",
"IssueDate":"2021-03-08T13:18:05.2976294+01:00",
"PlannedDate":"2021-03-08T13:18:05.2976294+01:00",
"Status":0,
"Recipient":{
"Reference":"Andrzej Lenkowski Weaver Software",
"NameLine1":"Andrzej Lenkowski Weaver Software",
"CompanyDetail":{
"Nip":"7861654557"
},
"Id":1
},
"Positions":[{
"PlannedQuantity":10.0,
"Material":{
"Reference":"MAT1",
"Name":"Testowy",
"Id":101
},
"NetUnitPriceBeforeDiscount":150.0,
"Unit":{
"Description":"szt.",
"Id":1
},
"TaxRate":{
"Value":0.23000,
"Id":11
},
"Status":0,
"PositionOrder":0,
"Id":-1
}],
"Currency":{
"Symbol":"PLN",
"Id":1
},
"ShippingAddress":{
"Name":"Weaver Software ",
"Street":"os. Piastowskie 53",
"PostalCode":"63-000",
"City":"Środa Wielkopolska",
"ContactPerson":"Bartosz Walerowicz",
"PhoneNumber":"690042333",
"Email":"[email protected]",
"Country":{
"Name":"Polska",
"Id":1
},
"Id":1
},
"DocumentNumber":{
"DocumentType":4,
"DocumentName":"WZ",
"Number":1,
"ActualPattern":"[Nazwa]/[Rok]/[Numer]",
"Next":"WZ/2021/2",
"Id":12
}
}
Pobieranie dokumentów WZ
Na poniższym przykładzie pobieramy dokumenty WZ z zaznaczonym filtrem (utworzone po dacie 01.09.2020r.) oraz podzielone na 2 elementy na stronę.
Pobieranie jednostek logistycznych dla właściciela
Żeby pobrać wszystkich dostawców, którzy mogą być właścicielami, trzeba użyć adresu „suppliers” z parametrem „IsOwner”.
/suppliers?IsOwner=true
W celu pobrania jednostek logistycznych przypisanych do konkretnego właściciela należy użyć adresu „logistic-units” z parametrami „IncludeAllOwners” oraz „Owners”, w których wpisujemy odpowiednio „false” i ID właściciela.
/logistic-units?IncludeAllOwners=false&Owners=
s=1`
Klient Api
Poniższe biblioteki umożliwiają połączenie z API systemu magazynowego Weaver WMS.
Instalacja bibliotek:
- Należy pobrać zbiór paczek Nuget z strony Weaver WMS , np. najnowszą na ten moment wersję apiClientNuGet_5.15.0.0.zip
- Rozpakować i dodać folder do źródeł menedżera pakietów Nuget
- Zainstalować pakiet Weaver.Wms.Api.Client
https://github.com/HDWR-Global/WmsApiClient
Przykład pobierania materiałów zawarty w pliku Program.cs:
Kod w języku C#
using Weaver.Wms.Api.Client.Interfaces;
namespace WmsApiClient
{
internal static class Program
{
static async Task Main(string[] args)
{
var client = new Weaver.Wms.Api.Client.WmsApiClient("http://localhost:43400", true);
await client.Login("admin", "admin");
Console.WriteLine("Materiały:");
int page = 0;
int pages = 1;
while (page < pages)
{
page++;
var materials = await client.CreateRequest<IMaterialClient>().List(new Weaver.Wms.ServiceInterfaces.MaterialService.MaterialFilterDto { Page = page });
pages = materials.Pages;
foreach (var material in materials.Items)
{
Console.WriteLine($"{material.Reference} - {material.Name}");
}
}
await client.Logout();
}
}
}