Meeskond Raavo V2™: Difference between revisions
Created page with "==Liikmed== *Peeter Fridolin *Kristo Leesmann *Rando Rommot ==Idee== TEXT ==Analüüs== ===Must have=== * TEXT ===Nice to have=== * TEXT ==TFS== TEXT ==Blogi== '''15.09...." |
|||
(9 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
==Idee== | ==Idee== | ||
'''Projekti nimi: Garagefy''' | |||
Projekti eesmärk on luua autoremonditöökodadele broneerimissüsteemi veebiteenus, mida oleks hiljem lihtne klientrakenduses ära kasutada. Veebiteenus peab olema universaalne, et see sobiks erinevatele autoremonditöökodadele kasutamiseks. | |||
==Analüüs== | ==Analüüs== | ||
===Must have=== | ===Must have=== | ||
* | '''Klient''' | ||
* Süsteemi registreerimine ja sisse logimine | |||
* Remonditeenuse broneerimine | |||
* Broneeringute ülevaade | |||
* Enda kasutaja andmete muutmine | |||
'''Töötaja''' | |||
* Sisse logimine | |||
* Kõikide broneeringute ülevaade | |||
'''Administraator''' | |||
* Sisse logimine | |||
* Kasutajate haldamine | |||
* Broneeringute haldamine | |||
===Nice to have=== | ===Nice to have=== | ||
* | * Ühe broneeringuga saab valida mitu remonditeenust korraga | ||
* Broneeringu kinnituse saatmine töötaja meilile | |||
* Broneeringu meeldetuletus kliendi meilile | |||
* Broneeringute põhjal töötajate töögraafiku koostamine | |||
===Raskused=== | |||
* Puuduv eelnev kogemus veebiteenuste loomisel | |||
* Effektiivne ajaplaneerimine ja tööjaotus | |||
* Meeskonnaliikmete vähene aeg, muude kohustuste kõrval | |||
==TFS== | ==TFS== | ||
Link TFS lehele: [https://mraavo.visualstudio.com/Garagefy TFS] | |||
==Projekt== | |||
Link projektile: [http://enos.itcollege.ee/~pfridoli/V2/ Projekt] | |||
NB! VAATA JUHISEID KUIDAS SEDA KORRALIKULT KÄIVITADA! PROGRAMMI SEES ON README FILE! | |||
==XML Projekt== | |||
===XML file=== | |||
<source lang="xml"> | |||
<?xml version="1.0" encoding="utf-8" ?> | |||
<Bookings> | |||
<Booking id="1" confirmed="false"> | |||
<BookinggDate>2018-04-28</BookinggDate> | |||
<BookingTime>12:00:00</BookingTime> | |||
<ApplicationUser id="1" active="true"> | |||
<UserName><![CDATA[Maret Püüa]]></UserName> | |||
<UserEmail><![CDATA[maretpuua@gmail.com]]></UserEmail> | |||
<Phone><![CDATA[+3724375873]]></Phone> | |||
<Car id="1"> | |||
<Make><![CDATA[BMW]]></Make> | |||
<Model><![CDATA[E36]]></Model> | |||
<ReleaseYear>2001-02-15</ReleaseYear> | |||
<CarType id="1"> | |||
<TypeName><![CDATA[Kupee]]></TypeName> | |||
</CarType> | |||
</Car> | |||
</ApplicationUser> | |||
<Garage id="1"> | |||
<GarageName><![CDATA[Mihkel Repairs]]></GarageName> | |||
<GarageAddress><![CDATA[Lehola 5]]></GarageAddress> | |||
<GaragePhone><![CDATA[+3729002007]]></GaragePhone> | |||
<Service id="1"> | |||
<ServiceName><![CDATA[Õlivahetus]]></ServiceName> | |||
<ServicePrice currency="€">30</ServicePrice> | |||
<Unit><![CDATA[Tund]]></Unit> | |||
<ExtraInfo><![CDATA[Lehola parim õlivahetus]]></ExtraInfo> | |||
<ServiceType id="1"> | |||
<ServiceTypeName><![CDATA[Hooldustööd]]></ServiceTypeName> | |||
</ServiceType> | |||
</Service> | |||
</Garage> | |||
</Booking> | |||
<Booking id="2" confirmed="true"> | |||
<BookinggDate>2018-06-14</BookinggDate> | |||
<BookingTime>15:15:00</BookingTime> | |||
<ApplicationUser id="4" active="true"> | |||
<UserName><![CDATA[Ahto Leemet]]></UserName> | |||
<UserEmail><![CDATA[Leemet@gmail.com]]></UserEmail> | |||
<Phone><![CDATA[+3728463846]]></Phone> | |||
<Car id="7"> | |||
<Make><![CDATA[Opel]]></Make> | |||
<Model><![CDATA[Omega]]></Model> | |||
<ReleaseYear>1998-05-11</ReleaseYear> | |||
<CarType id="3"> | |||
<TypeName><![CDATA[Universaal]]></TypeName> | |||
</CarType> | |||
</Car> | |||
</ApplicationUser> | |||
<Garage id="3"> | |||
<GarageName><![CDATA[Garagefy Pärnu]]></GarageName> | |||
<GarageAddress><![CDATA[Luha 5]]></GarageAddress> | |||
<GaragePhone><![CDATA[+3729002009]]></GaragePhone> | |||
<Service id="4"> | |||
<ServiceName><![CDATA[Rehvivahetus]]></ServiceName> | |||
<ServicePrice currency="€">90</ServicePrice> | |||
<Unit><![CDATA[Üks Rehv]]></Unit> | |||
<ExtraInfo><![CDATA[Õnneliku lõpuga rehvivahetus]]></ExtraInfo> | |||
<ServiceType id="2"> | |||
<ServiceTypeName><![CDATA[Rehvitööd]]></ServiceTypeName> | |||
</ServiceType> | |||
</Service> | |||
</Garage> | |||
</Booking> | |||
<Booking id="9" confirmed="false"> | |||
<BookinggDate>2018-08-12</BookinggDate> | |||
<BookingTime>10:00:00</BookingTime> | |||
<ApplicationUser id="3" active="true"> | |||
<UserName><![CDATA[Rondo Ronnot]]></UserName> | |||
<UserEmail><![CDATA[Ronnot@gmail.com]]></UserEmail> | |||
<Phone><![CDATA[+372523933]]></Phone> | |||
<Car id="3"> | |||
<Make><![CDATA[Toyota]]></Make> | |||
<Model><![CDATA[Camry]]></Model> | |||
<ReleaseYear>1990-02-15</ReleaseYear> | |||
<CarType id="5"> | |||
<TypeName><![CDATA[Coupe]]></TypeName> | |||
</CarType> | |||
</Car> | |||
</ApplicationUser> | |||
<Garage id="4"> | |||
<GarageName><![CDATA[Kiirete poiste parandus]]></GarageName> | |||
<GarageAddress><![CDATA[Lehola 12]]></GarageAddress> | |||
<GaragePhone><![CDATA[+3726923123]]></GaragePhone> | |||
<Service id="3"> | |||
<ServiceName><![CDATA[Keemiline salongipuhastus]]></ServiceName> | |||
<ServicePrice currency="€">100</ServicePrice> | |||
<Unit><![CDATA[Tund]]></Unit> | |||
<ExtraInfo><![CDATA[Istmed läigivad nagu alles ostetud]]></ExtraInfo> | |||
<ServiceType id="3"> | |||
<ServiceTypeName><![CDATA[Salongitööd]]></ServiceTypeName> | |||
</ServiceType> | |||
</Service> | |||
</Garage> | |||
</Booking> | |||
</Bookings> | |||
</source> | |||
===XML Schema=== | |||
<source lang="xml"> | |||
<?xml version="1.0" encoding="utf-8" ?> | |||
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | |||
<xs:element name="Bookings"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element name="Booking" maxOccurs="unbounded" minOccurs="0"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element type="xs:date" name="BookinggDate"/> | |||
<xs:element type="xs:time" name="BookingTime"/> | |||
<xs:element name="ApplicationUser"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element type="xs:string" name="UserName"/> | |||
<xs:element type="xs:string" name="UserEmail"/> | |||
<xs:element type="xs:long" name="Phone"/> | |||
<xs:element name="Car"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element type="xs:string" name="Make"/> | |||
<xs:element type="xs:string" name="Model"/> | |||
<xs:element type="xs:date" name="ReleaseYear"/> | |||
<xs:element name="CarType"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element type="xs:string" name="TypeName"/> | |||
</xs:sequence> | |||
<xs:attribute type="xs:integer" name="id" use="required"/> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:sequence> | |||
<xs:attribute type="xs:integer" name="id" use="required"/> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:sequence> | |||
<xs:attribute type="xs:integer" name="id" use="required"/> | |||
<xs:attribute type="xs:boolean" name="active" use="required"/> | |||
</xs:complexType> | |||
</xs:element> | |||
<xs:element name="Garage"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element type="xs:string" name="GarageName"/> | |||
<xs:element type="xs:string" name="GarageAddress"/> | |||
<xs:element type="xs:long" name="GaragePhone"/> | |||
<xs:element name="Service"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element type="xs:string" name="ServiceName"/> | |||
<xs:element name="ServicePrice"> | |||
<xs:complexType> | |||
<xs:simpleContent> | |||
<xs:extension base="xs:decimal"> | |||
<xs:attribute type="xs:string" name="currency" use="required"/> | |||
</xs:extension> | |||
</xs:simpleContent> | |||
</xs:complexType> | |||
</xs:element> | |||
<xs:element type="xs:string" name="Unit"/> | |||
<xs:element type="xs:string" name="ExtraInfo"/> | |||
<xs:element name="ServiceType"> | |||
<xs:complexType> | |||
<xs:sequence> | |||
<xs:element type="xs:string" name="ServiceTypeName"/> | |||
</xs:sequence> | |||
<xs:attribute type="xs:integer" name="id" use="required"/> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:sequence> | |||
<xs:attribute type="xs:integer" name="id" use="required"/> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:sequence> | |||
<xs:attribute type="xs:integer" name="id" use="required"/> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:sequence> | |||
<xs:attribute type="xs:integer" name="id" use="required"/> | |||
<xs:attribute type="xs:boolean" name="confirmed" use="required"/> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:sequence> | |||
</xs:complexType> | |||
</xs:element> | |||
</xs:schema> | |||
</source> | |||
===XSLT HTML transformation=== | |||
<source lang="xml"> | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |||
<xsl:output method="html" indent="yes"/> | |||
<xsl:template match="/"> | |||
<html> | |||
<head> | |||
<title>Broneeringud</title> | |||
</head> | |||
<body> | |||
<h2>Broneeringud</h2> | |||
<ol> | |||
<xsl:variable name="confirmed">true</xsl:variable> | |||
<xsl:for-each select="Bookings/Booking"> | |||
<li> | |||
<b>Status: </b> | |||
<xsl:choose> | |||
<xsl:when test="@confirmed = $confirmed"> | |||
<b style="color:green;">CONFIRMED</b> | |||
</xsl:when> | |||
<xsl:otherwise> | |||
<b style="color:red;">PENDING</b> | |||
</xsl:otherwise> | |||
</xsl:choose> | |||
<br/> | |||
<b>Klient: </b> | |||
<ul> | |||
<b>Nimi: </b> | |||
<xsl:value-of select="ApplicationUser/UserName"/> | |||
<br/> | |||
<b>Mail: </b> | |||
<xsl:value-of select="ApplicationUser/UserEmail"/> | |||
</ul> | |||
<b>Auto: </b> | |||
<br/> | |||
<ul> | |||
<xsl:for-each select="ApplicationUser/Car"> | |||
<xsl:sort select="@id" /> | |||
<b>Tüüp: </b> | |||
<xsl:value-of select="CarType/TypeName"/> | |||
<br/> | |||
<b>Mark: </b> | |||
<xsl:value-of select="Make" /> | |||
<br/> | |||
<b>Mudel: </b> | |||
<xsl:value-of select="Model"/> | |||
<br/> | |||
<b>Väljalastud: </b> | |||
<xsl:value-of select="ReleaseYear"/> | |||
<br/> | |||
</xsl:for-each> | |||
</ul> | |||
<b>Broneeringu aeg:</b> | |||
<br/> | |||
<ul> | |||
<b>Aeg: </b> | |||
<xsl:value-of select="BookinggDate" /> - <xsl:value-of select="BookingTime"/><br/> | |||
</ul> | |||
<b>Töökoda:</b> | |||
<br/> | |||
<ul> | |||
<xsl:for-each select="Garage"> | |||
<xsl:sort select="@id" /> | |||
<b>Töökoja nimi: </b> | |||
<xsl:value-of select="GarageName"/> | |||
<br/> | |||
<b>Aadress: </b> | |||
<xsl:value-of select="GarageAddress"/> | |||
<br/> | |||
<b>Telefon: </b> | |||
<xsl:value-of select="GaragePhone"/> | |||
<br/> | |||
</xsl:for-each> | |||
</ul> | |||
<b>Teenus:</b> | |||
<br/> | |||
<ul> | |||
<xsl:for-each select="Garage/Service"> | |||
<xsl:sort select="@id"/> | |||
<b>Teenuse nimi: </b> | |||
<xsl:value-of select="ServiceName"/><br/> | |||
<b>Teenuse tüüp: </b> | |||
<xsl:value-of select="ServiceType/ServiceTypeName"/><br/> | |||
<b>Teenuse hind: </b> | |||
<xsl:value-of select="ServicePrice"/>€ - <xsl:value-of select="Unit"/><br/> | |||
<b>Lisainfo: </b> | |||
<xsl:value-of select="ExtraInfo"/><br/> | |||
</xsl:for-each> | |||
</ul> | |||
</li> | |||
<br/> | |||
</xsl:for-each> | |||
</ol> | |||
</body> | |||
</html> | |||
</xsl:template> | |||
</xsl:stylesheet> | |||
</source> | |||
===XSLT XML transformation=== | |||
<source lang="xml"> | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> | |||
<xsl:output method="xml" indent="yes"/> | |||
<xsl:template match="/Bookings"> | |||
<Bookings> | |||
<xsl:variable name="confirmed">true</xsl:variable> | |||
<xsl:for-each select="Booking"> | |||
<Boooking> | |||
<Status> | |||
<xsl:choose> | |||
<xsl:when test="@confirmed = $confirmed"> | |||
Confirmed | |||
</xsl:when> | |||
<xsl:otherwise> | |||
Pending | |||
</xsl:otherwise> | |||
</xsl:choose> | |||
</Status> | |||
<Client> | |||
<Name> | |||
<xsl:value-of select="ApplicationUser/UserName"/> | |||
</Name> | |||
<Email> | |||
<xsl:value-of select="ApplicationUser/UserEmail"/> | |||
</Email> | |||
</Client> | |||
<Car> | |||
<xsl:for-each select="ApplicationUser/Car"> | |||
<Type> | |||
<xsl:value-of select="CarType/TypeName"/> | |||
</Type> | |||
<Make> | |||
<xsl:value-of select="Make"/> | |||
</Make> | |||
<Model> | |||
<xsl:value-of select="Model"/> | |||
</Model> | |||
<ReleaseDate> | |||
<xsl:value-of select="ReleaseYear"/> | |||
</ReleaseDate> | |||
</xsl:for-each> | |||
</Car> | |||
<BookingDate> | |||
<Date> | |||
<xsl:value-of select="BookinggDate"/> | |||
</Date> | |||
<Time> | |||
<xsl:value-of select="BookingTime"/> | |||
</Time> | |||
</BookingDate> | |||
<Garage> | |||
<xsl:for-each select="Garage"> | |||
<Name> | |||
<xsl:value-of select="GarageName"/> | |||
</Name> | |||
<Address> | |||
<xsl:value-of select="GarageAddress" /> | |||
</Address> | |||
<Phone> | |||
<xsl:value-of select="GaragePhone"/> | |||
</Phone> | |||
</xsl:for-each> | |||
</Garage> | |||
<Service> | |||
<xsl:for-each select="Garage/Service"> | |||
<Name> | |||
<xsl:value-of select="ServiceName"/> | |||
</Name> | |||
<Type> | |||
<xsl:value-of select="ServiceType/ServiceTypeName"/> | |||
</Type> | |||
<Price> | |||
<xsl:value-of select="ServicePrice"/> | |||
</Price> | |||
<Unit> | |||
<xsl:value-of select="Unit"/> | |||
</Unit> | |||
<ExtraInfo> | |||
<xsl:value-of select="ExtraInfo"/> | |||
</ExtraInfo> | |||
</xsl:for-each> | |||
</Service> | |||
</Boooking> | |||
</xsl:for-each> | |||
</Bookings> | |||
</xsl:template> | |||
</xsl:stylesheet> | |||
</source> | |||
==Retsentsioonid== | |||
Retsenseerisime projekti puhul meeskonda [https://wiki.itcollege.ee/index.php/Maagikud Maagikud] | |||
'''Veebiteenus''' | |||
Meeskonna Maagikud idee oli luua lennujaama ja lennuliini integreeritud süsteem. Klient saaks broneerida mingi lennuaja vastavalt ette antud andmetele (lähtekoht ja sihtkoht) ja admin saab lisada igasuguseid lennujaame või lennuliine ning nendega seonduvaid andmeid. | |||
Kui me proovimise selle programmi esimest korda tööle panna, tekkisid probleeme. Avastasime, et programm ei teinud automaatselt andmebaasi ja pidime ise käsitsi seda tegema. Oleks võinud olla mingi README fail olla, kuidas alustada seda programmi korralikult. | |||
Domeenimudelis on piisav arv olemeid, et täita kodutööks ettenähtud tingimusi. Kõik klassid, mis on domeenis, on kasutatud korralikult ja pole näha ühtegi üleliigset asja. Oleks võinud kasutada atribuute aga see eriti vahet ei tee. | |||
Projekt on hästi struktureeeritud ja arhitektuuriliselt on ka kasutatud korralikult. Kood on jaotatud eraldi BL, DAL, Domain ja airport_angular vahel. Kirjutusstiil oli kõik korralik ja kõik kaustad olid ka jaotatud õigesti. | |||
DAL on jagatud neljaks erinevaks osaks ja need on üsna põhjalikult tehtud. On tugevalt järgitud õpetaja Käveri ülesehitust ning kiirema ülevaatuse põhjal võib öelda, et on korrektne. DAL kasutab repositooriume ja Unit Of Worke. | |||
Kui me hakkasime testime neid API’d, meil tekkisid mõned probleemi. Kõik API’d ei olnud kättesaadavad. Avastasime, et kindlad tingimused olid küljes. Mõned API’d oli kättesaadavad siis, kui olid sisseloginud või pidid olema admin. Saime ikkagi kõike API’d kätte, aga see tegi natukene API testimine meil natukene keeruliseks ka. Hea, et lisati töö sisse ka Swaggeri, mis tegi testimise lihtsamaks. | |||
Antud töö on ilusti kirjutatud ning suurimad vigu polnud üldse näha. Kõik nõutud funktsioonid on olemas ja töötavad korralikult ka. Projekti struktuur on ilusti püsti pandud ning ükski klass ei ole suvalises kaustas. Controllerid on küll korralikult kommenteeritud, aga kõik muu failid oleksid võinud olla ka kommenteeritud. Mõned kohad jäid segaseks eriti, kui tekiks olukord kus keegi teine peaks hakkama koodi muutma või juurde lisama midagi. README fail oleks võinud ka olla, et kirjeldada kuidas programmi käsitleda. Täpsemalt milliseid samme jälgida, et programmi saaks tööle panna. Kokkuvõtvalt jäi meile tööst üsna hea mulje, vaeva on nähtud. | |||
'''Klientrakendus''' | |||
'''XML''' | |||
Vaadates XML-i ülesehitust siis võib öelda, et on valitud teatud osa programmist mitte tervik. Täpsemalt on valitud people_in_seats, kuigi oleks võinud valida teenuse tervikuna, et saada parem ülevaade. XML fail on loogiliselt väljamõeldud ja ülesehitatud. XML failis on olemas 4 loogilist dimensiooni ja on ka kasutadud korralikult. Soovitusena oleks võinud kasutada CDATA-t, kus parser ignoreerib elementide sees olevaid karaktereid. Väga hea, et lisati kommentaare ka täpsustamaks, mis iga rida tähendab. | |||
XML schema fail on korralikult koostatud ja töötab XML failiga ka koos. See XSLT fail, mis teeb XML lehe HTML’iks, on ka ilusti koostatud ja näitab ka kõiki tulemusi arusaadavalt. Oleks võinud rohkem huvitavaid asju teha, aga tulemus on ikka saavutatud. See teine XSLT fail transformeerib ka korralikult XML lehte ja ühtegi probleeme probleeme pole tekkinud. | |||
Kokkuvõttena saab öelda, et kõik XML failid funktsioneerivad õigesti, aga lihtsalt see XML fail jäi natukene puudulikuks. | |||
==Blogi== | ==Blogi== | ||
''' | '''30.03.2018''' Meeskonna moodustamine ja analüüsi koostamine<br> | ||
'''20.04.2018 - 27.05.2018''' Projekti koostamine<br> | |||
'''31.05.2018''' XML koostamine<br> |
Latest revision as of 17:26, 4 June 2018
Liikmed
- Peeter Fridolin
- Kristo Leesmann
- Rando Rommot
Idee
Projekti nimi: Garagefy
Projekti eesmärk on luua autoremonditöökodadele broneerimissüsteemi veebiteenus, mida oleks hiljem lihtne klientrakenduses ära kasutada. Veebiteenus peab olema universaalne, et see sobiks erinevatele autoremonditöökodadele kasutamiseks.
Analüüs
Must have
Klient
- Süsteemi registreerimine ja sisse logimine
- Remonditeenuse broneerimine
- Broneeringute ülevaade
- Enda kasutaja andmete muutmine
Töötaja
- Sisse logimine
- Kõikide broneeringute ülevaade
Administraator
- Sisse logimine
- Kasutajate haldamine
- Broneeringute haldamine
Nice to have
- Ühe broneeringuga saab valida mitu remonditeenust korraga
- Broneeringu kinnituse saatmine töötaja meilile
- Broneeringu meeldetuletus kliendi meilile
- Broneeringute põhjal töötajate töögraafiku koostamine
Raskused
- Puuduv eelnev kogemus veebiteenuste loomisel
- Effektiivne ajaplaneerimine ja tööjaotus
- Meeskonnaliikmete vähene aeg, muude kohustuste kõrval
TFS
Link TFS lehele: TFS
Projekt
Link projektile: Projekt
NB! VAATA JUHISEID KUIDAS SEDA KORRALIKULT KÄIVITADA! PROGRAMMI SEES ON README FILE!
XML Projekt
XML file
<?xml version="1.0" encoding="utf-8" ?>
<Bookings>
<Booking id="1" confirmed="false">
<BookinggDate>2018-04-28</BookinggDate>
<BookingTime>12:00:00</BookingTime>
<ApplicationUser id="1" active="true">
<UserName><![CDATA[Maret Püüa]]></UserName>
<UserEmail><![CDATA[maretpuua@gmail.com]]></UserEmail>
<Phone><![CDATA[+3724375873]]></Phone>
<Car id="1">
<Make><![CDATA[BMW]]></Make>
<Model><![CDATA[E36]]></Model>
<ReleaseYear>2001-02-15</ReleaseYear>
<CarType id="1">
<TypeName><![CDATA[Kupee]]></TypeName>
</CarType>
</Car>
</ApplicationUser>
<Garage id="1">
<GarageName><![CDATA[Mihkel Repairs]]></GarageName>
<GarageAddress><![CDATA[Lehola 5]]></GarageAddress>
<GaragePhone><![CDATA[+3729002007]]></GaragePhone>
<Service id="1">
<ServiceName><![CDATA[Õlivahetus]]></ServiceName>
<ServicePrice currency="€">30</ServicePrice>
<Unit><![CDATA[Tund]]></Unit>
<ExtraInfo><![CDATA[Lehola parim õlivahetus]]></ExtraInfo>
<ServiceType id="1">
<ServiceTypeName><![CDATA[Hooldustööd]]></ServiceTypeName>
</ServiceType>
</Service>
</Garage>
</Booking>
<Booking id="2" confirmed="true">
<BookinggDate>2018-06-14</BookinggDate>
<BookingTime>15:15:00</BookingTime>
<ApplicationUser id="4" active="true">
<UserName><![CDATA[Ahto Leemet]]></UserName>
<UserEmail><![CDATA[Leemet@gmail.com]]></UserEmail>
<Phone><![CDATA[+3728463846]]></Phone>
<Car id="7">
<Make><![CDATA[Opel]]></Make>
<Model><![CDATA[Omega]]></Model>
<ReleaseYear>1998-05-11</ReleaseYear>
<CarType id="3">
<TypeName><![CDATA[Universaal]]></TypeName>
</CarType>
</Car>
</ApplicationUser>
<Garage id="3">
<GarageName><![CDATA[Garagefy Pärnu]]></GarageName>
<GarageAddress><![CDATA[Luha 5]]></GarageAddress>
<GaragePhone><![CDATA[+3729002009]]></GaragePhone>
<Service id="4">
<ServiceName><![CDATA[Rehvivahetus]]></ServiceName>
<ServicePrice currency="€">90</ServicePrice>
<Unit><![CDATA[Üks Rehv]]></Unit>
<ExtraInfo><![CDATA[Õnneliku lõpuga rehvivahetus]]></ExtraInfo>
<ServiceType id="2">
<ServiceTypeName><![CDATA[Rehvitööd]]></ServiceTypeName>
</ServiceType>
</Service>
</Garage>
</Booking>
<Booking id="9" confirmed="false">
<BookinggDate>2018-08-12</BookinggDate>
<BookingTime>10:00:00</BookingTime>
<ApplicationUser id="3" active="true">
<UserName><![CDATA[Rondo Ronnot]]></UserName>
<UserEmail><![CDATA[Ronnot@gmail.com]]></UserEmail>
<Phone><![CDATA[+372523933]]></Phone>
<Car id="3">
<Make><![CDATA[Toyota]]></Make>
<Model><![CDATA[Camry]]></Model>
<ReleaseYear>1990-02-15</ReleaseYear>
<CarType id="5">
<TypeName><![CDATA[Coupe]]></TypeName>
</CarType>
</Car>
</ApplicationUser>
<Garage id="4">
<GarageName><![CDATA[Kiirete poiste parandus]]></GarageName>
<GarageAddress><![CDATA[Lehola 12]]></GarageAddress>
<GaragePhone><![CDATA[+3726923123]]></GaragePhone>
<Service id="3">
<ServiceName><![CDATA[Keemiline salongipuhastus]]></ServiceName>
<ServicePrice currency="€">100</ServicePrice>
<Unit><![CDATA[Tund]]></Unit>
<ExtraInfo><![CDATA[Istmed läigivad nagu alles ostetud]]></ExtraInfo>
<ServiceType id="3">
<ServiceTypeName><![CDATA[Salongitööd]]></ServiceTypeName>
</ServiceType>
</Service>
</Garage>
</Booking>
</Bookings>
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="Bookings">
<xs:complexType>
<xs:sequence>
<xs:element name="Booking" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:date" name="BookinggDate"/>
<xs:element type="xs:time" name="BookingTime"/>
<xs:element name="ApplicationUser">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="UserName"/>
<xs:element type="xs:string" name="UserEmail"/>
<xs:element type="xs:long" name="Phone"/>
<xs:element name="Car">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="Make"/>
<xs:element type="xs:string" name="Model"/>
<xs:element type="xs:date" name="ReleaseYear"/>
<xs:element name="CarType">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="TypeName"/>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required"/>
<xs:attribute type="xs:boolean" name="active" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Garage">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="GarageName"/>
<xs:element type="xs:string" name="GarageAddress"/>
<xs:element type="xs:long" name="GaragePhone"/>
<xs:element name="Service">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="ServiceName"/>
<xs:element name="ServicePrice">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute type="xs:string" name="currency" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element type="xs:string" name="Unit"/>
<xs:element type="xs:string" name="ExtraInfo"/>
<xs:element name="ServiceType">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="ServiceTypeName"/>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required"/>
<xs:attribute type="xs:boolean" name="confirmed" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSLT HTML transformation
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>Broneeringud</title>
</head>
<body>
<h2>Broneeringud</h2>
<ol>
<xsl:variable name="confirmed">true</xsl:variable>
<xsl:for-each select="Bookings/Booking">
<li>
<b>Status: </b>
<xsl:choose>
<xsl:when test="@confirmed = $confirmed">
<b style="color:green;">CONFIRMED</b>
</xsl:when>
<xsl:otherwise>
<b style="color:red;">PENDING</b>
</xsl:otherwise>
</xsl:choose>
<br/>
<b>Klient: </b>
<ul>
<b>Nimi: </b>
<xsl:value-of select="ApplicationUser/UserName"/>
<br/>
<b>Mail: </b>
<xsl:value-of select="ApplicationUser/UserEmail"/>
</ul>
<b>Auto: </b>
<br/>
<ul>
<xsl:for-each select="ApplicationUser/Car">
<xsl:sort select="@id" />
<b>Tüüp: </b>
<xsl:value-of select="CarType/TypeName"/>
<br/>
<b>Mark: </b>
<xsl:value-of select="Make" />
<br/>
<b>Mudel: </b>
<xsl:value-of select="Model"/>
<br/>
<b>Väljalastud: </b>
<xsl:value-of select="ReleaseYear"/>
<br/>
</xsl:for-each>
</ul>
<b>Broneeringu aeg:</b>
<br/>
<ul>
<b>Aeg: </b>
<xsl:value-of select="BookinggDate" /> - <xsl:value-of select="BookingTime"/><br/>
</ul>
<b>Töökoda:</b>
<br/>
<ul>
<xsl:for-each select="Garage">
<xsl:sort select="@id" />
<b>Töökoja nimi: </b>
<xsl:value-of select="GarageName"/>
<br/>
<b>Aadress: </b>
<xsl:value-of select="GarageAddress"/>
<br/>
<b>Telefon: </b>
<xsl:value-of select="GaragePhone"/>
<br/>
</xsl:for-each>
</ul>
<b>Teenus:</b>
<br/>
<ul>
<xsl:for-each select="Garage/Service">
<xsl:sort select="@id"/>
<b>Teenuse nimi: </b>
<xsl:value-of select="ServiceName"/><br/>
<b>Teenuse tüüp: </b>
<xsl:value-of select="ServiceType/ServiceTypeName"/><br/>
<b>Teenuse hind: </b>
<xsl:value-of select="ServicePrice"/>€ - <xsl:value-of select="Unit"/><br/>
<b>Lisainfo: </b>
<xsl:value-of select="ExtraInfo"/><br/>
</xsl:for-each>
</ul>
</li>
<br/>
</xsl:for-each>
</ol>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLT XML transformation
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Bookings">
<Bookings>
<xsl:variable name="confirmed">true</xsl:variable>
<xsl:for-each select="Booking">
<Boooking>
<Status>
<xsl:choose>
<xsl:when test="@confirmed = $confirmed">
Confirmed
</xsl:when>
<xsl:otherwise>
Pending
</xsl:otherwise>
</xsl:choose>
</Status>
<Client>
<Name>
<xsl:value-of select="ApplicationUser/UserName"/>
</Name>
<Email>
<xsl:value-of select="ApplicationUser/UserEmail"/>
</Email>
</Client>
<Car>
<xsl:for-each select="ApplicationUser/Car">
<Type>
<xsl:value-of select="CarType/TypeName"/>
</Type>
<Make>
<xsl:value-of select="Make"/>
</Make>
<Model>
<xsl:value-of select="Model"/>
</Model>
<ReleaseDate>
<xsl:value-of select="ReleaseYear"/>
</ReleaseDate>
</xsl:for-each>
</Car>
<BookingDate>
<Date>
<xsl:value-of select="BookinggDate"/>
</Date>
<Time>
<xsl:value-of select="BookingTime"/>
</Time>
</BookingDate>
<Garage>
<xsl:for-each select="Garage">
<Name>
<xsl:value-of select="GarageName"/>
</Name>
<Address>
<xsl:value-of select="GarageAddress" />
</Address>
<Phone>
<xsl:value-of select="GaragePhone"/>
</Phone>
</xsl:for-each>
</Garage>
<Service>
<xsl:for-each select="Garage/Service">
<Name>
<xsl:value-of select="ServiceName"/>
</Name>
<Type>
<xsl:value-of select="ServiceType/ServiceTypeName"/>
</Type>
<Price>
<xsl:value-of select="ServicePrice"/>
</Price>
<Unit>
<xsl:value-of select="Unit"/>
</Unit>
<ExtraInfo>
<xsl:value-of select="ExtraInfo"/>
</ExtraInfo>
</xsl:for-each>
</Service>
</Boooking>
</xsl:for-each>
</Bookings>
</xsl:template>
</xsl:stylesheet>
Retsentsioonid
Retsenseerisime projekti puhul meeskonda Maagikud
Veebiteenus
Meeskonna Maagikud idee oli luua lennujaama ja lennuliini integreeritud süsteem. Klient saaks broneerida mingi lennuaja vastavalt ette antud andmetele (lähtekoht ja sihtkoht) ja admin saab lisada igasuguseid lennujaame või lennuliine ning nendega seonduvaid andmeid.
Kui me proovimise selle programmi esimest korda tööle panna, tekkisid probleeme. Avastasime, et programm ei teinud automaatselt andmebaasi ja pidime ise käsitsi seda tegema. Oleks võinud olla mingi README fail olla, kuidas alustada seda programmi korralikult.
Domeenimudelis on piisav arv olemeid, et täita kodutööks ettenähtud tingimusi. Kõik klassid, mis on domeenis, on kasutatud korralikult ja pole näha ühtegi üleliigset asja. Oleks võinud kasutada atribuute aga see eriti vahet ei tee.
Projekt on hästi struktureeeritud ja arhitektuuriliselt on ka kasutatud korralikult. Kood on jaotatud eraldi BL, DAL, Domain ja airport_angular vahel. Kirjutusstiil oli kõik korralik ja kõik kaustad olid ka jaotatud õigesti.
DAL on jagatud neljaks erinevaks osaks ja need on üsna põhjalikult tehtud. On tugevalt järgitud õpetaja Käveri ülesehitust ning kiirema ülevaatuse põhjal võib öelda, et on korrektne. DAL kasutab repositooriume ja Unit Of Worke.
Kui me hakkasime testime neid API’d, meil tekkisid mõned probleemi. Kõik API’d ei olnud kättesaadavad. Avastasime, et kindlad tingimused olid küljes. Mõned API’d oli kättesaadavad siis, kui olid sisseloginud või pidid olema admin. Saime ikkagi kõike API’d kätte, aga see tegi natukene API testimine meil natukene keeruliseks ka. Hea, et lisati töö sisse ka Swaggeri, mis tegi testimise lihtsamaks.
Antud töö on ilusti kirjutatud ning suurimad vigu polnud üldse näha. Kõik nõutud funktsioonid on olemas ja töötavad korralikult ka. Projekti struktuur on ilusti püsti pandud ning ükski klass ei ole suvalises kaustas. Controllerid on küll korralikult kommenteeritud, aga kõik muu failid oleksid võinud olla ka kommenteeritud. Mõned kohad jäid segaseks eriti, kui tekiks olukord kus keegi teine peaks hakkama koodi muutma või juurde lisama midagi. README fail oleks võinud ka olla, et kirjeldada kuidas programmi käsitleda. Täpsemalt milliseid samme jälgida, et programmi saaks tööle panna. Kokkuvõtvalt jäi meile tööst üsna hea mulje, vaeva on nähtud.
Klientrakendus
XML
Vaadates XML-i ülesehitust siis võib öelda, et on valitud teatud osa programmist mitte tervik. Täpsemalt on valitud people_in_seats, kuigi oleks võinud valida teenuse tervikuna, et saada parem ülevaade. XML fail on loogiliselt väljamõeldud ja ülesehitatud. XML failis on olemas 4 loogilist dimensiooni ja on ka kasutadud korralikult. Soovitusena oleks võinud kasutada CDATA-t, kus parser ignoreerib elementide sees olevaid karaktereid. Väga hea, et lisati kommentaare ka täpsustamaks, mis iga rida tähendab.
XML schema fail on korralikult koostatud ja töötab XML failiga ka koos. See XSLT fail, mis teeb XML lehe HTML’iks, on ka ilusti koostatud ja näitab ka kõiki tulemusi arusaadavalt. Oleks võinud rohkem huvitavaid asju teha, aga tulemus on ikka saavutatud. See teine XSLT fail transformeerib ka korralikult XML lehte ja ühtegi probleeme probleeme pole tekkinud.
Kokkuvõttena saab öelda, et kõik XML failid funktsioneerivad õigesti, aga lihtsalt see XML fail jäi natukene puudulikuks.
Blogi
30.03.2018 Meeskonna moodustamine ja analüüsi koostamine
20.04.2018 - 27.05.2018 Projekti koostamine
31.05.2018 XML koostamine