Preskoči na glavno vsebino

Changes API

Changes API (sledovanie zmien)

Avtor: Petr Pech

Ak je Changes API zapnuté, ABRA Flexi zaznamenáva všetky zmeny vykonané v databáze firmy do changelogu a umožňuje zoznam zmien spätne získať.

Zmeny sú vzostupne číslované, takže firma má v každom okamihu dobre definovanú globálnu verziu. Čísla verzií nemusia nasledovať tesne po sebe — v rade môžu byť z technických dôvodov medzery — vždy je však číslo verzie unikátne a rastúce. Toho možno využiť na automatizovanú synchronizáciu externých systémov s ABRA Flexi a ide tiež o základ pre funkciu okamžitého upozorňovania na zmeny, teda Web Hooks.

⚠️ Licencia ABRA Flexi musí mať aktívne REST API minimálne pre čítanie. To majú všetky nové platené licencie už štandardne. Bez aktívneho REST API pre čítanie či zápis vracia volanie 403 Forbidden.


Zapnutie a vypnutie

Najjednoduchšie sa stav zistí a Changes API zapne alebo vypne vo webovom rozhraní na adrese /c/{firma}/changes/control. Programovo na to slúžia dve adresy, volané metódou PUT alebo POST:

PUT https://demo.flexibee.eu/c/demo/changes/enable.xml
PUT https://demo.flexibee.eu/c/demo/changes/disable.xml

Požiadavka nemá telo, preto k nej pridajte hlavičku Content-Length: 0.

🚨 Zapnutie aj vypnutie Changes API mení štruktúru databázy, a preto potrebuje exkluzívny zámok — pozri chybu s uzamknutím relácie nižšie. Nevykonávajte ich teda vtedy, keď vo firme niekto pracuje.


Zistenie stavu zapnutia

Ak potrebujete stav zistiť programovo, použite:

GET https://demo.flexibee.eu/c/demo/changes/status.xml

Ak je Changes API zapnuté, odpoveď obsahuje success s hodnotou true:

<?xml version="1.0" ?>
<winstrom version="1.0">
<success>true</success>
<message>Changelog is enabled.</message>
</winstrom>

Ak je odpoveďou false alebo chyba — čo nastane, ak nie je povolené REST API — je Changes API vypnuté.


Získanie aktuálnej globálnej verzie

Do akéhokoľvek XML či JSON exportu získaného cez REST API možno doplniť aktuálnu globálnu verziu pridaním parametra ?add-global-version=true. Odpoveď potom vyzerá takto:

<?xml version="1.0"?>
<winstrom version="1.0" globalVersion="6">
...
</winstrom>


Získanie záznamov o zmenách

Na adrese /c/{firma}/changes.xml nájdete zoznam všetkých zmien od začiatku ich sledovania:

GET https://demo.flexibee.eu/c/demo/changes.xml
<?xml version="1.0"?>
<winstrom globalVersion="6">
<faktura-vydana in-version="3" operation="create" timestamp="2019-01-01 00:00:00.0">
<id>1</id>
</faktura-vydana>
<faktura-vydana-polozka in-version="4" operation="create" timestamp="2019-06-07 12:34:56.7">
<id>1</id>
</faktura-vydana-polozka>
<faktura-vydana in-version="5" operation="update" timestamp="2019-06-07 12:34:56.7">
<id>1</id>
<id>code:VF1-0001/2012</id>
</faktura-vydana>
<next>6</next>
</winstrom>

Uvedené je vždy číselné ID objektu (<id>1</id>) a kód (<id>code:KÓD</id>); ak mal objekt v čase vykonávania operácie aj nejaké externé ID, sú uvedené aj tie (<id>ext:...</id>).

V atribútoch každého elementu je uvedené, v akej verzii k operácii došlo (in-version) a o akú operáciu išlo (operation; možné hodnoty sú create, update a delete). Vždy je prítomný atribút globalVersion. Posledným elementom vo výpise je vždy next, ktorý udáva číslo verzie, ktorou by tento výpis pokračoval, prípadne none, ak žiadne ďalšie zmeny nie sú.

