Ero sivun ”Projektinhallinta” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
(→‎R-koodi: TULOVASTA toimii jotenkuten)
(→‎R-koodi: nyt toimivat TULOVASTA ja TULOLOPUT)
Rivi 39: Rivi 39:
työpaketti <- "TP1"
työpaketti <- "TP1"
kustannuslaji <- "Palkka VT7"
kustannuslaji <- "Palkka VT7"
määrä <- "0"
määrä <- 0
kuvaus <- ""
kuvaus <- ""


Rivi 47: Rivi 47:


# Haetaan budjettidata ja lisätään siihen kaikki ne sarakkeet joita taulussa ei ole.
# Haetaan budjettidata ja lisätään siihen kaikki ne sarakkeet joita taulussa ei ole.
data <- op_baseGetData("opasnet_base", page)[, -c(1,2)]
out <- op_baseGetData("opasnet_base", page)[, -c(1,2)]
if(!"Laitos" %in% colnames(data)) {data <- cbind(data, data.frame(Laitos = laitos))}
if(!"Laitos" %in% colnames(out)) {out <- cbind(out, data.frame(Laitos = laitos))}
if(!"Vuosi" %in% colnames(data)) {data <- cbind(data, data.frame(Vuosi = vuosi))}
if(!"Vuosi" %in% colnames(out)) {out <- cbind(out, data.frame(Vuosi = vuosi))}
if(!"Rahoittaja" %in% colnames(data)) {data <- cbind(data, data.frame(Rahoittaja = rahoittaja))}
if(!"Rahoittaja" %in% colnames(out)) {out <- cbind(out, data.frame(Rahoittaja = rahoittaja))}
if(!"Projekti" %in% colnames(data)) {data <- cbind(data, data.frame(Projekti = projekti))}
if(!"Projekti" %in% colnames(out)) {out <- cbind(out, data.frame(Projekti = projekti))}
if(!"Työpaketti" %in% colnames(data)) {data <- cbind(data, data.frame(Työpaketti = työpaketti))}
if(!"Työpaketti" %in% colnames(out)) {out <- cbind(out, data.frame(Työpaketti = työpaketti))}
#print(xtable(data), type = 'html')
 
# Datan kuvaus lisätään jokaisen vuoden riville.
# Datan kuvaus lisätään jokaisen vuoden riville.
kuvaukset <- data[data$Vuosi == "kuvaus", !colnames(data) %in% c("Result", "Vuosi")]
kuvaukset <- out[out$Vuosi == "kuvaus", !colnames(out) %in% c("Result", "Vuosi")]
colnames(kuvaukset)[colnames(kuvaukset) == "Result.Text"] <- "kuvaus"
colnames(kuvaukset)[colnames(kuvaukset) == "Result.Text"] <- "kuvaus"
#print(xtable(kuvaukset), type = 'html')
out <- merge(out, kuvaukset)
data <- merge(data, kuvaukset)
 
