Enneaegsed

From ICO wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


Meeskond "Enneaegsed"
Aine: Category:Võrgurakendused II: hajussüsteemide ehitamine
Liikmed: Jaan Elken
Margit Ool
Juhendajad: Mait Poska
Semester: 2016 kevad

XML fail

Teemaks valisime arvete andmete hoidmise XML-is ning nende põhjal arvete nimekirja kuvamise ja arvete trükiks sobivate kuvade genereerimise.

XML

<?xml version="1.0" encoding="utf-8" ?>
<invoices>
  <invoice ref="00001" issued="2016-02-24" type="B2C">
    <header>
      <title>Arve</title>
      <order-number>MF002412</order-number>
      <due-date>2016-03-24</due-date>
      <seller>
        <name>OÜ Naelutaja</name>
        <registration-code>10421629</registration-code>
        <contact-address>
          <street>Kalju</street>
          <house>12</house>
          <apartement>6</apartement>
          <city-county>Tallinn</city-county>
          <postal-code>10512</postal-code>
        </contact-address>
        <contact-phone>56000000</contact-phone>
        <bank-requisites>
          <requisite>
            <name>Swedbank</name>
            <iban>EE232200001180005555</iban>
          </requisite>
          <requisite>
            <name>LHV</name>
            <iban>EE232200001188972345</iban>
          </requisite>
        </bank-requisites>
      </seller>
      <buyer>
        <name>Peeter Ehitaja</name>
        <contact-address>
          <street>Kalda</street>
          <house>1</house>
          <apartement>1</apartement>
          <city-county>Tallinn</city-county>
          <postal-code>10512</postal-code>
        </contact-address>
      </buyer>
    </header>
    <body>
      <invoice-items>
        <item type="goods">
          <amount unit="tk">10</amount>
          <name>Nael</name>
          <price-vat currency="EUR">1.2</price-vat>
          <price currency="EUR">1</price>
        </item>
        <item type="service">
          <amount unit="h">1</amount>
          <name>Naelutamine</name>
          <price-vat currency="EUR">12</price-vat>
          <price currency="EUR">10</price>
        </item>
      </invoice-items>
    </body>
    <footer>
      <total-price-vat currency="EUR">13</total-price-vat>
      <total-price currency="EUR">11.2</total-price>
      <instructions>Naelutama tullakse 30.03.2016 kell 13.00</instructions>
    </footer>
  </invoice>
  
  <invoice ref="00002" issued="2016-02-24" type="B2B">
    <header>
      <title>Arve</title>
      <order-number>MF005432</order-number>
      <due-date>2016-04-24</due-date>
      <seller>
        <name>OÜ Naelutaja</name>
        <registration-code>10421629</registration-code>
        <contact-address>
          <street>Kalju</street>
          <house>12</house>
          <apartement>6</apartement>
          <city-county>Tallinn</city-county>
          <postal-code>10512</postal-code>
        </contact-address>
        <contact-phone>56000000</contact-phone>
        <bank-requisites>
          <requisite>
            <name>Swedbank</name>
            <iban>EE232200001180005555</iban>
          </requisite>
          <requisite>
            <name>LHV</name>
            <iban>EE232200001188972345</iban>
          </requisite>
        </bank-requisites>
      </seller>
      <buyer>
        <name>OÜ Oütaja</name>
        <contact-address>
          <street>Riidevarna</street>
          <house>3</house>
          <apartement>1</apartement>
          <city-county>Tallinn</city-county>
          <postal-code>43232</postal-code>
        </contact-address>
      </buyer>
    </header>
    <body>
      <invoice-items>
        <item type="goods">
          <amount unit="tk">1</amount>
          <name>Diivan</name>
          <price currency="EUR">1000</price>
        </item>
        <item type="goods">
          <amount unit="tk">2</amount>
          <name>Tool</name>
          <price currency="EUR">300</price>
        </item>
        <item type="service">
          <amount unit="hours">1</amount>
          <name>Tassimine</name>
          <price currency="EUR">50</price>
        </item>
      </invoice-items>
    </body>
    <footer>
      <total-price currency="EUR">1350</total-price>
      <instructions>Kohaletoimetamine kokkuleppel, helistada 23423432</instructions>
    </footer>
  </invoice>

  <invoice ref="00003" issued="2016-02-26" type="B2C">
    <header>
      <title>Arve</title>
      <order-number>MF005645</order-number>
      <due-date>2016-04-24</due-date>
      <seller>
        <name>OÜ Naelutaja</name>
        <registration-code>10421629</registration-code>
        <contact-address>
          <street>Kalju</street>
          <house>12</house>
          <apartement>6</apartement>
          <city-county>Tallinn</city-county>
          <postal-code>10512</postal-code>
        </contact-address>
        <contact-phone>56000000</contact-phone>
        <bank-requisites>
          <requisite>
            <name>Swedbank</name>
            <iban>EE232200001180005555</iban>
          </requisite>
          <requisite>
            <name>LHV</name>
            <iban>EE232200001188972345</iban>
          </requisite>
        </bank-requisites>
      </seller>
      <buyer>
        <name>Kahtlane tegelane</name>
        <contact-address>
          <street>Paldiski mnt</street>
          <house>123</house>
          <apartement>1</apartement>
          <city-county>Tallinn</city-county>
          <postal-code>54545</postal-code>
        </contact-address>
      </buyer>
    </header>
    <body>
      <invoice-items>
        <item type="goods">
          <amount unit="tk">1</amount>
          <name>Labidas</name>
          <price currency="USD">30</price>
          <price-vat currency="USD">36</price-vat>
        </item>
      </invoice-items>
    </body>
    <footer>
      <total-price currency="USD">30</total-price>
      <total-price-vat currency="USD">36</total-price-vat>
    </footer>
  </invoice>
