Ero sivun ”Kohdistamo” versioiden välillä
(uusi rakenne ja sen mukaiset ovariablet) |
(→Vastaus: koronakide lisätty) |
||
(20 välissä olevaa versiota 2 käyttäjän tekeminä ei näytetä) | |||
Rivi 1: | Rivi 1: | ||
{{metodi}} | {{metodi}} | ||
[[op_en:Timetracker]] | [[op_en:Timetracker]] | ||
== Kysymys == | |||
Miten kirjataan työaikaa helpolla tavalla? | |||
== Vastaus == | |||
Työaikaa kirjataan alla olevalla koodilla "Tallenna kirjaus". Tällöin tallentuu käyttäjän käyttäjätunnus, valittu projekti, aloitusaika (mahdollisesti lopetusaika jos se annetaan) sekä aikaleima. Kirjauksia voi tarkastella koodilla "Hae kirjauksia". Hakua voi rajata käyttäjän, projektin ja aikakriteerin perusteella. | |||
Kirjauksissa on kaksi mahdollista aikatulkintaa. Tällä hetkellä käytetään ensimmäistä, mutta aiemmin oli käytössä jäljempi. Esimerkkinä voidaan ajatella kirjauksia, jotka sama käyttäjä on tehnyt. Ensimmäinen kirjaus on projektia A klo 1-4, toinen on projektia B klo 2-3. | |||
# Käyttäjäkohtaiset kirjaukset tulkitaan tapahtumajärjestyksessä ja loppuaika tarkoittaa kaiken työn lopettamista. Tässä tapauksessa tulkinta on, että klo 1 alkoi projekti A, klo 2 se vaihtui projektiin B, klo 3 työnteko lopetettiin ja klo 4 työnteko lopetettiin (eli kello neljän kirjaus ei vaikuta mihinkään koska tila ei muutu). Tämä tulkinta on suoraviivaisempi ja mahdollistaa työn alku- ja loppuaikojen kirjaamisen toisistaan riippumatta. | |||
# Käyttäjäkohtaiset kirjaukset tulkitaan kirjausjärjestyksessä. Toinen kirjaus siis pyyhkii yli ensimmäisen kirjauksen siltä osin kuin ne ovat päällekkäisiä. Tässä tapauksessa tulkinta on, että klo 1 alkoi projekti A, klo 2 se vaihtui projektiin B, klo 3 palattiin projektiin A ja työnteko lopetettiin klo 4. Tässä tulkinnassa on aina kirjattava alku- ja loppuajat pareina, mikä voi olla hankalaa. Funktiossa makeTimeline käytetään mergeä yhdistämään oikeat aikapisteparit toisiinsa. {{kommentti|#|Tästä voisi tehdä päivitetyn version. Alla oleva Aikakoneen makeTimeline ei liene uusin. Toinen versio löytyy sivulta [[:op_en:OpasnetUtils/Drafts#Miscellaneous functions]].|--[[Käyttäjä:Jouni|Jouni Tuomisto]] ([[Keskustelu käyttäjästä:Jouni|keskustelu]]) 10. heinäkuuta 2018 kello 12.44 (UTC)}} | |||
<rcode name="answer" embed=1 showcode=0 label="Tallenna kirjaus" variables=" | <rcode name="answer" embed=1 showcode=0 label="Tallenna kirjaus" variables=" | ||
name:työ|description:Minkä työn haluat kirjata?|type:selection|options: | name:työ|description:Minkä työn haluat kirjata?|type:selection|options: | ||
'Koronakide';Koronakide; | |||
'Ilmastovahti';Ilmastovahti; | |||
'Näkemysverkko';Näkemysverkko; | 'Näkemysverkko';Näkemysverkko; | ||
'Opetus';Opetus; | |||
'Muu kansalaisopisto';Muu kansalaisopisto; | |||
'Palkallinen vapaa';Palkallinen vapaa; | |||
'Palkaton vapaa';Palkaton vapaa; | |||
'Maahanmuutto';Maahanmuutto; | 'Maahanmuutto';Maahanmuutto; | ||
'Yhtäköyttä';Yhtäköyttä; | 'Yhtäköyttä';Yhtäköyttä; | ||
'Vesiapina';Vesiapina; | 'Vesiapina';Vesiapina; | ||
'Vesiopas';Vesiopas; | |||
'Videoblogi';Videoblogi; | 'Videoblogi';Videoblogi; | ||
'Helsingin energiaratkaisu';Helsingin energiaratkaisu; | 'Helsingin energiaratkaisu';Helsingin energiaratkaisu; | ||
Rivi 15: | Rivi 33: | ||
'Ulos';Ulos; | 'Ulos';Ulos; | ||
'Muu';Muu | 'Muu';Muu | ||
|default:' | |default:'Koronakide'| | ||
category:Työjakson tiedot| | category:Työjakson tiedot| | ||
name:jaksoko|description:Mitä haluat kirjata?|type:selection|options: | name:jaksoko|description:Mitä haluat kirjata?|type:selection|options: | ||
Rivi 35: | Rivi 53: | ||
lopputyo <- "Ulos" | lopputyo <- "Ulos" | ||
} else { | } else { | ||
alku <- as.numeric( | alku <- as.numeric(as.POSIXct(date(), format="%c")) | ||
loppu <- NULL | loppu <- NULL | ||
lopputyo <- NULL | lopputyo <- NULL | ||
Rivi 41: | Rivi 59: | ||
out <- data.frame( | out <- data.frame( | ||
Timestamp = | Timestamp = as.POSIXct(date(), format="%c"), | ||
Work = c(alkutyo, lopputyo), | Work = c(alkutyo, lopputyo), | ||
Person = wiki_username, | Person = wiki_username, | ||
Rivi 49: | Rivi 67: | ||
opbase.upload(input = out, ident = "Op_fi3948", name = "Kohdistamo", subset = "Kirjaukset2", | opbase.upload(input = out, ident = "Op_fi3948", name = "Kohdistamo", subset = "Kirjaukset2", | ||
obj_type = "variable", act_type = "append", language = "fin", who = wiki_username) | obj_type = "variable", act_type = "append", language = "fin", who = wiki_username) | ||
cat("Kirjaus onnistui. Nämä tiedot tallennettiin.\n") | |||
out$Result <- as.character(as.POSIXct(out$Result, origin="1970-01-01 00:00:00")) | out$Result <- as.character(as.POSIXct(out$Result, origin="1970-01-01 00:00:00")) | ||
oprint(out) | oprint(out) | ||
Rivi 57: | Rivi 74: | ||
<rcode graphics=1 name="output" embed=1 showcode=0 label="Hae kirjauksia" variables=" | |||
<rcode graphics= | |||
category:Hae kirjauksia| | category:Hae kirjauksia| | ||
name:alku|description:Seurantajakson alku|type:date|default:2018-06-01| | name:alku|description:Seurantajakson alku|type:date|default:2018-06-01| | ||
Rivi 65: | Rivi 81: | ||
name:projekti|description:Projekti|type:selection|options: | name:projekti|description:Projekti|type:selection|options: | ||
'Kaikki';Kaikki; | 'Kaikki';Kaikki; | ||
'Näkemysverkko';Näkemysverkko | 'Näkemysverkko';Näkemysverkko; | ||
'STM raportointi ja laskutus';STM raportointi ja laskutus; | 'STM raportointi ja laskutus';STM raportointi ja laskutus; | ||
'EU raportointi ja laskutus';EU raportointi ja laskutus; | 'EU raportointi ja laskutus';EU raportointi ja laskutus; | ||
Rivi 97: | Rivi 113: | ||
|default:'Kaikki' | |default:'Kaikki' | ||
"> | "> | ||
library(OpasnetUtils) | |||
#library(ggplot2) | |||
objects.latest("Op_fi3948", code_name = "alusta") # kirjausajat | |||
kirjausajat <- EvalOutput(kirjausajat) | |||
result(kirjausajat) <- as.character(as.POSIXct(result(kirjausajat), origin="1970-01-01 00:00:00")) | |||
oprint(kirjausajat@output) | |||
objects.latest("Op_en6007",code_name="timelineplot") | |||
timelineplot(kirjausajat)+labs(title="Työtunnit aikajanalla") | |||
</rcode> | |||
<rcode name="answer" embed=1 showcode=0 label="Poista kirjaus" variables=" | |||
name:nro|description:Poistettavan kirjauksen rivinumero (Obs)|type:text| | |||
category:Kirjauksen poisto| | |||
name:syy|description:Poiston syy|type:text | |||
"> | |||
library(OpasnetUtils) | |||
nro <- gsub("\\s", "", unlist(strsplit(nro, ","))) # Pilkotaan pilkusta ja poistetaan alku- ja loppuvälilyönnit | |||
dat <- data.frame( | |||
Timestamp = as.POSIXct(date(), format="%c"), | |||
User = wiki_username, | |||
Syy = syy, | |||
Result = nro | |||
) | |||
opbase.upload(input = dat, ident = "Op_fi3948", name = "Kohdistamo", subset = "Kirjauspoistot2", | |||
act_type = "append", language = "fin", who = wiki_username | |||
) | |||
cat("Nämä kirjaukset poistettu onnistuneesti.\n") | |||
oprint(dat) | |||
</rcode> | |||
* Katso ohjeita sivulta [[Kohdistamo/Ohje]] | |||
* {{tuloslinkki}} | |||
<rcode label="Saldoseuranta" graphics=1 embed=1> | |||
library(OpasnetUtils) | library(OpasnetUtils) | ||
library(ggplot2) | library(ggplot2) | ||
objects.latest(" | objects.latest("Op_fi3948", code_name = "alusta") # kirjausajat | ||
tekija <- "Varpu Vidgren" | |||
projekti <- "Kaikki" | |||
alku <- "2018-08-01" | |||
loppu <- "2099-01-01" | |||
kirjausajat <- EvalOutput(kirjausajat) | |||
kirjausajat <- kirjausajat[kirjausajat$Work!="Ulos",] | |||
cat("Tarkastellaan aikaväliä", alku, " - ", loppu, "\n") | |||
durat <- kirjausajat | |||
colnames(durat@output)[match(c("kirjausajatResult","Duration"),colnames(durat@output))] <- c("Time","kirjausajatResult") | |||
durat <- unkeep(durat, "Timestamp", sources=TRUE) | |||
durat$Time <- as.Date(as.POSIXct(durat$Time,origin="1970-01-01")) | |||
dat <- seq.Date(min(durat$Time),to=max(durat$Time),by=1) | |||
dat <- dat[!weekdays(dat, abbreviate = TRUE) %in% c("la","su","Sat","Sun")] | |||
odote <- EvalOutput(Ovariable( | |||
"odote", | |||
data=data.frame( | |||
Work = "odote", | |||
Person = NA, | |||
Time= dat, | |||
Result = -7.35, # This applies only if every person has equal working time | |||
stringsAsFactors = FALSE | |||
) | |||
)) | |||
tst <- combine(durat,odote, name="tst") | |||
tst@output <- fillna(tst@output, "Person") | |||
tmp <- oapply(tst, cols="Work",FUN=sum) | |||
cat("Henkilöiden työaikasaldo", as.character(max(tmp$Time)),":\n") | |||
oprint(oapply(tmp, "Person", FUN=sum)@output) | |||
ggplot(tmp@output, aes(x=Time, y=cumsum(tstResult),colour=Person))+geom_line()+ | |||
theme_gray(base_size=24)+ | |||
labs( | |||
title="Työajan kumulatiivinen saldo", | |||
y="Työtuntisaldo (h)", | |||
x="Kalenteriaika" | |||
) | |||
result(kirjausajat) <- as.character(as.POSIXct(result(kirjausajat), origin="1970-01-01 00:00:00")) | |||
oprint(kirjausajat@output) | |||
</rcode> | |||
== Perustelut == | |||
=== Laskenta === | |||
<rcode name="alusta" label="Alusta ovariablet kirjaukset, kirjauspoistot, kirjausajat" embed=1> | |||
# Tämä on koodi Op_fi3948/alusta sivulla [[Kohdistamo]] | |||
library(OpasnetUtils) | |||
kirjaukset <- Ovariable( | kirjaukset <- Ovariable( | ||
Rivi 125: | Rivi 242: | ||
"Op_fi3948/alusta", # [[Kohdistamo]] | "Op_fi3948/alusta", # [[Kohdistamo]] | ||
"Op_fi3948/alusta", # [[Kohdistamo]] | "Op_fi3948/alusta", # [[Kohdistamo]] | ||
"Op_fi3948/oletukset", # [[Kohdistamo]] | |||
"Op_fi3948/oletukset", # [[Kohdistamo]] | |||
"Op_fi3948/oletukset", # [[Kohdistamo]] | |||
"Op_fi3948/oletukset" # [[Kohdistamo]] | |||
) | ) | ||
), | ), | ||
formula = function(...) { | formula = function(...) { | ||
dat <- kirjaukset[-na.omit(result(kirjauspoistot)) , ] | dat <- kirjaukset[-na.omit(result(kirjauspoistot)) , ] | ||
alk <- as.numeric(as.POSIXct(alku)) | |||
lop <- as.numeric(as.POSIXct(loppu)) | |||
#tuntikirjaus <- opbase.data("Op_fi3950.tuntikirjaus") | #tuntikirjaus <- opbase.data("Op_fi3950.tuntikirjaus") | ||
Rivi 144: | Rivi 264: | ||
if(tekija!='Kaikki') { | if(tekija!='Kaikki') { | ||
tekija <- | tekija <- trimws(unlist(strsplit(tekija, ","))) | ||
dat <- dat[dat$Person %in% tekija , ] | dat <- dat[dat$Person %in% tekija , ] | ||
} | } | ||
dat <- dat[order(dat$Person, result(dat)),] | |||
res <- result(dat) | res <- result(dat) | ||
dat$Duration <- c(res[2:length(res)] - res[1:(length(res)-1)], 0) / 3600 | |||
dat$Duration <- c(res[2:length(res)] - res[1:(length(res)-1)], 0) # | # This removes the last entry from each person's duration because that is calculated wrongly. | ||
dat$Duration[c(match(unique(dat$Person),dat$Person)-1,length(dat$Person))] <- 0 | |||
if(projekti!="Kaikki") dat <- dat[dat$Work == projekti , ] | if(projekti!="Kaikki") dat <- dat[dat$Work == projekti , ] | ||
res <- result(dat) | |||
dat <- dat[res >= alk & res <= lop +3600*24 , ] | |||
if(nrow(dat@output)==0) { | |||
warning("No rows to display\n") | |||
return(dat) | |||
} | |||
tyoaika <- aggregate(dat@output["Duration"], dat@output[c("Person","Work")], sum) | |||
tyoaika <- tyoaika[tyoaika$Work!="Ulos",] | |||
tyoaika <- aggregate(dat["Duration"], dat["Person"], sum | |||
cat("Valitulla välillä tehty työaika yhteensä ", sum(tyoaika$Duration), " tuntia.\n") | |||
oprint(tyoaika) | |||
return(dat) | return(dat) | ||
} | } | ||
) | ) | ||
objects.store(kirjaukset, kirjauspoistot, kirjausajat) | |||
cat("Ovariablet kirjaukset, kirjauspoistot ja kirjausajat tallennettu.\n") | |||
</rcode> | |||
<rcode name="oletukset" label="Alusta oletusarvot alku, loppu, tekija, projekti" embed=1> | |||
# Tämä on koodi Op_fi3948/oletukset sivulla [[Kohdistamo]] | |||
library(OpasnetUtils) | library(OpasnetUtils) | ||
alku <- "2018-06-01" | |||
loppu <- "2099-01-01" | |||
tekija <- "Kaikki" | |||
projekti <- "Kaikki" | |||
objects.store(alku, loppu, tekija, projekti) | |||
cat("Vektorit alku, loppu, tekija ja projekti tallennettu.\n") | |||
</rcode> | </rcode> | ||
=== Aikakoneen laskenta === | |||
== Aikakoneen laskenta == | |||
Tässä on siistitty ja dokumentoitu versio [[Aikakone]]en makeTimeline-funktiosta, joka ottaa sisäänsä työajan alku- ja loppuaikoja ja tuottaa aikajanan. Funktion olennainen lisäarvo on siinä, että sille voi antaa päällekkäisiä ajanjaksoja, ja se korvaa vanhemmat kirjaukset (eli ylempänä taulukossa olevat) uudemmilla, jos niiissä on päällekkäisyyksiä. Toinen lisäarvo on se, että se automaattisesti käsittelee jokaisen henkilön ajankäyttöä erikseen, mutta muiden indeksien suhteen se vain periyttää tiedot aikajanalle. Muita indeksejä voi siis käyttää tarpeen mukaan. | Tässä on siistitty ja dokumentoitu versio [[Aikakone]]en makeTimeline-funktiosta, joka ottaa sisäänsä työajan alku- ja loppuaikoja ja tuottaa aikajanan. Funktion olennainen lisäarvo on siinä, että sille voi antaa päällekkäisiä ajanjaksoja, ja se korvaa vanhemmat kirjaukset (eli ylempänä taulukossa olevat) uudemmilla, jos niiissä on päällekkäisyyksiä. Toinen lisäarvo on se, että se automaattisesti käsittelee jokaisen henkilön ajankäyttöä erikseen, mutta muiden indeksien suhteen se vain periyttää tiedot aikajanalle. Muita indeksejä voi siis käyttää tarpeen mukaan. | ||
<rcode embed=1> | <rcode embed=1> |
Nykyinen versio 16. maaliskuuta 2022 kello 08.28
Moderaattori:Ei ole (katso kaikki) Kuinka ryhtyä moderaattoriksi? Sivun edistymistä ei ole arvioitu. Arvostuksen määrää ei ole arvioitu (ks. peer review). |
Lisää dataa
|
Kysymys
Miten kirjataan työaikaa helpolla tavalla?
Vastaus
Työaikaa kirjataan alla olevalla koodilla "Tallenna kirjaus". Tällöin tallentuu käyttäjän käyttäjätunnus, valittu projekti, aloitusaika (mahdollisesti lopetusaika jos se annetaan) sekä aikaleima. Kirjauksia voi tarkastella koodilla "Hae kirjauksia". Hakua voi rajata käyttäjän, projektin ja aikakriteerin perusteella.
Kirjauksissa on kaksi mahdollista aikatulkintaa. Tällä hetkellä käytetään ensimmäistä, mutta aiemmin oli käytössä jäljempi. Esimerkkinä voidaan ajatella kirjauksia, jotka sama käyttäjä on tehnyt. Ensimmäinen kirjaus on projektia A klo 1-4, toinen on projektia B klo 2-3.
- Käyttäjäkohtaiset kirjaukset tulkitaan tapahtumajärjestyksessä ja loppuaika tarkoittaa kaiken työn lopettamista. Tässä tapauksessa tulkinta on, että klo 1 alkoi projekti A, klo 2 se vaihtui projektiin B, klo 3 työnteko lopetettiin ja klo 4 työnteko lopetettiin (eli kello neljän kirjaus ei vaikuta mihinkään koska tila ei muutu). Tämä tulkinta on suoraviivaisempi ja mahdollistaa työn alku- ja loppuaikojen kirjaamisen toisistaan riippumatta.
- Käyttäjäkohtaiset kirjaukset tulkitaan kirjausjärjestyksessä. Toinen kirjaus siis pyyhkii yli ensimmäisen kirjauksen siltä osin kuin ne ovat päällekkäisiä. Tässä tapauksessa tulkinta on, että klo 1 alkoi projekti A, klo 2 se vaihtui projektiin B, klo 3 palattiin projektiin A ja työnteko lopetettiin klo 4. Tässä tulkinnassa on aina kirjattava alku- ja loppuajat pareina, mikä voi olla hankalaa. Funktiossa makeTimeline käytetään mergeä yhdistämään oikeat aikapisteparit toisiinsa. --# Tästä voisi tehdä päivitetyn version. Alla oleva Aikakoneen makeTimeline ei liene uusin. Toinen versio löytyy sivulta op_en:OpasnetUtils/Drafts#Miscellaneous functions. --Jouni Tuomisto (keskustelu) 10. heinäkuuta 2018 kello 12.44 (UTC)
- Katso ohjeita sivulta Kohdistamo/Ohje
- {{#opasnet_base_link:Op_fi3948}}
Perustelut
Laskenta
Aikakoneen laskenta
Tässä on siistitty ja dokumentoitu versio Aikakoneen makeTimeline-funktiosta, joka ottaa sisäänsä työajan alku- ja loppuaikoja ja tuottaa aikajanan. Funktion olennainen lisäarvo on siinä, että sille voi antaa päällekkäisiä ajanjaksoja, ja se korvaa vanhemmat kirjaukset (eli ylempänä taulukossa olevat) uudemmilla, jos niiissä on päällekkäisyyksiä. Toinen lisäarvo on se, että se automaattisesti käsittelee jokaisen henkilön ajankäyttöä erikseen, mutta muiden indeksien suhteen se vain periyttää tiedot aikajanalle. Muita indeksejä voi siis käyttää tarpeen mukaan.