|
| 1 | +# PHP AbraFlexi |
| 2 | + |
| 3 | + |
| 4 | + |
| 5 | +PHP8.1+ Based Library for easy interaction with Czech accounting system AbraFlexi. |
| 6 | + |
| 7 | +CZ: PHP Knihovna pro snadnou práci s českým ekonomickým systémem [AbraFlexi](https://www.abraflexi.eu/) |
| 8 | + |
| 9 | +[](https://github.com/Spoje-NET/php-abraflexi/releases) |
| 10 | +[](https://github.com/Spoje-NET/php-abraflexi/blob/master/LICENSE) |
| 11 | +[](https://github.com/Spoje-NET/php-abraflexi/network) |
| 12 | +[](https://wakatime.com/badge/user/5abba9ca-813e-43ac-9b5f-b1cfdf3dc1c7/project/48520b87-4e9a-4eca-861a-a5dd85b11374) |
| 13 | +[](https://hub.docker.com/r/vitexsoftware/flexipeehp/) |
| 14 | +[](https://packagist.org/packages/spojenet/php-abraflexi) |
| 15 | + |
| 16 | +[](https://packagist.org/packages/spojenet/flexibee) |
| 17 | +[](https://packagist.org/packages/spojenet/flexibee) |
| 18 | +[](https://packagist.org/packages/spojenet/flexibee) |
| 19 | +[](https://packagist.org/packages/spojenet/flexibee) |
| 20 | +[](https://packagist.org/packages/spojenet/flexibee) |
| 21 | +[](https://packagist.org/packages/spojenet/flexibee) |
| 22 | +[](https://packagist.org/packages/spojenet/flexibee) |
| 23 | + |
| 24 | +# Poděkování |
| 25 | + |
| 26 | +Vznik této knihovny by nebyl možný bez laskavé podpory společnosti [Spoje.Net](http://www.spoje.net), |
| 27 | +která hradila vývoj řešení pro propojení LMS / AbraFlexi a importu skladu. :+1: |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | +**Dále chci poděkovat technické podpoře společnosti [ABRA Flexi s.r.o.](https://www.abraflexi.eu/podpora/) za jejich svatou trpělivost |
| 32 | +při reakcích na mé ne vždy bystré otázky a bugreporty.** |
| 33 | + |
| 34 | +Parsování výsledků pro účely GDPR logování bylo dopracováno za laskavé podpory [<PureHTML>](https://purehtml.cz/) |
| 35 | + |
| 36 | +Instalace |
| 37 | +--------- |
| 38 | + |
| 39 | +```shell |
| 40 | + composer require spojenet/flexibee |
| 41 | +``` |
| 42 | + |
| 43 | +aby váš výsledný composer.json obsahoval: |
| 44 | + |
| 45 | +```json |
| 46 | +{ |
| 47 | + "require": { |
| 48 | + "spojenet/flexibee": "^3.6" |
| 49 | + } |
| 50 | +} |
| 51 | +``` |
| 52 | + |
| 53 | +spustí se příkazem **composer install** instalace: |
| 54 | + |
| 55 | + |
| 56 | + |
| 57 | +Konfigurace |
| 58 | +----------- |
| 59 | + |
| 60 | +Konfigurace se provádí nastavením následujících konstant: |
| 61 | + |
| 62 | +```php |
| 63 | + /* |
| 64 | + * URL AbraFlexi API |
| 65 | + */ |
| 66 | + define('ABRAFLEXI_URL', 'https://abraflexi-dev.spoje.net:5434'); |
| 67 | + /* |
| 68 | + * Uživatel AbraFlexi API |
| 69 | + */ |
| 70 | + define('ABRAFLEXI_LOGIN', 'apiuser'); |
| 71 | + /* |
| 72 | + * Heslo AbraFlexi API |
| 73 | + */ |
| 74 | + define('ABRAFLEXI_PASSWORD', 'apipass'); |
| 75 | + /* |
| 76 | + * Společnost v AbraFlexi |
| 77 | + */ |
| 78 | + define('ABRAFLEXI_COMPANY', 'test_s_r_o_'); |
| 79 | + /* |
| 80 | + * Nebo pokud nechceme používat jméno a heslo |
| 81 | + */ |
| 82 | + define('ABRAFLEXI_AUTHSESSID', '6QuifebMits'); //Volitelné |
| 83 | + /* |
| 84 | + * Pomalý server, velká databáze a přes modem k tomu |
| 85 | + */ |
| 86 | + define('ABRAFLEXI_TIMEOUT', 60); //Volitelné |
| 87 | + /* |
| 88 | + * Pomalý server, velká databáze a přes modem k tomu |
| 89 | + */ |
| 90 | + define('ABRAFLEXI_EXCEPTIONS', true); //Vracet PHP vyjímku v případě že AbraFlexi vrátí chybu |
| 91 | +``` |
| 92 | + |
| 93 | +Pokud nejsou konstanty nastaveny, pouší se třídy také o konfiguraci ze stejnojmených proměnných prostředí. např getenv('ABRAFLEXI_URL') |
| 94 | + |
| 95 | +Taktéž je možné přihlašovací údaje zadávat při vytváření instance třídy. |
| 96 | + |
| 97 | +```php |
| 98 | + $invoicer = new \AbraFlexi\FakturaVydana(null,[ |
| 99 | + 'company' => 'Firma_s_r_o_', |
| 100 | + 'url' => 'https://abraflexi.firma.cz/', |
| 101 | + 'user' => 'rest', |
| 102 | + 'password' => '-dj3x21xaA_' |
| 103 | + ]); |
| 104 | +``` |
| 105 | + |
| 106 | +Tento způsob nastavení má vyšší prioritu než výše uvedené definovaní konstant. |
| 107 | + |
| 108 | +```php |
| 109 | + $order = new \AbraFlexi\ObjednavkaPrijata('code:OBP0034/2019',['companyUrl'=> $_GET['companyUrl'], 'authSessionId'=>$_GET['authSessionId'] ]) |
| 110 | + |
| 111 | +``` |
| 112 | + |
| 113 | +Takto se ke abraflexi a konrétní objednávce může připojit aplikace vyvolaná uživatelským tlačítkem předávajícím hodnoty **companyUrl** a **authSessionId** |
| 114 | + |
| 115 | +Jak to celé funguje ? |
| 116 | +--------------------- |
| 117 | + |
| 118 | +Ústřední komponentou celé knihovny je Třída RO, která je schopna pomocí |
| 119 | +PHP rozšíření curl komunikovat s REST Api AbraFlexi. |
| 120 | + |
| 121 | +Z ní jsou pak odvozeny třídy pro jednotlivé evidence, obsahující metody pro |
| 122 | +často používané operace, například "Zaplať" v případě přijatých faktur. |
| 123 | + |
| 124 | +Nová odvozená třída vzniká tak, že jméno třídy je název evidence avšak bez |
| 125 | +pomlček. Ty jsou ve jméně nahrazeny velkým písmenem. |
| 126 | + |
| 127 | +```php |
| 128 | + function evidenceToClass($evidence) |
| 129 | + { |
| 130 | + return str_replace(' ', '', ucwords(str_replace('-', ' ', $evidence))); |
| 131 | + } |
| 132 | +``` |
| 133 | + |
| 134 | +Tzn. Pokud chceme odvodit |
| 135 | +novou třídu pro evidenci "Měrné jednotky" bude vypadat takto: |
| 136 | + |
| 137 | +```php |
| 138 | + <?php |
| 139 | + /** |
| 140 | + * @link https://demo.abraflexi.eu/c/demo/merna-jednotka/properties Vlastnosti evidence |
| 141 | + */ |
| 142 | + class MernaJednotka extends /AbraFlexi/RW |
| 143 | + { |
| 144 | + /** |
| 145 | + * Evidence užitá objektem. |
| 146 | + * |
| 147 | + * @var string |
| 148 | + */ |
| 149 | + public $evidence = 'merna-jednotka'; |
| 150 | + } |
| 151 | +``` |
| 152 | + |
| 153 | +A poté je již snadné si vypsat měrné jednotky na 2 řádky: |
| 154 | + |
| 155 | +```php |
| 156 | + $jednotky = new MernaJednotka(); |
| 157 | + print_r( $jednotky->getAllFromAbraFlexi() ); |
| 158 | +``` |
| 159 | + |
| 160 | +Pokud chceme aby nově vytvořená třída uměla do abraflexi i zapisovat, je třeba jí |
| 161 | +odvodit od předka AbraFlexiRW. |
| 162 | + |
| 163 | +Více příkladů použití je možné najít [v samostatném projektu](https://github.com/VitexSoftware/AbraFlexi-Examples/tree/master/Examples) |
| 164 | + |
| 165 | +Struktura Evidencí, Akcí a vztahů |
| 166 | +--------------------------------- |
| 167 | + |
| 168 | +V některých případech je dobré znát jaké můžeme provádět akce, či jáká je |
| 169 | +struktura evidence. Tyto informace je možno získat voláním |
| 170 | +<https://demo.abraflexi.eu/c/demo/*/properties.json> |
| 171 | +respektive <https://demo.abraflexi.eu/c/demo/*/actions.json> |
| 172 | +avšak jedná se o relativně časově náročné operace. Jelikož se struktura |
| 173 | +evidencí a Akce či vztahy mezi evidencemi AbraFlexi často nemění AbraFlexi |
| 174 | +disponuje mechanizmem který umožní pracovat s těmito údaji bez nutnosti |
| 175 | +dotazovat se na ně serveru. |
| 176 | + |
| 177 | +Struktura je uložena ve třídě Structure (Actions,Relations) která obsahuje |
| 178 | +staticky definované pole obsahující informace které by jinak bylo nutné získat |
| 179 | +z AbraFlexi. |
| 180 | + |
| 181 | +Položku v seznamu evidencí <https://demo.abraflexi.eu/c/demo/evidence-list> je pak |
| 182 | +možné kdykoliv snadno ukázat: |
| 183 | + |
| 184 | +```php |
| 185 | + echo \AbraFlexi\Structure::$evidence['faktura-vydana']; |
| 186 | +``` |
| 187 | + |
| 188 | +Sturktury jednotlivých evidencí jsou pak uloženy ve statických proměnných. |
| 189 | +Jejich jméno se řídí stejnými pravidly jako jsou pro vytváření jména nové třídy |
| 190 | +jen s tím rozdílem, že první písmeno je malé. Tzn.: |
| 191 | + |
| 192 | +```php |
| 193 | + lcfirst(\AbraFlexi\Functions::evidenceToClassName($evidence)) |
| 194 | +``` |
| 195 | + |
| 196 | +V případě potřeby je možné tyto třídy pak možné vygenerovat s aktuálním obsahem |
| 197 | +následujícím příkazem: |
| 198 | + |
| 199 | + ```shell |
| 200 | + cd tools/ |
| 201 | + ./update_all.sh |
| 202 | + ``` |
| 203 | + |
| 204 | +Operace trvá několik minut. Zobrazit průběh můžeme takto: |
| 205 | + |
| 206 | + ```shell |
| 207 | + tail -f /var/log/syslog | grep AbraFlexitest |
| 208 | + ``` |
| 209 | + |
| 210 | +Ladicí režim |
| 211 | +------------ |
| 212 | + |
| 213 | +Pokud v objektech AbraFlexi nastavíte $this->debug na true, budou se před odesláním |
| 214 | +dat do AbraFlexi provedeny dodatečné testy. Kontrolují se tyto možné chyby: |
| 215 | + |
| 216 | +* Existuje vkládané políčko definované pro evidenci ? |
| 217 | +* Je vkládané políčko Pouze pro čtení ? |
| 218 | +* Pokud je vkládané políčko vazbou, je i polem ? |
| 219 | + |
| 220 | +V ladícím režimu se také ukládají do složky /tmp všechny požadavky na abraflexi a jejich odpovědi |
| 221 | + |
| 222 | +Knihovna obsahuje mechanizmus pro odesílání zaznamenaných chyb při běhu AbraFlexi vývojářům: |
| 223 | + |
| 224 | +Pokud AbraFlexi vrátí Internal Server Error 500, je odeslán vývojářům email obsahující chybovou zprávu. |
| 225 | + |
| 226 | +V případě že je použito AbraFlexi běžící na stejném serveru a je možné číst chybové logy je z nich vypreparován patřičný fragment a i ten je přidán do těla mailu. |
| 227 | + |
| 228 | +Email obsahuje také dodatečné informace o licenci a povolených modulech. |
| 229 | + |
| 230 | +Jako přílohy jsou také připojeny soubory obsahující tělo dotazu na server, tělo jeho odpovědi a soubor obsahující informace o curl. |
| 231 | + |
| 232 | +Během života objektu se chyby evidují a odesílá se pouze první každého druhu. |
| 233 | + |
| 234 | +Změny ve verzi 3.6 |
| 235 | +------------------ |
| 236 | + |
| 237 | +* nastaven výchozí curl timeout na 300 |
| 238 | +* Maximalizace využití objektu Relation |
| 239 | +* Nová třída AbraFlexi\Code nahrazující Functions::code a Functions::uncode |
| 240 | +* Dostupné jsou třídy pro všechny evidence ( ne jenom pro ty často používané ) |
| 241 | + |
| 242 | +Příkad vytvoření instance třídy FakturaVydana |
| 243 | +--------------------------------------------- |
| 244 | + |
| 245 | +Výchozí **Nativní typy** se projevují tak že ze serveru ve chlívečku obsahující datum obdržíte php objekt DateTime. ve sloupečku 'id' integer a pod. |
| 246 | +Toto chování je možné vypnout pomocí parametru konstruktoru ```['nativeTypes' = false]``` |
| 247 | + |
| 248 | +```php |
| 249 | + new \AbraFlexi\FakturaVydana( 'code:VF2-12345', ['nativeTypes'=>false,'debug'=>true,'ignore404'=>false] ); |
| 250 | +``` |
| 251 | + |
| 252 | +Viz.: [constructor RO](https://github.com/Spoje-NET/php-abraflexi/blob/cd829fcb05939ab54ed99aaa63d01b63700cbb83/src/AbraFlexi/RO.php#L450) |
| 253 | + |
| 254 | +Je možno zadat některé z těchto parametrů: |
| 255 | + |
| 256 | + * user,password,authSessionId - autentifikace |
| 257 | + * company,url,evidence - vynucení parametrů přístupu |
| 258 | + * prefix - pro url začínající jinak než '/c/' pro company |
| 259 | + * defaultUrlParams - pole vlastností pak automaticky přidávané |
| 260 | + * debug - pro zapnutí ladícího režimu |
| 261 | + * detail - pro specifikaci požadované [úrovně detailů](https://www.flexibee.eu/api/dokumentace/ref/detail-levels/). |
| 262 | + * offline - nevykonávají se žádné síťové operace ( nepřiřipojit se při instancování objektu ) |
| 263 | + * filter - viz [Filtrování](https://www.flexibee.eu/api/dokumentace/ref/filters} |
| 264 | + * ignore404 - v případě že nevím zdali požadovaný záznam existuje nastavte na true aby to nevyhodilo chybu |
| 265 | + * nativeTypes - pokud chci všecho ze serveru vracet jako stringy |
| 266 | + * timeout - trpělivost než se vyhodí chyba síťové komunikace (předáváno do cURL) |
| 267 | + * companyUrl - načte si z řetězce všechny náležitosti k připojení (heslo pro API atd..) |
| 268 | + * ver - vynucení verze api (pokud chcete volat funkce určené pro nové webové rozhraní) |
| 269 | + * throwException - vyhodit vyjímku při každé vhodné příležitosti |
| 270 | + |
| 271 | +Autoloading dat |
| 272 | +--------------- |
| 273 | + |
| 274 | +Pokud se konstruktoru objektu předá ID typu int nebo kódem (code:..) záznamu zavolá tento funkci loadFromAbraFlexi(id) |
| 275 | +Poté je možné k načteným hodnotám se dostat za použití metod $this->getData() a RO::getDataValue('nazev') |
| 276 | + |
| 277 | +Datové typy |
| 278 | +----------- |
| 279 | + |
| 280 | +Jelikož API vrací vše víceméně jako řetězec, knihovna provádí automatické konverze datových typů: |
| 281 | + |
| 282 | +| Strojový název | Název | Poznámka | Ukázka | PHP Typ | |
| 283 | +| -------------- | :-------------- | ----------- | :----------: | :------- | |
| 284 | +| string | Řetězec | Kódování je unicode. Lze tedy použít libovolný znak. | šílený koníček こちらは田中さんです | string | |
| 285 | +| integer | Celé číslo | Musí být bez mezer. Jde o znaménkový 4bajtový integer, ovšem rozsah může být omezený (viz přehled položek dané evidence) | 12 | integer | |
| 286 | +| numeric | Desetinné číslo | Musí být bez mezer, oddělovačem desetinných míst je tečka. Jde o 8bajtový double, ovšem rozsah může být omezený (viz přehled položek dané evidence) | 12.5 | float | |
| 287 | +| date | Datum | Datum ve formátu YYYY-MM-DD; lze zadat i časovou zónu (YYYY-MM-DDZZZ), ale ta bude ignorována. ZZZ je označení časové zóny (Z nebo +HH:MM nebo -HH:MM). | 1980‑05‑06 2015‑01‑30Z 2008‑09‑01+02:00 | \Date() | |
| 288 | +| datetime | Datum + čas | Datum a čas ve formátu YYYY-MM-DD'T'HH:MM:SS.SSS; lze zadat i časovou zónu (YYYY-MM-DD'T'HH:MM:SS.SSSZZZ), ale ta bude ignorována. | 1980‑05‑06 1980‑05‑06T12:30:12 2015‑01‑30T22:55:33Z 2008‑09‑01T17:18:14+02:00 2008‑09‑01T17:18:14.075+02:00 | \DateTime() | |
| 289 | +| logic | Logická hod. | boolean | true false | boolean | |
| 290 | +| select | Výběr jedné z hodnot | Výběr jedné z hodnot. Je reprezentován jako řetězec. | typVztahu.odberDodav | string | |
| 291 | +| relation | Vazba mezi daty | Vstupem je záznam z jiné evidence (přehled typů identifikátorů) | 123 code:CZK ext:DB:232 | \AbraFlexi\Relation | |
| 292 | + |
| 293 | +Testování |
| 294 | +--------- |
| 295 | + |
| 296 | +PHPUnit testy se nachází ve složce **testing**. Pokud chcete testovat proti jinému |
| 297 | +serveru než je oficální <http://demo.abraflexi.eu/> , je třeba změnit nastavení v |
| 298 | +souboru **bootstrap.php**. |
| 299 | + |
| 300 | +Obsah proměnné $testServer určuje která z předvolených nastavení budou použita. |
| 301 | +A samozřejmě si můžete nadefinovat i vlastní. Jako příklad je zde uveden testovací |
| 302 | +server spoje.net. |
| 303 | + |
| 304 | +Pro testování vytvořte prosím nejprve testovací firmu TESTING s.r.o. a nastavte |
| 305 | +přístupové údaje uživatele s oprávněním používat REST API. (Což je uživatel |
| 306 | +administrátora zadaný při instalaci AbraFlexi.) |
| 307 | + |
| 308 | +Upozornění: testování proti firmě s množstvím faktur a připojenou bankou může |
| 309 | +trvat nějakou dobu, jelikož se testuje i zavolání automatického párování dokladů. |
| 310 | + |
| 311 | +Pokud se ve vašem projektu rozhodnete podědit AbraFlexi a k těmto třídám napíšete |
| 312 | +testy také poděděné z AbraFlexi např: |
| 313 | + |
| 314 | +class HookRecieverTest extends \Test\AbraFlexi\ChangesTest |
| 315 | + |
| 316 | +Přidejte do vašeho composer.json i cesty k původním testům: |
| 317 | + |
| 318 | +```json |
| 319 | + "autoload-dev": { |
| 320 | + "psr-4": { |
| 321 | + "Test\\": "vendor/spojenet/php-abraflexi/test/src/AbraFlexi/test/", |
| 322 | + "Test\\Ease\\": "vendor/vitexsoftware/ease-core/tests/src/Ease", |
| 323 | + "Test\\AbraFlexi\\": "vendor/spojenet/php-abraflexi/test/src/AbraFlexi/", |
| 324 | + } |
| 325 | + } |
| 326 | +``` |
| 327 | + |
| 328 | +Ukázka |
| 329 | +------ |
| 330 | + |
| 331 | +Ve složce Examples jsou tyto ukázky použití: |
| 332 | + |
| 333 | +| Soubor | Popis | |
| 334 | +| ------------------------------------------------------------- | --------------------------------------| |
| 335 | +| [AttachmentSaveToFile.php](Examples/AttachmentSaveToFile.php) | uložení přílohy do souboru |
| 336 | +| [AttachmentUpload.php](Examples/AttachmentUpload.php) | nahrání přílohy |
| 337 | +| [AuthSessionIdUsage.php](Examples/AuthSessionIdUsage.php) | Ukázka autentizace AuthSessionId |
| 338 | +| [AuthentizeContact.php](Examples/AuthentizeContact.php) | autentizace kontaktu |
| 339 | +| [BatchOperation.php](Examples/BatchOperation.php) | Použití filtru při dávkových operacích |
| 340 | +| [CreateLabel.php](Examples/CreateLabel.php) | práce se štítky |
| 341 | +| [DryRun.php](Examples/DryRun.php) | Testovací uložení (dry-run) |
| 342 | +| [DownloadInvoicePDF.php](Examples/DownloadInvoicePDF.php) | stažení PDF faktury |
| 343 | +| [Error404.php](Examples/Error404.php) | práce s neexistujícími záznamy |
| 344 | +| [FindOverdueInvoices.php](Examples/FindOverdueInvoices.php) | najdi faktury po splatnosti |
| 345 | +| [GetRecordWithRelation.php](Examples/GetRecordWithRelation.php) | Získání záznamu včetně dat z podevidence |
| 346 | +| [GetBankAccountForCompany.php](Examples/GetBankAccountForCompany.php) | Získání bankovního účtu k firmě z adresáře |
| 347 | +| [InvoiceLockUnlock.php](Examples/InvoiceLockUnlock.php) | Zamykání a odemykání záznamu |
| 348 | +| [InvoiceCopy.php](Examples/InvoiceCopy.php) | vytvoření daňového dokladu ze zálohy |
| 349 | +| [LoginLogout](Examples/LoginLogout.php) | přihlášení uživatele a jeho odhlášení |
| 350 | +| [NajdiDanovyDokladKzalohovemu.php](Examples/NajdiDanovyDokladKzalohovemu.php) | dohledání dokladu |
| 351 | +| [Naskladnění.php](Examples/Naskladneni.php) | Naskladní produkt se sériovými čísly |
| 352 | +| [NewInvoice.php](Examples/NewInvoice.php) | Nová faktura se splatností vypsaná jako json |
| 353 | +| [ObjectChaining.php](Examples/ObjectChaining.php) | Řetězení objektů pro více operací v jenom pořadavku |
| 354 | +| [ObjectCooperation.php](Examples/ObjectsCooperation.php) | Sdílení data a parametrů připojení mezi objekty |
| 355 | +| [PerformingActions.php](Examples/PerformingActions.php) | Jak vykonávat akce nad dokladem akce. např. storno |
| 356 | +| [ReadAddressColumns.php](Examples/ReadAddressColumns.php) | vrať konkrétní sloupečky |
| 357 | +| [sendInvoiceByMail.php](Examples/sendInvoiceByMail.php) | odeslání faktury mailem |
| 358 | +| [SendReminders.php](Examples/SendReminders.php) | odeslání upomínek |
| 359 | +| [SetContactAuth.php](Examples/SetContactAuth.php) | nastavení autentizace |
| 360 | +| [TestConnection.php](Examples/TestConnection.php) | kontrola spojení |
| 361 | + |
| 362 | +Příklady použití |
| 363 | +----------------- |
| 364 | + |
| 365 | +* [Flexplorer](https://github.com/VitexSoftware/Flexplorer) Vývojářský nástoj a editor záznamů |
| 366 | +* [FlexiProXY](https://github.com/VitexSoftware/FlexiProxy) Modifikátor webového rozhraní AbraFlexi |
| 367 | +* [Upomínač](https://github.com/VitexSoftware/php-abraflexi-reminder) Odesílač upomínek |
| 368 | +* [Matcher](https://github.com/VitexSoftware/php-abraflexi-matcher) Párovač fakur |
| 369 | +* [Redmine2AbraFlexi](https://github.com/VitexSoftware/Redmine2AbraFlexi) Generuje faktury z odpracovaného času v Redmine |
| 370 | +* [FlexiPeeHP-Bricks](https://github.com/VitexSoftware/FlexiPeeHP-Bricks) Příklady a často požívaní třídy při práci s AbraFlexi |
| 371 | +* [AbraFlexi Tools](https://github.com/VitexSoftware/AbraFlexi-Tools) Nástroje pro skriptování AbraFlexi z příkazové řádky |
| 372 | + |
| 373 | +Reference |
| 374 | +---------- |
| 375 | + |
| 376 | +* [Import dat z FAPI do AbraFlexi](https://flexibee.info/fapi2abraflexi/) - blahasoft.cz |
| 377 | +* [Import dat z iDokladu do AbraFlexi](https://flexibee.info/idoklad2abraflexi/) - blahasoft.cz |
| 378 | + |
| 379 | +AbraFlexi knihovny pro další jazky |
| 380 | +---------------------------------- |
| 381 | + |
| 382 | +* [Flexipy](https://github.com/JakubJecminek/flexipy) (Python) [Dokumentace](http://pythonhosted.org/flexipy/index.html) |
| 383 | +* [Flexibee.rb](https://github.com/danpecher/flexibee.rb) (Ruby) |
| 384 | +* [UniMapper Flexibee extension](https://github.com/unimapper/flexibee) (PHP) |
| 385 | +* [Flexibee client](https://github.com/ricco24/flexibee-client) (PHP) |
| 386 | +* [flexibee-client](https://github.com/Ecomailcz/flexibee-client) (PHP) |
| 387 | +* [flexibee-client](https://github.com/klemen/flexibee-client) (PHP) |
| 388 | +* [Flexibee](https://github.com/adleritech/flexibee) (Java) |
| 389 | + |
| 390 | +[Statistiky práce na projektu WakaTime](https://wakatime.com/@Vitex/projects/eftagqirep?start=2022-10-09&end=2022-10-15) |
| 391 | +[Statistiky práce na projektu před přejmenováním](https://wakatime.com/@5abba9ca-813e-43ac-9b5f-b1cfdf3dc1c7/projects/ypdqvdcmsg) (cca 250h) |
0 commit comments