Enneaegsed

From EIK wiki


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

Xml-list.png

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

Xml-arved.png

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.

Enneaegsed Andmemudel.PNG