Meeskond Raavo V2™

From ICO wiki

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