</invoices>

XML schema (XSD)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="EUR" />
      <xs:enumeration value="USD" />
      <xs:enumeration value="GBP" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="invoiceType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="B2C" />
      <xs:enumeration value="B2B" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="invoiceItemType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="goods" />
      <xs:enumeration value="service" />
      <xs:enumeration value="credit" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="invoices">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="invoice" maxOccurs="unbounded">
          <xs:complexType>
            <xs:all>
              <xs:element name="header">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="title" type="xs:string" />
                    <xs:element name="order-number" type="xs:string" />
                    <xs:element name="due-date" type="xs:date" />
                    <xs:element name="seller">
                      <xs:complexType>
                        <xs:all>
                          <xs:element name="name" type="xs:string" />
                          <xs:element name="registration-code" type="xs:string" />
                          <xs:element name="contact-address">
                            <xs:complexType>
                              <xs:all>
                                <xs:element name="street" type="xs:string" />
                                <xs:element name="house" type="xs:string" />
                                <xs:element minOccurs="0" name="apartement" type="xs:string" />
                                <xs:element name="city-county" type="xs:string" />
                                <xs:element minOccurs="0" name="municipality" type="xs:string" />
                                <xs:element name="postal-code" type="xs:integer" />
                              </xs:all>
                            </xs:complexType>
                          </xs:element>
                          <xs:element minOccurs="0" name="contact-phone" type="xs:string"></xs:element>
                          <xs:element name="bank-requisites">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="requisite">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="name" type="xs:string" />
                                      <xs:element name="iban" type="xs:string" />
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:all>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="buyer">
                      <xs:complexType>
                        <xs:all>
                          <xs:element name="name" type="xs:string" />
                          <xs:element name="contact-address">
                            <xs:complexType>
                              <xs:all>
                                <xs:element name="street" type="xs:string" />
                                <xs:element name="house" type="xs:string" />
                                <xs:element minOccurs="0" name="apartement" type="xs:string" />
                                <xs:element name="city-county" type="xs:string" />
                                <xs:element minOccurs="0" name="municipality" type="xs:string" />
                                <xs:element name="postal-code" type="xs:integer" />
                              </xs:all>
                            </xs:complexType>
                          </xs:element>
                          <xs:element minOccurs="0" name="contact-phone" type="xs:string"></xs:element>
                        </xs:all>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="body">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="invoice-items">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element maxOccurs="unbounded" name="item">
                            <xs:complexType>
                              <xs:all>
                                <xs:element name="amount">
                                  <xs:complexType>
                                    <xs:simpleContent>
                                      <xs:extension base="xs:integer">
                                        <xs:attribute name="unit" type="xs:string" use="required" />
                                      </xs:extension>
                                    </xs:simpleContent>
                                  </xs:complexType>
                                </xs:element>
                                <xs:element name="name" type="xs:string" />
                                <xs:element minOccurs="0" name="price-vat">
                                  <xs:complexType>
                                    <xs:simpleContent>
                                      <xs:extension base="xs:decimal">
                                        <xs:attribute name="currency" type="xs:string" use="required" />
                                      </xs:extension>
                                    </xs:simpleContent>
                                  </xs:complexType>
                                </xs:element>
                                <xs:element name="price">
                                  <xs:complexType>
                                    <xs:simpleContent>
                                      <xs:extension base="xs:decimal">
                                        <xs:attribute name="currency" type="xs:string" use="required" />
                                      </xs:extension>
                                    </xs:simpleContent>
                                  </xs:complexType>
                                </xs:element>
                              </xs:all>
                              <xs:attribute name="type" type="invoiceItemType" use="required" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:all>
                </xs:complexType>
              </xs:element>
              <xs:element name="footer">
                <xs:complexType>
                  <xs:all>
                    <xs:element minOccurs="0" name="total-price-vat" >
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:decimal">
                            <xs:attribute name="currency" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="total-price" minOccurs="1">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:decimal">
                            <xs:attribute name="currency" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>                    
                    </xs:element>
                    <xs:element minOccurs="0" name="instructions" type="xs:string" />
                  </xs:all>
                </xs:complexType>
              </xs:element>
            </xs:all>
            <xs:attribute name="ref" type="xs:string" use="required" />
            <xs:attribute name="issued" type="xs:date" use="required" />
            <xs:attribute name="type" type="invoiceType" use="required"/>
          </xs:complexType>
        </xs:element> 
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT - arvete nimekirja kuvamine

