Ero sivun ”Kohdistamo” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
(Koodia kommentoitu)
(→‎Vastaus: koronakide lisätty)
 
(83 välissä olevaa versiota 6 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
{{metodi}}
[[op_en:Timetracker]]
[[op_en:Timetracker]]
<rcode name="answer" embed=1 showcode=-1 label="Tallenna kirjaus" variables="
== Kysymys ==
name:työ|description:Minkä työn haluat kirjata?|type:selection|options:
 
'STM raportointi ja laskutus';STM raportointi ja laskutus;
Miten kirjataan työaikaa helpolla tavalla?
'EU raportointi ja laskutus';EU raportointi ja laskutus;
 
'TEKES raportointi ja laskutus';TEKES raportointi ja laskutus;
== Vastaus ==
'SA raportointi ja laskutus';SA raportointi ja laskutus;
 
'ESR/EAKR raportointi ja laskutus';ESR/EAKR raportointi ja laskutus;
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.
'MUUT  raportointi ja laskutus';MUUT  raportointi ja laskutus;
 
'Budjettirahoitus';Budjettirahoitus;
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.
'Tilintarkastus';Tilintarkastus;
# 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.
'Yleinen projektinhallinta ja neuvonta';Yleinen projektinhallinta ja neuvonta;
# 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)}}
'Kehittäminen';Kehittäminen;
 
'Koulutus';Koulutus;
<rcode name="answer" embed=1 showcode=0 label="Tallenna kirjaus" variables="
'Sisäiset palaverit';Sisäiset palaverit;
name:työ|description:Minkä työn haluat kirjata?|type:selection|options:
'Vuosibudjetointi';Vuosibudjetointi;
  'Koronakide';Koronakide;
'Tilinpäätös';Tilinpäätös;
  'Ilmastovahti';Ilmastovahti;
'Oletus';Oletus;
  'Näkemysverkko';Näkemysverkko;
'Ulos';Ulos;
  'Opetus';Opetus;
'Muu';Muu
  'Muu kansalaisopisto';Muu kansalaisopisto;
|default:'Oletus'|
  'Palkallinen vapaa';Palkallinen vapaa;
category:Henkilötietoa ei tarvitse antaa, jos olet kirjautuneena Opasnetiin|
  'Palkaton vapaa';Palkaton vapaa;
name:aika|description:Milloin aloitit?|type:datetime|
  'Maahanmuutto';Maahanmuutto;
name:lopetus|description:Korvaa aiemmat kirjaukset annetusta hetkestä eteenpäin|type:selection|
  'Yhtäköyttä';Yhtäköyttä;
options:FALSE;Ei, tätä vain seuraavaan merkintään asti.;TRUE;Kyllä, annan loppuajan|default:FALSE|
  'Vesiapina';Vesiapina;
name:muutyö|description:Muu työ, mikä?|type:text|
  'Vesiopas';Vesiopas;
category:Listalta puuttuva työ|category_conditions:työ;'Muu'|
  'Videoblogi';Videoblogi;
name:loppu|description:Mihin asti tämä työ jatkuu?|type:datetime|
  'Helsingin energiaratkaisu';Helsingin energiaratkaisu;
category:Loppuaika|category_conditions:lopetus;TRUE
  'Yleiset Opasnet-työt';Yleiset Opasnet-työt;
  'Helsingin ilmastokartta 2';Helsingin ilmastokartta 2;
  'Oletus';Oletus;
  'Ulos';Ulos;
  'Muu';Muu
|default:'Koronakide'|
category:Työjakson tiedot|
name:jaksoko|description:Mitä haluat kirjata?|type:selection|options:
FALSE;Annan nykyhetken aloitusajaksi;
TRUE;Annan työn alku- ja loppuhetken käsin|
default:FALSE|
name:muutyö|description:Muu työ, mikä?|type:text|
category:Listalta puuttuva työ|category_conditions:työ;'Muu'|
name:alku|description:Milloin aloitit?|type:datetime|
category:Jakson ajoitus|category_conditions:jaksoko;TRUE|
name:loppu|description:Mihin asti tämä työ jatkui?|type:datetime
">
">
library(OpasnetUtils)
library(OpasnetUtils)
alkutyo <- ifelse(työ == 'Muu', muutyö, työ)
if(jaksoko) {
  alku <- as.numeric(alku)
  loppu <- as.numeric(loppu)
  lopputyo <- "Ulos"
} else {
  alku <- as.numeric(as.POSIXct(date(), format="%c"))
  loppu <- NULL
  lopputyo <- NULL
}


out <- data.frame(
out <- data.frame(
Työ = ifelse(työ == 'Muu', muutyö, työ),
  Timestamp = as.POSIXct(date(), format="%c"),
Henkilö = wiki_username,
  Work = c(alkutyo, lopputyo),
Aika = ifelse(lopetus, as.character(aika), as.character(Sys.time())),
  Person = wiki_username,
Loppu = ifelse(lopetus, as.character(loppu), NA),
  Result = c(alku, loppu)
Result = 0
)
)


opbase.upload(input = out, ident = "Op_fi3948", name = "Kohdistamo", subset = "Kirjaukset",  
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"))
oprint(out)
</rcode>
 
 
<rcode graphics=1 name="output" embed=1 showcode=0 label="Hae kirjauksia" variables="
category:Hae kirjauksia|
name:alku|description:Seurantajakson alku|type:date|default:2018-06-01|
name:loppu|description:Seurantajakson loppu|type:date|
name:tekija|description:Työntekijän käyttäjätunnus|type:text|default:Kaikki|
name:projekti|description:Projekti|type:selection|options:
'Kaikki';Kaikki;
'Näkemysverkko';Näkemysverkko;
'STM raportointi ja laskutus';STM raportointi ja laskutus;
'EU raportointi ja laskutus';EU raportointi ja laskutus;
'TEKES raportointi ja laskutus';TEKES raportointi ja laskutus;
'SA raportointi ja laskutus';SA raportointi ja laskutus;
'ESR/EAKR raportointi ja laskutus';ESR/EAKR raportointi ja laskutus;
'MUUT  raportointi ja laskutus';MUUT  raportointi ja laskutus;
'Budjettirahoitus';Budjettirahoitus;
'Tilintarkastus';Tilintarkastus;
'Yleinen projektinhallinta ja neuvonta';Yleinen projektinhallinta ja neuvonta;
'Kehittäminen';Kehittäminen;
'Koulutus';Koulutus;
'Sisäiset palaverit';Sisäiset palaverit;
'Vuosibudjetointi';Vuosibudjetointi;
'Tilinpäätös';Tilinpäätös;
'Pneumokokkirokote';Pneumokokkirokote;
'LVM-tulevaisuuskatsaus';LVM-tulevaisuuskatsaus;
'H2O';H2O;
'Helsingin ilmastokartta';Helsingin ilmastokartta;
'Helsingin ilmastokartta 2';Helsingin ilmastokartta 2;
'Hyvinvointi kestävän kasvun perustana';Hyvinvointi kestävä kasvun perustana;
'IEHIAS';IEHIAS;
'Avoimen tieteen tiekartta';Avoimen tieteen tiekartta;
'Helsingin energiaratkaisu';Helsingin energiaratkaisu;
'Yleiset Opasnet-työt';Yleiset Opasnet-työt;
'Yhtäköyttä';Yhtäköyttä;
'Maahanmuutto';Maahanmuutto;
'Vesiapina';Vesiapina;
'Oletus';Oletus;
'Muu';Muu
|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
)
)


