Meeskond "C terav": Difference between revisions

From ICO wiki
Jump to navigationJump to search
 
(42 intermediate revisions by one other user not shown)
Line 18: Line 18:
== Ülesanded ==
== Ülesanded ==


*Madis Sarv - xml,teenuse metoodid, klientrakendus
*Madis Sarv - xml,teenuse metoodid, klientrakendus, wiki, mobiiliklient
*Siim Sarv - xml,teenuse metoodid, klientrakendus
*Siim Sarv - xml,teenuse metoodid, klientrakendus, desktopiklient
*Jaanus Vallmann - xml,teenuse turva ja logi
*Jaanus Vallmann - xml,teenuse turva ja logi


Line 426: Line 426:
===Meedodite kirjeldused===
===Meedodite kirjeldused===


*AnnaMenyy() - Tagastab menüü vastavalt saadud menüüidle.  
*AnnaMenyy() - Tagastab menüü vastavalt saadud menyyID-le.  
*AnnaMenyyKirje() - Tagasatb menüü kireje sisu vastavalt saadud idle.
*AnnaMenyyKirje() - Tagasatb menüü kireje sisu vastavalt menyyKirjeID-le .
*
*AnnaKoikMenyyd() - Tagastab kõik menüüd, mis ühel kohvikul võivad olla vastavlt kohvikID-le.
*
*lisaMenyy() - Lisab uue menüü kohvikule vastavalt kohvikID-le.
*
*lisaMenyyKirje() - Lisab uue menüü kirje vastavalt menyyID-le.
*
*updateMenyy() - Uuendab menüüd vastavalt menyyKirjeID-le.
*
*updateMenyyKirje() - Uuendab menüükirjet vastavalt menyyKirjeID-le.
*
*delMenyy() - Kustaub menüü vastavalt menyyKirjeID-le.
*
*delMenyyKirje() - Kustaub menüükirje vastavalt menyyKirjeID-le.
*
*addtUpMenyyKirje() - Lissab hääle toidule menüükirjes vastavalt menyyKirjeID-le.
*
*addtDownMenyyKirje() - Lissab  negatiivsehääle toidule menüükirjes vastavalt menyyKirjeID-le.
*
*AnnaKohvikud() - Tagastab kõik olemas olevad kohvikud.
*
*AnnaKohvik() - Tagastab info kohviku kohta vastavlt kohvikID-le.
*
*addKohvik() - Lisab uue kohviku andmebaasi.
*
*delKohvik() - Eemaldab kohviku vastavlt kohvikID-le.
*
*upKohvik() - Uuendab kohviku infot vastaval kohvikID-le.
*
*annaKohvikuToidud() - Tagasdab kohvikus pakutavad toidud vastavalt saadud kohvikID-le.
*
*annaToidud() - Annab kõikides kohvikutes olemasolevad toidud.
*
*annaToiduTyyp() - Tagastab toidu tüüpi nime vastavalt tyypID-le.
*
*annaToiduTyybid() - Tagastab kõik olemasolead erinevad toitude tüübid.
*
*annaLisandid() - Tagastab kõik olemasolevad lisandid.
*
*addToit() - Lisab uue toidu andmebaasi vajab toitTyypID ja toitKohvikID.
*
*upToit() -  Värskendab toidu infot andmebaasis vastavalt toitID-le ja toitTyypID-le.
*
*delToit() - Kustutab toidu vastavalt toitID-le.
*annaKasutajad() - Tagasdab kõik andmebaasis olemas olevad kasutajad.
*annaKasutaja() - Tagastab kasutaj kohta nime ja kas kasutaja on aktiivne vastavalt saadud KasutajaID-le.
*upKasutaja() - Uuendab kasutaja infot KasutajaID-le.
*delKasutaja() - Muudab kasuta mitteaktiivseks KasutajaID-le.
*addKasutaja() - Lisab uue kasutaja kasutajate tabelisse vaja ette anda kasutaja yunnus ja salasõna.
*AddKohvikuKasutaja() - Seob kasutaja kindla kohvikuga vastavalt kohvikID ja kasutajaID.
*delKohvikuKasutaja() - Kustutab kohviku kasutaja kohvikuKasutaja tabelis vastavalt kasutajaID-le.
*annaKohvikuKasutajad() - Tagastab kohviu kasutajaid ja kohvkuid kkohvikID järgi.
*checkKasutaja() - Kontrollib kas kasutaja sisestatud nimi ja parool on õiged.
*addtUpKommentaar() - Annab poolthääle komentaarile vastavalt kommentaarID-le.
*addtDownKommentaar() - Annab vastu hääle komentaaridele vastavalt kommentaarID-le.
*addKommentaar() - Lisab uue komentaari komentaaride tabelisse vaja ette anda MenyyKirje_ID.
*annaKommentaarid() - Annab komentaarid vastavlt menyyKirjeID-le.
*annaKohvikuLahtiOlek() - Tagastab info kohviku lahtioleku aegade kohta, vastavlt kohvikuID-le.
*addLahtiOlek() - Lisab kohvikule uue lahtioleku aja. Kasutades selleks kohvikuID.
*delLahti() - Kustudab lahtioleku aja, vastavalt lahtiID-le.
*updLahti() - Muudab lohtioleku aega, vastavalt lahtiID-le.


===Andmebaas:===
===Andmebaas:===


[[File:andmebaas.png]]
[[File:andmebaasCteravUus.png]]


===Koodinäited===
==Klient Rakendus==


