Ero sivun ”Eurykleia” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
(→‎YMALille muokattu koodi: näyttäisi toimivan)
Rivi 120: Rivi 120:
library(reshape2)
library(reshape2)
library(ggplot2)
library(ggplot2)
library(lubridate)


tables <- html_table(read_html("https://terho.thl.fi/wiki01/x/3wMtCQ"))[[1]]
tables <- html_table(read_html("https://terho.thl.fi/wiki01/x/3wMtCQ"))[[1]]
Rivi 137: Rivi 138:
projektit <- hae("THL:n projektien tiedot")
projektit <- hae("THL:n projektien tiedot")


projektit$HSK <- as.numeric(as.character(gsub("[ %]", "", projektit$HSK)))/100
pros <- function(dat) {as.numeric(as.character(gsub("[ %]", "", dat)))/100}
projektit$YK <- as.numeric(as.character(gsub("[ %]", "", projektit$YK)))/100
projektit$HSK <- pros(projektit$HSK)
projektit$Omarahoitus <- as.numeric(as.character(gsub("[ %]", "", projektit$Omarahoitus)))/100
projektit$YK <- pros(projektit$YK)
projektit$"Tehollinen työaika" <- as.numeric(as.character(gsub("[ %]", "", projektit$"Tehollinen työaika")))/100
projektit$Omarahoitus <- pros(projektit$Omarahoitus)
henkilot$"Osa-aika" <- as.numeric(as.character(gsub("[ %]", "", henkilot$"Osa-aika")))/100
projektit$"Tehollinen työaika" <- pros(projektit$"Tehollinen työaika")
henkilot$"Osa-aika" <- pros(henkilot$"Osa-aika")


palkat <- merge(resurssit, henkilot[colnames(henkilot)!="Ajanjakso"])
palkat <- merge(resurssit, henkilot[colnames(henkilot)!="Ajanjakso"])
Rivi 156: Rivi 158:
out <- data.frame()
out <- data.frame()
for(i in 1:nrow(palkat)) {
for(i in 1:nrow(palkat)) {
   k <- as.numeric(substr(palkat$Loppu,6,7))[i] - as.numeric(substr(palkat$Alku,6,7))[i] + 1
   k <- round(as.numeric(ceiling_date(palkat$Loppu,"month")[i] - floor_date(palkat$Alku,"month")[i])/30)
   for(j in 1:k) {
   out <- rbind(
    out <- rbind(out,
    out,
                data.frame(
    data.frame(
                  Aika = palkat$Alku[i] + 31*(j-1),
      Aika = seq(palkat$Alku[1], by = "month", length = k),
                  Projekti = palkat$Projekti[i],
      Projekti = palkat$Projekti[i],
                  Yksikkö = palkat$Yksikkö[i],
      Yksikkö = palkat$Yksikkö[i],
                  TA.tili = palkat$`TA-tili`[i],
      TA.tili = palkat$`TA-tili`[i],
                  Palkat = palkat$Palkat[i]/k,
      Palkat = palkat$Palkat[i]/k,
                  Sivukulut = palkat$Sivukulut[i]/k,
      Sivukulut = palkat$Sivukulut[i]/k,
                  Yleiskustannus = palkat$Yleiskustannus[i]/k
      Yleiskustannus = palkat$Yleiskustannus[i]/k
                )
     )
     )
   }
   )
}
}


Rivi 202: Rivi 203:
out2 <- data.frame()
out2 <- data.frame()
for(i in 1:nrow(tulot)) {
for(i in 1:nrow(tulot)) {
   k <- as.numeric(substr(tulot$Loppu,6,7))[i] - as.numeric(substr(tulot$Alku,6,7))[i] + 1
   k <- round(as.numeric(ceiling_date(tulot$Loppu,"month")[i] - floor_date(tulot$Alku,"month")[i])/30)
   for(j in 1:k) {
   out2 <- rbind(
    out2 <- rbind(
    out2,
      out2,
    data.frame(
      data.frame(
      Aika = seq(tulot$Alku[1], by = "month", length = k),
        Aika = tulot$Alku[i] + 31*(j-1),
      Projekti = tulot$Projekti[i],
        Projekti = tulot$Projekti[i],
      Kululaji = tulot$Kululaji[i],
        Kululaji = tulot$Kululaji[i],
      Yksikkö = "YMAL",
        Summa = tulot$Summa[i]/k
      Summa = tulot$Summa[i]/k
      )
     )
     )
   }
   )
}
}


############# Tarvitaanko näitä ja miten yhdistetään?
############# Tarvitaanko näitä ja miten yhdistetään?
out$TA.tili <- NULL
out$TA.tili <- NULL
out2$Yksikkö <- "YMAL"
kulut2$Lisäerittely <- NULL
kulut2$Lisäerittely <- NULL
kulut2$Kuvaus <- NULL
kulut2$Kuvaus <- NULL
Rivi 231: Rivi 230:
#out <- out[out$Kuukausi >= alku & out$Kuukausi <= loppu , ]
#out <- out[out$Kuukausi >= alku & out$Kuukausi <= loppu , ]