Genereerib arvete nimekirja

XSLT

<?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>
      <head>
        <title>
          Arvete nimekiri:
        </title>
      </head>
      <body>
        <h2>Arvete nimekiri:</h2>
        <table border="1" style="width:100%">
          <tr>
            <th>Arve nr</th>
            <th>Arve tüüp</th>
            <th>Arve saaja</th>
            <th>Väljastamise kp</th>
            <th>Maksetähtaeg</th>
            <th>Kogusumma</th>
          </tr>
          <xsl:for-each select="/invoices/invoice" >
            <tr>
              <td>
                <xsl:value-of select="@ref"/>
              </td>
              <td>
                <xsl:value-of select="@type"/>
              </td>
              <td>
                <xsl:value-of select="header/buyer/name"/>
              </td>
              <td>
                <xsl:value-of select="@issued"/>
              </td>
              <td>
                <xsl:value-of select="header/due-date"/>
              </td>
              <td>
                <xsl:choose>
                  <xsl:when test="@type = 'B2B'">
                    <xsl:value-of select="footer/total-price"/>
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="footer/total-price/@currency"/>
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:value-of select="footer/total-price-vat"/>
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="footer/total-price/@currency"/>
                  </xsl:otherwise>
                </xsl:choose>
        
              </td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>


Näidis

XSLT - arvete genereerimine

Genereerib kõik arved

XSLT

