Nastavení nároku na benefitní volno dle roků výkonu práce

Z Prirucky

Nastavení nároku na benefitní volno dle roků výkonu práce je jednorázová zákaznická specialita, určená pro db platformu MS SQL.

Postup

Agenda Benefitní volna
1) Výběr zaměstnanců, kteří mají mít nárok (např. všichni s aktivním (neukončeným) hlavním pracovním poměrem).
2) Hromadné přidání benefitního volna vybraným zaměstnancům, přičemž nárok = 0.

SQL script
3) Spuštění sql scriptu provede změnu nároku benefitního volna u zaměstnanců v závislosti na rocích výkonu práce. Algoritmus koresponduje se sestavou:

Odpracované roky (výkon práce) (sestava),

přičemž maximální počet dnů nároku je omezen na hodnotu 5.



Pro aktuální období:
update benefit_volno set narok = 0 where datum = (select datum_prvni from par_map);

update benefit_volno set narok = ( datediff (mm, (select cast(B.datum_nastupu as date) from prac_pom B where B.os_cislo = benefit_volno.os_cislo and B.cislo_pom = benefit_volno.cislo_pom), (select cast(datum_prvni as date) from par_map)) ) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = narok - isnull( (select sum( datediff (mm, cast(N.dat_od as date), cast(N.dat_do as date)) ) from absence N where kod = 510 and (zpet_propl is null or zpet_propl <> 's') and N.os_cislo = benefit_volno.os_cislo and N.cislo_pom = benefit_volno.cislo_pom and N.dat_do <= (select cast(datum_prvni as date) from par_map)) , 0) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = narok - isnull( (select sum( datediff (mm, cast(N.dat_od as date), cast(D.datum_prvni as date) ) ) from absence N, par_map D where kod = 510 and (zpet_propl is null or zpet_propl <> 's') and N.os_cislo = benefit_volno.os_cislo and N.cislo_pom = benefit_volno.cislo_pom and N.dat_do > (select cast(datum_prvni as date) from par_map)) , 0) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = floor(narok/12) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = 5 where narok > 5 and datum = (select datum_prvni from par_map);


Pro konkrétní období 1.7.2018:
update benefit_volno set narok = 0 where datum = (select datum_prvni from par_map);

update benefit_volno set narok = ( datediff (mm, (select cast(B.datum_nastupu as date) from prac_pom B where B.os_cislo = benefit_volno.os_cislo and B.cislo_pom = benefit_volno.cislo_pom), '2018-07-01') ) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = narok - isnull( (select sum( datediff (mm, cast(N.dat_od as date), cast(N.dat_do as date)) ) from absence N where kod = 510 and (zpet_propl is null or zpet_propl <> 's') and N.os_cislo = benefit_volno.os_cislo and N.cislo_pom = benefit_volno.cislo_pom and N.dat_do <= '2018-07-01') , 0) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = narok - isnull( (select sum( datediff (mm, cast(N.dat_od as date), '2018-07-01' ) ) from absence N where kod = 510 and (zpet_propl is null or zpet_propl <> 's') and N.os_cislo = benefit_volno.os_cislo and N.cislo_pom = benefit_volno.cislo_pom and N.dat_do > '2018-07-01') , 0) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = floor(narok/12) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = 5 where narok > 5 and datum = (select datum_prvni from par_map);


U absencí, která mají datum_do vyšší než aktuální, počítá dny až do data_do.
update benefit_volno set narok = 0 where datum = (select datum_prvni from par_map);

update benefit_volno set narok = ( datediff (mm, (select cast(B.datum_nastupu as date) from prac_pom B where B.os_cislo = benefit_volno.os_cislo and B.cislo_pom = benefit_volno.cislo_pom), (select cast(datum_prvni as date) from par_map)) ) where datum = (select datum_prvni from par_map);


update benefit_volno set narok = narok - isnull( (select sum( datediff (mm, cast(N.dat_od as date), cast(N.dat_do as date)) ) from absence N where kod = 510 and (zpet_propl is null or zpet_propl <> 's') and N.os_cislo = benefit_volno.os_cislo and N.cislo_pom = benefit_volno.cislo_pom ) , 0) where datum = (select datum_prvni from par_map);


update benefit_volno set narok = floor(narok/12) where datum = (select datum_prvni from par_map);

update benefit_volno set narok = 5 where narok > 5 and datum = (select datum_prvni from par_map);

Odkazy