## Data käännetään kuvauksen osalta leveäksi niin, että yhden alkuperäisen havaintorivin datat ovat taas samalla rivillä.
## Sen sijaan varsinaisten vuosittaisten budjettilukujen halutaankin olevan long- eikä wide-muodossa.
#data <- reshape(data, v.names = c("Result.Text"), idvar = "obs.1", timevar = "Vuosi", direction = "wide")
# Turhat (tyhjät) sarakkeet ja rivit poistetaan.  
# Turhat (tyhjät) sarakkeet ja rivit poistetaan.  
data <- data[data$Vuosi != "kuvaus", !colnames(data) %in% c("Result.Text", "obs.1")]
out <- out[out$Vuosi != "kuvaus", !colnames(out) %in% c("Result.Text", "obs.1")]
#test <- substr(colnames(data), 1, 12) %in% "Result.Text."
#test <- test & !colnames(data) %in% "Result.Text.kuvaus"
#test
#print(xtable(data), type = 'html')
#data <- data[, !test]
# Sarakkeiden nimet siistitään.
# Sarakkeiden nimet siistitään ja määrä muutetaan faktorista numeroiksi.
colnames(data)[colnames(data) == "Result"] <- "määrä"
colnames(out)[colnames(out) == "Result"] <- "määrä"
#colnames(data)[colnames(data) == "Result.Text.kuvaus"] <- "kuvaus"
out$määrä <- as.numeric(as.character(out$määrä))
# Lisätään rivi, jossa on käyttöliittymän kautta annetut tilapäisen tapahtuman tiedot.
# Lisätään rivi, jossa on käyttöliittymän kautta annetut tilapäisen tapahtuman tiedot.
temp <- data.frame(Kustannuslaji = kustannuslaji, määrä = määrä, kuvaus = kuvaus, Laitos = laitos, Vuosi = vuosi, Rahoittaja = rahoittaja, Projekti = projekti, Työpaketti = työpaketti)
temp <- data.frame(Kustannuslaji = kustannuslaji, määrä = määrä, kuvaus = kuvaus, Laitos = laitos, Vuosi = vuosi, Rahoittaja = rahoittaja, Projekti = projekti, Työpaketti = työpaketti)
#print(xtable(data), type = 'html')
out <- rbind(out, temp)
#print(xtable(temp), type = 'html')
data <- rbind(data, temp)
# Haetaan sivukulu- ja yleiskustannuskertoimet Opasnetistä, siistitään ja yhdistetään budjettiin.
# Haetaan sivukulu- ja yleiskustannuskertoimet Opasnetistä, siistitään ja yhdistetään budjettiin.
Rivi 86: Rivi 76:
colnames(kertoimet)[colnames(kertoimet)=="Result.Yleiskustannus"] <- "Yleiskustannus"
colnames(kertoimet)[colnames(kertoimet)=="Result.Yleiskustannus"] <- "Yleiskustannus"
colnames(kertoimet)[colnames(kertoimet)=="Result.sivukulu"] <- "Sivukulu"
colnames(kertoimet)[colnames(kertoimet)=="Result.sivukulu"] <- "Sivukulu"
data <- merge(data, kertoimet, all.x = TRUE)
out <- merge(out, kertoimet, all.x = TRUE)
#print(xtable(kertoimet), type = 'html')
 
# Haetaan laitoksen vaativuusluokkien keskipalkat, siistitään ja yhdistetään budjettiin.
# Haetaan laitoksen vaativuusluokkien keskipalkat, siistitään ja yhdistetään budjettiin.
palkka <- op_baseGetData("opasnet_base", "Op_fi2705")[, -c(1,2,7)]
palkka <- op_baseGetData("opasnet_base", "Op_fi2705")[, -c(1,2,7)]
colnames(palkka)[colnames(palkka)=="Result"] <- "kkpalkka"
colnames(palkka)[colnames(palkka)=="Result"] <- "kkpalkka"
colnames(palkka)[colnames(palkka)=="Vaativuusluokka"] <- "Kustannuslaji"
colnames(palkka)[colnames(palkka)=="Vaativuusluokka"] <- "Kustannuslaji"
data <- merge(data, palkka, all.x=TRUE)
out <- merge(out, palkka, all.x=TRUE)
#print(xtable(data), type='html')
 
# Budjetissa on erikseen aktiviteetin määrä (määrä) ja yksikköhinta (kkpalkka).
# Budjetissa on erikseen aktiviteetin määrä (määrä) ja yksikköhinta (kkpalkka).
# Yksikköhinta on kuukausipalkka palkoille ja euromääräisille aktiviteeteille 1.
# Yksikköhinta on kuukausipalkka palkoille ja euromääräisille aktiviteeteille 1.
data$kkpalkka <- ifelse(is.na(data$kkpalkka), 1, data$kkpalkka)
out$kkpalkka <- ifelse(is.na(out$kkpalkka), 1, out$kkpalkka)
#data$määrä
#data$kkpalkka
# Muutetaan aktiviteetit euromääräisiksi summiksi. Entinen määrä-sarake muutetaan henkilökuukausiksi.
# Muutetaan aktiviteetit euromääräisiksi summiksi. Entinen määrä-sarake muutetaan henkilökuukausiksi.
data$summa <- as.numeric(as.character(data$määrä)) * data$kkpalkka
out$summa <- out$määrä * out$kkpalkka
colnames(data)[colnames(data)=="määrä"] <- "htkk"
colnames(out)[colnames(out)=="määrä"] <- "htkk"
test <- substr(paste(data$Kustannuslaji, "    "), 1, 6) == "Palkka"
test <- substr(paste(out$Kustannuslaji, "    "), 1, 6) == "Palkka"
print(test)
 
