Skip to content

Commit 1ddf431

Browse files
committed
Add multilingual README for PHP AbraFlexi library
Introduces a new Czech version of the README file alongside updates to the existing English version. Updates include support for PHP 8.1+, refined configuration instructions, and enhanced examples. Improves documentation clarity with reorganized sections and updated links. Refactors `evidenceToClassName()` method coverage annotation in tests. Ensures consistency with the updated class structure.
1 parent 2ebf37a commit 1ddf431

File tree

3 files changed

+565
-248
lines changed

3 files changed

+565
-248
lines changed

README.cs.md

Lines changed: 391 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,391 @@
1+
# PHP AbraFlexi
2+
3+
![PHP AbraFlexi Logo](project-logo.png?raw=true "Project Logo")
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+
[![Latest Version](https://img.shields.io/github/release/Spoje-NET/php-abraflexi.svg?style=flat-square)](https://github.com/Spoje-NET/php-abraflexi/releases)
10+
[![Software License](https://img.shields.io/badge/license-GNU-brightgreen.svg?style=flat-square)](https://github.com/Spoje-NET/php-abraflexi/blob/master/LICENSE)
11+
[![GitHub forks](https://img.shields.io/github/forks/Spoje-NET/php-abraflexi)](https://github.com/Spoje-NET/php-abraflexi/network)
12+
[![wakatime](https://wakatime.com/badge/user/5abba9ca-813e-43ac-9b5f-b1cfdf3dc1c7/project/48520b87-4e9a-4eca-861a-a5dd85b11374.svg)](https://wakatime.com/badge/user/5abba9ca-813e-43ac-9b5f-b1cfdf3dc1c7/project/48520b87-4e9a-4eca-861a-a5dd85b11374)
13+
[![Docker pulls](https://img.shields.io/docker/pulls/vitexsoftware/flexipeehp.svg)](https://hub.docker.com/r/vitexsoftware/flexipeehp/)
14+
[![Latest stable](https://img.shields.io/packagist/v/spojenet/php-abraflexi.svg?style=flat-square)](https://packagist.org/packages/spojenet/php-abraflexi)
15+
16+
[![Latest Stable Version](https://poser.pugx.org/spojenet/flexibee/v/stable)](https://packagist.org/packages/spojenet/flexibee)
17+
[![Total Downloads](https://poser.pugx.org/spojenet/flexibee/downloads)](https://packagist.org/packages/spojenet/flexibee)
18+
[![Total Downloads](https://img.shields.io/packagist/dt/spojenet/flexibe.svg?style=flat-square)](https://packagist.org/packages/spojenet/flexibee)
19+
[![Latest Unstable Version](https://poser.pugx.org/spojenet/flexibee/v/unstable)](https://packagist.org/packages/spojenet/flexibee)
20+
[![License](https://poser.pugx.org/spojenet/flexibee/license)](https://packagist.org/packages/spojenet/flexibee)
21+
[![Monthly Downloads](https://poser.pugx.org/spojenet/flexibee/d/monthly)](https://packagist.org/packages/spojenet/flexibee)
22+
[![Daily Downloads](https://poser.pugx.org/spojenet/flexibee/d/daily)](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+
![Spoje.Net](spoje-net_logo.gif?raw=true "Spoje.Net")
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+
![Compser Install](flexipeehp-composer-install.png?raw=true "Installation")
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

Comments
 (0)