Struktura URI
URI jsou postaveny na "procházení zdrojů". Základním zdrojem je spojení, pod ním jsou dostupné další zdroje, např. Objednávky přijaté. Ty pak mají "pod sebou" např. své řádky, čerpací manažery atd.
Nové zdroje (Business objekty - BO) se vytvářejí zasláním JSON reprezentace příslušného objektu http metodou POST do kolekce BO příslušného typu. Jejich aktualizace se provede obdobně metodou PUT.
Při zakládání BO v IS FLORES záleží na pořadí vyplnění fieldů (některé položky je třeba vyplnit dříve než jiné, Aby toto bylo možné, je zavedeno, že položky BO jsou vyplňovány v pořadí, v jakém jsou zadány ve vstupním JSON objektu (i když obecně platí, že v JSON souborech by se neměl brát ohled na pořadí položek).
Při procházení zdrojů (kolekcí i jednotlivých objektů) je zohledňováno nastavení ochrany dat. Stejně tak jsou zohledňována práva k chráněným objektům.
/{spojení}/{kolekce Business objektů}
| Elementy URI | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho Aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPi dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxIssuedInvoice => issuedinvoices |
Dotaz na vrácení (GET) kolekce faktur vydaných (pozor, není aplikováno omezení, v závislosti na počtu faktur může brzdit server).
GET http://localhost/data/issuedinvoices HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 0
/{spojení}/{kolekce Business objektů}/{ID}
| Elementy URI pro získání konkrétního BO | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho Aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPi dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxIssuedInvoice => issuedinvoices |
|
|
ID Business objektu. |
Dotaz na vrácení (GET) jedné faktury vydané s ID=1400000101
GET http://localhost/data/issuedinvoices/1400000101 HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 0
/{spojení}/{kolekce Business objektů}/{ID}/{název subkolekce}
| Elementy URI pro získání subkolekce BO | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho Aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPi dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxIssuedInvoice => issuedinvoices |
|
|
ID Business objektu. |
| {název subkolekce} | Název subkolekce. |
Lze procházet i subkolekce objektů subkolekcí - "do nekonečna".
Získání kolekce řádků faktur vydaných (subkolekce řádků FV má název "rows"):
GET http://localhost/data/issuedinvoices/1400000101/rows HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 0
/{spojení}/{kolekce Business objektů}/views/all}
{spojení}/{kolekce Business objektů}/views/hidden}
| Elementy URI pro čísleníky podpoprující skrývání | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho Aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPi dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxIssuedInvoice => issuedinvoices |
|
|
Resource číselníku, který podporuje skrývání (podporuje INxHidden), na sobě má views:
Není-li uvedeno views, vratí takový číselník defaultně pouze neskryté záznamy. |
Dotaz na vrácení (GET) kolekce středisek, která jsou skrytá.
GET http://localhost/data/divisions/views/hidden HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 0
/{spojení}/{kolekce Business objektů}/{ID}/{název kolekce importovaného BO}
/{spojení}/{kolekce Business objektů}/{ID}/{název kolekce importovaného BO}/{ID importovaného BO}
/{spojení}/{kolekce Business objektů}/{název kolekce importovaného BO}
/{spojení}/{kolekce Business objektů}/{název kolekce importovaného BO}/{ID importovaného BO}
| Název | Popis |
|---|---|
| {spojení} | Název spojení nebo jeho Aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPi dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxIssuedInvoice => issuedinvoices |
|
|
ID Business objektu (do kterého je importováno). |
| {název kolekce importovaného BO} | Název kolekce importovaného BO. |
| {ID importovaného BO} | ID importovaného BO. |
První dva tvary slouží pro import do již existujícího BO, proto jsou dostupné pomocí HTTP metody PUT. Druhé dva tvary slouží k vytvoření nového BO importem, jsou dostupné pomocí HTTP metody POST.
Parametry importního manažera se specifikují v JSON dokumentu (v objektu, který je hodnotou vlastnosti params), který je předáván v těle dotazu. Importovaný BO je možné specifikovat buď v URI, nebo jako parametr "input_document" importního manažera v JSON dokumentu.
Povolené datové typy hodnot předávaných ve vlastnosti params jsou string, int, float a boolean.
| Objekt parametrů importního manažera | ||
|---|---|---|
| Vlastnost | Typ | Popis |
|
|
|
ID importovaného/importovaných BO. V případě jednoho importovaného BO String (ID), v případě více importovaných BO pole ID |
|
|
|
ID dokladu, do kterého je importováno. |
|
|
|
Další parametry jsou specifické pro každého importního manažera, a zadávají se jako názvy vlastností objektu params (měl by být dodržen i typ vlastnosti vzhledem k typu parametru). |
|
|
|
Vlastnosti vytvářeného business objektu, které je zapotřebí nastavit ještě před uložením. Viz příklad 5 uvedený níže. |
I když není vyplněn žádný parametr, je nutné v těle dotazu uvést alespoň prázdný objekt.
Reprezentace zdrojů (Business objektů) a jejich (de)serializace:
Business objekt = JSON objekt s vlastnostmi odpovídajícími Business objektu.
Kolekce BO jsou zahrnuty jako pole objektů. Jsou dodržovány typy vlastností – např. Integer bude JSON Integer atd.
K příkladům: V případě úspěšného vytvoření BO vrátí server v těle odpovědi kompletní nově vytvořený objekt, který není uváděn z důvodu úspory místa.
Dotaz:
POST http://localhost/data/issuedinvoices HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 404
{
"docqueue_id" : "5600000101",
"description": "Test vytvoření faktury",
"rows": [
{
"rowtype": 1,
"text" : "Test řádek č. 1",
"division_id" : "2100000101",
"vatrate_id" : "02100X0000",
"totalprice": 100
},
{
"rowtype": 1,
"text" : "Test řádek č. 2",
"division_id" : "2100000101",
"vatrate_id" : "01500X0000",
"totalprice": 101.5
}
]
}
Odpověď:
HTTP/1.1 201 Created
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Location: /data/issuedinvoices/1130000101
Content-Type: application/json
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Content-Length: 6679
V hlavičce Location je uveden URI nově vytvořeného objektu.
Dotaz:
POST http://localhost/data/issuedinvoices/import/billsofdelivery/1I30000101 HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 53
{
"params": {
"DocQueue_ID": "5600000101"
}
}
Odpověď:
HTTP/1.1 201 Created
Content-Type: application/json
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Content-Length: 5030
Dotaz:
PUT http://localhost/data/issuedinvoices/4230000101/rows/1030000101 HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 27
{
"unitprice" : 3000.0
}
Odpověď:
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Content-Length: 1747
Web API umožňuje provést aktualizaci hodnot na hlavičce a v řádcích v rámci jednoho dotazu. Příklad - mám fakturu vydanou s ID 8M00000101 která obsahuje řádek s ID VM00000101. Níže uvedeným dotazem změním popis na hlavičce a množství na řádku. Dotaz se úspěšně provede díky tomu, že Web API při jeho zpracování pole id přeskakuje (nepokusí se do něj zapisovat, což by skončilo chybou).
PUT http://localhost/data/issuedinvoices/8M00000101 HTTP/1.1
Host: localhost
Content-Type: application/json
Authorization: Basic QVBJOmFwaQ==
Cache-Control: no-cache
Postman-Token: d5910570-9efd-43a6-9b5c-4ee2121d21a1
{
"description": "telefony",
"rows": [
{
"id": "VM00000101",
"quantity": 4
}
]
}
Dotaz:
PUT http://localhost/data/firms/3200000101 HTTP/1.1
User-Agent: Fiddler
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 53
{
"residenceaddress_id": { "City" : "Praha X" }
}
Odpověď:
HTTP/1.1 200 OK
Link: <http://localhost/data/api-docs/swagger.json#>; rel="describedBy"
Connection: Keep-Alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Content-Type: application/json
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Content-Length: 16211
Chceme vytvořit fakturu vydanou z objednávky přijaté. V prostředí aplikaceIS FLORES bychom funkcí Vytvořit vyvolali odpovídajícího průvodce, vyplnili parametry importu a následně by se otevřela agenda Faktury vydané s připraveným dokladem, ve kterém bychom vyplnili několik zbývajících položek a fakturu uložili.
Když provádíme stejnou operaci prostřednictvím Web API, vlastnost output_document_update je ekvivalentem fáze "ve kterém bychom vyplnili několik zbývajících položek". (V rámci provádění požadavku se vytvoří objekt, na kterém můžeme ještě před uložením změnit některé vlastnosti.)
V našem konkrétním příkladě by se nám bez použití output_document_update nepodařilo fakturu vydanou uložit - pokud to zkusíme
POST http://localhost/demo15/issuedinvoices/import/receivedorders HTTP/1.1
Host: localhost
Content-Type: application/json
Authorization: Basic QVBJOmFwaQ==
Cache-Control: no-cache
Postman-Token: ec6e4774-7468-46cf-ac0d-26d859ce962e
{
"input_document_clsid": "ReceivedOrder",
"output_document_clsid": "IssuedInvoice",
"input_documents": "2500000101",
"params": {
"ImportDocuments": true,
"UndeliveredQuantity": true,
"DeliveryDate": "2018-06-27T15:57:00.000Z",
"DocQueue_ID": "5600000101"
}
}
obdržíme chybu
500 Internal Server Error
{
"title": "Chyba při importu dokladu",
"error_code": 1520,
"description": "Chyba při validaci objektu \"Faktura vydaná: Bez čísla\":\r\nChyba v zadání položky Řada skladových dokladů"
}Dotaz proto rozšíříme o vlastnost output_document_update, prostřednictvím které nastavíme požadovanou Řadu skladových dokladů na P600000101 Dodací listy. Takto upravený dotaz již proběhne v pořádku a požadovaný objekt (faktura vydaná) se vytvoří.
POST http://localhost/demo15/issuedinvoices/import/receivedorders HTTP/1.1
Host: localhost
Content-Type: application/json
Authorization: Basic QVBJOmFwaQ==
Cache-Control: no-cache
Postman-Token: ec6e4774-7468-46cf-ac0d-26d859ce962e
{
"input_document_clsid": "ReceivedOrder",
"output_document_clsid": "IssuedInvoice",
"input_documents": "2500000101",
"params": {
"ImportDocuments": true,
"UndeliveredQuantity": true,
"DeliveryDate": "2018-06-27T15:57:00.000Z",
"DocQueue_ID": "5600000101"
},
"output_document_update": {
"StoreDocQueue_ID": "P600000101"
}
}Odpověď:
HTTP/1.1 201 Created
...V IS FLORES existuje několik importních manažerů, které provádějí import z/do řádkového BO. Tyto manažery není možné volat standardní cestou uvedenou v předchozí sekci, neboť řádkové BO nejsou do Web API mapovány (k dispozici jsou pouze hlavičkové BO). V podobných situacích je možné využít alternativní způsob:
/{spojení}/import
Veškeré parametry včetně specifikace třídy vstupního i výstupního objektu se zašlou v těle požadavku. Předvedeme si na příkladu.
Následující příklad vytvoří daňový zálohový list přijatý z řádku bankovního výpisu.
POST http://localhost/data/import HTTP/1.1
Host: localhost
Content-Type: application/json
Authorization: Basic QVBJOmFwaQ==
Cache-Control: no-cache
Postman-Token: 81fc77e4-fb51-41e1-9f70-04f05b788e3f
{
"input_document_clsid": "OBSCO4S1BRD13FY1010DELDFKK",
"output_document_clsid": "ZJYWUH5I34J4VAAIHOB0ZA1FIO",
"input_documents": "1700000101",
"params": {
"DocQueue_ID": "B700000101"
}
}
1700000101 = ID řádku bankovního výpisu
B700000101 = ID řady daňových zálohových listů přijatých (DZP)
OBSCO4S1BRD13FY1010DELDFKK = packed GUID objektu řádek bankovního výpisu (BankStatementRow)
ZJYWUH5I34J4VAAIHOB0ZA1FIO = packed GUID objektu daňový zálohový list přijatý (VATReceivedDepositInvoice)
Potřebné kódy (packet GUID) jednotlivých business objektů je možné nalézt v dokumentaci F1Doc.chm pod označením PackedCLSID.
Resource /{spojení}/import podporuje pouze metodu POST.
/{spojení}/{kolekce Business objektů UDF číselníku}
/{spojení}/{kolekce Business objektů UDF číselníku}/{ID}
| Elementy URI pro získání konkrétního BO z definovatelného číselníku | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho Aliasu |
| {kolekce Business objektů UDF číselníku} |
Název kolekce Business objektu, pod kterým je definovatelný číselník dostupný. Jedná se o obsah položky Název kolekce ve WebAPI v DefRollEditoru. |
| {ID} | ID konkrétního Business objektu z definovatelného číselníku. |
Nechť jsme si nadefinovali definovatelný číselník.
GET http://localhost/data/transportationcars HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 0
/{spojení}/{qrexpr}
| Elementy URI pro získání hodnoty z QR funkce | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho Aliasu |
|
|
Název zdroje v případě, že chceme volat QR výrazy. |
Výraz je uveden v JSON řetězci, který je hodnotou vlastnosti "expr" vstupního JSON objektu. Zdroj se dotazuje HTTP metodou POST.
V případě, že vyhodnocování výrazu skončí chybou, je vrácen HTTP status 400 se standardním objektem chyby (pokud voláme QR funkci, je na funkci, zda vrátí/nevrátí chybu). Volání funkcí lze řetězit.
Platnou vstupní hodnotou je jakýkoli QR výraz (např. tedy "1 + 1") - lze použít jako test.
Dotaz na hodnotu ID uživatele:
POST http://localhost/data/qrexpr HTTP/1.1
Host: localhost
Authorization: Basic VGVzdDoxMjM=
Content-Length: 0
Vlastní výraz zapsaný v JSON formátu:
{
"expr": "NxGetUserID"
}
Příklad výsledku: Status 200 OK
{
"result": "SUPER00000"
}
Dotaz na název skladové karty se zadaným ID:
URL shodně jako v Příkladu 1.
Vlastní výraz zapsaný v JSON formátu:
{
"expr": "NxGetValueFromRoll('StoreCards','Name','2100000101')"
}
Příklad výsledku: Status 200 OK
{
"result": "Panasonic 65\" Class 4K Ultra HD TV"
}
Dotaz, zda určitý datum spadá na svátek:
URL shodně jako v Příkladu 1.
Vlastní výraz zapsaný v JSON formátu:
{
"expr": "NxDayIsHoliday(NxStrToDate('1.1.2016'))"
}
Příklad výsledku: Status 200 OK
{
"result": true
}
Použití NxSQL Select:
URL shodně jako v Příkladu 1.
Vlastní výraz zapsaný v JSON formátu:
{
"expr": "NxSQLSelect('SELECT ID FROM FIRMS', '', ',', '\"')"
}
Příklad výsledku: Status 200 OK
{
"result": "\"3200000101\",\"1100000101\",\"2000000101\",…"
}
ID objektů použitá v příkladech jsou pouze ilustrační, upravte si je v závislosti na svých datech.
GET /{spojení}/{kolekce Business objektů}/{ID}?select=PMState_ID.Code
| Elementy URI pro získání procesního stavu skladového dokladu | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPI dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxReceiptCard => receiptcards |
|
|
ID Business objektu (jehož stav zjišťujeme). |
Dotaz na vrácení (GET) procesního stavu příjemky s ID DB10000101
GET http://localhost/data/receiptcards/DB10000101?select=ID,PMState_ID.Code
Příklad výsledku: Status 200 OK
{
"ID": "DB10000101"
"PMState_ID.Code": "Vyřízeno"
}
PUT /{spojení}/{kolekce Business objektů}/{ID}/pmchangestate?select=PMStateID_Code
| Elementy URI pro změnu procesního stavu skladového dokladu - metoda 1 | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPI dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxReceiptCard => receiptcards |
|
|
ID Business objektu (jehož stav chceme změnit). |
|
|
klíč pro změnu procesního stavu přímo zadáním ID výsledného stavu |
Změna (PUT) procesního stavu příjemky s ID DB10000101 na stav s ID 2000000001 (K vydání)
PUT http://localhost/data/receiptcards/DB10000101/pmchangestate?select=ID,PMState_ID.Code
Tělo požadavku v JSON formátu (ID nového stavu):
{
"pmstate_id": "2000000001"
}
Příklad výsledku: Status 200 OK
{
"ID": "DB10000101",
"PMState_ID.Code": "K vydání"
}
PUT /{spojení}/{kolekce Business objektů}/{ID}/pmchangestatebytransition?select=PMStateID_Code
| Elementy URI pro změnu procesního stavu skladového dokladu - metoda 2 | |
|---|---|
| Název | Popis |
| {spojení} | Název spojení nebo jeho aliasu |
| {kolekce Business objektů} |
Název Business objektu. Názvy Business objektů můžete dohledat přes OpenAPI dokumentaci nebo případně v popisu Struktur a definic F1Doc.chm (název získaný z F1Doc.chm je nutno uvádět bez TNx na začátku a v množném čísle). TNxReceiptCard => receiptcards |
|
|
ID Business objektu (jehož stav chceme změnit). |
|
|
klíč pro změnu procesního stavu s využitím přechodu mezi procesními stavy |
Změna (PUT) procesního stavu příjemky s ID DB10000101 s využitím přechodu mezi procesními stavy s ID C400000101 (Příjemka: K vydání -> vyřízeno)
PUT http://localhost/data/receiptcards/DB10000101/pmchangestatebytransition?select=ID,PMState_ID.Code
Tělo požadavku v JSON formátu (ID přechodu mezi stavy):
{
"pmstatetransition_id": "C400000101"
}
Příklad výsledku: Status 200 OK
{
"ID": "DB10000101",
"PMState_ID.Code": "Vyřízeno"
}