Nárok na dovolenou se počítá na základě časů ze mzdových položek. Pokud některý z časů není na mzdě, nebude zahrnut do výpočtu nároku. Na detailu zaměstnance, v agendě zbývajících nepřítomností a v nástěnkových widgetech se pracuje s hodnotami výpočtů zbývající nepřítomnosti pro primární úvazky.
Přepočet nároku na dovolenou se provádí automaticky při generování mezd. Dojde k přepočítání pro hodnoty dle aktuálně zvoleného měsíce. Přepočítají se nároky všech typů nepřítomností, na kterých je povoleno Automaticky přepočítávat.
V případě potřeby je možné přepočet spustit také ručně tlačítkem Přepočítat zbývající nepřítomnosti (může být skryto ve mzdových akcích). V průběhu výpočtu dojde k odstranění nároků a automatických úprav pro budoucí měsíce. Více v sekci Postup výpočtu.
Pro ruční úpravy nároku na nepřítomnost (např. z důvodu krácení dovolené z důvodu neomluvené absence) slouží agenda Úpravy zbývající nepřítomnosti.
Zde je nutné zadat, které smlouvy se úprava týká, o jaký typ nepřítomnosti se jedná, ke kterému datu je úprava platná a jaká je hodinová změna nároku. Pro stržení jednoho běžného pracovního dne dovolené by tedy hodnota úpravy byla -8
hodin.
Pro typy nepřítomností, které mají nastaveno Převádět do dalšího roku probíhá převod automaticky, pokud se spustí výpočet pro 12. měsíc roku. Pro převod je nutné, aby pracovní úvazek pokračoval i na začátku dalšího roku - musí existovat platná pracovní smlouva stejného typu. Pokud současná smlouva do dalšího roku nepokračuje, pokusí se systém najít navazující smlouvu a převede zůstatek na ni (viz. Určení primárních a navazujících úvazků).
V agendě Úpravy zbývající nepřítomnosti systém vytvoří záznam se zbývajícími hodinami pro danou smlouvu k datu 1.1. následujícího roku s typem Přesun
.
Při generování mezd systém automaticky detekuje končící úvazek a přidá do mzdy pro danou pracovní smlouvu položku pro vyrovnání dovolené. Jsou podporovány případy nedočerpané dovolené i přečerpané dovolené. Částku pro přečerpanou dovolenou je možné po vygenerování ručně upravit. Pro správnou funkci musí být nastaveny potřebné mzdové položky na typu smlouvy.
Analogicky k výpočtu dovolené je možné vytvořit i vzorce pro další typy nepřítomností (např. sick days). Vzorce jsou definovány v agendě Mzdové parametry. Vzorec pro výpočet zbývající nepřítomnosti má kód s prefixem ENTITLEMENT_FORMULA_
, za kterým navazuje mzdový kód nepřítomnosti přiřazený danému typu nepřítomnosti. Pro dovolenou je to tedy ENTITLEMENT_FORMULA_HOLIDAY
.
Důležité: Aby automatický přepočet pro daný typ nepřítomnosti fungoval, musí pro něj v Mzdových parametrech existovat platný vzorec. Pokud vzorec chybí, výpočet se pro daný typ nespustí a systém ohlásí chybu.
U nových zaměstnanců je možné předpočítat předpokládaný nárok tlačítkem Vypočítat nárok v sekci zbývající nepřítomnost. Tuto funkci je možné použít nejpozději v průběhu měsíce, od kterého je člověk zaměstnán. Poté se nárok upravuje automaticky výpočtem.
Nejdříve se odstraní automatické úpravy a předpočítané nároky pro současný a následující měsíce. S tímto je potřeba počítat, pokud se z nějakého důvodu pouští přepočet pro minulé měsíce, nebo se přegenerovávají mzdy v minulosti. Po takovém zásahu je potřeba ručně přepočítat nároky na nepřítomnosti i pro všechny následující měsíce.
Poté dojde k načtení obecných informací potřebných pro výpočet (např. platné mzdové parametry, typy nepřítomností) a informací k jednotlivým zaměstnancům (pracovní smlouvy, úpravy nároků, mzdové položky, součty hodin docházky ze mzdových složek). V tomto bodě se kontroluje, zda některá smlouva zaměstnance není označena polem Přeskočit přepočet zbývajících nepřítomností. Pokud ano, přepočítání nepřítomností pro všechny úvazky takového zaměstnance bude přeskočeno.
Po načtení informací se provádí samotný přepočet nároků na nepřítomnosti každého automaticky přepočítaného typu nepřítomnosti pro jednotlivé zaměstnance.
Pro každého zaměstnance se nejdříve z pracovních smluv odvodí pracovní úvazky. Pracovní úvazek může tvořit několik navazujících pracovních smluv (viz Určení primárních a navazujících úvazků). Pro každý z úvazků se vypočítají Nároky na nepřítomnost dle pracovní smlouvy a Úpravy nároků na nepřítomnost, které se dají najít ve stejnojmenných agendách. Postup jejich výpočtu je v následujících krocích:
AUTOMATIC_UPDATE
) a nelze jej uživatelsky upravovat. Typicky se to stává u zaměstnanců, kteří z nějakého důvodu nenaplnili fond pracovní doby (např. z důvodu neplaceného volna).Na přelomu roku nebo při prvotní inicializaci je datum záznamu pro Nárok na nepřítomnost dle smlouvy k 1.1.
Navazující smlouvy jsou z pohledu zákona jedním úvazkem. Z pohledu výpočtu jsou smlouvy navazující tehdy, pokud mají stejnou hodnotu pole Hlavní pracovní poměr na Typu smlouvy, nepřekrývají se a platnost druhé smlouvy začíná následující den po konci platnosti první smlouvy. DPP a DPČ úvazky, které splňují takové podmínky pokládáme také za jeden úvazek a nerozlišujeme mezi nimi (DPP může navazovat na DPČ).
Pokud je v daném období pouze jeden platný úvazek, automaticky jej považujeme za primární. Pokud je v daném období úvazků více, automaticky považujeme za primární ten, který je Hlavním pracovním poměrem, nebo ten s nižším id.
V průběhu výpočtu se uvažuje pouze aktuální kalendářní rok. Při výpočtu předpokládáme, že zaměstnanec od následujícího měsíce odpracuje celou pracovní dobu (do konce roku, nebo do konce platnosti smlouvy), i v případě delší nepřítomnosti (dlouhodobá nemoc, rodičovská dovolená). V průběhu roku se poté nárok s každým přepočtem postupně zpřesňuje.
Předpokládaná odpracovaná doba se počítá jako týdenní_pracovní_doba * počet_zbývajících_týdnů
. Týdenní pracovní doba je váženým průměrem týdenního úvazku. Počet zbývajících týdnů, je zbývající počet dnů roku dělený 7.
Týdenní pracovní úvazek je možné uvézt na Pracovní smlouvě v poli Sjednaný týdenní úvazek, jeho dočasné úpravy je možné možné přidat ve stejnojmenné sekci na stejné agendě. Pokud není týdenní úvazek uveden na pracovní smlouvě, odvozuje se automaticky z docházky člověka. Toto může způsobovat nepřesnosti u zaměstnanců, kde nastavení docházky výrazně nekoresponduje se skutečností (např. brigádníci s nastavenou 8h směnou). U takových úvazků je nutné nastavit smysluplný týdenní úvazek na smlouvě. Možností je také nastavit na smlouvě hodnotu týdenního úvazku 0
. V tom případě se bude nárok na nepřítomnost počítat pouze ze skutečně odpracované doby (budoucí odpracovaná doba bude při výpočtu vždy 0
).
Proměnná | Popis | Jednotka |
---|---|---|
input.weeks |
trvání úvazku v rámci roku | Týden |
input.entitlementDays |
Velikost nároku, kterou zaměstnavatel poskytuje (vážený průměr, pokud se během roku mění) | Den |
input.averageWeeklyWorkingHours |
Týdenní pracovní doba (vážený průměr) | Hodina |
input.workedInFuture |
Předpoklad odpracované doby do konce roku | Hodina |
personContract |
Aktuální pracovní smlouva | Entita (PersonContract) |
absenceType |
Typ nepřítomnosti | Entita (AbsenceType) |
attendanceSummary |
Součty docházky ze mzdových položek | Třída AttendanceSummaryFromPayrolls |
calcApi |
API pro logování a varování | Třída CalculationApi |
LocalDate |
Pomocná třída pro práci s datem | Třída LocalDate |
Utils |
Pomocná třída s utilitami | Třída Utils |
RangeUtils |
Pomocná třída pro práci s rozsahy | Třída RangeUtils |
DateUtils |
Pomocná třída pro práci s datem | Třída DateUtils |
getWorkingTimeFn |
Funkce pro získání aktuální pracovní doby zaměstnance. Volá se: let time = getWorkingTimeFn.get(); |
Funkce |
AttendanceSummaryFromPayrolls
Metoda | Návratová hodnota | Popis |
---|---|---|
getAbsenceHoursBySalaryAbsenceCode(@NotNull String absenceCode) |
double | Vrací hodnotu součtu hodin pro kód mzdového kódu nepřítomnosti |
getAbsenceHoursBySalaryAbsenceCode(@NotNull SalaryAbsenceCode absenceCode) |
double | Vrací hodnotu součtu hodin pro entitu mzdového kódu nepřítomnosti |
getHoursForAttendanceType(@NotNull String attendanceType) |
double | Vrací hodnotu součtu hodin pro kód typu docházky |
CalculationApi
Metoda | Návratová hodnota | Popis |
---|---|---|
log(@NotNull String text, Object... params) |
void (nic) | Přidá přeložený textový řetězec do pole Log záznamu v agendě Nároky na nepřítomnost dle pracovní smlouvy |
warn(@NotNull String text, Object... params) |
void (nic) | Přidá přeložený textový řetězec do pole Upozornění záznamu v agendě Nároky na nepřítomnost dle pracovní smlouvy |
Vzorec pro výpočet dovolené je zjednodušeně ((počet_odpracovaných_týdnů) / 52) * nárok_na_dovolenou_v_týdnech * týdenní_pracovní_úvazek
. Výsledek vychází v hodinách a zaokrouhluje se nahoru na celé hodiny. Odpracované týdny se počítají jako suma započítávaných dob dělená týdenním úvazkem. Používají se pouze celé odpracované týdny (zaokrouhlují se dolů).
let workedHoursAndAbsenceHours = attendanceSummary.getHoursForAttendanceType('PRESENCE')
+ attendanceSummary.getHoursForAttendanceType('HOLIDAYS_COMPENSATION')
+ attendanceSummary.getHoursForEntitlementGroup('ALWAYS_INCLUDED')
+ input.workedInFuture;
let averageWeeklyWorkingHours = input.averageWeeklyWorkingHours;
if (!personContract.getContractType().isMainContract()) {
averageWeeklyWorkingHours = 20.0;
}
let workedWeeks = Math.floor(workedHoursAndAbsenceHours / averageWeeklyWorkingHours);
let conditionallyIncludedAbsenceHours = attendanceSummary.getHoursForEntitlementGroup('CONDITIONALLY_INCLUDED');
if (conditionallyIncludedAbsenceHours > 0.01) {
if (workedWeeks >= 12) {
let maxConditionallyIncludedAbsenceHours = averageWeeklyWorkingHours * 20;
if (conditionallyIncludedAbsenceHours > maxConditionallyIncludedAbsenceHours) {
workedHoursAndAbsenceHours += maxConditionallyIncludedAbsenceHours;
calcApi.log('Reached limit of 20 weeks for conditionally included absences.', conditionallyIncludedAbsenceHours);
} else {
workedHoursAndAbsenceHours += conditionallyIncludedAbsenceHours;
}
} else {
calcApi.log('Conditionally included absences ({} hours) are not included, because employee did not work required number of weeks.', conditionallyIncludedAbsenceHours);
}
}
workedWeeks = Math.floor((workedHoursAndAbsenceHours) / averageWeeklyWorkingHours);
calcApi.log('workedWeeks = {}', workedWeeks);
calcApi.log('entitlementDays {}', input.entitlementDays);
calcApi.log('averageWeeklyWorkingHours {}', input.averageWeeklyWorkingHours);
if (input.weeks < 4.0 || workedWeeks < 4.0) {
calcApi.log('Contract duration of 4 weeks or minimum of 4 times weekly working hours not reached. No absence entitlement');
return 0.0;
} else {
calcApi.log('Entitlement hours = roundUp(workedWeeks / 52 * entitlementDays / 5 * input.averageWeeklyWorkingHours)');
return Math.ceil((workedWeeks / 52) * (input.entitlementDays / 5) * averageWeeklyWorkingHours);
}
U typu nepřítomnosti, který se má automaticky přepočítávat, nastavte Automaticky přepočítávat. Ujistěte se, že všechny používané typy absencí mají přiřazený správný Mzdový kód nepřítomnosti.
Správně nastavte mzdové kódy nepřítomnosti. Plně zahrnuté náhradní doby (např. dovolená, mateřská dovolená atd.) označte jako Plně zahrnutá pomocí pole Nároková skupina. Označte jako Částečně zahrnutá doby, které jsou zahrnuty jen částečně (např. pracovní neschopnost).
Pokud to bude nutné, přidejte nové položky, tak aby se pokryly všechny potřebné případy (zkontrolujte, že se nachází i ve mzdových položkách typu smlouvy).
Ujistěte se, že všechny smlouvy, které mají na typu smlouvy Hlavní pracovní poměr, mají správně vyplněné pole Sjednaný týdenní úvazek.
Ujistěte se, že všechny typy smluv mají správně nastavené nároky na nepřítomnosti, včetně platností (zejména u DPP/DPČ smluv).
Nárok na dovolenou se vypočítává z časů položek na mzdě. Pokud se tedy některý z časů nedostane na mzdu, nedojde k jeho započítání v průběhu výpočtu nároku na dovolenou.
Všechny doby relevantní pro výpočet nároku na nepřítomnost musí být přítomné jako mzdové složky i tehdy, pokud se nepromítají do vyplacených částek. Ujistěte se, že tomu tak skutečně je. Zejména se jedná o plně započitatelné náhradní doby, překážky na straně zaměstnance, mateřská a rodičovská dovolená, OČR apod. Také se ujistěte, že pro DPP a DPČ smlouvy existují mzdové položky pro náhradu mzdy za dovolenou.
Pro mzdové složky, které mají na mzdovém kódu nepřítomnosti nastaven Maximální počet dní počítaný do mzdy, vytvořte podobnou mzdovou složku, která nebude přidávat částku k zaplacení a bude mít nastaveno pole Neomezená. Typicky se jedná např. o mzdový kód nepřítomnosti Nemoc a položku Náhrada mzdy za nemoc, která se ve mzdě nachází pouze v prvních 14 dnech jejího trvání. Zde je nutné přidat mzdovou složku neomezené nemoci. Příklad v tabulce níže:
Parametr | Hodnota |
---|---|
Název | Nemoc (pro výpočet dovolené) |
Fáze | 1 |
Typ docházky | ABSENCE |
Neomezená | true |
Směr | přidání |
Mzdové složky určené k proplacení zůstatku dovolené (typicky při ukončení pracovního poměru) se do odpracované doby pro výpočet nároku nezapočítávají.
Na příslušných typech smluv nastavte Přeskočit přepočet zbývající nepřítomnosti. Zaměstnanec, který ve sledovaném období má takto označenou pracovní smlouvu, bude při přepočtu zbývajících nepřítomností přeskočen, tzn. nepřítomnosti pro žádný z jeho úvazků nebudou přepočítány.
V případě potřeby je možné přepočítat nároky hromadně pro všechny zaměstnance od začátku roku po určitý měsíc včetně (například při změnách nastavení, které na výsledný nárok mají vliv). K takovému účelu existuje endpoint /api/person-contract-absence-entitlement/recalculate-entitlements/{year}/{upToMonth}
.