Asetusten voimassaolotoiminnolla voidaan määrittää poikkeuksia käytössä oleviin asetuksiin. Asetuspoikkeus voidaan asettaa erikseen määritettävillä sääntökomennoilla mm. juhlapyhille tai vapaasti mille tahansa päivälle tai päiville. Sääntökommentoja käydään tarkemmin läpi tämän ohjeen alaosassa esimerkkien avulla.
Mikäli poikkeuksia on asetettu niin näiden säännöt tulkitaan ennen asetuksen arvon käyttämistä. Alla olevassa esimerkissä työpäivän pituus on 8 tuntia, paitsi loppiaisena jolloin se on 4 tuntia 30 minuuttia.
- Asetuksella voi olla useita poikkeuksia ja ne käsitellään järjestyksessä ylhäältä alas.
- Ensimmäinen sääntö, jonka arvo on tosi, tulee voimaan.
- Jokainen päivä arvioidaan sitä sääntöä vasten erillisenä.
Mikäli asetukselle ei ole asetettu arvoa tai mikään poikkeus ei ole voimassa niin palvelun käyttämä asetuksen arvo haetaan yläryhmästä. Poikkeusasetus ei periydy yläryhmästä ilman, että poikkeusasetuksen rinnalle on määritelty asetus myös samaan ryhmään. Eli pelkkä poikkeusasetuksen määritys ei vaikuta määrityksiin, vaan myös itse asetus tulee olla määritelty.
Asetusarvon poikkeuksen määrittäminen
Poikkeus asetusarvoon määritetään voimassaolotoiminnon kautta. Poikkeus asetukseen lisätään valitsemalla Lisää uusi asetusarvon poikkeus.
- Arvo-kenttään määritetään poikkeava asetusarvo.
- Sääntö-kenttään määritetään alta löytyvillä sääntökomennoilla päivä tai päivät, jolloin poikkeusasetus halutaan olevan voimassa.
- Voimassa alkaen ja Voimassa saakka -kenttiin voidaan määrittää päivämäärät esimerkiksi tilanteessa, jossa asetus on voimassa vain jonkin tietyn ajanjakson, esimerkiksi käytössä olevan työehtosopimuksen määrittelemän ajan.
Sääntökomennot
Sääntökomennot määritetään englanniksi mutta ne käyttäytyvät suomalaisten juhlapyhien sekä joidenkin muiden maiden juhlapyhien mukaisesti. Käytettävissä olevat sääntökomennot (hakasuluissa) ovat:
[ALL-SAINTS-DAY]
- Pyhäinpäivä[ANNIVERSARY-OF-THE-CORONATION-OF-KING-MINDAUGAS]
- Valtion päivä Liettuassa (kuningas Mindaugasin kruunajaiset) (6.7.)[ASCENSION-DAY-GREGORIAN]
- Helatorstai[ASSUMPTION-DAY]
- Marian taivaaseenottamisen juhlapäivä (15.8.)[BOXING-DAY]
- Tapaninpäivä[CHRISTMAS-DAY]
- Joulupäivä[CHRISTMAS-EVE]
- Jouluaatto[EASTER-JULIAN]
- Pääsiäispäivä Juliaanisen kalenterin mukaan. Ortodoksisen (paitsi Suomen) kirkon pääsiäispäivä tulee Juliaanisen kalenterin mukaan.[EASTER-MONDAY-GREGORIAN]
- Toinen pääsiäispäivä[EASTER-SUNDAY-GREGORIAN]
- Pääsiäispäivä[EPIPHANY]
- Loppiainen[ESTONIAN-INDEPENDENCE-DAY]
- Viron itsenäisyyspäivä (24.2.)[ESTONIAN-INDEPENDENCE-DAY-EVE]
- Viron itsenäisyyspäivän aatto (23.2.)[ESTONIAN-INDEPENDENCE-RESTORATION-DAY]
- Viron uudelleenitsenäistymispäivä (20.8.)[ESTONIAN-ST-JOHNS-DAY-EVE]
- Viron voitonpyhän aatto (22.6.)[ESTONIAN-VICTORY-DAY]
- Viron voitonpyhä (23.6.)[FATHERS-DAY]
- Isänpäivä[GOOD-FRIDAY-GREGORIAN]
- Pitkäperjantai[GREAT-PRAYER-DAY]
- Tanskan suuri rukouspäivä (4. lauantai pääsiäisen jälkeen)[HOLY-SATURDAY-GREGORIAN]
- Pääsiäislauantai[INDEPENDENCE-DAY]
- Itsenäisyyspäivä[INDEPENDENCE-DAY-EVE]
- Itsenäisyyspäivän aatto (5.12.)[LITHUANIAN-ALL-SAINTS-DAY]
- Pyhäinpäivä Liettuassa (1.11.)[LITHUANIAN-FATHERS-DAY]
- Isänpäivä Liettuassa (kesäkuun ensimmäinen sunnuntai)[LITHUANIAN-INDEPENDENCE-RESTORATION-DAY]
- Liettuan itsenäisyyden palauttamisen päivä (11.3.)[LITHUANIAN-MOTHERS-DAY]
- Äitienpäivä Liettuassa (toukokuun ensimmäinen sunnuntai)[LITHUANIAN-RESTORATION-OF-THE-STATE-DAY]
- Liettuan itsenäisyyspäivä (16.2.)[MAUNDY-THURSDAY-GREGORIAN]
- Kiirastorstai[MAY-DAY]
- Vappupäivä[MAY-DAY-EVE]
- Vappuaatto[MIDSUMMERS-DAY]
- Juhannuspäivä[MIDSUMMERS-EVE]
- Juhannusaatto[MOTHERS-DAY]
- Äitienpäivä[NEW-YEARS-DAY]
- Uudenvuodenpäivä[NEW-YEARS-EVE]
- Uudenvuodenaatto[NORWEGIAN-CONSTITUTION-DAY]
- Norjan kansallispäivä (17.5.)[ST-JOHNS-DAY]
- Johannes Kastajan päivä (24.6.)[ST-JOHNS-DAY-EVE]
- Johannes Kastajan päivän aatto (23.6.)[SWEDISH-NATIONAL-DAY]
- Ruotsin kansallispäivä (6.6.)[WHIT-SUNDAY-GREGORIAN]
- Helluntai
Jos poikkeusasetus halutaan määrittää koskemaan kaikkia arkipyhiä, voidaan käyttää seuraavaa poikkeusasetusta:
[EPIPHANY], [GOOD-FRIDAY-GREGORIAN], [EASTER-MONDAY-GREGORIAN], [ASCENSION-DAY-GREGORIAN], [MAY-DAY], [MIDSUMMERS-EVE], [INDEPENDENCE-DAY], [CHRISTMAS-EVE], [CHRISTMAS-DAY], [BOXING-DAY], [NEW-YEARS-DAY]
Jos poikkeusasetus halutaan määrittää koskemaan kaikkia pyhäpäiviä, voidaan käyttää seuraavaa poikkeusasetusta:
[EPIPHANY], [GOOD-FRIDAY-GREGORIAN], [HOLY-SATURDAY-GREGORIAN], [EASTER-SUNDAY-GREGORIAN], [EASTER-MONDAY-GREGORIAN], [ASCENSION-DAY-GREGORIAN], [MAY-DAY], [WHIT-SUNDAY-GREGORIAN], [MOTHERS-DAY], [MIDSUMMERS-EVE], [MIDSUMMERS-DAY], [ALL-SAINTS-DAY], [FATHERS-DAY], [INDEPENDENCE-DAY], [CHRISTMAS-EVE], [CHRISTMAS-DAY], [BOXING-DAY], [NEW-YEARS-DAY]
Juhlapyhien lisäksi käytettävissä on seuraavat sääntökomennot:
[YEAR]
- Käytetään vuoden korvaamiseen päivämäärässä, jolloin vastaavuus on minä tahansa vuonna[MONTH]
- Käytetään kuukauden korvaamiseen päivämäärässä, jolloin vastaavuus on minä tahansa kuukautena annettuna vuotena[DAY]
- Käytetään päivän korvaamiseen päivämäärässä, jolloin vastaavuus on minä tahansa päivänä annettuna kuukautena ja vuotena[YEAR-EPIPHANY-ON-WEEKEND]
- Käytetään vuoden korvaamiseen päivämäärässä, vastaavuus vuosina jolloin Loppiainen on viikonloppuna[YEAR-EPIPHANY-NOT-ON-WEEKEND]
- Käytetään vuoden korvaamiseen päivämäärässä, vastaavuus vuosina jolloin Loppiainen ei ole viikonloppuna[YEAR-LEAP-YEAR]
- Käytetään vuoden korvaamiseen päivämäärässä, vastaavuus vuosina jotka ovat karkausvuosia[YEAR-NOT-LEAP-YEAR]
- Käytetään vuoden korvaamiseen päivämäärässä, vastaavuus vuosina jotka eivät ole karkausvuosia[LAST-FRIDAY-IF-ON-WEEKEND]
- Käytetään päivämäärän tai juhlapyhän sääntökomennon lisänä, vastaavuus päivästä edellisena perjantaina jos päivä on viikonloppuna[NEXT-MONDAY-IF-ON-WEEKEND]
- Käytetään päivämäärän tai juhlapyhän sääntökomennon lisänä, vastaavuus päivästä seuraavana maanantaina jos päivä on viikonloppuna
Poikkeusasetus voidaan asettaa joko ylläolevilla sääntökomennoilla tai suoraan päivämäärämuotoisena (pp.kk.vvvv). Säännön perään voidaan myös asettaa komentoja, joilla määritetään poikkeusasetuksen voimassaolopäivä juhlapyhästä laskettuna:
- +1 day poikkeus on voimassa juhlapyhän jälkeisenä päivänä (esim.
[BOXING-DAY] +1 day
) - -1 day poikkeus on voimassa päivää ennen juhlapyhää (esim.
[ASCENSION-DAY-GREGORIAN] -1 day
) - +1 week poikkeus on voimassa viikon kuluttua (7 päivää) juhlapyhästä
- -1 week poikkeus on voimassa viikkoa aiemmin (7 päivää) ennen juhlapyhää
- next Saturday poikkeus on voimassa seuraavana lauantaina (esim.
[NEW-YEARS-EVE] next Saturday
). Sääntö toimii kaikilla viikonpäivän nimillä. Viikonpäivän nimen täytyy olla englanniksi. - previous Saturday poikkeus on voimassa edellisenä lauantaina (esim.
[MAY-DAY] previous Saturday
). Sääntö toimii kaikilla viikonpäivän nimillä. Viikonpäivän nimen täytyy olla englanniksi.
Day-arvo voi olla mikä tahansa luku riippuen siitä, kuinka monta päivää eteenpäin tai taaksepäin poikkeus on tarkoitus määrittää.
Nämä komennot ovat hyödyllisiä tilanteissa, jossa esimerkiksi loppiasta edeltävälle päivälle halutaan antaa jokin poikkeusasetus, esimerkiksi työpäivän pituus. Tällöin poikkeukselle asetettava sääntö olisi muotoa [EPIPHANY] -1 day
.
Poikkeusasetuksella voidaan asettaa muutos koskemaan jonkin viikon päiviä. Esimerkiksi poikkeuksen, joka on voimassa jouluaattoviikolla voi asettaa seuraavalla säännöllä.
23.12.[YEAR] monday this week,
23.12.[YEAR] tuesday this week,
23.12.[YEAR] wednesday this week,
23.12.[YEAR] thursday this week,
23.12.[YEAR] friday this week,
23.12.[YEAR] saturday this week,
23.12.[YEAR] sunday this week
Esimerkkejä mahdollisista poikkeusasetuksista
Suoraan juhlapyhiin kohdistuvien sääntökomentojen lisäksi poikkeus on mahdollista määrittää päivään, kuukauteen tai vuoteen kohdistuvilla komennoilla.
- Jos asetusarvo on muuten aina sama, paitsi jonain tiettynä päivänä, voidaan säännöksi määrittää päivämäärä esimerkiksi:
19.2.2017
Päivämäärän tulee olla muodossapp.kk.vvvv
- Jos asetusarvo on muuten aina sama, paitsi jonain tiettynä päivänä joka vuosi, voidaan säännöksi määrittää esimerkiksi:
25.12.[YEAR]
- Jos asetusarvo on muuten aina sama, paitsi joka kuukauden 5. päivä, voidaan säännöksi määrittää esimerkiksi:
05.[MONTH].[YEAR]
- Jos asetusarvo on muuten aina sama, paitsi kuukauden minä tahansa päivänä, voidaan säännöksi määrittää esimerkiksi:
[DAY].01.2016
- Jos asetusarvon halutaan olevan aina sama, paitsi karkauspävänä, voidaan säännöksi määrittää:
29.02.[YEAR-LEAP-YEAR]
- Jos asetusarvon halutaan olevan aina sama, paitsi helmikuun viimeinen päivä vuosina jotka eivät ole karkausvuosia, voidaan säännöksi määrittää:
28.02.[YEAR-NOT-LEAP-YEAR]
- Jos asetusarvon halutaan olevan aina sama, paitsi loppiaisena joka on viikonloppuna, voidaan säännöksi määrittää:
06.01.[YEAR-EPIPHANY-ON-WEEKEND]
- Jos asetusarvon halutaan olevan aina sama, paitsi loppiaisena joka ei ole viikonloppuna, voidaan säännöksi määrittää:
06.01.[YEAR-EPIPHANY-NOT-ON-WEEKEND]
- Jos asetusarvon halutaan olevan aina sama, paitsi edeltävänä perjantaina kun jouluaatto on viikonloppuna, voidaan säännöksi määrittää:
[CHRISTMAS-EVE] [LAST-FRIDAY-IF-ON-WEEKEND]
- Jos asetusarvon halutaan olevan aina sama, paitsi seuraavana maanantaina kun itsenäisyyspäivä on viikonloppuna, voidaan säännöksi määrittää:
[INDEPENDENCE-DAY] [NEXT-MONDAY-IF-ON-WEEKEND]
- Jos asetusarvo on muuten aina sama, paitsi tiettynä viikonpäivänä tai viikonpäivinä, voidaan säännöksi määrittää esimerkiksi:
Sunday
taiMonday,Tuesday,Wednesday,Thursday,Friday
HUOM! Viikonpäivien yhteydessä ei käytetä hakasulkuja.
- Jos asetusarvo on muuten aina sama, paitsi joka kuukauden viimeisenä päivänä, voidaan säännöksi määrittää:
[DAY].[MONTH].[YEAR] last day of this month
Poikkeuksen asettaminen SQL-lausekkeena
Poikkeusasetuksen voi tehdä myös SQL-lausekkeena. Tämä on tarkoitettu käytettäväksi tilanteissa, jolloin poikkeusasetusta ei muuten saada määritettyä. Asetuksen tekeminen tällä tavalla edellyttää SQL-kielen riittävää osaamista.
Poikkeuksia voidaan tehdä esimerkiksi niissä tapauksissa kun asetuksen arvon halutaan olevan erilainen perustuen palveluun kirjattuihin tapahtumiin tai henkilön tietoihin. Mahdollisina poikkeuksina voidaan kirjoittaa mikä tahansa SQL lauseke, joka hyödyntää UserEventData, UserData ja UserInfoData - taulujen rakennetta. SQL lauseke kirjoitetaan FROM avainsanasta alkaen.
Tarkemmat ohjeet taulujen sisältöön ja käytettävissa oleviin funktioihin on esitetty ohjesivulla Sääntöjoukon poimintasääntöjen muodostaminen. Esitetyn rakenteen lisäksi voi käyttää avainsanaa ':SalaryRenderingDate', joka korvataan SQL lausekkeessa sillä vuorokauden päivämäärällä (YYYY-MM-DD), jonka päivän sääntöjä päätellään.
Esimerkki, jossa poikkeuksella voidaan ohjata käyttämään tiettyä sääntöä kun kello 22:00 jälkeen on tehty työleimaus:
FROM UserEventData
WHERE ActivityTypeCode IN ('1')
AND StartDateTime >= :SalaryRenderingDate || ' ' || '22:00'
Esimerkki, jossa poikkeuksella voidaan ohjata käyttämään tiettyä sääntöä kun työleimaus alkaa jälkeen 22:00 ja ennen 24:00:
FROM UserEventData
WHERE ActivityTypeCode IN ('1')
AND StartDateTime >= :SalaryRenderingDate || ' ' || '22:00'
AND StartDateTime <= :SalaryRenderingDate || ' ' || '24:00'
Esimerkki, jossa poikkeuksella voidaan ohjata käyttämään tiettyä sääntöä kun henkilön oletuskalleusluokan arvo kyseisenä päivänä on 1011:
FROM UserInfoData
WHERE datetime(:SalaryRenderingDate) BETWEEN ValidFrom AND ValidTo
AND InfoTypeName = 'DefaultCostGroupCode'
AND Value = '1011'
Esimerkki, jota käytetään vain kun on kirjattu tiettyä tapahtumatyyppia ja viikonpäivä on lauantai tai sunnuntai. Viikonpäivä on 0-6, jossa sunnuntai = 0.
FROM UserEventData
WHERE ActivityTypeCode IN ('100')
AND strftime('%w',:SalaryRenderingDate) IN ('6','0')
Esimerkki, jossa määritellään milloin ansaitaan vuosilomalain mukainen 2.5 vuosilomapäivää kuukaudessa.
FROM UserInfoData WHERE InfoTypeName = 'LastWorkingContractBeginDate' AND datetime(:SalaryRenderingDate) BETWEEN ValidFrom AND ValidTo AND ( ( Value <= substr(:SalaryRenderingDate, 1,4) || '-04-01' -- contract starts earlier than 1.4 or exactly on 1.4 the salaryRenderingDate year AND :SalaryRenderingDate >= substr(:SalaryRenderingDate, 1,4) || '-04-01' -- and we live date exact or later than 1.4 on the salaryRenderingdate ) OR (
Value < CAST(CAST(substr(:SalaryRenderingDate, 1,4) AS Integer) - 1 AS Char(4)) || '-04-01' -- contract starts earlier than last year 1.4 ) )
Esimerkki, jossa määritellään milloin ansaitaan esim. KVTES-mukainen 3 vuosilomapäivää kuukaudessa (vähintään 15 vuoden työsuhde). Huom! Jos käytät myös 2.5 vuosilomapäivän poikkeussääntöä yllä, lisää tämä poikkeusasetus poikkeuslistalle ennen sitä, jotta tätä sääntöä sovelletaan ensisijaisesti jos molemmat säännöt toteutuvat.
FROM UserInfoData
WHERE InfoTypeName = 'LastWorkingContractBeginDate'
AND datetime(:SalaryRenderingDate) BETWEEN ValidFrom AND ValidTo
AND
(
(
Value <= CAST(CAST(substr(:SalaryRenderingDate, 1,4) AS Integer) - 14 AS Char(4)) || '-04-01' -- contract starts 1.4. or earlier on a year 14 years ago from day we are calculating earned annual leave days for
AND :SalaryRenderingDate >= substr(:SalaryRenderingDate, 1,4) || '-04-01' -- and day we are getting this setting for is 1.4. or later
)
OR
(
Value <= CAST(CAST(substr(:SalaryRenderingDate, 1,4) AS Integer) - 15 AS Char(4)) || '-04-01' -- contract started earlier or on 1.4. on a year 15 years ago from day we are calculating earned annual leave days for
)
)
Esimerkki, jota käytetään vain kun on kirjattu tiettyä tapahtumatyyppia ja vuoden ja viikon numero on määritellyllä listalla. Viikon numerot ovat 00-53.
FROM UserEventData
WHERE ActivityTypeCode IN ('100')
AND strftime('%Y',:startdatetime) IN ('2019')
AND strftime('%W',:startdatetime) IN ('00','01','10','11')
Esimerkki, jossa poikkeus on voimassa kun työ tapahtumatyypillä kirjattu aika ylittää 3 tuntia
FROM UserEventData
WHERE
ActivityTypeCode IN ('1')
AND DATE(startDateTime) = :SalaryRenderingDate
GROUP BY ActivityTypeCode
HAVING SUM(Amount) >= 3 * 3600
Esimerkki, jossa poikkeus on voimassa itsenäisyyspäivän viikolla, kun itsenäisyyspäivä on arkipäivänä (ma-pe).
FROM UserData
WHERE strftime('%W', :salaryRenderingDate) = strftime('%W', strftime('%Y', :salaryRenderingDate) || '-12-06')
AND CAST(strftime('%w', strftime('%Y', :salaryRenderingDate) || '-12-06') AS INTEGER) IN (1,2,3,4,5)
/* this will set the rule to apply on the week of independence day if the independence day is on monday-friday */