LTD
Meeskond
- Eve Ormisson
- Carlos Kirtsi
Analüüs
Mõte autokoolide veebiteenuse tegemiseks tuli sellest, et olen kuulunud ühe konkreetse autokooli sõiduõpetajatelt, kuidas nende tundide haldamise süsteem on väga ebamugav. Õpilaste poole pealt ei paistagi see niiväga välja (olen ka ise nimetatud koolis õppinud) - tunde ja õppejõude saab valida ja broneerida ning tundide eest saab maksta. Õppejõudude ja kooli halduse poolt vaadates töövooga aga ei toimi: õppejõud peavad oma sooritatud tunnid lisaks rakenduses kirja panemisele eraldi paberile ümber kirjutama, mis omakorda läheb raamatupidamisse. Raamatupidaja arvestab õpetajate tasusid käsikirjaliselt koostaud paberi alusel, mis on ajakulukas ja veaohtlik. Raamatupidamine võiks vajalikud andmed saada otse ühisest andmebaasist, mis säästaks nii õpetajate kui raamatupidajate aega ning vähendaks inimlike vigade ohtu tundide arvu ja toimumisaegade kopeerimisel.
Plaanis on luua andmebaas, kuhu saab sisestada sõiduõpetajate andmeid ja neile sobivaid tundide aegu. Samuti saab andmebaasi salvestada sõidukoolis õppijate andmeid, kui palju tunde nad on läbinud ja kas nad on tundide eest maksnud. Sõidutunde peaks saama broneerida saama ainult juhul, kui on tasutud ettemaks või vähemalt ei ole kasutajal võlgnevusi. Süsteem sisaldab teavet ka kooli(de) kohta ning õpilaste jaoks infot selle kohta, millis(te) auto(de)ga see õpetaja sõidab ning kust tunnid algavad.
Veebiteenusest saab pärida, kui mitu tundi ja millal on mingi õpetaja on läbi viinud. Info alusel saab kool korraldada raamatupidamist ja muud aruandlust. Samuti saab pärida üldist statistilist infot õpilaste tulemuste kohta, mille alusel saab võrrelda erinevaid autokoole, sõiduõpetajaid või uurida üldisi tendentse. Näiteks seda, kui mitme sõidutunniga õpilased tavaliselt autokooli lõpetavad? Kui suur osa õpilasi läbib autokooli minimaalsete sõidutundide (40 tundi) arvuga? Kas on mingid tähelepanuväärsed erinevused sõiduõpetajate või kooldie lõikes?
Veebiteenusele saab ehitada erinevaid klientrakendusi autokooldie broneerimissüsteemide näol, kus on erinevad vaated õpilaste, õpetajate ja administraatori jaoks. Süsteem võib toetada ka ühe õpetaja liikumist erinevate autokoolide vahel - näiteks saab õpetaja selle läbi hallata oma tunde mitmes erinevas autokoolis, mis annab talle võimaluse erinevatel päevadel erinevate autokoolide jaoks töötada. Veebiteenust saab liidestada raamatupidamissüsteemidega, et raamatupidaja ja autokooli juhatus saaksid läbi selle ülevaate oma kooli õpetajate ja õpilaste sõidutundidest.
Antud aine raames loodava kllientrakenduse vahendusel saavad õpilased valida õpetajaid, näha nende vabu sõiduaegu ja sõiduaegu broneerida. Õpetajad saavad sõiduaegu sisestada ja hallata.
Lühikirjeldus
Autokoolidele sõidutundide haldamiseks mõeldud teenus, mis oleks abiks nii sõiduõpetajatele kui kooli juhatusele ja raamatupidajatele. Samuti võimaldavad teenusele loodud kilentrakendused autokooli(de) õpilastel oma sõidutunde broneerida ja hallata.
Andmemudel
Idee funktsionaalsus
Versioonihaldus
https://eluonlill.visualstudio.com/LearnToDriveSolution/LTDTeam/_git/LearnToDriveSolution
Blogi
- Märts 2018 - ideede pakkumine
- 01.04.2018 - idee valimine, wiki lehe tegemine
- 02.04.2018 - idee analüüs
- 13.04.2018 - versioonihaldusesse projekti tegemine
- 15.04.2018 - algas töö veebiteenusega
- 21.05.2018 - veebiteenus sai valmis
- 22.05.2018 - klientrakenduse loomine
- 23.05.2018 - viimased parandused veebiteenusele
- 28.05.2018 - lahkhelide tekkimise tõttu teise klientrakenduse loomine
- 02.06.2018 - XML osa valmimine
- 03.06.2018 - Retsensioonide alustamine
Lisad
Erinevatest töökultuuridest põhjustatud lahkhelide tõttu võib juhuda, et antud veebiteenusele valmib aine raames kaks erinevat klientrakendust - kahe erineva autokooli tundide broneerimise rakendused lõppkasutajale (õpilasele). Kahe erineva rakenduse loomine sama veebiteenuse vastu peaks hästi illustreerima veebiteenuse võimalusi ja eeliseid.
XML osa
XML lähtekood
<?xml version="1.0" encoding="UTF-8"?>
<schools>
<school>
<lessons>
<lesson id="1" hidden="false">
<lessonId>1</lessonId>
<lessonStart><![CDATA[31.05.2018 13:00]]></lessonStart>
<lessonEnd><![CDATA[31.05.2018 14:00]]></lessonEnd>
<lessonType><![CDATA[Truck driver training]]></lessonType>
<vehicle id="1">
<vehicleId>4</vehicleId>
</vehicle>
<person id="1">
<personId>1</personId>
</person>
<person id="2">
<personId>3</personId>
</person>
</lesson>
<lesson id="2" hidden="false">
<lessonId>2</lessonId>
<lessonStart><![CDATA[27.05.2018 13:00]]></lessonStart>
<lessonEnd><![CDATA[27.05.2018 14:00]]></lessonEnd>
<lessonType><![CDATA[Beginner training]]></lessonType>
<vehicle id="1">
<vehicleId>1</vehicleId>
</vehicle>
<vehicle id="2">
<vehicleId>2</vehicleId>
</vehicle>
<person id="1">
<personId>2</personId>
</person>
<person id="2">
<personId>4</personId>
</person>
</lesson>
<lesson id="3" hidden="true">
<lessonId>3</lessonId>
<lessonStart><![CDATA[10.05.2018 10:00]]></lessonStart>
<lessonEnd><![CDATA[15.05.2018 18:00]]></lessonEnd>
<lessonType><![CDATA[Security driving training]]></lessonType>
<vehicle id="1">
<vehicleId>3</vehicleId>
</vehicle>
<person id="1">
<personId>2</personId>
</person>
<person id="2">
<personId>5</personId>
</person>
</lesson>
</lessons>
<personsInLesson>
<person id="1" type="teacher">
<firstname><![CDATA[Urmo]]></firstname>
<lastname><![CDATA[Segisti]]></lastname>
<mail><![CDATA[urmo@segisti.ee]]></mail>
<phone><![CDATA[+372 53806309]]></phone>
<hidden>false</hidden>
</person>
<person id="2" type="teacher">
<firstname><![CDATA[Marko]]></firstname>
<lastname><![CDATA[Martin]]></lastname>
<mail><![CDATA[marko@martin.ee]]></mail>
<phone><![CDATA[+372 547 3321]]></phone>
<hidden>false</hidden>
</person>
<person id="3" type="student">
<firstname><![CDATA[Anti]]></firstname>
<lastname><![CDATA[Nuga]]></lastname>
<mail><![CDATA[anti@nuga.ee]]></mail>
<phone><![CDATA[+372 574 2333]]></phone>
<hidden>false</hidden>
</person>
<person id="4" type="student">
<firstname><![CDATA[Aia]]></firstname>
<lastname><![CDATA[Auk]]></lastname>
<mail><![CDATA[aia@auk.ee]]></mail>
<phone><![CDATA[+372 506 4759]]></phone>
<hidden>false</hidden>
</person>
<person id="5" type="student">
<firstname><![CDATA[Turva]]></firstname>
<lastname><![CDATA[Mees]]></lastname>
<mail><![CDATA[turva@mees.ee]]></mail>
<phone><![CDATA[+372 561 4759]]></phone>
<hidden>false</hidden>
</person>
</personsInLesson>
<vehicles>
<vehicle id="1">
<make><![CDATA[Skoda]]></make>
<model><![CDATA[Octavia]]></model>
<year>2016</year>
<fuel>gas</fuel>
<hidden>false</hidden>
</vehicle>
<vehicle id="2">
<make><![CDATA[Toyota]]></make>
<model><![CDATA[Avensis]]></model>
<year>2017</year>
<fuel>diesel</fuel>
<hidden>false</hidden>
</vehicle>
<vehicle id="3">
<make><![CDATA[Skoda]]></make>
<model><![CDATA[Suberb]]></model>
<year>2017</year>
<fuel>gas</fuel>
<hidden>false</hidden>
</vehicle>
<vehicle id="4">
<make><![CDATA[Scania]]></make>
<model><![CDATA[R450]]></model>
<year>2018</year>
<fuel>diesel</fuel>
<hidden>false</hidden>
</vehicle>
</vehicles>
</school>
</schools>
XSD
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="schools">
<xs:complexType>
<xs:sequence>
<xs:element name="school">
<xs:complexType>
<xs:sequence>
<xs:element name="lessons">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="lesson">
<xs:complexType>
<xs:sequence>
<xs:element name="lessonId" type="xs:int" />
<xs:element name="lessonStart" type="xs:string" />
<xs:element name="lessonEnd" type="xs:string" />
<xs:element name="lessonType" type="xs:string" />
<xs:element maxOccurs="unbounded" name="vehicle">
<xs:complexType>
<xs:all>
<xs:element name="vehicleId" type="xs:int" />
</xs:all>
<xs:attribute name="id" type="xs:int" use="required" />
</xs:complexType>
</xs:element>
<xs:element maxOccurs="unbounded" name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="personId" type="xs:int" />
</xs:sequence>
<xs:attribute name="id" type="xs:int" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:int" use="required" />
<xs:attribute name="hidden" type="xs:boolean" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="personsInLesson">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="person">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string" />
<xs:element name="lastname" type="xs:string" />
<xs:element name="mail" type="xs:string" />
<xs:element name="phone" type="xs:string" />
<xs:element name="hidden" type="xs:boolean" />
</xs:all>
<xs:attribute name="id" type="xs:int" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="vehicles">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="vehicle">
<xs:complexType>
<xs:all>
<xs:element name="make" type="xs:string" />
<xs:element name="model" type="xs:string" />
<xs:element name="year" type="xs:unsignedShort" />
<xs:element name="fuel" type="xs:string" />
<xs:element name="hidden" type="xs:boolean" />
</xs:all>
<xs:attribute name="id" type="xs:int" use="required" />
</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 to HTML
<?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="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="schools/school/personsInLesson/person">
<xsl:if test="@type ='student'">
<h2>
<xsl:value-of select="firstname" />
<xsl:text> </xsl:text>
<xsl:value-of select="lastname" />
</h2>
<table border="1">
<tr>
<th>Email</th>
<th>
<xsl:value-of select="mail"/>
</th>
</tr>
<tr>
<th>Phone</th>
<th>
<xsl:value-of select="phone"/>
</th>
</tr>
</table>
</xsl:if>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLT to 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="/">
<xsl:element name="schools">
<xsl:element name="school">
<xsl:element name="lessons">
<xsl:for-each select="schools/school/lessons">
<xsl:element name="lesson">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:attribute name="hidden">
<xsl:value-of select="@hidden"/>
</xsl:attribute>
<xsl:element name="lessonId">
<xsl:value-of select="@lessonId"/>
</xsl:element>
<xsl:element name="lessonStart">
<xsl:value-of select="@lessonStart"/>
</xsl:element>
<xsl:element name="lessonEnd">
<xsl:value-of select="@lessonEnd"/>
</xsl:element>
<xsl:element name="lessonType">
<xsl:value-of select="@lessonType"/>
</xsl:element>
<xsl:element name="vehicle">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:element name="vehicleId">
<xsl:value-of select="@vehicleId"/>
</xsl:element>
</xsl:element>
<xsl:element name="person">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:element name="personId">
<xsl:value-of select="@personId"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Retsensioonid
Veebiteenus
Klientrakendus
XML osa
XML osa puhul retsenseerime tiimi Meeskond: RaamatuRiiul