Meeskond Raavo V2™
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
Blogi
30.03.2018 Meeskonna moodustamine ja analüüsi koostamine
20.04.2018 - 27.05.2018 Projekti koostamine
31.05.2018 XML koostamine