Ero sivun ”Projektinhallinta” versioiden välillä
(pohdintaa) |
(budjettitaulun luonti onnistuu mutta yhteenveto päivittämättä) |
||
Rivi 3: | Rivi 3: | ||
===Budjetin laskenta=== | ===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 | |||
<rcode name="budjetti"> | <rcode name="budjetti"> | ||
Rivi 8: | Rivi 25: | ||
library(xtable) | library(xtable) | ||
####Budjettilaskenta: suunnitelluista palkka- ja muista menoista lasketaan kokonaisbudjetti. | ####Budjettilaskenta: suunnitelluista palkka- ja muista menoista lasketaan kokonaisbudjetti. | ||
#page <- "Op_fi2682" | |||
#laitos <- "THL" | |||
#vuosi <- "2012" | |||
#rahoittaja <- "Suomen Akatemia" | |||
#projekti <- "Projekti" | |||
#työpaketti <- "Työpaketti" | |||
kustannuslaji <- "Palkka VT7" | |||
määrä <- "0" | |||
kuvaus <- "" | |||
budjettilaskenta <- function(page, laitos = "THL", vuosi = "2012", rahoittaja = "Suomen Akatemia", projekti = "Projekti", työpaketti = "Työpaketti") { | |||
data <- op_baseGetData("opasnet_base", page)[, -c(1,2)] | data <- op_baseGetData("opasnet_base", page)[, -c(1,2)] | ||
data <- reshape(data, idvar = "obs.1", timevar = "Havainto", direction = "wide")[, -c(1,4,5,6)] | #head(data) | ||
colnames(data) <- c("Kustannuslaji", "määrä", "kuvaus") | if(!"Laitos" %in% colnames(data)) {data <- cbind(data, data.frame(Laitos = laitos))} | ||
if(!"Vuosi" %in% colnames(data)) {data <- cbind(data, data.frame(Vuosi = vuosi))} | |||
if(!"Rahoittaja" %in% colnames(data)) {data <- cbind(data, data.frame(Rahoittaja = rahoittaja))} | |||
if(!"Projekti" %in% colnames(data)) {data <- cbind(data, data.frame(Projekti = projekti))} | |||
if(!"Työpaketti" %in% colnames(data)) {data <- cbind(data, data.frame(Työpaketti = työpaketti))} | |||
#head(data) | |||
data <- reshape(data, v.names = c("Result", "Result.Text"), idvar = "obs.1", timevar = "Havainto", direction = "wide")#[, -c(1,4,5,6)] | |||
data <- data[, !colnames(data) %in% c("obs.1", "Result.Text.määrä", "Result.kuvaus")] | |||
colnames(data)[colnames(data)=="Result.määrä"] <- "määrä" | |||
colnames(data)[colnames(data)=="Result.Text.kuvaus"] <- "kuvaus" | |||
#colnames(data) <- c("Kustannuslaji", "määrä", "kuvaus") | |||
#print(xtable(data), type='html') | #print(xtable(data), type='html') | ||
temp <- data.frame(Kustannuslaji = kustannuslaji, määrä = määrä, kuvaus = kuvaus) | temp <- data.frame(Kustannuslaji = kustannuslaji, määrä = määrä, kuvaus = kuvaus, Laitos = laitos, Vuosi = vuosi, Rahoittaja = rahoittaja, Projekti = projekti, Työpaketti = työpaketti) | ||
data <- rbind(data, temp) | data <- rbind(data, temp) | ||
#print(xtable(data), type='html') | #print(xtable(data), type='html') | ||
kertoimet <- op_baseGetData("opasnet_base", "Op_fi2704") | kertoimet <- op_baseGetData("opasnet_base", "Op_fi2704")[, 3:8] | ||
kertoimet <- kertoimet[kertoimet$Laitos == "THL" & kertoimet$Vuosi == "2011" & kertoimet$Rahoittaja == "STM", ] | #head(kertoimet) | ||
kertoimet <- reshape(kertoimet, v.names = "Result", idvar = "obs.1", timevar = "Kerroin", direction = "wide") | |||
kertoimet <- kertoimet[, colnames(kertoimet)!= "obs.1"] | |||
colnames(kertoimet)[colnames(kertoimet)=="Result.Yleiskustannus"] <- "Yleiskustannus" | |||
colnames(kertoimet)[colnames(kertoimet)=="Result.sivukulu"] <- "Sivukulu" | |||
#print(xtable(kertoimet), type = 'html') | |||
data <- merge(data, kertoimet, all.x = TRUE) | |||
#kertoimet <- kertoimet[kertoimet$Laitos == "THL" & kertoimet$Vuosi == "2011" & kertoimet$Rahoittaja == "STM", ] | |||
#kertoimet | #kertoimet | ||
YK <- kertoimet[kertoimet$Kerroin == "Yleiskustannus", "Result"] | #YK <- kertoimet[kertoimet$Kerroin == "Yleiskustannus", "Result"] | ||
SK <- kertoimet[kertoimet$Kerroin == "Palkan sivukulu", "Result"] | #SK <- kertoimet[kertoimet$Kerroin == "Palkan sivukulu", "Result"] | ||
cat("Yleiskustannuskerroin:", YK, "Sivukulukerroin", SK, "\n") | #cat("Yleiskustannuskerroin:", YK, "Sivukulukerroin", SK, "\n") | ||
palkka <- op_baseGetData("opasnet_base", "Op_fi2705")[, -c(1,2,7)] | palkka <- op_baseGetData("opasnet_base", "Op_fi2705")[, -c(1,2,7)] | ||
#print(xtable(palkka), type = 'html') | #print(xtable(palkka), type = 'html') | ||
palkka <- palkka[palkka$Laitos == laitos & palkka$Vuosi == vuosi, -c(1,3)] | #palkka <- palkka[palkka$Laitos == laitos & palkka$Vuosi == vuosi, -c(1,3)] | ||
colnames(palkka)[ | colnames(palkka)[colnames(palkka)=="Result"] <- "kkpalkka" | ||
colnames(palkka)[colnames(palkka)=="Vaativuusluokka"] <- "Kustannuslaji" | |||
#print(xtable(palkka), type = 'html') | #print(xtable(palkka), type = 'html') | ||
data <- merge(data, palkka, all.x=TRUE) | data <- merge(data, palkka, all.x=TRUE) | ||
Rivi 33: | Rivi 81: | ||
test <- "Palkka" == substr(paste(data$Kustannuslaji, " "), 1, 6) | test <- "Palkka" == substr(paste(data$Kustannuslaji, " "), 1, 6) | ||
#test | #test | ||
data$ | #colnames(data)[colnames(data)=="Result"] <- "summa" | ||
data$kkpalkka <- ifelse(is.na(data$kkpalkka), 1, data$kkpalkka) | |||
#print(xtable(data), type='html') | |||
data$määrä | |||
data$kkpalkka | |||
data$summa <- as.numeric(as.character(data$määrä)) * data$kkpalkka | |||
#print(xtable(data), type = 'html') | #print(xtable(data), type = 'html') | ||
data$määrä <- ifelse(test, data$määrä, 0) | data$määrä <- ifelse(test, data$määrä, 0) | ||
#print(xtable(data), type = 'html') | #print(xtable(data), type = 'html') | ||
colnames(data)[ | colnames(data)[colnames(data)=="määrä"] <- "htkk" | ||
#data | #data | ||
data$Kustannuslaji <- ifelse(test, "Palkka", as.character(data$Kustannuslaji)) | data$Kustannuslaji <- ifelse(test, "Palkka", as.character(data$Kustannuslaji)) | ||
palkat <- sum(data[test, "summa"]) | data | ||
out <- data.frame(Kustannuslaji = c("Sivukulut", "Yleiskustannus"), summa = c(palkat*SK, palkat*(1+SK)*YK)) | } | ||
out <- rbind(data[, c("Kustannuslaji", "summa")], out) | |||
#out | out <- budjettilaskenta("Op_fi2682", rahoittaja = "STM", projekti = "Terva-Kaisu") | ||
print(xtable(out), type = 'html') | |||
print("#############################") | |||
#palkat <- sum(data[test, "summa"]) | |||
#out <- data.frame(Kustannuslaji = c("Sivukulut", "Yleiskustannus"), summa = c(palkat*SK, palkat*(1+SK)*YK)) | |||
#out <- rbind(data[, c("Kustannuslaji", "summa")], out) | |||
##out | |||
##print(xtable(out), type = 'html') | |||
#out <- as.data.frame(as.table(tapply(out$summa, out$Kustannuslaji, sum))) | |||
#colnames(out) <- c("Kustannuslaji", "summa") | |||
##out | |||
##print(xtable(out), type = 'html') | |||
#out$summa <- ifelse(out$Kustannuslaji == "Tulot", out$summa, -out$summa) | |||
#out <- rbind(out, data.frame(Kustannuslaji = "Yhteensä", summa = sum(out$summa))) | |||
##out | |||
#print(xtable(out), type = 'html') | #print(xtable(out), type = 'html') | ||
##} | |||
# | ##budjettilaskenta("Op_fi2682", laitos = "THL") | ||
# | |||
</rcode> | </rcode> | ||
Versio 30. lokakuuta 2011 kello 14.20
Moderaattori:Jouni (katso kaikki)
Sivun edistymistä ei ole arvioitu. Arvostuksen määrää ei ole arvioitu (ks. peer review). |
Lisää dataa
|
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
Tällä käyttöliittymällä ohjataan budjettilaskentaa:
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
- 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.