Šajā rakstā:
- Pieslēgšanās
- Datu lasīšana - API read
- Resursi, kas nav tabulas - API method
- Ierakstu veidošana - API create
- Ieraksta datu atjaunošana - API update
- PDF izdrukas iegūšana
- Atskaites lasīšana
- Pielikumu iegūšana
- API pieprasījumu skaita ierobežojums
1. Pieslēgšanās
Lai pieslēgtos savai MONEO kompānijai, jāaizvieto pieslēgšanās dati ar Jūsējiem:
- {{appi_key}} vietā ir Jūsu API lietotāja Autorizācijas atslēga (kuru saņemsiet pieslēdzot API lietotāju)
- {{comp_id}} vietā ir Jūsu Kompānijas ID
- [ServerUrl]:[Port] vietā ir Jūsu API adrese
Jūsu Kompānijas ID un API adresi var redzēt: MONEO > Palīdzība > Servera informācija
DEMO API lietotāja rekvizīti:
Pieslēgumam ar demo.api lietotāju, MONEO Demo kompānijai
- {{appi_key}} vietā ir GEmAGPsdz6Rgad9SE2qesg
- {{comp_id}} vietā ir 53f98a26-041ecdf6-4cf71dcd-0474b2b3-b7c42fd6
- [ServerUrl]:[Port] vietā ir https://ossa.moneo.lv:15000
Pieslēgšanās un kompānijas datu iegūšana:
Lai izpildītu API pieprasījumus, katrā būs jānorāda {{api_key}} un {{comp_id}} (pēdiņās, piemēram, "53f98a26-041ecdf6-4cf71dcd-0474b2b3-b7c42fd6")
Veicot POST pieprasījumu, {{api_key}} jānorāda HEADER sadaļā ar parametru Authorization, savukārt {{comp_id}} jānorāda JSON struktūras pieprasījuma daļā request/compuid.
Piemēram, šāds POST pieprasījums nolasīs un atgriezīs visus kompānijas artikulus
POST https://ossa.moneo.lv:15000/api/v2/items.items
HEADER Authorization: {{api_key}}
{
"request":{
"compuid": {{comp_id}}
}
}
Savukārt šāds POST pieprasījums nolasīs un atgriezīs visus rēķinus, kuri izrakstīti klientam 10024, atgrieztais saraksts saturēs trīs laukus: rēķina numurs, datums un kopsumma.
POST https://ossa.moneo.lv:15000/api/v2/sales.invoices
HEADER Authorization: {{api_key}}
{
"filter": {"custcode":"10024"},
"fieldlist": ["sernr", "invdate", "totsum"],
"request":{
"compuid": {{comp_id}}
}
}
atbildes piemērs:
{
"result": {
"records": [
{
"sernr": 291,
"invdate": "2021-04-26",
"totsum": "24.78"
},
{
"sernr": 293,
"invdate": "2021-04-28",
"totsum": "9.74"
},
{
"sernr": 949,
"invdate": "2022-02-09",
"totsum": "11.25"
}]
}
}
Tas pats POST piemērs ar curl:
curl -d '{"filter":{"custcode":"10024"},"fieldlist":["custcode", "custname", "sernr"],"request":{"compuid":{{comp_id}}}}' -H "Authorization: {{api_key}}" https://ossa.moneo.lv:15000/api/v2/sales.invoices
2. Datu lasīšana - API read
POST pieprasījuma adrese ir https://[ServerUrl]:[Port]/api/v2/[TableName], kur:
- [ServerUrl]:[Port] vietā ir Jūsu API adrese
- [TableName] vietā ir nolasāmā tabula, piemēram, items.items vai sales.invoices
Piemēram, zemāk redzamais pieprasījums nolasīs un atgriezīs visus kompānijas rēķinus, kuri izveidoti klientam 1003.
POST ar JSON struktūru: https://ossa.moneo.lv:15000/api/v2/sales.invoices
{ "filter":{"custcode":"1003"}, "fieldlist":["custcode","sernr", "custname"], "request":{ "compuid":"53F98A26-041ECDF6-4CF71DCD-0474B2B3-B7C42FD6", } }
Piemērs ar curl:
curl -d '{"filter":{"custcode":"1003"}, "fieldlist":["custcode","sernr","custname"], "request":{"compuid":"53F98A26-041ECDF6-4CF71DCD-0474B2B3-B7C42FD6"}}' -H "Authorization: {{api_key}}" https://ossa.moneo.lv:15000/api/v2/sales.invoices
- request tiek formēts vienādi - tas saturēs compuid
- fieldlist ļauj atlasīt tikai tos laukus, kurus vēlamies iegūt. Ja ir liels datu pieprasījums, vēlams samazināt lauku sarkastu izmatojot šo parametru. Ja parametru neizmanto, tiks nosūtīts pilns lauku saraksts, bet jāņem vērā, ka par katru apakštabulu (subtable) galvas rindu saraksts tiek daudzkāršots, tādēļ pieprasot piemēram rēķina rindas ar galvu vēlams norādīt, kuru subtable tieši nepieciešams, jo rēķinos ir vairāki subtable (artikuli, kredītrēķini, priekšapmaksas, aģenti)
- filter ļauj filtrēt datus. Pamatpierakstā lauka un lauka vērtības key-value pāris.
Pieprasot datus, iespējams izmantot MONEO datu filtrēšanas izteiksmes. Par izteiksmēm vairāk lasīt šeit.
Filtrācija ar chainfield: tas nozīmē sekojošas izteiksmes esam paredzējuši __gte, __gt, __lte, __lt, __eq, __ne, __gteon, __lteon, __set, kur gte -> greater than or equal, lt -> less than, eq -> equal, lteon -> less than or equal or none. Šī filtrācija var noderēt piemēram, ja nepieciešams atlasīt datus, kur vērtība ir tukša, jo vienkārši tukšs filtrs nozīmēs atlasīt visu, bet lai norā'ditu, ka nepieciešamas tikai tukšas vērtības, jānorāda field__eq: "".
- Piemēram, nepieciešams nolasīt artikulu kodus un nosaukumus, ja ārējais kods (externalid) ir tukšs
{
"filter":{},
"fieldlist":["code","name","externalid"],
“filter”: {"externalid__eq": ""},
"request":{
"compuid":{{comp_id}}
},
}
- Piemēram, nepieciešams nolasīt artikulu kodus un nosaukumus, ja ārējais kods (externalid) ir tukšs
atbildes piemērs uz POST https://ossa.moneo.lv:15000/api/v2/sales.invoices:
{
"result": {
"records": [
{
"custcode": "1003",
"sernr": 200001,
"custname": "Testa firma"
},
{
"custcode": "1003",
"sernr": 200002,
"custname": "Testa firma"
},
{
"custcode": "1003",
"sernr": 200003,
"custname": "Testa firma"
},
{
"custcode": "1003",
"sernr": 200004,
"custname": "Testa firma"
}
]
}
}
- result saturēs records elementu, kur katrs elements ir viens ieraksts, ja ieraksts satur sevī vēl apakštabulu ar rindām, tad būs elements sub_table, kurš saturēs apakštabulas nosaukumu un tajā esošos laukus (piemērs zemāk).
Piemērs, JSON pieprasījums, nolasīt rēķinu numur 352, un atgriezt informāciju par tā datumu un artikulu rindām: artikula kodu un daudzumu.
{
"filter":{"sernr": 352},
"fieldlist":["sernr","invdate","items.itemcode","items.quant"],
"request":{
"compuid":{{comp_id}}
},
}
atbilde:
{
"result": {
"records": [
{
"sernr": 352,
"invdate": "2021-06-01",
"sub_table": {
"items": [
{
"itemcode": "8431034004726",
"quant": "1",
"_sernr": 352,
"_rownr": 0
},
{
"itemcode": "8431034000469",
"quant": "1",
"_sernr": 352,
"_rownr": 1
}]}}]}}
- result saturā redzams, ka parādas papildus lauki _sernr un _rownr, tie informē par rindas piederību, pie ieraksta id (primārais atslēgas lauks rēķinam ir sernr) un apakštabulas rindas indeks numurs - _rownr - sākas ar 0.
Gadījumā, ja Jums nepieciešams nolasīt tikai rindas datus, tad var formēt pieprasījumu uz rindas tabulu, t.i. iepriekš aprakstītajā gadījumā, ja jāiegūst rēķina 352 rindas informācija artikula kods un daudzums, tad tabulas sales.invoices vietā jānorāda tabula sales.invoices_items_rows
POST ar JSON struktūru: https://ossa.moneo.lv:15000/api/v2/sales.invoices_items_rows
{
"filter":{"_sernr":"352"},
"fieldlist":["itemcode","quant"],
"request":{
"compuid":{{comp_id}}
}
}
atbilde:
{
"result": {
"records": [
{
"itemcode": "8431034004726",
"quant": "1",
"_sernr": 352,
"_rownr": 0
},
{
"itemcode": "8431034000469",
"quant": "1",
"_sernr": 352,
"_rownr": 1
}]
}
}
Ja integrācijas nodrošināšanai svarīgi noskaidrot lauku datu tipus un datu struktūru, tad veidojot pieprasījumu var norādīt parametru include_field_list, rezultātā, kopā ar atbildi par datiem, tiks atgriezts papildus elementi: field_list, field_types, sub_field_list, sub_field_types.
JSON pieprasījums ar include_field_list:
{
"filter":{"sernr":"352"},
"fieldlist":["sernr","invdate","items.itemcode","items.quant"],
"request":{
"compuid":{{comp_id}}
},
"include_field_list": true
}
atbilde:
{
"result": {
"records": [
{
"sernr": 352,
"invdate": "2021-06-01",
"sub_table": {
"items": [
{
"itemcode": "8431034004726",
"quant": "1",
"_sernr": 352,
"_rownr": 0
},
{
"itemcode": "8431034000469",
"quant": "1",
"_sernr": 352,
"_rownr": 1
}]
}
}],
"field_list": [
"sernr",
"invdate"
],
"field_types": {
"sernr": {"__callable": "builtins::int"},
"invdate": {"__callable": "datetime::date"}
},
"sub_field_list": {
"items": [
"itemcode",
"quant",
"_sernr",
"_rownr"
]
},
"sub_field_types": {
"items": {
"itemcode": {"__callable": "builtins::str"},
"quant": {"__callable": "bin.moneodecimal::Decimal"},
"_sernr": {"__callable": "builtins::int"},
"_rownr": {"__callable": "builtins::int"}
}
}
}
}
row_count - atgriežamo ierakstu skaits
Lai ierobežotu atgriežamo ierakstu skaitu, piemēram, lai atgriež tikai 5 ierakstus
JSON pieprasījums ar row_count:
{
"filter":{"custcode":"1003"},
"request":{
"compuid":{{comp_id}}
},
"row_count": "5"
}
sort_direction un keyname - atgriežamo ierakstu secība
Nolasāmos datu tabulas ierakstus var sakārtot pēc noteikta lauka (keyname), pašu sarakstu var sakārtot dilstoši (sort_direction - "up"/"down").
Lai nolasītu pēdējo ierakstu (pēc datuma lauka "transdate") tabulā var lietot kombināciju no atslēgvārdiem: sort_direction="down", keyname="transdate" un row_count="1"
{
"filter":{"custcode":"1003"},
"request":{
"compuid":{{comp_id}}
},
"keyname": "transdate",
"sort_direction": "down",
"row_count": "1"
}
join_tables - datu nolasīšana pievienojot datus no citām tabulām
Piemēram, pieprasot datus par rēķiniem (sales.invoices), to rindām (sales.invoices_items_rows), nepieciešams papildus pie rēķina rindas saņemt arī artikula svītrkodu (barcode) vai artikula ārējo id (externalid). Standartā šie lauki nav rēķinu ierakstos, tie ir atrodami artikulu kartiņās (tabula items.items), tas nozīmē ka būtu jāveic rēķinu rindu nolasīšana, pēc tam atrastos artikulus nolasīt no artikulu tabulas.
Ar join_tables var veikt šo datu savienošanu uzreiz, tādā veidā ar vienu pieprasījumu saņemot arī saistītot informāciju.
Piemērs, nolasītu konkrēta rēķina 220095 rindu artikulus, artikula svītrkodu un pārdodamo daudzumu
POST ar JSON struktūru: https://ossa.moneo.lv:15000/api/v2/sales.invoices_items_rows
{
"filter":{"_sernr":"220095"},
"fieldlist":["itemcode","items.items.barcode","quant"],
"join_tables": [["items.items", {"items.items.code": "itemcode"}]],
"request":{
"compuid":{{comp_id}}
}
}
join_tables var saturēt vairākus joinus, tāpēc norādāms dubults [], katrs elements satur tabulas savienošanas informāciju
["tablename", {"pievienojamās tabulas sasaistes lauks": "esošās tabulas sasaistes lauks"}]
["items.items", {"items.items.code": "itemcode"}]
3. Resursi, kas nav tabulas - API method
Pastāv iespēja izsaukt metodi, kas atgriež vērtības, kuras nav tiešs tabulas saturs. Metodes izsaukšana notiek ar sekojošu pieprasījumu: https://[ServerUrl]:[Port]/api/method/[app_name].[method name]
{“params”:[“arg1”,“arg2”,“arg3”…], “request”:{“compuid”:[compuid]}}
piemēram https://ossa.moneo.lv:15000/api/v2/method/stock.getstockquantforitemlist
{ "params":[ ["013G4155" ,"013G4156" ,"013G4190" ,"0600-02.000" ,"0600-02.553" ,"0600-03.000" ,"0600-03.553"], "MWH" ], "request":{ "compuid":"130C0585-60605033-D3BEEE44-5505ECA5-2B107BD8"
} }
atbilde:
"result":[ ["12.00", "48.00", "0.00", …] ]
- result elements saturēs method funkcijas atbildi. redzamajā piemērā, artikulu atlikums noliktavā MWH
Šobrīd pieejamās metodes:
- stock.getStockQuantForItemList - noliktavas atlikums artikulu sarakstam. Parametri: artikulu saraksts (list elements) un noliktavas kods
- stock.getStockQuant - noliktavas atlikums vienam artikulam. Parametri: artikula kods (obligāts), partijas numurs (optional), noliktava (optional), datums (optional)
- stock.getItemDeficiencyInfo - noliktavas atlikums artikulu sarakstam mīnus rezervētie daudzumi saistītajās tabulās, piemēram, neizpildītos klientu pasūtījumos, negrāmatotajās norakstīšanās un citur. Metodes parametri sakrīt ar atskaites Iztrūkstošo preču pārskats atlases parametriem.
Piemēram: POST http://127.0.0.1:15000/api/v2/method/stock.getItemDeficiencyInfo
4. Ierakstu veidošana - API create
REST API ļauj veikt arī datu rakstīšanu .
Pieprasījuma formāts ir sekojošs:
https://ossa.moneo.lv:15000/api/v2/[table name]/create/
{ "data":{ "tablename":{ "fieldlist":["field1","field2","field3","field4"], "data":[ ["value1","value2","value3","value4"] ] }, "row_tablenname:{ "fieldlist":["rowfield1","rowfield2"], "data":[ ["row1value1","row1value2"] , ["row2value1","row2value2"]] } }, "request":{ "compuid":"130C0585-60605033-D3BEEE44-5505ECA5-2B107BD8"} }
Piemērs: https://ossa.moneo.lv:15000/api/v2/sorders.orders/create/
Izveidot jaunu klientu pasūtījumu, klientam 2001 ar cenu lapu VIP un komentāru Test comment.
Pasūtījums saturēs divas rindas, artikuls 001 ar daudzumu 13.1 un artikuls 101 ar daudzumu 10.99
{ "data":{ "sorders.orders":{ "fieldlist":["custcode","pricelist","currency","comment"], "data":[ ["2001", "VIP", "EUR", "Test comment"] ] }, "sorders.orders_items_rows":{ "fieldlist":["itemcode","quant"], "data":[ ["001","13.1"] , ["101","10.99"]] } }, "request":{ "compuid":"130C0585-60605033-D3BEEE44-5505ECA5-2B107BD8"} }
{
"result": [
[true, [null, null, null, null, [220035], null]]
],
}
- result - satur izpildes rezultātu:
- pirmais elements true vai false nozīmē viss kārtībā, vai arī ir bijusi kļūda un darbība nav izpildīta veiksmīgi;
- otrais elements satur sešas vērtības - [kļūdas paziņojums, kļūdas lauks, kļūdas rindas nr., kļūdas apakštabulas nosaukums, ieraksta id, tabulas nosaukums]
- noderīgs ir 5 elements, kas satur jaunizveidotā ieraksta id (elements ir vērtību saraksts, jo ieraksta id var sastāvēt no vairākiem laukiem), šajā elementā būs ieraksta id arī tad, ja ieraksts būs veiksmīgi saglabāts bez kļūdām
atbildes piemērs, kad izsaukuma rezultāts ir kļūda:
{
"result": [
[false,
["{custcode} ir jānorāda obligāti", "custcode", null, null, [0], "sorders.orders"]]
],
}
- result - kļūdas gadījumā pirmais elements ir false, un nākamais elements ar sešām vērtībām precizē problēmu: kļūdas teksts, kļūdas lauks, rindas numurs, apakštabulas kods, jaunizveidotā ieraksta id, tabula.
- šoreiz 5. elements ir [0] - jo jauns ieraksts nav izveidots, līdz ar to, ierakstam nav piešķirts id (0, jo ieraksta id šajā gadījumā ir skaitlis, ja tas būtu kods, tad būtu tukšums)
5. Ieraksta datu atjaunošana - API update
Ieraksta datus ir iespējams atjaunot izmantojot REST API.
Pieprasījuma formāts:
https://[ServerUrl]:[Port]/api/v2/[TableName]/update/[PrimaryKey]
{
"data":{
"items.itemgroups":{
"fieldlist":["name"],
"data":[
["Testa grupa 1 (mainits)"]
]
}
},
"request":{
"compuid":"130C0585-60605033-D3BEEE44-5505ECA5-2B107BD8"
}
}
{
"result": [
[true, [null, null, null, null, null, null]]
],
}
- result - satur izpildes rezultātu, pirmais elements true vai false nozīmē viss kārtībā, vai arī ir bijusi kļūda un darbība nav izpildīta veiksmīgi.
atbildes piemērs, kad izsaukuma rezultāts ir kļūda, piemēram, norādītais PrimaryKey neeksistē:
{
"result": [
[false, ["Ieraksts nav atrasts", "code", null, null, "TEST", "items.itemgroups"]]],
}
- result - kļūdas gadījumā pirmais elements ir false, un nākamais elements ar sešām vērtībām precizē problēmu, tajā ir norādīts: kļūdas teksts, kļūdas lauks, rindas numurs, apakštabulas kods, primārais id, tabula.
clear_trailing_rows
Problēma, ko risina šis parametrs - ko darīt ar ieraksta apakštabulas rindām, ja to tagad ir mazāk nekā bija iepriekš - piemēram, klientu pasūtījumā tagad ir mazāk pasūtāmo pozīciju rindu, nekā klients bija pieteicis sākumā.
Ar šo parametru ir iespēja norādīt apakštabulas, kurās nepieciešams izdzēst rindas, kuras nav minētas iesūtāmajā API update ziņojumā.
6. PDF izdrukas iegūšana
Piemērs:
POST https://ossa.moneo.lv:15000/api/v2/print/sales.invoices/210036
HEADER Authorization: {{api_key}}
{
"request":{
"compuid": “53f98a26-041ecdf6-4cf71dcd-0474b2b3-b7c42fd6”
}
}
Atbilde:
{
"result": [base64_pdf],
}
7. Atskaites lasīšana
Pieprasījuma formāts:
https://[ServerUrl]:[Port]/api/v2/report/
def_rec vērtības iegūst no atskaišu definīcijas (sistēmā), kur saglabājas lauku kodi.
report_name atskaites kods/nosaukums
Piemēram, prombūtnes atskaites datu lasīšana:
POST https://ossa.moneo.lv:15000/api/v2/report/
{ "report_name": "payroll.absencecalcrep", "def_rec": {"sernr": 200003}, "request":{ "compuid": {{comp_id}} }
}
Atbilde:
{ "result": [ [ 200, [base64_pdf] ] ], }
8. Pielikumu iegūšana
Jāizmanto API metode WebGetAttachment
Piemērs:
POST method/integration.WebGetAttachment
Authorization:{
"params": [{
"table_name": "prod.specifications",
"main_key_list": "G02-211-10001-1",
"file_mask": "*.jpg"
}],
"request": {
"compuid":
}
}
Atbildē saņemsiet base64 iekodētu failu.
9. API pieprasījumu skaita ierobežojums
API pieprasījumu apjomam ir pieprasījumu skaita ierobežojums, kas tiek rēķināts pēc slīdošā loga principa (sliding window). Šobrīd API pieprasījumu limits ir 40 pieprasījumi 40 sekundēs uz uzņēmumu. Algoritms pārbauda vai pēdējās 40 sekundēs pieprasījumu skaits ir bijis mazāks par 40. Ja šis limits tiek pārsniegts, tad tiek atgriezts kļūdas kods 439 (Too Many Requests). Šāds pieslēguma algoritms ir izmantots, lai API pieslēguma izstrādātājiem ļautu veidot risinājumu kurā sistēma īslaicīgi var veikt lielu pieprasījumu skaitu, kāds mēdz būt nepieciešams veicot kādu kompleksu darbību, piemēram klienta pasūtījuma saglabāšana ar priekšlaicīgām pārbaudēm pirms tam.
Šis ierobežojums ir jāņem vērā kā rāmis, kurš diktē pieslēguma veidu starp MONEO un ārējo sistēmu. Tas iesaka veidot gudru sinhronizāciju - jāpārsūta tikai tādi dati, kas ir izmainījušies. Dati, kas ārējai sistēmai nepieciešami atkārtoti, būtu jāsaglabā (jāizmanto datu bāze vai kāds īslaicīgs uzglabāšanas mehānisms). Ir jāparedz situācija, ka pēkšņi lielu pieprasījumu skaita gadījumā ir nepieciešams uzgaidīt, lai sūtītu vēlamo pieprasījumu atkārtoti.
Komentāri
0 comments
Lūdzu ieejiet lai varētu pievienot komentāru.