cat("Kirjaus onnistui. Nämä tiedot tallennettiin\n")
opbase.upload(input = dat, ident = "Op_fi3948", name = "Kohdistamo", subset = "Kirjauspoistot2",
oprint(out[colnames(out) != "Result"])
              act_type = "append", language = "fin", who = wiki_username
)
 
cat("Nämä kirjaukset poistettu onnistuneesti.\n")
 
oprint(dat)
 
</rcode>
</rcode>


* Katso ohjeita sivulta [[Kohdistamo/Ohje]]
* {{tuloslinkki}}
<rcode label="Saldoseuranta" graphics=1 embed=1>
library(OpasnetUtils)
library(ggplot2)
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>


'''Kirjausten poiston koodi vielä työn alla. Älä käytä.'''
== Perustelut ==


Mieluummin käytetään wikimuotoiluja kuin htmlää. Katso myös kommentti koodin alta.
=== Laskenta ===


<rcode name="answer" embed=1 showcode=-1 label="Poista merkintä" variables="
<rcode name="alusta" label="Alusta ovariablet kirjaukset, kirjauspoistot, kirjausajat" embed=1>
name:merkintä|description:Minkä kirjauksen haluat poistaa?|type:text|
# Tämä on koodi Op_fi3948/alusta sivulla [[Kohdistamo]]
category:Kirjauksen poisto|
name:syy|description:Miksi poistat tämän kirjauksen?|type:text
">


