Přenos docházky z primaERP do FlexiBee

Pokud máte ve FlexiBee spoustu zaměstnanců s nepravidelným pracovním poměrem a hodinovou mzdou, jistě řešíte, jak se při výpočtu mezd vyhnout zadávání odpracovaných hodin. Nechte své zaměstnance svou pracovní dobu evidovat v nějakém docházkovém systému a data z něj načítejte do FlexiBee. Pro evidenci je možné využít například ABRA primaERP.

Nebudu v tomto článku rozebírat, jak evidovat docházku v primaERPu, protože natolik ho zase neznám. Ale rozeberu možnosti, jak přenést výsledná čísla do FlexiBee.

Získání potřebných mzdových složek z FlexiBee

Nejprve je nutné z FlexiBee načíst mzdové složky, které budeme měnit. Pro zpětný zápis totiž potřebujeme ID, které k nim má FlexiBee přidělené. A vlastně proč si celou práci nezjednodušit a jen do dat z FlexiBee doplnit potřebné číslo a poslat data zpět? :-)

Musíme tedy z FlexiBee, z evidence mzdova-slozka, načíst potřebné mzdové složky. Použijeme filtraci, abychom získali vždy jen data, která potřebujeme. Filtrace je jednoduchá. Budeme potřebovat získat složky pro konkrétní rok a měsíc a také jen složky HODINOVÁ MZDA. Dotaz do API FlexiBee tedy bude vypadat například takto

GET /mzdova-slozka/(cisMzdSloz = 'code:HODINOVÁ MZDA' and rok = 2017 and mesic = 1).json?detail=custom:id,osoba(osbCis,jmeno,prijmeni,titul),hodiny,zmenaCasu,zmenaCastMzd,castkaHod,castMzd&includes=/mzdova-slozka/osoba&limit=0

Tento request nám vrátí všechny složky typu HODINOVÁ MZDA za leden 2017. Výsledek bude obsahovat všechna pole, která potřebujeme pro to abychom mohli tyto složky bez trestu změnit.

Výsledek vrázený z FlexiBee bude vypadat nějak takto:

{
  "winstrom": {
    "@version": "1.0",
    "mzdova-slozka": [
      {
        "id": "13",
        "osoba": [
          {
            "id": "1",
            "osbCis": "A02200",
            "jmeno": "Kája",
            "prijmeni": "z Norska",
            "titul": ""
          }
        ],
        "hodiny": "0.0",
        "zmenaCasu": "false",
        "zmenaCastMzd": "false",
        "castkaHod": "800.0",
        "castMzd": "0.0"
      }
    ]
  }
}


Načtení dat z primaEPRu

Pokud máme všechna potřebná data z FlexiBee, načteme si data z docházkového systému. Já využiji primaERP, protože má API, ale není to zcela nutné. Je možné v tomto kroku načíst například excel s docházkou. Důležité je jen to, abychom byli schopni identifikovat zaměstnance a věděli jsme kolik odpracoval hodin.

V API primaERPu je tedy potřeba udělat request na URL

GET https://{tenant}.api.primaerp.com/v1/time/timerecords/summary.json?summary=user/position;sum(duration)&$filter=start ge datetime'2017-05-01T00:00:00.000Z' and stop lt datetime'2017-06-01T00:00:00.000Z'&token=9c11cea8-c3b3-4232-bfbb-f8acefce2f5a

Získáme data ve formátu například

[
  {
    "key": "A02200",
    "summaries": [
      {
        "name": "sum(duration)",
        "value": "232777000"
      }
    ]
  }
]


V requestu je použita sumace na vlastnost duration (trvání úkolu). Jako identifikátor poslouží pozice zaměstnance, kterou jsem zneužil pro osobní číslo, abych následně mohl přiřadit data z primaERPu na data z FlexiBee. Další věcí, kterou v dotazu použijeme, je filtrace na datum od a datum do. To nám vyfiltruje jen úkoly, které začali a skončily ve sledovaném období.

V datech, která nám primaERP vrátil, je tedy jako key osobní číslo z FlexiBee a sumace trvání jednotlivých úkolů. Tato sumace je celkový čas v milisekundách. Hodiny, které potřebujeme zapsat do složky HODINOVÁ MZDA, tedy získáme podle vzorce

hodiny = duration / 1000 / 60 / 60

V mém případě je to úžasných 64,66 hodiny. Samozřejmě můžeme, a nejspíš i budeme, zaokrouhlovat. Ale to už je na každém. FlexiBee dovolí do složky zadat číslo s přesností na dvě desetinná místa.

Zpracování dat a zápis zpět do FlexiBee

Takto načtená data nyní musíme zpracovat a zapsat zpět do FlexiBee. Projdeme tedy jednotlivé mzdové složky získané z FlexiBee a budeme do nich postupně doplňovat údaje z primaERPu.

Každá mzdová složka v sobě obsahuje jednoznačný identifikátor, kterým je osobní číslo zaměstnance. Podle tohoto čísla budeme v datech z primaERPu vyhledávat správnou sumaci. Jakmile ji najdeme, přepočteme milisekundy na hodiny a zapíšeme do pole hodiny. Do pole castMzd zapíšeme součin odpracovaných hodin a hodnoty pole castkaHod, které obsahuje hodinovou mzdu zaměstnance. Poslední věcí, kterou musíme udělat, je zapsat do polí zmenaCasu a zmenaCastMzd true místo false, aby nám FlexiBee zapsané hodnoty neměnilo podle fondu pracovní doby.

Tak a data máme připravena a můžeme je poslat zpět do FlexiBee. To už je, doufám, celkem známá věc. Jen pro jistotu, URL, na které budeme data zapisovat, je

PUT /mzdova-slozka.json

Několik slov závěrem

Pokud má firma minimálně pár zaměstnanců s hodinovou mzdou, doporučuji si nějaký takovýto nástroj vytvořit. Je celkem jedno, jestli data budou načítána z primaERPu nebo jiného docházkového systému. Samozřejmě je možné využít i například excel. Pokud bude obsahovat sloupce osobní číslo a odpracovaná doba, mělo by to v pohodě (ale fuj :-) ve FlexiBee samozřejmě) stačit.

Pokud takovýto můstek vytvoříte, myslím, že Vám mzdová účetní bude po každých výplatách několik dní děkovat. Protože komu by se chtělo zadávat u každého zaměstnance hodiny pořád dokola.

Využití pole pozice v primaERPu berte s rezervou, prosím. Zatím se rozkoukávám a třeba mě napadne ještě lepší řešení. Kdo chce hledá způsob. Kdo nechce, hledá důvod. A já se snažím hledat jednoduché způsoby.

ABRA FlexiBee, primaERP, Docházka, REST API, Mzdy

- (5. 10. 2017)
Kája z Norska
Kája z Norska

Jsem programátor, horolezec a tak trochu FlexiBee fanatik :-).
Na CharlieBlogu sepisuji své nápady a poznatky už od roku 2006.