% .tex-tiedosto projektin dokumenttien latomiseksi.

% Kirjoitelmaluokka, tässä käytetään projektien projdoc-luokkaa.
\documentclass[twoside]{projdoc}

\usepackage{paralist}
\usepackage{alltt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{enumitem}
\usepackage{tikz}
\usepackage{gensymb}
\usepackage{comment}
\usetikzlibrary{positioning,shapes,shadows,arrows}

\setlist[enumerate]{leftmargin=2cm}

\setlength\emergencystretch{2em}
\newcommand{\note}[1]{\emph{{\bf Huom.:} {\small#1}}}
\newcommand{\transl}[1]{(engl. \emph{#1})}
\newcommand{\refwithpage}[1]{\strut
	\ref{#1}
	\ifthenelse{\equal{\arabic{page}}{\pageref{#1}}}
	{}
	{sivulla \pageref{#1}}\strut	
}


% Projektin nimi
\project{Kepler}

% Luottamuksellisuus: käytä termiä 'Luottamuksellinen' tai 'Julkinen'
\publicity{Julkinen}

% Versionumero: numerointikäytäntö on projektikohtainen
\version{0.8.0}

% Dokumentin nimi
\title{Vaatimusmäärittely}

% Tekijät: huomaa aakkosjärjestys sukunimen mukaan
\author{Joonas Konki}
    {Anu Koskela}
    {Mikko Kuhno}
    {Henrik Paananen}
    {Atte Räty}
% Puhelinnumerot: tekijöitä vastaava järjestys!
\authorphones{044-9975150}{040-7255948}{040-9105675}{044-5885874}{040-5734898}
% Sähköpostiosoitteet: tekijöitä vastaava järestys!
\authoremails{joonas.konki@jyu.fi}
    {anu.k.koskela@student.jyu.fi}
    {mikko.kuhno@gmail.com}
    {henrik.j.paananen@student.jyu.fi}
    {atte.t.raty@student.jyu.fi}
% Etu- ja sukunimen alkukirjaimet: tekijöitä vastaava järjestys!
\authorinitials{JK}{AK}{MK}{HP}{AR}

% Tiivistelmä dokumentista: tämä ei siis ole tiivistelmä projektista,
% vaan tämän ko. dokumentin tarkoituksesta.
\docabstract{Kepler-projekti kehitti Jyväskylän yliopiston fysiikan laitokselle
	WWW-sovelluksen oppilaslaboratorion töiden mittausvuorojen varaamiseen.
    Vaatimusmäärittelyssä esitetään sovelluksen tarpeet, rakennetta ja vaatimukset.
}

% Tiivistelmä projektista
\projectabstract{Projekti kehitti oppilaslaboratorion varausjärjestelmän Jyväskylän yliopiston fysiikan laitokselle.}

% Avainsanat: dokumentin sisältöön liittyviä olennaisia asiasanoja: aakkosjärjestys, ensimmäinen sana isolla alkukirjaimella ja piste loppuun.
\keywords{Ajanvaraus, järjestelmän kuvaus, kalenteri, kokonaisrakenne, käyttäjäroolit,
	oppilaslaboratorio, prioriteetit, rajoitteet, tekniset vaatimukset, toiminnalliset
	vaatimukset, tuettava prosessi, vaatimusmäärittely, vaatimusten tilat,
	varausjärjestelmä, WWW-sovellus.}

% Varsinainen tulosteessa näkyvä ladonta alkaa
\begin{document}
\sloppy

% Tämä latoo versiohistorialle ympäristön, sen alapuolelle ladotaan
% versiohistoriataulukko. Esimerkin vuoksi tehty.
\versionhistory

\begin{tabular}{|c|r|p{9.0cm}|p{1.2cm}|}
\hline
{\bf Versio}&{\bf Päivämäärä}&{\bf Muutokset}&{\bf Tekijät}\\
\hline\hline
\versionrow{0.0.1}{16.2.2015}{Alustava versio vaatimusmäärittelystä luotiin.}{HP}
\versionrow{0.0.2}{24.2.2015}{Vaatimusten prioriteetti- ja tilaikonit lisättiin.}{HP}
\versionrow{0.0.3}{25.2.2015}{Tekstiä ja dokumentin rakennetta muokattiin.}{HP}
\versionrow{0.0.4}{7.3.2015}{Tekstiä ja dokumentin rakennetta muokattiin palautteen mukaan.}{HP}
\versionrow{0.0.5}{9.3.2015}{Vaatimuksia tarkennettiin ja jaettiin useampaan ryhmään.}{HP}
\versionrow{0.0.6}{10.3.2015}{Tehtiin termeihin lisäyksiä ja vaatimuksiin korjauksia.}{HP}
\versionrow{0.1.0}{11.3.2015}{Käytettävien sovelluskehyksien alalukua muokattiin ja laboratoriotyö lisättiin termiksi.}{HP}
\versionrow{0.1.1}{12.3.2015}{Tekstiä ja vaatimuksia muokattiin ja korjattiin saadun palautteen perusteella.}{HP}
\versionrow{0.1.2}{17.3.2015}{Tekstiä muokattiin ja korjattiin saadun palautteen perusteella.}{HP}
\versionrow{0.2.0}{24.3.2015}{Vaatimuksia muokattiin, korjattiin ja lisättiin saadun palautteen perusteella.}{HP}
\versionrow{0.3.0}{25.3.2015}{Vaatimuksia tarkennettiin.}{HP}
\versionrow{0.4.0}{31.3.2015}{Tekstiä muokattiin ja korjattiin saadun palautteen perusteella.}{HP}
\versionrow{0.4.1}{23.4.2015}{Tekstiä muokattiin ja korjattiin saadun palautteen perusteella.}{HP}
\versionrow{0.5.0}{23.4.2015}{Vaatimusten tiloja päivitettiin.}{HP}
\versionrow{0.5.1}{11.5.2015}{Vaatimusten tiloja päivitettiin.}{HP}
\versionrow{0.5.2}{17.5.2015}{Korjattiin \emph{ICal}-termi \emph{iCalendar}iksi.}{HP}
\versionrow{0.5.3}{17.5.2015}{Sisältölukuja muokattiin saadun palautteen perusteella.}{HP}
\versionrow{0.5.4}{26.5.2015}{Vaatimuksien tiloja muokattiin ja osasta vaatimuksista tehtiin hienojakoisempia.}{HP}
\versionrow{0.6.0}{27.5.2015}{Yhteenvetolukua muokattiin.}{HP}
\versionrow{0.6.1}{27.5.2015}{Vaatimusten tiloja päivitettiin.}{HP}
\versionrow{0.6.2}{28.5.2015}{Vaatimusten tiloja päivitettiin ja yhteenvetoa kirjoitettiin.}{HP}
\end{tabular}
\newpage

\begin{tabular}{|c|r|p{9.0cm}|p{1.2cm}|}
\hline
{\bf Versio}&{\bf Päivämäärä}&{\bf Muutokset}&{\bf Tekijät}\\
\hline\hline
\versionrow{0.6.3}{3.6.2015}{Johdantolukua päivitettiin.}{HP}
\versionrow{0.7.0}{3.6.2015}{Sisältölukuja päivitettiin.}{HP}
\versionrow{0.7.1}{11.6.2015}{Sisältölukuja korjattiin palautteen mukaan.}{HP}
\versionrow{0.7.2}{11.6.2015}{Vaatimuksia korjattiin palautteen mukaan.}{HP}
\versionrow{0.7.3}{12.6.2015}{Vaatimuksia korjattiin palautteen mukaan.}{HP}
\versionrow{0.8.0}{14.6.2015}{Johdantolukua viimeisteltiin.}{HP}
\end{tabular}

% \projectinfo latoo projektin tiivistelmän.
% Projektin tiivistelmä ja tekijöiden tiedot ladotaan automaattisesti sivun
% alkuun. Eli lisättävä projektiorganisaation tiedot muiden kuin tekijöiden
% osalta sekä tarvittavat yhteystiedot.
\projectinfo


% infotable ympäristö helpottaa hieman henkilö- ja muiden tietojen listausta
\newenvironment{infotable}[1]{
    \textbf{#1:} \\
    \begin{tabular}{p{5cm}p{9cm}}
}{
    \end{tabular}
    \vspace{1truecm}
}

% \infoitem helpottaa henkilö- ja muiden tietojen listausta
\newcommand{\infoitem}[2]{~$\bullet$~~#1 & \texttt{#2}\\}
\newcommand{\infoitemx}[3]{~$\bullet$~~#1 & \texttt{#2} ja\\ \ & \texttt{#3}\\}

\begin{infotable}{Tilaaja}
\infoitem{Sakari Juutinen}{sakari.juutinen@phys.jyu.fi}
\infoitem{Panu Rahkila}{panu.rahkila@jyu.fi}
\end{infotable}

\begin{infotable}{Ohjaajat}
\infoitem{Petri Partanen}{petri.m.partanen@student.jyu.fi}
\infoitem{Jukka-Pekka Santanen}{santanen@mit.jyu.fi}
\end{infotable}

\begin{infotable}{Yhteystiedot}
\infoitemx{Sähköpostilistat:}{keplerit@korppi.jyu.fi}{keplerit\_opetus@korppi.jyu.fi}
\infoitemx{Sähköpostiarkistot:}
    {http://korppi.jyu.fi/kotka/servlet/ list-archive/keplerit/}
    {http://korppi.jyu.fi/kotka/servlet/ list-archive/kepler\_opetus/}
% ~$\bullet$~~Työhuone: & Agora C226.4, puh. 040-3573826
\end{infotable}

%----------------------------------------------------------------------------
% \mainmatter latoo automaattisesti sisällysluettelon ym. alkusivut, ja
%% sen jälkeen alkaa dokumentin sisällysluettelossa näkyvät luvut.
\mainmatter


%---------------------------------------------
% Johdanto
%---------------------------------------------
\chapter{Johdanto}\label{chptr:johdanto}

Kepler-projekti kehitti kevään 2015 Sovellusprojekti-kurssilla WWW-sovelluksen
Jyväskylän yliopiston fysiikan laitoksen oppilaslaboratorion laboratoriotöiden
mittausvuorojen varaamiseen. Uusi varausjärjestelmä tulee korvaamaan edeltävän
Brahe2007-järjestelmän.

Brahe on vastannut laitoksen tarpeita hyvin ainakin oppilaiden
näkökulmasta. Järjestelmässä ei kuitenkaan ole pääkäyttäjälle omaa näkymää, jonka
kautta hallita laboratoriotöiden, laboratoriovuorojen ja ohjaajien tietoja. Lisäksi 
vanhan järjestelmän ylläpito ja jatkokehitys oli liian työlästä, joten uuden
järjestelmän kehittäminen katsottiin parhaaksi ratkaisuksi.

Uuteen järjestelmään kehitettyjä ominaisuuksia ovat opiskelijan ja ohjaajan näkymien
ohella aiemmasta järjestelmästä puuttuvat kalenterinäkymä ja pääkäyttäjän näkymä.
Lisäksi uusi järjestelmän tukee ainakin kahta kieltä: suomea ja englantia.
Kehityksen yhteydessä otettiin huomioon myös muiden yliopiston laitosten tarpeita, jotta
kehitetty sovellus olisi vähäisin muutoksin otettavissa heidän käyttöönsä.

Dokumentti kuvaa projektissa kehitetyn järjestelmän tarpeita, rakennetta ja vaatimuksia. Luku \ref{chp:termit} kuvaa dokumentissa käytettäviä aihealueen, tietojärjestelmän ja
toteutustekniikoiden termejä. Luku \ref{chp:taustaa} kuvaa järjestelmällä tuettavia
prosesseja. Luku \ref{chp:kayttajat} esittää järjestelmän käyttäjäroolit ja kuvaa heidän
tarpeitaan. Luvussa \ref{chp:jarjestelma} esitetään järjestelmän kokonaisrakenne ja
suhteet muihin tietojärjestelmiin. Luvussa \ref{chp:priotilat} esitetään käytetyt
merkinnät vaatimuksien prioriteeteille ja tiloille. Luvussa \ref{chp:vaatimukset}
on listattu järjestelmän toiminnalliset vaatimukset ja luvussa \ref{chp:tekn_vaatimukset} %\ref{chp:rajoitteet}
järjestelmän tekniset ja laadulliset vaatimukset. %vaatimukset ja rajoitteet.

%\note{Siirtääkö viimeinen kappale aiemmaksi?}

Projektin projektiraportissa \cite{projraportti} kuvataan projektin läpivientiä,
tavoitteita ja taustaa. Lisäksi projektiraportissa esitetään tarkemmin kehitetyllä
järjestelmällä tuettavia prosesseja. Sovellusraportissa \cite{sovraportti} kuvataan 
kehitetyn sovelluksen toteutusratkaisuja ja rakennetta. Sovelluksen lähdekoodidokumentaatio koostuu kahdesta osasta: palvelinpuolen sovelluksen
\cite{back_end_doc} ja asiakkaan sovelluksen lähdekoodidokumentaatio \cite{front_end_doc}.

% !!! Hyödynnetyt dokumentit

%---------------------------------------------
% Termit
%---------------------------------------------
\chapter{Termit}\label{chp:termit}

Luvussa kuvataan projektissa ja dokumentissa käytettäviä aihealueen, tietojärjestelmän ja teknisiä termejä.

%\note{Ovatko termit ajan tasalla?}

\section{Aihealueen termejä}
Projektin aihealueen termejä ovat seuraavat:

% Termilistat ladotaan Ventry-ympäristöllä, parametrina pisin termi,
% jolloin sisentyy oikein:
\begin{Ventry}{Oppilaslaboratorio}
\item[Assistentti] on fysiikan laboratoriotöiden ohjaajasta käytetty nimitys. Hän on perus-, aine- tai syventäviin opintoihin liittyvien
kurssien laboratoriotöitä laboratoriovuoron aikana ohjaava henkilö.
\item[Laboratoriotyö] on mittausvuorolla suoritettava johonkin kurssiin liittyvä työ.
\item[Laboratoriovuoro] on yleensä neljän tunnin mittainen assistentin ohjaama tilaisuus, jossa laboratoriotöihin liittyvät mittaukset
voidaan suorittaa.
\item[Mittauslaitteisto] on yhdestä tai useammasta mittalaitteesta koostuva laitteisto, jolla laboratoriotyön mittaukset suoritetaan.
\item[Mittausryhmä] on opiskelijajoukko, joka on varannut ajan laboratoriotyön mittaamiseen jollekin ohjatulle laboratoriovuorolle.
\item[Mittausvuoro] on opiskelijan joltakin laboratoriovuorolta varaama aika jonkin tietyn laboratoriotyön mittaamiseen.
\item[Ohjaaja] on assistentin käyttäjäroolin nimi kehitetyssä varausjärjestelmässä.
\item[Ohjausvuoro] on ohjaajan laboratoriovuoro, jolle hänet on asetettu ohjaajaksi.
\item[Opiskelija] on mittausvuoroja varaavan opiskelijan käyttäjäroolin nimi kehitetyssä varausjärjestelmässä.
\item[Oppilaslaboratorio] on fysiikan laitoksen oppilaslaboratorio, jonka vuorojen varaukseen järjestelmä kehitettiin.
\item[Pääkäyttäjä] on oppilaslaboratorion johtajan käyttäjäroolin nimi kehitetyssä varausjärjestelmässä. Pääkäyttäjä on henkilö, joka hallitsee
toisten käyttäjien rooleja ja lisää laboratoriotöitä järjestelmään.
\end{Ventry}


\section{Ohjelmistoja ja teknisiä termejä}
Dokumentissa käytettyjä teknisiä termejä ovat seuraavat:

\begin{Ventry}{WWW-sovelluskehys}
\item[Back end] on ohjelmiston se osa, joka on kauimpana ohjelmiston käyttäjästä. WWW-sovelluksessa se on palvelinpuolen ohjelmisto.
\item[Bootstrap] on WWW-dokumenttien ulkoasun muokkausta helpottava, HTML-kuvauskieltä ja CSS-tyylikieltä käyttävä kirjasto.
\item[CSRF] on tietoturvahyökkäys, joka pakottaa käyttäjän suorittamaan hänen haluamattaan toimintoja WWW-sovelluksessa, johon hän on kirjautunut. Termi tulee sanoista \emph{cross-site request forgery}.
\item[CSS] on tyylikieli WWW-dokumenttien ulkoasun määrittämiseen.
\item[Front end] on ohjelmiston se osa, joka on lähimpänä ohjelmiston käyttäjää. Käytännössä front end sisältää sovelluksen käyttöliittymän ja
sen toimintalogiikan.
\item[HTML5] on uusin versio WWW-dokumenttien HTML-kuvaus\-kielestä.
\item[HTTPS] on WWW:ssä suojattuun tietoliikenteeseen käytetty protokolla.
\item[iCalendar] on kalenteritiedostomuoto, jolla kalenterisovellukset pystyvät vaihtamaan kalenteritietoja keskenään.
\item[JavaScript] on WWW-sovelluksissa käytetty ja WWW-selaimissa toimiva dynaamisesti tyypitetty ohjelmointikieli.
\item[jQuery] on WWW-dokumenttien dynaamisen sisällön käsittelyä helpottava avoimen lähdekoodin lisenssin alainen JavaScript-kirjasto.
\item[JYU-tunnukset] ovat Jyväskylän yliopiston IT-palveluiden käyttäjän henkilökohtaiset käyttäjätunnukset.
\item[Korppi] on Jyväskylän yliopiston opintotietojärjestelmä.
\item[Käyttöliittymä] on ohjelmiston osa, jonka kautta käyttäjä käyttää ohjelmistoa.
\item[OAuth2] on sovelluksessa autentikointiin käytettävä protokolla.
\item[ORM] on tekniikka, jolla tietokannan tietoja pystytään helposti käsittelemään suoraan ohjelmointikielen olioiden kautta.
%\item[Pyramid] on WWW-sovelluskehys, joka on toteutettu Python-ohjelmointikielellä.
%Python-ohjelmointikielellä toteutettu WWW-sovelluskehys.
\item[Pyramid] on Python-ohjelmointikielellä toteutettu minimalistinen WWW-sovelluskehys.
\item[Python] on dynaamisesti tyypitetty korkeantason ohjelmointikieli.
\item[Sovelluskehys] on ohjelman rungon muodostava teknologia.
\item[SQL] on yleisesti käytetty relaatiotietokantastandardi.
\item[SQLAlchemy] on avoimen lähdekoodin SQL- ja ORM-kirjasto Python-kielelle.
\item[Tietokanta] on tietovarasto, joka tyypillisesti mallintaa jollain tapaa tiedon yhteyksiä toisiin tietoihin. Tällöin puhutaan relaatiotietokannasta.
\item[WWW-sovellus] on WWW-tekniikoita hyödyntävä ja selaimella käytettävä sovellus.
\item[WWW-sovelluskehys] on sovelluskehys, joka on suunniteltu nopeuttamaan WWW-sovellusten kehittämistä.
\end{Ventry}


%---------------------------------------------
% Taustaa ja tuettava prosessi
%---------------------------------------------
\chapter{Taustaa ja tuettava prosessi}\label{chp:taustaa}

Jyväskylän yliopiston fysiikan laitoksen kursseihin liittyy usein laboratorio-osuus,
jolla sovelletaan kurssilla opittua käytännössä. Laboratoriossa suoritettavia töitä voi
kurssilla olla useita, joista osa on vaihtoehtoisia. Oppilaat varaavat mittausvuoron
ja suorittavat laboratoriossa mittauksia yksin tai parin kanssa. Laboratoriotöitä ohjaamassa on laboratorio-ohjaaja.
Kyseinen assistentti on opiskelija, tohtorikoulutettava tai tutkija, joka on itse suorittanut kyseisen työn ja on siten
valmis ohjaamaan toisia työn suorittamisessa.

Laboratoriovuorot alkavat yleensä kello 8.00, 12.00 tai 16.00 ja kestävät neljä tuntia.
Laboratoriovuorolla tehtävät työt on jaettavissa kahdella tapaa: kurssin tason mukaan
perusopinto- tai aineopintotyöksi ja lappu- tai selostustyöksi. ``Lapputyö`` on työ,
jonka opiskelija suorittaa vuoron aikana täyttäen valmiin kaavakkeen. Vuoron päätteeksi
assistentti tarkistaa kaavakkeen. Selostustyö mitataan vuorolla, jonka jälkeen opiskelija
kirjoittaa työstä raportin ja palauttaa sen työstä vastaavalle assistentille
tarkastettavaksi.

Laboratoriovuorojen saatavuudesta päättää fysiikan laitoksen oppilaslaboratorion johtaja,
joka on kehitettävän järjestelmän pääkäyttäjä. Hän lisää laboratoriovuorot varattavaksi
ja määrää niille ohjaajat. Pääkäyttäjä pyrkii ottamaan huomioon opiskelijoiden aikataulun
ja kurssien luentojen ajankohdat lisätessään vuoroja järjestelmään.
%Joskus järjestelmässä olevien töiden tekemistä joudutaan rajoittamaan johtuen rikkoutuneista mittauslaitteistosta.
%Tällöin pääkäyttäjä joutuu muokkaamaan työn tietoja rajoittaen sen varaamista.

Kehitetyllä varausjärjestelmällä tuettavia prosesseja kuvataan tarkemmin 
Kepler-projektin projektiraportissa \cite{projraportti}.

%\note{Viittaus sovellusraporttiin?}


%---------------------------------------------
% Järjestelmän käyttäjät
%---------------------------------------------
\chapter{Järjestelmän käyttäjäroolit ja toiminnot}\label{chp:kayttajat}

Järjestelmän käyttäjillä on erilaisia käyttäjärooleja, joiden mukaan heidän oikeutensa eri toimintojen suorittamiseen
järjestelmässä määräytyvät. Käyttäjällä voi olla yhtäaikaa useita käyttäjärooleja. 
Alaluvuissa on kuvattu kyseiset käyttäjäroolit ja niiden suhde järjestelmään.

\section{Kaikki käyttäjät}

Kaikille käyttäjille yhteisenä järjestelmässä on ilmoitustaulu, jonka avulla
varausjärjestelmän käyttäjille pystytään tiedottamaan oppilaslaboratorioon liittyvistä
asioista. Ilmoitustaulu on järjestelmän ensimmäinen sivu sisäänkirjauksen jälkeen.
Kaikilla käyttäjillä on käyttäjäroolina oletusarvoisesti \emph{opiskelija}.
%Joissain tapauksissa ilmoitustaulusivulla on myös henkilökohtaisia ilmoituksia, joihin käyttäjä pystyy reagoimaan.
%Esimerkiksi opiskelijan varaaman mittausvuoron peruuntumisesta näytetään opiskelijalle viesti ilmoitustaululla. Samoin
%ohjaajalle näkyy ilmoitustaululla mahdollinen tieto hänen ohjausvuoronsa peruuntumisesta.

\section{Opiskelija}

Opiskelija on fysiikan laitoksen opinto-oikeuden omaava opiskelija, joka varaa 
järjestelmästä mittausvuoroja. Opiskelijan pääasiallisena toimintona järjestelmässä on
valita laboratoriotyö ja etsiä kalenterista varattava aika, jolloin kyseisen työn voi
mitata. Opiskelija varaa sopivan ajan, jonka jälkeen hän näkee vuoron omassa järjestelmän sisäisessä kalenterissaan. Opiskelija pystyy perumaan varaamansa vuoron,
jos vuoron alkuun on vielä riittävästi aikaa. Yleensä peruminen tulee tapahtua
vähintään kaksi työpäivää ennen vuoron alkua.

Opiskelija pystyy myös luomaan mittausryhmiä ja lisäämään näihin toisia opiskelijoita
jäseniksi. Mittausryhmän jäsen pystyy varaamaan mittausvuoron koko ryhmälle. Jäsen
pystyy myös perumaan ryhmälle varatun mittausvuoron. Lisäksi ryhmän jäsen pystyy
poistumaan ryhmästä, mutta vain mittausryhmän luoja pystyy merkitsemään mittausryhmän
poistetuksi.

%\note{Alaluku sivun lopussa: newpage?}
\newpage
\section{Ohjaaja}

Ohjaaja ohjaa opiskelijoita laboratoriovuorolla. Ohjaaja voi olla, ja usein onkin, opiskelija. Ohjaajan perusoikeudet ovat siis samat kuin opiskelijan. Tämän
lisäksi ohjaaja pystyy tarkastelemaan kaikkia laboratoriovuoroja, joilla hän on
ohjaajana. Vuorojen tiedoista ohjaaja pystyy näkemään vuorolle ilmoittautuneiden
opiskelijoiden listan. Jos joku opiskelijoista jättää tulematta vuorolle, pystyy ohjaaja
tallentamaan tästä merkinnän järjestelmään. Samoin, jos opiskelijan mittaukset jäävät
laboratoriovuorolla kesken, voi ohjaaja kirjata merkinnän järjestelmään.

Koska ohjaajat voivat pyytää ohjattavan laboratoriovuoron vaihtoa pääkäyttäjältä, on
ohjaajien myös hyvä nähdä toisten ohjaajien laboratoriovuorot. Tällöin ohjaajat voivat
sopia vuorojen vaihdosta ja pyytää pääkäyttäjältä, että tämä tekee vaihdon järjestelmään.
%Koska ohjaajat voivat halutessaan vaihtaa ohjattavia laboratoriovuoroja keskenään, täytyy ohjaajan nähdä myös muiden
%ohjaajien ohjausvuorot. Ohjaaja pystyy ehdottamaan laboratoriovuoron vaihtoa toisen ohjaajan kanssa. Ohjausvuoron vaihtoehdotus
%Tällöin ehdotus
%näkyy sen ohjaajan ilmoitustaululla, jolle toinen ohjaaja ehdotuksen teki. Ilmoituksen kautta ohjaaja pystyy hyväksymään
%ohjausvuorojen vaihdon.

\section{Pääkäyttäjä}

Pääkäyttäjällä on oikeus hallita järjestelmän laboratoriotöitä, niihin
liittyviä resursseja (mittalaitteet) sekä varattavia laboratorio- ja mittausvuoroja.
Pääkäyttäjällä on myös samat oikeudet kuin ohjaajalla.

Pääkäyttäjä pystyy lisäämään ja muokkaamaan laboratoriotöitä sekä merkitsemään niitä
poistetuiksi. Työlle hän määrää sen tason ja kurssin, johon se liittyy. Hän pystyy
lisäämään ja poistamaan työn vaatimia resursseja, joita ovat yleensä mittalaitteet
sekä työpisteet ja -tilat.

Pääkäyttäjä pystyy myös lisäämään järjestelmään uusia resursseja ja muokkaamaan olemassa
olevien resurssien lukumääriä ja tiloja. Tila voi olla esimerkiksi \emph{varattavissa},
\emph{huollossa} tai \emph{pois käytöstä}. Vain varattavissa olevat resurssit otetaan
huomioon tietyn laboratoriotyön varausaikoja etsittäessä ja varausta tehtäessä.

Pääkäyttäjä lisää järjestelmään varattavaksi laboratoriovuoroja. Vuorolle hän määrittää
sen tason ja ohjaajan. Vuoron taso voi olla esimerkiksi \emph{perusopinnot} tai 
\emph{aineopinnot}. Tällöin vuorolta voi varata mittausvuoroja vain laboratoriotöille,
joiden taso on sama kuin laboratoriovuoron.

Pääkäyttäjällä on mahdollisuus perua mittausvuoroja tai kokonaisia laboratoriovuoroja.
Jos laboratoriovuoro perutaan, myös kaikki sille tehdyt varaukset kirjataan perutuiksi.

Pääkäyttäjällä on lisäksi oikeutena muuttaa muiden käyttäjien rooleja ja muokata eri
rooleihin liittyviä oikeuksia. Eri oikeuksia ovat esimerkiksi \emph{vuoron varaus},
\emph{perusopintotyön ohjaaja}, \emph{aineopintotyön ohjaaja}, \emph{laboratoriovuorojen
 hallinta} ja \emph{resurssien hallinta}.

Pääkäyttäjä on myös ainut käyttäjärooleista, joka pystyy muokaamaan järjestelmän etusivun
ilmoitustaulua. Hän pystyy luomaan uusia viestejä ilmoitustaululle, sekä muokkaamaan ja
piilottamaan jo olemassa olevia ilmoituksia.


%---------------------------------------------
% Järjestelmän kuvaus
%---------------------------------------------
\chapter{Järjestelmän kokonaisrakenne ja toteutusratkaisut}\label{chp:jarjestelma}

Luvussa kuvataan kehitetyn varausjärjestelmän kokonaisrakennetta ja yleisimpiä toteutusratkaisuja.

\section{Järjestelmän rakenne}

Varausjärjestelmä on WWW-sovelluksille tavanomaisesti kolmitasoinen \transl{three-tiered}. Nämä tasot ovat esitys, ohjelma ja tallennus
\transl{presentation, application and storage}. Esitystaso toteutetaan WWW-sovelluksissa
luonnollisesti käyttäen HTML-, CSS- ja JavaScript-tekniikoita. Ohjelmataso on yleensä
palvelinsovellus, joka on toteutettu käyttäen jotain sopivaa teknologiaa. Tallennustaso
on toteutettu varausjärjestelmässä tietokantana.

Esitystaso vastaa sovelluksen front endiä sisältäen siis käytännössä sen käyttöliittymän ja käyttöliittymälogiikan. Ohjelma- ja tallennustaso vastaavat
sovelluksen back endiä sisältäen ohjelman varsinaisen toimintalogiikan.
Kuvassa \refwithpage{fig:rakenne} on esitetty järjestelmän kokonaisrakenne.

\begin{figure}[h!]
\includegraphics[width=\textwidth]{images/kokonaisrakenne.png}
\caption{\label{fig:rakenne}Varausjärjestelmän kokonaisrakenne ja yhteys muihin järjestelmiin.}
\end{figure}

\section{Hyödynnetyt sovelluskehykset ja teknologiat}

Varausjärjestelmä toteuttiin käyttäen Python-kieltä ja Pyramid-nimistä
WWW-sovelluskehystä. Pyramid sisältää kaiken oleellisen järjestelmän kehittämiseen.
Front end -puolella WWW-sivujen laatimista nopeuttavat mallisivut \transl{template},
joiden avulla eri sivuille on helppo saada yhtenäinen ulkoasu ja toiminnallisuus.
Back end -puolella Pyramid käyttää SQLAlchemy-nimistä ORM-kirjastoa, joka helpottaa
tietokannan käsittelyä Python-koodissa.

Käyttöliittymän JavaScript-toteutuksessa hyödynnettiin jQuery-kirjastoa, joka helpottaa
käyttöliittymälogiikan kirjoittamista ja piilottaa joitain WWW-selainten eroavuuksia.
Käyttöliittymän yksi oleellisimmista komponenteista on kalenteri. Sen toteutukseen
järjestelmässä käytettiin jQueryn lisäosaa, FullCalendaria, joka nopeuttaa ja
yhdenmukaistaa eri kalenterinäkymien toteutusta.

Käyttöliittymän skaalautuvuuden parantamiseksi sen toteutukseen käytettiin lisäksi
Bootstrap-kirjastoa. Bootstrap sisältää valmiit CSS-määrittelyt erilaisten
sivuasetteluiden toteuttamiseksi, ja ne sekä nopeuttavat käyttöliittymän toteutusta
että tekevät käyttöliittymästä skaalautuvamman.

Järjestelmän tallennustasona toimivaa tietokannanhallintajärjestelmää ei tarvinnut
päättää vielä Kepler-projektin aikana, koska SQLAlchemy pystyy toimimaan
useimpien SQL-tietokannanhallintajärjestelmien kanssa. Tietokannanhallintajärjestelmä
tulee valita viimeistään, kun varausjärjestelmä asennetaan käyttöön.

Tietokannahallintajärjestelmän valintaa suorittaessa tulee huomioida eri
vaihtoehtojen rajoitteet ja poikkeavuudet standardista, joita ei SQLAlchemyn tasolla
pystytä yhtenäisesti tukemaan. Toteutuksessa tulisi siis käyttää vain SQL-standardin
määrittelemiä ja kaikkien mahdollisten tietokannanhallintajärjestelmien tukemia
ominaisuuksia. Näin projektin loppuvaiheessa ja järjestelmää asennettaessa tarvitsee
tehdä minimaalinen määrä työtä tietokannanhallintajärjestelmän valitsemisen yhteydessä.

Hyviä vaihtoehtoja tietokannanhallintajärjestelmäksi ovat esimerkiksi
PostgreSQL ja MariaDB. PostgreSQL:n toteutus on hyvin standardia seuraava, joten se
toimii Kepler-varausjärjestelmän kanssa hyvin. MariaDB on taas suositusta MySQL:stä
uudella lisenssillä toteutettu haara, joka on yhteensopiva alkuperäisen MySQL:n kanssa.
Molemmat esitetyt vaihtoehdot ovat myös kehitetyn varausjärjestelmän lisenssin kanssa
yhteensopiva.

\section{Autentikointi ja Korppi-integraatio}

Toteutettu järjestelmä hyödyntää Jyväskylän yliopiston olemassa olevaa 
OAuth2-autentikointipalvelua ja tietojärjestelmien yleisiä rajapintoja. Rajapinnan
kautta saadaan haettua varausjärjestelmään käyttäjien tietoja, kuten nimi
ja sähköpostiosoite.
%Järjestelmän on tarkoitus hyödyntää olemassa olevan Korppi-järjestelmän rajapintoja ainakin käyttäjän autentikointiin ja
%kalenterinäkymän toteuttamiseen. Autentikointi tapahtuu käyttäen OAuth2-protokollaa, jonka avulla Korppi-järjestelmästä
%saadaan myös tarpeellisia käyttäjän tietoja, kuten nimi ja sähköpostiosoite.

Kalenteri-integraation tarkoituksena on pystyä esittämään varausjärjestelmän
kalenterissa käyttäjän Korppi-kalenterissa olevat tapahtumat ja myös tarjota
Korppi-kalenterin esitettäväksi varausjärjestelmässä olevat käyttäjän
mittausvuorovaraukset ja laboratoriovuoron ohjaukset. Toiminnallisuus on
toteutettavissa kaksisuuntaisilla iCalendar-syötteillä.

Projektin puitteissa kalenteri-integraatiota ei saatu kuitenkaan toteutettua.
Korppi tarjoaa kalenteristaan iCalendar-syötteen, jota varausjärjestelmä pystyisi
hyödyntämään suoraan, mutta tämä vaatisi, että käyttäjä syöttää käsin varausjärjelmään
Korpista saamansa kalenterisyötteen URL-osoitteen. Tätä helpottamaan
autentikointirajapinta toteuttaa kutsun kalenterisyötteen hakemiseksi, mutta kyseinen
rajapinta on vielä kesken Korpin osalta.

Varausjärjestelmästä Korppi-kalenterissa näytettävä syöte sovittiin myös projektin
jälkeiseen jatkokehitykseen. Tämä olisi vaatinut lisää rajapintojen määrittelyä, jota
projektin aikana ei ollut mahdollista suorittaa johtuen aikarajoitteista ja
Korppi-kehittäjien kiireistä.

Kalenteri-integraation puutteen vuoksi järjestelmään toteutettiin opiskelijan
yksittäisen varauksen lataaminen iCalendar-muodossa. Näin varaus on siirrettävissä
toiseen iCalendaria ymmärtävään kalenterisovellukseen.

%Korppiin ei vielä ole toteutettu mahdollisuutta saada ulkopuolista syötettä näkyviin Korppi-kalenteriin.
%Varausjärjestelmään voidaan toteuttaa iCalendar-syötteen muodostus, jotta se on Korpin käytettävissä heti, kun tuki sille on toteutettu.
%Toisaalta varausjärjestelmän tarjoamaa kalenterisyötettä olisi mahdollista tulevaisuudessa käyttää myös muista sitä tukevista järjestelmistä.
%Samoin jatkokehityksessä on mahdollista lisätä järjestelmään tuki muille ulkopuolisille iCalendar-kalenterisyötteille.

%\section{Muut järjestelmät ja jatkokehitys}

% !!!! ROTI?


% Komennot vaatimusten tila- ja prioriteettikuvakkeita varten.
\newcommand{\prioicon}[1]{\includegraphics[width=1.4em]{images/prio#1.png}}
\newcommand{\progressicon}[1]{\includegraphics[width=1.4em]{images/progress#1.png}}

% Komennot ja laskurit vaatimusten listausta varten
\newcounter{groupcount}
\setcounter{groupcount}{0}
\newcounter{reqcount}
\setcounter{reqcount}{0}

\newcommand{\initreqcounters}[1]{
	\newcounter{cnt:reqprio1#1}
	\setcounter{cnt:reqprio1#1}{0}
	\newcounter{cnt:reqprio2#1}
	\setcounter{cnt:reqprio2#1}{0}
	\newcounter{cnt:reqprio3#1}
	\setcounter{cnt:reqprio3#1}{0}
	\newcounter{cnt:reqprio4#1}
	\setcounter{cnt:reqprio4#1}{0}
	\newcounter{cnt:reqprio5#1}
	\setcounter{cnt:reqprio5#1}{0}
}

\initreqcounters{tot}
\initreqcounters{s1}
\initreqcounters{s2}
\initreqcounters{s3}
\initreqcounters{s4}
\initreqcounters{s5}

\newcommand{\reqtot}[1]{
	\newcounter{cnt:req#1tot}
	\setcounter{cnt:req#1tot}{0}
	\addtocounter{cnt:req#1tot}{\arabic{cnt:reqprio1#1}}
	\addtocounter{cnt:req#1tot}{\arabic{cnt:reqprio2#1}}
	\addtocounter{cnt:req#1tot}{\arabic{cnt:reqprio3#1}}
	\addtocounter{cnt:req#1tot}{\arabic{cnt:reqprio4#1}}
	\addtocounter{cnt:req#1tot}{\arabic{cnt:reqprio5#1}}
	\arabic{cnt:req#1tot}
}

% Vaihtaa vaatimusryhmän numeroa
\newcommand{\newreqgroup}{
	\setcounter{reqcount}{0}
	\stepcounter{groupcount}
}

% Määritellään description-ympäristön itemin labelia.
\renewcommand{\descriptionlabel}{
	\hspace{\labelsep}
	\stepcounter{reqcount}
	\arabic{chapter}.\arabic{groupcount}.\arabic{reqcount}
}

% Tekee uuden vaatimuksen description-ympäristössä. Ensimmäinen parametri kertoo
% vaatimuksen prioriteetin ja toinen tilan. Molemmat ovat lukuja väliltä 1 - 5.
\makeatletter
\newcommand{\req}[2]{
	\item[\prioicon{#1}\progressicon{#2}]
	\stepcounter{cnt:reqprio#1tot}
	\stepcounter{cnt:reqprio#1s#2}
	\edef\@currentlabel{\arabic{chapter}.\arabic{groupcount}.\arabic{reqcount}}
}
\makeatother

% Uusi requirements-ympäristö vaatimusten esittämistä varten.
\newenvironment{requirements}
	{\newreqgroup\description}
	{\enddescription}

\newcommand{\TARK}{\textbf{(tarkennettava)}}
\newcommand{\HUOM}[1]{\textbf{(#1)}}
%\newcommand{\JATKO}{\textbf{(jätetään jatkokehitykseen)}}
\newcommand{\JATKO}{}


%---------------------------------------------
% Vaatimusten prioriteetit ja tilat
%---------------------------------------------
\chapter{Vaatimusten prioriteetit ja tilat}\label{chp:priotilat}

Luvuissa \ref{chp:vaatimukset} ja \ref{chp:tekn_vaatimukset} on lueteltu kehitettävän
sovelluksen vaatimukset. Vaatimukset on priorisoitu asteikolla 1--5 seuraavasti:
\begin{list}{}
\item \prioicon{1} Pakollinen
\item \prioicon{2} Tärkeä
\item \prioicon{3} Mahdollinen
\item \prioicon{4} Idea
\item \prioicon{5} Ei toteuteta
\end{list}

Vaatimusten tilat esitetään seuraavasti:
\begin{list}{}
\item \progressicon{5} Hyväksytty
\item \progressicon{4} Testattu
\item \progressicon{3} Toteutettu
\item \progressicon{2} Osittain toteutettu
\item \progressicon{1} Toteuttamatta
\end{list}


%---------------------------------------------
% Vaatimukset
%---------------------------------------------
\chapter{Toiminnalliset vaatimukset}\label{chp:vaatimukset}

Luvussa kuvataan kehitettävän järjestelmän toiminnalliset vaatimukset. Nämä on jaettu eri alalukuihin ohjelman eri
osien ja käyttäjien mukaan.

\section{Käyttäjän yleiset toiminnalliset vaatimukset}

\begin{requirements}
\req{1}{2} Käyttäjä pystyy kirjautumaan järjestelmään käyttäen JYU-tunnuksia.
\req{3}{1} Käyttäjä näkee kalenterinäkymässä omat Korppi-kalenterin tapahtumansa.
\req{1}{3} Käyttäjälle luodaan ensimmäisen sisäänkirjauksen yhteydessä henkilökohtainen mittausryhmä.
\req{3}{1} Käyttäjä pystyy lähettämään palautetta palautesivun kautta nimellään tai anonyymisti \JATKO.
\end{requirements}


\section{Opiskelijan toiminnalliset vaatimukset}\label{req:opiskelija}

\begin{requirements}
\req{1}{3} Käyttäjä pystyy näkemään valitsemaansa kurssiin liittyvien töiden varattavissa olevat laboratoriovuorot kalenterinäkymässä.
\req{1}{3} Käyttäjä pystyy varaamaan mittausvuoron valitsemaltaan laboratoriovuorolta.
\req{2}{3} Käyttäjä pystyy lisäämään tekemäänsä varaukseen liittyvän viestin varausta tehdessään.
\req{2}{3} Käyttäjä pystyy näkemään varauksiinsa liittyvät viestit.
\req{3}{1} Käyttäjä pystyy lisäämään aiemmin tekemäänsä varaukseen viestin\JATKO.
\req{1}{3} Käyttäjä pystyy varaamaan mittausvuoron, jos vuoron alkuun on aikaa enemmän kuin asetuksissa on määritetty.
\req{1}{3} Käyttäjä pystyy varamaan mittausvuoron, jos varattavan työn vaatimat resurssit ovat käytettävissä kyseisen laboratoriovuoron aikana.
\req{1}{3} Käyttäjä pystyy varaamaan vain yhden mittausvuoron samalta laboratoriovuorolta.
\req{1}{3} Käyttäjä voi olla ilmoittautuneena vain yhdelle tulevalle mittausvuorolle liittyen samaan laboratoriotyöhön.
\req{1}{3} Käyttäjä näkee kalenterinäkymästä sekä menneet että tulevat vuorot, joille on ilmoittautunut.
\req{1}{3} Käyttäjä näkee listanäkymästä sekä menneet että tulevat vuorot, joille on ilmoittautunut.
\req{1}{3} Käyttäjä pystyy merkitsemään mittausvuoron varauksensa perutuksi, jolloin varattua mittausvuoroa ei enää näytetä kalenterissa.
\req{2}{3} Vuorolle ilmoittautumisen perumisella on asetuksissa määritetty takaraja, jonka jälkeen ilmoittautumista ei voida perua.
\req{3}{2}\label{req:varaus:ical}
Käyttäjä pystyy saamaan mittausvuoronsa kalenteritiedot järjestelmästä iCalendar-muodossa erillisenä tiedostona.
\end{requirements}

Vaatimus \ref{req:varaus:ical} on toteutettu back endissä, mutta toiminnallisuutta
ei ole otettu käyttöön front endissä.


\section{Mittausryhmän toiminnalliset vaatimukset}\label{req:ryhma}

\begin{requirements}
\req{3}{3} Käyttäjä pystyy luomaan uuden mittausryhmän, jossa hän on omistajana.
\req{3}{3} Käyttäjä pystyy lisäämään mittausryhmäänsä käyttäjiä jäseniksi.
\req{3}{3} Mittausryhmän jäsenten lukumäärälle on asetuksissa määrätty minimi- ja maksimiarvo.
\req{3}{3} Käyttäjä näkee mittausryhmät, joihin hän kuuluu.
\req{3}{2}\label{req:ryhma:poistuminen}
Mittausryhmän jäsen pystyy poistumaan ryhmästä. %\HUOM{Toteutettu back endissä, mutta ei käyttöliittymässä.}
\req{3}{3} Mittausryhmän luoja pystyy merkitsemään ryhmän poistetuksi.
\req{3}{3} Mittausryhmän voi merkitä poistetuksi vain, jos sillä ei ole tulevia varauksia.
\req{3}{3} Mittausryhmän jäsen pystyy varaamaan vuoron mittausryhmälle, jos laboratoriotyö voidaan suorittaa kyseisellä ryhmällä.
\req{1}{3} Mittausryhmän yhdenaikaisten tulevien vuorojen varausten määrä on rajoitettu asetuksissa määritettyyn.
\req{3}{3} Mittausryhmän jäsen pystyy merkitsemään mittausryhmän vuoron perutuksi.
\end{requirements}

Vaatimus \ref{req:ryhma:poistuminen} on toteutettu back endissä, mutta front endissä
toiminnallisuutta ei vielä ole toteutettu.


\section{Ohjaajan toiminnalliset vaatimukset}

\begin{requirements}
\req{1}{3} Käyttäjä pystyy näkemään ohjaamalleen laboratoriovuorolle osallistuvien henkilöiden listauksen, jossa näytetään kunkin varatun mittausvuoron osalta seuraavat
tiedot:
    \begin{itemize}
        \item mittausvuorolla suoritettavan laboratoriotyön nimi
        \item mittausvuoron varanneiden henkilöiden nimet
        \item mittausvuoron varanneiden henkilöiden yhteystiedot
        \item mittausvuoroon liittyen kirjatut viestit.
    \end{itemize}
\req{2}{1}\label{req:ohjaaja:lasna}
Käyttäjä pystyy kirjaamaan järjestelmään, jos laboratoriovuorolle ilmoittautunut henkilö ei saapunut paikalle\JATKO.
\req{2}{1}\label{req:ohjaaja:kesken}
Käyttäjä pystyy kirjaamaan järjestelmään, jos mittaus jäi vuorolla kesken\JATKO.
\req{2}{3} Käyttäjä pystyy näkemään sekä tulevat että menneet ohjausvuoronsa kalenterinäkymässä.
\req{2}{3} Käyttäjä pystyy näkemään sekä tulevat että menneet ohjausvuoronsa listanäkymässä.
\req{2}{2}\label{req:ohjaaja:kalenteri}
Käyttäjä pystyy näkemään toisten ohjaajien ohjaamat sekä tulevat että menneet laboratoriovuorot kalenterinäkymässä\JATKO. %\HUOM{Käyttäjä pystyy näkemään vain omat ohjausvuoronsa.}
\req{2}{3} Käyttäjä pystyy näkemään toisten ohjaajien ohjaamat sekä tulevat että menneet laboratoriovuorot listanäkymässä.
\req{2}{1} Käyttäjä pystyy lisäämään viestejä mittausvuoroon liittyen\JATKO.  \label{req:ohjaaja:viesti}
\req{3}{1} Käyttäjä pystyy lisäämään viestejä koko ohjausvuoroonsa liittyen\JATKO.  \label{req:ohjaaja:viesti_ohjausvuoro}
\req{3}{1} Käyttäjä pystyy lisäämään opiskelijan tulevalle ohjausvuorolle, vaikka vuoron varausaika olisi umpeutunut\JATKO.
\req{3}{1} Käyttäjä pystyy saamaan ohjausvuoronsa kalenteritiedot järjestelmästä iCalendar-muodossa erillisenä tiedostona\JATKO.
%\req{4}{1} Käyttäjä pystyy ehdottamaan ohjausvuorojen vaihtoa toisen ohjaajan kanssa, jos ohjattavien vuorojen opintotaso on sama.
%\req{4}{1} Käyttäjä näkee ohjausvuorojen vaihtoehdotuksen etusivun ilmoitustaululla.
%\req{4}{1} Käyttäjä pystyy hyväksymään tai hylkäämään ehdotetun ohjausvuorojen vaihdon.
%\req{4}{1} Käyttäjä saa sähköpostilla linkin, jonka kautta hän pystyy hyväksymään tai hylkäämään ehdotetun ohjausvuorojen vaihdon.
\end{requirements}

Vaatimuksen \ref{req:ohjaaja:kalenteri} toteutuksesta puuttuu back end -kutsu, jolla
voidaan hakea kaikkien ohjaajien ohjausvuorot kalenteritapahtumina.


\section{Pääkäyttäjän yleiset toiminnalliset vaatimukset}

\begin{requirements}
\req{2}{3} Käyttäjä pystyy lisäämään ilmoituksia järjestelmän etusivun ilmoitustaululle.
\req{2}{3} Käyttäjä pystyy muokkaamaan ilmoitustaulun ilmoituksia.
\req{2}{3} Käyttäjä pystyy piilottamaan ja näyttämään ilmoitustaulun ilmoituksia.
\req{2}{2} Käyttäjä pystyy lisäämään käännöksen ilmoituksen otsikolle ja sisällölle\JATKO. %\HUOM{Toimii vaihtamalla käyttöliittymän kieltä ja muokkaamalla ilmoitusta.}
\label{req:ilm:kaannos}
\req{3}{1} Käyttäjä pystyy järjestelemään ilmoitustaulun ilmoituksia\JATKO.
\req{4}{1} Käyttäjä pystyy muodostamaan tilastoja järjestelmästä ja sen  käyttäjistä \TARK\JATKO.
\end{requirements}

Vaatimuksen \ref{req:ilm:kaannos} mukainen käännöksen lisääminen ilmoitukselle toimii
siten, että käyttäjä vaihtaa käyttöliittymän kieltä ja muokkaa jo lisättyä ilmoitusta.
Tämä ei ole tarpeeksi selkeä ominaisuus, vaan ilmoituksen lisäysnäkymässä pitää olla
valmiiksi tekstikentät jokaista käännöstä varten.


\section{Laboratoriovuorojen hallinnan toiminnalliset vaatimukset}

Vain pääkäyttäjä pystyy suorittamaan seuraavia toimenpiteitä järjestelmässä.

\begin{requirements}
\req{1}{3} Käyttäjä pystyy lisäämään uuden laboratoriovuoron, jolle hän asettaa
\begin{itemize}
	\item aloitus- ja lopetusajan
	\item opintotason
	\item yhden tai useamman ohjaajan
	\item mittausvuorovarauksien maksimimäärän.
\end{itemize}
\req{1}{3} Käyttäjä pystyy merkitsemään laboratoriovuoron perutuksi.
\req{1}{1} Käyttäjä pystyy lisäämään laboratoriovuorolle ohjaajan\JATKO. \label{req:lab:lisaa-ohjaaja}
\req{1}{1} Käyttäjä pystyy merkitsemään laboratoriovuoron ohjaajan poistetuksi\JATKO. \label{req:lab:poista-ohjaaja}
\req{1}{3} Käyttäjä näkee listanäkymässä vaihtoehtoisesti joko kaikki tai vain tulevat laboratoriovuorot.
\req{2}{3} Käyttäjä näkee kalenterinäkymässä vaihtoehtoisesti joko kaikki tai vain tulevat laboratoriovuorot.
\req{3}{1} Käyttäjä pystyy suodattamaan listanäkymässä näytettäviä laboratoriovuoroja ohjaajien, töiden, kurssin tai opintotason perusteella\JATKO.
\req{3}{1} Käyttäjä pystyy suodattamaan kalenterinäkymässä näytettäviä laboratoriovuoroja ohjaajien, töiden, kurssin tai opintotason perusteella\JATKO.
\req{4}{1} Käyttäjä pystyy suunnittelemaan laboratoriovuoroja taulukkonäkymässä \TARK.
\req{4}{1} Käyttäjä pystyy suunnittelemaan laboratoriovuoroja kalenterinäkymässä \TARK.
\end{requirements}


\section{Laboratoriotöiden hallinnan toiminnalliset vaatimukset}

Vain pääkäyttäjä pystyy suorittamaan seuraavia toimenpiteitä järjestelmässä.

\begin{requirements}
\req{1}{3} Käyttäjä pystyy lisäämään uuden laboratoriotyön, johon liittyy seuraavat tiedot:
\begin{itemize}
	\item nimi suomeksi ja englanniksi
	\item kuvaus suomeksi ja englanniksi (ei pakollinen tieto)
	\item opintotaso
	\item mittausryhmän kokorajoite.
\end{itemize}
\req{1}{3} Käyttäjä pystyy lisäämään laboratoriotyöhön sen vaatimia resursseja.
\req{1}{3} Käyttäjä pystyy poistamaan laboratoriotyön vaatimia resursseja.
\req{2}{3} Käyttäjä pystyy lisäämään järjestelmään kurssin, joka toimii laboratoriotöiden ryhmittelyperusteena.
\req{2}{3} Käyttäjä pystyy merkitsemään kurssin poistetuksi.
\req{2}{3} Käyttäjä pystyy lisäämään laboratoriotöitä eri kursseihin.
\req{3}{3} Käyttäjä pystyy merkitsemään laboratoriotöitä poistetuksi eri kursseista.
\req{1}{3} Käyttäjä pystyy merkitsemään laboratoriotyön poistetuksi.
\req{1}{1}\label{req:labtyo:poisto-ehto}
Laboratoriotyön voi merkitä poistetuksi vain, jos se ei kuulu yhteenkään kurssiin.
\end{requirements}

%Vaatimusta \ref{req:labtyo:poisto-ehto} ei ole toteutettu vielä täysin back endissä.


\section{Resurssien hallinnan toiminnalliset vaatimukset}

Vain pääkäyttäjä pystyy suorittamaan seuraavia toimenpiteitä järjestelmässä.

\begin{requirements}
\req{3}{3} Käyttäjä pystyy lisäämään uuden resurssin, johon liittyy resurssin nimi, kuvaus ja lukumäärä.
\req{3}{2}\label{req:resurssi:poisto}
Käyttäjä pystyy merkitsemään resurssin poistetuksi\JATKO.
\req{3}{1}\label{req:resurssi:poisto-ehto}
Resurssin voi merkitä poistetuksi vain, jos se on poistettu kaikista laboratoriotöistä\JATKO.
\req{3}{3} Käyttäjä pystyy muuttamaan resurssien lukumääriä.
\req{3}{3} Käyttäjä pystyy muuttamaan resurssien tilaa. Tila voi olla esimerkiksi \emph{käytettävissä}, \emph{rikki} tai \emph{pois käytöstä}.
\req{4}{1} Käyttäjä pystyy ryhmittelemään resursseja \TARK.
\end{requirements}

Vaatimuksessa \ref{req:resurssi:poisto} esitetty resurssien poistetuksi merkitseminen
on toteutettu, mutta otettu pois käytöstä front endissä. Tämä on tehty siksi, että
vaatimuksen \ref{req:resurssi:poisto-ehto} tarkistusta ei ole vielä toteutettu.


\section{Käyttäjäroolien hallinnan toiminnalliset vaatimukset}\label{req:roolit}

Vain pääkäyttäjä pystyy suorittamaan seuraavia toimenpiteitä järjestelmässä.

\begin{requirements}
\req{2}{2}\label{req:roles:lisaa}
Käyttäjä pystyy lisäämään käyttäjille uusia rooleja\JATKO.
\req{2}{2}\label{req:roles:poista}
Käyttäjä pystyy merkitsemään käyttäjän roolin poistetuksi\JATKO.
\req{4}{1} Käyttäjä pystyy asettamaan takarajan, jonka jälkeen käyttäjälle lisätty rooli poistuu\JATKO.
\end{requirements}

Vaatimuksista \ref{req:roles:lisaa} ja \ref{req:roles:poista} on toteutettu back end
kutsut, mutta niitä ei ole testattu. Lisäksi vaatimusten mukainen käyttöliittymä
on vielä toteuttamatta.


\section{Käyttöliittymän vaatimukset}

\begin{requirements}
\req{1}{3} Käyttöliittymän kieli on vaihdettavissa.
\req{1}{3} Käyttöliittymän kielivaihtoehtoina ovat vähintään suomi ja englanti.
\req{2}{3} Etusivulla on ilmoitustaulu oppilaslaboratorioon liittyvää tiedottamista varten.
\req{2}{3} Käyttöliittymä skaalautuu opiskelijan toiminnallisuuksien osalta mobiililaitteille.
\req{3}{3} Käyttöliittymä skaalautuu ohjaajan toiminnallisuuksien osalta mobiililaitteille.
\req{4}{1} Käyttöliittymä skaalautuu pääkäyttäjän toiminnallisuuksien osalta mobiililaitteille.\JATKO
\req{3}{2}\label{req:load-anim}
Asynkronisten latausten aikana, kun käyttöliittymä lataa dataa back endiltä, käyttäjälle näytetään latausanimaatio. %\HUOM{Latausanimaatiota on käytetty vain osassa näkymistä.}
\req{3}{1} Latausanimaatio on toteutettu CSS-animaationa.
\end{requirements}

Vaatimuksen \ref{req:load-anim} mukaisia latausanimaatioita ei ole käytetty kaikissa
niitä vaativissa näkymissä. Tällä hetkellä animaatiot näkyvät vain
listavalinta-elementeissä. Näiden lisäksi animaatioita tarvitaan myös omien varausten,
ohjausvuorojen ja laboratoriovuorojen listanäkymissä.


\section{Kalenterinäkymän vaatimukset}

\begin{requirements}%[leftmargin=5.4em]
\req{1}{3} Kalenterinäkymässä tiedot näytetään viikkokalenterimuodossa.
\req{3}{3} Kalenterinäkymässä tiedot näytetään päiväkalenterimuodossa.
\req{3}{3} Kalenterinäkymässä tiedot näytetään kuukausikalenterimuodossa.
\req{1}{3} Kalenterissa näkyvillä ulkopuolelta tuoduilla tapahtumilla sekä laboratorio- ja mittausvuoroilla on selkeä väriteema, joka auttaa erottamaan erilaiset kalenteritapahtumat toisistaan.
\req{3}{1} Vaihtoehtoiset lista- ja kalenterinäkymät on sijoitettu välilehtiin\JATKO.
\req{4}{1} Kalenterinäkymässä on viikkopalkki, jonka kautta viikkojen välillä pystyy siirtymään\JATKO.
\req{4}{1} Mittausvuoron varausnäkymässä viikkopalkissa ne viikot on korostettu, joilla on valitun laboratoriotyön varattavia laboratoriovuoroja\JATKO.
\req{3}{3} Pääkäyttäjän peruma laboratoriovuoro näkyy ilmoittautuneiden ja vuoron ohjaajien kalentereissa peruttuna vuorona.
\end{requirements}


\section{Tietokannan tietojen käännösten vaatimukset}

\begin{requirements}
\req{3}{3} Tietokannassa oleville käyttäjän syöttämille tai käyttäjälle näkyville merkkijonoille on mahdollista olla käännöksiä useille kielille.
\req{3}{3} Tietokannan tiedoille on käännökset suomeksi.
\req{3}{3} Tietokannan tiedoille on käännökset englanniksi.
\req{4}{1} Tietokannan tietojen käännöksiä pystyy muokkaamaan käännösnäkymässä \TARK.
\end{requirements}


\section{Järjestelmän sähköposti-ilmoitusten vaatimukset}

\begin{requirements}
\req{1}{3} Mittausvuoron varaamisesta lähetetään mittausryhmälle sähköposti-ilmoitus.
\req{1}{3} Mittausvuoron perumisesta lähetetään mittausryhmälle sähköposti-ilmoitus.
%\req{2}{1} Vuorolle ilmoittautumisesta lähetetään vuoron ohjaajalle sähköposti-ilmoitus.
%\req{2}{1} Vuorolle ilmoittautumisen perumisesta lähetetään vuoron ohjaajalle sähköposti-ilmoitus.
\req{2}{1} Kun pääkäyttäjä liittää vuorolle ohjaajan, lähetetään ohjaajalle sähköposti-ilmoitus asiasta.
\req{2}{1} Kun pääkäyttäjä poistaa vuorolta ohjaajan, lähetetään ohjaajalle sähköposti-ilmoitus asiasta.
\req{1}{3} Jos pääkäyttäjä peruu laboratoriovuoron, lähetetään mittausvuoron varanneille sähköposti-ilmoitus asiasta.
\req{1}{1} Jos pääkäyttäjä peruu laboratoriovuoron, lähetetään vuoron ohjaajille sähköposti-ilmoitus asiasta.
%\req{3}{1} Mittausryhmän ilmoittautumisesta vuorolle lähetetään ryhmän jäsenille sähköposti-ilmoitus.
%\req{3}{1} Mittausryhmän ilmoittautumisesta vuorolle lähetetään vuoron ohjaajalle sähköposti-ilmoitus, jossa on listaus ryhmän jäsenistä.
%\req{3}{1} Mittausryhmän vuorolle ilmoittautumisen perumisesta lähetetään ryhmän jäsenille sähköposti-ilmoitus.
%\req{3}{1} Mittausryhmän vuorolle ilmoittautumisen perumisesta lähetetään vuoron ohjaajalle sähköposti-ilmoitus, jossa on listaus ryhmän jäsenistä.
\req{4}{1} Arvostelluista töistä lähetetään sähköposti-ilmoitus opiskelijalle. Ilmoitus sisältää arvostelun tiedot\JATKO.
\req{4}{1} Arvostelluista töistä lähetetään sähköposti-ilmoitus oppilaslaboratorion sähköpostilistalle\JATKO.
\req{4}{1} Arvostelluista töistä lähetetään sähköposti-ilmoitus arvostelun tehneelle ohjaajalle, joka vastaa kyseisestä työstä\JATKO.
\req{3}{1} Lähetetyt sähköposti-ilmoitukset tallennetaan tietokantaan\JATKO.
\end{requirements}


\section{Laboratoriotyön selostuksen vaatimukset}

\begin{requirements}
\req{4}{1} Opiskelija pystyy tallentamaan järjestelmään tarkastettavaksi laboratoriomittauksien perusteella laaditun selostuksen \TARK.
\req{4}{1} Ohjaaja pystyy lukemaan opiskelijan tekemän selostuksen \TARK.
\req{4}{1} Ohjaaja pystyy arvostelemaan laboratoriomittauksista tehdyn selostuksen \TARK.
\req{4}{1} Ohjaaja pystyy tallentamaan laboratoriomittauksista tehdyn selostuksen palautteen \TARK.
\end{requirements}


%\chapter{Tekniset ja laadulliset vaatimukset ja rajoitteet}\label{chp:rajoitteet}
\chapter{Tekniset ja laadulliset vaatimukset}\label{chp:tekn_vaatimukset}

%Luvussa esitetään kehitettävän järjestelmän tekniset vaatimukset ja rajoitteet.
Luvussa esitetään kehitettävän järjestelmän tekniset ja laadulliset vaatimukset.

\setcounter{groupcount}{0}
\section{Järjestelmän rajapintojen vaatimukset}

\begin{requirements}
\req{1}{3} Autentikointi tapahtuu OAuth2-protokollalla.
%\req{1}{3} Järjestelmän vaatimat käyttäjän henkilötiedot haetaan Jyväskylän yliopiston tietojärjestelmien rajapinnan kautta.
\req{1}{3} Käytetyt SQLAlchemyn ominaisuudet tuottavat SQL-standardin mukaisia komentoja, jotka toimivat MariaDB-, MySQL- ja PostgreSQL-tietokannanhallintajärjestelmien kanssa.
\req{2}{2} Kalenterinäkymän tuontiin Korpista käytetään iCalendar-muotoa.
\req{3}{1} Kalenterinäkymän Korppiin vientiin käytetään iCalendar-muotoa\JATKO.
\end{requirements}


%\section{Rajoitteet}
\section{Tietoturva ja suorituskyky}

\begin{requirements}
\req{1}{3} Järjestelmän tulee käyttää HTTPS-protokollaa tietoliikenteen salaukseen.
\req{1}{3} Järjestelmän tulee estää HTML-koodin syöttäminen tietokantaan.
\req{1}{3} Järjestelmän tulee olla vastustuskykyinen cross-site request forgerylle (CSRF).
\req{1}{1} Järjestelmän tulee kyetä palvelemaan vähintään 50 yhdenaikaista käyttäjää.
\end{requirements}


%---------------------------------------------
% Yhteenveto
%---------------------------------------------
\chapter{Yhteenveto}\label{chp:yhteenveto}

Kepler-projekti kehitti Jyväskylän yliopiston fysiikan laitokselle laboratoriovuorojen
varausjärjestelmää. Dokumentissa esiteltiin varausjärjestelmän eri käyttäjien tarpeita
sekä järjestelmän kokonaisrakennetta ja sen vaatimuksia.

%\section{Järjestelmän käyttäjien tarpeet}

Kehitettävän järjestelmän käyttäjiä ovat fysiikan laitoksen opiskelijat, laboratoriovuorojen
ohjaajat ja oppilaslaboratorion johtaja. Heidän käyttäjäroolinsa järjestelmässä ovat
opiskelija, ohjaaja ja pääkäyttäjä.

Kehitettävä järjestelmä mahdollistaa opiskelijoille mittausvuorojen varaamisen ja 
mittausryhmien luomisen. Laboratoriovuorojen ohjaajat pystyvät näkemään ohjaamansa
laboratoriovuorot ja vuorolle osallistujat. Lisäksi ohjaajat pystyvät näkemään vuorolla
ohjattavien varaamat laboratoriotyöt järjestelmästä. Näin he pystyvät valmistautumaan
etukäteen vuoron ohjaukseen.

Pääkäyttäjä voi lisätä järjestelmään uusia varattavia laboratoriovuoroja ja muokata etusivun
ilmoitustaulua. Lisäksi pääkäyttäjä pystyy määrittelemään uusia laboratoriotöitä, niiden
vaatimia resursseja sekä kursseja, joihin työt voidaan liittää. Pääkäyttäjän on tarkoitus
pystyä muokkaamaan toisten käyttäjien rooleja. Näin hän pystyy määrittelemään järjestelmään
uusia ohjaajia. Tämä ominaisuus jäi kuitenkin projektin puitteissa toteuttamatta.


%\section{Vaatimusten toteutuminen}\label{sec:toteutuminen}

Kokonaisuutena sovelluksen vaatimukset toteutuivat hyvin. Taulukkoon
\refwithpage{tbl:reqcounts} on koottu vaatimusten toteumaa eri prioriteettien ja tilojen
osalta. Suurin osa toteutumatta jääneistä vaatimuksista on kirjattu prioriteetilla
``mahdollinen`` tai prioriteetilla ``idea``. Kuitenkin joitain tärkeitä ominaisuuksia jäi
toteuttamatta, kuten luvun \ref{req:roolit} käyttäjäroolien hallinnan vaatimuskokonaisuus.
Kyseiset vaatimukset jäivät toteuttamatta johtuen ajan puutteesta ja toimintoihin liittyvän
näkymän suunnittelun vaikeudesta.

\begin{table}
	\begin{tabular}[centered]{|l|r|r|r|r|r|}
		\hline 
%		\ & \prioicon{1} & \prioicon{2} & \prioicon{3} & \prioicon{4} & \\
		\ & Pakollinen & Tärkeä & Mahdollinen & Idea & Yhteensä \\
		\hline \progressicon{3} Toteutettu &
		\arabic{cnt:reqprio1s3} & \arabic{cnt:reqprio2s3} & \arabic{cnt:reqprio3s3} & \arabic{cnt:reqprio4s3} & \reqtot{s3} \\
		\hline \progressicon{2} Osittain toteutettu &
		\arabic{cnt:reqprio1s2} & \arabic{cnt:reqprio2s2} & \arabic{cnt:reqprio3s2} & \arabic{cnt:reqprio4s2} & \reqtot{s2} \\
		\hline \progressicon{1} Toteuttamatta &
		\arabic{cnt:reqprio1s1} & \arabic{cnt:reqprio2s1} & \arabic{cnt:reqprio3s1} & \arabic{cnt:reqprio4s1} & \reqtot{s1} \\
		\hline \hspace{1.5em} Yhteensä &
		\arabic{cnt:reqprio1tot} & \arabic{cnt:reqprio2tot} & \arabic{cnt:reqprio3tot} & \arabic{cnt:reqprio4tot} & \reqtot{tot} \\
		\hline
	\end{tabular}
	\caption{\label{tbl:reqcounts}Vaatimusten toteuma eri prioriteettien ja tilojen osalta.}
\end{table}

Opiskelijan toiminnallisuuksista (vaatimuskokonaisuudet \ref{req:opiskelija} ja
\ref{req:ryhma}) kaikki prioriteetilla ``pakollinen`` tai ``tärkeä`` kirjatut vaatimukset
saatiin toteutettua.

Ohjaajan toiminnoista sovittiin Kepler-projektin jälkeiseen jatkokehitykseen vaatimukset
\ref{req:ohjaaja:lasna} ja \ref{req:ohjaaja:kesken}, jotka liittyvät henkilön
laboratoriovuorolle osallistumisen kirjaamiseen. Ohjaaja ei myöskään pysty lisäämään
vaatimuksen \ref{req:ohjaaja:viesti} mukaisia varauksiin liittyviä viestejä järjestelmään.
Nämä ohjaajan ominaisuudet ovat jatkokehityksessä helppo toteuttaa.

Pääkäyttäjän laboratoriovuoroihin liittyvistä ominaisuuksista vuoron ohjaajan lisääminen ja
poistaminen (vaatimukset \ref{req:lab:lisaa-ohjaaja} ja \ref{req:lab:poista-ohjaaja}) sovittiin Kepler-projektin jälkeiseen jatkokehitykseen. Vaikka toiminnallisuus olisi erittäin
hyödyllinen, on sovellusta mahdollista käyttää ilman tätäkin.

Lisäksi osa sähköposti-ilmoituksiin liittyvistä vaatimuksista jäi toteuttamatta. Näiden toteutus on kuitenkin triviaalia kyseisen vaatimuskokonaisuuden muiden toimintojen toteutusta mukaillen.

%Käyttäjän yleisistä vaatimuksista jäi totuttamatta Korppi-tapahtumien näyttäminen
%kalenterinäkymissä. Syy tähän on se, että tarvittavaa rajapintaa ei ole vielä toteutettu
%Korppi-järjestelmän puolella. Tämä ei kuitenkaan ole kriittinen ominaisuus sovelluksen %toiminnan kannalta.

Kehitetyn sovelluksen yksittäisiä toteutusratkaisuja on kuvattu tarkemmin Kepler-projektin
sovellusraportissa \cite{sovraportti}. Lisäksi vaatimusten pohjalta suoritettu
järjestelmäntestaus on raportoitu Kepler-projektin järjestelmätestausraportissa
\cite{jarjestelmatestaus}.


% LÄHTEET
\begin{thebibliography}{1}
%Katso kirjoitusohjeen luku 2.3 ja 2.4.


\newcommand{\biburl}[1]{<URL: \url{#1}>}

\bibitem{jarjestelmatestaus}
	Joonas Konki, Anu Koskela, Mikko Kuhno, Henrik Paananen ja Atte Räty,
	"Kepler-projekti, Järjestelmätestausraportti",
	saatavilla PDF-muodossa
	\biburl{http://sovellusprojektit.it.jyu.fi/kepler/dokumentit/testaus/jarjestelmatestaus/kepler\_jarjestelmatestausraportti\_1.0.0.pdf},
	Jyväskylän yliopisto,
	tietotekniikan laitos, 2015.

\bibitem{projraportti}
	Joonas Konki, Anu Koskela, Mikko Kuhno, Henrik Paananen ja Atte Räty,
	"Kepler-projekti, Projektiraportti",
	saatavilla PDF-muodossa
	\biburl{http://sovellusprojektit.it.jyu.fi/kepler/dokumentit/projektiraportti/kepler\_projektiraportti\_1.0.0.pdf},
	Jyväskylän yliopisto,
	tietotekniikan laitos, 2015.

\bibitem{sovraportti}
	Joonas Konki, Anu Koskela, Mikko Kuhno, Henrik Paananen and Atte Räty,
	"Kepler project, Application Report",
	available in PDF format \biburl{http://sovellusprojektit.it.jyu.fi/kepler/dokumentit/application\_report/kepler\_application\_report\_1.0.0.pdf},
	Jyväskylän yliopisto,
	tietotekniikan laitos, 2015.
	
\bibitem{front_end_doc}
	Joonas Konki, Anu Koskela, Mikko Kuhno, Henrik Paananen and Atte Räty,
	"Kepler project, Kepler client-side application source code documentation",
	available in HTML format \biburl{http://sovellusprojektit.it.jyu.fi/kepler/application/class\_documentation/javascript},
	University of Jyväskylä,
	Department of Mathematical Information Technology, 2015.
	
\bibitem{back_end_doc}
	Joonas Konki, Anu Koskela, Mikko Kuhno, Henrik Paananen and Atte Räty,
	"Kepler project, Kepler server application source code documentation",
	available in HTML format
	\biburl{http://sovellusprojektit.it.jyu.fi/kepler/application/class\_documentation/python/},
	University of Jyväskylä,
	Department of Mathematical Information Technology, 2015.

  
\end{thebibliography}

% LIITTEET
%\begin{appendix}

%\chapter{Ensimmäinen liite}

%Tänne tarvittaessa liitteitä.

%\end{appendix}

% Dokumentin  lopetus
\end{document}