<?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>
      <head>
        <title>
          Arved
        </title>
      </head>
      <body>
        <xsl:for-each select="/invoices/invoice" >
          <xsl:variable name="invoiceType" select="@type"/>
          <table borders="0" width="100%">
            <tr>
              <td colspan="2" align="right">
                <xsl:text>Koostatud </xsl:text>
                <xsl:value-of select="@issued"/>
              </td>
            </tr>
            <tr>
              <td colspan="2" align="center">
                <h2>
                  <xsl:value-of select="header/title"/>
                  <xsl:text> nr: </xsl:text>
                  <xsl:value-of select="@ref"/>
                  <xsl:text> - tellimuse nr: </xsl:text>
                  <xsl:value-of select="header/order-number"/>
                </h2>
              </td>
            </tr>
            <tr>
              <td>
                <b>Arve saaja:</b>
                <br/>
                <xsl:value-of select="header/buyer/name"/>
                <br/>
                <xsl:value-of select="header/buyer/contact-address"/>
              </td>
              <td align="right">
                <b>Arve esitaja:</b>
                <br/>
                <xsl:value-of select="header/seller/name"/>
                <br/>
                <xsl:value-of select="header/seller/registration-code"/>
                <br/>
                <xsl:value-of select="header/seller/contact-address"/>
                <br/>
                <xsl:for-each select="header/seller/bank-requisites/requisite">
                  <xsl:value-of select="name"/>
                  <xsl:text>: </xsl:text>
                  <xsl:value-of select="iban"/>
                  <br/>
                </xsl:for-each>
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <xsl:text>NB! Arve tasumise tähtaeg on </xsl:text>
                <xsl:value-of select="header/due-date"/>
              </td>
            </tr>
          </table>

          <table width="100%">
            <tr bgcolor="#dddddd">
              <th width="25%">Nimetus</th>
              <th width="25%">Kogus</th>
              <th width="25%">Hind</th>
              <xsl:if test="$invoiceType = 'B2C'">
                <th width="25%">Hind+KM</th>
              </xsl:if>
            </tr>

            <xsl:if test="count(body/invoice-items/item[@type='goods']) > 0">
                <tr bgcolor="#eeeeee">
                  <td align="left" colspan="100%">
                    <b>Esemed</b>
                  </td>
                </tr>
                <xsl:for-each select="body/invoice-items/item[@type='goods']">
                  <tr>
                    <td>
                      <xsl:value-of select="name"/>
                    </td>
                    <td>
                      <xsl:value-of select="amount"/>
                      <xsl:text> </xsl:text>
                      <xsl:value-of select="amount/@unit"/>
                    </td>
                    <td>
                      <xsl:value-of select="price"/>
                      <xsl:text> </xsl:text>
                      <xsl:value-of select="price/@currency"/>
                    </td>
                    <xsl:if test="$invoiceType = 'B2C'">
                      <td>
                        <xsl:value-of select="price-vat"/>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="price-vat/@currency"/>
                      </td>
                    </xsl:if>
                  </tr>
                </xsl:for-each>
            </xsl:if>
          
            <xsl:if test="count(body/invoice-items/item[@type='service']) > 0">
                <tr bgcolor="#eeeeee">
                  <td align="left" colspan="100%">
                    <b>Teenused</b>
                  </td>
                </tr>
                <xsl:for-each select="body/invoice-items/item[@type='service']">
                  <tr>
                    <td>
                      <xsl:value-of select="name"/>
                    </td>
                    <td>
                      <xsl:value-of select="amount"/>
                      <xsl:text> </xsl:text>
                      <xsl:value-of select="amount/@unit"/>
                    </td>
                    <td>
                      <xsl:value-of select="price"/>
                      <xsl:text> </xsl:text>
                      <xsl:value-of select="price/@currency"/>
                    </td>
                    <xsl:if test="$invoiceType = 'B2C'">
                      <td>
                        <xsl:value-of select="price-vat"/>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="price-vat/@currency"/>
                      </td>
                    </xsl:if>
                  </tr>
                </xsl:for-each>
            </xsl:if>
          </table>

          <br/>
          <table width="100%">
            <tr bgcolor="#cccccc">
              <th colspan="2" width="50%" align="left">Kokku</th>
              <th width="25%">
                <xsl:value-of select="footer/total-price"/>
                <xsl:text> </xsl:text>
                <xsl:value-of select="footer/total-price/@currency"/>
              </th>
              <xsl:if test="$invoiceType = 'B2C'">
                <th width="25%">
                  <xsl:value-of select="footer/total-price-vat"/>
                  <xsl:text> </xsl:text>
                  <xsl:value-of select="footer/total-price-vat/@currency"/>
                </th>
              </xsl:if>
            </tr>
            <tr rowspan="3">
              <td widht="100%">
                <br/>
                <xsl:text>Märkused: </xsl:text>
                <xsl:value-of select="footer/instructions"/>
              </td>
            </tr>
          </table>

          <br/>
          <hr/>
          <table style="font-size: 10pt;" width="100%">
            <tr>
              <td width="50%" align="left">
                <xsl:value-of select="header/seller/name"/>
                <br/>
                <xsl:value-of select="header/seller/registration-code"/>
                <br/>
                <xsl:value-of select="header/seller/contact-address"/>
                <br/>
                <xsl:if test="header/seller/contact-phone != ''">
                  Telefon:
                  <xsl:text> </xsl:text>
                  <xsl:value-of select="header/seller/contact-phone"/>
                </xsl:if> 
              </td>
              <td width="50%" align="right">
                <xsl:for-each select="header/seller/bank-requisites/requisite">
                  <xsl:value-of select="name"/>
                  <xsl:text>: </xsl:text>
                  <xsl:value-of select="iban"/>
                  <br/>
                </xsl:for-each>
              </td>
            </tr>
          </table>
          <div style="width:100%;height:200px;"></div>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>