out$Kausi <- substr(as.character(out$Aika),1,7)
out$Kausi <- floor_date(out$Aika, "month")


oprint(aggregate(out["Summa"], by = out[c("Projekti","Kululaji")], FUN = "sum"))
temp <- rbind(
oprint(aggregate(out["Summa"], by = out[c("Kausi")], FUN = "sum"))
  aggregate(out["Summa"], by = out[c("Projekti","Kululaji")], FUN = "sum"),
oprint(aggregate(out["Summa"], by = out[c("Projekti")], FUN = "sum"))
  cbind(
    aggregate(out["Summa"], by = out[c("Projekti")], FUN = "sum"),
    Kululaji = "Total"
  )
)
oprint(temp[order(temp$Projekti),])


d<-out[order(out$Projekti, out$Aika),]
d <- rbind(
  aggregate(out["Summa"], by = out[c("Kausi","Projekti","Yksikkö")], FUN="sum"),
  cbind(
    aggregate(out["Summa"], by = out[c("Kausi","Yksikkö")], FUN="sum"),
    Projekti = "Total"
  )
)
 
d<-d[order(d$Projekti, d$Kausi),]  
d<-cbind(d,
d<-cbind(d,
         Csum=unlist(tapply(d$Summa, INDEX=d["Projekti"], FUN=cumsum))
         Csum=unlist(tapply(d$Summa, INDEX=d["Projekti"], FUN=cumsum))
)
)  
ggplot(d, aes(x=Aika, y=Csum, colour=Projekti))+geom_step()
 
ggplot(d, aes(x=Kausi, y=Csum, colour=Projekti))+geom_line(size=2)+
  labs(title="YMALin rahatilanteen kehitys projekteittain")
</rcode>
</rcode>



Versio 27. tammikuuta 2018 kello 04.25




Eurykleia on suunnitelma THL:n talous- ja henkilöstönhallintaohjelmaksi.

Kysymys

Millainen talous- ja henkilöstönsuunniteelu- ja -hallintaohjelma THL:een tarvittaisiin? Sen tuli erityisesti auttaa eroon irrallisista Exceleistä, joita jokainen joutuu ylläpitämään oman projektinhallintansa tueksi.

Vastaus

Yksi mahdollisuus on hyödyntää THL:n omia valmiita järjestelmiä kuten Terhoa (Confluence-wiki) ja R-tilasto-ohjelma, jota kymmenet ihmiset talossa osaavat käyttää tehokkaasti. Tarkempi ehdotus löytyy Yhteistyötiloista sivulta Ehdotus Eurykleian toteuttamiseksi Terhossa ja sen toteutusesimerkki sivulta Esimerkki Terho-toteutuksesta.

Perustelut

Laskenta

Alla on peruskoodi tietojen hakemiseen Yhteistyötiloista ja joidenkin perusraporttien tuottaminen. Idea sinänsä on erittäin joustava, ja R:llä on helppo toteuttaa millaista raportointia tai seurantaa tahansa. Tiedot voidaan myös kytkeä Shinyyn, joka tehokkaana R-rajapintana auttaa tekemään monenlaisia kuvaajia talous- ja henkilöstötilanteesta.

Esimerkkiajo 27.11.2017 (kuvaaja ei välttämättä näy vyvi-verkossa)

Tarkastelujakson alku:
..

Tarkastelujakson loppu:
..

+ Näytä koodi

YMALille muokattu koodi

+ Näytä koodi

Kommentteja vaatimusmäärittelyyn

