Dezvoltarea Unei Aplicatii Windows 8 Pentru Administrarea Activitatilor Unui Studio de Dans, cu Backend în Azure
Dezvoltarea unei aplicații Windows 8 pentru administrarea activităților unui studio de dans, cu backend în Azure
Cuprins
Introducere
1. Studiul și analiza sistemului existent
1.1 Prezentarea succintă a unității economico-sociale
1.2 Principalele activități desfășurate în unitatea economică
1.3 Studiul Sistemului de conducere
1.4 Studiul sistemului condus
1.5 Prezentarea situatiei financiare
1.6 Studiul sistemului informațional
1.6.1 Descrierea sistemului informațional
1.5.2 Modelul conceptual al datelor
1.5.3 Analiza critică a sistemului actual și identificarea neajunsurilor existente în funcționarea sistemului existent
1.5.4 Direcții de perfecționare a sistemului actual
2 Proiectarea de ansamblu a sistemului informatic
2.1 Obiectivele și oportunitatea aplicației informatice
2.2 Locul aplicației informatice în sistem
2.3 Definirea rapoartelor finale
2.4 Modelarea datelor și modelarea prelucrărilor
2.5 Diagrama Entitate-Asociere
2.6 Tehnologii utilizate
2.7 Arhitectura aplicației
2.8 Tehnologie de prelucrare
2.9 Calendarul de realizare
3. Proiectarea de detaliu a aplicației informatice
3.1 Structura aplicației pe clase și funcționalități
User
Cursant
Instructor
Administrator
Cursant_partic
Cursant_copil
3.2 Proiectarea logică și fizică a ieșirilor
3.3 Proiectarea logică și fizică a intrărilor
3.4 Proiectarea bazei de date
3.5 Proiectarea interfeței aplicației
4. Prezentarea produsului software
4.1 Cerințele platformei hardware
4.2 Descrierea funcțiilor aplicației
Ecranul principal
Înscrierea cursanților
Secțiunea “Învăță și tu”
Afișarea cursanților
Pagina Cursuri de dans
Blog
5. Eficiența și utilitatea sistemului informatic
5.1 Condiții privind implementarea aplicației
Acceptarea termenilor
Modificarea termenilor
Crearea contului
Ce nu are voie să facă utilizatorul
Datele care au caracter personal
Limitarea răspunderii
5.2. Utilitatea aplicației
Bibliografie
Anexa
CONTRACT DE PRESTĂRI DE SERVICII
CONTRACT DE PRESTĂRI DE SERVICII
Introducere
Succesul unei afaceri stă în modul cum îți folosești resursele pe care le ai la dispoziție. În lucrarea de față se propune dezvoltarea unei aplicații Windows 8 Modern UI pentru administrarea unui studio de dans: Lotus Dance. Produsul software se adresează persoanelor moderne, cu deschidere către noutatea tehnologică. Sistemul poate rula pe diferite medii: tablete, laptop-uri, pcuri cu sistem de operare Windows 8 și telefoane cu system de operare Windows Phone 8. Există patru categorii de utiliza-tori: guest, user, cursant și administrator, cu roluri specifice.
În dezvoltarea aplicației au fost utilizate tehnologii de ultimă oră: aplicația principală este realizată folosind framework-ul .NET pe bază de C# și XAML, serviciile Windows Azure se ocupă cu stocarea bazei de date SQL în cloud, serviciul Mobile Services asigură comunicarea între aplicația principală, baza de date și rețelele de socializ-are (Facebook, Twitter, Google) care furnizează profilul utilizatorului.
Aplicația, care poate fi descarcată gratuit din Market Place, se constituie intr-un veritabil instrument de promovare a activității studio-ului Lotus Dance, beneficiind de oportunitățile oferite de caracterul viral al rețelelor de socializ-are.
Trăind în secolul XXI se poate vedea tendința din ce în ce mai accentuată a oamenilor de a fi conectați, de a se îndrepta către lucruri care le fac viața cât mai ușoară. Oamenii se îndreaptă către lucruri accesibile oricărui tip de utilizator: de la un as al tehnicii avansate până la un novice în ale calculatoarelor.
Un aspect în care lumea virtuala își face simțită prezența este facilitarea accesului consumatorilor la servicii precum centre spa, săli de fitness și studiouri de dans.
În lucrarea de față se propune dezvoltarea unei aplicații Windows 8 pentru administrarea unui studio de dans. Aplicația este destinată exploatării de către patru categorii de utilizatori: guest, user, cursant și administrator. Fiecare dintre aceștia au roluri specifice care vor fi descrise în continuare.
Sunt foarte multe cazuri în care administratorii diverselor săli de dans se confruntă cu probleme când vine vorba de gestionarea cursanților și a grupelor, majoritatea alegând instrumentele tradiționale de notare a datelor: foaia și pixul. Acest lucru de datorează faptului că în momentul de față pe piața mondială nu există un soft specializat pentru așa ceva. Cu atât mai puțin un soft care să folosească tehnologii de cloud și care să poată fi folosit atât pe desktop cât și pe instrumente portabile.
Pentru utilizatorul neautentificat (guest) aplicația ofertă acces la articolele de pe blog și la informațiile publice de pe site. Pentru a se autentifica, user-ul va trebui să se logheze cu ajutorul contului de facebook, google sau twitter, acesta fiind un element de mare noutate în rândul utilizatorilor de rețele sociale. Se permite de asemenea logarea utilizatorilor Micrososft prin conturi dedicate. Din acest moment user-ul va avea posibilitatea de a se înscrie la cursuri de dans și va primi acces la un pachet de bază cu videoclipuri în care sunt prezentați câțiva pași introductivi.
O altă categorie de utilizatori este “cursantul” care are acces la toate clipurile disponibile în aplicație, dar și la istoricul propriu în ceea ce privește cursurile de dans pe care le-a urmat, datele
ședințelor și stilurile studiate.
În general, aplicația se adresează persoanelor moderne, cu deschidere către noutatea tehnologică. Produsul software poate rula pe tablete, laptop-uri și pc-uri cu sistem de operare
Windows 8. Deși Microsoft a intrat relativ de curând pe piața dispozitivelor mobile, se poate remarca ritmul rapid de acaparare a pieței. Target-ul aplicației vizează persoanele care se pot adapta ușor noii schimbări de interfață a sistemului de operare, care se familiarizează cu interfața Modern UI și cu avantajele pe care aceasta le oferă. Toate aceste categorii de utilizatori pot descărca gratuit aplicația „Lotus Dance” din Market Place. Un rol important al aplicației este acela de a promova activitatea studio-ului în rândul utilizatorilor Windows 8.
1. Studiul și analiza sistemului existent
1.1 Prezentarea succintă a unității economico-sociale
Asociația Club de Dans Sportiv “Lotus Dance” a fost deschisă în anul 2008 cu codul unic de identificare fiscală 24548648. Are două locații în prezent: una în zona Pipera și cealaltă într-o zonă mai centrală a Bucureștiului în zona Alba Iulia. Ambele zone sunt alese pentru a atrage diferite categorii de persoane. Cea din zona Alba Iulia, fiind situată aproape de gura de metrou Piața Muncii și Dristor are avantajul că poate să ajungă foarte multe persoane la cursuri și datorită faptului că este situat în mijlocul unei zone rezidențiale atrage foarte multe persoane care locuiesc în apropiere și observă activitatea de la sală.
Sala din zona Pipera este aleasă pentru că este un teren virgin, nemaiexistând concurență din partea școlilor de dans mai mari astfel că a menținerea un monopolului în acea zonă este făcut cu ușurință. Un alt factor important pentru deschiderea sălii în acea zonă este zonă este distanța foarte apropiată de două școli generale asigurând astfel un flux de copii constant care se înscriu la cursurile de dans organizate de noi.
Compania este condusă de două persoane, mamă și fiu: Coman Vichy și Coman AdrianAlexandru având ca angajați un instructor de dans sportiv, un instructor de street-dance, un contabil, un avocat și o persoană care să se ocupe de întreținerea curățeniei studioului. De asemenea cele două persoane care se ocupă de conducerea studioului sunt și antrenori de dans la Lotus Dance.
Activitățile asociației sunt de tipul prestări de servicii și cursurile se desfășoară într-un studio amenajat pe strada Popa Stoica din Farcaș Nr 92 într-o sală modern amenajată cu aer condiționat, acces wireless la internet, televizor, cabine de duș, sală de așteptare, oglinzi, parchet precum și spațiu amenajat pentru persoanele care vin direct de la serviciu și vor să servească o scurtă gustare, un ceai sau o cafea. Astfel că în sală există și o mic spațiu amenajat vânzării produselor.
Scopul funcționării este popularea dansului sportiv și predarea figurilor de dans diferitelor categorii de persoane în funcție de vârstă, nivel și venit. Pe lângă cursurile de dans oferite de studioul de dans, Lotus Dance prestează și servicii de dans în cadrul evenimentelor corporate: perechi de dansatori profesioniști care dansează pe ritmuri de tangou, vals, cha-cha, samba etc.
1.2 Principalele activități desfășurate în unitatea economică
Cursurile de dans sunt organizate în primul rând pe patru categorii de vârstă:
Copiii între 3 și 5 ani;
Copii între 6 și 12 ani; 3. Adolescenții între 13 și 17 ani;
4. Adulții de la 18 ani în sus.
După această separare urmează împărțirea în funcție de nivelul fiecăruia, astfel formând grupe pentru:
Începători
Persoanele care au în general mai puțin de un an de dans și care cunosc un număr mic de figuri și maxim patru stiluri de dans.
Intermediari
Persoanele care au între un an și trei ani experiență, cunosc un număr mare de figuri și maxim 6 stiluri de dans
Performanță
Persoanele care fie au arătat o afinitate ridicată pentru dans fie au peste trei ani experiență, ajungând să stăpânească până la 10 stiluri de dans.
Ultima separare se face în funcție de venitul, importanța și scopul urmării cursului de dans:
Ședințele de grup: Această variantă este, în general, cea mai ieftină și cea mai populară.
Prețul variază între 100 și 150 RON pe lună și cuprinde 8 ședințe de dans în grupe formate din maxim 16 persoane.
Ședințele particulare: Această variantă este aleasă de către persoanele care doresc să dobândească cunoștințe avansate într-un interval de timp mai scurt. Prețul unei ședințe particulare de dans variază între 70 și 110 RON pentru 90 de minute.
Pe lângă aceste activități, Lotus Dance oferă și spectacole de dans sportiv în cadrul business sau pentru evenimente speciale. Între două și zece perechi de dansatori profesioniști îmbrăcați al patru ace intră pe scenă și prezintă dansuri precum tango, vals, cha-cha, salsa, samba, charlestone etc.
Ultima activitate care rulează la sala Lotus Dance este aceea de vânzare a produselor semipreparate și a băuturilor răcoritoare. Acestea se vând în cameră de așteptare fie pentru părinții care își așteaptă copii fie pentru persoanele care vin direct de la serviciu, școală și nu au avut timp să ia o gustare sau să își cumpere o sticlă de apă/suc.
1.3 Studiul Sistemului de conducere
Asociația Club de Dans Sportiv “Lotus Dance” este condusă de către o echipă formată din două persoane, mamă și fiu, parteneri cu drepturi egale în cadrul studioului aceștia ocupă postul de director general.
Directorul General este cel care are grijă de toți instructorii, antrenorii și dansatorii studioului. Acesta trebuie să caute noi investitori, să conteacteze diferite persoane și companii în vederea creării de parteneriate, decide ce conținut să fie trecut pe site-ul studioului, dacă este cazul să unească grupe sau să le separe, programul sub care vor rula grupele în cadrul studioului, programul ședințelor particulare. Directorul general ia și decizia asupra oricărui tip de implicăre financiară și, dacă este cazul, închide parteneriatele care se dovedesc a fi neeficiente. Tot directorul general este cel care stabilește programa și data spectacolelor în anul care urmează precum și repartizarea perechilor de dansatori în spectacolele organizate de către noi sau la care participă studioul.
Fig. 1 Organigramă
1.4 Studiul sistemului condus
Asociația are cinci angajați fiecare cu rolurile pui specifice: doi instructori, un contabil, un avocat și o persoană care se ocupă de îngrijirea aspectului sălii.
Cei doi instructori sunt tineri de 20 respectiv 22 de ani, c minute.
Pe lângă aceste activități, Lotus Dance oferă și spectacole de dans sportiv în cadrul business sau pentru evenimente speciale. Între două și zece perechi de dansatori profesioniști îmbrăcați al patru ace intră pe scenă și prezintă dansuri precum tango, vals, cha-cha, salsa, samba, charlestone etc.
Ultima activitate care rulează la sala Lotus Dance este aceea de vânzare a produselor semipreparate și a băuturilor răcoritoare. Acestea se vând în cameră de așteptare fie pentru părinții care își așteaptă copii fie pentru persoanele care vin direct de la serviciu, școală și nu au avut timp să ia o gustare sau să își cumpere o sticlă de apă/suc.
1.3 Studiul Sistemului de conducere
Asociația Club de Dans Sportiv “Lotus Dance” este condusă de către o echipă formată din două persoane, mamă și fiu, parteneri cu drepturi egale în cadrul studioului aceștia ocupă postul de director general.
Directorul General este cel care are grijă de toți instructorii, antrenorii și dansatorii studioului. Acesta trebuie să caute noi investitori, să conteacteze diferite persoane și companii în vederea creării de parteneriate, decide ce conținut să fie trecut pe site-ul studioului, dacă este cazul să unească grupe sau să le separe, programul sub care vor rula grupele în cadrul studioului, programul ședințelor particulare. Directorul general ia și decizia asupra oricărui tip de implicăre financiară și, dacă este cazul, închide parteneriatele care se dovedesc a fi neeficiente. Tot directorul general este cel care stabilește programa și data spectacolelor în anul care urmează precum și repartizarea perechilor de dansatori în spectacolele organizate de către noi sau la care participă studioul.
Fig. 1 Organigramă
1.4 Studiul sistemului condus
Asociația are cinci angajați fiecare cu rolurile pui specifice: doi instructori, un contabil, un avocat și o persoană care se ocupă de îngrijirea aspectului sălii.
Cei doi instructori sunt tineri de 20 respectiv 22 de ani, cu deschidere către noutate și tehnologie, făcând astfel ușoară implementarea unui sistem de gestiune pe care aceștia să îl poată folosi, mai ales dacă sistemul este accesibil de pe telefoanele mobile sau tabletele acestora.o
Instructorul se ocupă cu predarea figurilor de dans syllabus după un curriculum sistematic și continuu, gradat și ataptat aptitudinilor și potențialului fizic și motric. Crearea de coregrafii simple, instruirea dansatorilor, monitorizarea și evaluarea lor în vederea trecerii în cadrul unei grupe mai avansate. De asemenea se ocupă de cursanții care optează pentru ore particulare și doresc să pregătească dansul de deschidere a nunții. Postul imediat superior este cel de antrenor, neexistând post inferior.
Antrenorul se ocupă cu predarea figurilor de dans avansate, de nivel C, B, A și S. Are nevoie de cunoștințe pedagogice și se adaptează cu ușurință diferitelor tipuri de persoane cărora le predă. Se ocupă de crearea de coregrafii complexe și colaje atât pentru cuplurile care vin să se pregătească pentru dansul de nuntă, dar și pentru cuplurile care doresc perfecționarea în arta dansului sportiv. Decide de asemenea dacă un dansator va fi avansat și trecut în cadrul unei grupe superioare. Postul imediat superior este Director General, cel inferior este de instructor.
Dansatorii profesioniști sunt cei care se ocupă de evenimentele organizate de Lotus Dance sau în parteneriat cu studioul nostru. Se deplasează la locația stabilită de client și prestează unul sau mai multe momente de dans care pot să conțină unul din următoarele stiluri de dans: dansuri clasice (vals, tango, quick step, slowfox), dansuri latino (samba, cha-cha, rumba, jive, passo doble), dansuri de club (tango argentinian, salsa, merengue, bachata), dansuri de stradă (street dance, hip-hop).
Social Media Manager se ocupă de integrarea activității offline cu cea online asigurânduse că fiecare eveniment pe care-l organizăm ajunge să fie populat pe rețelele de socializare. De asemenea se ocupă cu redactarea articolelor pe blog pentru a mări reach-ul și engagement-ul în mediul online și a se asigura de o mai bună fluiditate a link-juice-ului în cadrul site-ului de prezentare.
1.5 Prezentarea situatiei financiare
Fig. 2 Veniturile aferente ultimilor cinci ani.
1.6 Studiul sistemului informațional
1.6.1 Descrierea sistemului informațional
În momentul când o persoană se înscrie la cursurile de dans aceasta trebuie fie să completeze formularul prezent pe site-ul www.LotusDance.ro fie să ne contacteze telefonic în vederea înscrierii. Pentru rezervarea locurilor atât la orele de grup cât și la orele private, cursanții trebuie să achite un avans de 20% în cazul orelor particulare pentru rezervarea primei ședințe sau să achite abonamentul pentru luna întreagă în cazul orelor de grup și să completeze fișa de înscriere la cursurile de dans (Anexa 1, pagina 1).
Odată înscrisă persoana trebuie să aștepte, în cazul orelor de grup, ca grupa să se formeze (1214 persoane) urmând să fie înștiințata după prin telefon și e-mail de începerea noii grupe. Fișa de înscriere îi este pusă la dosar și este întocmit o fișă de prezență pentru fiecare persoană pe care trebuie să vină și să o semneze la fiecare final de ședință.
În momentul începerii grupei se întocmește și fișa pentru gruă unde în fiecare zi se va nota data la care a fost predată figura, observații cu referire la modul de predare, dacă există, și cât timp a durat aproximativ să predea acea figură. Antrenorii vor completa o fișă asemănătoare, doar că aceștia nu mai urmează un tipar de predare a figurilor și trebuie să completeze ei în tabel figura pe care au predat-o. Fișa figurilor predate împreună cu fișa grupei și cea a cursantului intră la un dosar separat unde vor fi anexate fișele de înscriere la cursurile de dans.
În cazul orelor particulare se formează o fișă diferită în care se trece activitatea din cadrul fiecărei ședințe: figuri predarte, cât timp a durat predarea figurilo, tehnici studiate.
Persoanele interesate de organizarea de spectacole acestea trebuie să vină cu cel puțin o lună înainte pentru semnarea contractului (Anexa 1, pagina 3), stabilirea datelor și alegerea perechilor de dansatori care vor veni la data evenimentului să presteze momentul de dans.
Fig. 3 Pașii urmați pentru înscrierea la cursurile de dans
1.5.2 Modelul conceptual al datelor
În principiu există trei tabele principale de care este legată întreaga bază de date: cursant, particular, copil. Acestea semnifică cele trei tipuri de cursanți care se pot înscrie la un moment la cursurile de dans oferite de Lotus Dance.
În cazul cursantului, adult, avem relație de M la N cu tabelul grupa care reprezintă grupa din care acesta face parte. În cazul cursantului ne interesează date precum: numele acestuia, telefonul, e-mail-ul, sexul și grupa din care face parte. În tabelul grupa vom avea o relația tot de M la N cu stilurile de dans care vor fi predate în cadrul acelei grupe și de M la N cu tabelul instructori, reprezentând instructorii care vor fi alocați grupei. Grupa va avea ca proprietăți cele două zile în care activează la sală, nivelul acesteia, stilul de dans predat și instructorul care îi este alocat. Ultimul tabel, instructor, vom avea nevoie de nume, telefon, e-mail și sex.
În cazul cursantului copil dispar anumite proprietăți, rămânem astfel cu nume, telefon părinte, e-mail părinte, vârstă și grupă. Avem o relația de M la N cu tabelul grupa în care vom avea o relația tot de M la N cu stilurile de dans care vor fi predate în cadrul acelei grupe și de M la N cu tabelul instructori, reprezentând instructorii care vor fi alocați grupei.
Ultimul tip de cursant este cel care alege să facă ședințele particular, tabelul are ca proprietăți:
nume, telefon, e-mail, data ședințelor și instructorul având relații de M la 1 cu data deoarece întro anumită oră și o anumită dată nu poate fi decât un singur cuplu în sală și M la 1 cu instructorul deoarece doar un instructor se poate ocupa de un cuplu.
1.5.3 Analiza critică a sistemului actual și identificarea neajunsurilor existente în funcționarea sistemului existent
Principalul lucru la care trebuie renunțat este sistemul de îndosariere care ocupă spațiu și aduce greutăți atunci când vine vorba de căutarea unui document exact. De asemenea mai apar probleme în cazul în care doi instructori își planifică în același timp o ședința de dans în același interval orar. Acest lucru nefiind permis la Lotus Dance unul dintre aceștia trebuie să sune clientul și să stabilească un alt interval pentru ședințe.
Un alt defect al sistemului actual este lipsa unei modalități de a transmite live clienților statusul sălii: locuri libere la grupe, intervale orare libere pentru ședințe particulare sau disponibilitate pentru spectacole. La fiecare telefon trebuie să comunicăm clienților toate informațiile acestea.
Alta problemă ridicată de sistemul actual este nevoie ca persoana înscrisă să vină până la sală pentru a achita avansul. De multe ori persoanelor le este greu să vină și renunță fie la curs fie să plătească avansul ajungând astfel la neplăceri.
1.5.4 Direcții de perfecționare a sistemului actual
Sistemul va avea o bază de date unde se vor putea conecta atât cursanții cât și instructorii studioului de dans. Astfel se va renunța la nevoia de a avea toate informațiile pe hârtie eliminând spațiul ocupat de documente și reușind o mai bună gestionare a datelor.
Stocarea bazei de date într-un mediu online este o direcție bună de urmat pentru a elimina problema programării ședințelor în același interval orar și va oferi o soluție pentru cursanți să vadă când au programate ședințele.
Pentru eliminarea drumului pe care cursanții trebuie să îl facă la sală pentru achitarea primei părți a cursului vom implementa un sistem de plată în cadrul aplicației. Plata se va face prin Facebook, Paypal, Windows Store sau prin virament bancar. Factura se va emite în momentul în care persoana a terminat înscrierea și detaliile de plată îi vor fi livrate pe e-mail după împreună cu chitanța dacă a decis să facă plata pe loc.
2 Proiectarea de ansamblu a sistemului informatic
2.1 Obiectivele și oportunitatea aplicației informatice
Ideea care va fi urmată în sistemul care urmează să fie conceput este simplitate: crearea unui sistem cu o interfață grafică minimalistă, dar care să aibă toate informațiile necesare.
Direcția de urmat este crearea unei platforme cu bază e date online la care se vor putea conecta atât clienții pentru a verifica disponibilitatea locurilor libere, înscrierea la cursuri de dans și urmărirea figurilor predate în timpul cursurilor de dans. Astfel vom elimina problema de a face două înscrieri în același interval de timp.
Pentru instructori sistemul va permite monitorizarea orelor pe care le-a făcut în luna în curs, ședințele pe care urmează să le țină și să facă eventuale modificări în programul actual. Datorită faptului că sistemul este conectat la o bază de date online vom evita cazul în care doi instructori stabilesc o ședință în cadrul aceluiași interval orar. De asemenea la fiecare modificare făcută de oricare dintre părți atât instructorul cât și cursantul vor fi atenționați printr-un notificare de tip toast și un e-mail.
2.2 Locul aplicației informatice în sistem
Aplicația va fi folosită ca mijloc de comunicare între instructori, între instructori și cursanți și ca mijloc de stocare a informațiilor. Informațiile vor fi stocate în cloud, putând fi accesate de oriunde în lume. Astfel eliminăm nevoia de a fi prezent la studiou pentru a putea lua un număr de telefon sau pentru a verifica când un instructor are programată o ședință.
Aplicația are trei părți care pot fi accesate: Partea de administrare accesibilă directorilor generali unde vor fi prezente statistici referitoare la numărul de persoane înscrise, stiluri preferate, locuri libere, venit în luna curentă sau în lunile care au trecut precum și să vadă în ce moment și eventual și de ce un cursant a renunțat la cursurile noastre.
Partea accesibilă de instructori și antrenori permite stabilirea cursurilor de dans, modificarea lor, cverificarea grupei pentru a vedea câte persoane mai lipsesc pentru a forma o grupă și afișarea profilului personal pentru a afla câte ședințe a predat sau când urmează să țină următoarele cursuri.
A treia parte a aplicației este cea făcută pentru client. Acesta se poate înscrie la cursurile de dans dacă dorește, vede câte persoane sunt înscrise deja, câte locuri sunt libere precum și, dacă s-a înscris, figurile care au fost predate la studio. Aplicația, parțial, va rula și ca o oglindă a siteului, mimând informațiile din site: preț, informații referitoare la cursuri, dar și blog-ul site-ului care este oricum un punct de vânzare foarte puternic.
Scopul aplicației va fi și acela de a aduce posibili noi clienți la sală. Aceasta va fi disponibilă atât pentru utilizatorii de Windows 8 cât și Windows Phone 8 iar prin faptul că produsul software va implementa sistem de login prin Facebook ne va permite, cu acordul utilizatorilor, să postăm mesaje pe wall-urile celor care folosesc aplicația să se înscrie la cursuri cu scopul de a atrage posibili noi viitori clienți după cum se poate observa în Img X.
2.3 Definirea rapoartelor finale
Fig. 4. Situația persoanelor care s-au înscris la cursurile de dans în ultimele șase luni
2.4 Modelarea datelor și modelarea prelucrărilor
Baza de date este realizată în Microsoft SQL Server și conține 13 tabele relaționate. Tabelele sunt grupate în trei categorii: o categorie conține informații despre cursanții adulți care optează pentru orele de grup, cea de a doua fiind destinată celor care aleg ședințele particulare și a treia categorie pentru cursanții, adulți sau copii, care aleg orele particulare.
Atributele exprimă caracteristici și proprietăți a sistemului economic analizat și a asocierilor dintre componente. În mod curent, atributele sunt asociate entităților. Fiecare entitate conține un număr de atribute:
CURSANT
Id, nume, telefon, e-mail, sex, rank, grupa, confirmat, pachet, containerName, resourceName, sasQueryString, imageUri, channel.
COPIL
Id, nume, telefon, email, varsta, grupa.
PARTICULAR
Id, nume, telefon, email, sex, sedinte, instructor.
INSTRUCTOR
Id, nume, email, telefon, sex.
GRUPA
Id, zi1, zi2, nivel, id_instructor
STIL
Id_stil, stil.
DATA_SEDINTA
Id, data, ora
COPIL_GRUP
Id,, idCopil, idGrup
CURSANT_GRUP
idCursant, idGrup
REL_PARTIC_DATA
Id, DataId, particID
CURSANT_LUNA
IdCursant, idGrup
STIL_GRUP
IdStil, IdGrup
2.5 Diagrama Entitate-Asociere
Fig. 6. Diagrama entitate-asociere a bazei de date
O particularitate o reprezintă tabela „cursant”. Aceasta are ca și cheie primară câmpul ID generat automat printr-o secvență javascript în momentul inserării unei înregistrări. Următoarele câmpuri din tabel sunt informațiile generale despre cursant (nume, sex, e-mail, telefon, grupă și rank). În câmpurile “containerName”, “resourceName”, “sasQueryString” și ”imageUri” vor fi stocate câmpurile necesare sustragerii informațiilor de tip blob pentru a afișa poza de profil a fiecărui cursant în parte.
2.6 Tehnologii utilizate
Windows Azure Mobile Service este un serviciu oferit de Microsoft lansat cu scopul de a facilita dezvoltarea unor aplicații mobile de top. Mobile Services unește un set de servicii Windows Azure care creează un backend foarte puternic pentru aplicații: sistem de gestionare a tabelelor, integrarea notificărilor și serviciilor push și toast, integrarea providerilor de identitate pentru autentificare, posibilitatea de integrare cu alte servicii de tip cloud, posibilitatea de scalarizare a unei instanțe de servicii.
Baza de date Microsoft Windows Azure SQL extinde capabilitățile unui server obișnuit prin găzduirea în cloud. Folosind serviciul Windows Azure SQL Database un utilizator își poate crea o bază de date ușor de relaționat și de întreținut. Beneficiile sunt: manevrabilitate, grad foarte mare de disponibilitate, posibilitatea scalarizării, un model deja cunoscut de baze de date și un model de bază de date relațional. Un alt atuu foarte important a stocări în baza de date Microsoft Windows Azure SQL este replicarea datelor. Acestea fiind replicate de trei ori, tolerând astfel eventuale greșeli în lucrul cu date și ușurință în cazul în dorim să revenim la un backup mai vechi deoarece ștergerea unei înregistrări, tabele sau a întregii baze de date nu este o greșeală fatală.
Serviciul de Storage furnizat de Microsoft oferă aplicației acces la servicii de tip blob pentru date binare de dimensiuni mari, tabele pentru stocare non-relațională și queue pentru transmiterea de mesaje între aplicații. Un cont de storage poate să aibă unul sau mai multe containere care să conțină diferite blob-uri. Blob-urile pot fi de dimensiuni mari de până la 50 gigabiți, și pentru transferul mai ușor de blob-uri, acestea pot fi subdivizate în blocuri. Astfel că în cazul unei erori de transmitere nu va fi nevoie să se retransmită întregul blob ci o să se transmită de la blocul de date de unde s-a tăiat conexiunea.
XAML este un limbaj de programare declarativ folosit în framework-ul .NET pentru a separa design-ul interfeței de funcționalitatea ei. Design-ul este controlat prin cod XAML, în timp ce programarea funcționalităților implementată în C# se realizează în partea de code-behind.
SDK-ul Facebook pentru Javascript are un set vast de instrumente pe care utilizatorii îl pot folosi pentru a adăuga butoane de like sau alte plugin-uri sociale, pentru a implementa un sistem de login prin intermediul Facebook, pentru a lansa căsuțe de dialog prin care lumea să poată împărtășii diferite povești, pentru a se folosi cu ușurință de API-ul Graph al Facebook-ului și chiar pentru a comunica prin intermediul unei aplicații.
2.7 Arhitectura aplicației
Din punctul de vedere al tehnologiilor utilizate, aplicația este structurată pe patru nivele:
Baza de date: Include partea de stocare și gestiune a informațiilor. Acest nivel este folosit pentru prelucrări rapide pe volum mare de date oferind securitate sporită și posibilitatea de export în diferite formate (excel, pdf, xml, text etc)
Serverul Mobile Services asigură legătura între nivelul 3, 4 și nivelul 1 (serverul SQL), ocupându-se de validarea informațiilor de logare, de prelucrarea datelor și inserarea lor în baza de date.
Tehnologia .net și limbajul C# permit dezvoltarea de module flexibile, ușor de adaptat la cerințele particulare ale clienților și la modificările legislative. Acesta este nivelul care implementează funcționalitatea aplicației, el primește datele, le analizează și le serializează pentru a fi trimise la nivelul 3 unde vor fi prelucrate. Tot la acest nivel se primesc și pachetele serializate din server și sunt descompuse pentru a fi servite listării.
Limbajul XAML este cel care ajută la crearea unui sistem modern cu interfață ergonomică și intuitivă. Este nivelul care determină interfața produsului software, utilizatorul interacționând cu aplicația prin intermediul controalelor definite prin XAML.
Fig.7 Cele patru nivele ale aplicației
În ceea ce privește transferul de informație în cadrul aplicației Lotus Dance acesta se realizează între cele patru componente principale (figura 2): Aplicația client de tip Modern UI, serviciul Mobile Services, baza de date SQL și sistemul de login Facebook, Google, Twitter și Microsoft, urmând pașii:
Introducerea datelor de autentificare și transmiterea lor către Mobile Services;
Transmiterea datelor de logare către serviciul de autentificare al Facebook, Google, Twitter sau Microsoft în vederea verificării și identificării utilizatorului.
Recunoașterea utilizatorului și transmiterea informațiilor de profil și a token-ului de acces către Mobile Services.
Prin intermediul Mobile Services, aplicația primește de la rețeaua de socializare acreditarea utilizatorului care s-a autentificat.
Odata logat aplicația postează pe profilul utilizatorului, la opțiunea acestuia, informații despre înscrierea sa la cursurile de dans.
Aplicația locală poate să comunice informații serializate de la și către Mobile Services.
Pachetul de date este introdus în baza de date SQL numai dacă pachetul vine cu token-ul de acreditare potrivit din partea Facebook.
Fig. 8. Transferul de informație între principalele componente ale aplicației
2.8 Tehnologie de prelucrare
Hardware:
Laptop: Procesor i3 2.40 GHz, 8GB ram, 1TB spațiu de stocare folosit atât pentru a reda melodiile cât și pentru gestionarea studioului de dans. Prețul de achiziție este două mii de lei.
Sistem audio: Aplificator audio conectat la laptop pentru citirea melodiilor și cinci boxe și un subwoofer pentru redarea melodiilor. Prețul întregului sistem este trei mii de lei.
Router Wireless: Folosit datorită nevoii de a comunica cu baza de date din cloud pe care o are aplicația și datorită faptului că persoanele care vin la sală se pot conecta la internet în cazul în care au pauză sau au ajuns prea devreme. Prețul de achiziție este de două sute lei.
Aparat foto Nikon D5100: Folosit pentru a livra conținut către Social Media Manager pe care acesta îl publică în cadrul rețelelor de socializare pentru a mări reach-ul studioului. Preț de achiziție două mii două sute lei.
Software:
Toate pachetele Microsoft au fost achiziționate prin parteneriatul BizSpark pe care Lotus Dance îl are cu Microsoft. Astfel încât prețurile au fost reduse la zero. Parteneriatul este valabil între doi și cinci ani și după terminarea perioadei de parteneriat o parte din produsele software pot fi folosite în continuare.
Licență Windows Azure: Windows Azure este o platformă creată de Microsoft pentru a crea, a face deploy și a administra servicii și aplicații de oriunde de pe glob prin intermediul centrelor de date Microsoft. Alegerea de a lucra cu Windows Azure a fost făcută datorită faptului că nu există un abonament lunar ci plătești fix volumul de date pe care-l foloești și, dacă este cazul, să se poată mări numărul de resurse alocate pentru susținerea aplicației în mod automat. Acest lucru dovedindu-se un adevărat avantaj față de metoda clasică de a avea o bază de date pentru care fie ar fi trebui să se plătească întreaga arhitectură, mentenanța, back-up-ul fișierelor și eventual plata diferitelor defecțiuni hardware care ar fi putut să apară după un an sau doi de funcționare. Din estimări prețul pentru serviciul azure este de aproximativ cincizeci de euro / an, dar datorită faptului că studioul Lotus Dance a fost încadrat în programul BizSpark de startup-uri prețul este inexistent.
Visual Studio Professional 2013: Un mediu de programare integrat oferit de Microsoft a fost ales datorită monopolului pe care-l prezintă Windows-ul pe piața calculatoarelor de birou și datorită nivelului din ce în ce mai mare ca și cotă de piață a telefoanelor mobile cu sistem de operare Windows Phone 8. Folosit pentru dezvoltarea aplicației, viitoare update-uri, Visual Studio este o unealtă de importanță maximă pentru dezvoltarea produsului software. Prețul unei licențe este de aproximativ cinci sute de dolari, dar datorită programului BizSpark acesta este livrat în mod gratuit.
Windows 8.1: Folosit ca sistem de operare pentru laptop-ul de la sală și ca sistem de rulare pentru aplicația care va fi folosită pentru administrarea studioului. Principalul motiv pentru care s-a ales Windows 8.1 este noutatea tehnologică de care acesta dă dovadă fiind construit pentru touch, interfață intuitivă și primită gratuit din programul BizSpark. O licență de Windows 8 are prețul de o sută două zeci de dolari.
Suita de pachete Office 2013: Folosite pentru redactarea documentelor oficiale, a listelor de prezență, a programului sălii, programului spectacolelor și a fișelor cursanților. De asemenea folosim outlook pentru citirea și trimiterea e-mail-urilor. Prețul pentru suita Office 2013 Home și Office este de o mie o sută lei.
2.9 Calendarul de realizare
Realizarea bazei de date: o lună.
Dezvoltarea produsului software: trei luni
Implementarea soluției: o lună
Testarea și lansarea: o lună
Fig. 9 Calendardul de realizare
3. Proiectarea de detaliu a aplicației informatice
3.1 Structura aplicației pe clase și funcționalități
Aplicația are la bază o clasă abstractă denumită USER. Din user moștenim clasele:
instructor, cursant și administrator. Cele patru clase reprezintă cele patru tipuri de utilizatori ai aplicației.
Fig. 10. Clasa abstractă USER și clasele care o moștenesc
Cursanții sunt de trei feluri, cursanții care vin la orele de grup pentru adulți, cursanții care vin la orele de grup pentru copii și cei care iau ore particulare, astfel încât, clasa cursant este moștenită de clasa particular și copii.
În cele ce urmează vom vedea mai în detaliu cum se formează legăturile între clase, care sunt proprietățile acestora și metodele specifice fiecărei categorii de utilizator.
Fig. 11 Clasele aplicației cu proprietăți și metode
User
User este o clasă abastractă care nu va fi propriu-zis folosită. În schimb, din aceasta derivă principalele clase ale aplicației: cursant, instructor și administrator.
Ca și proprietăți, clasa user are:
Nume: de tip string, loc unde va fi stocat numele și prenumele persoanei care va fi înregistrată.
E-mail: de tip string, este modul principal de înregistrare în interiorul aplicației, pentru user-ul normal aceasta este opțională iar pentru userii care doresc să se înregistreze, aceasta va fi sustrasă prin intermediul contului de Facebook, Google+ sau Twitter.
Rank: pentru a putea beneficia de anumite facilității, am introdus proprietatea rank care se updatează automat la anumite perioade de timp. Cu ajutorul proprietății rank, cursantul are acces la anumite reduceri sau la anumite evenimente pe care le organizează Lotus Dance. De asemenea, prin intermediul proprietății RANK facem și diferențierea la nivel de accesare de informații cu referire la cine a făcut cererea (un instructor, un administrator, un antrenor sau un cursant).
Sex: de tip string, această informație este luată fie prin intermediul rețelelor de socializare (dacă avem acces la această informație), fie prin intermediul formularului de înregistrare. Pentru cursanți este un atribut obligatoriu și esențial pentru a verifica proporționalitatea grupelor, iar pentru instructori un detaliu la fel de important pentru a asigura sexe diferite în cadrul orelor particulare.
Telefon: de tip string, acesta va fi completat în momentul înscrierii cu ajutorul formularului de contact. Este modalitatea principală de contact în cazul în care are loc modificarea vreunei ore.
Image_url: de tip string, aici va fi stoca string-ul care va face trimitere către imaginea profilului utilizatorului. Această informație va fi luată fie de pe profilul de Facebook, Google+ sau Twitter al utilizatorului sau, dacă dorește, poate să încarce el una personalizată prin intermediul aplicației.
sasQueryString: din motive de siguranță, avem nevoie de o semnătură care să valideze fiecare intrare și accesare a Blob-urilor, string-ul asociat fiecărei interogări va fi stocat în sasQueryString. De specificat că fiecare semnătură SAS este validă doar pentru cinci minute de la validarea acesteia în contextul în care nu mai este apelată sau folosită, în caz contrar aceasta mai primește încă cinci minute ca durată de viață.
resourceName: în resourceName vom stoca fix adresa din blog a imaginii. Aceasta vine sub forma de “nume_poză” + “.jpg”.
containerName: informația legată de poza utilizatorului va fi stocată în Windows Azure, aceasta este de tip Blob și pentru a fi accesată, avem nevoie de adresa de Blobului. Aceasta va fi stocată în containerName.
Ca un rezumat al modului de operare a stocării de tip BLOB: Image_url ne va spune url-ul unde se găsește imaginea, pentru accesarea url-ului avem nevoie de o semnături de tip SAS care este valabilă doar 5 minute de la crearea acesteia, pentru accesarea fișierului trebuie să știm locul unde aceasta este stocată (containerName) și numele exact (resourceName) pentru a o putea identifica și a o folosi.
Metodele clasei:
void rezerva: o metodă care va fi folosită de toate celelalte clase care moștenesc pe USER.
Cursantul, instructorul sau administratorul pot să înscrie persoane la cursurile de dans apelând această metodă. Ca parametrii de intrare, aceasta are: nume, sex, e-mail, telefon, grupa, rank_i, rank_sender. În momentul apelării aceste funcții, se va forma o clasă cursant, instructor sau administrator (în funcție de rank_i care îi este atribuit), informația va fi serializată și trimită în Windows Azure pentru stocare, urmând ca utilizatorul să își poată adăuga poză de profil ulterior sau să își modifice anumite date.
void rank: o metodă de tip get/set pentru a putea stabili gradul de acces al utilizatorului în cadrul aplicației.
void self_modi: o metodă care permite utilizatorului să își modifice anumiți parametrii din cadrul profilului personal.
Cursant
Cursantul este persoana care s-a înscris la un curs, fie că a fost sau nu acceptat. În momentul înscrierii, cursantul are acces la anumite statistici în cadrul aplicației. CURSANT fiind o clasă moștenită din USER are aceleași proprietăți specificate mai sus, dar și următoarele:
Confirmat: proprietate de tip boolean, în momentul înscrierii a unei persoane la un curs, valoarea acesteia este false, în momentul în care un instructor, antrenor sau administrator confirmă înscrierea aceasta devine true și cursantul are acces la funcțiile suplimentare ale aplicației.
Grupa: proprietate de tip string, vor fi stocate informațiile referitoare la grupa unde cursantul dorește să facă cursurile de dans sau, în cazul orelor particulare, data primei ședințe.
Pachet: o proprietate de tip string, aceasta arată pachetul pe care un cursant l-a ales. Acesta face referire strict la ce fel de abonament a ales (clasificat în funcție de numărul de ședințe sau numărul de luni, în cazul orelor de grup)
Stil: o proprietate de tip string, va arăta stilurile de dans pe care cursantul a ales să le urmeze.
Id_c_grup: pentru o mai bună indexare, fiecare cursant o să aibă propriul lui ID, acesta va fi generat automat, dacă utilizatorul nu dorește să se înregistreze prin intermediul rețelelor de socializare, sau va fi folosit id-ul unic dat de Facebook, Google+ sau Twitter în momentul primei înregistrări al utilizatorului pe una din cele trei rețele de socializare. În momentul înregistrării, id-ul dispozitivului va fi asociat cu cel al userului, astfel încât se vor putea trimite notificări de tip push și toast către acesta, asigurându-ne că primește mai rapid diferitele informații.
Ca metode, clasa CURSANT are următoarele:
Void getVideo: fără parametrii de intrare, aplicația permite descărcarea clipului selectat de pe platforma YouTube și redarea acestuia în cadrul aplicației. Pentru o indexare mai bună a filmelor urmărite, cererea se face prin intermediul serviciului de cloud.
Void signal: cu ajutorul acestei metode, cursantul poate să alerteze instructorul care îi este asignat sau administratorul cu referire la imposibilitatea de a ajunge la o ședință. În cadrul orelor particulare, acesta va fi pus să reprogrameze ședința urmând să primească confirmare prin intermediul aplicației. Confirmarea va veni fie de la instructor fie de la administrator.
Instructor
Clasă moștenită din USER, INSTRUCTOR are o parte din posibilitățile de administrare ale unui administrator, dar nu toate. Proprietățile acestuia sunt:
Grupa: proprietate de tip string, aceasta arată grupa care îi este asignată instructorului.
Id_instr: pentru o mai bună indexare, fiecare instructor o să aibă propriul lui ID, acesta va fi generat automat, dacă nu dorește să se înregistreze prin intermediul rețelelor de socializare, sau va fi folosit id-ul unic dat de Facebook, Google+ sau Twitter în momentul primei înregistrări al utilizatorului pe una din cele trei rețele de socializare. În momentul înregistrării, id-ul dispozitivului va fi asociat cu cel al instructorului, astfel încât se vor putea trimite notificări de tip push și toast către acesta, asigurându-ne că primește mai rapid diferitele informații.
Metodele clasei INSTRUCTOR sunt:
Add_crs: instructorul poate să adauge un cursant direct în cadrul unei grupe, fără a fi nevoie să facă înainte rezervarea locului. Ca parametrii de intrare, aceasta are: nume, sex, e-mail, telefon, grupa, rank_i, rank_sender. În momentul apelării aceste funcții, se va forma o clasă cursant, informația va fi serializată și trimisă în Windows Azure pentru stocare, urmând ca utilizatorul să își poată adăuga poză de profil ulterior sau să își modifice anumite date prin
intermediul aplicației.
Modif: instructorul poate să modifice data programării unei ședințe particulare sau ora acesteia. În momentul în care orice tip de modificare a fost făcută, persoana implicată va primi o notificare de tip toast pe dispozitiv precum și un e-mail care să îl informeze cu referire la modificarea făcută.
Administrator
Proprietățile clasei sunt următoarele:
Id_admin: pentru o mai bună indexare, fiecare administrator o să aibă propriul lui ID, acesta va fi generat automat, dacă nu dorește să se înregistreze prin intermediul rețelelor de socializare, sau va fi folosit id-ul unic dat de Facebook, Google+ sau Twitter în momentul primei înregistrări pe una din cele trei rețele de socializare. În momentul înregistrării, id-ul dispozitivului va fi asociat cu cel al instructorului, astfel încât se vor putea trimite notificări de tip push și toast către acesta, asigurându-ne că primește mai rapid diferitele informații. Specific administratorului este faptul că Id-ul poate fi generat doar rulând aplicația din serviciul de cloud. Astfel că nu vor exista probleme de securitate prin accesarea informațiilor de către persoane nedorite.
Metodele clasei:
Add_cursant: metodă de tip void, este folosită pentru adăugare instantă a unei persoane la cursuri fără a fi necesară confirmarea unei alte persoane. Ca parametrii de intrare, aceasta are: nume, sex, e-mail, telefon, grupa, rank_i, rank_sender. În momentul apelării aceste funcții, se va forma o clasă cursant, informația va fi serializată și trimisă în Windows Azure pentru stocare, urmând ca utilizatorul să își poată adăuga poză de profil ulterior sau să își modifice anumite date prin intermediul aplicației.
Add_instructor: metodă de tip void, este folosită pentru adăugarea unui instructor în sistem.
Fiind, de asemenea, și singura metodă de a face așa ceva. Ca parametrii de intrare, aceasta are: nume, sex, e-mail, telefon, grupa, rank. În momentul apelării aceste funcții, se va forma o clasă instructor, informația va fi serializată și trimisă în Windows Azure pentru stocare, urmând ca utilizatorul să își poată adăuga poză de profil ulterior sau să își modifice anumite date prin intermediul aplicației.
Delete: metodă de tip void, administratorul este singurul care are voie să “șteargă” cursanți, date, ședințe din sistem. Folosim ghilimele deoarece datele nu vor fi șterse ci doar mutate într-un alt tabel fantomă pentru generarea altor rapoarte suplimentare.
Modif: administratorul poate să modifice data programării unei ședințe particulare sau ora acesteia. În momentul în care orice tip de modificare a fost făcută, persoana implicată va primi o notificare de tip toast pe dispozitiv precum și un e-mail care să îl informeze cu referire la modificarea făcută.
Cursant_partic
Clasa CURSANT_PARTIC este moștenită din clasa CURSANT. Aceasta îi ia toate proprietățile și metodele (pe care nu le vom mai discuta aici, fiind prezentate anterior), dar are în plus următoarele proprietăți:
Data_nunta: proprietate de tip date, va fi stocată data nunții sau data evenimentului pentru care se pregătește cursantul în vederea repartizării optime a orelor de curs. Această dată va
fi folosită și în alte ocazii pentru a trimite notificări cursantului propriu-zis cu urări de “La mulți ani” sau a altor urări specifice.
Id_p_grup: Proprietate de tip string, fiecare cursant o să aibă propriul lui ID, acesta va fi generat automat, dacă utilizatorul nu dorește să se înregistreze prin intermediul rețelelor de socializare, sau va fi folosit id-ul unic dat de Facebook, Google+ sau Twitter în momentul primei înregistrări al utilizatorului pe una din cele trei rețele de socializare. În momentul înregistrării, id-ul dispozitivului va fi asociat cu cel al userului, astfel încât se vor putea trimite notificări de tip push și toast către acesta, asigurându-ne că primește mai rapid diferitele informații.
Melodie: proprietate de tip string, va stoca melodie pe care un cursant a ales-o pentru nunta sau evenimentul acestuia.
Sedinta: proprietate de tip date, vor fi stocate datele ședințelor pentru rezervarea locului în sală și rezervarea orei instructorului.
Cursant_copil
Clasă moștenită din clasa CURSANT, CURSANT_COPIL moștenește toate proprietățile și metodele prezentate mai sus, dar mai are trei proprietăți aparte:
Id_coil_grup: Proprietate de tip string, fiecare cursant o să aibă propriul lui ID. În momentul înregistrării, id-ul dispozitivului va fi asociat cu cel al userului, astfel încât se vor putea trimite notificări de tip push și toast către acesta, asigurându-ne că primește mai rapid diferitele informații. Datorită politicilor de folosire a aplicației, copilul nu are voie să se înregistreze în aplicație cu ajutorul rețelelor sociale decât dacă are vârsta minimă de 13 ani.
Varsta: pentru crearea optima a grupelor, este nevoie să știm vârsta copilului. Aceasta va fi completată în formularul de înscriere în momentul în care copilul sau părintele îl înregistrează la curs.
Nume_parinte: proprietate de tip string, va salva numele părintelui sau tutorelui legat al copilului.
3.2 Proiectarea logică și fizică a ieșirilor
Ieșirile sistemului conține rapoarte generate în cadrul sistemului cât și în exteriorul acestuia, astfel încât putem să facem o mai bună evaluare în modul cum a evoluat produsul, să vedem rada de adopție a aplicației, numărul de persoane înscrise prin intermediul aplicației și și a numărului de persoane înscrise prin intermediul altor produse (site web).
Statisticile din cadrul aplicației pot fi vizualizate și analizate direct, din cadrul aplicației, descărcate pentru a le vizualiza local sau trimise prin e-mail.
Raportul de adopție a aplicației: putem urmări câte persoane au instalat aplicația într-o perioadă de timp, eventualele erori pe care utilizatorii le-au întâmpinat, numărul de persoane care folosesc zilnic aplicația și putem urmări numărul de dezinstalări a aplicației.
Raportul de activitate: putem urmări numărul de persoane înscrise din cadrul aplicației și numărul de persoane care s-au înscris din afara acesteia. De asemenea, putem urmări repartizarea cursanților în funcție de grupă și în funcție de stilurile pe care le-au ales precum și Rata de abandon a cursurilor.
Raportul de activitate individual: Ca administrator putem urmări atât raportul per ansamblu al grupelor sau a întregii activități cât și activitatea individuală pe care o are un anumit cursant. Putem determina ce stiluri de dans a ales cineva să urmeze, orele la care acesta dorește să vină, de cât timp vine la cursuri precum și detalii referitoare la metoda de plată pe care o dorește.
Raportul de activitate personal: Ca și persoană înscrisă la cursuri poți vedea pe pagina profilului tău, și poți extrage, raportul privind cursurile pe care le-ai urmat, stilurile de dans pe care le-ai studiat cel mai mult. Îți poți edita datele personale, poți urmări de cât timp urmezi cursurile și data scadentă a următorului curs.
3.3 Proiectarea logică și fizică a intrărilor
În principiu, datele referitoare la activitatea aplicației este vizualizată cu ajutorul inserării codului de urmărire Google Analytics.
Pentru o mai bună funcționare a procesului de înscriere s-a urmărit îndepărtarea elementelor de tip chrome și implementarea unei înscrieri secvențiale. Astfel încât, în primă fază, persoane care dorește să se înscrie trebuie să își completeze numele, sexul sau dacă este cazul să specifice că urmează să vină două persoane, în cuplu, numărul de telefon, adresa de e-mail și ce abonament dorește.
În funcție de abonamentul selectat, acesta va avea de mai multe opțiuni:
În cazul unei persoane care se înscrie la cursurile de dans, pentru adulți, de grup, trebuie să aleagă stilurile de dans pe care le dorește, zilele și intervalul orar în care poate să urmeze cursurile.
În cazul în care persoane a ales să se înscrie la cursurile de dans pentru nuntă, aceasta va trebui să aleagă zilele și orele de la care este disponibil pentru a urma cursurile de dans private.
Dacă este vorba de înscrierea unui copil, trebuie specificată vârsta, dacă mai are experiență de dans sau dacă preferă o anumită zi și oră pentru cursuri.
Al treilea pas constă în alegerea metodei de plată, aceasta poate fi cash (la sediul Lotus Dance), prin transfer bancar (prin emiterea unei facturi care va fi trimisă prin e-mail) sau cu ajutorul serviciului Microsoft de „In An Purchase” (IAP). Cu ajutorul serviciului de IAP, consumatorul poate să achiziționeze direct din cadrul aplicației abonamentul pe o lună de zile la sala Lotus Dance. Acesta vine sub formă de serviciu în interiorul aplicației, urmând ca persoana înscrisă să vină la sală pentru a finaliza înscrierea direct în ziua când se încep cursurile.
3.4 Proiectarea bazei de date
În capitolul precedent am început să studiem arhitectura bazei de date, acum vom intra în detaliu cu referire la fiecare tabel în parte. Ce înregistrări are, de ce tip este data și orice alte informații vitale mai sunt. După cum am specificat, baza de date a fost dezvoltată în Microsoft Windows Azure, tabelele care o compun sunt următoarele:
Fig. Tabela CURSANT
Fig Tabela COPIL
Fig Tabela INSTRUCTOR
Fig Tabela PARTICULAR
Fig Tabela CRS_GRP
Fig Tabela CRS_LUNA
Fig Tabela COPIL_GRUP
Fig Tabela GRUPA
Fig Tabela DATA
Fig Tabela LUNA
Fig. Tabela REL_PARTIC_DATA
Fig. Tabela STIL
Fig. Tabela STIL_GRUP
3.5 Proiectarea interfeței aplicației
În construirea aplicației s-au ținut cont de anumite specificații și sugestii care au venit cu sistemul de operare Windows 8, acestea au fost urmate pentru a oferi utilizatorilor o experiență cât mai plăcută și ușoară:
Conținut înainte de elemente chrome: s-a renunțat la orice element care ar putea să distragă atenția utilizatorului de la funcția de bază a aplicației. S-au separat pașii de înscriere și cei de verificare a cursanților pentru a mai bună tranziție între acestea.
Mai puțin înseamnă mai mult: am renunțat la barele de marcaj care veneau cu interfața obișnuită de Windows și am trecut pe un aranjament de tip grid de dimensiuni diferite, în funcție de nivelul de administrare:
o După ce utilizatorul a intrat prima dată în aplicație, acesta poate să vadă aplicația în layout-ul clasic de 3 x 2, având acces la:
Informațiile legate de cursuri
Informațiile legate de echipa Lotus Dance
Tarifele practicate de către Lotus Dance
Posibilitatea de a vizualiza perechile disponibile pentru spectacole
Blog-ul site-ului
Modalități de contact
Fig Ecranul pentru utilizatorul de tip guest
Dacă utilizatorul dorește să acceseze informațiile ulterioare oferite de către aplicație, acesta trebuie să se înregistreze cu ajutorul contului de Facebook, Google sau Microsoft, astfel va avea acces la:
Posibilitatea de a se înscrie la cursuri
Posibilitatea de a urmări clipurile cu instrucțiuni video în care sunt prezentați pașii predați
Fig Ecranul pentru utilizatorul de tip cursant
Dacă utilizatorul care s-a înregistrat în aplicație este și administrator, atunci acesta va avea acces la fereastra de listare a cursanților, precum și acces la statisticile oferite.
Fig Ecranul pentru utilizatorul de tip cursant
Interfața, de asemenea, poate fi adaptată pentru modul panoramă și portret pentru
dispozitivele care vin cu giroscop sau poate fi împărțită astfel încât să ocupe doar o porțiune din ecran.
Am renunțat la elementele de gri sau alb clasic și am încercat să îi dăm o notă personală aplicației prin gradientul de roșu/vișiniu specific site-ului.
4. Prezentarea produsului software
4.1 Cerințele platformei hardware
Pentru a rula aplicația, în primul rând, ai nevoie de sistemul de operare Windows 8. Pentru acesta trebuie să ai următoarele cerințe minime:
Procesor: Putere de 1GHz cu suport pentru PAE, NX și SSE2.
RAM: 1 gigabyte pentru un sistemul de operare pe 32 de biți sau 2 gigabyte dacă rulezi sistemul pe 64 de biți.
Spațiu hard disk: 16 GB pentru sistemul de operare pe 32 de biți sau 20 GB pentru sistemul de operare pe 64 de biți.
Placă video: dispozitiv care să suporte minim Microsoft DirectX 9 cu driver WDDM.
Pentru a utiliza aplicația la întregul ei potențial ai nevoie și de următoarele:
Tabletă sau monitor care să suporte gesturi multitouch.
Rezoluție minimă de 1366 x 768 pentru a putea trimite aplicație în modul snapped.
Cont Facebook, Microsoft sau Google.
Conexiune la internet (este posibil să existe taxe suplimentare în funcție de ISP)
4.2 Descrierea funcțiilor aplicației
Ecranul principal
Ecranul principal al aplicației este organizat sub formă de tile, specific aplicațiilor Windows 8 (Modern UI). De aici utilizatorul poate opta, prin selectarea unui tile, pentru vizualizarea mai multor categorii de informații: tarife practicate, locația sălii, detalii despre echipă și altele. De asemenea, în funcție de rank-ul user-ului, pot fi făcute înscrieri pentru diferite cursuri sau poate fi confirmată participarea la evenimentele organizate, se poate face listarea și statistica cursurilor, iar user-ul poate chiar să urmărească blogul și să învețe diferiți pași de dans.
Înscrierea cursanților
Tile-ul de adăugare înscrie user-ul înregistrat în procesul de setare a profilului, proces care constă în parcurgerea a trei pași:
Pasul 1. În cadrul primului pas, utilizatorul are posibilitatea de a vizualiza datele preluate automat din contul de facebook, microsoft, google sau twitter, identificate pe baza informațiilor de autentificare. Datele ce pot fi preluate sunt: nume, sex și poză de profil. Utilizatorul poate efectua modificări asupra numelui și pozei de profil, își va completa adresa de e-mail și va alege tipul abonamentului, precum și dacă urmează să vină la cursuri singur sau în cuplu.
Pasul 2.1. Dacă tipul de abonament este de adult pentur oră de grup, atunci pasul al doilea presupune alegerea stilurilor de dans pe care le va studia precum și a programului de frecventare a cursurilor.
Pasul 2.2 Dacă programul ales este pentru a orelor particulare, pasul al doilea presupune stabilirea
primei ședințe și a numărului total de lectii pe care dorești să le achiziționezi.
Pasul 2.3 Dacă dorești să îți înscrii copilul la cursuri, trebuie să specifici vârsta, dacă mai are experiență și ce stiluri de dans te-ar interesa pentru cel mic.
Pasul 3. Ultimul pas constă în selectarea metodei de plată care poate fi: plată în numerar, prin transfer bancar sau printr-un serviciu de plată electronică. Sistemul de plată electronică prevede un procedeu de cumpărare prin intermediul aplicației a unui abonament sub formă de licență a aplicației.
Secțiunea “Învăță și tu”
În cadrul secțiunii “Învăță și tu” sunt prezentate diferite figuri de dans structurate pe grad de dificultate și pe stiluri. Acesta fiind unul dintre avantajele pe care le furnizează descărcarea aplicației de către consumator: posibilitatea de a învăța să danseze din confortul propriei case. Pașii sunt explicați din punctul de vedere al fetei, al băiatului și din punctul de vedere al cuplului. Utilizatorul autentificat are acces la o gamă mai largă de figuri de dans.
Afișarea cursanților
În pagina de afișare, administratorul poate vizualiza lista completă a persoanelor înscrise, precum și detaliile fiecărui participant la cursurile de dans, poate aproba înscrieri și, eventual, modifica anumite date. Pentru confirmarea și înregistrarea cursanților, administratorul sau instructorul doar trebuie să facă swipe din dreapta în stânga cu persoana pe care o dorește și înreigstrarea este considerată efectuată.
Prin selectarea unui cursant se va afișa pagina cu detalii despre profilul acestuia. Administratorul poate modifica grupa la care este înscris cursantul.
Statistici
În secțiunea avansată a paginii de listare administratorul va putea afișa statistici foarte clare asupra numărului de bărbați vs număr de femei înscrise, suma totală încasată pentru fiecare lună și chiar să vadă dacă veniturile sunt în creștere sau în urcare de la o lună la alta. Altă posibilitate pe care o oferă pagina de statistici este aceea de a vizualiza în timp real ce pachete sunt cele mai avantajoase, ce grupe și intervale orare sunt cele mai căutate și câte locuri libere sunt în cadrul fiecărei grupe.
Pagina Cursuri de dans
Prin selectarea tile-ului „Cursuri de dans” utilizatorul poate vizualiza informații despre diferitele cursuri pe care le organizează studio-ul. Pagina are rol de promovare, ea lansează o invitație cititorilor de a se înscrie la anumite cursuri de dans grupate în trei categorii: cursuri de dans adulți, cursuri de dans private și cursuri de dans pentru copii. Aceste informații sunt descărcate automat de pe site prin intermediul unui cititor de conținut de tip RSS implementat în aplicație.
Blog
Pe pagina Blog utilizatorul are acces la articolele postate. Accesul se realizează prin inter
mediul unui RSS reader implementat în XAML. Gestiunea articolelor se face
de către administrator prin intermediul platformei WordPress. Articolele sunt vizibile tuturor catg oriilor de utilizatori ai aplicației.
5. Eficiența și utilitatea sistemului informatic
5.1 Condiții privind implementarea aplicației
Acceptarea termenilor
Prin accesarea aplicației și prin continuarea folosirii acesteia utilizatorul este de acord cu termenii și condițiile Lotus Dance. Dacă utilizatorul în orice moment a rulării aplicației nu este de acord cu acestea, trebuie să înceteze să folosească serviciul de îndată.
Modificarea termenilor
Lotus Dance poate modifica termenii și condițiile fără să anunțe, dacă acest lucru se va întâmpla, toți utilizatorii vor primi o notificare, Lotus Dance va posta pe pagina website persoană un mesaj care să facă cunoscute modificările precum și în notele de instalare a aplicației în cazul unui update de versiune pentreu aplicație. Este foarte important ca utilizatorul să recitească termenii și condițiile când acestea au fost modificate, deoarece prin accesarea serviciilor aceștia sunt de acord cu termenii pe care Lotus Dance i-a propus.
Crearea contului
Pentru a avea acces la întreaga aplicație, utilizatorul are nevoie de un cont Facebook, Google+, Twitter sau Microsoft. Prin crearea conturilor care au încorporată și partea de rețea social, utilizatorul este de accord că are minim 13 ani. Prin crearea contului este posibil să i se ceară să folosească un nume. Utilizatorul este de accord să trimită date complete și corecte legate de propria persoană.
Ce nu are voie să facă utilizatorul
Să creeze un cont în numele altei persoane fără ca aceasta să-și fi dat acordul;
Să creeze un username cu scopul împersonării unei alte persoane;
Să creeze un username care ar putea prin orice mod să deranjeze sau să insulte alte persoane care se joacă;
Să creeze un username care să fie vulgar, obscen sau de prost-gust;
Să folosească o poză de profil care să denote sexualitate, violență fizică sau verbală sau care să poată deranja alți jucători.
Lotus Dance își rezervă dreptul de a suspenda și de a întrerupe accesul la serviciul oferit oricărei persoane care nu respectă regulile fără a da un avertisment înainte și fără a da vreo explicație ulterioară asupra motivului.
Datele care au caracter personal
Scopul stocării datelor care au character personal este acela de a îmbunătății serviciile oferite. Lotus Dance nu va vinde, închiria sau împrumuta aceste date către o terță parte, datale utilizatorului fiind folosite exclusive de către Asociația Club de Dans Sportiv “Lotus Dance”.
Limitarea răspunderii
Lotus Dance și dezvoltatorii aplicației nu pot fi sub nici o formă trași la răspundere pentru orice problemă creată de modul de utilizare a aplicației (incluzând pierdere de profit, pierderea datelor, întreruperea serviciilor, distrugerea telefonului sau a sistemului sau taxele suplimentare care pot apărea prin folosirea aplicației datorită conectării prin providerul de internet).
5.2. Utilitatea aplicației
Lucrarea de față abordează un subiect puțin explorat pe piața aplicațiilor mobile din România, dezvoltarea unui sistem software pentru dispozitive PC, laptop și tablete. Beneficiarul, studio-ul de dans Lotus Dance, dorește să îți extindă domeniul de activitate spre această ramură a industriei IT atât pentru că potențialul pieței este puțin exploatat în țara noastră, cât și pentru că este o metodă foarte bună de promovare a studioului, beneficiind de viralitatea dată de facebook: se estimează că o persoană care are cont pe facebook și agreează o aplicație poate da post astfel încât 40% din prietenii ei vor intra in contact cu Lotus Dance: pe wall-ul utilizatorilor este postată automat o informare privind cursul pe care il urmeaza.
Pentru a realiza o aplicație software care să aibă succes pe piață este foarte important ca aceasta să aibă o interfață cât mai plăcută și sugestivă. La fel de importantă în proiectarea oricărei aplicații este și flexibilitatea acesteia, ușurința cu care se poate adapta la noi situații care ar putea să apară în cadrul sistemului informațional pe care îl mapează. În acest spirit, aplicația este de așa natură încât printr-un update venit din Market Place se pot repara probleme sau implementa noi soluții și capabilități.
Bibliografie
Chappell, D., Introducing Windows Azure, Octombrie 2008
Smeureanu, I. , Dârdală, M. , Reveiu, A., Visual C# .NET, CISON, București 2004
Richter, J. , Applied Microsoft .NETFramework Programming, Microsoft Pess 2002
Stănică, J.L. , Programarea aplicațiilor pentru dispozitive mobile, note de curs, 2013
Botezatu C, Proiectarea sistemelor informatice. Metode sistematice, Editura ProUniversitaria, Buc, 2007
Chichernea V, Garais G, Baze de date. Sistemul FoxPro Vol II, Editura ProUniversitaria, 2006
Moise M., Sisteme informatice cu baze de date, Editura ProUniversitaria, București, 2008
Crișan D., Limbajul C / C++. Fundamente, Vol. 1, Editura ProUniversitaria, 2006
Crișan D., Limbajul C / C++. Programarea orientată obiect, Vol. 2, Editura ProUniversitaria, 2006
Iacob I., SGBD Oracle – Ghid aplicativ pentru realizarea soluțiilor informatice, Editura ProUniversitaria, 2007
Iacob I., ORACLE 10g – Proiectarea și realizarea aplicațiilor cu baze de date utizlizând limbajul SQL*PLUS, Editura ProUniversitaria 2009
Smeureanu I. Ivan I, Dârdală M, Structuri și obiecte în C / C++, Editura CISON, București, 2000
Mușlea I, C/C++ pentru avansați, Editura Microinformatica, Cluj, 1995.
Botezatu C, Iacob I, Proiectarea sistemelor informatice. Studii de caz pentru managementul activităților unei societăți. Editura ProUniversitaria, 2007
Chichernea V, Botezatu C, Iacob I, Fabian G., Avram V., Oprea P, Cârstea C, Baze de date relaționale. Aplicații în turism, Editura CISON, 1998
http://www.windowsazure.com/en-us/documentation/
http://www.windowsazure.com/en-us/home/features/mobile-services/
Anexa
CONTRACT DE PRESTĂRI DE SERVICII
Încheiat astăzi ………………
I. PĂRȚILE CONTRACTANTE
1.1. ASOCIATIA CLUB DE DANS SPORTIV LOTUS DANCE, cu sediul social în Bucuresti,
Sos. Pantelimon, Nr. 309, Bl. 8, Sc. C, Ap. 119, Et. 10, Sector 2, cod fiscal 24548648, reprezentată de Coman Paraschiva, cu funcția de Director, în calitate de prestator, pe de o parte,
și
1.2.. ………………………………………………………………………………………………………………….., cu sediul social în (localitatea) …………………….., str. ………………………………. nr. ……………………, bloc
…………., scara ……….., etaj …….., apartament ……., județ/sector …………………………………., în calitate de beneficiar, pe de altă parte,
II. OBIECTUL CONTRACTULUI
2.1. Obiectul contractului îl reprezintă:
Prestarea de servicii sub forma de cursuri de dans.
2.2. Prestatorul obligă să predea lectii de dans beneficiarului intr-un numar de…… sedinte
III. DURATA CONTRACTULUI
3.1. Contractul se încheie pe o durată de …….. începând de la data semnarii lui
IV. PREȚUL CONTRACTULUI
4.1. Prețul prestației este de
………………………………………………………………………………………………….
4.2. Prețul se va plăti în numerar, la data semnarii respectivului contract sau la prima sedinte de curs.
4.3. În cazul în care, anterior efectuării prestației, vor interveni majorări de prețuri care afectează costul prestației:
prestatorul de servicii are dreptul să majoreze prețul contractului, în raport cu majorarea prețurilor, cu obligația ca prestatorul să notifice în termen de 5 zile beneficiarului hotărârea sa;
beneficiarul, în termen de 5 zile de la data primirii notificării scrise a prestatorului are obligația să comunice acestuia dacă prețul majorat este acceptabil și să solicite continuarea lucrării. Dacă beneficiarul nu răspunde la notificarea scrisă în termenul de mai sus, aceasta este considerată o acceptare tacită a prețului.
4.4. În cazul în care majorarea de prețuri intervine în cursul executării contractului, iar beneficiarul nu acceptă majorarea, va notifica în scris refuzul prestatorului, acesta având dreptul la cota-parte din preț echivalentă cu prestația executată și la prețul convenit.
V. OBLIGAȚIILE PĂRȚILOR
5.1. Prestatorul de servicii se obligă:
Sa predea cursurile de dans in perioada stabilita de comun accord cu beneficiarul.
5.2. Beneficiarul serviciilor se obligă:
Sa plateasca pentru cursurile de dans oferite de prestator.
VI. ÎNCETAREA CONTRACTULUI
6.1. Prezentul contract încetează de plin drept, fără a mai fi necesară intervenția unui/unei tribunal arbitral/instanțe judecătorești, în cazul în care una dintre părți:
•nu își execută una dintre obligațiile esențiale enumerate, din prezentul contract;
6.2. Rezilierea prezentului contract nu va avea nici un efect asupra obligațiilor deja scadente între părțile contractante.
VII. FORȚA MAJORĂ
7.1. Nici una dintre părțile contractante nu răspunde de neexecutarea la termen sau/și de executarea în mod necorespunzător – total sau parțial – a oricărei obligații care îi revine în baza prezentului contract, dacă neexecutarea sau executarea necorespunzătoare a obligației respective a fost cauzată de forța majoră, așa cum este definită de lege.
VIII. LITIGII
8.1. Părțile au convenit ca toate neînțelegerile privind validitatea prezentului contract sau rezultate din interpretarea, executarea ori încetarea acestuia să fie rezolvate pe cale amiabilă de reprezentanții lor.
8.2. În cazul în care nu este posibilă rezolvarea litigiilor pe cale amiabilă, părțile se vor adresa instanțelor judecătorești competente.
IX. CLAUZE FINALE
11.1. Modificarea prezentului contract se face numai prin act adițional încheiat între părțile contractante.
11.2. Prezentul contract, împreună cu anexele sale care fac parte integrantă din cuprinsul său, reprezintă voința părților și înlătură orice altă înțelegere verbală dintre acestea, anterioară sau ulterioară încheierii lui.
11.3. În cazul în care părțile își încalcă obligațiile lor, neexercitarea de partea care suferă vreun prejudiciu a dreptului de a cere executarea întocmai sau prin echivalent bănesc a obligației respective nu înseamnă că ea a renunțat la acest drept al său.
11.4. Prezentul contract a fost încheiat într-un număr de 2 exemplare, din care unul a fost inanat beneficiarului.
PRESTATOR BENEFICIAR
CONTRACT DE PRESTĂRI DE SERVICII
Încheiat astăzi ………………
I. PĂRȚILE CONTRACTANTE
1.1. ASOCIATIA CLUB DE DANS SPORTIV LOTUS DANCE, cu sediul social în Bucuresti, Sos. Pantelimon, Nr. 309, Bl. 8, Sc. C, Ap. 119, Et. 10, Sector 2, cod fiscal 24548648, reprezentată de Coman Paraschiva, cu funcția de Director, în calitate de prestator, pe de o parte,
și
1.2.. ………………………………………………………………………………………………………………….., cu sediul social în (localitatea) …………………….., str. ………………………………. nr. ……………………, bloc …………., scara ……….., etaj …….., apartament ……., județ/sector …………………………………., în calitate de beneficiar, pe de altă parte,
OBIECTUL CONTRACTULUI
Obiectul contractului îl reprezintă:
Prestarea de servicii sub forma de spectacol de dans.
Prestatorul obligă să prezinte un scurt spectacol de dans beneficiarului.
DURATA CONTRACTULUI
3.1. Contractul este valabil de la senarea lui si pana la prestarea serviciului.
PREȚUL CONTRACTULUI
Prețul prestației este de
………………………………………………………………………………………………….
Prețul se va plăti în numerar, la data semnarii respectivului contract sau la prima sedinte de curs.
În cazul în care, anterior efectuării prestației, vor interveni majorări de prețuri care afectează costul prestației:
prestatorul de servicii are dreptul să majoreze prețul contractului, în raport cu majorarea prețurilor, cu obligația ca prestatorul să notifice în termen de 5 zile beneficiarului hotărârea sa;
beneficiarul, în termen de 5 zile de la data primirii notificării scrise a prestatorului are obligația să comunice acestuia dacă prețul majorat este acceptabil și să solicite continuarea lucrării. Dacă beneficiarul nu răspunde la notificarea scrisă în termenul de mai sus, aceasta este considerată o acceptare tacită a prețului.
4.4. În cazul în care majorarea de prețuri intervine în cursul executării contractului, iar beneficiarul nu acceptă majorarea, va notifica în scris refuzul prestatorului, acesta având dreptul la cota-parte din preț echivalentă cu prestația executată și la prețul convenit.
.
OBLIGAȚIILE PĂRȚILOR
Prestatorul de servicii se obligă:
Sa prezinte un scurt spectacol de dans.
Beneficiarul serviciilor se obligă:
Sa plateasca pentru prestatie.
ÎNCETAREA CONTRACTULUI
Prezentul contract încetează de plin drept, fără a mai fi necesară intervenția unui/unei tribunal arbitral/instanțe judecătorești, în cazul în care una dintre părți:
•nu își execută una dintre obligațiile esențiale enumerate, din prezentul contract;
Rezilierea prezentului contract nu va avea nici un efect asupra obligațiilor deja scadente între părțile contractante.
FORȚA MAJORĂ
7.1. Nici una dintre părțile contractante nu răspunde de neexecutarea la termen sau/și de executarea în mod necorespunzător – total sau parțial – a oricărei obligații care îi revine în baza prezentului contract, dacă neexecutarea sau executarea necorespunzătoare a obligației respective a fost cauzată de forța majoră, așa cum este definită de lege.
LITIGII
Părțile au convenit ca toate neînțelegerile privind validitatea prezentului contract sau rezultate din interpretarea, executarea ori încetarea acestuia să fie rezolvate pe cale amiabilă de reprezentanții lor.
În cazul în care nu este posibilă rezolvarea litigiilor pe cale amiabilă, părțile se vor adresa instanțelor judecătorești competente.
CLAUZE FINALE
Modificarea prezentului contract se face numai prin act adițional încheiat între părțile contractante.
Prezentul contract, împreună cu anexele sale care fac parte integrantă din cuprinsul său, reprezintă voința părților și înlătură orice altă înțelegere verbală dintre acestea, anterioară sau ulterioară încheierii lui.
În cazul în care părțile își încalcă obligațiile lor, neexercitarea de partea care suferă vreun prejudiciu a dreptului de a cere executarea întocmai sau prin echivalent bănesc a obligației respective nu înseamnă că ea a renunțat la acest drept al său.
Prezentul contract a fost încheiat într-un număr de 2 exemplare, din care unul a fost inanat beneficiarului.
PRESTATOR BENEFICIAR
Pagina de administrare:
private ObservableCollection<cursant> crs_it;
private IMobileServiceTable<cursant> crs_tb = App.MobileService.GetTable<cursant>();
private ObservableCollection<partic> part_it;
private IMobileServiceTable<partic> part_tb = App.MobileService.GetTable<partic>();
private async void Refresh_grup()
{ try
{
var res = await crs_tb
.Where(cursantul=>cursantul.Complete==false)
.ToListAsync();
crs_it = new ObservableCollection<cursant>(res);
GrupRecN.ItemsSource = crs_it;
}
catch (MobileServiceInvalidOperationException e)
{
MessageDialog errormsg = new MessageDialog(e.Response.Content, string.Format("{0} (HTTP {1})", e.Response.StatusDescription,
e.Response.StatusCode)); var ignoreAsyncOpResult = errormsg.ShowAsync();
}
}
private async void Refresh_partic()
{ try
{
var res = await part_tb
.Where(cursantul => cursantul.del == false)
.ToListAsync();
part_it = new ObservableCollection<partic>(res);
ParticRecN.ItemsSource = part_it;
}
catch (MobileServiceInvalidOperationException e)
{
MessageDialog errormsg = new MessageDialog(e.Response.Content, string.Format("{0} (HTTP {1})", e.Response.StatusDescription,
e.Response.StatusCode)); var ignoreAsyncOpResult = errormsg.ShowAsync();
}
}
private async void Refresh_grup_c()
{ try
{
var res = await crs_tb
.Where(cursantul => cursantul.Complete == true)
.ToListAsync();
crs_it = new ObservableCollection<cursant>(res);
GrupRec.ItemsSource = crs_it;
}
catch (MobileServiceInvalidOperationException e)
{
MessageDialog errormsg = new MessageDialog(e.Response.Content, string.Format("{0} (HTTP {1})", e.Response.StatusDescription,
e.Response.StatusCode)); var ignoreAsyncOpResult = errormsg.ShowAsync();
}
}
private async void Refresh_partic_c()
{ try
{
var res = await part_tb
.Where(cursantul => cursantul.del == true)
.ToListAsync();
part_it = new ObservableCollection<partic>(res);
ParticRec.ItemsSource = part_it;
}
catch (MobileServiceInvalidOperationException e)
{
MessageDialog errormsg = new MessageDialog(e.Response.Content, string.Format("{0} (HTTP {1})", e.Response.StatusDescription,
e.Response.StatusCode)); var ignoreAsyncOpResult = errormsg.ShowAsync();
}
}
private async void list_del(object sender, RoutedEventArgs e)
{
}
private void val_list(object sender, RoutedEventArgs e)
{
if (partic.IsChecked == true)
{
Refresh_partic_c();
Refresh_partic();
} else
{
Refresh_grup();
Refresh_grup_c();
}
}
private void ref_partic(object sender, RoutedEventArgs e)
{
valid.Visibility = Visibility.Visible; GrupRec.Visibility = Visibility.Collapsed;
ParticRec.Visibility = Visibility.Visible;
ParticRecN.Visibility = Visibility.Visible;
GrupRecN.Visibility = Visibility.Collapsed;
Refresh_partic();
Refresh_partic_c();
}
private void ref_grupN(object sender, RoutedEventArgs e)
{
valid.Visibility = Visibility.Visible; ParticRec.Visibility = Visibility.Collapsed;
ParticRecN.Visibility = Visibility.Collapsed;
GrupRecN.Visibility = Visibility.Visible;
GrupRec.Visibility = Visibility.Visible;
Refresh_grup();
Refresh_grup_c();
}
private void CBComplete(object sender, RoutedEventArgs e)
{
CheckBox cb = (CheckBox)sender; cursant item = cb.DataContext as cursant;
UpdateCursant(item);
}
private async void UpdateCursant(cursant crs)
{
await crs_tb.UpdateAsync(crs);
}
private async void UpdatePartic(partic prt)
{
await part_tb.UpdateAsync(prt);
}
private void FlipView(object sender, TappedRoutedEventArgs e)
{
cursantDetalii add_page = new cursantDetalii(); this.Content = add_page;
}
private void CBComplete2(object sender, RoutedEventArgs e)
{
CheckBox cb = (CheckBox)sender; partic item = cb.DataContext as partic;
UpdatePartic(item);
}
Pagina de adăugare
namespace LotusDance_admin
{
public sealed partial class add_p : LotusDance_admin.Common.LayoutAwarePage
{
char sx = 'm'; int grupa = 0; string pack; int state = 0; //pt a vedea statusul meniurilor int i = 0; //de folosit pt a crea mai multe instante public add_p()
{
this.InitializeComponent();
}
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
}
protected override void SaveState(Dictionary<String, Object> pageState)
{
}
StorageFile media = null;
private ObservableCollection<cursant> items; private IMobileServiceTable<cursant> crs_tb = App.MobileService.GetTable<cursant>(); //private IMobileServiceTable<stiluri> stil_ds = App.MobileService.GetTable<stiluri>(); private IMobileServiceTable<partic> partic_tb = App.MobileService.GetTable<partic>();
private async void InsertCursant(cursant crs_ob)
{ try
{
string errorString = string.Empty;
if (media != null) {
// Set blob properties of TodoItem. crs_ob.ContainerName = "todoitemimages";
crs_ob.ResourceName = media.Name;
}
await crs_tb.InsertAsync(crs_ob);
if (!string.IsNullOrEmpty(crs_ob.SasQueryString))
{
using (var fileStream = await media.OpenStreamForReadAsync())
{
StorageCredentials cred = new StorageCredentials(crs_ob.SasQueryString); var imageUri = new Uri(crs_ob.imageUri);
CloudBlobContainer container = new CloudBlobContainer(
new Uri(string.Format("https://{0}/{1}", imageUri.Host, crs_ob.ContainerName)), cred); CloudBlockBlob blobFromSASCredential =
container.GetBlockBlobReference(crs_ob.ResourceName);
await blobFromSASCredential.UploadFromStreamAsync(fileStream.AsInputStream());
}
}
MessageDialog md = new MessageDialog("Cursantul " + nume_b.Text + " a fost inscris la grupa " + grupa, "Înscriere făcută cu succes!"); md.ShowAsync();
}
catch (MobileServiceInvalidOperationException e)
{
MessageDialog errormsg = new MessageDialog(e.Response.Content, string.Format("{0} (HTTP {1})", e.Response.StatusDescription,
e.Response.StatusCode)); var ignoreAsyinc = errormsg.ShowAsync();
}
}
private async void InsertPartic(partic partic_ob)
{ try
{
await partic_tb.InsertAsync(partic_ob);
}
catch (MobileServiceInvalidOperationException e)
{
MessageDialog errormsg = new MessageDialog(e.Response.Content, string.Format("{0} (HTTP {1})", e.Response.StatusDescription,
e.Response.StatusCode)); var ignoreAsyinc = errormsg.ShowAsync();
}
}
private void Next1(object sender, RoutedEventArgs e)
{
switch ((string)((Button)sender).Name)
{ case "step1":
if (Convert.ToString(abo_b.SelectedValue) == "Particular") anim_pas2_p.Begin(); else anim_pas2.Begin();
break; case "step2": state = 1; anim_pas3.Begin();
break; case "step22": state = 1; anim_pas3.Begin(); break;
}
}
private void sex_check(object sender, RoutedEventArgs e)
{
if (male.IsChecked == true)
{
sx = 'm';
}
if (female.IsChecked == true)
{
sx = 'f';
}
if (couple.IsChecked == true)
{
sx = 'c';
}
}
private void valid_partic(object sender, RoutedEventArgs e)
{
partic ad = new partic
{ id = 0,
nume = nume_b.Text, telefon = tel_b.Text, email = email_b.Text, sex = Convert.ToString(sx),
rank = "cursant",
data_i = date_picker.Value.ToString() + hour_picker.Value.ToString(), pak = "5 Ședințe",
};
InsertPartic(ad);
MessageDialog md = new MessageDialog("Cursantul " + nume_b.Text + " a fost inscris la grupa " + grupa+
"Înscriere făcută cu succes!"); md.ShowAsync();
}
private void valid_adult(object sender, RoutedEventArgs e)
{ try
{
cursant ad = new cursant
{ id = 0,
nume = nume_b.Text, telefon = tel_b.Text, email = email_b.Text, sex = Convert.ToString(sx),
rank = "cursant", Grupa = grupa, pak = pack
};
InsertCursant(ad);
MessageDialog md = new MessageDialog("Cursantul " + nume_b.Text + " a fost inscris la grupa " + grupa+ "Înscriere făcută cu succes!");
md.ShowAsync(); i += 1;
} catch { }
}
private void Back(object sender, RoutedEventArgs e)
{
switch ((string)((Button)sender).Content)
{ case "1": if (state != 0)
{
anim_pas3_back.Begin();
}
if (Convert.ToString(abo_b.SelectedValue) == "Particular") anim_pas2_p_back.Begin(); else anim_pas2_back.Begin();
break; case "2":
anim_pas3_back.Begin(); break;
}
}
private void Final(object sender, RoutedEventArgs e)
{
if (Convert.ToString(abo_b.SelectedValue) == "Particular")
{
partic ad = new partic
{ id = 0,
nume = nume_b.Text, telefon = tel_b.Text,
email = email_b.Text,
rank = "cursant",
data_i = date_picker.Value.ToString() + hour_picker.Value.ToString(), pak = "5 Ședințe",
};
InsertPartic(ad);
MessageDialog md = new MessageDialog("Felicitări " + nume_b.Text + " ai fost inscris. În cel mai scurt timp un reprezentant Lotus Dance te va contacta", "Înscriere făcută cu succes!"); md.ShowAsync();
} else { cursant ad = new cursant
{
id = 0, nume = nume_b.Text, telefon = tel_b.Text, email = email_b.Text, sex = Convert.ToString(sx), rank = "cursant", Grupa = grupa, pak = pack
};
InsertCursant(ad);
}
}
private async void OnTakePhotoClick(object sender, RoutedEventArgs e)
{
CameraCaptureUI cameraCapture = new CameraCaptureUI(); media = await cameraCapture
.CaptureFileAsync(CameraCaptureUIMode.PhotoOrVideo);
}
private void grup_pick(object sender, RoutedEventArgs e)
{
switch ((string)((Button)sender).Name)
{
case "Grupa 1": grupa = 1; break;
case "Grupa 2": grupa = 2; break;
case "Grupa 3": grupa = 3; break;
}
}
}
}
Clasa cursant
namespace LotusDance_admin
{
public class cursant
{
public int id { get; set; }
[DataMember(Name = "nume")] public string nume {get;set;}
[DataMember (Name= "telefon")]
public string telefon {get;set;}
[DataMember (Name="email")] public string email {get;set;} [DataMember (Name="sex")]
public string sex {get;set;}
[DataMember (Name="rank")]
public string rank{get;set;}
[DataMember(Name="Grupa")]
public int Grupa{get;set;}
[DataMember(Name = "confirmat")]
public bool Complete { get; set; }
[DataMember(Name = "pack")]
public string pak { get; set; }
[DataMember(Name = "containerName")] public string ContainerName { get; set; }
[DataMember(Name = "resourceName")]
public string ResourceName { get; set; }
[DataMember(Name = "sasQueryString")] public string SasQueryString { get; set; }
[DataMember(Name = "imageUri")]
public string imageUri { get; set; }
public cursant(string _nume, string _telefon, string _email, string _sex, string _rank, int _grupa, bool _Complete, string _pak)
{
nume = _nume; telefon = _telefon; email = _email; sex = _sex; rank = _rank; Grupa = _grupa; Complete = _Complete;
pak = _pak;
}
public cursant()
{
}
public cursant(string _nume, string _telefon)
{
nume = _nume;
telefon = _telefon;
}
}
}
Pagina de listare – codul sursă pentru partea grafică a paginii
<common:LayoutAwarePage x:Name="pageRoot"
x:Class="LotusDance_admin.list_p"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:LotusDance_admin" xmlns:common="using:LotusDance_admin.Common" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
<Grid Style="{StaticResource LayoutRootStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="200"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.Background>
<LinearGradientBrush EndPoint="1.026,0.99" StartPoint="0.248,0.076">
<GradientStop Color="Black"/>
<GradientStop Color="Black" Offset="1"/>
<GradientStop Color="#FF670025" Offset="0.319"/>
</LinearGradientBrush>
</Grid.Background>
<!– Back button and page title –>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="350"/>
</Grid.ColumnDefinitions>
<Button x:Name="backButton" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack,
ElementName=pageRoot}" Style="{StaticResource BackButtonStyle}"/>
<TextBlock x:Name="pageTitle" Grid.Column="0" Text="Listare" Style="{StaticResource
PageHeaderTextStyle}" Margin="98,115,12,45"/>
<Image VerticalAlignment="Center" HorizontalAlignment="Left" Source="ms-appx:///Assets/logo.png"
Grid.Column="1" Grid.Row="0" Height="200" Margin="97,0,123,0" Width="457" />
</Grid>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="100"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<RadioButton Name="partic" FontSize="30" Grid.Row="0" Grid.Column="2" Content="Particulare"
HorizontalAlignment="Center" Margin="306,31,791,16" Checked="ref_partic" Height="53"/>
<RadioButton Name="grup" Grid.Row="0" FontSize="30" Grid.Column="2" Content="Grup"
HorizontalAlignment="Center" Margin="661,31,491,16" Checked="ref_grupN" Height="53" Width="114"/>
<Button Name="valid" Grid.Row="1" Grid.Column="2" Visibility="Collapsed" Content=">>" HorizontalAlignment="Center" Margin="607,104,604,326" Click="val_list"/>
<Button Content="Ștergere" HorizontalAlignment="Center" Margin="1048,31,128,31" Grid.Row="0" Grid.Column="2" Click="list_del"/>
<Grid Grid.Row="1" Grid.Column="2">
<ListView Name="ParticRec" Margin="0,0,0,0" Width="500" HorizontalAlignment="Right"
Grid.Row="0" Grid.Column="0" Visibility="Collapsed">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Name="ID" Checked="CBComplete2" IsChecked="{Binding Complete,
Mode=TwoWay}" Content="{Binding id}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Nume" Text="{Binding nume}" VerticalAlignment="Center"
HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Telefon" Text="{Binding telefon}" VerticalAlignment="Center"
HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Email" Text="{Binding email}" HorizontalAlignment="Left"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Sex" Text="{Binding sex}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Rank" Text="{Binding rank}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Data" Text="{Binding data_i}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Pack" Text="{Binding pack}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView Name="ParticRecN" HorizontalAlignment="Left" Width="500" Margin="0,0,0,0"
Grid.Row="0" Grid.Column="0" Visibility="Collapsed">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Name="ID" Checked="CBComplete2" IsChecked="{Binding del,
Mode=TwoWay}" Content="{Binding id}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Nume" Text="{Binding nume}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Telefon" Text="{Binding telefon}" VerticalAlignment="Center"
HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Email" Text="{Binding email}" HorizontalAlignment="Left"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Sex" Text="{Binding sex}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Rank" Text="{Binding rank}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Data" Text="{Binding data_i}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Pack" Text="{Binding pack}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView FontSize="25" Name="GrupRecN" Margin="0,0,0,0" Width="600"
HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Visibility="Visible">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox FontSize="30" Name="ID" Checked="CBComplete" IsChecked="{Binding
Complete, Mode=TwoWay}" Content="{Binding id}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0" />
<Image Name="IMG" Source="{Binding ImageUri, Mode=OneWay}" Margin="10,0,0,0"/>
<TextBlock Name="Nume" Text="{Binding nume}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Telefon" Text="{Binding telefon}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Email" Text="{Binding email}" HorizontalAlignment="Left"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Sex" Text="{Binding sex}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Abonament" Text="{Binding abonament}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Grupa" Text="{Binding Grupa}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Rank" Text="{Binding rank}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView Name="GrupRec" HorizontalAlignment="Right" Width="600" Margin="0,10,0,0"
Grid.Row="0" Grid.Column="0" Visibility="Visible" Tapped="FlipView">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Name="ID" Checked="CBComplete" IsChecked="{Binding Complete,
Mode=TwoWay}" Content="{Binding id}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0" />
<TextBlock Name="Nume" Text="{Binding nume}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Telefon" Text="{Binding telefon}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
<TextBlock Name="Email" Text="{Binding email}" HorizontalAlignment="Left"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Sex" Text="{Binding sex}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Abonament" Text="{Binding abonament}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Grupa" Text="{Binding Grupa}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock Name="Rank" Text="{Binding rank}" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="10,0,0,0"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Grid>
<VisualStateManager.VisualStateGroups>
<!– Visual states reflect the application's view state –>
<VisualStateGroup x:Name="ApplicationViewStates">
<VisualState x:Name="FullScreenLandscape"/>
<VisualState x:Name="Filled"/>
<!– The entire page respects the narrower 100-pixel margin convention for portrait –> <VisualState x:Name="FullScreenPortrait">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="backButton"
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PortraitBackButtonStyle}"/> </ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<!– The back button and title have different styles when snapped –>
<VisualState x:Name="Snapped">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="backButton"
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SnappedBackButtonStyle}"/> </ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="pageTitle"
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource
SnappedPageHeaderTextStyle}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</common:LayoutAwarePage>
Pagina de adăugare – codul sursă pentru partea grafică a paginii
<common:LayoutAwarePage
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:LotusDance_admin"
xmlns:common="using:LotusDance_admin.Common" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:Input="using:Telerik.UI.Xaml.Controls.Input" x:Name="pageRoot"
x:Class="LotusDance_admin.add_p"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Mode=Self}}" mc:Ignorable="d">
<common:LayoutAwarePage.Resources>
<x:String x:Key="AppName">My Application</x:String>
</common:LayoutAwarePage.Resources>
<Grid Style="{StaticResource LayoutRootStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="200"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.Background>
<LinearGradientBrush EndPoint="1.026,0.99" StartPoint="0.248,0.076">
<GradientStop Color="Black"/>
<GradientStop Color="Black" Offset="1"/>
<GradientStop Color="#FF670025" Offset="0.319"/>
</LinearGradientBrush>
</Grid.Background>
<!– Back button and page title –>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="350"/>
</Grid.ColumnDefinitions>
<Button x:Name="backButton" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}" Style="{StaticResource BackButtonStyle}"/>
<TextBlock x:Name="pageTitle" Grid.Column="0" Text="Adăugare" Style="{StaticResource
PageHeaderTextStyle}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="98,115,12,45"/>
<Image HorizontalAlignment="Left" VerticalAlignment="Center" Source="ms-appx:///Assets/logo.png"
Grid.Column="1" Grid.Row="0" Height="200" Margin="150,0,123,0" Width="457" />
</Grid>
<Grid Grid.Row="1">
<!–Noul add–>
<Grid x:Name="Pasul1_1" Width="670" Background="#FF80012E" Height="400" Margin="400,100,0,0"
VerticalAlignment="Top" HorizontalAlignment="Left">
<TextBlock Grid.Column="0" Text="Informații de bază" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="100,35,0,0" FontSize="30"/>
<TextBox x:Name="nume_b" Grid.Column="0" Text="Nume" Margin="100,94,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top" Height="50" Width="350" FontSize="30"/>
<RadioButton Name="male" Content="M" HorizontalAlignment="Left" Margin="100,149,0,0" VerticalAlignment="Top" Checked="sex_check" FontSize="30"/>
<RadioButton Name="female" Content="F" HorizontalAlignment="Left" Margin="161,149,0,0"
VerticalAlignment="Top" Checked="sex_check" FontSize="30"/>
<RadioButton Name="couple" Content="Cuplu" HorizontalAlignment="Left" Margin="222,149,0,0"
VerticalAlignment="Top" Checked="sex_check" FontSize="30"/>
<TextBox x:Name="tel_b" Grid.Column="0" Text="Telefon" Margin="100,193,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top" Height="50" Width="350" FontSize="30"/>
<TextBox x:Name="email_b" Grid.Column="0" Text="E-mail" Margin="100,248,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top" Height="50" Width="350" FontSize="30"/>
<ComboBox x:Name="abo_b" Grid.Column="0" Margin="100,303,0,0" HorizontalAlignment="Left"
VerticalAlignment="Top" Height="50" Width="350" SelectionChanged="abo_b_SelectionChanged" FontSize="30">
<x:String>Ab Copil</x:String>
<x:String>Ab Adult</x:String>
<x:String>Particular</x:String>
</ComboBox>
<Button Name="btnTakePhoto" Style="{StaticResource PhotoAppBarButtonStyle}" Width="100"
Height="100" Click="OnTakePhotoClick" Margin="531,93,0,207" />
<Button x:Name="step1" Content=">>" HorizontalAlignment="Right" Click="Next1"
Margin="309,301,0,10" FontSize="30" Height="68" Width="79"/>
<Button Content="1" Margin="0,317,0,0" FontSize="30" Height="62" Width="55" Click="Back"/>
</Grid>
<Grid x:Name="Pasul2_1" Width="670" Height="400" Margin="2504,90,-1808,0"
Background="#FF57001F" VerticalAlignment="Top" HorizontalAlignment="Left"
RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<CompositeTransform/>
</Grid.RenderTransform>
<CheckBox Name="Pack1" Margin="60,50,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"
Content="Pachetul 1:" FontSize="15" Checked="pack1_check" />
<CheckBox Name="Pack2" Margin="260,50,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Content="Pachetul 2:" FontSize="15" Checked="pack2_check"/>
<CheckBox Name="Pack3" Margin="460,50,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"
Content="Pachetul 3:" FontSize="15" Checked="pack3_check"/>
<ListBox x:Name="pack1" Grid.Row="1" Grid.Column="1" Margin="60,85,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top" Height="222" Width="147" SelectionMode="Extended"
SelectionChanged="pack_detail1">
<x:String>Vals Vienez</x:String>
<x:String>Tango Argentinian</x:String>
<x:String>Cha-Cha</x:String>
<x:String>Salsa</x:String>
</ListBox>
<ListBox x:Name="pack2" Grid.Row="1" Grid.Column="1" Margin="260,85,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top" Height="222" Width="147" SelectionMode="Extended"
SelectionChanged="pack_detail2">
<x:String>West Coast Swing</x:String>
<x:String>Rock'n'Roll</x:String>
<x:String>Vals Vienez</x:String>
<x:String>Tango Argentinian</x:String>
</ListBox>
<ListBox x:Name="pack3" Grid.Row="1" Grid.Column="1" Margin="460,85,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top" Height="222" Width="147" SelectionMode="Extended"
SelectionChanged="pack_detail3">
<x:String>Vals Vienez</x:String>
<x:String>Salsa</x:String>
<x:String>Bachata</x:String>
<x:String>Merengue</x:String>
</ListBox>
<Button Content="Grupa 1" Margin="75,322,0,26" Height="52" Click="grup_pick"/>
<Button Content="Grupa 2" Margin="274,322,0,26" Height="52" Click="grup_pick"/> <Button Content="Grupa 3" Margin="474,322,0,26" Height="52" Click="grup_pick"/>
<Button Content=">>" x:Name="step2" HorizontalAlignment="Right" Click="Next1"
Margin="309,301,0,10" FontSize="30" Height="68" Width="79"/>
<Button Content="2" Margin="0,317,0,0" FontSize="30" Height="62" Width="55" Click="Back"/>
</Grid>
<Grid x:Name="Pasul2_2" Width="670" Height="400" Margin="2589,91,-1893,0"
Background="#FF57001F" VerticalAlignment="Top" HorizontalAlignment="Left"
RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<CompositeTransform/>
</Grid.RenderTransform>
<Input:RadDatePicker Name="date_picker" HorizontalAlignment="Left" Margin="70,63,0,0" VerticalAlignment="Top" Width="150" EmptyContent="Selectează data"/>
<Input:RadTimePicker Name="hour_picker" HorizontalAlignment="Left" Margin="70,162,0,0" VerticalAlignment="Top" Width="150" EmptyContent="Selectează ora"/>
<ListView x:Name="partic_tip" Margin="371,63,0,0" HorizontalAlignment="Left"
VerticalAlignment="Top" Height="233" Width="192">
<x:String>O ședință</x:String>
<x:String>5 Ședințe</x:String>
<x:String>6 Ședințe</x:String>
<x:String>7 Ședințe</x:String> <x:String>10 Ședințe</x:String>
</ListView>
<Button Content=">>" x:Name="step22" HorizontalAlignment="Right" Click="Next1"
Margin="309,301,0,10" FontSize="30" Height="68" Width="79"/>
<Button Content="2" Margin="0,317,0,0" FontSize="30" Height="62" Width="55" Click="Back"/>
</Grid>
<Grid x:Name="pasul3" Width="670" Height="400" Background="#FF340013" Margin="2866,91,-2170,0" VerticalAlignment="Top" HorizontalAlignment="Left" RenderTransformOrigin="0.5,0.5" >
<Grid.RenderTransform>
<CompositeTransform/>
</Grid.RenderTransform>
<TextBlock Text="Medotă de plată" FontSize="30"/>
<RadioButton VerticalContentAlignment="Center" Content="Plată în numerar" FontSize="30"
Margin="10,49,-10,286"/>
<RadioButton VerticalContentAlignment="Center" Content="Prin transfer bancar" FontSize="30" Margin="10,93,-10,242"/>
<RadioButton VerticalContentAlignment="Center" Content="Serviciu de plată electronică" FontSize="30" Margin="10,137,-10,198"/>
<Button Content=">>" HorizontalAlignment="Right" Click="Final" Margin="309,301,0,10"
FontSize="30" Height="68" Width="79"/>
<Button Content="3" Click="Back" Margin="0,317,0,0" FontSize="30" Height="62" Width="55"/>
</Grid>
</Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ApplicationViewStates">
<VisualState x:Name="FullScreenLandscape"/>
<VisualState x:Name="Filled"/>
<VisualState x:Name="FullScreenPortrait">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="backButton"
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PortraitBackButtonStyle}"/> </ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="Pas2_2">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Thickness>481,20,-808,169</Thickness>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Grid.Row)"
Storyboard.TargetName="Pas2_2">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<x:Int32>1</x:Int32>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Grid.Column)"
Storyboard.TargetName="Pas2_2">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<x:Int32>2</x:Int32>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Grid.ColumnSpan)"
Storyboard.TargetName="Pas2_2">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<x:Int32>1</x:Int32>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="pas2">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0">
<Storyboard x:Name="anim_pas2">
<DoubleAnimation Duration="0:0:1" To="-2044"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="Pasul2_1" d:IsOptimized="True"/>
<DoubleAnimation Duration="0:0:1" To="10"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="Pasul2_1" d:IsOptimized="True"/>
</Storyboard>
</VisualTransition>
<VisualTransition From="pas2_back" GeneratedDuration="0">
<Storyboard x:Name="anim_pas2_back">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="Pasul2_1">
<EasingDoubleKeyFrame KeyTime="0" Value="-2042"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="577"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimation Duration="0" To="10"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="Pasul2_1" d:IsOptimized="True"/>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="pas2_back"/>
</VisualStateGroup>
<VisualStateGroup x:Name="pas2_p">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0">
<Storyboard x:Name="anim_pas2_p">
<DoubleAnimation Duration="0:0:1" To="-2136"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="Pasul2_2" d:IsOptimized="True"/>
<DoubleAnimation Duration="0:0:1" To="8"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="Pasul2_2" d:IsOptimized="True"/>
</Storyboard>
</VisualTransition>
<VisualTransition From="pas2_p_back" GeneratedDuration="0">
<Storyboard x:Name="anim_pas2_p_back">
<DoubleAnimation Duration="0:0:1" To="40"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="Pasul2_2"/>
<DoubleAnimation Duration="0:0:1" To="0"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="Pasul2_2"/>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="pas2_p_back">
<Storyboard>
<DoubleAnimation Duration="0" To="-2136.666"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="Pasul2_2" d:IsOptimized="True"/>
<DoubleAnimation Duration="0" To="8"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="Pasul2_2" d:IsOptimized="True"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="pas3">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0">
<Storyboard x:Name="anim_pas3">
<DoubleAnimation Duration="0:0:1" To="-2356"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="pasul3" d:IsOptimized="True"/>
<DoubleAnimation Duration="0:0:1" To="10"
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="pasul3" d:IsOptimized="True"/>
</Storyboard>
</VisualTransition>
<VisualTransition From="pas3_back" GeneratedDuration="0">
<Storyboard x:Name="anim_pas3_back">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="pasul3">
<EasingDoubleKeyFrame KeyTime="0" Value="-2358"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="462"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="pasul3">
<EasingDoubleKeyFrame KeyTime="0" Value="9.332"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="-8.668"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="pas3_back"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</common:LayoutAwarePage>
Bibliografie
Chappell, D., Introducing Windows Azure, Octombrie 2008
Smeureanu, I. , Dârdală, M. , Reveiu, A., Visual C# .NET, CISON, București 2004
Richter, J. , Applied Microsoft .NETFramework Programming, Microsoft Pess 2002
Stănică, J.L. , Programarea aplicațiilor pentru dispozitive mobile, note de curs, 2013
Botezatu C, Proiectarea sistemelor informatice. Metode sistematice, Editura ProUniversitaria, Buc, 2007
Chichernea V, Garais G, Baze de date. Sistemul FoxPro Vol II, Editura ProUniversitaria, 2006
Moise M., Sisteme informatice cu baze de date, Editura ProUniversitaria, București, 2008
Crișan D., Limbajul C / C++. Fundamente, Vol. 1, Editura ProUniversitaria, 2006
Crișan D., Limbajul C / C++. Programarea orientată obiect, Vol. 2, Editura ProUniversitaria, 2006
Iacob I., SGBD Oracle – Ghid aplicativ pentru realizarea soluțiilor informatice, Editura ProUniversitaria, 2007
Iacob I., ORACLE 10g – Proiectarea și realizarea aplicațiilor cu baze de date utizlizând limbajul SQL*PLUS, Editura ProUniversitaria 2009
Smeureanu I. Ivan I, Dârdală M, Structuri și obiecte în C / C++, Editura CISON, București, 2000
Mușlea I, C/C++ pentru avansați, Editura Microinformatica, Cluj, 1995.
Botezatu C, Iacob I, Proiectarea sistemelor informatice. Studii de caz pentru managementul activităților unei societăți. Editura ProUniversitaria, 2007
Chichernea V, Botezatu C, Iacob I, Fabian G., Avram V., Oprea P, Cârstea C, Baze de date relaționale. Aplicații în turism, Editura CISON, 1998
http://www.windowsazure.com/en-us/documentation/
http://www.windowsazure.com/en-us/home/features/mobile-services/
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Dezvoltarea Unei Aplicatii Windows 8 Pentru Administrarea Activitatilor Unui Studio de Dans, cu Backend în Azure (ID: 149734)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