Výpis možno upraviť nasledujúcimi parametrami:

?start=123

Od ktorej verzie sa má vypisovať (vrátane); defaultne od začiatku sledovania.

?limit=500

Koľko záznamov sa má vypísať; defaultne 100, maximálne 1000.

?evidence=faktura-vydana

Pre ktoré evidencie sa majú zmeny vypisovať; možno uviesť viackrát, ak nie je uvedené, vypisujú sa všetky.

⚠️ Vyššie limit než 1000 sa ticho zníži na 1000 a neznámy názov evidencie v parametri ?evidence= sa ticho ignoruje — výpis potom vráti zmeny všetkých evidencií. Názvy si preto overte v tabuľkách nižšie.

Vo formáte JSON vyzerajú zmeny takto:

{
"winstrom": {
"@globalVersion": "8",
"changes": [
{
"@evidence": "faktura-vydana",
"@in-version": "3",
"@operation": "create",
"@timestamp": "2019-01-01 00:00:00.0",
"id": "1",
"external-ids": []
},
{
"@evidence": "faktura-vydana-polozka",
"@in-version": "4",
"@operation": "create",
"@timestamp": "2019-06-07 12:34:56.7",
"id": "1",
"external-ids": []
},
{
"@evidence": "faktura-vydana",
"@in-version": "5",
"@operation": "update",
"@timestamp": "2019-06-07 12:34:56.7",
"id": "1",
"external-ids": [
"code:VF1-0001\/2012"
]
}
],
"next": "6"
}
}


Synchronizácia externých systémov s ABRA Flexi

Verziované zmeny možno ľahko využiť na efektívnu synchronizáciu externých systémov s ABRA Flexi — na rozdiel od dátumu poslednej zmeny. Postup je nasledujúci.

Počiatočné nahratie dát

  1. Získať aktuálne dáta vrátane ich verzie (?add-global-version=true).

  2. Uložiť dáta.

  3. Zapamätať si verziu z atribútu globalVersion.

Rozdielová synchronizácia

  1. Stiahnuť zmeny od poslednej zapamätanej verzie (?start=).

  2. Stiahnuť zmenené dáta a uložiť ich, prípadne zmazať odstránené dáta.

  3. Zapamätať si verziu z elementu next, prípadne z atribútu globalVersion.

  4. Opakovať od kroku 1.


Chyba „could not obtain lock on relation"

Ak sa vám pri zapínaní alebo vypínaní Changes API zobrazí chyba ERROR: could not obtain lock on relation "????", nezúfajte. Kvôli výkonnosti nie sú funkcie, ktoré Changes API obsluhujú, v databáze vôbec pridané — zanesieme ich do systému až pri jeho aktivácii, a preto je potrebné exkluzívne zamknúť celú databázu.

Riešením je odhlásiť sa z ABRA Flexi, a to ako z webového rozhrania, tak z klientskej aplikácie. Potom už operácia prejde.

Ukážka chyby:

ERROR: could not obtain lock on relation "drady"
Kde: SQL statement "LOCK TABLE drady IN ACCESS EXCLUSIVE MODE NOWAIT"


Endpointy logované v Changes API

Adresár a kontakty

Agenda

Endpoint

Adresár

adresar

Bankový účet (adresár)

adresar-bankovni-ucet

Kontakt

kontakt

Miesto určenia

misto-urceni

PSČ

psc

Skupina firiem

skupina-firem

Peňažný ústav

penezni-ustav

Štát

stat

Typ aktivity

typ-aktivity

Typ nákladu

typ-nakladu

Cenník a tovar

Agenda

Endpoint

Atribút

atribut

Cenová úroveň

cenova-uroven

Cenník

cenik

Dodávateľ

dodavatel

Kusovník

kusovnik

Merná jednotka

merna-jednotka

Odberateľ

odberatel

Podobný tovar

