Ero sivun ”Eurykleia” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
(→‎YMALille muokattu koodi: näyttäisi toimivan)
 
(7 välissä olevaa versiota samalta käyttäjältä ei näytetä)
Rivi 17: Rivi 17:
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.
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.


[http://fi.opasnet.org/fi-opwiki/index.php?title=Toiminnot:RTools&id=33FYS1EH8SXqyiVS Esimerkkiajo 27.11.2017] (kuvaaja ei välttämättä näy vyvi-verkossa)
==== Laske rahatilanne ====


<rcode graphics=1 variables="
* [http://fi.opasnet.org/fi-opwiki/index.php?title=Toiminnot:RTools&id=33FYS1EH8SXqyiVS Esimerkkiajo 27.11.2017] (kuvaaja ei välttämättä näy vyvi-verkossa)
name:alku|description:Tarkastelujakson alku|type:date|default:2017-01-01|
* [http://fi.opasnet.org/fi-opwiki/index.php?title=Toiminnot:RTools&id=hVvfJ6VpwZ1v6S1z Esimerkkiajo 29.1.2018] toiminnallisemmalla koodilla.
name:loppu|description:Tarkastelujakson loppu|type:date|default:2018-12-31
 
">
<rcode graphics=1>
# This is code Op_fi5758/ on page [[Eurykleia]]
# This is code Op_fi5758/ on page [[Eurykleia]]


Rivi 29: Rivi 29:
library(reshape2)
library(reshape2)
library(ggplot2)
library(ggplot2)
library(lubridate)


tables <- html_table(read_html("https://yhteistyotilat.fi/wiki08/x/UIesAg"))[[2]]
objects.latest("Op_fi5758", code_name="initiate") # Generic functions [[Eurykleia]]


hae <- function(aihe) {
################### Fetch all data tables
  aihe <- match(aihe, tables$Kuvaus)
  out <- html_table(read_html(tables$URL[aihe]))[[tables$Taulu[aihe]+1]]
  return(na.omit(out))
}
henkilot <- hae("Henkilöiden tiedot")
resurssit <- hae("Henkilöresurssisuunnitelma")
kulut <- hae("Kulusuunnitelma")
projektit <- hae("THL:n projektien tiedot")


projektit$HSK <- as.numeric(as.character(gsub("[ %]", "", projektit$HSK)))/100
### YMAL specific data
projektit$YK <- as.numeric(as.character(gsub("[ %]", "", projektit$YK)))/100
tables <- html_table(read_html("https://terho.thl.fi/wiki01/x/3wMtCQ"))[[1]]
projektit$Omarahoitus <- as.numeric(as.character(gsub("[ %]", "", projektit$Omarahoitus)))/100
henkilot <- cbind(
projektit$"Tehollinen työaika" <- as.numeric(as.character(gsub("[ %]", "", projektit$"Tehollinen työaika")))/100
  hae("Henkilöiden tiedot"),  
henkilot$"Osa-aika" <- as.numeric(as.character(gsub("[ %]", "", henkilot$"Osa-aika")))/100
  read.csv("//cesium/jtue$/_Documents/ymalpalkat.csv")
)


palkat <- merge(resurssit, henkilot)
### Demonstration data for Yhteistyötilat
palkat$Palkat <- palkat$Aikamäärä * palkat$"Osa-aika" * palkat$Palkka
#tables <- html_table(read_html("https://yhteistyotilat.fi/wiki08/x/UIesAg"))[[2]]
palkat <- merge(palkat, projektit, by.x = "Projekti", by.y = "Nimi")
#henkilot <- hae("Henkilöiden tiedot")
palkat$Sivukulut <- palkat$Palkat * palkat$HSK
palkat$Yleiskustannus <- (palkat$Palkat + palkat$Sivukulut) * palkat$YK
palkat$Alku <- unlist(lapply(strsplit(palkat$Kuukausi, "-"), function(x) x[[1]]))
palkat$Loppu <- unlist(lapply(strsplit(palkat$Kuukausi, "-"), function(x) x[[2]]))
palkat$Alku <- as.Date(palkat$Alku, format="%d.%m.%Y")
palkat$Loppu <- as.Date(palkat$Loppu, format="%d.%m.%Y")


out <- data.frame()
henkilot <- aikajako(henkilot)
for(i in 1:nrow(palkat)) {
  k <- as.numeric(substr(palkat$Loppu,6,7))[i] - as.numeric(substr(palkat$Alku,6,7))[i] + 1
  for(j in 1:k) {
    out <- rbind(out,
  data.frame(
Kuukausi = palkat$Alku[i] + 31*(j-1),
Projekti = palkat$Projekti[i],
Yksikkö = palkat$Yksikkö[i],
TA.tili = palkat$`TA-tili`[i],
Palkat = palkat$Palkat[i]/k,
Sivukulut = palkat$Sivukulut[i]/k,
Yleiskustannus = palkat$Yleiskustannus[i]/k
      )
    )
  }
}


out <- melt(
resurssit <- aikajako(hae("Henkilöresurssisuunnitelma"), "Htkk")
  out,
kulut <- hae("Kulusuunnitelma")
  measure.vars = c("Palkat","Sivukulut","Yleiskustannus"),
kulut$Aika <- jakso(kulut$Aika,1)
  variable.name = "Kululaji",
  value.name="Summa"
)
out$Summa <- -out$Summa


############# Tarvitaanko näitä ja miten yhdistetään?
projektit <- hae("THL:n projektien tiedot")
out$TA.tili <- NULL
kulut$Lisäerittely <- NULL
kulut$Kuvaus <- NULL
kulut$Yksikkö <- "vaikutusarviointi"
kulut$Kuukausi <- as.Date(kulut$Kuukausi, format="%d.%m.%Y")


out <- rbind(out, kulut)
projektit.loppu <- data.frame(
  projektit[c("Yksikko","Projekti")],
  Aika = jakso(projektit$Aika,2)
)
projektit.loppu <- aggregate(projektit.loppu["Aika"],by=projektit.loppu[c("Yksikko","Projekti")],FUN=max)


##################### Remove extra details from time
projektit <- aikajako(projektit, c("Summa", "YKE"))
projektit$HSK <- pros(projektit$HSK)
projektit$YKH <- pros(projektit$YKH)
projektit$YKM <- pros(projektit$YKM)
projektit$Voitto <- pros(projektit$Voitto)
projektit$Teho <- pros(projektit$Teho)
projektit$Omarahoitus <- pros(projektit$Omarahoitus)


out <- out[out$Kuukausi >= alku & out$Kuukausi <= loppu , ]
henkilot$Osuus <- pros(henkilot$Osuus) # This is not used anywhere in the code?!


out$Kausi <- substr(as.character(out$Kuukausi),1,7)
palkat <- merge(
  merge(resurssit, henkilot),
  projektit[!colnames(projektit) %in% c("Kuvaus","Summa")],
  all.x=TRUE # This has an effect if project does not exists or is used outside project period
)


oprint(aggregate(out["Summa"], by = out[c("Projekti","Kululaji")], FUN = "sum"))
yk.muut <- merge(kulut, projektit[!colnames(projektit) %in% c("Summa","Kuvaus")])
oprint(aggregate(out["Summa"], by = out[c("Kausi")], FUN = "sum"))
yk.muut$Summa <- yk.muut$Summa * yk.muut$YKM
oprint(aggregate(out["Summa"], by = out[c("Projekti")], FUN = "sum"))


d<-out[order(out$Projekti, out$Kuukausi),]
kulut <- rbind(
d<-cbind(d,
  kulut,
Csum=unlist(tapply(d$Summa, INDEX=d["Projekti"], FUN=cumsum))
  cbind(
    yk.muut[colnames(yk.muut) %in% setdiff(colnames(kulut),"Kululaji")],
    Kululaji = "Yleiskustannus"
  )
)
)
ggplot(d, aes(x=Kuukausi, y=Csum, colour=Projekti))+geom_step()


</rcode>
### Check for working hours
 
temp <- aggregate(palkat["Htkk"], by=palkat[c("Yksikko","Nimi","Aika")],FUN=sum)


==== YMALille muokattu koodi ====
ggplot(temp, aes(x=Aika, y=Htkk, colour=Nimi))+geom_line(size=2)+
  labs(title="YMALin henkilökuukausien sijoittuminen aikajanalle")


<rcode>
temp$Aika <- floor_date(temp$Aika, "year")
# This is code Op_fi5758/ on page [[Eurykleia]]
oprint(aggregate(temp["Htkk"],by=temp[c("Yksikko","Aika","Nimi")],FUN=mean))


library(OpasnetUtils)
### Calculate salary and other events
library(rvest)
library(reshape2)
library(ggplot2)
library(lubridate)


tables <- html_table(read_html("https://terho.thl.fi/wiki01/x/3wMtCQ"))[[1]]
palkat <- palkanlaskenta(palkat)


hae <- function(aihe) {
colu <- c("Yksikko","Projekti","Aika","Kululaji","Summa")
  aihe <- match(aihe, tables$Kuvaus)
  out <- html_table(read_html(tables$URL[aihe]))[[tables$Taulu[aihe]]]
  return(out)
}


henkilot <- cbind(
tap <- rbind(
   hae("Henkilöiden tiedot"),  
   palkat[colu], # Salaries and indirect salary costs
   read.csv("//cesium/jtue$/_Documents/ymalpalkat.csv")
  kulut[colu], # Other costs
  cbind(projektit, Kululaji="Myöntö")[colu], # Project funding
   cbind(
    projektit[colnames(projektit)!="Summa"],
    Summa = -projektit$YKE, # Euro-based overhead
    Kululaji = "Yleiskustannus"
  )[colu]
)
)
resurssit <- hae("Henkilöresurssisuunnitelma")
kulut <- hae("Kulusuunnitelma")
projektit <- hae("THL:n projektien tiedot")


pros <- function(dat) {as.numeric(as.character(gsub("[ %]", "", dat)))/100}
voitto <- merge(
projektit$HSK <- pros(projektit$HSK)
  tap[tap$Kululaji!="Myöntö",],
projektit$YK <- pros(projektit$YK)
  projektit[colnames(projektit)!="Summa"]
projektit$Omarahoitus <- pros(projektit$Omarahoitus)
)
projektit$"Tehollinen työaika" <- pros(projektit$"Tehollinen työaika")
tap <- rbind(
henkilot$"Osa-aika" <- pros(henkilot$"Osa-aika")
  tap,
  cbind(
    voitto[colu[-c(4,5)]],
    Kululaji = "Voittotuloutus",
    Summa = voitto$Summa * voitto$Voitto
  )
)


palkat <- merge(resurssit, henkilot[colnames(henkilot)!="Ajanjakso"])
tap$Summa[is.na(tap$Summa)] <- 0 # This may hide problems with matching
palkat$Palkat <- palkat$Htkk * palkat$"Osa-aika" * palkat$Palkka
tap <- aggregate(tap["Summa"], by = tap[colu[-5]], FUN=sum)
palkat <- merge(palkat, projektit[colnames(projektit)!="Aika"], by.x = "Projekti", by.y = "Nimi")
palkat$Palkka <- NULL
palkat$Sivukulut <- palkat$Palkat * palkat$HSK
palkat$Yleiskustannus <- (palkat$Palkat + palkat$Sivukulut) * palkat$YK
palkat$Alku <- unlist(lapply(strsplit(palkat$Aika, "-"), function(x) x[[1]]))
palkat$Loppu <- unlist(lapply(strsplit(palkat$Aika, "-"), function(x) x[[2]]))
palkat$Alku <- as.Date(palkat$Alku, format="%d.%m.%Y")
palkat$Loppu <- as.Date(palkat$Loppu, format="%d.%m.%Y")


out <- data.frame()
#tap <- tap[tap$Kuukausi >= alku & tap$Kuukausi <= loppu , ]
for(i in 1:nrow(palkat)) {
  k <- round(as.numeric(ceiling_date(palkat$Loppu,"month")[i] - floor_date(palkat$Alku,"month")[i])/30)
  out <- rbind(
    out,
    data.frame(
      Aika = seq(palkat$Alku[1], by = "month", length = k),
      Projekti = palkat$Projekti[i],
      Yksikkö = palkat$Yksikkö[i],
      TA.tili = palkat$`TA-tili`[i],
      Palkat = palkat$Palkat[i]/k,
      Sivukulut = palkat$Sivukulut[i]/k,
      Yleiskustannus = palkat$Yleiskustannus[i]/k
    )
  )
}


out <- melt(
######## Calculate the final accounts (tilinpäätös)
  out,
  measure.vars = c("Palkat","Sivukulut","Yleiskustannus"),
  variable.name = "Kululaji",
  value.name="Summa"
)
out$Summa <- -out$Summa


############## Jaa myönnöt tasaiseksi tulovirraksi myönnön ajalle
tappio <- aggregate(tap["Summa"], by=tap[c("Yksikko","Projekti")], FUN=sum)
tappio <- tappio[tappio$Summa<0 & tappio$Projekti!="tubu",]


tulot <- kulut[kulut$Kululaji=="Myöntö",]
temp <- tap[tap$Kululaji %in% c("Palkat","Sivukulut","Yleiskustannus"),]
kulut2 <- kulut[kulut$Kululaji!="Myöntö",]
temp <-  aggregate(temp["Summa"], by=temp[c("Yksikko","Projekti")],FUN=sum)
temp2 <- tap[tap$Kululaji %in% c("Palkat"),]
temp2 <-  aggregate(temp2$Summa, by=temp2[c("Yksikko","Projekti")],FUN=sum)


tulot <- merge(
tappio <- merge(
   tulot[colnames(tulot)!="Aika"],  
   projektit.loppu,
   projektit[colnames(projektit) %in% c("Nimi", "Aika")],
   merge(
  by.x = "Projekti",
    merge(tappio, temp, by=c("Yksikko","Projekti")),
   by.y="Nimi"
    temp2
   )
)
)
tulot$Alku <- as.Date(
# Deficit / total salary-related costs * total salary costs. This is the amount of
  unlist(lapply(strsplit(tulot$Aika, "-"), function(x) x[[1]])),
# salary that balances the budget when moved away from a project.
  format="%d.%m.%Y"
tappio$Palkka <- abs(tappio$Summa.x / tappio$Summa.y * tappio$x)
)
#tappio <- tappio[!colnames(tappio) %in% c("Summa.x","Summa.y","x")]
tulot$Loppu <- as.Date(
tappio$Summa <- abs(tappio$Summa.x)
   unlist(lapply(strsplit(tulot$Aika, "-"), function(x) x[[2]])),
 
  format="%d.%m.%Y"
tappio <- merge(
   tappio,
  aggregate(resurssit["Htkk"],by=resurssit[c("Yksikko","Projekti")],FUN=sum)
)
)
# Overspent pm = Overspent salary / (total salary/total pm)
tappio$Ylitys.htkk <- abs(tappio$Palkka / (tappio$x/tappio$Htkk))
cat("Projekteja ylitetty tällä htkk-määrällä\n")
tappio[c("Yksikko","Projekti","Ylitys.htkk")]


out2 <- data.frame()
tap <- rbind(
for(i in 1:nrow(tulot)) {
  tap, #Previous events
   k <- round(as.numeric(ceiling_date(tulot$Loppu,"month")[i] - floor_date(tulot$Alku,"month")[i])/30)
   cbind( # Project deficits corrected from tubu
   out2 <- rbind(
    tappio[c("Yksikko","Projekti","Aika","Summa")],
     out2,
    Kululaji = "Tubusiirto"
    data.frame(
  ),
       Aika = seq(tulot$Alku[1], by = "month", length = k),
   palkanlaskenta( # Project deficits moved to tubu as personnel costs
       Projekti = tulot$Projekti[i],
     merge(
      Kululaji = tulot$Kululaji[i],
       projektit[colnames(projektit)!="Summa"],
      Yksikkö = "YMAL",
       cbind(
       Summa = tulot$Summa[i]/k
        Projekti = "tubu",
        tappio[c("Yksikko","Aika","Palkka")],
        Htkk = 1
       )
     )
     )
   )
   )[colu]
}
)
 
############# Tarvitaanko näitä ja miten yhdistetään?
out$TA.tili <- NULL
kulut2$Lisäerittely <- NULL
kulut2$Kuvaus <- NULL
kulut2$Yksikkö <- "YMAL"
kulut2$Aika <- as.Date(kulut2$Aika, format="%d.%m.%Y")
 
out <- rbind(out, out2, kulut2)
out$Summa[is.na(out$Summa)] <- 0
 
##################### Remove extra details from time
 
#out <- out[out$Kuukausi >= alku & out$Kuukausi <= loppu , ]


out$Kausi <- floor_date(out$Aika, "month")
################### Project reporting


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


d <- rbind(
d <- rbind(
   aggregate(out["Summa"], by = out[c("Kausi","Projekti","Yksikkö")], FUN="sum"),
   aggregate(tap["Summa"], by = tap[c("Aika","Projekti","Yksikko")], FUN="sum"),
   cbind(
   cbind(
     aggregate(out["Summa"], by = out[c("Kausi","Yksikkö")], FUN="sum"),
     aggregate(tap["Summa"], by = tap[c("Aika","Yksikko")], FUN="sum"),
     Projekti = "Total"
     Projekti = "Total"
   )
   )
)
)


d<-d[order(d$Projekti, d$Kausi),]  
d<-d[order(d$Projekti, d$Aika),]  
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=Kausi, y=Csum, colour=Projekti))+geom_line(size=2)+
d <- d[!d$Projekti %in% c("Batman","DWDSOME","Goherr","IM-Vesi","KaivosVV","Mineview","Tekaisu2017"),]
ggplot(d, aes(x=Aika, y=Csum, colour=Projekti))+geom_line(size=2)+
   labs(title="YMALin rahatilanteen kehitys projekteittain")
   labs(title="YMALin rahatilanteen kehitys projekteittain")
</rcode>
==== Initiate functions ====
<rcode name="initiate" label="Initiate functions (for developers only)">
# This is code Op_fi5758/initiate on page [[Eurykleia]]
library(OpasnetUtils)
############# Generic functions
### Fetches a table based on a topic
hae <- function(aihe) {
  aihe <- match(aihe, tables$Kuvaus)
  out <- html_table(read_html(tables$URL[aihe]))[[tables$Taulu[aihe]]]
  out$Yksikko <- tables$Yksikko[aihe]
  return(out)
}
#### Takes a string and separates start and end dates with 1 month precision
jakso <- function(
  obj, # obj is character vector with date range e.g. 1.1.2017-31.12.2017,
  al # al is 1 for beginning, 2 for end.
) {
  obj <- gsub("–", "-", obj) # COnfluence has a habit of automatically changing these but some problem with gsub.
  floor_date(
    as.Date(
      unlist(lapply(strsplit(obj, "-"), function(x) x[[al]])),
      format="%d.%m.%Y"
    ),
    "month"
  )
}
#### Changes input from percentages to fractions
pros <- function(x) {
  if(!is.numeric(x)) x <- as.numeric(as.character(gsub("[ %]", "", x)))/100
  return(x)
}
#### Divides a repeating event to each month in the period
aikajako <- function(
  x, # data.frame to be divided
  divs = NULL # names of columns that are to be divided rather than copied
) {
  out <- data.frame()
  for(i in 1:nrow(x)) {
    k <- round(as.numeric(jakso(x$Aika[i],2) - jakso(x$Aika[i],1))/30.25)+1
    out <- rbind(
      out,
      data.frame(
        Aika = seq(jakso(x$Aika[i],1), by = "month", length = k),
        x[i,colnames(x)!="Aika"],
        k = k,
        row.names=NULL
      )
    )
  }
  if(!is.null(divs)) {
    for(i in divs) {
      out[[i]] <- out[[i]]/out$k
    }
  }
  out$k <- NULL
  return(out)
}
### Calculates the salaries for each period
palkanlaskenta <- function(x) {
  x$Palkat <- x$Htkk * x$Palkka
  x$Sivukulut <- x$Palkat * x$HSK
  x$Yleiskustannus <- (x$Palkat + x$Sivukulut) * x$YKH
  out <- melt(
    x,
    measure.vars = c("Palkat","Sivukulut","Yleiskustannus"),
    variable.name = "Kululaji",
    value.name="Summa"
  )
  out$Summa <- -out$Summa
  return(out)
}
rm(wiki_username)
objects.store(list=ls())
cat("Objects", ls(), "stored.\n")
</rcode>
</rcode>



Nykyinen versio 9. marraskuuta 2018 kello 14.55




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.

Laske rahatilanne

+ Näytä koodi

Initiate functions

+ 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