Enneaegsed
From ICO wiki test
Jump to navigationJump to search
| 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).
- Alagrupimängud:
- 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.

