RK

From ICO wiki

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

Projekti zip

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.


Veebiteenuse ja veebirakenduse retsensioonid