Skip to content

Commit

Permalink
Update documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
valtterikantanen committed May 15, 2022
1 parent 85ca825 commit 8b8a652
Show file tree
Hide file tree
Showing 12 changed files with 118 additions and 40 deletions.
11 changes: 4 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Ohjelmistotekniikka-kurssin palautusrepositorio

Tämä repositorio on laadittu Helsingin yliopiston kevään 2022 kurssille **Ohjelmistotekniikka**, ja se täydentyy tulevien viikkojen aikana.
Harjoitustyö on laadittu Helsingin yliopiston kevään 2022 kurssille **Ohjelmistotekniikka**.

## Harjoitustyön kuvaus

Expand All @@ -9,21 +9,18 @@ Sovelluksen avulla käyttäjä voi seurata henkilökohtaista talouttaan. Seurant
## Julkaisut (releaset)

* [Viikko 5](https://github.com/valtterikantanen/ot-harjoitustyo/releases/tag/viikko5)

* [Viikko 6](https://github.com/valtterikantanen/ot-harjoitustyo/releases/tag/viikko6)
* [Loppupalautus](https://github.com/valtterikantanen/ot-harjoitustyo/releases/tag/loppupalautus)

## Dokumentaatio

* [Vaatimusmäärittely](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/vaatimusmaarittely.md)

* [Käyttöohje](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/kayttoohje.md)

* [Arkkitehtuurikuvaus](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/arkkitehtuuri.md)
* [Testausdokumentti](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/testaus.md)
* [Työaikakirjanpito](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/tuntikirjanpito.md)

* [Changelog](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/changelog.md)

* [Arkkitehtuurikuvaus](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/arkkitehtuuri.md)

## Asennus ja käyttö

Tarvittavien kirjastojen asentaminen
Expand Down
65 changes: 48 additions & 17 deletions dokumentaatio/arkkitehtuuri.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,22 @@

Koodin pakkausrakenne on seuraava:

![Pakkauskaavio](images/pakkauskaavio.png)
![](images/pakkauskaavio.png)

Pakkaus `ui` sisältää käyttöliittymäkoodin, `services` sovelluslogiikan sekä `repositories` tietojen tallennukseen liittyvän koodin. Pakkaus `entities` sisältää luokat `Transaction`, `User` ja `Category`, jotka kuvastavat yksittäisiä sovelluksen käyttämiä tietoyksiköitä.
Pakkaus `UI` sisältää Pythonin standardikirjastoon kuuluvalla [`tkinter`-moduulilla](https://docs.python.org/3/library/tkinter.html) toteutetun käyttöliittymäkoodin, `Services` sovelluslogiikan sekä `Repositories` tietojen tallennukseen ja hakemiseen liittyvän koodin. Pakkaus `Entities` sisältää luokat `Transaction` ja `User`, jotka kuvastavat yksittäisiä sovelluksen käyttämiä tietoyksiköitä.

## Käyttöliittymä

Sovelluksen käyttöliittymä sisältää seuraavat näkymät:
Sovelluksen käyttöliittymä sisältää yhteensä kuusi eri näkymää:

* Kirjautuminen
* Uuden käyttäjätilin luominen
* Tapahtumien tarkastelu (**päänäkymä**)
* Uuden tapahtuman lisäys
* Tapahtuman muokkaus
* Tapahtuman muokkaus ja lisäys
* Kategorioiden tarkastelu
* Uuden kategorian lisäys

Eri näkyvistä vastaa `UI`-luokka. Sovelluslogiikka tapahtuu `BudgetService`-luokassa, jonka metodeja `UI`-luokka kutsuu.
Eri näkymistä vastaa `UI`-luokka. Sovelluslogiikka tapahtuu `Services`-pakkauksen luokissa, joiden metodeja `UI`-luokasta kutsutaan.

## Sovelluslogiikka

Expand All @@ -37,35 +36,67 @@ classDiagram
date
amount
category_id
user_id
description
user
}
```

Sovelluslogiikasta vastaa `BudgetService`-luokan olio. Jokaista käyttöliittymän toimintoa vastaa yksi `BudgetService`-luokan metodi. Näitä metodeja ovat esimerkiksi:
Sovelluslogiikasta vastaa kolme eri `Services`-pakkauksen oliota. `Services`-pakkauksen toteutus vastaa `Repositories`-pakkauksen toteutusta, eli `TransactionService` vastaa tapahtumiin liittyvästä sovelluslogiikasta, `UserService` vastaa käyttäjiin liittyvästä sovelluslogiikasta ja `CategoryService` kategorioihin liittyvästä sovelluslogiikasta.

* `create_user(username, password1, password2)`
* `find_transactions()`
* `delete_category(category_id)`
Jokaista käyttöliittymän toimintoa vastaa yksi `Services`-pakkaukseen kuuluvien luokkien metodeista. Näitä ovat esimerkiksi:

`BudgetService`-luokka ei vastaa tiedon tallennuksesta, vaan tarvittaessa `BudgetService`-luokka kutsuu `Repositories`-pakkauksen luokkia `UserRepository`, `TransactionRepository` ja `CategoryRepository`.
* `UserService.create(username, password1, password2)`
* `TransactionService.get_one(transaction_id)`
* `CategoryService.delete(category_id, user_id)`

Kuten ylempänä esitetystä pakkauskaaviosta voi huomata, käyttöliittymäolio kutsuu ainoastaan sovelluslogiikasta vastaavia olioita, ja tiedon tallennus on keskitetty kokonaan `Repositories`-pakkauksen luokille. Näin ollen esimerkiksi tiedon tallennustapaa voisi muuttaa ilman tarvetta päivittää sovelluslogiikkaa. Sovelluslogiikasta vastaavista luokista tarvittaessa vain kutsutaan `Repositories`-pakkauksen luokkia `UserRepository`, `TransactionRepository` ja `CategoryRepository`.

## Tiedon tallennus

`Repositories`-pakkauksen luokat `UserRepository`, `TransactionRepository` ja `CategoryRepository` huolehtivat tiedon tallentamisesta. Kaikki tieto tallennetaan [SQLite](https://www.sqlite.org/)-tietokantaan. Tietokannan nimi on määritelty `.env.`-tiedostossa, ja se on oletuksena `expensetracker.db`.
Luokkien suunnittelussa on noudatettu repository-suunnittelumallia, mikä tarkoittaa että tiedon haku ja tallennus on eriytetty omiin osiinsa. Tällöin jokaisella tietokohteella (tämän sovelluksen tapauksessa käyttäjät, tapahtumat ja kategoriat) on oma repositorionsa.

`Repositories`-pakkauksen luokat `UserRepository`, `TransactionRepository` ja `CategoryRepository` huolehtivat tiedon tallentamisesta ja hakemisesta. Kaikki tieto tallennetaan [SQLite](https://www.sqlite.org/)-tietokantaan. Tietokannan nimi on määritelty `.env`-tiedostossa, ja se on oletuksena `expensetracker.db`. Testien suorittamista varten on oma tietokantansa.

Tietokanta alustetaan `initialize_database.py`-tiedostossa, joka suoritetaan automaattisesti alustustoimenpiteiden aikana (`poetry run invoke build`).

## Toiminnallisuudet
Tietokanta sisältää neljä taulua: `Users`, `Transactions`, `Categories` ja `CategoryVisibilities`. Kolme ensimmäistä taulua vastaa läpi sovelluksen esiintyviä vastaavia tietorakenteita, ja viimeksi mainittu sisältää tiedon siitä, mitkä kategoriat kullekin käyttäjälle näytetään. Näin siksi, että kullakin sovelluksen käyttäjistä on omat kategoriansa, ja kunkin käyttäjän tulee pystyä poistamaan kategorioita vain itseltään. Käyttäjän ”poistaessa” kategorian sitä ei todellisuudessa poisteta, vaan ainoastaan piilotetaan häneltä.

Tarkempaa tietoa sovelluksen käyttämän tietokannan rakenteesta voit katsoa [täältä](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/src/initialize_database.py).

## Päätoiminnallisuudet

### Uuden käyttäjän luominen
Alla on kuvattu sekvenssikaavioina sovelluksen toimintalogiikka muutaman päätoiminnallisuuden osalta.

### Rekisteröityminen ja sisäänkirjautuminen

![](images/sekvenssikaavio_kirjautuminen.png)

### Uuden tapahtuman luominen
Sovelluksen alkunäkymässä käyttäjä klikkaa ”Luo uusi käyttäjätili” -painiketta. Avautuvassa näkymässä käyttäjä syöttää haluamansa käyttäjätunnuksen ja salasanan, ja tämän jälkeen painaa ”Luo käyttäjätili”. Tämän jälkeen käyttöliittymä kutsuu `UserService`-luokan `create`-funktiota, jossa syötteet testataan mahdollisten virheiden varalta (mm. jokin syötteistä tyhjä, salasana ja sen vahvistus eivät täsmää). Jos syötteet ovat kunnossa, `UserService` kutsuu `UserRepository`-luokan `create`-funktiota parametrinaan `User`-olio. `UserRepository` palauttaa juuri luodun käyttäjätilin id:n, joka myös `UserService`-luokasta välitetään käyttöliittymälle.

Käyttäjätilin luomisen jälkeen käyttäjälle lisätään vielä oletuskategoriat. Käyttöliittymästä kutsutaan `CategoryService`-luokan funktiota `add_default_categories` parametrinaan juuri luodun käyttäjätilin id. `CategoryService`-luokasta kutsutaan `CategoryRepository`-luokkaa, joka hoitaa varsinaisen lisäyksen.

Viimeisenä käyttäjä kirjataan automaattisesti sisään kutsumalla jälleen käyttöliittymästä `UserService`-luokan `login`-funktiota parametrinaan käyttäjätunnus ja salasana, minkä jälkeen `UserService`-luokasta kutsutaan `UserRepository`-luokan `search_by_username`-funktiota parametrinaan käyttäjätunnus. Syötettyjä tietoja verrataan `search_by_username`-funktion palauttamiin arvoihin, ja jos ne vastaavat toisiaan, niin käyttäjä kirjataan sisään ja hänet siirretään sovelluksen budjetti- eli päänäkymään.

### Uuden tapahtuman lisääminen

![](images/sekvenssikaavio_uusi_tapahtuma.png)

Kirjautunut käyttäjä klikkaa sovelluksen budjetti- eli päänäkymästä tapahtumasta riippuen joko ”Lisää uusi meno” tai ”Lisää uusi tulo”. Molemmat valinnat johtavat samaan näkymään, mutta näkymälle välitetään tieto siitä, onko käyttäjä lisäämässä menoa vai tuloa. Käyttäjä syöttää avautuvalle lomakkeelle vähintään päivämäärän, kategorian ja määrän sekä vapaaehtoisen kuvauksen ja klikkaa ”Lisää tapahtuma”-painiketta.

Tämän jälkeen käyttöliittymä kutsuu `UserService`-luokan `get_current_user_id`-funktiota, joka edelleen kutsuu `UserRepository`-luokan funktiota `get_user_id` parametrinaan sisäänkirjautuneen käyttäjän käyttäjätunnus. `UserRepository` ja `UserService` palauttavat käyttäjän id:n. Lisäksi kutsutaan `CategoryService`-luokan `get_category_id`-funktiota, jolle annetaan parametriksi kategorian nimi ja tyyppi. Samoilla parametreilla kutsutaan `CategoryRepository`-luokan `get_category_id`-funktiota, joka palauttaa kategorian id:n. `CategoryService` palauttaa saman id:n käyttöliittymälle.

Seuraavaksi käyttöliittymästä kutsutaan `TransactionService`-luokan `create`-funktiota parametrinaan tapahtuman ajankohta, tyyppi (meno vai tulo), summa, kategorian id sekä käyttäjän id. Tämän jälkeen `TransactionService`-luokassa ajankohta ja summa validoidaan. Jos parametrit olivat kunnossa, kutsutaan `TransactionRepository`-luokan `add`-funktiota ja annetaan sille parametriksi `Transaction`-olio, joka sisältää tapahtuman tiedot. Tapahtuman lisäyksen jälkeen käyttäjä siirretään sovelluksen päänäkymään.

### Uuden kategorian lisääminen

![](images/sekvenssikaavio_uusi_kategoria.png)
![](images/sekvenssikaavio_uusi_kategoria.png)

Kirjautunut käyttäjä klikkaa sovelluksen päänäkymässä ”Tarkastele kategorioita” -painiketta ja seuraavassa näkymässä ”Lisää kategoria”. Käyttäjä syöttää avautuvalle lomakkeelle kategorian nimen sekä tyypin (meno vai tulo) ja klikkaa ”Lisää kategoria”-painiketta.

Tämän jälkeen käyttöliittymä kutsuu `UserService`-luokan `get_current_user_id`-funktiota, joka edelleen kutsuu `UserRepository`-luokan funktiota `get_user_id` parametrinaan sisäänkirjautuneen käyttäjän käyttäjätunnus. `UserRepository` ja `UserService` palauttavat käyttäjän id:n.

Seuraavaksi käyttöliittymästä kutsutaan `CategoryService`-luokan `add`-funktiota, jonka parametriksi annetaan kategorian nimi, tyyppi ja käyttäjän id. `CategoryService`-luokasta kutsutaan edelleen `CategoryRepository`-luokan funktiota `add`, joka suorittaa varsinaisen lisäyksen. Lisäyksen jälkeen käyttäjä siirretään kategorianäkymään.

### Muut toiminnallisuudet

Muutkin toiminnallisuudet toimivat pääasiassa samalla logiikalla. Käyttöliittymästä kutsutaan jotakin kolmesta sovelluslogiikasta vastaavasta luokasta, josta tarvittaessa kutsutaan jonkin repositorio-luokan metodia. Onnistuneen suorituksen jälkeen käyttäjä ohjataan esimerkiksi päänäkymään. Virhetilanteissa sovellus antaa virheilmoituksen, ja joissakin tilanteissa myös toiminnan suorittamista saa ilmoituksen (esim. tapahtuman päivitys).
6 changes: 6 additions & 0 deletions dokumentaatio/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,9 @@
* Muokattu tietokantaa niin, että jokaisella käyttäjällä on omat kategoriansa, jolloin yhden käyttäjän lisäämät tai poistamat kategoriat eivät suoraan vaikuta muihin käyttäjiin
* Lisätty mahdollisuus muokata ja poistaa jo lisättyjä tapahtumia
* Testattu, että kategorioiden poisto sekä tapahtumien muokkaus ja poisto toimivat odotetulla tavalla

## Viikko 7

* Lisätty mahdollisuus suodattaa päänäkymässä näkyviä menoja ajankohdan tai kategorian mukaan
* Korjattu pieniä virheitä mm. uuden tapahtuman lisäämisessä
* Viimeistelty graafisen käyttöliittymän ulkoasua
Binary file modified dokumentaatio/images/pakkauskaavio.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified dokumentaatio/images/sekvenssikaavio_kirjautuminen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified dokumentaatio/images/sekvenssikaavio_uusi_kategoria.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified dokumentaatio/images/sekvenssikaavio_uusi_tapahtuma.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added dokumentaatio/images/testikattavuus.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions dokumentaatio/kayttoohje.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
# Käyttöohje

## Asennus ja käyttöönotto

Tallenna sovelluksen lähdekoodi zip-pakettina [tästä](https://github.com/valtterikantanen/ot-harjoitustyo/archive/refs/tags/loppupalautus.zip) ja pura se. Purkamisen jälkeen siirry projektin juurikansioon. Juurikansiossa suorita ensin komento

```
$ poetry install
```
joka asentaa sovelluksen tarvitsemat kirjastot. Seuraavaksi suorita alustustoimenpiteet komennolla
```
$ poetry run invoke build
```
Tämän jälkeen ohjelma on valmiina käytettäväksi. Ohjelman voi käynnistää komennolla
```
$ poetry run invoke start
```

## Kirjautuminen

Sovellus käynnistyy kirjautumisnäkymään:
Expand Down
29 changes: 29 additions & 0 deletions dokumentaatio/testaus.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Testausdokumentti

## Yksikkö- ja integraatiotestaus
Sovellusta on yksikkötestattu [unittest](https://docs.python.org/3/library/unittest.html)-sovelluskehystä käyttäen.

### Sovelluslogiikka
Jokaiselle sovelluslogiikasta vastaavalle luokalle (`UserService`, `TransactionService` ja `CategoryService`) on luotu omat testiluokat. Testien toteuttamiseksi `.env.test`-tiedostossa on määritelty, että testeissä ei käytetä samaa tietokantaa kuin sovellus tavallisesti käyttää. Oletuksena testitietokannan nimi on `testdatabase.db`. Tämän johdosta testien suorittaminen ei tyhjennä pysyväistalletettuja tietoja.

### Repositorio-luokat
Ainoastaan `CategoryRepository`-luokalle on tehty oma testiluokkansa `TestCategoryRepository`. Kyseisessä luokassa on vain yksi testi sellaista ominaisuutta varten, jota tällä hetkellä hyödynnetään ainoastaan luokan sisällä. Muiden repositorio-luokkien toiminta on tullut testatuksi samalla `service`-luokkien testien kanssa.

### Testikattavuus

Koodin testauksen haaraumakattavuus on 99 %.

![](images/testikattavuus.png)

Testauksen ulkopuolelle jätettiin käyttöliittymäkoodin sisältävän `ui`-kansion tiedostot. Myöskään `initialize_database.py`- ja `build.py` tiedostojen suorittamista komentoriviltä ei ole testattu. Muiden tiedostojen osalta testikattavuus on 100 %.

## Järjestelmätestaus

### Asennus ja käynnistäminen
Sovellus on asennettu [käyttöohjeen](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/kayttoohje.md) mukaisesti Linux-ympäristössä (uusimmat päivitykset sisältävä [Cubbli 20](https://wiki.helsinki.fi/display/it4sci/Cubbli+Linux) -fuksiläppäri). Käyttöä ei ole testattu lainkaan Windows- tai macOS-käyttöjärjestelmillä.

### Toiminnallisuudet
Kaikkien [vaatimusmäärittelyn](https://github.com/valtterikantanen/ot-harjoitustyo/blob/master/dokumentaatio/vaatimusmaarittely.md) mukaisten ominaisuuksien toiminta on testattu manuaalisesti. Lisäksi lomakkeita on yritetty tarkoituksella täyttää virheellisillä arvoilla. Näissäkään tapauksissa ohjelma ei ole kaatunut, vaan käyttöliittymässä on näytetty asianmukainen virheilmoitus.

## Tiedossa olevat ongelmat
Jos sovelluksen käynnistää ilman alustustoimenpiteiden suorittamista, sovellus käynnistyy. Kuitenkaan esimerkiksi uuden käyttäjätilin luominen ei onnistu, koska tällöin tietokantatauluja ei ole luotu. Tällöin sovellukseen ei tule näkyviin virheilmoitusta, vaan komentoriville tulostuu traceback.
6 changes: 5 additions & 1 deletion dokumentaatio/tuntikirjanpito.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,8 @@
| 29.4. | 6 | Laajennettu käyttöliittymää, selkiytetty testejä |
| 2.5. | 6 | Parannettu virheenkäsittelyä, laajennettu edelleen käyttöliittymää |
| 3.5. | 7 | Poistettu toisteista koodia, parannettu koodin muotoilua, kirjoitettu uusia testejä |
| | 53 | **Yhteensä** |
| 10.5. | 5 | Koodin refaktorointia, esim. BudgetService-luokka jaettu kolmeen uuteen luokkaan |
| 11.5. | 7 | Käyttöliittymän viimeistelyä, lisätty esim. mahdollisuus rajata näkyviä tapahtumia |
| 12.5. | 5 | Testien laajentamista uusimpien ominaisuuksien osalta, koodin refaktorointia |
| 14.5. | 4 | Koodin refaktorointia ja viimeistelyä, docstringin kirjoittamista |
| | **79** | **Yhteensä** |
25 changes: 10 additions & 15 deletions dokumentaatio/vaatimusmaarittely.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# Vaatimusmäärittely

## Sovelluksen tarkoitus
Tavoitteena on luoda sovellus, jonka avulla käyttäjä voi seurata henkilökohtaista talouttaan. Seuranta tapahtuu pitämällä kirjaa tuloista ja menoista sekä tarkastelemalla kirjattuja tapahtumia joko tekstimuodossa tai graafisesti. Sovellukseen voi rekisteröityä useita käyttäjiä, jotka voivat seurata omia tapahtumiaan.

Tavoitteena on luoda sovellus, jonka avulla käyttäjä voi seurata henkilökohtaista talouttaan. Seuranta tapahtuu pitämällä kirjaa tuloista ja menoista sekä tarkastelemalla kirjattuja tapahtumia joko tekstimuodossa tai graafisesti. Sovellukseen voi rekisteröityä useita käyttäjiä, jotka voivat kukin seurata omia tapahtumiaan.

## Käyttäjät
Alussa sovelluksessa on vain yksi käyttäjätyyppi eli tavallinen käyttäjä. Tulevaisuudessa sovellukseen voi tulla mahdollisuus lisätä myös pääkäyttäjiä, joilla on laajemmat oikeudet.

Sovelluksessa on vain yksi käyttäjätyyppi eli tavallinen käyttäjä.

## Toteutetut toiminnot

Expand All @@ -21,25 +23,18 @@ Kirjautunut käyttäjä voi:
* lisätä uuden tapahtuman
* Tapahtumaan liittyy tapahtumapäivä, tyyppi (meno vai tulo), summa, kategoria ja vapaaehtoinen kuvaus.
* listata tapahtumat
* Käyttäjä voi listata kaikki lisäämänsä tapahtumat.
* Käyttäjä voi listata kaikki lisäämänsä tapahtumat. Hän voi myös suodattaa tapahtumia ajankohdan tai kategorian mukaan.
* poistaa tai muokata tapahtumia
* Käyttäjä voi valita haluamansa tapahtuman ja muokata haluamiaan tietoja. Tapahtuman voi myös poistaa kokonaan. Vahinkojen minimoimiseksi käyttäjältä varmistetaan vielä ennen lopullista poistoa, haluaako hän todella poistaa tapahtuman.
* tarkastella, lisätä ja poistaa kategorioita
* Kategorioiden tarkoitus on auttaa tapahtumien ryhmittelyssä. Sovelluksessa on valmiina ennalta asetettuja kategorioita (esim. *asuminen*, *ruoka ja päivittäistavarat*, *ajoneuvot ja liikenne*). Käyttäjä kuitenkin pystyy poistamaan sekä valmiita että itse luotuja kategorioita.
* kirjautua ulos.

## Tulevat toiminnot

Kirjautunut käyttäjä voi:

* rajata tarkasteltavien tapahtumien määrää
* Käyttäjä voi valita tietyn ajanjakson tai kategorian, johon kuuluvia tapahtumia hän haluaa tarkastella.
* tarkastella tapahtumia graafisesti
* Listauksen lisäksi käyttäjä voi tarkastella tapahtumia myös graafisesti. Kuten listauksessa, hän voi tarkastella kaikkia tapahtumia tai jollakin kriteerillä valita osan niistä.

## Jatkokehitysideoita
Aikataulun salliessa sovellusta voidaan täydentää lisäämällä mm. seuraavia toimintoja:

* Pääkäyttäjän lisääminen
Tulevaisuudessa sovellusta voidaan täydentää lisäämällä esimerkiksi seuraavia toimintoja:

* Laajemmat oikeudet omaavan pääkäyttäjän lisääminen
* Käyttäjätunnuksen tai salasanan vaihtaminen
* Useiden erillisten budjettien luominen samalle käyttäjälle
* Useiden erillisten budjettien luominen samalle käyttäjälle
* Tapahtumien tarkastelu graafisesti esim. pylväs- ja ympyrädiagrammien avulla

0 comments on commit 8b8a652

Please sign in to comment.