Spendings
Meeskond ja rollid
- Tauri Busch
Veebi ja klientrakendus
Kävitata tuleb:
1) WCF.Host
2) WindowsUniversalClient
Hetkel ei toimi üksuste uuendamine, tekib mingi serveri poolne viga..
NB! Kasutan andmebaasi connection stringina (localdb)\v11.0 Kui seda testitavas arvutis ei ole, siis tuleks see WCF.Host config failis ära muuta.
Idee ja analüüs
Projekti idee
Luua teenus, mille kaudu on võimalik sisestada igapäevaseid kulutusi ja sissetulekuid, sisestada oma kuu eelarve ja üritada sellest kinni pidada. Kulutusi ja tulusid on võimalik lisada kategooriate kaupa, mida saab kasutaja ise määrata. Kasutajal on võimalus jälgida ja hallata läbi klient rakenduse oma kulutuste kohti, võimalus määrata oma kulutused kategooriatesse. Lisaks saab klient rakenduse läbi määrata ja jälgida oma jooksva kuu eelarvet.
Rakenduse sisu
Teenuses on olemas järgmised võimalused (Must have):
Võimalus luua kasutaja
Kasutaja saab sisestada, muuta, kustutada kulutusi ja tulusid
Kasutaja saab määrata kulusid ja tulusid kategooriatesse
Teenuses võiksid olla lisavõimalused (Nice to have):
Võimalus määrata püsivaid sissetulekuid (näiteks palk)
Määrata päeva/kuu/aasta eelarvet
Jagada teiste kasutajatega oma eelarvet (ühine pere eelarve)
Klient rakenduse (Must have):
Saab näha olemasolevaid sissekandeid kulutuste ja tulude kohta
Saab määrata oma oma kuu eelarve ja jälgida seda
Klient rakenduse (Nice to have):
Võimalus teha (telefoniga) pilt arvest ja see läbi scannida sisse
XML Fail
<?xml version="1.0" encoding="utf-8" ?>
<Spendings>
<MoneyInOut>
<Type>Expense</Type>
<Type>Income</Type>
</MoneyInOut>
<Categories>
<Category name="Minu kulutused" limit="500" current="482">
<Description><![CDATA[Minuga soetud kulutused on siin]]></Description>
<ResetDay>7</ResetDay>
<SubCategories>
<SubCategory name="Remont" id="D3D1C80D-C722-E611-B1EF-083E8EF0777A">
<Description><![CDATA[Remondikulud]]></Description>
</SubCategory>
<SubCategory name="Kütus" id="D3D1C80D-C722-E611-B1EF-083E8EF0777B">
<Description><![CDATA[]]></Description>
</SubCategory>
</SubCategories>
<Spendings>
<Spending name="Ratta vahetus" id="D3D1C80D-C722-E611-B1EF-083E8EF0776E" subCatId="D3D1C80D-C722-E611-B1EF-083E8EF0777A" time="25.05.2016 14:00" value="26">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[Ratas sõitis minema]]></Descritpion>
</Spending>
<Spending name="Põhja keevitus" id="C3D1C80D-C722-E611-B1EF-083E8EF0776E" subCatId="D3D1C80D-C722-E611-B1EF-083E8EF0777A" time="24.05.2016 14:00" value="200">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[Põhi sõitis minema]]></Descritpion>
</Spending>
<Spending name="Ukse vahetus" id="B3D1C80D-C722-E611-B1EF-083E8EF0776E" subCatId="D3D1C80D-C722-E611-B1EF-083E8EF0777A" time="20.05.2016 14:00" value="236">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[Uks lendas minema]]></Descritpion>
</Spending>
<Spending name="Diisel" id="A3D1C80D-C722-E611-B1EF-083E8EF0777B" subCatId="D3D1C80D-C722-E611-B1EF-083E8EF0777B" time="21.05.2016 14:00" value="20">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[20L]]></Descritpion>
</Spending>
</Spendings>
</Category>
<Category name="Kool" limit="200" current="116.5">
<Description><![CDATA[Kooliga seotud kulud]]></Description>
<ResetDay>7</ResetDay>
<SubCategories>
<SubCategory name="Kapirent" id="D3D1C80D-C722-E611-B1EF-183E8EF0777A">
<Description><![CDATA[]]></Description>
</SubCategory>
<SubCategory name="Võlgnevus" id="D3D1C80D-C722-E611-B1EF-183E8EF0777B">
<Description><![CDATA[]]></Description>
</SubCategory>
</SubCategories>
<Spendings>
<Spending name="Kapirent" id="D3D1C80D-C722-E611-B1EF-083E8EF0776E" subCatId="D3D1C80D-C722-E611-B1EF-183E8EF0777A" time="7.03.2016 14:00" value="5.5">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[]]></Descritpion>
</Spending>
<Spending name="Kapirent" id="C3D1C80D-C722-E611-B1EF-083E8EF0776E" subCatId="D3D1C80D-C722-E611-B1EF-183E8EF0777A" time="7.04.2016 14:00" value="5.5">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[]]></Descritpion>
</Spending>
<Spending name="Kapirent" id="B3D1C80D-C722-E611-B1EF-083E8EF0776E" subCatId="D3D1C80D-C722-E611-B1EF-183E8EF0777A" time="7.05.2016 14:00" value="5.5">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[]]></Descritpion>
</Spending>
<Spending name="Võlgnevus" id="A3D1C80D-C722-E611-B1EF-083E8EF0777B" subCatId="D3D1C80D-C722-E611-B1EF-183E8EF0777B" time="21.02.2016 14:00" value="50">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[]]></Descritpion>
</Spending>
<Spending name="Võlgnevus" id="A3D1C80D-C722-E611-B1EF-083E8EF0777B" subCatId="D3D1C80D-C722-E611-B1EF-183E8EF0777B" time="21.03.2016 14:00" value="50">
<MoneyInOut>Expense</MoneyInOut>
<Descritpion><![CDATA[]]></Descritpion>
</Spending>
</Spendings>
</Category>
</Categories>
</Spendings>
XML Skeemifail
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Spendings">
<xs:complexType>
<xs:sequence>
<xs:element name="MoneyInOut">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Type" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Categories">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Category" >
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="xs:string" />
<xs:element name="ResetDay" type="xs:unsignedInt" />
<xs:element name="SubCategories">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="SubCategory">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="xs:string" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="id" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Spendings">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Spending">
<xs:complexType>
<xs:sequence>
<xs:element name="MoneyInOut" type="xs:string" />
<xs:element name="Descritpion" type="xs:string" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="subCatId" type="xs:string" use="required" />
<xs:attribute name="time" type="xs:dateTime" use="required" />
<xs:attribute name="value" type="xs:decimal" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="limit" type="xs:unsignedShort" />
<xs:attribute name="current" type="xs:decimal" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSLT
Pole olemas :(
Retsensioon meeskonna BurgerAce veebiteenusele ja klientrakendusele
BurgerAce on kasutanud ära REST API't ja teinud omale klient rakenduse veebi põhjal. Kogu projekt on ilusasti ära jaotatud, erinevad funktsionaalsused on lihtsasti leitav, äriloogika ja teenus asuvad eraldi teekides. Klient rakendus on iseseisev ja kasutab ära API't et suhelda teenusega. See rakendus tundub olevat burgerite ja jookide tellimiseks, kus kasutaja saab omale kokku panna mingi tellimuse ja siis selle otse ja mugavalt tellida. Küll ei ole see teenus sellisel tasemel hetkel kasutatav.
Kahjuks puudub ka keskkonna automaatne seadistamine, mis aitaks kaasa projekti testimisele ja arusaamaks, mis on tehtud ja kuidas asi täpsemalt kasutaja jaoks toimima peaks. Kuna ka ei ole otseseid õpetusi selle kohta, kuidas antud projekt toimima peaks, ei hakka sellega pikemalt vaevama ja lähtun sellest, mis on koodi tasemel valmis kirjutatud.
Head:
Projektis kasutatakse ilusasti ära kihtide loogikat, äriloogika, mudelid ja andmebaasi ühendused on eraldi API teenusest. Samuti on nähtavalt ära kasutatud UOW'd. API päringute tegemisel kasutatakse ära service'id.
Mitte nii head:
Antud lahenduse puhul ei kasutata ära andmebaasi initsialiseerimisel testandmete loomist, vaid projekti on kaasa lisatud mingisugune .mdf fail, mida ma ei oska kusagile lisada (ei ole ka õpetust, kuidas sellega ümber käia). Config failist vaadates justkui võetakse see fail külge, kuid neid andmeid ei kuvata kasutatavas andmebaasis.
Projektis ei paista olevat sisselogitud kasutajatele mõeldud kontinenti, ehk kogu teenust paistab olevat anonüümselt kasutatav. Registreerimine ei õnnestu, seega ei saa ka seda kontrollida, kas sisselogitult paistab midagi muud, kuid koodist järeldades ei ole seal midagi taolist näha.