abra-flexi 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2025, Tomas Kavan
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md ADDED
@@ -0,0 +1,211 @@
1
+ # ABRA Flexi Typescript client
2
+ **English version follows**
3
+
4
+ [ABRA Flexi](https://www.abra.eu/flexi/) je český Ekonomický software pro malé a střední podniky vyvýjený společností [ABRA Software](https://www.abra.eu). ABRA Flexi poskytuje přístup k datům pomocí REST API s veřejnou dokumentací.
5
+
6
+ ABRA Flexi Typescript client (AFTC) je knihovna pro přístup k REST API ABRA Flexi. Použitelná v prohlížeči i na serveru (Node.js) a poskytující metody pro dotazování a mutaci dat.
7
+
8
+ AFTC obsahuje třídu pro každou z evidencí v ABRA Flexi. Vlastnosti těchto tříd zároveň modelují vztahy mezi evidencemi.
9
+
10
+ **Knihovna je v rané fázi vývoje a její rozhraní zatím není stabilní**.
11
+
12
+ ## Instalace
13
+
14
+ Knihovna je distribuovaná jako npm balíček
15
+ ```
16
+ npm install abra-flexi
17
+ ```
18
+
19
+ **!! Zatím nedistribuováno !!**
20
+ Místo npm použíjte přímo git repository a `npm link` (knihovnu mustí nejdříve přeložit).
21
+ ```
22
+ git checkout git@github.com:tomasKavan/abraFlexiClient.git
23
+ cd abraFlexiClient
24
+ npm install
25
+ npm run build:lib
26
+ npm link
27
+ ```
28
+
29
+ Ve svém projektu potom:
30
+
31
+ ```
32
+ npm link abra-flexi
33
+ ```
34
+
35
+ ### Gnerování evidenčních tříd
36
+
37
+ Součástní repository knihovny je nástroj pro generování evidenčních tříd z metadat, které poskytuje API. Generátor dovoluje vybrat subset generovaných tříd. To je užitečné, pokud chcete udržet knihovnu co nejmenší a generovat pouze třídy pro Vámi použivané evidence.
38
+
39
+ Generátor je třeba přeložit
40
+ ```
41
+ npm run build:cli
42
+ chmod a+x ./bin/index.js
43
+ ```
44
+
45
+ a následně lze generování spustit například takto:
46
+ ```
47
+ ./bin/index.js -s https://muj-flexi-server.cz/c/moje-spolecnost/ -u uzivatel1 -p hesloUzivatele -c -e adresar -e faktura-prijata -e polozka-faktury-prijate
48
+ ```
49
+
50
+ knihovnu s vygenerovanými třídami lze přeložit
51
+ ```
52
+ npm run build:cli
53
+ ```
54
+
55
+ ### Příklady
56
+
57
+ Složka `examples` obsahuje příklady použití knihovny. Prozatím jsem připravil
58
+ - jednoduchý CLI nástroj pro načtení konkrétní evidence (loadEntityCli.ts)
59
+ - soubor s příkladem volání více typů dotazů (loadEntity.ts)
60
+ - příklad vytvoŕení nové faktury. Nutno nastavit konstanty na řádku 29-31 (createAndSave.ts)
61
+ Příkaldy je možné spustit pomocí nástroje `ts-node`:
62
+ ```
63
+ ts-node examples/loadEntityCli.ts -h #vypíše nápovědu k příkazu
64
+ ts-node examples/loadEntity.ts -s https://muj.server.cz -c moje-firma -u uzivatel1 -h heslo1
65
+ ts-node examples/createAndSave.ts -s https://muj.server.cz -c moje-firma -u uzivatel1 -h heslo1
66
+ ```
67
+
68
+ ## Použití
69
+
70
+ V návodu se používají pojmy
71
+ - **evidence** Typ evidence v systému ABRA Flexi, například Faktura přijatá či Položka faktury přijaté. Každá evidence je reprezentováná evidenční třídou, například `AFFakturaPrijata` či `AFPolozkaFakturyPrijate`.
72
+ - **instance** Záznam v evidenci. Například faktura přijatá s kódem IV24.0001, identifikátorem 14 a dlšími hodnotami je instancí. Instance je v knihovně reprezentována instancí evidenční třídy, například: `const fp = new AFFakturaPrijata()`.
73
+
74
+ ### Import a inicializace knihovny
75
+
76
+ ```typescript
77
+ import { AFApiClient } from 'abra-flexi'
78
+
79
+ const apiOpts: AFApiConfig = {
80
+ url: '<doplnte_server>',
81
+ company: '<doplnte_spolecnost>
82
+ }
83
+
84
+ const api = new AFApiClient(apiOpts)
85
+ ```
86
+
87
+ ### Dotazování instancí
88
+
89
+ Pro dotazování instancí jsou k dispozici metody `query` (vrací kolekci instancí evidenčních tříd) a `queryOne` (vrací jedu instanci).
90
+
91
+ Parametrech dotazu může být uveden požadovaný detail. Detail se zapisuje formou pole vlastností evidencí formou textových řetězců. Detaily relací je možné vkládat pomocí pole o 2 prvcích, kde prvním je název vlastnosti relace v evidenci a druhým opět pole vlastností v napojené evidenci. Jasněji je to patrné z příkladu níže.
92
+
93
+ Pozor! Vnořené M:N či 1:N relací knihovna zatím podporuje pouze na základní úrovni. Například detail `faktura-vydana-polozka.cenik.atributy.typAtributu` se načte pouze po instanci ceníku. Bude řešeno v dalších verzích.
94
+
95
+ Filtrování je možné vkládat pomocí metod `Filter(expr, params)`, `ID(id)` nebo `CODE(code)`. Metoda `Filter` akceptuje textovou šablonu (`expr`), ve které budou všechny návěstí nahrazeny hodnotami předanými ve druhém argumentu (`params`). Návěstí mohou být:
96
+ - `:key` se nahradí textovou hodnotou klíče `key` ve druhém argumentu,
97
+ - `::mujKod` se nahradí textovou hodnotou klíče `mujKod` ve druhém argumentu a prefixuje se předponou `code:`,
98
+
99
+ Obě návěští podporují kolekce. Návěstí se pak nahradí výsledkem `kolekce.join(',')`. Pokud je hodnotou instance evidence (podtřída AFEntity), ignoruje se typ návěští a použije se číselné id resp. kód, není-li číselné id vyplněno/načteno.
100
+
101
+ Metoda `Filter` vrací objekt s mající následující metody:
102
+ - `use(filter, op)` - přidá jiný objekt filtru do stávajícího. Atribut `op` určuje operátor pro spojení se stávajícím filtrem (`and` nebo `or`, defaultní je `or`). Filtr je vložen v závorkách.
103
+ - `useNot(filter, op)` - stojné jako `use()`, ale před závorku je vložen operátor `not`
104
+ - `or(expr, params)` - připojí na konec filtru, za operátor `or` výraz `expr`. Bez závorek.
105
+ - `and(expr, params)` - připojí na konec filtru, za operátor `and` výraz `expr`. Bez závorek.
106
+
107
+ Všechny metody vrací vždy novou instanci filtru. Filtry si tedy můžete předpřipravit a následně spojivat pomocí `use()`/`useNot()`.
108
+
109
+ ```typescript
110
+ import { AFInterniDoklad, Filter } from 'abra-flexi'
111
+
112
+ const queryOpts: AFQueryOptions = {
113
+ detail: ['id', 'kod', 'typDokl', ['uzivatelske-vazby', ['id', 'evidenceType', 'objectId', 'vazbaTyp']]],
114
+ filter: Filter(`typDokl = '::td'`, { td: 'MUJ_TYP_DOKLADU'})
115
+ }
116
+
117
+ const query = api.query(AFInterniDoklad, queryOpts)
118
+
119
+ const run = async () => {
120
+ try {
121
+ const data = await query
122
+ console.log(data)
123
+ } catch (e) {
124
+ console.error(e)
125
+ }
126
+ }
127
+ run()
128
+
129
+ ```
130
+
131
+ ### Načtení většího detailu
132
+
133
+ Pro načtení většího detailu či aktualizaci dříve načtených instancí můžete použít metody `populate` a `populateOne`. Detailem požadované vlastnosti se aktualizují na původní instanci.
134
+
135
+ ```typescript
136
+ const loadedEntity // Zde máme uloženou dříve načtenou instanci entity AFInterniDoklad
137
+
138
+ const options = {
139
+ detail: AFQueryDetail.FULL
140
+ }
141
+
142
+ const populate = api.populateOne(loadEntity)
143
+
144
+ const run = async () => {
145
+ try {
146
+ const populatedEntity = await populate
147
+ console.log(populatedEntity)
148
+ console.log(populatedEntity === loadedEntity) // Vypíše true
149
+ } catch (e) {
150
+ console.error(e)
151
+ }
152
+ }
153
+ run()
154
+
155
+ ```
156
+
157
+ ### Načtení instancí z uživatelských vazeb
158
+
159
+ Instance entit odkazované pomocí uživatelských vazeb je možné načíst metodou `queryURel`. Metodě je třeba zaslat zdrojovou kolekci instancí. Instance neumsí být stejného typu (evidence), ale musí mít klíč `uzivatelske-vazby`. Metoda načítá vazby na kokrétní evidenci (vazby ostatních typů jsou vynechány). Vazby je možné filtrovat dle typu `typVazby`. Načtená data jsou přidána do vazeb zrojových instancí (vlastnost `object`). Data jsou dále vrácena jako kolekce párů `{ entity: zdrojova_entity, referencedFrom: načtená_entita }`.
160
+
161
+ Načteny jsou pouze instance vazeb, které se již vyskytují ve zdrojové kolekci! Metoda `queryURel` tedy sama uživatelské vazby na jednotlivých zdrojových instancích nenačítá. Načítá pouze instance, na které vazba odkazuje.
162
+
163
+ ```typescript
164
+ const soureEntities // Zde máme kolekci entit, pro které načítáme instance odkazované uživatelskou vazbou
165
+
166
+ const query = api.queryURels(AFInterniDoklad, soureEntities, {
167
+ detail: ['id', 'kod', 'typDokl']
168
+ })
169
+
170
+ const run = async () => {
171
+ try {
172
+ const pairs = await query
173
+ console.log(pairs)
174
+ } catch (e) {
175
+ console.error(e)
176
+ }
177
+ }
178
+ run()
179
+
180
+ ```
181
+
182
+ ### Práce se štítky
183
+
184
+ *TODO: Přidat popis*
185
+
186
+ ### Vytváření, změna a odstraňování instancí
187
+
188
+ *TODO: Přidat popis*
189
+
190
+ ## Task list pro vydání stabilní verze
191
+
192
+ - [X] Generování evidenčních tříd dle metadat REST API
193
+ - [X] Načítání kolekcí a jednotlivých instancí z REST API
194
+ - [X] Načítání užviatelských relací
195
+ - [X] Refersh již načtených dat
196
+ - [X] Pohodlná práce se štítky
197
+ - [ ] Jednotný handling identifikátorů záznamů
198
+ - [x] Vytváření, mazání a změna záznamů v REST API
199
+ - [ ] Lokální keš a společné instance pro jedno ID
200
+ - [ ] Battle tested - reálné nasazení, úprava rozhraní dle reálného použití
201
+ - [ ] Verzování, npm balíčkování
202
+ - [ ] Kontrola kompatibility při připojování k REST API
203
+ - [ ] English documentation
204
+
205
+ # English
206
+
207
+ [ABRA Flexi]([https://www.abra.eu/flexi/](https://www.abra.eu/en/flexi/) is Czech ERP for small businesses, developer by [ABRA Software](https://www.abra.eu/en). To access data in ABRA Flexi there is a REST API with public documentation.
208
+
209
+ ABRA Flexi Typescript client (AFTC) is library to call ABRA Fflexi REST API. It's for browsers and server environments (Node.js). It provides methods for CRUD.
210
+
211
+ Because ABRA Flexi is Czech software, it's expected to have mainly Czech developer audience. English version of the documentation will be finalized when the library API becomes stable.