Link kogu teenuse osa jaoks koos kõigi classidega asub [http://enos.itcollege.ee/~msarv/vork2/ siin]
===Kirjeldus===


<source lang="csharp">
Otsustasime teha veebiklientrakenduse kasutades selleks .NET arendus keskonda.
using System;
Rakendus koosneb kahes osast:
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;


// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "KohvikWCF" in code, svc and config file together.
====Esimene osa====
public class KohvikWCF : IKohvikWCF
{
    //Annab konkreetse menüü
    public MenyyKirjeClass AnnaMenyy(int menyyID)
    {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.LaeMenyy(menyyID);
        return vajalik;
    }
    //Annab konkreetse menüü kirje
    public MenyyKirjeClass AnnaMenyyKirje(int menyyKirjeID)
    {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.LeaMenyyKirje(menyyKirjeID);
        return vajalik;
    }
    //Annab kohviku kõik menüüd
    public MenyyKirjeClass AnnaKoikMenyyd(int kohvikID)
    {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.laeKoikMenyyd(kohvikID);
        return vajalik;
    }
    //Lisab kohvikule uue nenüü
    public MenyyKirjeClass lisaMenyy(int kohvikID, DateTime alates, DateTime kuni, int kasutajaID)
    {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.lisaMenyy(kohvikID, alates, kuni,kasutajaID);
        return vajalik;
    }


    //Lisab kohviku menüüle kirjed
*Kasutaja saab vaadata andmebaasis olemasolevaid kohvikuid.
    public MenyyKirjeClass lisaMenyyKirje(int menyyID, int toitID, string hind, int kohvikID, int kasutajaID)
*Kohviku kohta saab vaadata selle aadressi ja lahtioleku aegu.
    {
*Kohviku kohta saab ka vaadata ka menüüd.
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
*Kohviku menüüs saab erinevaid toite komenteerida ja lisada poolt ja vastu hääli toidule.
        vajalik.lisaMenyyKirje(menyyID, toitID, hind, kohvikID, kasutajaID);
        return vajalik;
    }
    //uuendab infot menüü kehtivuse kohta
    public MenyyKirjeClass updateMenyy(int menyyID, DateTime alates, DateTime kuni)
    {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.muudaMenyy(menyyID, alates, kuni);
        return vajalik;
    }
    //uuendab kindla kohviku menüü sisu
    public MenyyKirjeClass updateMenyyKirje(int menyyKirjeID, int fkToitID, string hind, bool otsas)
    {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.muudaMenyyKirje(menyyKirjeID, fkToitID, hind, otsas);
        return vajalik;
   
    }
    //eemaldab menüü muutes selle mitte aktiivseks
    public MenyyKirjeClass delMenyy(int menyyID) {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.kustutaMenyy(menyyID);
        return vajalik;
    }
    //Eemaldab menüült toidu
    public MenyyKirjeClass delMenyyKirje(int menyyKirjeID) {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.kustutaMenyyKirje(menyyKirjeID);
        return vajalik;
    }
    //lisab toidule menüüs poolt hääle
    public MenyyKirjeClass addtUpMenyyKirje(int menyyKirjeID) {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.tUpMenyyKirje(menyyKirjeID);
        return vajalik;
    }
    //lisab toidule menüüs vastu hääle
    public MenyyKirjeClass addtDownMenyyKirje(int menyyKirjeID)
    {
        MenyyKirjeClass vajalik = new MenyyKirjeClass();
        vajalik.tDownMenyyKirje(menyyKirjeID);
        return vajalik;
    }
    //Tagastab info kõikide olemasolevate kohvikute kohta
    public KohvikKirjeClass AnnaKohvikud()
    {
        KohvikKirjeClass vajalik = new KohvikKirjeClass();
        vajalik.laeKohvikud();
        return vajalik;
    }
    //Tagastab info ühe kindla kohviku kohta
    public KohvikKirjeClass AnnaKohvik(int kohvikID) {
        KohvikKirjeClass vajalik = new KohvikKirjeClass();
        vajalik.laeKohvik(kohvikID);
        return vajalik;
    }
    //Lisab andmebaasi uue kohviku
    public KohvikKirjeClass addKohvik(string nimi, string tanav, string maja, string linn, string riik, int laius, int pikkus) {
        KohvikKirjeClass vajalik = new KohvikKirjeClass();
        vajalik.lisaKohvik(nimi, tanav, maja, linn, riik, laius, pikkus);
        return vajalik;   
    }
    //Eemaldab andmebaasist kohviku
    public KohvikKirjeClass delKohvik(int kohvikID) {
        KohvikKirjeClass vajalik = new KohvikKirjeClass();
        vajalik.kustutaKohvik(kohvikID);
        return vajalik;
    }
    //uuendab infot kohviku kohta
    public KohvikKirjeClass upKohvik(int kohvikID, string nimi, string tanav, string maja, string linn, string riik, int laius, int pikkus) {
        KohvikKirjeClass vajalik = new KohvikKirjeClass();
        vajalik.uuendaKohvik(kohvikID, nimi, tanav, maja, linn , riik, laius, pikkus);
        return vajalik;
    }
    //Tagastab info kindlas kohikus pakkutava toidu kohta
    public ToiduKirjeClass annaKohvikuToidud(int kohvikID) {
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.laeKohvikuToidud(kohvikID);
        return vajalik;
    }
    //tagastab info kõikide olemasolevate toitude kohta
    public ToiduKirjeClass annaToidud()
    {
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.laeToidud();
        return vajalik;
    }


    //Tagastab info kindla toidu kohta, mis liiki toiduga on tegu
====Teine osa====
    public ToiduKirjeClass annaToiduTyyp(int tyypID)
    {
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.laeToiduTyyp(tyypID);
        return vajalik;
    }
    //Tagastab kõik olemas olevad toitude liigid
    public ToiduKirjeClass annaToiduTyybid()
    {
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.laeToiduTyybid();
        return vajalik;
    }
    //Tagastab info vastava toidu lisandite kohta
    public ToiduKirjeClass annaLisandid()
    {
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.laeLisandid();
        return vajalik;
    }
    //Lisab uue toidu
    public ToiduKirjeClass addToit(int toitTyypID, int toitKohvikID, string nimi, string kirjeldus){
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.lisaToit(toitTyypID, toitKohvikID, nimi, kirjeldus);
        return vajalik;
    }
    //Uendab infot toidu kohta
    public ToiduKirjeClass upToit(int toitID, int toitTyypID, string nimi, string kirjeldus) {
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.muudaToit(toitID, toitTyypID, nimi, kirjeldus);
        return vajalik;
    }
    //Eemaldab toidu
    public ToiduKirjeClass delToit(int toitID) {
        ToiduKirjeClass vajalik = new ToiduKirjeClass();
        vajalik.kustudaToit(toitID);
        return vajalik;
    }
    //Tagastab kõik kasutajad
    public KasutajaKirjeClass annaKasutajad() {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.laeKasutajad();
        return vajalik;
    }
    //Tagastab info kindla kasutaja kohta
    public KasutajaKirjeClass annaKasutaja(int KasutajaID)
    {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.laeKasutaja(KasutajaID);
        return vajalik;
    }
    //kasutaja parooli muutmine
    public KasutajaKirjeClass upKasutaja(int kasutajaID, string kasutajaPass)
    {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.muudaKasutaja(kasutajaID, kasutajaPass);
        return vajalik;
    }
    //Eemaldab kasutaja
    public KasutajaKirjeClass delKasutaja(int kasutajaID) {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.suleKasutaja(kasutajaID);
        return vajalik;
    }
    //Lisab uue kasutaja
    public KasutajaKirjeClass addKasutaja(string kasutajaTunnus, string kasutajaPass) {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.lisaKasutaja(kasutajaTunnus,kasutajaPass);
        return vajalik;
    }
    //Lisab kasutaja kindalse kohvikuusse
    public KasutajaKirjeClass AddKohvikuKasutaja(int kohvikID, int kasutajaID)
    {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.lisaKohvikuKasutaja(kohvikID, kasutajaID);
        return vajalik;
    }


    //Eemaldab kasutaja kohvikust
Tesieks pooleks on kohviku omaniku poolne vaade mis on turvatud. Turvamiseks kasutasime .net-i sisse ehitatud logimis funktsiooni.
    public KasutajaKirjeClass delKohvikuKasutaja(int kohvikKasutajaID)
Ka toimub pidev kasutaja õiguste kontroll kui tahetakse midagi kohvikuga seonduvat muuta.
    {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.kustutaKohvikuKasutaja(kohvikKasutajaID);
        return vajalik;
    }
    //Annab kõik kasutajad ühest kohvikust
    public KasutajaKirjeClass annaKohvikuKasutajad(int kohvikID) {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.laeKohvikuKasutajad(kohvikID);
        return vajalik;
    }
    //Kontrollib kasutajat kas ta on ikka õige kasutaja või ei ole
    public KasutajaKirjeClass checkKasutaja(string kasutajaTunnus, string kasutajaPass) {
        KasutajaKirjeClass vajalik = new KasutajaKirjeClass();
        vajalik.kasutajaKontroll(kasutajaTunnus, kasutajaPass);
        return vajalik;
    }
    //Annab poolt hääle komentaarile
    public KommentaarKirjeClass addtUpKommentaar(int kommentaarID)
    {
        KommentaarKirjeClass vajalik = new KommentaarKirjeClass();
        vajalik.tUpKommentaar(kommentaarID);
        return vajalik;
    }
    //Annab vastuhääle komentaarile
    public KommentaarKirjeClass addtDownKommentaar(int kommentaarID)
    {
        KommentaarKirjeClass vajalik = new KommentaarKirjeClass();
        vajalik.tDownKommentaar(kommentaarID);
        return vajalik;
    }
    //Lisab uue komentarri kohvikus pakutavale toidule
    public KommentaarKirjeClass addKommentaar(string nimi, string kommentaar, int fkMenyyKirje_ID)
    {
        KommentaarKirjeClass vajalik = new KommentaarKirjeClass();
        vajalik.lisaKommentaar(nimi, kommentaar, fkMenyyKirje_ID);
        return vajalik;
    }
    //Tagastab koik komenataarid ühe kindla toidu kohta menüüs
    public KommentaarKirjeClass annaKommentaarid(int menyyKirjeID) {
        KommentaarKirjeClass vajalik = new KommentaarKirjeClass();
        vajalik.laeKommentaarid(menyyKirjeID);
        return vajalik;
    }
}


</source>
*Kohiku omanik saab muuta kohviku aadersi ja lahtioleku aegu.
*Saab lisad muuta ja kustuda kohviku menyysi.
*Saab lisada muuta ja kustudada uusi toite.
*Saab Lisada toite menüüdese, neid muuta ja kustudada.
 
====Pildid====
 
Uue toidu lisamine
 
[[File:ToiduLisamine1.png]]
 
Omaniku pealeht
 
[[File:omanikPeaCterav.png]]
 
Menüü
 
[[File:menyy.png]]
 
Mobiil
 
[[File:telefon.png]]
 
Desktopklient
 
[[File:kassa.png]]
 
====Koodinäited====
Teenuse koos klientrakendusega, mobiilirakendusega ja desktopkliendiga saab kätte [http://enos.itcollege.ee/~msarv/vork2 siit]
 
 
Testimiseks tuleb teenuse aadress muuta rakenduses, sest teilvõivad olla portid erinevad mida kasutab. Lisaks tuleb ka rakenduse web.config failis pordid muuta. Teenus tuleb lisada nimega KohvikTeenus. Mobiilirakenduse puhul piisab uue refernici lisamisega soovitavalt nimeks panna KohvikTeenus.
 
====Kuidas kasutada====
 
Rakkendust on võimalik kasutada külalisena või siis kasutajane.
*Külalisena saab vaadata kohvikuid, kohviku asukoht, tööaehu ja menüüsi
*Kasutaja saab lisada uusi enda kohvikuid, muuta nede kohta infot, lisada uusi menüüsi, ja toite.
 
====Klassid rakkenduses====
 
*Kasutaja -Annab teenuses kasutajale määratud kohvikud.
*KasutajaKohvik -Annab kasutaj ühe kindal kohvkiu.
*KasutajaMenyy -Annab kasutajle valitud  kohiku menüü.
*Kohvik - Annab külalisele kogu info kohvikust.
*KohvikMuuda - Muudab kindla kohviku andmeid.
*Kohvikud - Annab külalisele kõik olemasolevad kohvikud.
*Kommenaarid - Kuvab olemas olevad komentaarid ja lisab uusi.
*LahtiAjad -Annab kohviku omanikule võimaluse muuda kohviku lahtioleku aegu ja lisada uusi.
*Login - Kohviku omaniku sisselogimiseks.
*Logout - väljalogimiseks.
*Menyy - Kuvab külastajale olemas oleva menüü sisu.
*MenyyKirje - Laseb Kohviku omanikul lisada uusi toite menüüse ja olemasolevaid muuta
*MenyyMuuda - Laseb muuta menüüd.
*Toidud - Tagastab omanikule olemasolevad toidud.
*ToidMuuda - Lubab omanikul muuta toite ja lisada neid juurde.
*audentimine - Kohviku sessionide cookide ja kasuta audentimine.
 
==Mobiili rakendus==
 
Loodud kiireks kasutamiseks kui peaks olema vajadus valida sõõgikohta lõunaks või õhtuks.
Rakendus võimaldab saada infot kohviku asukoha kohta ja saada teada ka pakutavat menüüd.
Rakkenduse käivitamiseks on vajalik tõmmata endale WP7 devoleper tools saab [http://www.microsoft.com/downloads/en/details.aspx?FamilyID=04704acf-a63a-4f97-952c-8b51b34b00ce siit].
Lisaks tuleb muuta reference ära ja nimeks panna KohvikTeenus.
 
==Desktop rakendus==
 
Loodud kassapidajale päevajooksul menüüs olevate asjade hinna muutmiseks või menüüst eemaldamiseks.
 
==Aruanne==
 
===Tegime valmis!===
 
Projektiks valisime kohvikute infosüsteemi, kust saab kasutaja teada milliseid toite kohvikus pakutakse.
Lisaks sai juurde tehtud ka võimalus, mis lubab erinevaid toite kohviku menüüs komenteerida ja rateida.
Kohviku omanikud saavad muuta informatsiooni oma kohviku kohta, ehk saavad lisada uusi lahtioleku aegu, koostatda uusi menüüsi
ja lisada uusi sööke menüüse. Projekti ehitamist alustasime XML, XML Schema ja XSLT. Pärast mida alustasime tööd andmebaasi loomiseks. Kui andmebaas oli valmis saanud alustasime tööd teenuse tegemiseks. Tehtud teenus võimaldab pärida infot andmebaasist, näiteks on olemas võimalus pärida infot ühe kindla kohviku kohta, või siis pärida millise kasutajaga on seaotud kindlad kohvikud. Pärast mida hakkasime ehitama veebiklienti.Veebiklient võimaldab tavalisel kasutajal, ehk siis mitteregisteeritud kasutajal saada infot kohviku kohta, näiteks kohviku aadress, lahtioleku ajad, pakutavad menüüd ja ka komenterida pakutavaid toite ja hinnata neid. Ka sisaldab veebiklient kohviku omaniku poolt, kus saab kohviku omanik lisada uusi menüüsi kohvikutele, mis on temaga seotud. Muuta kohvikuga seotud infot, ehk muuta lahtioleku aegu aadresi jne. Ka saab muuta menüüsi lisada uusi, lisada uusi toite, muuta menüüs olevate toidude hindu jne.Kuna selgus, et ühest jääb ikkagi vähest otsustasime teha ka eraldi windowsi kliendi ja WP7 kliendi.
Windowsi klient on mõeldud kassapidaja igapäevaseks tööks, mis võimaldab muuta hindu ja eemaldada juba läbimüüdud toite.
WP7 rakendus on mõeldud kiireks info leidmiseks kohviku kohta, mis võimaldab siis saada teada kohviku asukohta, pakutavaid menüüsi ja toite.
 
===Mida juurde õppisime===
 
*XML, XML Schema ja XSLT
*Kuidas luua teenust ja siduda seda andmebaasiga.
*Kuidas luua teenusele klienti.
*Kuidas luua WP7 klienti.
 
===Millised probleemid tekkisid töökäigus!===
 
*Teenuse ehitamine oli algul suhteliselt aeglane kuna kellegil polnud algul erilisi kogemusi kuidas sellist asja üldse teha tuleks
hilisemalt küll läks töö kiiremini kuna enamus probleemid olid juba lahendatud töö algus etapil.
*Veebiklienti tegemise ajal selgus, et teenust on vaja täiendada kuna osa vajaminevaid meetodeid ei suudedud ette näha teenuseehitamise käigus.
*Mobiili rakenduse tegemise algfaas sarnases oma rakuselt teenusele selle poolest, et puudus kogemus kuida seda korralikult ehitada, mille tõttu kanatas ka disain tugevalt.
 
===Mida paremini teha oleks saanud!===
 
*Oleks pidanud arvestama rohkema ajakuluga kuna arvestasime et kulub vähem aega kui tegelikult läks, mis oleks andnud võimaluse  rohkem siluda.
 
==Meeskoona Punktid==
 
*Madis Sarv - 25
*Siim Sarv - 27
*Jaanus Vallmann - 8

Latest revision as of 14:46, 6 June 2011

Liikmed

  • Madis Sarv
  • Siim Sarv
  • Jaanus Vallmann

Idee

Kohviku omanikud saavad lisada oma kohvikulue päeva menüüsi, mida saavad teised komenteerida. Kohviku kohta on ka asukoht ja ajakava millal see lahti on. Toite saavad lisada ainult regristreerinud kasutajad, kes on kohviku omanikud. Kohviku omanikud saavad ka muuta oma kohviku andmeid ja lahtioleku aegu ning lisada erandpäevi(kas on üldse kinni või on pikemalt lahti). Omanik lisab päevakohta menüü, kui see saab sel päeval otsa märgib, et on otsas. Menüüs saab ta lisada toidule nime, tüübi ja infot selle kohta ning täis- ja pooliku portsioni hinnad. Tavakasutajad saavad komenteerida toite (sisestades oma nime ja komentaari) ning neid hinnata. Hinnata saab aint komentaari lisades. Tavakasutaja ei pea sisselogima.

Ülesanded

  • Madis Sarv - xml,teenuse metoodid, klientrakendus, wiki, mobiiliklient
  • Siim Sarv - xml,teenuse metoodid, klientrakendus, desktopiklient
  • Jaanus Vallmann - xml,teenuse turva ja logi

XML

<?xml version="1.0" encoding="utf-8"?>
<kohvikud>
  <kohvik>
    <nimi>Kohvik1</nimi>
    <aadress laius="59.395515" pikkus="24.664993">
      <riik>Eesti</riik>
      <maakond>Harjumaa</maakond>
      <linnVald>Tallinn</linnVald>
      <tanav>Raja</tanav>
      <majaNR>C4</majaNR>
      <indeks>12315</indeks>
    </aadress>
    <lahtiOlekuAjad>
      <aeg>
        <nadalaPaevad>
          <nadalaPaev>esmaspäev</nadalaPaev>
          <nadalaPaev>teisipäev</nadalaPaev>
          <nadalaPaev>kolmapäev</nadalaPaev>
          <nadalaPaev>neljapäev</nadalaPaev>
          <nadalaPaev>reede</nadalaPaev>
        </nadalaPaevad>
        <avamisAeg>
          <tund>09</tund>
          <minut>00</minut>
        </avamisAeg>
        <sulgemisAeg>
          <tund>16</tund>
          <minut>00</minut>
        </sulgemisAeg>
      </aeg>
    </lahtiOlekuAjad>
    <erandPaevad>
      <kuuPaev>
        <paev>1</paev>
        <kuu>1</kuu>
        <aasta>2011</aasta>
        <avamisAeg>
          <tund>09</tund>
          <minut>00</minut>
        </avamisAeg>
        <sulgemisAeg>
          <tund>16</tund>
          <minut>00</minut>
        </sulgemisAeg>
      </kuuPaev>
    </erandPaevad>
    <menyyd>
      <menyy>
        <kuuPaev>
          <paev>23</paev>
          <kuu>2</kuu>
          <aasta>2011</aasta>
        </kuuPaev>
        <toidud>
          <toit>
            <nimi>Seljanka</nimi>
            <liik>Supp</liik>
            <info>Supp on kausis</info>
            <hinnad>
              <tais>1.80</tais>
              <poolik>1</poolik>
            </hinnad>
            <kommentaarid>
              <kommentaar>
                <nimi>Teet</nimi>
                <text>Jõhker oli</text>
                <hinnang>8</hinnang>
              </kommentaar>
            </kommentaarid>
            <otsas>1</otsas>
          </toit>
          <toit>
            <nimi>Pozarski kotlett</nimi>
            <liik>Praad</liik>
            <info>kotlett ja keedukartulid</info>
            <hinnad>
              <tais>2.5</tais>
              <poolik>2</poolik>
            </hinnad>
            <kommentaarid>
              <kommentaar>
                <nimi>Aivar</nimi>
                <text>Külmaks oli läinud</text>
                <hinnang>2</hinnang>
              </kommentaar>
            </kommentaarid>
            <otsas>0</otsas>
          </toit>
          <lisad>
            <lisa>
              <nimi>Praekartul</nimi>
              <otsas>0</otsas>
            </lisa>
            <lisa>
              <nimi>Riis</nimi>
              <otsas>0</otsas>
            </lisa>
            <lisa>
              <nimi>Ahjukartul</nimi>
              <otsas>0</otsas>
            </lisa>
          </lisad>
        </toidud>
      </menyy>
    </menyyd>
  </kohvik>
</kohvikud>

XML Schema

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="kohvikud">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="kohvik">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="nimi" type="xs:string" />
              <xs:element name="aadress">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="riik" type="xs:string" />
                    <xs:element name="maakond" type="xs:string" />
                    <xs:element name="linnVald" type="xs:string" />
                    <xs:element name="tanav" type="xs:string" />
                    <xs:element name="majaNR" type="xs:string" />
                    <xs:element name="indeks" type="xs:integer" />
                  </xs:sequence>
                  <xs:attribute name="laius" type="xs:decimal" use="required" />
                  <xs:attribute name="pikkus" type="xs:decimal" use="required" />
                </xs:complexType>
              </xs:element>
              <xs:element name="lahtiOlekuAjad">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="aeg">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="nadalaPaevad">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="nadalaPaev" type="xs:string" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                          <xs:element name="avamisAeg">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="tund" type="xs:integer" />
                                <xs:element name="minut" type="xs:integer" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                          <xs:element name="sulgemisAeg">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="tund" type="xs:integer" />
                                <xs:element name="minut" type="xs:integer" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="erandPaevad">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="kuuPaev">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="paev" type="xs:integer" />
                          <xs:element name="kuu" type="xs:integer" />
                          <xs:element name="aasta" type="xs:integer" />
                          <xs:element name="avamisAeg">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="tund" type="xs:integer" />
                                <xs:element name="minut" type="xs:integer" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                          <xs:element name="sulgemisAeg">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="tund" type="xs:integer" />
                                <xs:element name="minut" type="xs:integer" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="menyyd">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="menyy">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="kuuPaev">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="paev" type="xs:integer" />
                                <xs:element name="kuu" type="xs:integer" />
                                <xs:element name="aasta" type="xs:integer" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                          <xs:element name="toidud">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="toit">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="nimi" type="xs:string" />
                                      <xs:element name="liik" type="xs:string" />
                                      <xs:element name="info" type="xs:string" />
                                      <xs:element name="hinnad">
                                        <xs:complexType>
                                          <xs:sequence>
                                            <xs:element name="tais" type="xs:decimal" />
                                            <xs:element name="poolik" type="xs:decimal" />
                                          </xs:sequence>
                                        </xs:complexType>
                                      </xs:element>
                                      <xs:element name="kommentaarid">
                                        <xs:complexType>
                                          <xs:sequence>
                                            <xs:element name="kommentaar">
                                              <xs:complexType>
                                                <xs:sequence>
                                                  <xs:element name="nimi" type="xs:string" />
                                                  <xs:element name="text" type="xs:string" />
                                                  <xs:element name="hinnang" type="xs:integer" />
                                                </xs:sequence>
                                              </xs:complexType>
                                            </xs:element>
                                          </xs:sequence>
                                        </xs:complexType>
                                      </xs:element>
                                      <xs:element name="otsas" type="xs:boolean" />
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                                <xs:element name="lisad">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element maxOccurs="unbounded" name="lisa">
                                        <xs:complexType>
                                          <xs:sequence>
                                            <xs:element name="nimi" type="xs:string" />
                                            <xs:element name="otsas" type="xs:boolean" />
                                          </xs:sequence>
                                        </xs:complexType>
                                      </xs:element>
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
    <body>
    <h2>Kohvikud</h2>
    <table border="1">
      <tr bgcolor="#FFFF00">
        <th>Kohvik</th>
        <th>Aadress</th>
        <th>Lahtiolekuajad</th>
        <th>Erandpäevad</th>        
      </tr>
      <xsl:for-each select="kohvikud/kohvik">
        <tr>
          <td>
            <xsl:value-of select="nimi"/>
          </td>
          <td>
            <xsl:value-of select="aadress"/>
          </td>
          <td>
            <xsl:value-of select="lahtiOlekuAjad"/>
          </td>
          <td>
            <xsl:value-of select="erandPaevad"/>
          </td>                
        </tr>
      </xsl:for-each>
    </table>
    <h2>Menüü</h2>
      <table border="1">
        <tr bgcolor="#FFFF00">
          <th>Toit</th>
          <th>Liik</th>
          <th>Info</th>                
          <th>Hind</th>
          <th>Kommentaar</th>          
          <th>Otsas</th>
        </tr>        
        <xsl:for-each select="kohvikud/kohvik/menyyd/menyy/toidud/toit">
          <tr>
            <td>
              <xsl:value-of select="nimi"/>
            </td>
            <td>
              <xsl:value-of select="liik"/>
            </td>
            <td>
              <xsl:value-of select="info"/>
            </td>                         
            <td>
              <xsl:for-each select="hinnad">
              <table>
                <tr>
                  Täis: <xsl:value-of select="tais"/>
                  <tr />
                  Poolik: <xsl:value-of select="poolik"/>
                </tr>                 
              </table>
              </xsl:for-each>
            </td>
            <td>
              <xsl:for-each select="kommentaarid/kommentaar">
                <table>
                  <tr>
                    <td>
                      <xsl:value-of select="text"/> (<xsl:value-of select="nimi"/>) Hinnang: <xsl:value-of select="hinnang"/>
                    </td>
                  </tr>
                </table>                
              </xsl:for-each>
            </td>
            <td>              
              <xsl:value-of select="otsas"/>                    
            </td>
          </tr>
        </xsl:for-each>
      </table>
      <h3>Lisad</h3>
      <table border="1">
        <tr bgcolor="#FFFF00">
          <th>Liasd</th>
          <th>Otsas</th>
        </tr>
        <xsl:for-each select="kohvikud/kohvik/menyyd/menyy/toidud/lisad/lisa">
          <tr>
            <td>
              <xsl:value-of select="nimi"/>
            </td>
            <td>
              <xsl:value-of select="otsas"/>
            </td>
          </tr>
        </xsl:for-each>
      </table>
    </body>
    </html>  
  </xsl:template>
</xsl:stylesheet>

Veebiteenus

Klassijaotus

  • KasutajaKirjeClass - Sisaldab kasutajaga seotuid meetodeid näiteks Kasutaj kohta info saamine.
  • KohvikKirjeClass - Sisaldab kohvikuga seaotud meedodeid näiteks kohvikute kuvamine ja nende kohta käiva info muutmine.
  • KomentaarKirjeClass - Sisaldab meedodeid komenataaride vaatamiseks ja lisamiseks.
  • LahtiKirjeClass - Sisaldab meedodeid kohviku lahit oleku eagade kohta.
  • MenyyKirjeClass - Sisaldab infot kohviku menüüde lisamise muutmise kohta.
  • ToiduKirjeClass - Sisadab infot toidude kuvamise liisamise ja muutmise kohta.

Meedodite kirjeldused

  • AnnaMenyy() - Tagastab menüü vastavalt saadud menyyID-le.
  • AnnaMenyyKirje() - Tagasatb menüü kireje sisu vastavalt menyyKirjeID-le .
  • AnnaKoikMenyyd() - Tagastab kõik menüüd, mis ühel kohvikul võivad olla vastavlt kohvikID-le.
  • lisaMenyy() - Lisab uue menüü kohvikule vastavalt kohvikID-le.
  • lisaMenyyKirje() - Lisab uue menüü kirje vastavalt menyyID-le.
  • updateMenyy() - Uuendab menüüd vastavalt menyyKirjeID-le.
  • updateMenyyKirje() - Uuendab menüükirjet vastavalt menyyKirjeID-le.
  • delMenyy() - Kustaub menüü vastavalt menyyKirjeID-le.
  • delMenyyKirje() - Kustaub menüükirje vastavalt menyyKirjeID-le.
  • addtUpMenyyKirje() - Lissab hääle toidule menüükirjes vastavalt menyyKirjeID-le.
  • addtDownMenyyKirje() - Lissab negatiivsehääle toidule menüükirjes vastavalt menyyKirjeID-le.
  • AnnaKohvikud() - Tagastab kõik olemas olevad kohvikud.
  • AnnaKohvik() - Tagastab info kohviku kohta vastavlt kohvikID-le.
  • addKohvik() - Lisab uue kohviku andmebaasi.
  • delKohvik() - Eemaldab kohviku vastavlt kohvikID-le.
  • upKohvik() - Uuendab kohviku infot vastaval kohvikID-le.
  • annaKohvikuToidud() - Tagasdab kohvikus pakutavad toidud vastavalt saadud kohvikID-le.
  • annaToidud() - Annab kõikides kohvikutes olemasolevad toidud.
  • annaToiduTyyp() - Tagastab toidu tüüpi nime vastavalt tyypID-le.
  • annaToiduTyybid() - Tagastab kõik olemasolead erinevad toitude tüübid.
  • annaLisandid() - Tagastab kõik olemasolevad lisandid.
  • addToit() - Lisab uue toidu andmebaasi vajab toitTyypID ja toitKohvikID.
  • upToit() - Värskendab toidu infot andmebaasis vastavalt toitID-le ja toitTyypID-le.
  • delToit() - Kustutab toidu vastavalt toitID-le.
  • annaKasutajad() - Tagasdab kõik andmebaasis olemas olevad kasutajad.
  • annaKasutaja() - Tagastab kasutaj kohta nime ja kas kasutaja on aktiivne vastavalt saadud KasutajaID-le.
  • upKasutaja() - Uuendab kasutaja infot KasutajaID-le.
  • delKasutaja() - Muudab kasuta mitteaktiivseks KasutajaID-le.
  • addKasutaja() - Lisab uue kasutaja kasutajate tabelisse vaja ette anda kasutaja yunnus ja salasõna.
  • AddKohvikuKasutaja() - Seob kasutaja kindla kohvikuga vastavalt kohvikID ja kasutajaID.
  • delKohvikuKasutaja() - Kustutab kohviku kasutaja kohvikuKasutaja tabelis vastavalt kasutajaID-le.
  • annaKohvikuKasutajad() - Tagastab kohviu kasutajaid ja kohvkuid kkohvikID järgi.
  • checkKasutaja() - Kontrollib kas kasutaja sisestatud nimi ja parool on õiged.
  • addtUpKommentaar() - Annab poolthääle komentaarile vastavalt kommentaarID-le.
  • addtDownKommentaar() - Annab vastu hääle komentaaridele vastavalt kommentaarID-le.
  • addKommentaar() - Lisab uue komentaari komentaaride tabelisse vaja ette anda MenyyKirje_ID.
  • annaKommentaarid() - Annab komentaarid vastavlt menyyKirjeID-le.
  • annaKohvikuLahtiOlek() - Tagastab info kohviku lahtioleku aegade kohta, vastavlt kohvikuID-le.
  • addLahtiOlek() - Lisab kohvikule uue lahtioleku aja. Kasutades selleks kohvikuID.
  • delLahti() - Kustudab lahtioleku aja, vastavalt lahtiID-le.
  • updLahti() - Muudab lohtioleku aega, vastavalt lahtiID-le.

Andmebaas:

Klient Rakendus

Kirjeldus

Otsustasime teha veebiklientrakenduse kasutades selleks .NET arendus keskonda. Rakendus koosneb kahes osast:

Esimene osa

  • Kasutaja saab vaadata andmebaasis olemasolevaid kohvikuid.
  • Kohviku kohta saab vaadata selle aadressi ja lahtioleku aegu.
  • Kohviku kohta saab ka vaadata ka menüüd.
  • Kohviku menüüs saab erinevaid toite komenteerida ja lisada poolt ja vastu hääli toidule.

Teine osa

Tesieks pooleks on kohviku omaniku poolne vaade mis on turvatud. Turvamiseks kasutasime .net-i sisse ehitatud logimis funktsiooni. Ka toimub pidev kasutaja õiguste kontroll kui tahetakse midagi kohvikuga seonduvat muuta.

  • Kohiku omanik saab muuta kohviku aadersi ja lahtioleku aegu.
  • Saab lisad muuta ja kustuda kohviku menyysi.
  • Saab lisada muuta ja kustudada uusi toite.
  • Saab Lisada toite menüüdese, neid muuta ja kustudada.

Pildid

Uue toidu lisamine

Omaniku pealeht

Menüü

Mobiil

Desktopklient

Koodinäited

Teenuse koos klientrakendusega, mobiilirakendusega ja desktopkliendiga saab kätte siit


Testimiseks tuleb teenuse aadress muuta rakenduses, sest teilvõivad olla portid erinevad mida kasutab. Lisaks tuleb ka rakenduse web.config failis pordid muuta. Teenus tuleb lisada nimega KohvikTeenus. Mobiilirakenduse puhul piisab uue refernici lisamisega soovitavalt nimeks panna KohvikTeenus.

Kuidas kasutada

Rakkendust on võimalik kasutada külalisena või siis kasutajane.

  • Külalisena saab vaadata kohvikuid, kohviku asukoht, tööaehu ja menüüsi
  • Kasutaja saab lisada uusi enda kohvikuid, muuta nede kohta infot, lisada uusi menüüsi, ja toite.

Klassid rakkenduses

  • Kasutaja -Annab teenuses kasutajale määratud kohvikud.
  • KasutajaKohvik -Annab kasutaj ühe kindal kohvkiu.
  • KasutajaMenyy -Annab kasutajle valitud kohiku menüü.
  • Kohvik - Annab külalisele kogu info kohvikust.
  • KohvikMuuda - Muudab kindla kohviku andmeid.
  • Kohvikud - Annab külalisele kõik olemasolevad kohvikud.
  • Kommenaarid - Kuvab olemas olevad komentaarid ja lisab uusi.
  • LahtiAjad -Annab kohviku omanikule võimaluse muuda kohviku lahtioleku aegu ja lisada uusi.
  • Login - Kohviku omaniku sisselogimiseks.
  • Logout - väljalogimiseks.
  • Menyy - Kuvab külastajale olemas oleva menüü sisu.
  • MenyyKirje - Laseb Kohviku omanikul lisada uusi toite menüüse ja olemasolevaid muuta
  • MenyyMuuda - Laseb muuta menüüd.
  • Toidud - Tagastab omanikule olemasolevad toidud.
  • ToidMuuda - Lubab omanikul muuta toite ja lisada neid juurde.
  • audentimine - Kohviku sessionide cookide ja kasuta audentimine.

Mobiili rakendus

Loodud kiireks kasutamiseks kui peaks olema vajadus valida sõõgikohta lõunaks või õhtuks. Rakendus võimaldab saada infot kohviku asukoha kohta ja saada teada ka pakutavat menüüd. Rakkenduse käivitamiseks on vajalik tõmmata endale WP7 devoleper tools saab siit. Lisaks tuleb muuta reference ära ja nimeks panna KohvikTeenus.

Desktop rakendus

Loodud kassapidajale päevajooksul menüüs olevate asjade hinna muutmiseks või menüüst eemaldamiseks.

Aruanne

Tegime valmis!

Projektiks valisime kohvikute infosüsteemi, kust saab kasutaja teada milliseid toite kohvikus pakutakse. Lisaks sai juurde tehtud ka võimalus, mis lubab erinevaid toite kohviku menüüs komenteerida ja rateida. Kohviku omanikud saavad muuta informatsiooni oma kohviku kohta, ehk saavad lisada uusi lahtioleku aegu, koostatda uusi menüüsi ja lisada uusi sööke menüüse. Projekti ehitamist alustasime XML, XML Schema ja XSLT. Pärast mida alustasime tööd andmebaasi loomiseks. Kui andmebaas oli valmis saanud alustasime tööd teenuse tegemiseks. Tehtud teenus võimaldab pärida infot andmebaasist, näiteks on olemas võimalus pärida infot ühe kindla kohviku kohta, või siis pärida millise kasutajaga on seaotud kindlad kohvikud. Pärast mida hakkasime ehitama veebiklienti.Veebiklient võimaldab tavalisel kasutajal, ehk siis mitteregisteeritud kasutajal saada infot kohviku kohta, näiteks kohviku aadress, lahtioleku ajad, pakutavad menüüd ja ka komenterida pakutavaid toite ja hinnata neid. Ka sisaldab veebiklient kohviku omaniku poolt, kus saab kohviku omanik lisada uusi menüüsi kohvikutele, mis on temaga seotud. Muuta kohvikuga seotud infot, ehk muuta lahtioleku aegu aadresi jne. Ka saab muuta menüüsi lisada uusi, lisada uusi toite, muuta menüüs olevate toidude hindu jne.Kuna selgus, et ühest jääb ikkagi vähest otsustasime teha ka eraldi windowsi kliendi ja WP7 kliendi. Windowsi klient on mõeldud kassapidaja igapäevaseks tööks, mis võimaldab muuta hindu ja eemaldada juba läbimüüdud toite. WP7 rakendus on mõeldud kiireks info leidmiseks kohviku kohta, mis võimaldab siis saada teada kohviku asukohta, pakutavaid menüüsi ja toite.

Mida juurde õppisime

  • XML, XML Schema ja XSLT
  • Kuidas luua teenust ja siduda seda andmebaasiga.
  • Kuidas luua teenusele klienti.
  • Kuidas luua WP7 klienti.

Millised probleemid tekkisid töökäigus!

  • Teenuse ehitamine oli algul suhteliselt aeglane kuna kellegil polnud algul erilisi kogemusi kuidas sellist asja üldse teha tuleks

hilisemalt küll läks töö kiiremini kuna enamus probleemid olid juba lahendatud töö algus etapil.

  • Veebiklienti tegemise ajal selgus, et teenust on vaja täiendada kuna osa vajaminevaid meetodeid ei suudedud ette näha teenuseehitamise käigus.
  • Mobiili rakenduse tegemise algfaas sarnases oma rakuselt teenusele selle poolest, et puudus kogemus kuida seda korralikult ehitada, mille tõttu kanatas ka disain tugevalt.

Mida paremini teha oleks saanud!

  • Oleks pidanud arvestama rohkema ajakuluga kuna arvestasime et kulub vähem aega kui tegelikult läks, mis oleks andnud võimaluse rohkem siluda.

Meeskoona Punktid

  • Madis Sarv - 25
  • Siim Sarv - 27
  • Jaanus Vallmann - 8