Opasnet Suomi
Rajaus
Millainen on hyvä työajansuunnittelu- ja seurantajärjestelmä, joka
- täyttää valtionhallinnon kirjanpidon ja tutkimusrahoittajien vaatimukset,
- perustuu avoimeen lähdekoodiin,
- on käytettävissä nettiselaimella ilman tarvetta asentaa mitään omaan organisaatioon,
- auttaa työn suunnittelussa, työajan kirjaamisessa ja raportoinnissa.
Tulos
Työajan suunnitteluun ja seurantaan tarvitaan internetissä selaimella toimiva järjestelmä, joka ei ole organisaatiokohtainen vaan kaikkien käytettävissä. Saman järjestelmän pitää soveltua pitkän ja lyhyen ajan suunnitteluun ja henkilökohtaiseksi ja ryhmäkohtaiseksi työkaluksi. Se seuraa reaaliajassa työntekoa ja vertaa suunnitelmaa toteutumaan. Käyttäjä pystyy itse luomaan ja luokittelemaan työtehtäviä, jotta työn totuudenmukainen kirjaaminen olisi mahdollisimman helppoa, kuten Grindstone-ohjelma tekee.
Tarvitaan seuraavanlaisia tauluja:
- Työajan käyttö (suunnittelu ja toteuma)
- Työtehtävien kuvaus
- Henkilön taidot
- Rahat
- Yhteenvetotaulu
Kaikissa tauluissa selitteet (indeksit) kirjoitetaan isolla alkukirjaimella ja havainnot (observaatiot) pienellä. Tarkempia kuvauksia sarakkeen sisällöstä on kunkin sarakkeen ensimmäisellä rivillä; tuota riviä ei siis ole tarkoitus käyttää varsinaisissa tauluissa.
Työaika
Taulu korvaa nykyiset kellokortit, loma-anomukset, työajanseurannat ja tuntiraporttijärjestelmät, esim. Timeconin, ESSin, Kohdistamon ja Tekesin ja ESR:n raportointi-excelit. Katso esimerkki. Taulun rakenne on seuraava:
Taulun tulkinta etenee ylhäältä alas rivi riviltä. Lähtöoletus on, että kaikki aika on omaa aikaa ellei erikseen taulussa muuta sanota. Jos taulussa on kuvattu samoja ajanhetkiä eri riveillä, taulun aiempien rivien tiedot korvautuvat uusilla tiedoilla. Pitkäkestoiset ja toistuvat tapahtumat kuvataan siis ensin ja kertaluontoiset myöhemmin.
Aikakone/Työaika (d)
| Aikalaji |
Projekti |
Alaprojekti |
alku |
loppu |
toistoväli |
asti |
kuvaus
|
| Aikalaji: oma aika, vuosiloma, työaika, työmatka, sairausloma,...
|
Projekti: laitoksen kirjanpidosta löytyvä projekti
|
Alaprojekti: tarkenteet vaaditulla tarkkuudella
|
alku (aikaindeksi) seurattavan tapahtuman alkuhetki, teknisesti 1 s tarkkuus, käytännössä 15 min.
|
loppu (aikaindeksi) seurattavan tapahtuman loppumishekti
|
toistoväli (d) (kokonaisluku) Toistuvan tapahtuman toistumistiheys päivinä.
|
asti (aikaindeksi, päivän tarkkuus) toistuvan tapahtuman päättymispäivä
|
kuvaus (vapaamuotoinen teksti)
|
| Työaika |
Opasnet |
|
2011-06-01 9:00 |
2011-06-01 15:30 |
1 |
2011-06-30 |
Työsopimuksen mukaan
|
| Vapaa |
|
|
2011-01-01 0:00 |
2011-01-02 23:59 |
7 |
2099-12-31 |
Viikonloppu
|
| Vapaa |
|
|
2011-06-24 0:00 |
2011-06-24 23:59 |
|
|
Juhannus
|
| Vuosiloma |
|
|
2011-06-29 0:00 |
2011-06-29 23:59 |
|
|
|
| Työaika |
Tubu 10081 |
|
2011-06-07 12:00 |
2011-06-07 13:30 |
7 |
2099-12-31 |
YMAL-palaveri
|
| Työmatka |
Minera |
|
2011-06-08 8:30 |
2011-06-08 16:30 |
|
|
Minera-tutustumismatka Yaralle 8.6.2011. Hyväksytty. --Jouni 05:47, 12 May 2011 (EEST)
|
| Työmatka |
Plantlibra |
|
2011-06-12 12:00 |
2011-06-12 15:45 |
|
|
|
--#: Ehkä työpanoksen laatua ei tarvitse seurata kovin yksityiskohtaisesti ja silti ihminen motivoituu osallistumaan. Ehkä palkkauksen perusteeksi asti riittää jokin simppeli kuvaus kuten muokkauspisteet tms. Tällöin palkka tosin ei saa olla suhteessa pisteisiin, vaan palkkaa maksetaan jos pisteet ylittyvät. Voiko mittarina siis käyttää työaikaa myös ihmisillä, jotka eivät ole kellokortin äärellä? Miten tähän suhteutuvat osa-aikaiset työntekijät? --Jouni Tuomisto 30. heinäkuuta 2011 kello 17.42 (EEST)
Tehtävä
Taulussa kuvataan kaikki johonkin arviointiin (tai muuhun yhdellä sivulla kuvattuun kokonaisuuteen) liittyvät työtehtävät, niiden arvioitu tai toteutunut kesto ja niiden linkittyminen sisältösivuihin. Katso esimerkki.
Aikakone/Tehtävä (d, o, €)
| Projekti |
Alaprojekti |
Tekijä |
Tarkastaja |
alku |
loppu |
työaika |
arvostus |
palkkio |
sivu |
kuvaus
|
| Projekti (laitoksen kirjanpidosta löytyvä)
|
Alaprojekti, työpaketti tms.
|
Tekijä
|
Tarkastaja
|
alku (päivämäärä)
|
loppu (milloin tehtävän on valmistuttava, päivämäärä)
|
työaika arviona tai raportoituna (kokonaisina työpäivinä)
|
tuotetun tiedon arvostus onoreina (arvio työn tuottaman tiedon aikanaan saamista onoreista)
|
palkkio (euroina, jos tehdään palkkiolaskulla)
|
se Opasnetin sivu, jonne työ tehdään
|
muuta sanallista kuvausta
|
Raha
Taulussa kuvataan tietyn projektin menot (poislukien palkkamenot, jotka lasketaan suoraan työajasta). Katso esimerkki.
Aikakone/Raha (€)
| Projekti |
Alaprojekti |
Kustannuslaji |
aika |
summa |
kuvaus
|
| projekti (laitoksen kirjanpidosta löytyvä) |
Alaprojekti, työpaketti tms. |
palkka, sivukulu, matka, palvelu yms. |
tapahtuman ajankohta |
tapahtuman suuruus euroina |
kuvaus (muuta sanallista kuvausta)
|
Taito
Taulussa kuvataan käyttäjäkohtaisesti erikoistaidot, joita käyttäjällä on. Tätä tietoa voidaan käyttää suunniteltaessa sitä, kenelle voi antaa minkäkinlaisia tehtäviä. Katso esimerkki.
Aikakone/Taito
| Henkilö |
Taito |
Taso |
Varmentaja |
Kuvaus
|
| Henkilö, jonka taidosta on kyse (jos taulukko on käyttäjäkohtaisella sivulla, tieto voidaan jättää taulukosta pois ja laittaa yhteenvetotaulukkoon. |
Taito joka henkilöllä on |
taidon taso |
Henkilö, joka varmentaa että kyseisellä henkilöllä todella on tämä taito. |
muuta sanallista kuvausta
|
Henkilö ja taito ovat indeksejä ja taso, varmentaja ja kuvaus ovat havaintoja.
Yhteenveto
Tauluun voi kerätä johonkin tiettyyn asiaan, esimerkiksi arviointiin tai projektiin, liittyviä taulukoita työajasta, tehtävistä, rahasta ja taidosta. Katso esimerkki.
Aikakone/Yhteenveto
| Tietolaji |
sivutunniste |
sivu |
kuvaus
|
| Tietolaji (yksi seuraavista: Työaika, Tehtävä, Raha, Taito) |
Sivun tunniste (metadatataulukossa oleva tunniste, esim. Op_fi2005) |
sivun nimi |
muuta sanallista kuvausta asiasta
|
Työajan laskeminen karkeasta hienompaan
Koodi tekee aikajanan (line) perustuen listaan tapahtumia (event). Yksi event sisältää n kappaletta jaksoja jotain tiettyä tapahtumaa. Näiden jaksojen ajalta aikajanaa muutetaan kuvaamaan tätä tapahtumaa, muu aikajana säilyy ennallaan. Laskenta lähtee liikkeelle taulusta, jossa toistuva tapahtuma on kuvattu yhdellä rivillä kuten työaikataulussa. Syöttötaulussa täytyy olla seuraavat sarakkeet alku ja loppu sekä voi olla toistoväli ja mihin asti tapahtuma toistuu. Oletusarvo on, että nämä ovat ensimmäiset neljä saraketta. Näiden lisäksi voi olla vapaavalintainen määrä muita sarakkeita.
Timeline-funktiot: make, plot
+ Näytä koodi- Piilota koodi
# Funktio make.timeline ottaa tapahtumalistauksen ja rakentaa siitä aikajanan. Parametrit:
# event = tapahtumalistaus, joka sisältää ainakin alku- ja loppuajan ja tapahtumatiedon sekä mahdollisesti toiston ja keston.
# order = sarakkeiden numerot tiedoille alku, loppu, toisto, kesto. Jos order on vain
# kaksi riviä pitkä, oletetaan ettei toistuvia tapahtumia ole.
make.timeline <- function(event, order = c(1,2,3,4), ser.start = NULL, ser.end = NULL) {
# eventiin luodaan toisto ja kesto, jos sitä ei ole.
if(length(order)==2) {order <- c(order, (1:2)+ncol(event)); event[,(1:2)+ncol(event)] <- NA}
# Jos on puuttuvaa tietoa toistosta (kumpi tahansa repeet tai until), korvataan "inertillä" datalla.
test <- event[,order[3]] == 0 | event[,order[4]] == 0 | is.na(event[,order[3]]) | is.na(event[, order[4]])
event[, order[3]] <- ifelse(test, 1, event[, order[3]])
event[, order[4]] <- ifelse(test, event[, order[1]], event[, order[4]])
colnames(event)[order] <- c("start", "end", "repeet", "until")
# Luodaan aikajanan alkupiste. Status otetaan aikanaan tyhjältä riviltä.
# Jos alku- ja loppupisteet on annettu, ne sijoitetaan jo aikajanaan.
temp <- min(event[,order[1]])
if(is.null(ser.start)) {ser.start <- temp}
if(ser.start > temp) {temp <- c(temp, ser.start)}
if(!is.null(ser.end)) {if(ser.end > temp[1] & ser.end > ser.start) {temp <- c(temp, ser.end)}}
line <- data.frame(time = temp, status = nrow(event)+1)
for(i in 1:nrow(event)) { # Toista jokaiselle havaintoriville
times <- 0:floor((event[i,order[4]]-event[i,order[1]])/event[i,order[3]]) # Toistojen määrä
# Toista tapahtumaa untiliin asti.
events <- data.frame(time = event[i,order[1]]+times*event[i,order[3]], end = event[i,order[2]]+times*event[i,order[3]], event.start = i)
line <- merge(line, events[, c(1,3)], all=TRUE) # Lisätään tapahtumat aikajanaan.
colnames(events) <- c("remove","time","event.end") # Muutetaan otsikot, koska nyt halutaan mergata loppuhetket aikajanaan.
line <- merge(line, events[, c(2,3)], all=TRUE)
for(x in 2:nrow(line)) {
# Tämä luuppi käy aikajanan läpi ja täydentää tapahtumat.
# Ensin kaikkiin uusiin aikapisteisiin jatketaan sitä aiempaa toimintaa, joka oli menossa edellisessä pisteessä.
if(is.na(line[x,2])) {line[x,2] <- line[x-1,2]}
# Sitten jatketaan uutta toimintaa niihin uusiin pisteisiin, jotka eivät ole loppupisteitä.
if(is.na(line[x,3]) & is.na(line[x,4])) {line[x,3] <- line[x-1,3]}}
# Jos uutta toimintaa on olemassa, statuksena käytetään sitä, muutoin statusta eli aiempaa toimintaa.
line[,2] <- ifelse(!is.na(line[,3]), line[,3], line[,2])
# Leikataan turhat sarakkeet pois ja siirrytään seuraavalle event-riville
line <- line[, 1:2]
line}
# Lisätään tyhjä rivi, jotta puuttuvat statustiedot eivät tuota virhettä.
event[nrow(event)+1, order[1]] <- 0
# Lopulta haetaan kaikki muut sarakkeet status-tiedon avulla.
line <- data.frame(time = line[, 1], event[ line[, 2], -order])
# Jos tapahtumatietoa on vain 1 sarake, sarakkeen nimi menee sotkuun edellisellä rivillä.
# Tämä korjataan ottamalla eventistä sen sarakkeen nimi, joka ei ole aikatietoa.
if(ncol(event) == 5) {colnames(line)[2] <- colnames(event)[-order]}
# Lopuksi leikataan pois ennen startia ja endin jälkeen olevat
if(is.null(ser.end)) {ser.end <- max(line[, 1])}
line <- line[line[,order[1]] >= ser.start & line[,order[1]] <= ser.end, ]
line}
##########################
# Function plot.timeline creates a Gannt chart out of a timeline.
# The time column must be called time and the event column must be called event.
plot.timeline <- function(timeline) {
library(ggplot2)
for(i in 1:(nrow(timeline)-1)) {timeline$end[i] <- timeline$time[i+1]}
timeline[nrow(timeline), "end"] <- NA
ggplot(timeline) + geom_rect(aes(xmin = time # as.Date(as.character(Start))
, xmax = end # as.Date(as.character(End)) + 1
, ymin = as.numeric(event)
, ymax = as.numeric(event) + 1
, fill = event))
}
Esimerkkilaskentaa:
+ Näytä koodi- Piilota koodi
library(xtable)
#Esimerkkilaskenta:
event <- data.frame(alku = c(3,10), loppu = c(6,12), toisto = c(7,11), asti = c(60,40), event=c("Viikkopalaveri","Projektipalaveri"), explanation = c("YMAL", "CLAIH"))
if(is.null(show)) {show <- 0}
if(1 %in% show) {print(xtable(event), type='html')}
out <- make.timeline(event, ser.start = start, ser.end = end)
if(2 %in% show) {print(xtable(out), type = 'html')}
if(3 %in% show) {plot.timeline(out)}
Kehitysideoita
+ Näytä koodi- Piilota koodi
# Date2real-funktio tekee seuraavaa:
# Se ottaa sisäänsä vektorin, jonka alkiot se käy läpi ja muuttaa ne reaaliluvuiksi. Tulkinta etenee tässä järjestyksessä:
# strptime(data, format="%Y-%m-%d %H:%M")
# strptime(data, format="%Y-%m-%d %H.%M")
# strptime(data, format="%d.%m.%Y %H:%M")
# strptime(data, format="%d.%m.%Y %H.%M")
# strptime(data, format="%d.%m.%Y")
# make.timeline.add-funktio tekee saman kuin make.timeline seuraavin poikkeuksin:
# Funktio käy läpi listauksen rivi riviltä ja merkitsee rivillä olevat tiedot alkamaan kohdassa start ja loppumaan kohdassa end.
# Jos kyseisellä välillä on jo jotain tietoa, se summataan aikaisempiin tietoihin (muiden sarakkeiden on siis oltava lukuja!)
# realindex.netsum-funktio tekee saman kuin realindex.replace seuraavin poikkeuksin:
# Funktio käy läpi listauksen rivi riviltä ja merkitsee rivillä olevat tiedot ("massan") alkamaan kohdassa start ja loppumaan kohdassa end.
# Jos kyseisellä välillä on jo jotain massaa, se poistetaan väliltä ja korvataan uudella massalla.
# Kuitenkin massan kokonaismäärä pidetään vakiona siten, että nettomuutoksen verran siirretään massaa naapurialueille.
# Miten tämä tarkkaan ottaen tehdään on miettimättä. Joka tapauksessa oletuksena on tasajakauma alueen sisällä.
# Olennaista on pystyä painottamaan massaa jonkin asian suhteen. Oletusarvo reaalilukuakselilla on reaalilukuvälin suuruus, mutta
# myös jonkin toisen muuttujan massa samalla välillä on mahdollinen.
# Laskennallisesti ei ole eroa onko massan tulkintana määrä vai pitoisuus, koska erot ovat ainoastaan siinä, minkä suhteen asiaa painotetaan.
# classindex.X-funktiot ovat toiminnaltaan samoja kuin vastaavat realindex-funktiot sillä erotuksella,
# että classindex olettaa luokkamuuttujan, jota hierarkkisesti voidaan pilkkoa yhä pienempiin osiin.
# Pitääkö olettaa exclusive and mutually exhaustive? Ainakin se helpottaisi.
# Tarvitaanko myös realindex2.X-funktioita tilanteeseen, jossa on kaksiulotteinen reaalilukuavaruus kuten GIS?
# MUUTA
event2 <- aikataulu(op_baseGetData("opasnet_base", "Op_fi2481"))
event2[,"Worker"] <- "Aino"
event3 <- aikataulu(op_baseGetData("opasnet_base", "Op_fi2543"))
event3[,"Worker"] <- "Jaakko"
event2 <- rbind(event2,event3)
print(xtable(event2), type='html')
print(xtable(event), type='html')
print(xtable(add.detail(event)), type='html')
# Näin lasketaan yhteenvetotaulun tietojen avulla yhteenvetodata.
list <- opbase.read("opasnet_base", "Op_fiXXXX") # Haetaan yhteenvetolista
list <- reshape(list, timevar = "Parameter", idvar = "obs", direction = "wide")
for(i in 1:nrow(list)) {
}
--#: Kehityskohteita (näillä olisi käyttöä yleisestikin):
- Result ja Restext-sarakkeet pitää yhdistää. TEHTY
- Työaikataulut pitää resheipata takaisin alkuperäiseen leveään muotoon. TEHTY
- Result pitää tulkita ajaksi jos mahdollista. --Jouni Tuomisto 7. syyskuuta 2011 kello 00.57 (EEST)
Vaihtoehtoinen koodi
Vaihtoehtoinen koodi (alkuperäinen heinäkuinen idea [2])
+ Näytä koodi- Piilota koodi
library(xtable)
library(OpasnetBaseUtils)
#add.detail <- function(event) { # eventin otsikot: start, end, repeet, until, event
# line <- data.frame(time=min(event[,1]), status="ND") # Alkupiste
# realindex.time2real-funktio tekee seuraavaa:
# Se ottaa data.framen, jossa on sarakkeet start, end ja mahdollisesti repeet ja until sekä mahdollisesti muita sarakkeita.
# start, end ja until muutetaan aikapisteestä reaaliluvuksi (sekunneiksi). repeet oletetaan päiviksi ja se muutetaan sekunneiksi.
realindex.time2real <- function(event, cn=c("start", "end", "repeet", "until")) {
# for(i in 1:nrow(event)) {
event[,1] <- as.Date(event[,1], format="%Y-%m-%d %H:%M")
event[,2] <- as.Date(event[,2], format="%Y-%m-%d %H:%M")
event[,4] <- as.Date(event[,4], format="%Y-%m-%d")
# }
event[1,] - event[2,]
}
dat <- data.frame(start=c("2011-09-01 12:00", "2011-09-02 13:45"), end=c("2011-09-01 12:30", "2011-09-02 18:12"), repeet=c(5,2), until=c("2011-09-10", "2011-09-10"))
dat
realindex.time2real(dat)
warnings()
+ Näytä koodi- Piilota koodi
# realindex.repeat-funktio tekee seuraavaa:
# Se ottaa sisäänsä aikalistauksen, jossa on aikajaksoja (jotka mahdollisesti toistuvat säännöllisesti) ja niihin liittyviä tietoja.
# Se toistaa kutakin riviä niin monta kertaa kuin tapahtuma ehtii toistua repeet päivän välein aikojen start ja until välissä.
#realindex.repeat <- function(event, cn=c("start","end","repeet","until") {
# cn <- c(1,2,3,4) # Haetaan eventistä ne sarakkeiden numerot, jotka vastaavat cn:n nimiä.
# out <- event[1, -cn[3:4]] # Luodaan output, jonka rakenne on sama kuin inputin paitsi toistotiedot on poistettu.
# events <- for(i in 1:nrow(event)) { # Toista jokaiselle havaintoriville
# times <- if(is.na(event[i,cn[3]])) {0} {0:floor((event[i,cn[4]]-event[i,cn[1]])/event[i,cn[3]])} # Laske montako kertaa tapahtuma toistuu
#
# # Tee data.frame, jossa on oma rivi jokaiselle toistolle.
# out <- data.frame(start=event[i,cn[1]]+times*event[i,cn[3]], end=event[i,cn[2]]+times*event[i,cn[3]])
# temp <- event[, -cn)] # Otetaan eventistä loput sarakkeet.
# cbind(out, rep(temp, each=times)) # Lisätään kaikki loput sarakkeet perään
# }
# out <- rbind(out, events)
# out}
# realindex.replace-funktio tekee seuraavaa:
# Se ottaa sisään (aika)listauksen, jossa ei ole toistoja tai josta ne on jo purettu ja jossa ajat ovat reaalilukuina.
# Rakenteena on data.frame, jossa ensimmäiset kaksi saraketta ovat start ja end, ja sen jälkeen tulee vapaavalintainen määrä muita sarakkeita.
# Funktio käy läpi listauksen rivi riviltä ja merkitsee rivillä olevat tiedot alkamaan kohdassa start ja loppumaan kohdassa end.
# Jos kyseisellä välillä on jo jotain tietoa, se poistetaan.
# HUOM! Tämä on alunperin kehitetty aikalistaukselle, mutta se toimii mille reaalilukulistaukselle hyvänsä. Ajat pitää ensin
# muuttaa reaaliluvuiksi ennen tämän funktion ajamista.
line <- merge(line, events[,c(1,3)], all=TRUE)
colnames(events) <- c("tim","time","end")
line <- merge(line, events[,c(2,3)], all=TRUE)
for(x in 2:nrow(line)) {
if(is.na(line[x,2])) {line[x,2] <- line[x-1,2]}
if(is.na(line[x,3]) & is.na(line[x,4])) {line[x,3] <- line[x-1,3]}}
line[,2] <- ifelse(!is.na(line[,3]), as.character(line[,3]), as.character(line[,2]))
line <- line[,c("time","status")]}
line}
# realindex.add-funktio tekee saman kuin realindex.replace seuraavin poikkeuksin:
# Funktio käy läpi listauksen rivi riviltä ja merkitsee rivillä olevat tiedot alkamaan kohdassa start ja loppumaan kohdassa end.
# Jos kyseisellä välillä on jo jotain tietoa, se summataan aikaisempiin tietoihin (muiden sarakkeiden on siis oltava lukuja!)
# realindex.netsum-funktio tekee saman kuin realindex.replace seuraavin poikkeuksin:
# Funktio käy läpi listauksen rivi riviltä ja merkitsee rivillä olevat tiedot alkamaan kohdassa start ja loppumaan kohdassa end.
# Jos kyseisellä välillä on jo jotain tietoa, se poistetaan väliltä ja korvataan uudella tiedolla.
# Kuitenkin nettosumma pidetään vakiona siten, että nettomuutoksen verran siirretään massaa naapurialueille.
# Miten tämä tarkkaan ottaen tehdään on miettimättä. Joka tapauksessa oletuksena on tasajakauma alueen sisällä.
# realindex.average-funktio tekee saman kuin realindex.netsum seuraavin poikkeuksin:
# Funktio ei oleta, että kyseessä olisi jokin nettomäärä massaa, vaan että kyseessä on keskiarvo, kuten pitoisuus.
# Mutta onko tässä itse asiassa laskennallista eroa, jos kuitenkin oletetaan asian jakautuminen tasan alueen sisällä?
# classindex.X-funktiot ovat toiminnaltaan samoja kuin vastaavat realindex-funktiot sillä erotuksella,
# että classindex olettaa luokkamuuttujan, jota hierarkkisesti voidaan pilkkoa yhä pienempiin osiin.
# Pitääkö olettaa exclusive and mutually exhaustive? Ainakin se helpottaisi.
# Tarvitaanko myös realindex2.X-funktioita tilanteeseen, jossa on kaksiulotteinen reaalilukuavaruus kuten GIS?
#Esimerkkilaskenta:
event <- data.frame(start=c(3,10), end=c(6,12), repeet=c(7,11), until=c(60,50), event=c("Viikkopalaveri","Projektipalaveri"))
aikataulu <- function(event2) {
event2[,"Result"] <- ifelse(is.na(event2[,"Result.Text"]), event2[,"Result"], as.character(event2[,"Result.Text"]))
event2 <- event2[, 3:7]
rows <- 1:nrow(event2)
event3 <- data.frame(start=1, end=1, repeet=1, until=1, event=1)
for(i in rows) {event3[ceiling(i/5), i - ceiling(i/5)*5+5] <- event2[i,5]}
#event3[,1] <- as.POSIXlt(as.character(event3[,1])) #Tekstit pitäisi saada muutettua ajaksi muttei onnistu näin
event3}
event2 <- aikataulu(op_baseGetData("opasnet_base", "Op_fi2481"))
event2[,"Worker"] <- "Aino"
event3 <- aikataulu(op_baseGetData("opasnet_base", "Op_fi2543"))
event3[,"Worker"] <- "Jaakko"
event2 <- rbind(event2,event3)
print(xtable(event2), type='html')
print(xtable(event), type='html')
print(xtable(add.detail(event)), type='html')
--#: Kehityskohteita (näillä olisi käyttöä yleisestikin):
- Result ja Restext-sarakkeet pitää yhdistää. TEHTY
- Työaikataulut pitää resheipata takaisin alkuperäiseen leveään muotoon. TEHTY
- Result pitää tulkita ajaksi jos mahdollista. --Jouni Tuomisto 7. syyskuuta 2011 kello 00.57 (EEST)
Perustelut
Toteutus ja kokemukset YMALissa
Strategia/virkistyspäivässä Rautalammilla 18.5.2011 sovittiin, että otetaan käyttöön Opasnetiin rakennettu työtehtävien seurantajärjestelmä. Tarkoituksena on nimenomaan auttaa omien ja ryhmän töiden suunnittelussa, joten kirjaamiset tehdään sillä tarkkuudella kuin tuo tavoite vaatii, ei sen tarkemmin. Järjestelmä on kuvattu sivulla Aikakone. Järkeväksi kirjaamistarkkuudeksi sovittiin, että jokainen kirjaa työtehtäviin
- oman projektinsa suunnitelmassa luvatut tehtävät
- omat muut työtehtävänsä, joita kannattaa erikseen suunnitella ja seurata, ja lisäksi
- Jouni kirjaa ylös muita, esim. koko YMALiin liittyviä tehtäviä.
Tehtävät kirjataan Table2Base-tauluiksi (<t2b>)joko projektikohtaiseen listaan (esim. projektin pääsivun keskustelusivulle) tai henkilön omaan listaan (Heande:User:Käyttäjätunnus/Tehtävät). Tämä ei ole kriittistä, koska yhteenvedot voidaan tehdä vapaavalintaisesta joukosta työlistoja.
Työaika kirjataan minimitarkkuudella eli tavoitteena on työajan suunnittelu noin yhden henkilötyökuukauden tarkkuudella. Lisäksi YMAL-raportoinnin takia lomat, matka ja sairauspoissolot ilmoitetaan päivän tarkkuudella. Jokainen siis kirjaa henkilökohtaiseen työaikalistaansa (Heande:User:Käyttäjätunnus/Työaika)
- oman kokonaistyöaikansa eli tekee yhden keskimääräisen mallipäivän, joka toistuu päivittäin,
- lomapäivät
- sairauspoissaolot
- matkat
- tarvittaessa sellaiset isot aikasyöpöt, jotka olennaisesti vaikuttavat työaikaan (esim. pitkä kurssi yliopistolla)
Alustavat listat tehdään 31.5.2011 mennessä, jolloin tilannetta tarkastellaan tiistaipalaverissa.
Esimerkkejä ongelmallisista nykykäytännöistä
Nykyisessä hallintokulttuurissa ongelmia ratkotaan pirstaleisesti aina yhdestä pikkuongelmasta lähtien. Seurauksena on kirjava viidakko sääntöjä ja yhteensopimattomia järjestelmiä. Ei ymmärretä, että suurin osa hallinnosta on tietotyötä, johon tulisi soveltaa tietotyön yleisiä työkaluja.
Esimerkkejä tietotyöstä ja siihen liittyvistä ajatusharhoista.
| Tietotyö tai toimintatapa |
Nykytyön harha |
Miten voitaisiin parantaa
|
| M2 |
Matkojen toteuttaminen eri järjestelmällä estää johdonmukaisen työajan ja laskujen kohdentamisen. |
Aikakonetta voisi käyttää työmatkojenkin seurantaan.
|
| Kohdistamo |
Työajanseurannan tarkoitukseksi ajatellaan hallinnollinen raportointi, vaikka se on työn suunnittelu ja parantaminen. |
Käytettävä työn suunnittelua helpottavia työkaluja kuten Aikakonetta Kohdentamon sijasta.
|
| ESS |
Loma-ajat ja poissaolot kuvitellaan työajan suunnittelusta erilliseksi asiaksi. |
Poissaolot on suunniteltava ja kirjattava samalla järjestelmällä kuin muukin työajanseuranta, esim. Aikakoneella.
|
Aiempia, hylättyjä suunnitelmia työajan seurannasta
start|Työaika alkoi (hh.mm, nyt=0)|0|
start <- if(start==0){Sys.time()} else {as.POSIXlt(start, format = "%H.%M")}
Katso myös
Viitteet
Aiheeseen liittyviä tiedostoja
| id | Tiedoston nimi | Viimeksi muokattu | Koko (kB) |
|---|