podobne-zbozi

Poplatok

poplatek

Príslušenstvo

prislustenstvi

Sady a kompletky

sady-a-komplety

Cenníková skupina

cenikova-skupina

Skupina tovaru

skupina-zbozi

Typ atribútu

typ-atributu

Skupina atribútov

skupina-atributu

Stav cenníka

stav-ceniku

Doklady — faktúry a pohľadávky

Agenda

Endpoint

Faktúra prijatá

faktura-prijata

Faktúra prijatá — položka

faktura-prijata-polozka

Faktúra vydaná

faktura-vydana

Faktúra vydaná — položka

faktura-vydana-polozka

Predajka *

prodejka

Predajka — položka *

prodejka-polozka (pozri faktura-vydana-polozka)

Pohľadávka

pohledavka

Pohľadávka — položka

pohledavka-polozka

Záväzok

zavazek

Záväzok — položka

zavazek-polozka

Typ faktúry prijatej

typ-faktury-prijate

Typ faktúry vydanej

typ-faktury-vydane

Typ predajky *

typ-prodejky

Typ pohľadávky

typ-pohledavky

Typ záväzku

typ-zavazku

Doklady — banka, pokladňa, interné doklady

Agenda

Endpoint

Banka *

banka

Banka — položka

banka-polozka

Vzájomný zápočet *

vzajemny-zapocet

Typ banky *

typ-banka

Typ vzájomných zápočtov *

typ-vzajemnych-zapoctu

Pokladničný pohyb

pokladni-pohyb

Pokladničný pohyb — položka

pokladni-pohyb-polozka

Typ pokladničného pohybu

typ-pokladni-pohyb

Interný doklad

interni-doklad

Interný doklad — položka

interni-doklad-polozka

Typ interného dokladu

typ-interniho-dokladu

Doklady — obchodné

Agenda

Endpoint

Ponuka prijatá

nabidka-prijata

Ponuka prijatá — položka

nabidka-prijata-polozka

Ponuka vydaná

nabidka-vydana

Ponuka vydaná — položka

nabidka-vydana-polozka

Objednávka prijatá

objednavka-prijata

Objednávka prijatá — položka

objednavka-prijata-polozka

Objednávka vydaná

objednavka-vydana

Objednávka vydaná — položka

objednavka-vydana-polozka

Dopyt prijatý

poptavka-prijata

Dopyt prijatý — položka

poptavka-prijata-polozka

Dopyt vydaný

poptavka-vydana

Dopyt vydaný — položka

poptavka-vydana-polozka

Typ ponuky prijatej

typ-nabidky-prijate

Typ ponuky vydanej

typ-nabidky-vydane

Typ objednávky prijatej

typ-objednavky-prijate

Typ objednávky vydanej

typ-objednavky-vydane

Typ dopytu prijatého

typ-poptavky-prijate

Typ dopytu vydaného

typ-poptavky-vydane

Stav obchodného dokladu

stav-obchodniho-dokladu

Forma dopravy

forma-dopravy

Forma úhrady

forma-uhrady

Platba predajky

prodejka-platba

Forma úhrady — zaúčtovanie

forma-uhrady-zauctovani

Doklady — sklad

Agenda

Endpoint

Skladový pohyb

skladovy-pohyb

Skladový pohyb — položka

skladovy-pohyb-polozka

Typ skladového pohybu

typ-skladovy-pohyb

Skladová karta

skladova-karta

Inventúra

inventura

Inventúra — položka

inventura-polozka

Rezervácia

rezervace

Mapovanie skladu

mapovani-skladu

Umiestnenie v sklade — miestnosť *

umisteni-ve-skladu-mistnost

Umiestnenie v sklade — regál *

umisteni-ve-skladu-regal

Umiestnenie v sklade — polica *

umisteni-ve-skladu-police

Výrobné číslo

vyrobni-cislo

Doklady — zmluvy

Agenda

Endpoint

Zmluva *

smlouva

Dodávateľská zmluva *

