Enneaegsed: Difference between revisions
From ICO wiki
Jump to navigationJump to search
No edit summary |
|||
Line 685: | Line 685: | ||
=== Veebiteenuse analüüs === | === 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. |
Revision as of 21:37, 19 April 2016
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.