data$htkk <- ifelse(test | substr(paste(data$kuvaus, "      "), 1, 4) == "TULO", data$htkk, 0)
out$htkk <- ifelse(test | substr(paste(out$kuvaus, "      "), 1, 4) == "TULO", out$htkk, 0)
data$Sivukulu <- ifelse(test, data$Sivukulu, 0)
out$Sivukulu <- ifelse(test, out$Sivukulu * out$summa, 0)
data$Yleiskustannus <- ifelse(test, data$Yleiskustannus, 0)
out$Yleiskustannus <- ifelse(test, out$Yleiskustannus * (out$Sivukulu + out$summa), 0)
data$Sivukulu <- data$summa * data$Sivukulu
data$Yleiskustannus <- data$Yleiskustannus * (data$Sivukulu + data$summa)


data$tulomeno <- ifelse(data$Kustannuslaji == "Tulot" | substr(paste(data$kuvaus, "    "), 1,4) == "TULO", "Tulot", "Menot")
out$tulomeno <- ifelse(out$Kustannuslaji == "Tulot" | substr(paste(out$kuvaus, "    "), 1,4) == "TULO", "Tulot", "Menot")
return(data)
# Seuraavaksi etsitään sellaiset tulot, jotka automaattisesti skaalataan jonkin määrätyn menon suuruiseksi.
}
# Vertailukohtana toimiva meno tunnistetaan indeksien arvojen avulla.
# Kehityskohde: kaikkia indeksin arvoja ei tarvitse määritellä, vaan voi käyttää "villiä korttia".
# rahoitus sisältää tiedon siitä, mitä menoja rahoitetaan ja millä prosentilla (osuus 1 tarkoittaa 100%).
rahoitus <- out[substr(paste(out$kuvaus, "    "), 1, 9) == "TULOVASTA", ]
rahoitus$osuus <- rahoitus$htkk
rahoitus <- (rahoitus[, c("Laitos", "Vuosi", "Kustannuslaji", "Rahoittaja", "Työpaketti", "Projekti", "tulomeno", "osuus")])
rahoitus$tulomeno <- "Menot"


budjettitaulu <- budjettilaskenta("Op_fi2682", rahoittaja = "STM", projekti = "Tekaisu", työpaketti = "TP1")
# Tässä lasketaan yleiskustannukset ja sivukulut, jotta ne voidaan huomioida tulotarpeessa.
# Tulo asetetaan menojen suuruiseksi.
temp <- out
#temp$summa <- out$summa + out$Yleiskustannus + out$Sivukulu
temp <- merge(temp, rahoitus)
temp$osuus <- temp$summa * temp$osuus
temp <- temp[, c("Laitos", "Vuosi", "Kustannuslaji", "Työpaketti", "Projekti", "tulomeno", "osuus")]
temp$tulomeno <- "Tulot"
out <- merge(out, temp, all.x = TRUE)
out$summa <- ifelse(is.na(out$osuus), out$summa, out$osuus)


#print(xtable(budjettitaulu), type = 'html')
# Lisätään omat rivit sivukuluille ja yleiskustannuksille.
palkat <- out[substr(paste(out$Kustannuslaji, "      "), 1, 6) == "Palkka", ]
palkat$Kustannuslaji <- "Yleiskustannus"
palkat$summa <- palkat$Yleiskustannus
out <- rbind(out, palkat)
palkat$Kustannuslaji <- "Sivukulu"
palkat$summa <- palkat$Sivukulu
out <- rbind(out, palkat)#[, !colnames(out) %in% c("Yleiskustannus", "Sivukulu", "kkpalkka", "htkk", "osuus", "kuvaus")]


TULO <- budjettitaulu[substr(paste(budjettitaulu$kuvaus, "     "), 1, 9) == "TULOVASTA", ]
out$summa <- ifelse(substr(paste(out$kuvaus, "         "), 1,9) == "TULOLOPUT", 0, out$summa)
#TULO
out$summa <- ifelse(out$tulomeno == "Tulot", out$summa, -out$summa)
#print(xtable(TULO), type = 'html')
tarve <- as.data.frame(as.table(tapply(out$summa, out[, c("Vuosi", "Työpaketti", "Projekti")], sum)))
out <- merge(out, tarve)
out$summa <- ifelse(substr(paste(out$kuvaus, "        "), 1, 9) == "TULOLOPUT", -out$htkk * out$Freq, out$summa)
out <- out[, c("Projekti", "Vuosi", "Työpaketti", "Laitos", "Rahoittaja", "Kustannuslaji", "tulomeno", "htkk", "kuvaus", "summa")]
return(out)
}