dodavatelska-smlouva

Zmluva — položka

smlouva-polozka

Typ zmluvy *

typ-smlouvy

Dodávateľský typ zmluvy *

dodavatelsky-typ-smlouvy

Stav zmluvy

stav-smlouvy

Príkazy na úhradu a číselníky platieb

Agenda

Endpoint

Príkaz na úhradu

prikaz-k-uhrade

Bankový účet

bankovni-ucet

Pokladňa

pokladna

Sklad

sklad

Číslo balíka

cislo-baliku

Konštantný symbol

konst-symbol

Formát elektronického bankovníctva

format-elektronickeho-bankovnictvi

Účtovníctvo

Agenda

Endpoint

Účtovná osnova

ucetni-osnova

Účet

ucet

Účtovné obdobie

ucetni-obdobi

Obrat

obrat

Riadok priznania DPH

radek-priznani-dph

Sadzba DPH

sazba-dph

Členenie DPH

cleneni-dph

Prenesenie DPH

preneseni-dph

Činnosť

cinnost

Stredisko

stredisko

Zákazka

zakazka

Typ zákazky

typ-zakazky

Stav zákazky

stav-zakazky

Hodnotenie zákazky

hodnoceni-zakazky

Predpis zaúčtovania

predpis-zauctovani

Typ organizácie

typ-organizace

Kurzy

Agenda

Endpoint

Kurz (všeobecný) *

kurz

Kurz pre cenotvorbu *

kurz-pro-cenotvorbu

Intrastat — kurz *

intrastat-kurz

Mena

mena

Intrastat

Agenda

Endpoint

Intrastat — dodacie podmienky

intrastat-dodaci-podminky

Intrastat — druh dopravy

intrastat-druh-dopravy

Intrastat — merná jednotka

intrastat-merna-jednotka

Intrastat — kraj určenia

intrastat-kraj-urceni

Intrastat — kód nomenklatúry

intrastat-kod-nomenklatury

Intrastat — obchodná transakcia

intrastat-obchodni-transakce

Intrastat — zvláštny pohyb

intrastat-zvlastni-pohyb

Rady dokladov

Agenda

Endpoint

Rada

rada

Rada — banka

rada-banka

Rada — faktúry prijaté

rada-faktury-prijate

Rada — faktúry vydané

rada-faktury-vydane

Rada — interného dokladu

rada-interniho-dokladu

Rada — ponuky prijaté

rada-nabidky-prijate

Rada — ponuky vydané

rada-nabidky-vydane

Rada — objednávky prijaté

rada-objednavky-prijate

Rada — objednávky vydané

rada-objednavky-vydane

Rada — pohľadávky

rada-pohledavky

Rada — pokladničného pohybu

rada-pokladni-pohyb

Rada — dopytu prijatého

rada-poptavky-prijate

Rada — dopytu vydaného

rada-poptavky-vydane

Rada — skladového pohybu

rada-skladovy-pohyb

Rada — záväzkov

rada-zavazku

Ročná rada

rocni-rada

Nastavenia a systém

Agenda

Endpoint

Nastavenie

nastaveni

Parameter

parametr

Príloha

priloha

Report

report

Rola

role

Text

text

Používateľ

uzivatel

Zastupovanie

zastupnost

Žurnál

zurnal

Filter

filtr

Používateľský dotaz

uzivatelsky-dotaz

Používateľský dotaz — parameter

uzivatelsky-dotaz-parametr

Používateľský dotaz — vlastnosť

uzivatelsky-dotaz-vlastnost

Používateľská väzba

uzivatelska-vazba

Typ používateľskej väzby

typ-uzivatelske-vazby

Právo viditeľnosti

pravo-viditelnosti

Certifikačná autorita

certifikacni-autorita

Skupina štítkov

skupina-stitku

Štítok

stitek

Strom (koreň)

strom-koren

Strom

strom

Strom — cenník

strom-cenik

Väzba

vazba

Ste s tem dobili odgovor na svoje vprašanje?