Tunnisteet viittaavat Eurykleian vaatimusmäärittelyn versioon 8.12.2017 toiminnallisten vaatimusten osalta [1].

  • Vaatimukset YL01-YL27, VU01-VU16, TA01-TA09 yleensä ottaen muutkin ovat sellaisia, jotka on mahdollista rakentaa ja muokata halutulla tavalla, koska Terho-järjestelmä on tietorakenteeltaan niin joustava. Tätä ratkaisua on kuvattu Yhteistyötiloissa sivuilla Ehdotus Eurykleian toteuttamiseksi Terhossa sekä Esimerkki Terho-toteutuksesta.
  • YL12: suoritemäärää voi seurata, jos tieto syötetään määrinä ja yksikkökustannuksina eikä suoraan euroina. Toteutus vaatii oman taulukon muttei ole vaikea.
  • VU03, VU05: Budjettijako voidaan toteuttaa tapahtumina, joiden kustannuslaji on esim. "Budjettimyöntö". Nämä tapahtumat voidaan hallinnoida keskitetysti yhdestä tai hajautetusti useammasta taulusta, koska laskennallisesti kaikki taulut ovat yhtä ja samaa ja tiedot siitä periytyvät kaikkiin organisaation osiin kokonaislaskennan kautta. Osastolle jaettu budjettimyöntö on osastolle negatiivista, kun se jaetaan edelleen yksiköihin.
  • VV01-VV03: Jos tarvitaan useampia vaihtoehtoisia budjetteja, Tätä varten tarvitaan oma sarake johon määritellään skenaarion (version) nimi. Jos nimeä ei mainita tai sarake puuttuu, kyseinen tapahtuma toteutuu kaikissa skenaarioissa.
  • PR02: Budjettien täsmäämiseen on käytössä tasaustyökalu, joka kertoo paljonko kutakin yhtä kustannuslajia pitäisi tarkasteltavalla tasolla ja aikaikkunassa lisätä, jotta budjetti menisi nollille. Näin pystytään yhdellä silmäyksellä näkemään, paljonko on yli- tai alijäämää odotettavissa ja millä tavalla se saataisiin tasattua eri kustannuslajien menoja muuttamalla. Järjestelmä on joustava, koska se voidaan laskea mille tahansa tarkasteluun otetulle tilanteelle.
  • PR09: Perustuu Terhon omaan versiohistorian toiminnallisuuteen.
  • TA10-TA13, HE21: Rivitason tapahtumat ovat suojatulla serverillä, ja sen tekninen toteutus on tällä hetkellä epäselvä. Ne joilla on pääsy suoraan tälle serverille on myös mahdollisuus tarkastella rivitason tapahtumia. Tänne voidaan rakentaan halutut toiminnallisuudet. Yleisessä käyttöliittymässä voitaisiin tuottaa linkki, jolla haetaan halutut rivitason tiedot (ja joka toimii vain jos henkilöllä on oikeudet). Voi olla, että tämä olisi helpompaa toteuttaa suoraan Kiekussa.
  • HE01-HE04: Tarkoitus on Eurykleiassa käyttää vain henkilön nimeä tunnisteena, ja palkka- ym. tiedot nousevat laskentaan suojatusta tiedostosta ja summataan, jolloin henkilöiden palkat eivät järjestelmässä sellaisenaan näy. Sen sijaan HE15:n mukaiset tiedot eli esim. työsuhteiden kestot ja sijoitukset eri projekteille näkyvät kaikille (ellei yksikkö suojaa omaa budjetointisivuaan).
  • HE13: Vaatimusmäärittelyssä jää epäselväksi, millaista luokittelua tässä ajatellaan ja pitääkö olla viisi erillistä kenttää jossa on etukäteen määrätyt vaihtoehdot. Ehdotan sen sijaan, että on yksi sarake Luokittelut, johon voi kirjoittaa useita vapaamuotoisia luokitteluja esim. pilkulla erotettuna.
  • KA01-KA06: Järjestelmä rakennetaan kaksitasoiseksi: suunnittelutiedot, menot, tulot ja henkilöiden nimet ovat lähtökohtaisesti kaikkien nähtävissä. Palkkatiedot, hetut, vaativuusluokat ja suoriutumispisteet sen sijaan eivät. Tällä hetkellä on epäselvää, onko noihin salaisiin tietoihin lainkaan tarpeellista päästä tämän järjestelmän kautta, vai katsellaanko ja hallinnoidaanko niitä suoraan siellä missä ne ovat (eli HOT:ssa?).
  • HA01-HA13 sekä TI01-TI10: hankintatiedot ja tilatiedot tarvitsevat kokonaan omat taulunsa ja laskentakoodinsa. Tämä ei ole sinänsä ongelmallista, mutta ei liene myöskään välttämätöntä toteuttaa niitä ensi vaiheessa (ja kakkoskategoriaan ne on merkittykin).
  • LI01-LI27: Rajapintaliittymät ovat lähinnä kiinni niistä järjestelmistä, joista tietoa ollaan tuomassa. Tässä suunnitelmassa oletetaan, että tietoja tuodaan eräajoina eikä reaaliaikaiseen rajapintaan pyritä. Monien tietojen osalta riittää, että tiedot tuodaan tähän järjestelmään kerran viikossa. Yksinkertaisin versio on sellainen, että joku riittävillä oikeuksilla varustettu henkilö tekee haun esim. Kiekuun ja tallentaa rivitason tiedot suojatulle serverille CSV-tiedostona, jota Eurykleia puolestaan ne lukee. Hienompiakin tapoja voi kehitellä, mutta rutiinitoimenpiteenä tässä ei pitäisi mennä paria minuuttia kauempaa ja siksi kovin massiivisia järjestelmiä tuon pienen työn säästämiseksi ei kannata rakentaa.
  • LI07: Tarvittava kääntötaulukko voidaan ylläpitää Terhossa.

Katso myös