#for(i in 1:nrow(TULO)) {
out <- budjettilaskenta("Op_fi2682", rahoittaja = "STM", projekti = "Tekaisu", työpaketti = "TP1")
ehdot <- (TULO[, c("Laitos", "Vuosi", "Kustannuslaji", "Rahoittaja", "Työpaketti", "Projekti", "tulomeno", "htkk")])
print(xtable(out), type = 'html')
ehdot$tulomeno <- "Menot"
colnames(ehdot)[colnames(ehdot)=="htkk"] <- "TULO"
#print(ehdot)


#}
temp <- budjettitaulu
temp$summa <- temp$summa + temp$Yleiskustannus + temp$Sivukulu
temp <- merge(temp, ehdot)
temp$TULO <- temp$summa * as.numeric(temp$TULO)
temp <- temp[, c("Laitos", "Vuosi", "Kustannuslaji", "Työpaketti", "Projekti", "tulomeno", "TULO")]
temp$tulomeno <- "Tulot"
budjettitaulu <- merge(budjettitaulu, temp, all.x = TRUE)
budjettitaulu$summa <- ifelse(is.na(budjettitaulu$TULO), budjettitaulu$summa, budjettitaulu$TULO)
print(xtable(budjettitaulu), type = 'html')


#budjettiyhteenveto <- function(budjettitaulu, jaottelu = c(1,2,3)) {
budjettiyhteenveto <- function(budjettitaulu, jaottelu = c(1,2,3)) {
#out <- budjettitaulu
out <- budjettitaulu
#out$Sivukulu <- ifelse(substr(paste(out$kuvaus, "      "), 1, 5) == "TULO", 0, out$Sivukulu)
# Kaikki palkat muutetaan samanlaisiksi.
#out$Yleiskustannus <- ifelse(substr(paste(out$kuvaus, "      "), 1, 5) == "TULO", 0, #out$Yleiskustannus)
out$Kustannuslaji <- ifelse(substr(paste(out$Kustannuslaji, "      "), 1, 6) == "Palkka", "Palkka", as.character(out$Kustannuslaji))
#out$Sivukulu <- ifelse(substr(paste(out$kuvaus, "      "), 1, 5) == "TULO", 0, out$Sivukulu)


# palkat <- budjettitaulu[substr(paste(budjettitaulu$Kustannuslaji, "      "), 1, 6)=="Palkka", ]
# palkat$Kustannuslaji <- "Yleiskustannus"
# palkat$summa <- palkat$Yleiskustannus
# out <- rbind(budjettitaulu, palkat)
# palkat$Kustannuslaji <- "Sivukulu"
# palkat$summa <- palkat$Sivukulu
# out <- rbind(out, palkat)[, !colnames(out) %in% c("Yleiskustannus", "Sivukulu", "kkpalkka")]
#out$tulomeno <- out$Kustannuslaji
#out$tulomeno <- out$Kustannuslaji
# out$summa <- ifelse(out$Kustannuslaji=="Tulot", out$summa, -out$summa)
# out$summa <- ifelse(out$Kustannuslaji=="Tulot", out$summa, -out$summa)
# print(xtable(out), type = 'html')
jaottelu <- c("tulomeno", c("Kustannuslaji", "Työpaketti", "Vuosi", "Laitos", "Rahoittaja", "Projekti")[jaottelu])
out <- as.data.frame(as.table(tapply(out$summa, out[, jaottelu], sum)))
return(out)
}


#print(xtable(out), type='html')
out <- budjettiyhteenveto(out, jaottelu)
 
# budjettitaulu$Kustannuslaji <- ifelse(substr(paste(budjettitaulu$Kustannuslaji, "    "), 1, 6) == "Palkka", "Palkka", as.character(budjettitaulu$Kustannuslaji))
 
 
# jaottelu <- c("tulomeno", c("Kustannuslaji", "Työpaketti", "Vuosi", "Laitos", "Rahoittaja", "Projekti")[jaottelu])
# out <- as.data.frame(as.table(tapply(out$summa, out[, jaottelu], sum)))
# return(out)
# }