Näidis

Veebiteenus

Veebiteenuse analüüs

Projekti eesmärk on koostada rakendus ennustusmängu jaoks, mida korraldada jalgpalli EM või MM-i ajal. Projekti käigus koostatakse teenus ja klient-rakendus, mis seda teenust kasutab.


Funktsionaalsused


Must have:

  • Iga mängija saab keskkonda sisse logida ja ennustada mängude tulemust.
  • Kasutajad saavad enda poolt sisestatud ennustusi näha ja kuni vastava mängu alguseni ka ennustusi muuta.
  • Kasutajad saavad sisestada ka mängu tulemusi. Mängu tulemuste sisestamine algab siis, kui mäng on alanud. Viimase tulemuse sisestanud kasutaja salvestatakse.
  • Konkreetse mängu tulemust saab ennustada kuni selle alguseni.
  • Kasutajad saavad punkte ennustuste eest vastavalt sellele, kui täpselt nad ennustasid mängu tulemust ja punktid on määratud järgnevalt:
    • Alagrupimängud:
      • Väravate vahe õige ja mõlema meeskonna väravate arv õige: 4p
      • Väravate vahe õige 3p
      • Võitja õige 2p
      • Õigesti ennustatud viik ja väravate arv: 6p
    • Play off mängud
      • Väravate vahe õige ja mõlema meeskonna väravate arv õige: 8p
      • Väravate vahe õige 6p
      • Võitja õige 4p
    • Kui mäng lõppeb penaltiseeriaga, läheb arvesse seis, mis oli enne penalteid (viik).
  • Klientrakenduse kaudu on võimalik näha järgnevaid kokkuvõtteid:
    • Ennustusmängu pingerida ühe turniiri jooksul.
    • Mingi konkreetse mängu kokkuvõte: info mängu kohta. Kui mäng on alanud, siis ka nimekiri, kuidas kasutajad ennustasid
  • Kasutaja ennustuste kokkuvõte ühe turniiri jooksul: kõikide mängude ennustused (mis on alanud) ja palju kasutaja punkte sai.
  • Rakenduse kaudu on võimalik registreerida ennast kasutajaks
  • Rakenduse kaudu saab kasutaja andmeid muuta.
  • Kasutajal on erinevad rollid: tavakasutaja ja admin
  • Adminil on lisaks tavakasutaja vaadetele juurdepääs admini paneelile, mille kaudu saab hallata kasutajaid.


Turvalisus:

  • Ükski kasutaja ei saa teiste ennustusi näha enne mängu algust.
  • Ükski kasutaja sisestada teise mängija ennustusi või sisestada teise mängija nime all mängu tulemusi.
  • Mängu tulemusi sisestada pärast seda, kui mäng on juba alanud.
  • Kasutajate andmeid saab muuta kas seesama kasutaja ise või kasutaja, kellel on admini roll.


Nice to have:

  • Lisaks ennustusmängule on teenuse abil võimalik sisestada/ kustutada/ muuta ka andmeid turniiride, riikide, meeskondade ja mängude kohta. See õigus on ainult osadel kasutajatel (kas admini rolliga kasutajal või on selle jaoks mingi kolmas roll)
  • Lisaks mängu tulemuste ennustamisele on ennustusmängu jooksul lisaküsimused, mille vastuseid saab ennustada. Küsimuste eest saadavad punktid ja aeg, kuni milleni saab nendele vastata, võib olla erinev
  • Veebirakenduses on chat aken
  • Mängutulemused uuenevad automaatselt
  • Rakendus näeb visuaalselt hea välja


Kasutatav tehnoloogia:

  • Veebiteenus: ASP.NET Web API
  • Klient-rakendus: Angular JS


Esialgne planeeritud andmemudel. Selles mudelis puuduvad tabelid, mis on vajalikud kasutajate tuvastamiseks, kasutajatele rollide määramine ja kasutajate kontode haldamiseks.