library(OpasnetUtils)
library(OpasnetUtils)
dat <- dat[dat$Obs == merkintä , ]
dat2 <- data.frame(Kommenttinro = merkintä, Syy = syy, Result = 0)


#opbase.upload(input = dat2, ident = "Op_fi3948", name = "Kohdistamo", subset = "Kirjaukset", obj_type = "variable", act_type = "replace", language = "fin", who = wiki_username)
kirjaukset <- Ovariable(
  "kirjaukset",
  ddata = "Op_fi3948", subset="Kirjaukset2",getddata=FALSE
)
 
kirjauspoistot <- Ovariable(
  "kirjauspoistot",
  ddata="Op_fi3948", subset="Kirjauspoistot2", getddata=FALSE
)
 
kirjausajat <- Ovariable(
  "kirjausajat",
  dependencies = data.frame(
    Name=c(
      "kirjaukset",
      "kirjauspoistot",
      "alku",
      "loppu",
      "tekija",
      "projekti"
    ),
    Ident=c(
      "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(...) {
   
    dat <- kirjaukset[-na.omit(result(kirjauspoistot)) , ]
    alk <- as.numeric(as.POSIXct(alku))
    lop <- as.numeric(as.POSIXct(loppu))
   
    #tuntikirjaus <- opbase.data("Op_fi3950.tuntikirjaus")
    #työtehtävät <- opbase.data("Op_fi3950.tyotehtavat")
    #työsuunnitelma <- opbase.data("Op_fi3950.tyosuunnitelma")
    #tuntikirjaus <- tuntikirjaus[colnames(tuntikirjaus) != "Obs"]
    #työtehtävät <- työtehtävät[colnames(työtehtävät) != "Obs"]
    #työsuunnitelma <- työsuunnitelma[colnames(työsuunnitelma) != "Obs"]
    #colnames(työsuunnitelma)[colnames(työsuunnitelma) == "Result"] <- "Loppu"
    #työsuunnitelma <- data.frame(työsuunnitelma, Henkilö = "Jouni")
   
    if(tekija!='Kaikki') {
      tekija <- trimws(unlist(strsplit(tekija, ",")))
      dat <- dat[dat$Person %in% tekija , ]
    }
    dat <- dat[order(dat$Person, result(dat)),]
    res <- result(dat)
    dat$Duration <- c(res[2:length(res)] - res[1:(length(res)-1)], 0) / 3600
    # 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 , ]
    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",]
   
    cat("Valitulla välillä tehty työaika yhteensä ", sum(tyoaika$Duration), " tuntia.\n")
    oprint(tyoaika)
   
    return(dat)
  }
)
 
objects.store(kirjaukset, kirjauspoistot, kirjausajat)
cat("Ovariablet kirjaukset, kirjauspoistot ja kirjausajat tallennettu.\n")
</rcode>


cat("Kirjaus poistettu onnistuneesti.\n")
<rcode name="oletukset" label="Alusta oletusarvot alku, loppu, tekija, projekti" embed=1>
# Tämä on koodi Op_fi3948/oletukset sivulla [[Kohdistamo]]


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>


Tässä ei voi käyttää act_type = "replace" koska se siirtää kaikki aiemmat merkinnät arkistoon ja aloittaa uuden listauksen. Luo sen sijaan uusi taulu johon laitetaan poistomerkinnät. Kun merkintöjä näytetään, tiedot haetaan molemmista tauluista ja vain poistamattomat näytetään. Katso mallia koodeista [[Kommentointityökalu]].
=== Aikakoneen laskenta ===


* Katso ohjeita sivulta [[Kohdistamo/Ohje]]
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.
* {{tuloslinkki}}
 
<rcode embed=1>
library(OpasnetUtils)
 
makeTimeline2 <- function (
events, # data.frame with time cols (start and end) and possibly other indices. One index may separate individuals.
cols = c("Alku", "Loppu"), # Names of the start and end time columns
personcol = NULL # Name of the column defining individuals, if any
) {
 
if (!is.numeric(events[cols[1]])) { # If not numeric, assume a time format.
for (m in 1:2) {
events[[cols[m]]] <- as.POSIXct(events[[cols[m]]], tz = "Europe/Helsinki")
}
}
if(is.null(personcol)) { # Make a temporary column for individuals
personcol <- "Persontemp"
events$Persontemp <- "Temp"
}
out <- data.frame()
 
for(k in as.character((unique(events[[personcol]])))) { # Look at each individual's events separately.
event <- events[events[[personcol]] == k , colnames(events) != personcol]
# timeline is a data.frame with all starts and ends as one timeline.
# Events down in the "event" data.frame replace previous events higher in "event", if they overlap.
timeline <- data.frame(Time = min(event[[cols[1]]]), Eventrow = nrow(event) + 1) # First time point
for (i in 1:nrow(event)) { # Go through each row and replace the time slot in timeline with the event.
 
temp <- data.frame(
Time = event[i , cols[1]],
End = event[i , cols[2]],
EventrowStart = i # Eventrows are used temporarily. In the end they are replaced with all indices in event.
)
# Add new time points to the timeline with the event row mentioned.
timeline <- merge(timeline, temp[c("Time", "EventrowStart")], all = TRUE)
colnames(temp) <- c("Remove", "Time", "EventrowEnd")
timeline <- merge(timeline, temp[, c("Time", "EventrowEnd")], all = TRUE)
 
# Go through intermediate time points and replace them with the new event.
for (j in 2:nrow(timeline)) {
if (is.na(timeline$Eventrow[j])) {
timeline$Eventrow[j] <- timeline$Eventrow[j - 1]
}
if (is.na(timeline$EventrowStart[j]) & is.na(timeline$EventrowEnd[j])) {
timeline$EventrowStart[j] <- timeline$EventrowStart[j - 1]
}
}
# If the Eventrow is not a start, it must be an end.
timeline$Eventrow <- ifelse(!is.na(timeline$EventrowStart), timeline$EventrowStart, timeline$Eventrow)
timeline <- timeline[, c("Time", "Eventrow")]
}
# Add one row for the last timepoint.
event <- rbind(event, rep(NA, ncol(event)))
event[nrow(event) , cols[1]] <- max(timeline$Time)
event$Eventrow <- row(event)[ , 1]
 
# Bring back the other indices from event.
timeline <- merge(timeline, event)
timeline <- timeline[order(timeline$Time), ]
timeline <- timeline[!colnames(timeline) %in% c("Eventrow", cols)]
if(personcol != "Persontemp") timeline[[personcol]] <- k
 
out <- rbind(out, timeline)
}
# Calculate the durations of each time slot in the timeline.
out$Duration <- out$Time[c(2:nrow(out), NA)] - out$Time
# Remove the last duration value from each individual's timeline.
temp <- out[[personcol]]
out$Duration <- ifelse(temp[c(2:length(temp), NA)] != temp | 1:length(temp) == length(temp), 0, out$Duration)
 
return(out)
}
 
events <- data.frame(
Projekti = c("LVM", "LVM", "Pneumokokki"),
Alku = c("2014-07-14 12:00", "2014-07-15 13:00", "2014-07-14 12:30"),
Loppu = c("2014-07-14 14:00", "2014-07-15 14:15", "2014-07-15 14:00"),
Person = c("Heikki", "Ville", "Ville")
)
 
dat <- makeTimeline2(events, cols = c("Alku", "Loppu"), personcol = "Person")
 
cat("Lähtödata\n")
 
oprint(events)
 
cat("Aikajana. Tapahtumien kestot ovat minuutteina.\n")
 
dat$Time <- format(dat$Time) # Convert times from POSIXct to character.
 
oprint(dat)
 
</rcode>

Nykyinen versio 16. maaliskuuta 2022 kello 08.28


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.

  1. 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.
  2. 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)

Työjakson tiedot

Minkä työn haluat kirjata?:

Mitä haluat kirjata?:

Listalta puuttuva työ

Muu työ, mikä?:

Jakson ajoitus

Milloin aloitit?:
..-::

Mihin asti tämä työ jatkui?:
..-::

+ Näytä koodi


Hae kirjauksia

Seurantajakson alku:
..

Seurantajakson loppu:
..

Työntekijän käyttäjätunnus:

Projekti:

+ Näytä koodi

Kirjauksen poisto

Poistettavan kirjauksen rivinumero (Obs):

Poiston syy:

+ Näytä koodi


+ Näytä koodi

Perustelut

Laskenta

+ Näytä koodi

+ Näytä koodi

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.

+ Näytä koodi