#out <- budjettiyhteenveto(out, jaottelu)
print(xtable(out), type='html')


#print(xtable(out), type='html')
</rcode>
</rcode>



Versio 5. marraskuuta 2011 kello 22.57




Projektinhallinta sisältää menetelmiä tutkimushankkeiden ja muiden projektien suunnitteluun, seurantaan ja hallintaan. Aikakone sisältää työajanhallintaan liittyviä osia. Tällä sivulla on menetelmiä talouden hallintaan.

Budjetin laskenta

Budjetin sarakkeet on lueteltu alla. Ne joita ei datataulussa ole annettu luodaan automaattisesti oletusarvoista.

  • Laitos
  • Vuosi
  • Rahoittaja
  • Projekti
  • Työpaketti
  • Kustannuslaji
  • määrä
  • kuvaus

Lisäksi seuraavat sarakkeet luodaan taustatietojen ja laskennan perusteella:

  • htkk
  • Yleiskustannus
  • Sivukulu
  • kkpalkka
  • summa

R-koodi

jaottelu:
Kustannuslaji
Työpaketti
Vuosi
Laitos
Rahoittaja
Projekti

+ Näytä koodi

Tällä käyttöliittymällä ohjataan budjettilaskentaa:

Voit testata budjettia tällä tilapäisellä lisätapahtumalla.

kustannuslaji:

määrä:

kuvaus:

+ Näytä koodi

Pohdintaa

Yhteenvetosivulle: projekti, sivutunniste, sivun nimi. Jotta ei tarvitse datataulussa toistaa sitä asiaa, joka on joka rivillä sama.

findident <- function(name) { SELECT obj.ident FROM obj WHERE obj.name = name

  1. HUOM. Tämä ei ota huomioon eri wikejä ja namespaceja, koska tämä tieto ei tallentune obj.nameen

}

Kuinka toimii tehtävienhallinta?

  • budjettiin kirjataan projektiin saadut työkuukaudet (työpaketeittain)
  • tehtävälistaan kirjataan luvatut tehtävät ja arvioidut kestot
  • henkilön työsuunnitelmaan tehdään aikajana siitä, mitä henkilö aikoo tehdä milloinkin. Tähän kirjataan myös lomat, sairauspoissaolot ja matkat.
  • sivulistaus listaa kaikki ne tehtävät, joita perustellusti tehdään, kun sivua päivitetään. EI TOIMI! Missä on sivulistaus? Jospa sekä sivuja että tehtäviä listataan johonkin projektiin kuuluvaksi? Tällöin voi olla yksi sivu per projekti, jossa kaikki nämä tiedot listataan. (Projekti), osaprojekti, tehtävä, henkilö, sivu. Tässä on olennaista, että tehtävät listataan henkilöittäin. Onko? Ei ole, vaan jos henkilöä ei sanota, silloin kuka tahansa projektiin kuuluva henkilö voi tehdä tehtäviä. Tämä taas toteutetaan siten, että jos tehtävän henkilöä ei mainita, kaikki tehtävää tekemään ilmoittautuneet listataan. Projektiin kuuluvat henkilöt taas listataan siten, että mainitaan projekti ja henkilö, mutta ei tehtävää eikä sivua. Tyhjä sarake tarkoittaa "mikä tahansa."
    • Usean projektin sivulla voi siis listata, että jokin sivu kuuluu osaksi sitä. Eli
  • automaattisesti käydään läpi tietoja siitä, kuka on muokannut mitäkin sivuja ja milloin. Sivuseurannan perusteella sivun päivitys jaetaan aina yhteen tehtävään siten, että automaattisesti otetaan huomioon, paljonko mitäkin tehtävää pitäisi tehdä. Tarvitaanko tätä varten erillinen lista, jossa kerrotaan tehtävätasolla se, mitä projektia katsotaan tehtävän, jos kyseinen sivul liittyy useampaan tehtävään? Pitäisikö tämä tarkastelu tehdä millä tasolla? Vaihtoehdot: projekti, osaprojekti, tehtävä. Tehtävä ei käy, koska hako pitää tehdä nimenomaan hallinnollisista syiistä ja tehtävät on jaettu toiminnallisin perustein. Hallinollisista syistä seurantatarkkuus on alaprojekti, koska esim EU:lla ei projektitaso riitä. Eli päätelmä: kukin tehtävä kytekeätän ainakin yhteen tai useampaan aliprojektiin (jos projektissa ei ole aliprojekteja, aliprojektiksi katsotaan automaattisesti projekti itse). Eli jotta homma onnistuisi, jokainen sivu pitää pystyä kytkemään yhteen tehtävään, joka puolestaan kytketään useampaan aliprojektiin.
  • Miten sitten hallitaan tehtävän tekemisen seurantaa? Jotenkin pitäisi helposti pystyä listaamaan se, missä tilanteessa tehtävä on. Tätä on melko hellppo listata suoraan tehtävälistaan, mitta sitten etenemistä pitää seurata erikseen. Entä jos tieto-oliotemlaattiin laitettaisiin parametriksi tehtävän eteneminen? Ei toimi, koska yhdellä sivulla voi olla useita tehtäviä. Entä jos hyödynnetään todota ja lisätään siihen yksi parametri, joka voidaan lukea suoraan tietokannasta? Tämä voisi toimia, mutta tehtävälistauksen seurannan pitäisi toimia myös. Jos on molemmissa tietoa, sivun todo ajaa yli tehtävälistasta. Niinpä jos halutaan seurata tilannetta, ei pidä katsoa alkuperäistä listaa vaan pitää ajaa malli, joka tekee tilannekatsauksen.
  • työajan seuranta (timetracking) korjaa päivittäin sitä, mitä itse asiassa tuli tehdyksi. Tämä ajaa yli työsuunnitelman ja sivuseurannan, jos on ristiriitoja.

