{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"7bef5a39-da24-437e-bcf6-047a89951f31","name":"Wings\\Portal","description":"Portal kao web servis posreduje između krajnjeg korisnika (web aplikacije) i programa APP omogućavajući programski pristup podacima klijenta.\n\nPre korišćenja Portala neophodna je instalacija i podešavanje posebnog servisa za komunikaciju sa Portalom (WebAQL) kod klijenta. Svaki zahtev koji Portal primi se pomoću WebAQL-a prosleđuje programu na obradu i rezultat se vraća Portalu i dalje krajnjem korisniku u traženom formatu (JSON ili XML).\n\n`APP < - > WebAQL < - > Web Service < - > Portal API`\n\nIz postavke web servisa proizilazi nekoliko \"points of failure\" koji su u nadležnosti klijenta (rad programa i servera) i van nadležnosti Wings-a (dostupnost interneta), pri implementaciji se mora računati na mogućnost da API u bilo kom trenutku može biti nedostupan.\n\n---\n\n# Parametri za pristup Servisu\n\nWeb Servis je multi-tenant aplikacija, parametar `alias` identifikuje klijenta aplikacije.\n\n**Adresa aplikacije:**  \n`https://portal.wings.rs/:alias`\n\n**API base url glasi:**  \n`https://portal.wings.rs`\n\n**API V1 endpoint scheme:**  \n`https://portal.wings.rs/api/v1/:alias/:endpoint?arguments`\n\nZa testiranje može se koristiti demo Portal \"wings\" na adresi: [https://portal.wings.rs/wings](https://portal.wings.rs/wings)\n\nParametar`endpoint` je opšteg formata `module.resource.command`\n\nSvi upiti vraćaju rezultat u podrazumevanom [JSON:API](http://jsonapi.org) formatu ili u XML formatu uz parametar output=xml. Dodatno, dostupan je i SOAP API čiju dokumentaciju možete pročitati na adresi [https://ws.wings.rs/api](https://ws.wings.rs/api)\n\n---\n\n# Keširanje podataka na web servisu\n\nWeb servis kešira sledeće podatke korisnika za potrebe pretrage:\n\n- Artikli\n    \n- Napomene artikala\n    \n- Alternativne šifre artikala\n    \n- Vrste artikala\n    \n- Partneri (kupci i dobavljači)\n    \n- Finansijske kartice\n    \n\nOsvežavanje keša nije moguće izvršiti kroz API, ono se podešava kod klijenta i izvršava se minimum jednom dnevno (moguće je podesiti i interval ažuriranje). Na taj način izmene podataka u programu su sutradan vidljive na Portalu. Po potrebi klijent može ručno inicirati osvežavanje keša ukoliko je potrebno da izmene budu dostupne odmah.\n\nKomande koje vraćaju podatke iz keša umesto direktno iz programa su posebno naznačene u uputstvu.\n\nOdređene komande koriste posebno ažuriranje koje se podešava kod klijenta mimo automatskog ažuriranja Portalu. Da bi ti podaci bili dostupni na Portalu morate tražiti od klijenta da se podesi posebno ažuriranje, u pitanju su komande: `local.kupac.klasa`, `local.kupac.popust` i `local.kupac.kartica`.\n\n---\n\n# Autorizacija\n\nOdgovor pri uspešnoj prijavi na Portal sadrži sledeće podatke od značaja: **token**, **user-type** i **functions**.\n\nImplementacija prava pristupa na Portalu koristi sesije. Nakon autorizacije korisnika dobija se **token** koji morate proslediti u naknadnim pozivima kao PHPSESSID cookie.\n\nServis prepoznaje pet kategorija (**user-type**) korisnika:\n\n- type 1: APP korisnik\n    \n- type 2: Komercijalista\n    \n- type 3: Kupac (B2B)\n    \n- type 4: Eksterni kupac (B2C)\n    \n- type 5: Dobavljač\n    \n\nKoje će komande portala biti dostupne korisniku zavisi prevashodno od tipa korisnika a zatim od podešavanja prava pristupa u programu. Spisak dostupnih funkcija nalazi se u **functions** atributu odgovora nakon uspešnog logovanja na Portal.\n\nPodrška za komande API-a zavisi od verzije programa kod klijenta, radi pravilnog funkcionisanja neophodno je redovno ažurirati program.\n\n---\n\n# Prava pristupa\n\nZa sve kategorije korisnika pristupne podatke definiše klijent i postoji sistem prava pristupa kojim klijent definiše koje komande Portala će biti dostupne ulogovanom korisniku, što im daje punu kontrolu nad pristupom Portalu.\n\nPrava pristupa za komande Portala su podeljene po modulima:\n\n```\nLager                           \n   Artikli (Kol, Rez, Cena)     \n   Artikli (B-kol, Cena)        \n   Prikaz količina po magacinima\nDokument                        \n   Naručivanje (Kol, Rez, Cena) \n   Naručivanje (B-kol, Cena)    \nPartner                         \n   Kupci                        \n   Dobavljači                   \n   Finansijska kartica          \nIzveštaji                       \n   Izvodi                       \n   Lista narudžbenica           \n   Potraživanja                                \n\n ```\n\nSamo korisnicima programa je moguće podesiti opcije Portala individualno po korisniku dok se svim ostalim vrstama korisnika opcije podešavaju po tipu (npr. svi kupci imaju pristup istim komandama, bez izuzetka).\n\nNeke od opcija prava pristupa su fiksno vezane za tip korisnika, tako npr. postoji posebna komanda za izradu narudžbenice dostupna komercijalistima i posebna komanda dostupna kupcima.\n\nKorisničkim nalozima MP kupaca (retail, B2C) se upravlja isključivo preko Portal aplikacije preko admin korisničkog naloga.\n\n---\n\n# Preuzimanje lagera\n\nZa preuzimanje lagera dovoljno je koristiti komandu local.cache.artikal koja omogućava filtriranje, pretragu i paginaciju baze artikala. Nakon inicijalne autorizacije na API neophodno je samo obezbediti slanje kolačića sesije u narednim pozivima.\n\nDajemo primer jednostavne shell komande za preuzimanje 2.000 artikala sa napomenama u XML formatu:\n\n> curl -c cookies.txt --location '[https://portal.wings.rs/api/v1/wings/system.user.log?aUn=user&amp;aUp=demo'](https://portal.wings.rs/api/v1/wings/system.user.log?aUn=user&aUp=demo') && curl -b cookies.txt --location '[https://portal.wings.rs/api/v1/wings/local.cache.artikal?dLength=2000&amp;dNapRet=true&amp;output=xml'](https://portal.wings.rs/api/v1/wings/local.cache.artikal?dLength=2000&dNapRet=true&output=xml') -o wings.xml \n  \n\n---\n\n# API komande","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"2892103","team":1080911,"collectionId":"7bef5a39-da24-437e-bcf6-047a89951f31","publishedId":"TzzGFY97","public":true,"publicUrl":"https://documenter-api.postman.tech/view/2892103/TzzGFY97","privateUrl":"https://go.postman.co/documentation/2892103-7bef5a39-da24-437e-bcf6-047a89951f31","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"documentationLayout":"classic-single-column","customisation":null,"version":"8.12.12","publishDate":"2021-08-25T09:32:17.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/6df97310f68768152846051aeb3dfa2c63798517199bf934b4b3cf41346ed632","favicon":""},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://documenter.gw.postman.com/view/metadata/TzzGFY97"}