RK
Meeskond
Raido Kivinurm
Veebiteenus
Analüüs
Projekti kirjeldus
Rakendus on mõeldud lukufirmade teenuste vahendamiseks. Nii hädaolukordade lahendamisteks, kus on inimesed ennast korterist/majast välja lukustanud, kui ka tavaliste tööde pakkumisteks.
Mõisted
- Teenusepakkuja - lukufirma kes pakub teenust kliendile.
- Klient - era- või juriidilineisik kes tellib teenust teenusepakkujatelt.
- Admin - Rakenduse poolne isik kes haldab firmasi ja lahendab erimeelsusi.
- Töö - Kliendi loodud, lahendust vajav tööpakkumine millele teenusepakkujad saavad teha hinnapakkumisi
Must have
- Klient saab luua konto vajalike andmetega
- Klient saab valida ettemääratud töödest või võimaluse sisestada käsitsi töö sisu, ning selle põhjal luua uus töö
- Klient näeb enda tellitud töödest ajalugu
- Klient saab valida endale sobiva pakkumise teenusepakkujate poolt tehtud pakkumiste hulgast
- Klient saab esitada tehtud töö kohta kaebuse
- Teenusepakkuja saab luua konto mis vajab admini kinnitust
- Teenusepakkuja näeb pakkumisel olevaid töid
- Teenusepakkuja saab teha hinnapakkumisele tööle
- Teenusepakkuja näeb enda tehtud tööde ja pakkumiste ajalugu
- Teenusepakkuja saab vastata tema tehtud kaebuse kohta
- Teenusepakkuja saab küsida lisainfot töö kohta, mille sisu on nähtav kõikidele hinnapakkujatele
- Admin saab näha kogu tööde ajalugu koos vajalike filtreerimistega
- Admin saab küsida lisainfot kaebuste kohta ja lahendada neid
- Admin saab aktsepteerida uusi teenusepakkujaid või neist keelduda ja sulgeda olemasolevaid
Nice to have
- Kliendile arvutatakse ligikaudne hind tööst rakenduse ajaloo põhjal - kui töö on valitud ettemääratud nimekirjast
- Klient saab lisada tööle pilte
- Klient saab lisada "kiire töö" linnukese mille puhul rakendus arvutab sobiva hinna ning teenusepakkuja saab vastu võtta töö ilma hinnapakkumiseta.
- Teenusepakkuja saab vastu võtta pilte.
- Teenusepakkujal on mitu sisselogimist mis on seotud sama firmaga
Rakendus
XML, XSD, XSLT
XML
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="andmedHtml.xslt"?>
<!--<?xml-stylesheet type="text/xsl" href="andmedXml.xslt"?>-->
<!-- Computer hardware "middleman"-->
<Hardware>
<!-- Company that offers following item -->
<Company code="12494674">
<Name>Arvutitark OÜ</Name>
<Address>
<Country>Estonia</Country>
<State>Harjumaa</State>
<City>Tallinn</City>
<AadressLine></AadressLine>
</Address>
</Company>
<!-- Components they offer -->
<Components>
<Component type="Processor" shortName="CPU">
<Item>
<Name productcode="BX80646I74790K"><![CDATA[I7 4790K]]></Name>
<Manufacturer>Intel</Manufacturer>
<Price validFrom="2017-01-01" validUntil="2017-06-01">
<Amount>350</Amount>
<Currency>EUR</Currency>
<Description><![CDATA[SUPER SALE!!!]]></Description>
</Price>
<CustomInfo>
<InfoLine name="Socket Type"><![CDATA[LGA 1150]]></InfoLine>
<InfoLine name="TDP"><![CDATA[84W]]></InfoLine>
</CustomInfo>
<Image><![CDATA[https://images10.newegg.com/ProductImage/19-117-369-02.jpg]]></Image>
</Item>
<Item>
<Name productcode="YD1700BBAEBOX"><![CDATA[Ryzen 7 1700]]></Name>
<Manufacturer>AMD</Manufacturer>
<Price validFrom="2017-03-01" validUntil="2017-05-05">
<Amount>390</Amount>
<Currency>EUR</Currency>
<Description><![CDATA[ALL NEW CPU HAS "RYZEN"]]></Description>
</Price>
<Image><![CDATA[https://www.bhphotovideo.com/images/images1000x1000/amd_yd1700bbaebox_ryzen_7_1700_am4_1322539.jpg]]></Image>
<CustomInfo>
<InfoLine name="# of Cores"><![CDATA[8]]></InfoLine>
<InfoLine name="Frequency"><![CDATA[3.0 GHz]]></InfoLine>
<InfoLine name="Socket Type"><![CDATA[AM4]]></InfoLine>
<InfoLine name="TDP"><![CDATA[65W]]></InfoLine>
</CustomInfo>
</Item>
</Component>
<Component type="Power supply" shortName="PSU">
<Item>
<Image><![CDATA[http://www.enermax.pl/uploads/pics/maxpro01.png]]></Image>
<Name productcode="EMP500AGT"><![CDATA[MaxPro 500]]></Name>
<Manufacturer>Enermax</Manufacturer>
<CustomInfo>
<InfoLine name="Power"><![CDATA[500W]]></InfoLine>
<InfoLine name="Efficiency"><![CDATA[80 Plus]]></InfoLine>
</CustomInfo>
<Price validFrom="2017-02-03" validUntil="2017-06-03">
<Amount>55.50</Amount>
<Currency>USD</Currency>
<Description><![CDATA[]]></Description>
</Price>
</Item>
</Component>
<Component type="Monitor">
<Item>
<Name productcode="210-AICW"><![CDATA[UltraSharp U2717D]]></Name>
<Manufacturer>Dell</Manufacturer>
<Price validFrom="2017-08-01" validUntil="2018-01-01">
<Amount>450</Amount>
<Currency>EUR</Currency>
<Description><![CDATA[Be ready or be square]]></Description>
</Price>
<Image><![CDATA[http://www.gadgetreview.com/wp-content/uploads/2016/07/Dell-U2717D-Monitor-Design.jpg]]></Image>
<CustomInfo>
<InfoLine name="Display size"><![CDATA[27'']]></InfoLine>
<InfoLine name="Resolution"><![CDATA[WQHD 2560×1440]]></InfoLine>
<InfoLine name="HDMI"><![CDATA[Yes]]></InfoLine>
<InfoLine name="Thunderbolt"><![CDATA[No]]></InfoLine>
</CustomInfo>
</Item>
</Component>
<Component type="Storage">
<Item>
<Name productcode="MZ-75E250B/EU"><![CDATA[850 EVO 250GB SATA 6Gbit/s]]></Name>
<Manufacturer>Samsung</Manufacturer>
<Price validFrom="2017-01-01" validUntil="2017-02-01">
<Amount>500</Amount>
<Currency>Bottle cap</Currency>
<Description><![CDATA[Extra cheap. Get your caps ready!]]></Description>
</Price>
<CustomInfo>
<InfoLine name="Capacity"><![CDATA[250GB]]></InfoLine>
<InfoLine name="Size"><![CDATA[2.5'']]></InfoLine>
</CustomInfo>
<Image><![CDATA[https://images-na.ssl-images-amazon.com/images/I/71gkS5vep8L._SL1500_.jpg]]></Image>
</Item>
</Component>
</Components>
</Hardware>
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="Hardware">
<xs:complexType>
<xs:sequence>
<xs:element name="Company" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:all>
<xs:element name="Name" type="xs:string" />
<xs:element name="Address">
<xs:complexType>
<xs:all>
<xs:element name="Country" type="xs:string" />
<xs:element name="State" type="xs:string" />
<xs:element name="City" type="xs:string" />
<xs:element name="AadressLine" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="code" type="xs:long" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="Components">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="Component">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="Item">
<xs:complexType>
<xs:all>
<xs:element name="Name">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="productcode" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Manufacturer" type="xs:string" />
<xs:element name="Price">
<xs:complexType>
<xs:all>
<xs:element name="Amount" type="positiveDecimal"/>
<xs:element name="Currency" type="currencyType"/>
<xs:element name="Description" type="description" />
</xs:all>
<xs:attribute name="validFrom" type="xs:date" use="optional" />
<xs:attribute name="validUntil" type="xs:date" use="optional" />
</xs:complexType>
</xs:element>
<xs:element name="CustomInfo">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="InfoLine">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="description" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Image" type="xs:string" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" use="required" type="componentType"/>
<xs:attribute name="shortName" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="componentType">
<xs:restriction base="xs:string">
<xs:enumeration value="Processor"/>
<xs:enumeration value="Power supply"/>
<xs:enumeration value="Videocard"/>
<xs:enumeration value="Monitor"/>
<xs:enumeration value="Storage"/>
<xs:enumeration value="Motherboard"/>
<xs:enumeration value="Cooler"/>
<xs:enumeration value="Case"/>
<xs:enumeration value="Other"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="currencyType">
<xs:restriction base="xs:string">
<xs:enumeration value="EUR"/>
<xs:enumeration value="USD"/>
<xs:enumeration value="RUB"/>
<xs:enumeration value="IRR"/>
<xs:enumeration value="Bottle cap"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="positiveDecimal">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="description">
<xs:restriction base="xs:string">
<xs:maxLength value="256"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
XSLT 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"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<xsl:variable name="company" select="/Hardware/Company"/>
<xsl:variable name="companyName" select="$company/Name"/>
<xsl:variable name="country" select="$company/Address/Country"/>
<xsl:variable name="state" select="$company/Address/State"/>
<xsl:variable name="aLine" select="$company/Address/AadressLine"/>
<xsl:variable name="fullAdress" select="concat($country,', ',$state,', ', $aLine)"/>
<h2>
<xsl:value-of select="$companyName"/>
<br/>
<xsl:value-of select="$fullAdress"/>
</h2>
<xsl:for-each select="/Hardware/Components/Component">
<h3>
<xsl:value-of select="@type"/>
<xsl:if test="@shortName">
<xsl:text> (</xsl:text>
<xsl:value-of select="@shortName"/>
<xsl:text>)</xsl:text>
</xsl:if>
</h3>
<table>
<tr>
<xsl:for-each select="Item">
<td>
<xsl:variable name="imageTitle" select="concat(Price/Description, ' ', Price/Amount,Price/Currency)"/>
<xsl:variable name="start" select="Price/@validFrom"/>
<xsl:variable name="end" select="Price/@validUntil"/>
<p>
<xsl:value-of select="Manufacturer"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="Name"/>
</p>
<p style="font-size: 50%;">
<xsl:value-of select="Name/@productcode"/>
</p>
<img src="{Image}" title="{$imageTitle}" width="250" height="250" />
<table>
<tbody>
<xsl:for-each select="CustomInfo/InfoLine">
<tr>
<td style="width:100px; font-weight:bold">
<xsl:value-of select="@name"/>
</td>
<td style="width:150px">
<xsl:choose>
<xsl:when test=". = 'Yes'">
<xsl:text>✔</xsl:text>
</xsl:when>
<xsl:when test=". = 'No'">
<xsl:text>✖</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</td>
</xsl:for-each>
</tr>
</table>
<hr/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLT 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="/">
<Root>
<ComponentTypes>
<xsl:for-each select="Hardware/Components/Component">
<xsl:variable name="count" select="count(Item)"/>
<Type amount="{$count}">
<xsl:value-of select="@type"/>
</Type>
</xsl:for-each>
</ComponentTypes>
<xsl:variable name="seller" select="Hardware/Company/Name"/>
<Components>
<xsl:for-each select="Hardware/Components/Component/Item">
<Component>
<xsl:variable name="currency" select="Price/Currency"/>
<xsl:variable name="Manufacturer" select="Manufacturer"/>
<Name company="{$Manufacturer}">
<xsl:value-of select="Name"/>
</Name>
<Seller>
<xsl:value-of select="$seller"/>
</Seller>
<Price curreny="{$currency}">
<xsl:value-of select="Price/Amount"/>
</Price>
<ImageUrl>
<xsl:value-of select="Image"/>
</ImageUrl>
<xsl:choose>
<xsl:when test="$currency='Bottle cap'">
<Warning>Only for sale in Wastelands!</Warning>
</xsl:when>
<xsl:when test="$currency!='EUR'">
<Warning>Not for sale in EU!</Warning>
</xsl:when>
</xsl:choose>
</Component>
</xsl:for-each>
</Components>
</Root>
</xsl:template>
</xsl:stylesheet>
Retsensioonid
XML retsensioon Meeskond: Muru (1. osa)
XML vastab kõikidele ülesande püstituses seatud nõuetele ning valideerub sellele vastava XSD-ga. Välja on paista, et XSD-d on muudetud vastavalt meeskonna nägemusele ning ei ole tegemist otse Visual Studios genereeritud skeemifailiga. XML failis on olemas vajalikud loogilised dimensioonid ja kasutatakse piisavalt attribuute. Atribuudid on ülesande XML-is küll enamasti andmetüübi kohta kuid kasutakse ära ka andmete järjestuse edastmiseks. Eraldi tooks välja, et eeskujulikult kasutatakse teksti kuvamist CDATA-s.
Esimese transformatsiooniga kuvatakse välja kõik XML-is olevad kontod ning nendega seotud ülekanded. Teises transformatsioonis tehakse kontode jäägi kuvamine kahanevas järjekorras. Mõlemates transformatsioonides on kasutatud enamat kui lihtsalt for-each kausleid. Kasutatakse ära sorteerimist ja kuvatakse viisakas HTML. Kahjuks ei kasutata ära parameetreid, kuid see polnud ka otseselt kohustuslik.
Töö on korralik ja ei leidnud ühtegi märkimisväärset probleemi.