Laskenta:

  • Resurssitarkistus: verrataan budjetit ja tehtävälistat toisiinsa. Kaikkiin tehtäviin pitäisi olla löydettävissä riittävästi budjettia työn tekemiseksi.
  • Työaikatarkistus: verrataan tehtävälistaa ja henkilöiden työsuunnitelmia toisiinsa. Jokaisen tehtävän pitäisi löytyä jonkun työaikasuunnitelmasta, ja työaikasuunnitelmat eivät saisi olla kohtuuttomasti ylityöllistettyjä.
  • Työtehtävien seuranta: katsotaan tehtävään suunniteltu työaika tehtävälistasta. Lisäksi katsotaan, paljonko tehtävään on oikeasti käytetty aikaa työsuunnitelman, sivuseurannan ja päivittäisen työajanseurannan perusteella.
  • Työaikaraportointi: Käydään läpi tehtyjä työtehtäviä. näistä kertyvät työtunnit allokoidaan aliprojekteille siten, että tärkeyslistalla ensimmäiset aliprojektit tulevat ensimmäisenä raportoitua. Kun jokin projekti on raportoitu, työaikaraportti on lukittava jotta laskenta ei muutu jälkikäteen. Miten? Tietty tehtävä tai aliprojekti ei kuitenkaan ole tullut valmiiksi raportointijakson päättyessä.

Pitääkö tehdä niin, että aina kun raportoidaan, kyseinen työaikalistaus kopioidaan jollekin sivulle, ja se sitten automaattisesti miinustetaan tehdyistä työajoista ensimmäisenä, ja vasta jäljelle jääneeseen työaikaan sovelletaan allokointia. Mutta sitten siitäkin tarvitaan listaus, mitä projektiraportointeja lasketaan mukaan mihinkin työaikaraportointiin. Vai tehdäänkö niin, että on yksi lista siitä, minkä projektin raportointi on missäkin, ja sitten kaikkien relevanttien projektien raportoinnit kaivetaan esiin? Tämä on hyvä.

  • Projektin tuntiraportti: projekti, aliprojekti, henkilö, alku, loppu, tehdyt tunnit. Tämä summataan sopivaan tarkkuuteen projektista riippuen, esim. EU-projekteissa henkilö, alku, loppu summataan raportointijaksolla pois, kun taas EAKR-projekteissa mitään niistä ei summata vaan raportti tehdään yksityiskohtiaan myöten. Ilmeisesti joka tapauksessa yksityiskohtainen raportti pitää tallentaa, muuten käy niin, ettei summatiedolla pystytä yksiselitteisesti laskemaan jo raportoituja tunteja pois.