Șef lucrări dr. Ing. Ionuț Cristian Resceanu Iulie, 2015 CRAIOVA ii UNIVERSITATEA DIN CRAIOVA FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI ELECTRONICĂ… [611719]
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI
ELECTRONICĂ
DEPARTAMENTUL DE AUTOMATICĂ ȘI ELECTRONICĂ
PROIECT DE DIPLOMĂ
Ionuț – Bogdan Bontea
COORDONATOR ȘTIINȚIFIC
Șef lucrări dr. Ing. Ionuț Cristian Resceanu
Iulie, 2015
CRAIOVA
ii
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI
ELECTRONICĂ
DEPARTAMENTUL DE AUTOMATICĂ ȘI ELECTRONICĂ
APLICAȚIE DE GESTIUNE BILETE AVION
Ionuț – Bogdan Bontea
COORDONATOR ȘTIINȚIFIC
Șef lucră ri dr. Ing. Ionuț Cristian Resceanu
Iulie, 2015
CRAIOVA
iii
„Învățământul ar trebui astfel conceput, încât ceea ce oferă să fie perceput ca un dar
neprețuit, nu ca o datorie apăsătoare .”
Albert Enstein
iv
DECLARAȚIE DE ORIGINALITATE
Subsemnatul BONTEA IONUȚ BOGDAN, student: [anonimizat], Calculatoare și Electronică a Universității din
Craiova, certific prin prezenta că am luat la cunoștință de cele prezentate mai jos și că îmi asum, în
acest context, originalitatea proiectului meu de licență:
cu titlul APLICAȚIE DE GESTIUNE BILETE AVION,
coordonată de ȘEF LUCRĂRI DR. ING. IONUȚ CRISTIAN RESCEANU,
prezentată în sesiunea IULIE 2015.
La elaborarea proiectului de l icență, se consideră plagiat una dintre următoarele acțiuni:
reproducerea exactă a cuvintelor unui alt autor, dintr -o altă lucrare, în limba română sau prin
traducere dintr -o altă limbă, dacă se omit ghilimele și referința precisă,
redarea cu alte cuvint e, reformularea prin cuvinte proprii sau rezumarea ideilor din alte
lucrări, dacă nu se indică sursa bibliografică,
prezentarea unor date experimentale obținute sau a unor aplicații realizate de alți autori fără
menționarea corectă a acestor surse,
însuș irea totală sau parțială a unei lucrări în care regulile de mai sus sunt respectate, dar care
are alt autor.
Pentru evitarea acestor situații neplăcute se recomandă:
plasarea între ghilimele a citatelor directe și indicarea referinței într -o listă coresp unzătoare la
sfărșitul lucrării,
indicarea în text a reformulării unei idei, opinii sau teorii și corespunzător în lista de referințe
a sursei originale de la care s -a făcut preluarea,
precizarea sursei de la care s -au preluat date experimentale, descrie ri tehnice, figuri, imagini,
statistici, tabele et caetera,
precizarea referințelor poate fi omisă dacă se folosesc informații sau teorii arhicunoscute, a
căror paternitate este unanim cunoscută și acceptată.
Data, Semnătura candidat: [anonimizat],
v
UNIVERSITATEA DIN CRAIOVA
Facultatea de Automatică, Calculatoare și Electronică
Departamentul de Automatică și Electronică Aprobat la data de
…………………
Șef de departament,
Prof. dr. ing.
Emil PETRE
PROIECTUL DE DIPLOMĂ
Numele și prenumele studentu lui:
Bontea Ionuț Bogdan
Enunțul temei:
Aplicație de gestiune bilete avion
Datele de pornire:
C#, .Net,SQL Server
Conținutul proiectului:
1. Introducere î n .Net si Limbajul C#
2. Proiectarea bazei de date
3. Prezentarea aplicaț iei
4. Arhitectura sistemului – Realizare practică
5. Concluzii
Material grafic obligatoriu:
Imagini, capturi de ecran,
Consultații:
Periodice
Conducătorul științific
(titlul, nume și prenume, semnătura): Șef lucrări dr. Ing. Resceanu Ionuț Cristian
Data eliberării teme i:
05.11 .2014
Termenul estimat de predare a
proiectului:
01.07.2015
Data predării proiectului de către
student și semnătura acestuia:
vi
UNIVERSITATEA DIN CRAIOVA
Facultatea de Automatică, Calculatoare și Electronică
Departamentul de Automatică și Electronică
REFERATUL CONDUCĂTORULUI ȘTIINȚIFIC
Numele și prenumele candidatului/ -ei:
Specializarea: [Denumirea oficială a specializării absolvite de candidat ]
Titlul proiectului: [Titlul lucrării ]
Locația în care s -a realizat practica de
documentare (se bifează una sau mai
multe din opțiunile din dreapta): În facultate □
În producție □
În cercetare □
Altă locație: [ se detaliază ]
În urma analizei lucrării candidatului au fost constatate următoarele:
Nivelul documentării Insuficie nt
□ Satisfăcător
□ Bine
□ Foarte bine
□
Tipul proiectului Cercetare
□ Proiectare
□ Realizare
practică □ Altul
[se detaliază ]
Aparatul matematic utilizat Simplu
□ Mediu
□ Complex
□ Absent
□
Utilitate Contract de
cercetare □ Cercetare
internă □ Utilare
□ Altul
[se detaliază ]
Redactarea lucrării Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Partea grafică, desene Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Realizarea
practică Contribuția autorului Insuficientă
□ Satisf ăcătoare
□ Mare
□ Foarte mare
□
Complexitatea
temei Simplă
□ Medie
□ Mare
□ Complexă
□
Analiza cerințelor Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Arhitectura Simplă
□ Medie
□ Mare
□ Complexă
□
Întocmirea
specificațiilor
funcționale Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Implementarea Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
vii
Testarea Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Funcționarea Da
□ Parțială
□ Nu
□
Rezu ltate experimentale Experiment propriu
□ Preluare din bibliografie
□
Bibliografie Cărți
Reviste
Articole
Referințe web
Comentarii
și
observații
În concluzie, se propune:
ADMITEREA PROIECTULUI
□ RESPINGEREA PROIECTULUI
□
Data , Semnătura conducătorului științif ic,
REZUMATUL PROIECTULUI
Această aplicație a fost creată cu scopul de a ajuta angajații unei companii care
efectuează vânzarea biletelor de calătorie dar și cu scopul de a monitoriza activitatea acestora .
Aplicația caută în doar câteva secunde printre sutele de înregistrări aflate în baza de
date a companiei care o deține și oferă posibilitatea alegerii zborului la clasa și data dorită de
către cumpărator.
Aplicația este alcătuită din două mari secțiuni:
secțiunea angajat
secțiunea administrator
În secțiunea angajat sunt coordonate toate proce sele la care un angajat are acces.
Acesta poate să: adauge sau să editeze un zbor din baza de date, să vizualizeze toate zborurile
care s -au efectuat până la data curentă, să adauge sau să elimine noi locații.
Secțiunea a dministrator este reprezentată de un grafic care indică numărul de bilete
vândute de fiecare angajat pe o perioadă de o lună. Cu ajutorul acestui grafic administratorul
poate urmări activitatea fiecarui angajat, și poate realiza astfel o statistică.
Primul capitol al lucrării este alcătuit din trei subcapitole, astfel: primul subcapitol
prezintă arhitectura .Net, componen tele arhitecturii cât și modul de compilare a unui program
în .Net. Cel de -al doilea prezintă o scurtă descriere a limbajului C#, avantajele acetuia față de
limbajele C++ și Java. Pe lângă acestea mai sunt prezentate tipurile de date întâlnite în C#,
struc tura unui program C#, și sintaxa limbajului. În cel de -al treilea subcapitol este descrisă
relația dintre C# și arhitectura .Net.
Cel de -al doilea capitol al lucrării cuprinde descriere a arhitecturii bazei de date,
modul în care a fost creată și a program ului Sql Server Management 2014, program utilizat
pentru realizarea practică a bazei de date.
În capitolul trei este prezentată aplicația, descrierea formelor ce o al cătuiesc cât și
modul de funcționare al acestora. Tot aici a m prezentat pentru fiecare fereastră în parte,
meniurile și submeniurile specifice fiecăreia și modul în care ultilizatorul poate interacționa
cu aplicația. În încheierea capitolului se regăsește rezultatul final al aplicației, biletul
cumpărătorului.
Capitolul patru prezintă arhit ectura sistemului ce stă la baza aplicației dar și realizarea
practică a acesteia. Aplicația este structurată în cinci proiecte, ce funcționează pe baza
arhitecturii MVP. Pentru fiecare fereastră sunt prezentate și exemplificate secvențele de cod
corespunz ătoare. Acest capitol se încheie prin prezentarea legăturilor dintre proiecte.
Lucrarea se încheie prin prezentarea concluziilor care reiau o serie de idei din
cuprinsul acesteia, concluzii care sunt confirmarea rezumatului și a temei tratate în lucrare.
Termenii cheie: C#, .NET, SQL Server, MVP, Model – View – Controler .
CUPRINS
CAPITOLUL I……………………………………………………………… …..4
1. Introducere î n .Net ș i Limbajul C# ……………………………… ……………………4
1.1. Introducere î n .NET …………………………………………………… ..4
1.1.1. Prezentare generală ………………………………………… ……… 4
1.1.2. Arhitectura .NET Framework ……………………………… ……… ..5
1.1.3. Compilarea programelor î n .NET …………………………… ……… .5
1.1.4. Componente ale lui .NET Framework ……………………… …………7
1.1.4.1. Common Intermediate Language ……………………… ……… …7
1.1.4.2. Common Language Specification ……………………… …………8
1.1.4.3. Common Language Runtime …………………………… ……….9
1.1.4.4. Common Type System ………………………………… ……..10
1.1.4.5. Metadate …………………………………………… ………..11
1.1.4.6. Assemblies ……………………………………………… ….11
1.1.4.7. Assembly cache ………………………………………… ……12
1.1.4.8. Garbage collection ……………………………………… ……12
1.2.Introducere î n limbajul C# ………………………………………………. …………….12
1.2.1.Carac terizare …..…………………………………………… ……..12
1.2.2. Avantajele limbajului C# fata de C++ ……………………… ……….13
1.2.3. Avantajele limbajului C# fata de Java ……………………… ……….14
1.2.4. Structura unui program C# ……………………………………………… ……….14
1.2.5. Sintaxa limbajului …………………………………… ……………15
1.2.6. Tipuri de date în limbajul C# …………………………… ……………………….16
1.3. Relaț ia dintre C# si arhitectura .NET …………………………………….17
CAPITOLU L II…………………………………………………………………18
2. Proiectarea bazei de date ………………………………………………..18
2.1. Preze ntare Sql Server Management 2014 ………………………… ………18
2.2. Crearea tabelelor bazei de date …………… ……………………………..19
2.3. Arhitectura internă a bazei de date …………………… …………… …….22
CAPITOLUL III…………………………………………………… ..…………24
3. Prezentarea aplicaț iei……………………………………………………24
3.1. Prezentare generală …………………………………………………….24
3.2. Fereastra Autentificare ……… ………………………………………….25
3.3. Fereastra Admninistrator ………………………………………………..26
3.4. Fereastra Principală …………………………………………………….27
3.4.1. Secțiunea – Meniuri ………………………………………………28
3.4.1.1. Meniul Zbor ……………………………………………….28
3.4.1.1.1. Adaugă zbor ……… ………………… ……………….28
3.4.1.1.2. Editează zbor …………………………………………31
3.4.1.1.3. Istoric ……………………………………………….32
3.4.1.2. Meniul Locație ……………………………………………33
3.4.1.2 .1. Adaugă locație ………………………………………..33
3.4.1.2 .2. Editează locație ……………………………………….34
3.4.1.3. Meniul Deconectare ………………………………………34
3.4.1.4. Meniul Exit ………………………………………………35
3.4.2. Secțiunea – Caut ă zbor……………………………………………35
3.4.3. Secțiunea – Rezultate Zboruri ………………………………………36
3.4.4. Secțiunea – Cumpărator …………………………………………..37
3.5. Bilet ………………………………………………………………….37
CAPITOLUL IV..………………………………………………………………38
4. Arhitectura sistemului – Realizare practică ……………………………..38
4.1. Structura aplicaț iei …………………………………………………….38
4.2. Proiectul AirlinesTickets …… …………………………………………..40
4.3. Proiectul AirlinesTicketsBLL ……………………………………………53
4.4. Proiectul AirlinesTicketsBO …………………………………………….62
4.5. Proiectul AirlinesTicketsDAL ……………………………………………65
4.6. Proiectul Common ……………………………………………………..69
4.7. Prezentarea legă turilor dintre proiecte ……… ……………………………70
Concluzii ……………………………………………………………… ……….72
Bibiliografie ……………………………………………………………………73
Anexă cod ………………………………………………………………………74
LISTA FIGURILOR
Figura 1.1. Arhitectura .NET …… ………………………………………………… ………….5
Figura 1.2. Compilarea unui program …… ……………………………………………………6
Figura 1.3. Common Intermediate Language …… ……………………………………………7
Figura 1.4. Common Language Specification …… ……………………………………………8
Figura 1.5. Common Language Runtime …… ………………………………………………..9
Figura 1.6. Categorii de tipuri …… ………… ………………………………………………..10
Figura 2.1. Figura Microsoft SQL Server 2014 …… ………………………………………..18
Figura 2.2. Baza de date BileteAvion ………… …… …………………………………………21
Figura 2.3. Tabelele bazei de date …… ………………………………………………………23
Figura 3.1. Fereastra Autentificare …… ………… ……………………………………………25
Figura 3.2. Fereastra Administrator …… …………………………………………………….26
Figura 3.3 . Fereastra Principală …… …………………………………………………………27
Figura 3.4. Secțiunea meniuri …… ……………………………………………………………28
Figura 3.5 . Meniul Zbor …… …………………………………………………………………28
Figura 3.6 . Fereastra Adaugă zbor …… ………………………………………………………29
Figura 3.7 . Secțiunea – Rute …… ……………………………………………………………30
Figura 3.8 . Secțiunea – Clasa …… ……………………………………………………………30
Figura 3.9 . Secțiunea – Tipuri zbor …… ………………………………………… …………..31
Figura 3.10 . Fereastra Editează zbor …… ……………………………………………………31
Figura 3.11 . Fereastra Istoric …… ……………………………………………………………32
Figura 3.12 . Meniul Locaț ie…… …………………………………………………………….33
Figura 3.13 . Fereastra Adaugă locaț ie…… …………………………………………………..33
Figura 3. 14. Fereastra Editează locaț ie…… ………………………… ………………………34
Figura 3.15 . Meniul Deconectare …… ……………………………………………………….34
Figura 3.16 . Meniul Exit …… ………………………………………………………………..35
Figura 3.17 . Secțiunea – Caută zbor…… …………………………………………………….35
Figura 3.18 . Secțiunea – Rezultate zboruri …… ……………………………………………..36
Figura 3.19 . Secțiunea – Cumpărător …… …………………………………………………..37
Figura 3.20. Bilet …… ……………………………………………………………………….37
Figura 4.1. Arhitectura MVP …… …………………………………………………………..38
Figura 4.2. Proiectul AirlinesTickets …… ………………………… …………………………40
Figura 4.3. Fereastra Adaugă zbor…… ………………………………………………………41
Figura 4.4. Fereastra Adaugă locație …… ……………………………………………………43
Figura 4.5. Fereastra Autentificare …… ………………………………………………………44
Figura 4.6. Fereastra Istoric …… …………………………………………………………….. 46
Figura 4.7. Fereastra Administrator …… ……………………………… …………………….47
Figura 4.8. Fereastra Editează locație…… …………………………………………………..48
Figura 4.9. Fereastra Editează zbor…… ……………………………………………………..50
Figura 4.10. Fereastra Principală …… ………………………………………………………..52
Figur a 4.11. Proiectul AirlinesTicketsBLL …… ……………………………………………..60
Figura 4.12. Proiectul AirlinesTicketsBO …… ………………………………………………62
Figura 4.13. Proiectul AirlinesTicketsDAL …… …………………………………………….66
Figura 4.14. Proiectul Common …… …………………………………………………………69
Figura 4.15 . Legă turile dintre proiecte …… ………………………………………………….70
4
Capitolul I
~ Introducere în .Net ș i Limbajul C# ~
1.1. Introducere î n .NET
1.1.1. Prezentare generală
.NET Framewo rk este dezvoltat de Microsoft ș i rulează în principal pe Microsoft
Windows. Microsoft a î nceput dezvoltarea .NET Framework la sf ârșitul anilor 1990, sub
numele de Next Generation Services Windows (NGWS). Prima versiune beta de .NET a
apărut în anul 2000.
Arhitectura .NET este un cadru de dezvoltare a softului care permite realizarea,
distribu irea și rularea aplicațiilor -desktop Windows ș i aplicaț iilor WEB. Limbajul C# se află
într-o strânsă legatură cu arhitectura .Net. Microsoft a dezvoltat limbajul C# pentru crearea
codului platformei .NET , la fel cum destinația inițială a limbajului C# a fo st de a implementa
sistemul de operare UNIX.
.NET unește mai multe tehnologii ș i mai multe limbaje de programare (Visual Basic,
C++, C#) asigurând totodată atât p ortabilitatea codului compilat î ntre diferite calculatoare cu
sistem Windows, cât și reutili zarea codului în programe, indif erent de limbajul de programare
utilizat.
.NET Framework (pronunțat Dot Net) este constituit din două entități importante:
Common Language Runtime (CLR)
CLR este mediul de execuție al programelor. Acesta este modulul care s e
ocupă cu mana gementul și execuția codului scris în limbaje specific .Net.
Common Language Runtime furnizează de asemenea servicii importante,
printre care enumerăm: securitatea aplicațiilor, portabilitatea acestora,
managementul memoriei și tratare a excepțiilor.
Framework Class Library (FCL)
Este vorba despre Biblioteca de clase .NET. Aceasta acoperă o arie largă a
necesităților de programare, printre acestea se enumeră: interfața cu
5
utilizatorul, conectarea la baza de date și accesarea datelor, de zvoltarea
aplicațiilor web, comunicarea în reț ele ș i altele. Codul bibliotecii este
preco mpilat fiind astfel încapsulat î n funcții, numite metode. Ac este metode
pot fi apelate de că tre programator din propriul program. La rândul lor
metodele aparțin clasel or, acestea sunt organizate și separate între ele cu
ajutorul spatiilor de nume (namespaces).
1.1.2. Arhitectura .NET Framework
Figura 1.1 schematizează arhitectura platformei .NET. Componenta .NET Framework
este alcătuit ă din compilatoare, bi blioteci ș i alte executabile utile în rularea aplicațiilor .NET.
Fișierele corespunzătoare se află în general în directorul C: \Windows \Microsoft.NET \
Framework \V3.0….
1.1.3. Compilarea programelor în .NET
Un program scris î ntr-unul dintre limbajele .NET confo rm Common Language
Specification (CLS) este compilat î n Microsoft Intermediate Languag e (MSIL sau IL). Codul
obținut î n urma compilării are extensia “ exe”, dar nu este direct executabil, ci respectă
formatul unic MSIL.
CLR include o mașină virtuală asemă nătoare cu o mașină Java. Această mașină
execută instrucțiunile IL rezultate în urma compilării. Mașina utilizează un compilator special
Figura 1.1. Arhitectura .NET
Common Language Runtime
( excepții, validări, c ompilatoare JIT)
Framework Base Classes
(IO, securitate, fire de execuție, colecții, etc.)
Data and XML Classes
(ADO.NET, SQL, XML, etc.)
Servicii WEB
Formulare
CLR
FCL
6
numit JIT (Just In Time), care analizează codul IL corespunzător apelului unei metode și
produce codul mașină adecvat ș i eficient.
Compilatorul recunoaște secvențele de cod pentru care a fost obținut codul mașină
adecvat, permițând astfel reutilizarea acestuia fără recompilare, ceea ce face ca pe parcusul
rulării, aplicațiile .NET să fie din ce î n ce mai rapide.
Dator ită faptului că programul IL produs de diferitele limbaje este foarte asemănător
are c a rezultat interoperabilitatea î ntre aceste limbaje. Clasele și obiectele create într -un
limbaj specific .NET pot fi utilizate cu succes în altul.
În plus, CLR se mai oc upă și de gestionarea automată a memoriei. Un mecanism
implementat în platforma .NET fiind acela de eliberare automată a zonelor de memorie
asociate unor date devenite inutile – Garbage Collection.
Trebuie menționat că, .NET Framework este implementarea u nui standard numit
Common Language Infrastructure, ceea ce perm ite rularea aplicațiilor .NET, î n afară de
Windows și pe unele tipuri de Unix, Linux, S olaris, Mac ș i alte sisteme de operare.
C#
Managed
C++
C++C
VB
Microsoft Intermediate Language
(MSIL sau IL)
Common Language Runtime
Windows
Linux
Figura 1.2. Compilarea unui program
7
1.1.4. Componente ale lui .NET Framework
1.1.4.1. Common Intermediate La nguage
Denumit anterior Microsoft Intermediate Language sau MSIL este nivelul cel mai mic
definit de Common Language Infrastructure (CLI). Una dintre uneltele de care dispune
ingineria software este abstractizarea.
Microsoft a realizat propria sa abstra ctizare de limbaj, aceasta numindu -se: Common
Intermediate Language. Deși există multe limbaje de programare de nivel î nalt (C#, C++,
Visual Basi c .NET, etc.) toate produc cod î n același limbaj intermediar: Common
Intermediate Language.
La fel ca Bytecod -ul, CIL are trăsături OOP, precum abstractizarea datelor,
moștenire a, polimorfismul, excepțiile sau evenimentele. De remarcat că această abstractizare
de limbaj permite rularea aplicațiilor independent de platformă cu condiția să existe o mașină
virtuală pentru acea platformă.
Proces ul de executare este următorul:
Codul sursă este transformat în Common Intermediate Language (CIL) sau MSIL ,
acesta fiind echivalent cu CLI a limbajului de asamblare pentru un processor.
VB.NET
C#
VB.NET Compiler
C# Compiler
Microsoft Intermediate Language (MSIL)
Common Language Runtime
JIT (Just In Time) Compilers
Native Code
Figura 1.3. Common Interme diate Language
8
CIL este apoi asambla t într -o formă numită bytecode ș i un ansamblu CLI este
creat.
La executarea unui ans amblu CLI, codul său este trecut prin runtime de
compilatorul JIT pentru a genera cod nativ.
Procesorul calculatorului execută codul nativ.
1.1.4.2. Common Language Specification
Unul din principalele scopuri .NET este de a sprijin i integrarea limbajelo r astfel î ncât
programele, chiar dacă sunt scrise î n limbaje diferite, pot interopera, folosind din p lin
moștenirea, polimorfismul, încapsularea, etc. Codul este diferit de la un limbaj la altul: de
exemplu unele sunt case sensitive, altele nu.
Pentru a fi asigurată interoperabilitatea codului scris în diferite limbaje, Microsoft a
publicat Common Language Specification (CLS), conținând specificații de reguli necesare
pentru integrarea limbajelor. Common Language Specification este un subset al lui Common
Type System (CLS).
Common Language Specification definește un set de reguli pentru compilatoarele
.NET, asigurând faptul că codul generat de fiecare compilator interferează cu platforma într –
un mod independent de limbajul su rsă. Chiar dacă au fost create în alte limbaj e, obiectele pot
interacționa fără probleme.
Concret, se po ate ca o clasă scrisă î n C# să fie moștenită de o clasă scrisă în Visual
Basic care aruncă excepții ce sunt prinse de cod scris in C++.
Visual Basic
C#
Common Language Specification (CLS )
.NET – Framework
C++
F#
Figura 1.4. Common Language Specification
9
1.1.4.3. Common Language Runtime
Common Language Runtime este cea mai importantă componentă a lui .NET
Framework. Este responsabilă cu managementul și execuția codul ui scris în limbaje .NET
aflat în format CIL. CLR î ndeplineșt e mai multe funcții: instanțiază obiectele, face verificări
de securit ate, depune obie ctele î n memorie, disponibilizează memoria prin garbage
collection.
În urma compilării unei aplicații este obținut un fișier cu extensia “exe” , acesta nu
este un executabil portabil Windows, deoarece este un executabil portabil .NET (.N ET PE).
Common Language Runtime utilizează tehnologia compilării JIT – adică o implementare de
mașină virtuală, în care o metodă sau o funcție care este apelată pentru prima dată este
tradusă în cod mașină.
Codul translatat este depus într -un cache fiin d evitată astfel recompilarea ulterioară.
Există 3 tipuri de compilatoare JIT:
Normal JIT – adică o implementare de mașină virtuală, în care o metodă sau o
funcție care este apelată pentru prima dată este tradusă în cod mașină.
Pre-JIT – compilează întreg ul cod î n cod nativ o singură dată. Acest compilator
este folosit la instalări.
Visual
Basic
C#
Common
Language
Runtime
(CLR )
.NET –
Framework
Other .NET
Language
Figura 1 .5. Common Language Runtime
Native Code
Compile time
Runtime
10
Econo – JIT – este folosit pentru dispozitivele cu resurse limitate. Compilează
codul CIL bit cu bit eliberând astfel resursele folosite de codul nativ ce este
stocat î n cache.
În concluzie, activitatea unui compilator JIT (Just In Time) este destinată
îmbunătățirii performanței execuției, ca alternativă la compilarea repetată a celeiași bucăți de
cod în cazul unor apelări multiple.
1.1.4.4. Common Type System
Pentru a fi asigurată interoperabilitatea limbajelor din .NET Framework, o clasă scrisă
în C# trebuie să fie echivalentă cu o clasă scrisă în VB.NET, o interfață scrisă în Managed
C++ trebuie să fie perfect utilizabilă în Managed Cobol.
Toate limbajele care fac part e din ansamblul a rhitecturii .NET trebuie să aibă un set
comun de concept pentru a putea fi integrate. Modul în care acest deziderat s -a transformat în
realitate se numește Common Type System (CTS), mai exact orice limbaj trebuie să
recunoască și să poată manipula niște tipuri comune.
Există numeroase componente ale lui Common Language Runtime care îl fac cea mai
importantă parte a arhitecturi .NET: metadata, assemblies, assembly cache, reflection,
garbage collection.
Figura 1.6. Categorii de tipuri
11
Common Type System suport ă două categorii generale de tipuri, fiecare dintre acestea fiind
împărțite în subcategorii:
Tipuri de valoare
Acestea conțin direct datele lor, iar instanțele tipurilor de v aloare sunt fie
alocate pe stivă , fie sunt alocate inlin e într -o structură.
Tipuri de referință
Acestea se clasifică în tipuri self -describing, tipuri pointer și tipuri de interfață.
Tipul self -descr ibing se clasifică în tablouri și clase, care la rândul lor se
împart î n tipul self -describing, tipuri pointer și tipuri de interfață.
1.1.4.5. Metadate
Cuvântul metadate înseamnă „date despre date”. Metadatele în .NET reprezint ă
detaliile destinate a fi citite ș i folosite de către platformă. Acestea sunt stocate împreună cu
codul pe care îl descriu. Datorită metadatelor, Common Language Runtime știe cum să
instanțieze obiectele, cum să le apeleze metodele și cum să acceseze proprietățile.
Prin intermediul mecanismului numit reflectare , o aplicație poate să interogheze
această metadată și să afle ce expune un tip de date (clasă, structură, etc.).
1.1.4.6. Assemblies
Un assembly reprezintă un bloc funcțional al unei aplicații .NET. Acesta alcătuiește
unitatea fundamental ă de distri buire, versionare, reutilizare ș i permisiuni de securitate. La
runtime, un tip d e date există doar în interiorul unui assembly, ne putând exista în exteriorul
acestuia. Un assembly conține metadatele care sunt utilizate de CLR.
Scopul acestor „assemblies” este să asigure dezvoltarea softului în mod „plug -and-
play”, dar metadatele nu sunt suficiente pentru a realiza acest lucru. Pentru a asigura
dezvolta rea softului mai sunt necesare ș i „manifestele”.
12
1.1.4.7. Assembly cache
În assembly cache se găsesc versiuni multiple ale aceluiași assembly. Dacă programul
de instalare este scris corect se va evita suprascrierea assembly -urilor deja existente, fi ind
adaugat doar noul assembly.
Acest proces este un mod de rezolvare a problemei „DLL Hell” , unde suprascrierea
unei biblioteci dinamice cu o variantă mai nouă putea duce la nefuncționar ea corectă a
aplicațiilor anterior instalate. Pe baza informațiilor din manifest, CLR decide care este
versiunea corectă de assembly de care o aplicație are nevoie.
1.1.4.8. Garbage collection
Garbage collection este un mecanism care se declanșează în m omentul în care
alocato rul de memorie răspunde negativ la o cerere de alocare de memorie. Implementarea
este d e tipul „ mark and sweep”: adică inițial se presupune că toată memoria alocată poate fi
disponibilizată, după care se determină care din obiecte sunt referite de variabilele aplicației.
Variabilele care nu mai sunt referite sunt dealocate, iar celelalte zone de memorie sunt
compactate. În general Common Language Runtime este cel care se ocupă de apelarea
mecanismului de garbage collection.
1.2. Introduce re în limbajul C#
1.2.1.Caracterizare
C# este un limbaj de programare orientat pe obiecte, simplu, modern, conceput de
Microsoft la sfârșitul anilor 90. Limbajul C# a fost conceput ca un concurent pentru limbajul
Java. La fel ca Java, limba jul C# deriv ă din limbajul de programare C++.
Simplitatea limbajului C# este dată de absența pointerilor, moștenirea facilităților de
„garbage collection” și managementul automat al memorie datorită integrării pe platforma
.NET.
13
Modernitatea limbajului : C# este conceput pentru construirea de operații scalabile,
robuste ș i interoperabile. Cuprinde un suport „Built In” pentru transformarea componentelor
în serviciu web realizând astfel accesul mai ușor.
Interoperabilitatea : C# include suport pentru CO M, permite utilizarea cu restricții a
pointerilor, componente di n VB.NET și din alte limbaje ce pot fi folosite direct în C#.
Portabilitatea : Codul C# poate fi rulat pe mai mult de 2,2 miliarde de dispozitive cu
Windows, IOS, Android, Linux. C# este po rtabil într -o gamă largă de medii cum ar fi
telefonia mobilă, Embedded, Desktop și Servere de calcul.
În mare, limbajul C# moștenește sintaxa și principiile de programare din C++. Sunt o
serie de tipuri noi de date sau funcționalități diferite ale datelor din C++, iar în spiritul
realizării unor secvențe de cod sigure unele dintre funcționalități au fost adăugate,
diversificate, modificate sau chiar eliminate.
O aplicație tipică Windows, realizată în C#, afișează una sau mai multe ferestre
conținând obiec te cu care utilizatorul va interacționa. Obiectele vizuale ale aplicației sunt
ferestrele (denumite de asemenea „Forms”, sau formulare) și controalele desenate pe ele.
În cadrul unei aplicații Windows , formularele sunt elementele de bază ale interfeței c u
utilizatorul. În C# formularele sunt complet orientate pe obiecte, ele reprezentând de fapt
clase.
1.2.2 . Avantajele limbajului C# fata de C++
Limbajul C# prezintă o serie de avantaje fa ță de limbajul C++:
Biblioteca standard foarte bogată cu lucruri bi ne implementate și ușor de folosit;
Sistemul garbage – collection este nativ;
Clasele și metodele pot fi setate să fie interne în ansamblul în care sunt declarate ;
Permite folosirea blocurilor de cod atât nativ, cât și gestionate;
Permite tratarea semnătur ilor de clasă -metode ca funcții libere si creează astfel relații
mai dinamice si flexibile între clase;
C# este compilat în Intermediate Language, iar C++ este compilat în cod assembly .
14
1.2.3 . Avanta jele limbajului C# fata de Java
Limbajul C# prezintă o serie de avantaje fa ță de limbajul Java:
În loc de implementările de clase și EJB, C# are constructori proprii ușor de folosit
precum Properties sau Events;
Suportă expresia „using” pe care Java o v -a implementa î n Java 7;
Este integrat î n Windows;
Are va riabile dinamice;
1.2.4.Structura unui program C#
Visual Studio .NET dispune de un editor complex de cod, care se folosește pentru
crearea, modificarea și depanarea codului aplicației (poate fi vorba de cod Visual Basic .NET,
Visual C# .NET etc.). De ase menea, oferă un set de obiecte și instrumente cu ajutorul cărora
se pot realiza cu ușurință interfețe cu utilizatorul pentru Windows, Web, servicii WEB etc.
Să începem cu un exemplu clasic, „Hello World!” care apare în toate cărțile de
programare:
1 usi ng System;
2
3 namespace HelloWorld
4 {
5 class Program
6 {
7 static void Main ()
8 {
9 Console.WriteLine (“Hello World!”);
10 }
11 }
12 }
15
Orice aplica ție C# este formată din una sau ma i multe clase format e din date ș i
metode, grupate în spații de nume numite namespaces . În interiorul aceluiași spațiu de nume
putem defini alt spațiu de nume, în acest caz avem de -a face cu spații de nume imbricate.
Un spațiu de nume cuprinde mai multe clase cu nume diferi te având funcționalități
diferite. Două clase pot avea același nu me cu condiția să fie definite î n spații de nume
diferite. În exemplul nostru se află doua spații de nume: unul definit (HelloWorld) și unul
extern inclus prin directiva using (System).
Să comentăm programul de mai sus:
Linia 1: Este o directivă care specifică faptul că se vor folosi clase incluse în spațiul
de nume System . În cazul nostru se va folosi clasa Console .
Linia 3: Spațiul de nume.
Linia 5: orice program C# este compus din una sa u mai multe clase.
Linia 7: metoda Main , „punctu l de intrare” în program.
Linia 9 : clasa Console , este folosită pentru efectuarea operațiilor de intrare/ieșire. Tot
aici este apelată metoda WriteLine din această clasă, pentru afișarea mesajului dorit pe ecran.
1.2.5. Sintaxa limbajului
Limbajul C# are un alfabet alcătuit din litere mari și mici ale alfabetului englez, cifre
și alte semne. Vocabularul este construit din acele simboluri cu semnificații lexicale în
scrierea programelor și anume: nume, exp resii, separatori, delimitatori și comentarii.
Prin numele dat unei var iabile, clase, metode, etc, se î ntelege o succesiune de
caractere care îndeplinește următoarele reguli:
Numele trebuie să înceapă cu o literă sau cu unul dintre caracterele “_” și “@”;
Numele care reprezintă cuvinte cheie nu pot fi folosite în alt scop decât acela pentru
care a fost definit;
Două nume sunt considerate diferite dacă diferă prin cel puțin un caracter;
Cuvintele cheie pot fi folosite în alt scop doar cu condiția să fie p recedate de “@”;
16
Limbajul C# oferă posibilitatea coment ării codului în trei moduri:
Comentariu pe un rând
Comentarea codului pe un singur rând se face utilizând caracterele “ // “ . Tot ce
urmează dupa cararactele “//” sunt considerate din acel loc și până la sfârșitul
rândului drept comentariu.
Comentariu pe mai multe r ânduri
Comentarea codului pe mai multe rânduri se face utilizând simbolurile “ /* și
*/ ”. Orice text cuprins între simbolurile de mai sus se consideră a fi
comentariu. Simbolurile “ /* “ marchează î nceputul comentariului, iar
simbolurile “ */ ” sfârșitul comentariului.
1.2.6. Tipuri de date în limbajul C#
Limbajul C# include do ua categorii de tipuri de date:
Tipuri valoare:
o Tipul simple: byte, char, int, float, etc.;
o Tipul enumerar e: enum;
o Tipul structură: struct;
Tipuri referință :
o Tipul clasă; class;
o Tipul interfață: interface;
o Tipul delegate: delegate;
o Tipul tablou: array;
Pentru că C# respectă un domeniu de valori și fiecare tip valoric are un
comportament, limbajul C# asigură portabilitatea. De exemplu o variabilă declarată de tip int
// Acesta este un comentariu pe un singur rand
/* Intre aceste simboluri
poate fi scris un comentariu
care se intinde pe mai multe randuri */
17
va rămâne tot de tip int indif erent de mediul de execuție. Acest lucru ne ajută la evitarea
rescrierii codului pentru adaptarea programului la o anumită platform ă.
1.3. Relatia dintre C# ș i arh itectura .NET
Între C# și mediul să u de rulare, arhitectura .NET există o legatură deosebită. Pe de o
parte, C# a fost dezvoltat pentru a crea cod utilizat de arhitectura .NET, iar pe de altă parte
bibliotecile utilizate de C# aparțin arhitecturii .NET.
Arhitectura .NET definește două entități importante și anume biblioteca de clase .Net
și motorul comun de programare sau Comm on Language Runtime(CLR). C# neavâ nd o
bibliotecă proprie de clase utili zează biblioteca de clase .NET.
Să lu ăm ca exemplu un pr ogram care efectuează operații de intrare -ieșire, cum ar fi
afișarea unui text pe ecran. Î n acest caz este utilizată biblioteca de clase .NET. Motorul
comun de programare (CLR) se ocupă de execuția programelor C#. Acesta asigură de
asemenea și programarea în limbaj mixt, securitatea și portabilitatea programelor.
În momentul compilării unui prog ram C#, sau a unui program î n limbaj mixt,
rezultatul compilă rii nu este un cod executabil. Î n locul acestuia este produs un fișier care
conține un tip de pseudocod numit limbaj intermediar sau Intermediate Language (IL).
Fișie rul IL obținut poate fi copiat î n orice calculator care dispune de .NET CLR.
Motorul comun de programare (CLR ) transformă codul intermediar î n cod executabil prin
intermediul unui compilator numit Just In Time (JIT).
Procesul de conversie este urm ătorul: câ nd un program .NET este executat , CLR
activează compilatorul JIT. Acesta convertește fișierul IL î n cod executabil pe măsură ce
fiecare parte a programului este necesară.
In concluzie or ice program comp ilat până în format IL poate rula î n orice mediu
pentru care CLR este implementat, astfel arhitectura .NET asigură portabilitate.
18
Capitolul II
~ Proiectarea bazei de date ~
2.1. Prezentare Sql Server Management 2014
Microsoft Sql Serv er (SQL – Structured Query Language) este un sistem relațional de
gestionare a bazelor de date dezvoltat de Microsoft. Precum un server de baze de date, acesta
este un produs software cu funcția principală de stocare și extragere a datelor solicitate de
către alte aplicații software care pot circula fie pe același computer sau pe un alt co mputer
printr -o rețea (inclusiv pe Internet).
Microsoft SQL Server folosește o variant ă de SQL numită T -SQL, sau Transact -SQL,
o implementare de SQL -92 (standardul ISO p entru SQL) cu unele extensii. T -SQL în
principal adaugă sintax a adițională pentru procedurile stocate și pentru tranzacții.
Standardele SQL necesită ACID, acesta este un acronym pentru cele patru condiții
pentru orice tranzacție: atomicitate, consistență, izolare, durabilitate. Microsoft SQL Server
suportă ODBC (Open Database Connectivity).
Figura 2.1. Microsoft SQL Server 2014
19
SQL Server 2014 a fost fabricat pe 18 martie 2014 și lansat pentru publicul larg la 1
aprilie 2014. Acesta îmbunătățeste de asemenea soluția AlwaysOn (HADR) prin susținerea
operațiilor de citire la deconectările secundare -primare și oferă noi recuperări în caz de
dezastru și soluții de rezervă, permițând clienților să folosească abilitățile existente cu SQL
server pentru a prof ita de centre de date Microsoft la nivel mondial.
Microsoft oferă trei versiuni de SQL Server 2014:
SQL Server Microsoft Azure;
SQL Server 2014 CAB;
SQL Server 2014 ISO;
2.2. Crearea tabelelor bazei de date
Sintagma BAZĂ DE DATE a fost întâlnită pentru prima data în anul 1964 la Santa
Monica în titlul unei conferințe. Prin bază de date se înțelege o colecție partajată de date, între
care există relații logice ( și o descriere a acestor dat e ), proiectată pentru a satisfa ce
necesitățile informaționale ale unei organizații.
Tabelul este o colecție de informații logice relaționale tratat ca o unitate. O tabelă este
compusă din înregistrări sau rânduri. Aceste înregistrări sunt tratate ca o simplă unitate.
Fiecare înregistrare este legată de înregistrări al e altei tabele. Înregistrările sunt constituite din
câmpuri (coloane). Un c âmp este o particulă atomică a bazei de date ce reprezintă cea mai
mică cantitate de informație ce poate fi manipulată .
În cazul nostru t abelele bazei de date a u fost create cu ur mătorul cod:
Tabelul locație
create table [Location]
(
Id int identity (1,1),
Name nvarchar (32),
Removed bit,
Primary Key(Id)
)
Tabelul zbor
create table [Flight]
(
Id int identity (1,1),
20
Name nvarchar (32),
SourceId int,
DestinationId int,
Depart ureDate datetime ,
ArriveDate datetime ,
BusinessSeats int,
EconomicSeats int,
BusinessPrice int,
EconomicPrice int,
[Type] nvarchar (32),
Primary key (Id),
foreign key (SourceId ) references [Location] (Id),
foreign key (DestinationId ) references [Loc ation] (Id)
)
Tabelul bilet
create table [Ticket]
(
Id int identity (1,1),
[Type] nvarchar (16),
Price int,
SeatNumber nvarchar (8),
FlightId int,
[Date] datetime ,
EmployeeId int,
Primary key(Id),
foreign key(FlightId ) references [Flight] (Id),
forei gn key(EmployeeId ) references [Employee] (Id)
)
Tabelul persoană
create table [Person]
(
Id int identity (1,1),
Name nvarchar (32),
Cnp nvarchar (16),
[TicketId] int,
primary key (Id),
foreign key (TicketId ) references [Ticket] (Id)
)
Tabelul angajat
create table [Employee]
(
Id int identity (1,1),
Name nvarchar (32),
[Password] nvarchar (32),
primary key(Id)
)
Tabelul tură
create table [Shift]
(
Id int identity (1,1),
[Start] datetime ,
[End] datetime ,
EmployeeId int,
21
primary key(Id),
foreign key (EmployeeId ) references [Employee] (Id)
)
Tabelul administrator
create table [Administrator]
(
Id int identity (1, 1),
Name nvarchar (32),
Username nvarchar (32),
[Password] nvarchar (32),
primary key(Id)
)
Figura 2.2. Baza de date BileteAvion
22
2.3. Arhitectura internă a bazei de date
Arhitectura internă a unei baze de date conține trei niveluri funcționale, niveluri ce au
fost propuse prin standardul ANSI/X3/SPARC. Pri n structura bazei de date se înț elege tipul
datelor, legătura dintre ele, restric țiile ce trebuie sc îndeplinite de date. Cele mai multe baze de
date includ un set de operații ce specifică modul de acces la date.
O structură de date asociată unei baze de date poate fi reprezentată pe trei niveluri,
având ca scop separarea aplicațiilor utilizatorului de baza de date fizică.
Cele trei niveluri sunt:
Nivelul intern
Acest nivel este constituit din schema internă ce descrie structura de stocare
fizică a datelor în baza de date, utilizând un model al datelor fizice. În cadrul
acestui nivel sunt desc rie detaliile complete ale stocării, precum și modul de
acces la date.
Nivelul conceptual
Nivelul conceptual mai este numi t și schema conceptuală a bazei de date.
La acest nivel se face o descriere completă a bazei de date, ascunzând detaliile
legate de stocarea fizică , concentrându -se asupra descrierii entităților, tipurilor
de date, relațiilor de date, relațiilor dintre ele precum și restricțiilor as ociate.
Nivelul extern
Nivelul extern sau nivelul visual include o colecție de scheme externe ce
descriu baza de date prin prisma diferiților utilizatori.
Baza de date a aplicației noastre este formată din șapte tabele . În imaginea următoare
este prezentată baza de date, după ce s -a realizat proiectarea acesteia, crearea tabelelor și a
relațiilor di ntre ele și după ce s -au impus constrângerile.
Liniile dintre tabele arată relațiile care le -am creat prin proiectare între fiecare două
tabele. Legătura dintre două tabele este realizată cu ajutorul celor două chei: primară și
străina. Cheia străina a ta belei, după cum spune și definiția, face legătura cu cheia primară a
celeilalte tabele.
23
Figura 2. 3. Tabelele bazei de date
24
Capitolul III
~ Prezentarea aplicaț iei ~
3.1.Prezentare gen erală
Aceast ă aplicație a fost creată cu scopul de a monit oriza activitatea angajaților unei
companii care efectuează vânzarea biletel or de calătorie. Aplicația caută în doar că teva
secunde printre sutele de î nregistrări afl ate în baza de date a companiei care o deține și oferă
posibilitatea alegerii zborului la clasa și data dorită de către cumpărator.
Aplicația este compusă din două secțiuni:
secțiunea angaja t
secțiunea administrator
Pentru a putea utiliza aplicația atât angajați i cât ș i administratorul trebuie să se
autentifice. Această autentific are se realizează prin introducerea unui nume de utilizator și a
unei o parole. Atât numele de utilizator cât și parola sunt unice pentru fiecare angajat al
companiei.
În momentul introducerii numelui de utilizator și a parolei, aplicația se conectează la
baza de date ș i verifică dacă aceste î nregistrări există în baza de date. Dacă numele de
utilizator sau parola introduse de către persoana care încearcă să utilizeze aplicația sunt
greșite, aplicația afiș ază un mesaj în care atenționează utilizatorul că n umele de utilizator sau
parola au fost introduse greșit.
Dacă numele de utilizator și parola au fost introduse corect, utilizatorului îi este
permis accesul la fereastra principală. Aceasta este compusă din următoarele:
În partea din stânga sus a ferestre i principale se g ăsesc meniurile.
Acestea îi oferă utilizatorului posibiliatatea de a crea o nouă rută de zbor, de a edita
un zbor deja existent în baza de date sau de a vizualiza toate zborurile care au fost efectuate
până la data curentă.
25
De asemenea îi oferă posibilitatea de a adăuga sau de a șterge o destinație din baza de
date. Pe lânga cele menționate mai sus, mai sunt întâlnite două opțiuni, „Deconectare” care
oferă posibilitatea utilizatorului de a se deconecta de la aplica ție și „Exit” care rea lizează
ieșirea din aplicație.
În partea centrală a ferestrei sunt întâlnite următoarele secțiuni: căutarea zborurilor,
afișarea zborurilor și secțiunea rezervată cumpărătorului. Toate aceste secțiuni vor fi descrise
în capitolele următoare.
3.2. Fereas tra de autentificare
Figur a 3.1. Fereastra A utentificare
Fereastra de autentificare este formată dintr -un GroupBox ce conține patru label -uri,
două TextBox -uri, două butoane radio(ang ajat și administrator) ș i un buton „Conecteaza -te”.
Funcționalita te
Utilizatorul aplicației se autentifică prin completarea celor două TextBox -uri cu
numele de utilizator și parola. Numele de utilizator și parola sunt unice pentru fiecare angajat
al firmei. În momentul introducerii numelui de utilizator și a parolei, aplicația se conectează
la baza de date și verifică dacă aceste î nregistrări există în baza de date.
26
În cazul în care numele de utili zator sau parola introduse de că tre persoana care
încea rcă să utilizeze aplicaț ia sunt greșite, aplicația afiș ază un mesa j în care atenționează
utilizatorul ca numele de utilizator sau parola au fost introduse greșit.
Dacă numele de utilizator și parola au fost introduse corect, utilizatorului îi este
permis accesul la fereastra urmatoare. După introducerea datelor în cel e două textbox -uri
utilizatorul are posibilitatea de a selecta secțiunea dorită, angajat sau administrator.
Dacă utlizatorul a selectat secțiunea „Angajat”, acesta va fi redirecționat către
fereastra principală, f ereastră pe care o vom descrie î n capito lele următoare.
În cel de al doilea caz, dacă este selectată secțiunea „ Administrator ” utilizatorul va fi
redirecționat că tre ferea stra „Administrator ”.
3.3. Fereastra Admninistrator
Dacă celor dou ă TextBox -uri (nume și parolă) din fereastra „Autentifica re” au fost
completate corect și a fost aleasă secțiunea administrator, în continuare se va deschide
următoarea fereastră:
Figur a 3.2. Fereastra Administrator
27
Fereastra Administrator este reprezentată de un grafic care indică numărul de bilete
vândute de fiecare angajat pe o perioadă de o lună. Cu ajutorul acestui grafic administratorul
poate urmări activitatea fiecarui angajat, și poate realiza astfel o statistică.
3.4. Fereastra Principală
Dacă celor dou ă TextBox -uri (nume și parolă) din fereastr a „Autentificare ” au fost
completate corect și a fost aleasă secțiunea angajat, î n continuare se va deschide următoarea
fereastră:
Figur a 3.3. Fereastra Principală
Fereastra Principală este fereastra cu care lucrează angatul firmei. Din această
ferea stră sunt coordonate toate proce sele la care un angajat are acces. Astfel, un angajat are
posibilitatea să adauge sau să editeze un zbor din baza d e date, să vizualizeze toate zborurile
care s -au efectuat până la data curentă, să adauge sau să elimine noi locații.
Fereastra principală este compusă din mai multe secțiuni:
Secțiunea – Meniuri;
Secțiunea – Caut ă zbor;
Secțiunea – Rezultate zboruri;
Secțiunea – Cump ărător;
28
3.4.1. Secțiunea – Meniuri
Figura 3.4 . Meniurile ferestrei principale
În această secțiune sunt întâlnite toate procesele pe care un angajat al firmei le poate efectua.
3.4.1.1. Meniul Zbor
Figura 3.5 . Meniul Zbor
Din meniul „Zbor” u tilizatorul aplicației poate adă uga, e dita sau chiar vizualiza toate
zborurile care au avut loc pănă la data curentă.
Acest meniu este alcătuit din trei submeniuri:
Submeniul Adaug ă,
Submeniul Editeaz ă,
Submeniul Istoric.
3.4.1.1.1 . Adaugă zbor
Dacă utilizatorul selectează submeniul „Ad auga” din meniul „ Zbor” acesta va fi
redirecționat către fereastra „ Adauga zbor”.
Aceast ă fereastră este compusa din următoarele secțiuni:
Secțiunea – Rute
Secțiunea – Clasă
Secțiunea – Tipuri zbor
29
Toate câmpurile din aceste secțiuni trebuie complet ate obligatoriu cu date. Î n cazul în
care utilizatorul a omis din greșeală un câmp , va fi atenționat de către aplicație prin afișarea
pe ecran a unui mesaj informativ.
Figura 3.6 . Fereastra Adaugă zbor
Secțiunea – Rute
În această secțiune utilizatoru l definește numele zborului și are posibiliatatea să
aleagă locațiile între care acesta se va desfășura. După definirea numelui și stabilirea rutei
zborului, acestea sunt memorate în baza de date.
30
Figura 3.7 . Secțiunea – Rute
Secțiunea – Clasă
Secți unea este compusă din clasa Business și clasa Economic.
În cadrul acestora utilizatorul poate defini locurile si prețul în funcție de clasa aleasă.
Pentru fiecare dintre cele două clase prețurile diferă în funcție de condițiile oferite,
astfel pentru clasa Business prețul este mai mare decât la clasa Economic.
Figura 3.8 . Secțiunea – Clasa
Secțiunea – Tipuri zbor
Secțiunea este divizată în patru categorii:
o Zboruri Zilnice;
o Zboruri Săp tămânale;
o Zboruri la 2 S ăptămâni;
o Zboruri Lunare;
31
Figura 3.9 . Secțiunea – Tipuri zbor
Pentru fiecare din cele patru categorii, angajatul are posibilitatea să definească data
zborului și durata acestuia. După completarea câmpurilor cu datele dorite și apăsarea
butonului „Adauga”, informațiile sunt salvate automat în baza de date.
3.4.1.1.2 . Editează zbor
Dacă utilizatorul selectează submeniul „Editeaza” din meniul „ Zbor” acesta va fi
redirecționat către fereastra „ Editeaza zbor”.
Figura 3.10 . Fereastra Editează zbor
32
Fereastra „ Editeaza zbor ” oferă utilizatorului posibilitatea de a edita fi ecare tip de
zbor (zilnic, săpt ămânal, la 2 săptămâni sau lunar). Câmpurile se completează automat cu
informații din baza de date atunci când este selectat zborul care urmează a fi editat.
Odată selectat zborul dorit a fi edita t, utilizatorul poate să editeze durata acestuia, ora
de plecare, dar tot odată și clasa zborului, locul ș i prețul acestuia. După efectuarea
modificărilor dorite, toate informațiile modificate sunt salvate în baza d e date prin apăsarea
butonului „ Finalizar e”.
Tot î n cadrul acestei ferestre utilizatorul are posibilitatea de a șterge definitiv un zbor
prin utilizarea butonului „ Sterge”.Aceste procese se pot efectua pentru fiecare tip de zbor în
parte.
3.4.1.1.3. Istoric
Dacă utilizatorul selecteaza su bmeniul „Istoric” din meniul „ Zbor” acesta va fi
redirecționat către fereastra „ Istoric”.
Figura 3.11 . Fereastra Istoric
33
În cadrul acestei ferestre utilizatorul are posibilitatea să vizualizeze toate zborurile
efectuate pâna în acel moment. Aceast ă fereastră oferă utilizatorului informațiile necesare
pentru a vedea numele zborului, locul plecării și destinația, pasagerii din fiecare clasă, data
plecării și data sosirii, dar și durata zborului.
3.4.1.2. Meniul Locație
Figura 3.12 . Meniul Locaț ie
Meniul „Locație” îi oferă utilizatorului dou ă opțiuni, de a adăuga locație ș i de a edita
locațiile existente cu posibilitatea de a șterge orice locație selectată.
3.4.1.2.1. Adaugă locație
Dacă utilizatorul selecteaz ă submeniul „Adauga” din meniul „ Locatie” acesta va fi
redirecționat către fereastra „ Adauga locatie”.
Figura 3.13 . Fereastra Adaugă locaț ie
În urma completării câmpului „ Nume” cu numele locației dorite, prin apăsarea
butonului „Adauga” utilizatorul inserează noua locație în baza de date, crescând tot odat ă
numărul de înregistrări ale bazei de date.
34
În momentul părăsirii ferestrei „ Adauga locatie” prin apăsarea butonului “X” din
colțul dreapta sus al ferestrei, fereastra principală se actualizează automat.
3.4.1.2.2. Editează locaț ie
Pentru a deschide fereastra „ Editeaza locat ie” trebuie selectat submeniul „Editeaza”
din meniul „ Locatie”. Atunci când u tilizatorul deschide fereastra „ Editeaza locatie” , locațiile
existente în baza de date sunt încarcate și afișate automat in ListBo x-ul din fereastră.
Prin operația de selectare de către utilizator a uneia dintre locațiile afișeate în
ListBox -ul prezent, acesta are posibilitatea de a șterge locația selectată folosind butonul
„Sterge ”. Odată efectuată comanda de ștergere locația selec tată este eliminată din baza de
date.
Figura 3.14 . Fereastra Editează locaț ie
3.4.1.3. Meniul Deconectare
Figura 3.15 . Meniul Deconectare
35
Meniul „ Deconectare ” deconectează utili zatorul de la aplicație redirecț ionându -l cătr e
fereastra Autentificare . Îi dă astfel acestuia posibilitatea de a se autentifica cu un alt cont de
angajat sau chiar de administrator.
În funcție de contul introdus în fereastra de autentificare, acesta este redirecționat
către fereastra Principala sau fereastra Administrator.
3.4.1 .4. Meniul Exit
Figura 3.16 . Meniul Exit
Meniul „ Exit” este folosit de utilizator atunci când acesta dorește sa părăsească
definitiv aplic ația. Prin utilizarea meniului „ Exit”, odată cu închiderea aplicației este închisă
și baza de date.
3.4.2. Secțiunea – Caută zbor
Figura 3.17 . Secțiunea – Caută zbor
Această secțiune este alcătuită din două ListBox -uri și un DateTimePiker. Cele două
ListBox -uri sunt populate automat din baza de date la deschiderea aplicației, iar
DateTimePiker se actualiz ează folosind data calculatorului.
36
Pe baza informațiilor conținute de cele două ListBox -uri, utilizatorul poate se lecta
ruta cerută de către cumpă rator. Rolul DateTimePiker -ului este de a stabili data în care se va
efectua zborul cerut. Odată ce toa te inf ormațiile au fost setate î n această secțiune se trece la
următoarea secțiune.
3.4.3. Secțiunea – Rezultate Zboruri
Secțiunea este alcătuit ă dintr -un DataGridView în cadrul căruia sunt afișate zborurile
selectate în secțiunea anterioară. Pentru fiecare zb or afișat, DataGridView îi oferă
utilizatorului posibi litatea să vadă locul plecării ș i destinația zborului, data și ora plecării,
durata zborului, data și ora sosirii, precum și prețul rutei în funcție de clasa dorită de client și
selectată anterior de că tre utilizator.
În cazul în care utilizatorul nu a selectat nici o clasă, este selectată implicit clasa
business.
Figura 3.18 . Secțiunea – Rezultate zboruri
De asemenea, în cadrul acestei secțiuni utilizatorului îi mai este oferită posibilitatea
de a vedea zborurile anterioare sau următoare prin selectarea butonului specific uneia dintre
aceste opțiuni.
Prin selectarea butonului „Anterior” și „ Urmator” îi este oferită posibilitatea de a
vedea următoarele cinci zboruri de l a data selectată din secțiu nea „ Cauta zbor”. Toate aceste
informații î i sunt afișeate utilizatorului î n DataGridView în momentul selectării butonului
„Cauta”.
37
3.4.4. Secțiunea – Cumpăr ător
Figura 3.19. Secțiunea – Cumpărător
În această secțiune utilizatorul completează cele doua câmpuri reprezentate de cele
două TextBox -uri. Prin introducerea numelui ș i prenumelui călătorului, împreună cu Cnp -ul
acestuia, utilizatorul încheie procesul de printare a biletului prin apasarea butonului „OK”.
Cele două câmpuri tr ebuie completate obligatoriu. Î n cazul în care un câmp este omis,
din greșeală sau intenționat, utlilizatorul va fi atenționat de un mesaj informativ care apare în
momentul apăsării b utonului „OK”. Dacă cele două c âmpuri nu sunt completate corect,
procesul de printare a biletului de c ălătorie nu poate fi efectuat cu succes.
3.5.BILET
Mai jos este redat formatul integral al biletului.
Figura 3.20. Bilet
38
Capitolul IV
~ Arhitectura sistemului – Realizare practică ~
4.1. Structura aplicaț iei
Aplicația de gestiune bilete avion are la bază arhitectura MVP.
MVP este acronimul pentru „Model View Presenter”. Această arhitectură reprezintă o
evoluție a modelului de proiectare MVC – „Model View Controller” realizată cu scopul de a
separa legăturile dintre model, view și controller.
Model view presenter a fost dezvoltat iniț ial la Talingent în anul 1990. MVP impune
de la începutul proiectului o c ompartimentare de date, o logic ă, și o interfață fără a
compromite funcționalitatea dintre acestea.
View
View este de o bicei un control uti lizator sau o formă care combin ă mai multe
controlere într -o interfață de utilizator. Această secțiune este responsabilă cu afișarea
conținutulu i modelului și interacțiunea evenimentelor utilizatorului.
VIEW
(Control)
Presenter
Model
Figura 4.1. Arhitectura MVP
39
Presenter
Presenter -ul deține t oată logica pentru view și este responsabil cu
sincronizarea dintre Model ș i View. În cazul în car e View -ul anunță Presenter -ul că
utilizatorul a făcut ceva (ca de exemplu click pe un buton), presenter -ul va actualiza modelul
și sincroniza orice modificare între Model și View.
Modelul
Modelul definește datele care urmează să fie afișate în view. Acesta transmite
datele cerute de view prin intermediul presenter -ului.
Procesul tipic de implementare a unui MVP (Model -View -Presenter) include
următoarele sa rcini:
1. Implementarea unei clase Presenter
Presenter -ul trebui e să se ocup e de evenimentele utilizator, să actualizeze modelul și
să manipuleze starea view -ului.
2. Implementarea unei interfețe
O interfață nu poate conține cod executabil, numai semnături de metode, proprietăți,
evenimente sau indexatori. O clasă sau structură care implementează interfața trebuie să
implementeze membrii specificați în definiția interfeței.
3. Implementarea unei clase View
View transmite evenimentele la presenter și expune p roprietăți care permit presenter –
ului să manipuleze starea acestuia.
Aplica ția de gestiune bilete avion este împarțită în cinci proiecte dup ă cum urmează:
AirlinesTicketsUI
AirlinesTicketsBLL
AirlinesTicketsBO
AirlinesTicketsDAL
Common
40
4.2. Proiectu l AirlinesTickets UI
În cadrul proiectului AirlinesTicketsUI sunt construite ferestrele care vor interacționa
cu utlizatorul, având astfel o importanță deosebită. Aceste ferestre con țin diverse câmpuri
care colectează informații de la utilizator.
În următoare a etapă informațiile sunt preluate de la ferestre adică de la view și
interpretate de presenter. În urma interpretări i datelor, presenter -ul comunic ă cu modelul și
returnează view -ului rezultatele obținute. Aceste rezultate vor fi afișate utilizator ului prin
intermediul view -ului.
În continuare vom analiza fiecare fereastră din acest proiect:
Figura 4.2. Proiectul AirlinesTickets
4.2.1. Fereastra „Adauga zbor”
Această fereastră poate f i accesată de utilizator selectâ nd submeniul „Adauga” din
meniul „Zbor” al ferestrei principale. Prin intermediul acestei ferestre utilizatorul are
posibilitatea de a defini numele zborului, locul plecării și destinația, numărul de locuri și
prețul pentru fiecare clasă, data și durata zborului.
41
Toate câmpurile completate de catre utilizator sunt adăugate automat în baza de date
prin selectarea butonului „Adauga”. Dacă utilizatorul nu a completat toate câmpurile, acesta
va fi atenționat de către aplicație ce câmp nu a fost completat prin intermediul unui mesaj
informativ.
Figura 4. 3. Fereastra Adaugă zbor
Codul realizării acestei ferestre:
namespace Airlines_Tickets
{
public partial class AddFlight : Form, IAddFlight
{
private AddFlightPresenter _presenter;
public AddFlight()
{
InitializeComponent();
AttachPresenter( new AddFlightPresenter ());
}
//ataseaza un presenter ferestrei
public void AttachPresenter( AddFlightPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
//evenimentul de click al butonului de adaugare a unui zbor zilnic
private void button1_Click( object sender, EventArgs e)
{
if (textBox1.Text.Length == 0)
{
MessageBox .Show("Introduce -ți numele ");
return;
42
}
if (!(listBox1.SelectedIndex > -1 && listBox2.SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.SelectedIndex))
{
MessageBox.Show("Selectează o locație validă ");
return;
}
if (textBox2.Text.Length == 0 || textBox3.Text.Length == 0)
{
MessageBox .Show("Preț invalid ");
return;
}
if (numericUpDown1.Value == 0 || numericUpDown2.Value == 0)
{
MessageBox .Show("Număr de locuri invalid ");
return;
}
if (dateTimePicker1.Value <= DateTime .Now)
{
MessageBox .Show("Dată plecare invalidă ");
return;
}
if (textBox4.Text.Length == 0 || textBox5.Text.Length == 0)
{
MessageBox .Show("Durată invalidă ");
return;
}
// crearea obiectului care reprezinta zborul zilnic adaugat
DailyFlightBO flight = new DailyFlightBO ()
{
FlightType = FlightType .Daily,
Name = textBox1.Text,
Source = listBox1.SelectedItem as LocationBO ,
Destination = listBox2.SelectedItem as LocationBO ,
DepartureDate = dateTimePicker1.Value,
ArriveDate = dateTimePicker1.Value.AddHours( Convert.ToInt32(textBox4.Text))
.AddMinutes( Convert.ToInt32(textBox5.Text)),
BusinessSeats = ( int)numericUpDown1.Value,
BusinessPrice = Convert.ToInt32(textBox2.Text),
EconomicSeats = ( int)numericUpDown2.Value,
EconomicPric e = Convert.ToInt32(textBox3.Text)
};
_presenter.AddDailyFlight(flight);
Refresh();
}
//evenimentul de click al butonului de adaugare a unui zbor saptamanal
private void button2_Click( object sender, EventArgs e)
{
if (textBox1.Text.Length == 0)
{
MessageBox .Show("Inserează nume ");
return;
}
if (!(listBox1.SelectedIndex > -1 && listBox2.SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.SelectedIndex))
{
MessageBox .Show("Selectează o locație validă ");
return;
}
if (textBox2.Text.Length == 0 || textBox3.Text.Length == 0)
{
MessageBox .Show("Preț invalid ");
return;
}
if (numericUpDown1.Value == 0 || numericUpDown2.Value == 0)
43
{
MessageBox .Show("Număr locuri invalid ");
return;
}
if (dateTimePicker2.Value <= DateTime .Now)
{
MessageBox .Show("Dată plecare invalidă ");
return;
}
if (textBox6.Text.Length == 0 || textBox7.Text.Length == 0)
{
MessageBox .Show("Durată invalidă ");
return;
}
// crearea obiectului care reprezinta zborul saptamanal adaugat
WeeklyFlightBO flight = new WeeklyFlightBO ()
{
FlightType = FlightType .Weekly,
Name = textBox1.Text,
Source = listBox1.SelectedItem as LocationBO ,
Destination = listBox2.SelectedItem as LocationBO ,
DepartureDate = dateTimePicker2.Value,
ArriveDate = dateTimePicker2.Value.AddHours( Convert.ToInt32(textBox6.Text))
.AddMinutes( Convert.ToInt32(textBox7.Text)),
BusinessSeats = ( int)numericUpDown1.Value,
BusinessPrice = Convert.ToInt32(textBox2.Text),
EconomicSeats = ( int)numericUpDown2.Value,
EconomicPrice = Convert.ToInt32(textBox3.Text)
};
_presenter.AddWeeklyFlight(flight);
Refresh();
}
}
4.2.2 . Fereastra „Adauga locat ie”
Permite utilizatorului adă ugarea de locații noi.
Figura 4. 4. Fereastra Adaug ă locație
Codul necesar realizării acestei ferestre:
namespace Airlines_Tickets
{
public partial class AddLocation : Form, IAddLocation
{
private AddLocationP resenter _presenter;
44
public AddLocation()
{
InitializeComponent();
AttachPresenter( new AddLocationPresenter ());
}
//atasearea unui presenter
public void AttachPresenter( AddLocationPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
//afiseara exceptiilor aparute in program
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
//evenimentul de click al butonului de adaugare a unei locatii
private void button1_Click( object sender, EventArgs e)
{
if(textBox1.Text.Length != 0)
{
_presenter.AddLocation(textBox1.T ext);
textBox1.Clear();
}
else
{
MessageBox .Show("Nume invalid ");
}
}
}
4.2.3 . Fereastra „A utentificare ”
Această fereastră are două roluri importante: de securitate deoarece nici un utilizator
nu poate folosi aplicația fără un nume de utlizator și o parolă și de a monitoriza vânzarile de
bilete efectuate de fiecare angajat.
Figura 4. 5. Fereastra Autentifi care
45
Codul necesar realizării acestei ferestre:
namespace Airlines_Tickets
{
public partial class LogInWindow : Form, ILogIn
{
MainWindow _mainWindow;
AdminForm _adminForm;
LogInPresenter _presenter;
public LogInWin dow()
{
InitializeComponent();
AttachPresenter( new LogInPresenter ());
}
//evenimentul de click al butonului de log in
private void button1_Click( object sender, EventArgs e)
{
//verifica datele introduse de angajat
if(radioButton1.Checked)
{
if (textBox1.Text.Length == 0 || textBox2.Text.Length == 0)
{
MessageBox .Show("Fill both Name and Password fields" );
}
else
{
EmployeeBO emp = new EmployeeBO ()
{
Name = textBox1.Text,
Password = textBox2.Text
};
if (_presenter.ValidateEmployee(emp))
{
_presenter.StartShift();
_mainWindow = new MainWindow ();
_mainWindow.Show();
this.Hide();
}
else
{
MessageBox .Show("Invalid creditials" );
}
}
}
//verifica datele introduse de administrator
else if(radioButton2.Checked)
{
if (textBox1.Text.Length == 0 || textBox2.Text.Length == 0)
{
MessageBox .Show("Fill both Name and Password fields" );
}
else
{
AdministratorBO adm = new AdministratorBO ()
{
Username = textBox1.Text,
Password = textBox2.Text
};
if (_presenter.ValidateAdministrator(adm))
{
_adminForm = new AdminForm ();
_adminForm.Show();
_adminForm.FormClosed += _adminForm_FormClosed;
//_mainWindow = new MainWindow();
//_mainWindow.Show();
46
this.Hide();
}
else
{
MessageBox .Show("Invalid creditials" );
}
}
}
}
//evenimentul de inchidere al ferestrei administratorului
void _adminForm_FormClosed( object sender, FormClosedEventArgs e)
{
Application .Restart();
}
}
4.2.4. Fereastra „Istoric ”
În cadrul acestei ferestre utilizatorul are posibilitatea să vizualizeze toate zborurile
efectuate pâna în acel moment. Această fereastră oferă utilizatorului informațiile necesare
pentru a vedea numele zborului, locul plecării și destinația, pasagerii din fiecare clasă, data
plecării și data sosirii, dar și durata zborului.
Figura 4. 6. Fereastra Istoric
Codul necesar realizării acestei ferestre:
namespace Airlines_Tickets
{
public partial class History : Form, IHistory
{
private HistoryPresenter _presenter;
public History()
{
InitializeComponent();
AttachPresenter( new HistoryPresenter ());
47
}
public void AttachPresenter( HistoryPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
public void LoadFlight( HistoryFlight flight)
{
//incarcarea tabelului cu istoricul zborurilor din baza de date
string[] row =
{
flight.Name,
flight.Source,
flight.To,
flight.BTraveler.ToString(),
flight.ETraveler.ToString(),
flight.Departure.ToString(),
flight.Arrive.ToString(),
(flight.Arrive -flight.Departure).Hours + ":" + (flight.Arrive –
flight.Departure).Minutes
};
ListViewItem item = new ListViewItem (row[0]);
for(int i = 1; i<8; i++)
{
item.SubItems.Add(row[i]);
}
listView1.Items.Add(item);
}
}
4.2.5. Fereastra „Administrator ”
Figura 4.7. Fereastra Administrator
Fereastra Administrator este reprezentată de un grafic care indică numărul de bilete
vândute de fiecare angajat pe o perioadă de o lună. Această fereastră poate fi accesată doar de
administrator.
48
Codul neces ar realizării acestei ferestre:
namespace Airlines_Ticket s
{public partial class AdminForm : Form, IAdminView
{
private AdminFormPresenter _presenter;
public AdminForm()
{
InitializeComponent();
AttachPresenter( new AdminFormPresenter ());
}
public void AttachPresenter( AdminFormPresenter pressenter)
{
_presenter = pressenter;
_presenter.SetView( this);
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
private void AdminForm_Load( object sender, EventArgs e)
{
List<EmployeeBO > em = _ presenter.GetEmployees();
foreach (EmployeeBO item in em)
{
chart1.Series[ "Bilete" ].Points.AddXY(item.Na me + " (" +
_presenter.GetTicketsAmount(item).ToString() + ")",presenter.GetTicketsAmount(item));
}
}
4.2.6. Fereastra „Editeaza locatie ”
Prin operația de selectare de către utilizato r a uneia dintre locațiile afiș ate în ListBox –
ul prezent, acesta are posibilitatea de a șterge locația selectată folosind butonul „Sterge ”.
Figura 4. 8. Fereastra Editeaz ă locație
49
Codul necesar realizării ace stei ferestre:
namespace Airlines_Tickets
{
public partial class ViewLocations : Form, IViewLocation
{
private ViewLocationPresenter _presenter;
public ViewLocations()
{
InitializeComponent();
AttachPresenter( new ViewLocationPresenter ());
}
public void AttachPresenter( ViewLocationPresenter presenter)
{ _presenter = presenter;
_presenter.SetView( this);
}
private void ViewLocations_Load( object sender, EventArgs e)
{ foreach (LocationBO item in _presenter.GetLocations())
{
listBox1.Items.Add(item);
}
}
//evenimentul de click al butonului care elimina o locatie
private void button1_Click( object sender, EventArgs e)
{
if(listBox1.SelectedIndex <0)
{
MessageBox .Show("Locație neselectată ");
}
else
{
_presenter.RemoveLocation(listBox1.SelectedItem as LocationBO );
Reload();
}
}
50
4.2.7. Fereastra „Editeaza zbor ”
Odată selectat zborul dorit a fi editat, utilizatorul poate să editeze durata acestuia, ora
de plecare, dar tot odată și clasa zborului, locul și prețul acestuia. După efectuarea
modificărilor dorite, toate informațiile modificate sunt salvate în baza d e date prin apăsare a
butonului „ Finalizare ”.
Figura 4. 9. Fereastra Editeaz ă zbor
Codul necesar realizării acestei ferestre:
namespace Airlines_Tickets
{
public partial class EditFlight : Form, IEditFlight
{
private EditFlightPresenter _presenter;
public EditFlight()
{
InitializeComponent();
AttachPresenter( new EditFlightPresenter ());
}
//incarcarea combobox -ului care contine zborurile zilnice
public void LoadDailyFlights( List<DailyFlightBO > flights)
{
comboBox1.Items.Clear();
foreach (DailyFlightBO item in flights)
{
comboBox1.Items.Add(item);
}
}
//incarcarea combobox -ului care contine z borurile lunare
public void LoadMonthlyFlights( List<MonthlyFlightBO > flights)
{
comboBox4.Items.Clear();
foreach (MonthlyFlightBO item in flights)
{
comboBox4.Items.Add(item);
51
}
}
//evenimentul de incarcare al ferestrei la momentul deschiderii
private void EditFlight_Load( object sender, EventArgs e)
{
_presenter.LoadDailyFlights();
_presenter.LoadWeeklyFlights();
_presenter.LoadTwoWeeksFlights();
_presenter.LoadMonthlyFlights();
}
//incarcarea campurilor zborului zilnice ce urmeaza a fi editat
private void FillForEdit( object sender, EventArgs e)
{
DailyFligh tBO flight = comboBox1.SelectedItem as DailyFlightBO ;
int hour = Math.Abs((flight.ArriveDate – flight.DepartureDate).Hours);
int minutes = Math.Abs((flight.ArriveDate – flight.DepartureDate).Minutes);
textBox1.Text = hou r.ToString();
textBox2.Text = minutes.ToString();
textBox24.Text = flight.DepartureDate.Hour.ToString();
textBox23.Text = flight.DepartureDate.Minute.ToString();
//dateTimePicker1.Value = flight.DepartureDa te;
numericUpDown1.Value = flight.BusinessSeats;
numericUpDown2.Value = flight.EconomicSeats;
textBox3.Text = flight.BusinessPrice.ToString();
textBox4.Text = flight.EconomicPrice.ToString();
}
//evenimentul de click al butonului care sterge un zbor lunar
private void button8_Click( object sender, EventArgs e)
{
if(comboBox4.SelectedIndex>=0)
{ _presenter.RemoveMonthlyFlight(comboBox4.SelectedIt em as MonthlyFlightBO );
_presenter.LoadMonthlyFlights();
comboBox4.SelectedIndex = -1;
textBox13.Clear();
textBox14.Clear();
textBox15.Clear();
textBox16.Clear( );
textBox17.Clear();
textBox18.Clear();
numericUpDown7.Value = 0;
numericUpDown8.Value = 0;
}
}
//incarcarea campurilor zborului lunar ce urmeaza a fi edita t
private void FillMonthlyFlight( object sender, EventArgs e)
{
MonthlyFlightBO flight = comboBox4.SelectedItem as MonthlyFlightBO ;
int hour = Math.Abs((flight.ArriveDate – flight.DepartureDate).Hours);
int min = Math.Abs((flight.DepartureDate – flight.ArriveDate).Minutes);
textBox16.Text = hour.ToString();
textBox15.Text = min.ToString();
textBox18.Text = flight.DepartureDate.Hour.ToString();
textBox17.Text = flight.DepartureDate.Minute.ToString();
numericUpDown8.Value = flight.BusinessSeats;
numericUpDown7.Value = flight.EconomicSeats;
textBox14.Text = flight.BusinessPrice.ToString();
textBox13.Text = flight.Eco nomicPrice.ToString();
}
}
}
52
4.2.8. Fereastra „Fereastra principal ă”
Fereastra principală este fereastra cu care lucrează angatul firmei. Din această
fereastră sunt coordonate toate procele la care un angajat are acces.
Figura 4. 10. Fereas tra Principal ă
Codul necesar realizării acestei ferestre:
namespace Airlines_Tickets
{
public partial class MainWindow : Form, IMainWindow
{
#region Private fields
private MainWindowPresenter _presenter;
private ViewLocati ons _viewLocations;
private AddLocation _addLocation;
private AddFlight _addFlight;
private History _history;
private EditFlight _editFlight;
#endregion
public MainWindow()
{
InitializeCom ponent();
AttachPresenter( new MainWindowPresenter ());
label3.Text = "Logged as: " + Common. GlobalValues .loggedEmployee.Name;
label5.Text = "Date: " + DateTime .Now.ToString( "dd-MM-yyyy");
label7.Text = "Time: " + DateTime .Now.ToString( "hh:mm:ss tt" );
timer1.Start();
}
public void AttachPresenter( MainWindowPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
53
//reincarcarea listelor care contin locatiile
public void Reload()
{
listBox1.Items.Clear();
listBox2.Items.Clear();
foreach (LocationBO item in _presenter.GetLocations())
{
listBox1 .Items.Add(item);
listBox2.Items.Add(item);
}
}
//elementul din meniu care deschide fereastra ce permite vizualizarea locatiilor
private void viewToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_viewLocations == null)
{
_viewLocations = new ViewLocations ();
_viewLocations.Show();
_viewLocations.FormClosed += _viewLocations_FormClosed;
}
else
{
_viewLocations.Activate();
}
}
//evenimentul care apare la inchiderea ferestrei de vizualizare a locatiilor
void _viewLocations_FormClosed( object sender, FormClosedEventArgs e)
{
_viewLocations = null;
Reload();
}
////elementul din meniu care deschide fereastra ce permite adaugarea locatiilor
private void addToolStripMenuItem1_Click( object sender, EventArgs e)
{
if(_addLocation == null)
{
_addLocation = new AddLocation ();
_addLocation.Show();
_addLocation.FormClosed += _addLocation_FormClosed;
}
else
{
_addLocat ion.Activate();
}
}
//evenimentul care apare la inchiderea ferestrei de adaugare a locatiilor
void _addLocation_FormClosed( object sender, FormClosedEventArgs e)
{
_addLocation = null;
Reload();
}
//elementul din meniu care deschide fereastra ce permite adaugarea zborurilor
private void addToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_addFlight == null)
{
_addFlight = new AddFlight ();
_addFlight.Show();
_addFlight.FormClosed += _addFlight_FormClosed;
}
else
{
_addFlight.Activate();
}
}
54
//evenimentul care apare la inchiderea ferestrei de adaugare a zborurilor
void _addFlight_FormClosed( object sender, FormClosedEventArgs e)
{
_addFlight = null;
}
//elementul din meniu care deschide fereastra ce permite vizualizarea is toricului
private void historyToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_history == null)
{
_history = new History();
_history.Show();
_history.FormClos ed += _history_FormClosed;
}
else
{
_history.Activate();
}
}
//evenimentul care apare la inchiderea ferestrei de vizualizare a istoricului
void _history_FormClosed( object sender, FormClosedEventArgs e)
{
_history = null;
}
//elementul din meniu care deschide fereastra ce permite editarea zborurilor
private void editToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_editFlight == null)
{
_editFlight = new EditFlight ();
_editFlight.Show();
_editFlight.FormClosed += _editFlight_FormClosed;
}
else
{
_editFlight.Activate();
}
}
//evenimentul care apare la inchiderea ferestrei de editare a zborurilor
void _editFlight_FormClosed( object sender, FormClosedEventArgs e)
{
_editFlight = null;
}
//evenimentul de click al butonului de cautare a zborurilor
private void button1_Click( object sender, EventArgs e)
{
if(radioButton3.Checked)
{
if(listBox1.SelectedIndex > -1 && listBox2. SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.SelectedIndex)
{
bool business = radioButton1.Checked;
_presenter.SearchFlight(listBox1.SelectedItem as LocationBO ,
listBox2.SelectedItem as LocationBO , dateTimePicker1.Value, business);
}
}
}
public int flightIndex = 0;
//vizualizarea zborului urmator
public void LoadNext( IFlight flight)
{ dataGridView1.Rows.Clear();
if (flight.FlightType == FlightType .Daily)
{
DailyFlightBO fl = flight as DailyFlightBO ;
55
string[] row = {
fl.Source.Name,
fl.Destination.Na me,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":"
+(fl.ArriveDate – fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
dataGridView1.Rows.Add(row);
}
else if (flight.FlightType == FlightType.Monthly)
{
MonthlyFlightBO fl = flight as MonthlyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
else if (flight.FlightType == FlightType .TwoWeeks)
{
TwoWeeksFlightBO fl = fligh t as TwoWeeksFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.Economi cPrice.ToString()
};
}
else
{
WeeklyFlightBO fl = flight as WeeklyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
button2.Enabled = (AllFlights.Count > 1 && flightIndex > 0);
button3.Enabled = (AllFlights.Count -1 > flightIndex);
}
List<IFlight> AllFlights = new List<IFlight>();
//incarcarea zborurilor dupa data selectata
public void LoadFlight( List<IFlight> flights)
{
dataGridView1.Rows.Clear();
AllFlights = flights;
if(flights[0].FlightType == FlightType .Daily)
{
56
DailyFlightBO fl = flights[0] as DailyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":"
+(fl.ArriveDate – fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
dataGridView1.Rows.Add(row);
}
else if (flights[0].FlightType == FlightType .Monthly)
{
MonthlyFlightBO fl = flights[0] as MonthlyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
else if (flights[0].FlightType == FlightType .TwoWeeks)
{
TwoWeeksFlightBO fl = flights[0] as TwoWeeksFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
else
{
WeeklyFlightBO fl = flight s[0] as WeeklyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.Econom icPrice.ToString() };
}
button2.Enabled = false;
button3.Enabled = (AllFlights.Count > 1);
}
//evenimentul de click al butonului ce incarca zborul anterior
private void button2_Click( object sender, EventArgs e)
{
flightIndex –;
button2.Enabled = (AllFlights.Count > 1 && flightIndex > 0);
button3.Enabled = (AllFlights.Count > flightIndex);
LoadNext(AllFlights[flightIndex]);
}
57
//evenimentul de click al butonului ce incarca urmatorul zbor
private void button3_Click( object sender, EventArgs e)
{
flightIndex++;
button2.Enabled = (AllFlights.Count > 1 && flightIndex > 0);
button3.Ena bled = AllFlights.Count – 1 == flightIndex ? false : true;
LoadNext(AllFlights[flightIndex]);
}
//verifica daca este selectat un zbor pt cumapararea biletului
public bool SelectedFlight()
{
try
{
return AllFlights[flightIndex].Id != 0;
}
catch (Exception e)
{
return false;
}
}
//evenimentul de click al butonului de finalizare a vanzarii unui bil et
private void button5_Click( object sender, EventArgs e)
{
if(textBox2.Text.Length==0||textBox4.Text.Length!=13 || !SelectedFlight())
{
MessageBox .Show("Name and identity number are mandatory" );
}
else
{
try
{
TicketBO ticket = new TicketBO ()
{
Id = _presenter.GetLastTicketId() + 1,
Type = radioBut ton1.Checked ? TicketType .Business :
TicketType .Economic,
Price = radioButton1.Checked ?
AllFlights[flightIndex].BusinessPrice:AllFlights[flightIndex].EconomicPrice,
SeatNo =
(_presenter.GetTicketId(AllFlight s[flightIndex])+1).ToString(),
FlightId = AllFlights[flightIndex].Id
};
if(radioButton1.Checked)
{
int seats = _presenter.GetSeatsNumber(AllFlights[ flightIndex])[0];
if (_presenter.SoldTicketsNumber(AllFlights[flightIndex])[0] ==
seats)
{
MessageBox .Show("There are no more seats available" ); ;
return;
}
else
{
PersonBO person = new PersonBO ()
{
Name = textBox2.Text,
Cnp = textBox4.Text,
Ticket = ticket
};
_presenter.AddTicket(ticket);
_presenter.AddPerson(person);
PrintTicket(ticket, person);
textBox2.Clear();
textBox4.Clear();
58
}
}
else
{
int seats = _presenter. GetSeatsNumber(AllFlights[flightIndex])[1];
if (_presenter.SoldTicketsNumber(AllFlights[flightIndex])[1] ==
seats)
{
MessageBox .Show("There are no more seats available" ); ;
return;
}
else
{
PersonBO person = new PersonBO ()
{
Name = textBox2.Text,
Cnp = textBox4.Text,
Ticket = ticket
};
_presenter.AddTicket(ticket);
_presenter.AddPerson(person);
PrintTicket(ticket, person);
textBox2.Clear();
textBox4.Clear();
}
}
}
catch (ArgumentOutOfRangeException ex)
{
MessageBox .Show("No flight found" );
}
}
}
//crearea biletului in format pdf si deschiderea documentului
public void PrintTicket( TicketBO ticket, PersonBO person)
{
PdfDocument pdf = new PdfDocument ();
pdf.Info.Title = "Ticket ID: " + ticket.Id;
PdfPage pdfPage = pdf.AddPage();
XGraphics graph = XGraphics .FromPdfPage(pdfPage);
XFont font = new XFont("Verdana" , 20, XFontStyle .Bold);
DateTime date = _presenter.GetFlightById(ticket.FlightId).DepartureDate;
string dateString = date.Day + "/"+date.Month + "/" + date.Year + " " +
date.Hour + ":"+date.Minute;
TimeSpan duration = _presenter.GetFlightById(ticket.FlightId).ArriveDate -date;
string durationString = duration.Hours + "h " + duration.Minutes+ "m";
string ticketContent = "Traveler: " + person.Name + " CNP: " +
person.Cnp.ToString();
graph.DrawString(ticketContent, font, XBrushes .Black, new XRect(10, 10,
pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "Flight ID: " + ticket.FlightId, font, XBrushes .Black, new
XRect(10, 70, pdfPa ge.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
string seatNumber = ticket.SeatNo;
string cls = ticket.Type.ToString();
graph.DrawString( "\tFrom: " +
_presenter.GetFlightById(ticket.FlightId).Source.Name + "\n\tTo: " +
_presenter.GetFlightById(ticket.FlightId).Destination.Name, font, XBrushes .Black, new
XRect(30, 130, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "clasa: " + cls, font, XBrushes .Black, new XRect(30, 130,
pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "Departure date: " + dateString, font, XBrushes .Black, new
XRect(10, 190, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "Duration: " + durationString, font, XBrushes .Black, new
XRect(10, 250, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
string pdfFilename = "ticket.pdf" ;
59
pdf.Save(pdfFilename);
Process.Start(pdfFilename); }
//evenimentul de inchidere al ferestrei principale, inchiderea aplicatiei
private void MainWindow_FormClosed( object sender, FormClosedEventArgs e)
{
_presenter.EndShift();
Application .Exit();
}
//evenimentul de click al elementului 'Exit' din meniu
private void exitToolStripMenuItem_Click( object sender, EventArgs e)
{
Application .Exit();
}
private void settingsToo lStripMenuItem_Click( object sender, EventArgs e)
{
_presenter.EndShift();
this.Hide();
Application .Restart();
}
private void timer1_Tick( object sender, EventArgs e)
{
label3.Te xt = "Conectat ca: " + Common. GlobalValues .loggedEmployee.Name;
label5.Text = "Data: " + DateTime .Now.ToString( "dd-MM-yyyy");
label7.Text = "Ceas: " + DateTime .Now.ToString( "hh:mm:ss tt" );
}
}
}
4.3. Proiectul Airline sTicketsBLL
BLL reprezintă acronimul pentru Business Logic Layer. Acest proiect funcționează
ca o punte între stratul de prezentare adică Proiectul AirlinesTicketsUI și proiectul
AirlinesTicketsDAL. AirlinesTicketsBLL primește toate valorile pe care uti lizatorul le
introduce în ferestrele din proiectul AirlinesTicketsUI, date care sunt transmise proiectului
AirlinesTicketsDAL.
Toate rezultatele returnate de Airlinet icketsDAL proiectului AirlinesTicketsBLL sunt
convertite în BO (Business Object) pentru a putea fi afișate în ferestrele din proiectul
AirlineTicketsUI.
Proiectul AirlinesTicketsBLL este cel mai important proiect din întreaga arhitectură,
deoarece conț ine toată logica aplicației. În concluzie ori de câte ori un utilizator dorește să
actualizeze logica aplicației, acesta trebuie să actualizeze doar proiectul AirlinesTicketsBLL.
60
Figura 4. 11. Proiectul AirlinesTicketsBLL
Codul întâlnit în cadrul acest ui proiect este următorul:
Clasa angajați
namespace AirlinesTicketsBLL
{ public class EmployeeBLL
{ //validarea datelor de login introduse de utilizator
public bool ValidateEmployee( EmployeeBO emp)
{try
{
return new EmployeeDAL ().ValidateEmployee(emp);
}
catch (Exception e)
{throw e;}
}
}
Clasa Zboruri
namespace AirlinesTicketsBLL
{ public class FlightBLL
{ //adaugarea unui zbor zilnic in baza de date
public void AddDailyFlight( DailyFlightBO flight)
{ try
{
new DailyFlightDAL ().AddFlight(flight);
}
//returneaza un zbor in functie de id
public IFlight GetFlightById( int id)
{ try
{
return new DailyFlightDAL ().GetFlightById(id);
}
//returneaza istoricul zborurilor din baza de date
public List<HistoryFlight > GetHistory()
{ try
{
return new FlightDAL ().GetHistory();
}
61
//returneaza zborurile zilnice din baza de date
public List<DailyFlightBO > GetDailyFlights()
{ try
{
return new DailyFlightDAL ().GetFlights();
}
//returneaza zborurile gasite in functie de criteriile de cautare
public List<IFlight> FoundFlight( LocationBO source, LocationBO destination,
DateTime date, bool business)
{ try
{
return new FlightDAL ().FoundFlight(source, dest ination, date, business);
}
//returneaza numarul de locuri ale unui zbor
public int[] GetSeatsNumber( IFlight flight)
{ try
{
return new FlightDAL ().GetSeatsNumber(flight);
}
//returneaza numarul de bilete vandute pentru un zbor
public int[] SoldTicketsNumber( IFlight flight)
{ try
{
return new FlightDAL ().SoldTicketsNumber(flight);
}
//stergerea unui zbor zilnic din ba za de date
public void RemoveDailyFlight( DailyFlightBO flight)
{ try
{
new DailyFlightDAL ().RemoveFlight(flight);
}
//editarea unui zbor zilnic
public void EditDailyFlight( DailyFlightBO flight, DailyFlightBO editedFlight, int
hour, int min, int depH, int depM)
{ try
{
new DailyFlightDAL ().EditFlight(flight, editedFlight, hour, min, depH, depM);
}
}
Clasa Locații
namespace AirlinesTicketsBLL
{public class LocationBLL
{ //adaugarea unui zbor in bazade date
public void AddLocation( LocationBO location)
{try
{
new LocationDAL ().Insert(location);
}
//returneaza locatiile din baza de date
public List<LocationBO > GetLocations()
{try
{
return new LocationDAL ().GetLocations();
}
//sterge o locatie din baza de date
public void RemoveLocation( LocationBO location)
{try
{
new LocationDAL ().RemoveLocation(location);
} } }
Clasa persoane
namespace AirlinesTicketsBLL
{public class PersonBLL
62
{ //adaugarea unei persoane in baza de date
public void AddPerson( PersonBO person)
{try
{
new PersonDAL ().AddPerson(person);
}
}
}
}
Clasa tură
namespace AirlinesTicketsBLL
{ public class ShiftBLL
{ //inceperea unui schimb al unui angajat recent logat
public void StartShift()
{try
{
new ShiftDAL ().StartShift();
}
//terminarea schmbului angajatului in momentul in care da logout
public void EndShift()
{try
{
new ShiftDAL ().EndShift();
}
}
}
Clasa bilet
namespace AirlinesTicketsBLL
{public class TicketBLL
{ //returneaza id -ul unui bilet in functie de zbor
public int GetTicketId( IFlight flight)
{try
{
return new TicketDAL ().GetTicketId(flight);
}
//adaugarea unui bilet in baza de date
public void AddTicket( TicketBO ticket)
{try
{
new TicketDAL ().AddTicket(ticket);
}
//returneaza id -ul ultimului bilet vandut
public int GetLastTicketId()
{try
{
return new TicketDAL().GetLastTicketId();
}
}
}
4.4. Proiectul AirlinesTicke tsBO
Proiectul AirlinesTicketsBO nu este nimic mai mult decât o colecție de clase ce au
aceeași structură cu tabelele din baza de date. Este utilizat în principal pentru a trece date de
la o parte a proiectului la alta. Proiectul AirlinesTicketsBO nu are nici o referință către
celelalte proiecte din cadrul soluției, însă toate celelalte proiecte au referință către acesta.
63
După cum puteți observa în figura 4.1 Arhitectura MVP, obiectele sunt obținute de la
View (reprezentat de proiectul AirlinesTickets) și sunt setate în AirlinesTicketsBLL.
Structura proiectului AirlinesTicketsBO poate fi urmărită în următoarea figură:
Figura 4. 12. Proiectul AirlinesTicketsBO
În următoarele pagini va fi descr is codul pentru unele clase din componența proiectului:
Clasa Zboruri zilnice
namespace AirlinesTicketsBO
{public class DailyFlightBO : IFlight
{private int id;
public int Id
{ get { return id; } set { id = value; } }
private int businessSeats;
public int BusinessSeats
{ get { return businessSeats; } set { businessSeats = value; } }
private int economicSeats;
public int EconomicSeats
{ get { return economicSeats; } set { economicSeats = value; } }
private int businessPrice;
public int BusinessPrice
{ get { return businessPrice; } set { businessPrice = value; } }
private int economicPrice;
public int EconomicPrice
{ get { return economicPrice; } set { economicPrice = value; } }
private FlightType flightType;
public FlightType FlightType
64
{ get { return flightType; } set { flightType = value; } }
private string name;
public string Name
{ get { return name; } set { name = value; } }
private LocationBO source;
public LocationBO Source
{ get { return source; } set { source = value; } }
private LocationBO destination;
public LocationBO Destinat ion
{ get { return destination; } set { destination = value; } }
private DateTime departureDate;
public DateTime DepartureDate
{ get { return departureDate; } set { departureDate = value; } }
private DateTime arriveDate;
public DateTime ArriveDate
{ get { return arriveDate; } set { arriveDate = value; } }
public override string ToString()
{
return Name;
}
}
}
Clasa tipuri zbor
namespace AirlinesTicketsBO
{public class HistoryFlight
{ private string name;
public string Name
{ get { return name; } set { name = value; } }
private string source;
public string Source
{ get { return source; } set { source = value; } }
private string to;
public string To
{ get { return to; } set { to = value; } }
private int bTraveler;
public int BTraveler
{ get { return bTraveler; } set { bTraveler = value; } }
private int eTraveler;
public int ETraveler
{ get { return eTraveler; } set { eTraveler = value; } }
private DateTime departure;
public DateTime Departure
{ get { return departure; } set { departure = value; } }
private DateTime arrive;
public DateTime Arrive
{ get { return arrive; } set { arrive = value; } }
}
}
Clasa locație
namespace AirlinesTicketsBO
{public class LocationBO
{ private int id;
public int Id
{ get { return id; } set { id = value; } }
private string name;
public string Name
{ get { return name; } set { name = value; } }
public override string ToString()
{ return Name; }
private bool removed;
public bool Removed
{ get { return removed; } set { removed = value; } }
}
65
}
Clasa tură
namespace AirlinesTicketsBO
{ public class ShiftBO
{ private int id;
public int Id
{ get { return id; } set { id = value; } }
private DateTime start;
public DateTime Start
{ get { return start; } set { start = value; } }
private DateTime end;
public DateTime End
{ get { return end; } set { end = value; } }
private int employeeId;
public int EmployeeId
{ get { return employeeId; } set { employeeId = value; } }
}
}
Clasa bilet
namespace AirlinesTicketsBO
{ public class TicketBO
{ private int id;
public int Id
{ get { return id; } set { id = value; } }
private TicketType type;
public TicketType Type
{ get { return type; } set { type = value; } }
private double price;
public double Price
{ get { return price; } set { price = value; } }
private string seatNo;
public string SeatNo
{ get { return seatNo; } set { seatNo = value; } }
private int flightId;
public int FlightId
{ get { return flightId; } set { flightId = value; } }
}
}
4.5. Proiectul AirlinesTicke tsDAL
Acest proiect se conectează la baza d e date prin intermediul proiectului Common. În
funcție de datele furnizate de proiectul AirlinesTicke tsBLL acest proiect interoghează baza
de date și returnează informațiile găsite în urma efectuării procesul.
Este utilizat în principal pentru a face in terogări asupra bazei de date, SELECT,
UPDATE, DELETE, etc. Structura proiectului Airline sTicketsDALL este reprezentată î n
figura de mai jos:
66
Figura 4. 13. Proie ctul AirlinesTicketsDAL
În continuare vor fi prezentate cateva clase ce conțin exemple de i nterogări:
Clasa persoane
namespace AirlinesTicketsDAL
{ public class PersonDAL
{
#region Queries
string addPerson = "insert into Person values(@name, @cnp, @ticketId)" ;
#endregion
//adaugarea unei persoane in baza de date
public void AddPerson( PersonBO person)
{ using (DbConnector con = new DbConnector ())
{try
{ SqlCommand command = new SqlCommand (addPerson, con.myConnection);
command.Parameters .Add("@name", person.Name);
command.Parameters.Add( "@cnp", person.Cnp);
command.Parameters.Add( "@ticketId" , new TicketDAL ().GetLastTicketId());
command.ExecuteNonQuery();
}
}
}
}
Clasa bilet
namespace AirlinesTicketsDAL
{
public class TicketDAL
{
#region Queries
string getLastId = "select MAX(SeatNumber) [Max] from Ticket where FlightId =
@flightId" ;
string addTicket = "insert i nto [Ticket] values (@type, @price, @seatNumber,
@flightId, @date, @empId)" ;
67
string getLastTicketId = "select MAX(Id) [Max] from Ticket" ;
string getTicketsAmount = "select count(t.Id) [Num] from Ticket t, Employee e
where e.Id = t.Employee Id and e.Id= @empId and [Date]>@date" ;
#endregion
public void AddTicket( TicketBO ticket)
{
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (addTicket, con.myConnection);
command.Parameters.Add( "@type", ticket.Type.ToString());
command.Parameters.Add( "@price" , ticket.Price);
command.Parameters.Add( "@seatNumber" , ticket.SeatNo);
command.Parameters.Add( "@flightId" , ticket.FlightId);
command.Parameters.Add( "@date", DateTime .Now);
command.Parameters.Add( "@empId" , GlobalValues .loggedEmployee.Id);
command.ExecuteNonQuery();
}
}
}
Clasa zbor zilnic
namespace AirlinesTicketsDAL
{ public class DailyFlightDAL
{
//stringurile care reprezinta interogari ale bazei de date: insert, update, delete
#region queries
string addFlight = "Insert into Flight values(@name, @sourceId, @destinationId,
@departureDate, @arriveDate, @businessSeats, @economicSeats, @businessPrice,
@economicPrice, @type)" ;
string removeFlightIndex = "select top 1 Flight.Id from Flight inner join
Ticket on Ticket.FlightId=Flight.Id where Flight.Name= @flightName order by Flight.Id
desc";
string remove = "delete from Flight where Id>@id and Type='Daily'" ;
string selectForEdit = "select top 1 Fl ight.Id from Flight inner join Ticket on
Ticket.FlightId=Flight.Id where Flight.Name=@flightName and Flight.Type='Daily' order
by Flight.Id desc" ;
string update = "update Flight set BusinessPrice = @bPrice,
EconomicPrice=@ePrice,BusinessSeats=@bS eats, EconomicSeats = @eSeats,
DepartureDate=@depDate, ArriveDate=@arrDate where Name=@name and Id>@id" ;
string select = "select * from Flight where Id>@id and Type='Daily' and
Name=@name" ;
string getById = "select * from Flight where Id=@i d";
#endregion
//adaugarea unui zbor zilnic in bazade date
public void AddFlight( DailyFlightBO flight)
{
using(DbConnector con = new DbConnector ())
{
try
{
for (int i = 0; i<60; i++)
{
SqlCommand command = new SqlCommand (addFlight,
con.myConnection);
command.Parameters.Add( "@name", flight.Name);
command.Parame ters.Add( "@sourceId" , flight.Source.Id);
68
command.Parameters.Add( "@destinationId" ,
flight.Destination.Id);
command.Parameters.Add( "@departureDate" , flight.DepartureDate);
command.Parame ters.Add( "@arriveDate" , flight.ArriveDate);
command.Parameters.Add( "@businessSeats" , flight.BusinessSeats);
command.Parameters.Add( "@economicSeats" , flight.EconomicSeats);
command.Para meters.Add( "@businessPrice" , flight.BusinessPrice);
command.Parameters.Add( "@economicPrice" , flight.EconomicPrice);
command.Parameters.Add( "@type", "Daily");
command.ExecuteNonQuery();
flight.DepartureDate = flight.DepartureDate.AddDays(1);
flight.ArriveDate = flight.ArriveDate.AddDays(1);
}
}
}
}
//stergerea unui zbor zilnic din baza de date
public void RemoveFlight( DailyFlightBO flight)
{
int index = 0;
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (removeFlightIndex,
con.myConnection);
command.Parameters.Add( "@flightName" , flight.Name);
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
index = Convert.ToInt32(reader[ "Id"].ToString());
}
}
}
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (remove, con.myConnection);
command.Parameters.Add( "@id", index);
command.ExecuteNonQuery();
}
}
}
}
}
69
4.6. Proiectul Common
Proiectul Common ajută celelalte proiecte să comunice cu baza de date astfel: dacă
conexiunea de date nu este deschisă atunci proiectul deschide conexiunea și efectuează
interogarea bazei de date.
Schema proiectului este ilustrată în următoarea figură:
Figura 4. 14. Proiectul Common
Codul întâlnit în acest proiect este următorul:
namespace Common
{
public class DbConnector : IDisposable
{
public SqlConnection myConnection = new SqlConnection ("user id=Bogdan;" +
"password=qwerty;server=DARK \\SQLEXPRESS;" +
"Trusted_Connection=yes;" +
"database=Airlines; " +
"connection timeout=30" );
public DbConnector()
{
//deschide conexiunea la baza de date fara apelare explicita
myConnection.Open();
}
//implementarea metodei Dispose aflata in interfata IDisposable
public void Dispose()
{
//inchide conexiunea la baza de date in momentul distrugerii obiectului de
tip DbConnector
myConnection.Close();
}
}
//date folosite la nivel global in aplicatie
public static class GlobalValues
{
public static EmployeeBO loggedEmployee = new EmployeeBO ();
public static DateTime startShift;
}
}
70
4.7. Prezentarea legaturilor dintre proiecte
Figura 4. 15. Legaturile dintre proiecte
Pentru a fi întelese și explicate cât mai corect legăturile dintre proiecte, vom redenumi
proiectele în următorul mod:
AirlineTickets – UI – interfața utilizator
AirlineTicketsBLL – BLL
AirlineTicketsBO – BO
AirlineTicketsDAL – DAL
UI (interfața utiliz ator) reprezintă view -ul din MVP (Model View Presenter) și
implementează interfețele din BLL. Aceasta pe langă faptul că implementează interfețele din
BLL mai conține și referință către presenter.
BLL -ul reprezintă Presenter -ul din MVP (Model View Pr esenter) și este compus din:
1. Interfețe – conțin funcționalități ale ferestrelor UI, funcționalități expuse presenter -ului
UI
BLL
BO
DAL
71
2. Presenter – conține referințe indirecte către UI prin intermediul interfețelor. Toată
logica aplicației este deținută de acesta.
3. Clasele BLL – realizează legătura dintre presenter și DALL
DAL are o singură funcție, și anumea de a interoga baza de date.
BO este de fapt modelul din MVP (Model View Presenter) , el reprezintă datele ce
sunt prelucrate de celelalte proiecte si apoi prin intermediul UI sunt afiș ate utilizatorului.
BO nu ș tie nimic despre celelalte proiecte, el este doar folosit/modelat de toate aceste
proiecte.
Common are și el două scopuri:
1. Reținerea variabilelor globale;
2. Realizează conexiunea la baza de date;
72
CONCLUZII
Am creat această aplicație cu scopul de a ajuta angajații unei companii care
efectuează vânzarea biletelor de călătorie dar în același timp și monitorizarea acestora. Astfel,
un angajat are posibilitatea să adauge sau să editeze un zbor din baza d e date, să vizualizeze
toate zborurile care s -au efectuat până la data curentă, să adauge sau să elimine noi locații.
Administrator ul aplicației prin intermediul unui grafic poate să urmărească numărul de bilete
vândut de fiecare angajat, și poate realiza astfel o statistică.
În funcție de cerința fiecărei companii, aplicația poate fi modificată foarte ușor
deoarece aceasta a fost construită pe baza arhitecturii MVP. După cum precizează ș i numele
arhitecturii aplicația poate fi împărțită în:
Model – define ște datele care urmează să fie afișate în view ;
View – reprezintă interfața cu c are utlizatorul interacționează;
Presenter – deține toată logica aplicației;
Ca exemplu putem analiza cazul în care o comp anie dorește să schimbe interfaț a cu
care utlizat orul interacționează. În acest caz, programatorul va lucra doar asupra view -ului, ne
mai fiind obligat să refacă întreaga aplicație de la zero , câștigând astfel mai mult timp.
În urma realizării aplicației mi -am îm bogățit cunoștințele despre C#, .Net Framew ork,
Sql Server Management, cunoștințe ce îm i vor fi necesare pe viitor în realizarea altor aplicații
asemanătoa re.
73
Bibliografie
Introducere î n .NET Framework, Ediția 2008
Programming C# for beginners, Mahesh Chand, 2008
Programare orientată pe obiecte ș i Programare Vizuală, Ediția 2010
Pro C# 2010 and the .NET 4 platform, Andrew Troelsen, Fifth Edition
Limbajul C#, PhD. Lucian Sasu
http://cplus.about.com/od/learnc/ ss/random.htm
http://www.c -sharpcorner.com
http://www.math.uaic.ro/~cgales/csharp/Curs1.pdf
http://blogs.msdn.com/b/erwinvandervalk/archive/2009/08/14/the –
difference -between -model -view -viewmodel -and-other -separated –
presentation -patterns .aspx
http://www.c -sharpcorner.com/UploadFile/john_charles/model -view –
presenter -mvp-design -pattern -and-data-binding/
https://msdn.microsoft.com/en -us/library/ff709863.aspx
http://www.cs.ubbcluj.ro/~vcioban/Matematica/Anul3/BD/Bd.pdf
http://www2.unitbv.ro/LinkClick.aspx?fileticket=DkKa1EQaig0%3D&ta
bid=4516&language=en -US
https://ro.wikipedia.org/wiki/Microsoft_SQL_Server
Anexă cod
Proiectul AirlinesTickets
o Fereastra AddFlight
namespace Airlines_Tickets
{
public partial class AddFlight : Form, IAddFlight
{
private AddFlightPresenter _presenter;
public AddFlight()
{
InitializeCom ponent();
AttachPresenter( new AddFlightPresenter ());
}
//ataseaza un presenter ferestrei
public void AttachPresenter( AddFlightPresenter presenter)
{
_presenter = presenter;
_presenter.SetV iew(this);
}
//afisarea exceptiilor aparute in program
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
//evenimentul de incarcare al ferestrei
private void AddFlight_Load( object sender, EventArgs e)
{
foreach(LocationBO item in _presenter.GetLocations())
{
listBox1.Items.Add(item);
listBox2.Items.Add(item);
}
}
//reincarcare a locatiilor dupa fiecare modificare
public void Reload()
{
listBox1.Items.Clear();
listBox2.Items.Clear();
foreach (LocationBO item in _presenter.GetLocations())
{
listBox1.I tems.Add(item);
listBox2.Items.Add(item);
}
}
//evenimentul de click al butonului de adaugare a unui zbor zilnic
private void button1_Click( object sender, EventArgs e)
{
if (textBox1.T ext.Length == 0)
{
MessageBox .Show("Insert name" );
return;
}
if (!(listBox1.SelectedIndex > -1 && listBox2.SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.SelectedIndex))
{
MessageBox .Show("Select valid locations" );
return;
}
if (textBox2.Text.Length == 0 || textBox3.Text.Length == 0)
{
MessageBox .Show("Invalid prices" );
return;
}
if (numericUpDown1.Value == 0 || numericUpDown2.Value == 0)
{
MessageBox .Show("Invalid seats numbers" );
return;
}
if (dateTimePicker1.Value <= DateTime .Now)
{
MessageBox .Show("Invalid departure date" );
return;
}
if (textBox4.Text.Length == 0 || textBox5.Text.Length == 0)
{
MessageBox .Show("Invalid duration" );
return;
}
// crearea obiectului care reprezinta zborul zilnic adaugat
DailyFlightBO flight = new DailyFlightBO ()
{
FlightType = FlightType .Daily,
Name = textBox1.T ext,
Source = listBox1.SelectedItem as LocationBO ,
Destination = listBox2.SelectedItem as LocationBO ,
DepartureDate = dateTimePicker1.Value,
ArriveDate =
dateTimePicker1.Value.AddHours( Convert.ToInt32(textBox4.Text)).AddMinutes( Convert.ToInt
32(textBox5.Text)),
BusinessSeats = ( int)numericUpDown1.Value,
BusinessPrice = Convert.ToInt32(textBox2.Text),
EconomicSeats = ( int)numericUpDown2.Value,
EconomicPrice = Convert.ToInt32(textBox3.Text)
};
_presenter.AddDailyFlight(flight);
Refresh();
}
//golirea campurilor dupa adaugarea unui zbor
public void Refresh()
{
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
textBox6.Clear();
textBox7.Clear();
textBox8.Clear();
textBox9.Clea r();
textBox10.Clear();
textBox11.Clear();
textBox12.Clear();
textBox13.Clear();
comboBox1.SelectedIndex = -1;
checkBox1.Checked = false;
listBox1.SelectedIndex = -1;
listBox2.SelectedIndex = -1;
numericUpDown1.Value = 0;
numericUpDown2.Value = 0;
}
//evenimentul de schimbare a textului unui textbox
private void TextBoxKeyPress( object sender, KeyPressEventArgs e)
{
//restrictie de introducere de litere in campurile care suporta doar numere
if(!char.IsControl(e.KeyChar) && ! char.IsDigit(e.KeyChar) )
{
e.Handled = true;
}
}
//evenim entul de click al butonului de adaugare a unui zbor saptamanal
private void button2_Click( object sender, EventArgs e)
{
if (textBox1.Text.Length == 0)
{
MessageBox .Show("Insert name" );
return;
}
if (!(listBox1.SelectedIndex > -1 && listBox2.SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.SelectedIndex))
{
MessageBox .Show("Select valid locations" );
return;
}
if (textBox2.Text.Length == 0 || textBox3.Text.Length == 0)
{
MessageBox .Show("Invalid prices" );
return;
}
if (numericUpDown1.Value == 0 || numericUpDown2.Value == 0)
{
MessageBox .Show("Invalid seats numbers" );
return;
}
if (dateTimePicker2.Value <= DateTime .Now)
{
MessageBox .Show("Invalid departure date" );
return;
}
if (textBox6.Text.Length == 0 || textBox7.Text.Length == 0)
{
MessageBox .Show("Invalid duration" );
return;
}
// crearea obiectului care reprezinta zborul sa ptamanal adaugat
WeeklyFlightBO flight = new WeeklyFlightBO ()
{
FlightType = FlightType .Weekly,
Name = textBox1.Text,
Source = listBox1.SelectedItem as LocationBO ,
Destination = listBox2.SelectedItem as LocationBO ,
DepartureDate = dateTimePicker2.Value,
ArriveDate =
dateTimePicker2.Value.AddHours( Convert.ToInt32(textBox6.Text)).AddMinutes( Convert.ToInt
32(textBox7.Text)),
BusinessSeats = ( int)numericUpDown1.Value,
BusinessPrice = Convert.ToInt32(textBox2.Text),
EconomicSeats = ( int)numericUpDown2.Value,
EconomicPrice = Convert.ToInt32(textBox3.Text)
};
_presenter.AddWeeklyFlight(flight);
Refresh();
}
//evenimentul de click al butonului de adaugare a unui zbor care pleaca din
doua in doua saptamani
private void button3_Click( object sender, EventArgs e)
{
if (textBox1.Text.Length == 0)
{
MessageBox .Show("Insert name" );
return;
}
if (!(listBox1.SelectedIndex > -1 && listBox2.SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.Selecte dIndex))
{
MessageBox .Show("Select valid locations" );
return;
}
if (textBox2.Text.Length == 0 || textBox3.Text.Length == 0)
{
MessageBox .Show("Invalid prices" );
return;
}
if (numericUpDown1.Value == 0 || numericUpDown2.Value == 0)
{
MessageBox .Show("Invalid seats numbers" );
return;
}
if (dateTimePicker3.Val ue <= DateTime .Now)
{
MessageBox .Show("Invalid departure date" );
return;
}
if (textBox8.Text.Length == 0 || textBox9.Text.Length == 0)
{
MessageBox .Show("Invalid duration" );
return;
}
// crearea obiectului care reprezinta zborul la 2 saptamani adaugat
TwoWeeksFlightBO flight = new TwoWeeksFlightBO ()
{
FlightType = FlightType .TwoWeeks,
Name = textBox1.Text,
Source = listBox1.SelectedItem as LocationBO ,
Destination = listBox2.SelectedItem as LocationBO ,
DepartureDate = dateTimePicker3.Value,
ArriveDate =
dateTimePicker3.Value.AddHours( Convert.ToInt32(textBox8.Text)).AddMinutes( Convert.ToInt
32(textBox9.Text)),
BusinessSeats = ( int)numericUpDown1.Value,
BusinessPrice = Convert.ToInt32(textBox2.Text),
EconomicSeats = (int)numericUpDown2.Value,
EconomicPrice = Convert.ToInt32(textBox3.Text)
};
_presenter.AddTwoWeeksFlight(flight);
Refresh();
}
private void CheckBoxCheckedChanged( object sender, EventArgs e)
{
comboBox1.Enabled = !(sender as CheckBox ).Checked;
}
//evenimentul de click al butonului de adaugare a unui zbor lunar
private void button4_Click( object sender, EventArgs e)
{
if (textBox1.Text.Length == 0)
{
MessageBox .Show("Insert name" );
return;
}
if (!(listBox1.SelectedIndex > -1 && listBox2.SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.SelectedIndex))
{
MessageBox .Show("Select valid locations" );
return;
}
if (textBox2.Text.Length == 0 || textBox3.Text.Length == 0)
{
MessageBox .Show("Invalid prices" );
return;
}
if (numericUpDown1.Value == 0 || numericUpDown2.Value == 0)
{
MessageBox .Show("Invalid seats numbers" );
return;
}
if(checkBox1.Checked)
{
if(textBox13.Text.Length == 0 || textBox12.Text.Length == 0)
{
MessageBox .Show("Invalid departure time" );
return;
}
if(textBox10.Text.Length == 0 || t extBox11.Text.Length == 0)
{
MessageBox .Show("Invalid duration" );
return;
}
//crearea datii zborului lunar care pleaca in ultima zi a lunii
int day = DateTime.DaysInMonth( DateTime .Now.Year, DateTime .Now.Month);
DateTime depDate = new DateTime (DateTime .Now.Year, DateTime .Now.Month,
day, Convert.ToInt32(textBox13.Text), Convert.ToInt32(textBox12.Text), 0);
// crearea obiectul ui care reprezinta zborul lunar adaugat
MonthlyFlightBO flight = new MonthlyFlightBO ()
{
FlightType = FlightType .Monthly,
Name = textBox1.Text,
Source = listBox1.Se lectedItem as LocationBO ,
Destination = listBox2.SelectedItem as LocationBO ,
DepartureDate = depDate,
ArriveDate =
depDate.AddHours( Convert.ToInt32(textBox10.Text)).AddMinutes( Convert.ToInt32(text Box11.
Text)),
BusinessSeats = ( int)numericUpDown1.Value,
BusinessPrice = Convert.ToInt32(textBox2.Text),
EconomicSeats = ( int)numericUpDown2.Value,
EconomicPrice = Convert.ToInt32(textBox3.Text)
};
_presenter.AddMonthlyFlight(flight);
Refresh();
}
else
{
if (textBox13.Text.Length == 0 || textBox12.Text.Length == 0)
{
MessageBox .Show("Invalid departure time" );
return;
}
if (textBox10.Text.Length == 0 || textBox11.Text.Length == 0)
{
MessageBox .Show("Invalid dur ation");
return;
}
if(comboBox1.SelectedIndex < 0)
{
MessageBox .Show("Invalid day" );
return;
}
//crearea datii zbor ului lunar care pleaca intr -o zi specificata – nu
poate sa fie ultima zi din luna
int day = Convert.ToInt32(comboBox1.SelectedItem);
DateTime depDate = new DateTime (DateTime .Now.Year, DateTime .Now.Month,
day, Convert.ToInt32 (textBox13.Text), Convert.ToInt32(textBox12.Text), 0);
MonthlyFlightBO flight = new MonthlyFlightBO ()
{
FlightType = FlightType .Monthly,
Name = textBox1.Text,
Source = listBox1.SelectedItem as LocationBO ,
Destination = listBox2.SelectedItem as LocationBO ,
DepartureDate = depDate,
ArriveDate =
depDate.AddHours( Convert.ToInt32(textBox10.Text)).AddMinutes( Convert.ToInt32(textBox11.
Text)),
BusinessSeats = ( int)numericUpDown1.Value,
BusinessPrice = Convert.ToInt32(textBox2.Text),
EconomicSeats = ( int)numericUpDown2.Value,
EconomicPric e = Convert.ToInt32(textBox3.Text)
};
_presenter.AddMonthlyFlight(flight);
Refresh();
}
}
}
}
o Fereastra AddLocation
namespace Airlines_Tickets
{ public partial class AddLocation : Form, IAddLocation
{
private AddLocationPresenter _presenter;
public AddLocation()
{
InitializeComponent();
AttachPresenter( new AddLocationPresenter ());
}
//atasearea unui presenter
public void AttachPresenter( AddLocationPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
//afiseara exceptiilor aparute in program
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
//evenimentul de click al butonului de adaugare a unei locatii
private void button1_Click( object sender, EventArgs e)
{
if(textBox1.Text.Length != 0)
{
_presenter.AddLocation(textBox1.Text);
textBox1.Clear();
}
else
{
MessageBox .Show("Invalid name" );
}
}
}
}
o Fereastra Admin
namespace Airlines_Tick ets
{ public partial class AdminForm : Form, IAdminView
{
private AdminFormPresenter _presenter;
public AdminForm()
{
InitializeComponent();
AttachPresenter( new AdminFormPresenter ());
}
public void AttachPresenter( AdminFormPresenter pressenter)
{
_presenter = pressenter;
_presenter.SetView( this);
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
private void AdminForm_Load( object sender, EventArgs e)
{
List<EmployeeBO > em = _presenter.GetEmployees();
foreach (EmployeeBO item in em)
{
chart1.Series[ "Bilete" ].Points.AddXY(item .Name + " (" +
_presenter.GetTicketsAmount(item).ToString() + ")", _presenter.GetTicketsAmount(item));
}
}
}
}
o Fereastra EditFlight
namespace Airlines_Tickets
{
public partial class EditFlight : Form, IEditFlight
{
private EditFlightPresenter _presenter;
public EditFlight()
{
InitializeComponent();
AttachPresenter( new EditFlightPresenter ());
}
public void AttachPresenter( EditFlightPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
//incarcarea combobox -ului care contine zborurile zil nice
public void LoadDailyFlights( List<DailyFlightBO > flights)
{
comboBox1.Items.Clear();
foreach (DailyFlightBO item in flights)
{
comboBox1.Items.Add(item);
}
}
//incarcarea combobox -ului care contine zborurile saptamanele
public void LoadWeeklyFlights( List<WeeklyFlightBO > flights)
{
comboBox2.Items.Clear();
foreach (WeeklyFlightBO item in flights)
{
comboBox2.Items.Add(item);
}
}
//incarcarea combobox -ului care contine zborurile la 2 saptamani
public void LoadTwoWeeksFlights( List<TwoWeeksFlightBO > flights)
{
comboBox3.Items.Clear();
foreach (TwoWeeksFlightBO item in flights)
{
comboBox3.Items.Add(item);
}
}
//incarcarea combobox -ului care contine zborurile lunare
public void LoadMonthlyFlights( List<MonthlyFlightBO > flights)
{
comboBox4.Items.Clear();
foreach (MonthlyFlightBO item in flights)
{
comboBox4.Items.Add(item);
}
}
//evenimentul de incarcare al ferestrei la momentul desch iderii
private void EditFlight_Load( object sender, EventArgs e)
{
_presenter.LoadDailyFlights();
_presenter.LoadWeeklyFlights();
_presenter.LoadTwoWeeksFlights();
_presenter.LoadMonthlyFlights ();
}
//incarcarea campurilor zborului zilnice ce urmeaza a fi editat
private void FillForEdit( object sender, EventArgs e)
{
DailyFlightBO flight = comboBox1.SelectedItem as DailyFlightBO ;
int hour = Math.Abs((flight.ArriveDate – flight.DepartureDate).Hours);
int minutes = Math.Abs((flight.ArriveDate – flight.DepartureDate).Minutes);
textBox1.Text = hour.ToString();
textBox2.Text = minutes.ToString();
textBox24.Text = flight.DepartureDate.Hour.ToString();
textBox23.Text = flight.DepartureDate.Minute.ToString();
numericUpDown1.Value = flight.BusinessSeats;
numericUpDown2.Value = flight.EconomicSeats;
textBox3. Text = flight.BusinessPrice.ToString();
textBox4.Text = flight.EconomicPrice.ToString();
}
//evenimentul de click al butonului care finalizeaza editarea zborului zilnic
private void button2_Click( object sender, EventArgs e)
{
if(comboBox1.SelectedIndex == -1)
{
MessageBox .Show("No flight selected" );
return;
}
DailyFlightBO flight = new DailyFlightBO ()
{
BusinessSeats = Convert.ToInt32(numericUpDown1.Value),
EconomicSeats = Convert.ToInt32(numericUpDown2.Value),
BusinessPrice = Convert.ToInt32(textBox3.Text),
EconomicPrice = Convert.ToInt32(textBox4.Text)
};
int hour = Convert.ToInt32(textBox1.Text);
int min = Convert.ToInt32(textBox2.Text);
int depH = Convert.ToInt32(textBox24.Text);
int depM = Convert.ToInt32(textBox23.Text);
_presenter.Edit DailyFlight(comboBox1.SelectedItem as DailyFlightBO , flight,
hour, min, depH, depM);
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox23.Clear();
textBox2 4.Clear();
numericUpDown1.Value = 0;
numericUpDown2.Value = 0;
}
//evenimentul de click al butonului care sterge un zbor lunar
private void button8_Click( object sender, EventArgs e)
{
if(comboBox4.SelectedIndex>=0)
{
_presenter.RemoveMonthlyFlight(comboBox4.SelectedItem as MonthlyFlightBO );
_presenter.LoadMonthlyFlights();
comboBox4.SelectedIndex = -1;
textBox13.Cle ar();
textBox14.Clear();
textBox15.Clear();
textBox16.Clear();
textBox17.Clear();
textBox18.Clear();
numericUpDown7.Value = 0;
numericUpDown8.Va lue = 0;
}
}
//evenimentul de click al butonului care sterge un zbor zilnic
private void button1_Click( object sender, EventArgs e)
{
if(comboBox1.SelectedIndex >= 0)
{
_presenter.RemoveDailyFlight(comboBox1.SelectedItem as DailyFlightBO );
_presenter.LoadDailyFlights();
comboBox1.SelectedIndex = -1;
textBox1.Clear();
textBox2.Clear();
textBox3.Cle ar();
textBox4.Clear();
textBox23.Clear();
textBox24.Clear();
numericUpDown1.Value = 0;
numericUpDown2.Value = 0;
}
}
//evenimentul de click al buto nului care sterge un zbor saptamanal
private void button4_Click( object sender, EventArgs e)
{
if(comboBox2.SelectedIndex>=0)
{
_presenter.RemoveWeeklyFlight(comboBox2.SelectedItem as WeeklyFlightBO );
_presenter.LoadWeeklyFlights();
comboBox2.SelectedIndex = -1;
textBox5.Clear();
textBox6.Clear();
textBox7.Clear();
textBox8.Clear();
textBox22. Clear();
textBox21.Clear();
numericUpDown3.Value = 0;
numericUpDown4.Value = 0;
}
}
//evenimentul de click al butonului care sterge un zbor la 2 saptamani
private void button6_Click( object sender, EventArgs e)
{
if(comboBox3.SelectedIndex>=0)
{
_presenter.RemoveTwoWeeksFlight(comboBox3.SelectedItem as
TwoWeeksFlightBO );
_presenter.LoadTwoWeeksFlights();
comboBox3.SelectedIndex = -1;
textBox9.Clear();
textBox10.Clear();
textBox11.Clear();
textBox12.Clear();
textBox19.Clear();
textBox20.Clear();
numericUpDown5.Value = 0;
numericUpDown6.Value = 0;
}
}
//evenimentul de click al butonului care finalizeaza editarea zborului lunar
private void button7_Click( object sender, EventArgs e)
{
if (comboBox4.SelectedIndex == -1)
{
MessageBox .Show("No flight selected" );
return;
}
MonthlyFlightBO flight = new MonthlyFlightBO ()
{
BusinessSeat s = Convert.ToInt32(numericUpDown8.Value),
EconomicSeats = Convert.ToInt32(numericUpDown7.Value),
BusinessPrice = Convert.ToInt32(textBox14.Text),
EconomicPrice = Convert.ToInt32(textBox13.Text)
};
int hour = Convert.ToInt32(textBox16.Text);
int min = Convert.ToInt32(textBox15.Text);
int depH = Convert.ToInt32(textBox18.Text);
int depM = Convert.ToInt32(textBox17.Text);
_presenter.EditMont hlyFlight(comboBox4.SelectedItem as MonthlyFlightBO , flight,
hour, min, depH, depM);
//comboBox4.SelectedIndex = -1;
textBox13.Clear();
textBox14.Clear();
textBox15.Clear();
textBox16.Clear();
textBox17.Clear();
textBox18.Clear();
numericUpDown7.Value = 0;
numericUpDown8.Value = 0;
}
//incarcarea campurilor zborului lunar ce urmeaza a fi editat
private void FillMonthlyFlight( object sender, EventArgs e)
{
MonthlyFlightBO flight = comboBox4.SelectedItem as MonthlyFlightBO ;
int hour = Math.Abs((flight.ArriveDate – flight.DepartureDate).Hours);
int min = Math.Abs((flight.DepartureDate – flight.ArriveDate).Minutes);
textBox16.Text = hour.ToString();
textBox15.Text = min.ToString();
textBox18.Text = flight.DepartureDate.Hour.ToString();
textBox17.Text = flight.DepartureDate.Minute.ToString();
numericUpDown8.Value = flight.BusinessSeats;
numericUpDown7.Value = flight.EconomicSeats;
textBox14.Text = flight.BusinessPrice.ToString();
textBox13.Text = flight.EconomicPrice.ToString();
}
//evenimentul de click al butonului care finalizeaza editarea zborului saptamanal
private void button3_Click( object sender, EventArgs e)
{
if (comboBox2.SelectedIndex == -1)
{
MessageBox .Show("No flig ht selected" );
return;
}
WeeklyFlightBO flight = new WeeklyFlightBO ()
{
BusinessSeats = Convert.ToInt32(numericUpDown4.Value),
EconomicSeats = Convert.ToInt32(numericUpDown 3.Value),
BusinessPrice = Convert.ToInt32(textBox6.Text),
EconomicPrice = Convert.ToInt32(textBox5.Text)
};
int hour = Convert.ToInt32(textBox8.Text);
int min = Convert.ToInt32(textBox7.Te xt);
int depH = Convert.ToInt32(textBox22.Text);
int depM = Convert.ToInt32(textBox21.Text);
_presenter.EditWeeklyFlight(comboBox2.SelectedItem as WeeklyFlightBO , flight,
hour, min, depH, depM);
textBox5.Clea r();
textBox6.Clear();
textBox7.Clear();
textBox8.Clear();
textBox22.Clear();
textBox21.Clear();
numericUpDown3.Value = 0;
numericUpDown4.Value = 0;
}
//evenimentu l de click al butonului care finalizeaza editarea zborului la 2 saptamani
private void button5_Click( object sender, EventArgs e)
{
if (comboBox3.SelectedIndex == -1)
{
MessageBox .Show("No flight selec ted");
return;
}
TwoWeeksFlightBO flight = new TwoWeeksFlightBO ()
{
BusinessSeats = Convert.ToInt32(numericUpDown6.Value),
EconomicSeats = Convert.ToInt32(numericUpDown5.Va lue),
BusinessPrice = Convert.ToInt32(textBox10.Text),
EconomicPrice = Convert.ToInt32(textBox9.Text)
};
int hour = Convert.ToInt32(textBox12.Text);
int min = Convert.ToInt32(textBox11.Tex t);
int depH = Convert.ToInt32(textBox20.Text);
int depM = Convert.ToInt32(textBox19.Text);
_presenter.EditTwoWeeksFlight(comboBox3.SelectedItem as TwoWeeksFlightBO ,
flight, hour, min, depH, depM);
textBox9.C lear();
textBox10.Clear();
textBox11.Clear();
textBox12.Clear();
textBox19.Clear();
textBox20.Clear();
numericUpDown5.Value = 0;
numericUpDown6.Value = 0;
}
//incarcarea campurilor zborului saptamanal ce urmeaza a fi editat
private void FillWeeklyFlight( object sender, EventArgs e)
{
WeeklyFlightBO flight = comboBox2.SelectedItem as WeeklyFlightBO ;
int hour = Math.Abs((flight.ArriveDate – flight.DepartureDate).Hours);
int minutes = Math.Abs((flight.ArriveDate – flight.DepartureDate).Minutes);
textBox8.Text = hour.ToString();
textBox7.Text = minutes.ToString();
textBox22.Text = flight.DepartureDate.Hour.ToString();
textBox21.Text = flight.DepartureDate.Minute.ToString();
numericUpDown4.Value = flight.BusinessSeats;
numericUpDown3.Value = flight.EconomicSeats;
textBox6.Text = flig ht.BusinessPrice.ToString();
textBox5.Text = flight.EconomicPrice.ToString();
}
//incarcarea campurilor zborului la 2 saptamani ce urmeaza a fi editat
private void FillTwoWeeksFlight( object sender, EventArgs e)
{
TwoWeeksFlightBO flight = comboBox3.SelectedItem as TwoWeeksFlightBO ;
int hour = Math.Abs((flight.ArriveDate – flight.DepartureDate).Hours);
int minutes = Math.Abs((flight.ArriveDate – flight.DepartureDate).Minutes);
textBox12.Text = hour.ToString();
textBox11.Text = minutes.ToString();
textBox20.Text = flight.DepartureDate.Hour.ToString();
textBox19.Text = flight.DepartureDate.Minute.ToString();
numericUpDown6. Value = flight.BusinessSeats;
numericUpDown5.Value = flight.EconomicSeats;
textBox10.Text = flight.BusinessPrice.ToString();
textBox9.Text = flight.EconomicPrice.ToString();
}
}
}
o Fereastra History
namespace Airlines_Tickets
{
public partial class History : Form, IHistory
{
private HistoryPresenter _presenter;
public History()
{
InitializeComponent();
AttachPresenter( new HistoryPresenter ());
}
public void AttachPresenter( HistoryPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
public void LoadFlight( HistoryFlight flight)
{
//incarcarea tabelului cu istoricul zborurilor din baza de date
string[] row =
{
flight.Name,
flight.Source,
flight.To,
flight.BTraveler.ToString(),
flight.ETraveler.ToString(),
flight.Departure.ToString(),
flight.Arrive.ToString(),
(flight.Arrive -flight.Departure).Hours + ":" + (flight.Arrive –
flight.Departure).Minutes
};
ListViewItem item = new ListViewItem (row[0]);
for(int i = 1; i<8; i++)
{
item.SubItems.Add(row[i]);
}
listView1.Items.A dd(item);
}
private void History_Load( object sender, EventArgs e)
{
_presenter.GetHistory();
}
}
}
o Fereastra LogIn
namespace Airlines_Tickets
{ public partial class LogInWindow : Form, ILogIn
{
MainWindow _mainWindow;
AdminForm _adminForm;
LogInPresenter _presenter;
public LogInWindow()
{
InitializeComponent();
AttachPresenter( new LogInPresenter ());
}
public void AttachPresenter( LogInPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
//evenimentul de click al butonului de log in
private void button1_Click( object sender, EventArgs e)
{
//verifica datele introduse de angajat
if(radioButton1.Checked)
{
if (textBox1.Text.Length == 0 || textBox2.Text.Length == 0)
{
MessageBox .Show("Fill both Name an d Password fields" );
}
else
{
EmployeeBO emp = new EmployeeBO ()
{
Name = textBox1.Text,
Password = textBox2.Text
};
if (_presenter.ValidateEmployee(emp))
{
_presenter.StartShift();
_mainWindow = new MainWindow ();
_mainWindow.Show();
this.Hide();
}
else
{
MessageBox .Show("Invalid creditials" );
}
}
}
//verifica datele introduse de administrator
else if(radioButton2.Checked)
{
if (textBox1.Text.Length == 0 || textBox2.Text.Length == 0)
{
MessageBox .Show("Fill both Name and Password fields" );
}
else
{
AdministratorBO adm = new AdministratorBO ()
{
Username = textBox1.Text,
Password = textBox2.Text
};
if (_presenter.ValidateAdministrator(adm))
{
_adminForm = new AdminForm ();
_adminForm.Show();
_adminForm.FormClosed += _adminForm_FormClosed;
//_mainWindow = new MainWindow();
//_mainWindow.Show();
this.Hide();
}
else
{
MessageBox .Show("Invalid cred itials");
}
}
}
}
//evenimentul de inchidere al ferestrei administratorului
void _adminForm_FormClosed( object sender, FormClosedEventArgs e)
{
Application .Restart() ;
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
}
}
o Fereastra MainWindow
namespace Airlines_Tickets
{ public partial class MainWindow : Form, IMainWindow
{
#region Private fields
private MainWindowPresenter _presenter;
private ViewLocations _viewLocations;
private AddLocation _addLocation;
private AddFlight _addFlight;
private History _history;
private EditFlight _editFlight;
#endregion
public MainWindow()
{
InitializeComponent();
AttachPresenter( new MainWindowPresenter ());
label3.Text = "Logged as: " + Common. GlobalValues .loggedEmployee.Name;
label5.Text = "Date: " + DateTime .Now.ToString( "dd-MM-yyyy");
label7.Text = "Time: " + DateTime .Now.ToString( "hh:mm:ss tt" );
timer1.Start();
}
public void AttachPresenter( MainWindowPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
//afisearea mesajelor care anunta utilizatorul ca nu a completat campurile
obligatorii
public void ShowMessage( string message)
{
MessageBox .Show(message);
}
private void MainWindow_Load( object sender, EventArgs e)
{
foreach (LocationBO item in _presenter.Ge tLocations())
{
listBox1.Items.Add(item);
listBox2.Items.Add(item);
}
}
//reincarcarea listelor care contin locatiile
public void Reload()
{
listBox1.Items. Clear();
listBox2.Items.Clear();
foreach (LocationBO item in _presenter.GetLocations())
{
listBox1.Items.Add(item);
listBox2.Items.Add(item);
}
}
//elementul di n meniu care deschide fereastra ce permite vizualizarea locatiilor
private void viewToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_viewLocations == null)
{
_viewLocations = new ViewLocation s();
_viewLocations.Show();
_viewLocations.FormClosed += _viewLocations_FormClosed;
}
else
{
_viewLocations.Activate();
}
}
//evenimentul care a pare la inchiderea ferestrei de vizualizare a locatiilor
void _viewLocations_FormClosed( object sender, FormClosedEventArgs e)
{
_viewLocations = null;
Reload();
}
////elementul din meniu care deschide fereastra ce permite adaugarea locatiilor
private void addToolStripMenuItem1_Click( object sender, EventArgs e)
{
if(_addLocation == null)
{
_addLocation = new AddLocation ();
_addLocat ion.Show();
_addLocation.FormClosed += _addLocation_FormClosed;
}
else
{
_addLocation.Activate();
}
}
//evenimentul care apare la inchiderea ferestrei de adauga re a locatiilor
void _addLocation_FormClosed( object sender, FormClosedEventArgs e)
{
_addLocation = null;
Reload();
}
//elementul din meniu care deschide fereastra ce permite adaugarea zborurilor
private void addToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_addFlight == null)
{
_addFlight = new AddFlight ();
_addFlight.Show();
_addFlight.FormClosed += _ad dFlight_FormClosed;
}
else
{
_addFlight.Activate();
}
}
//evenimentul care apare la inchiderea ferestrei de adaugare a zborurilor
void _addFlight_FormClosed( object sender, FormClosedEventArgs e)
{
_addFlight = null;
}
//elementul din meniu care deschide fereastra ce permite vizualizarea istoricului
zborurilor
private void historyToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_history == null)
{
_history = new History();
_history.Show();
_history.FormClosed += _history_FormClosed;
}
else
{
_history.Activate();
}
}
//evenimentul care apare la inchiderea ferestrei de vizualizare a istoricului
zborurilor
void _history_FormClosed( object sender, FormClosedEventArgs e)
{
_history = null;
}
//elementul din meniu care deschide fereastra ce permite editarea zborurilor
private void editToolStripMenuItem_Click( object sender, EventArgs e)
{
if(_editFlight == null)
{
_editFlight = new EditFlight ();
_editFlight.Show();
_editFlight.FormClosed += _editFlight_FormClosed;
}
else
{
_editFlight.Activate();
}
}
//evenimentul car e apare la inchiderea ferestrei de editare a zborurilor
void _editFlight_FormClosed( object sender, FormClosedEventArgs e)
{
_editFlight = null;
}
//evenimentul de click al butonului de cautare a zborurilor
private void button1_Click( object sender, EventArgs e)
{
if(radioButton3.Checked)
{
if(listBox1.SelectedIndex > -1 && listBox2.SelectedIndex > -1 &&
listBox2.SelectedIndex != listBox1.SelectedIndex)
{
bool business = radioButton1.Checked;
_presenter.SearchFlight(listBox1.SelectedItem as LocationBO ,
listBox2.SelectedItem as LocationBO , dateTimePicker1.Value, business);
}
}
else
{
}
}
public int flightIndex = 0;
//vizualizarea zborului urmator
public void LoadNext( IFlight flight)
{
dataGridView1.Rows.Clear();
if (flight.FlightTy pe == FlightType .Daily)
{
DailyFlightBO fl = flight as DailyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":"
+(fl.ArriveDate – fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
dataGridView1.Rows.Add(row);
}
else if (flight.FlightType == FlightType .Monthly)
{
MonthlyFlightBO fl = flight as MonthlyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.Departu reDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Ch ecked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
else if (flight.FlightType == FlightType .TwoWeeks)
{
TwoWeeksFlightBO fl = flight as TwoWeeksFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
else
{
WeeklyFlightBO fl = flight as WeeklyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveD ate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
button2.Enabled = (AllFlights.Count > 1 && flightIndex > 0);
button3.Enabled = (AllFlights.Count -1 > flightIndex);
}
List<IFlight> AllFlights = new List<IFlight>();
//incarcarea zborurilor dupa data selectata
public void LoadFlight( List<IFlight> flights)
{
dataGridView1.Rows.Clear();
AllFlights = flights;
if(flights[0].FlightType == FlightType .Daily)
{
DailyFlightBO fl = flights[0] as DailyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":"
+(fl.ArriveDate – fl.Depart ureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
dataGridVie w1.Rows.Add(row);
}
else if (flights[0].FlightType == FlightType .Monthly)
{
MonthlyFlightBO fl = flights[0] as MonthlyFlightBO ;
string[] row = {
fl.Sourc e.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
else if (flights[0].F lightType == FlightType .TwoWeeks)
{
TwoWeeksFlightBO fl = flights[0] as TwoWeeksFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name ,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
else
{
WeeklyFlightBO fl = flights[0] as WeeklyFlightBO ;
string[] row = {
fl.Source.Name,
fl.Destination.Name,
fl.DepartureDate.ToString(),
(fl.ArriveDate – fl.DepartureDate).Hours + ":" +
(fl.ArriveDate -fl.DepartureDate).Minutes,
fl.ArriveDate.ToString(),
radioButton1.Checked ? fl.BusinessPrice.ToString() :
fl.EconomicPrice.ToString()
};
}
button2.Enabled = false;
button3.Enabled = (AllFlights.Count > 1);
}
//evenimentul de click al butonului ce incarca zborul anterior
private void button2_Click( object sender, EventArgs e)
{
flightIndex –;
button2.Enabled = (AllFlights.Count > 1 && flightIndex > 0);
button3.Enabled = (AllFlights.Count > flightIndex);
LoadNext(AllFlights[flightIndex]);
}
//evenimentul de click al butonului ce incarca urmatorul zbor
private void button3_Click( object sender, EventArgs e)
{
flightIndex++;
button2.Enabled = (AllFlights.Count > 1 && flightIndex > 0);
button3.Enabled = AllFlights.Count – 1 == flightIndex ? false : true;
LoadNext(AllFlights[flightIndex]);
}
//verifica daca este selectat un zbor pt cumapararea biletului
public bool SelectedFlight()
{
try
{
return AllFlights[flightIndex].Id != 0;
}
catch (Exception e)
{
return false;
}
}
//evenimentul de click al butonului de finalizare a vanzarii unui bilet
private void button5_Click( object sender, EventArgs e)
{
if(textBox2.Text.Length==0||textBox4.Text.Length!=13 || !SelectedFlight())
{
MessageBox .Show("Name and identity number are mandatory ");
}
else
{
try
{
TicketBO ticket = new TicketBO ()
{
Id = _presenter.GetLastTicketId() + 1,
Type = radioButton1.Checked ? TicketType .Business :
TicketType .Economic,
Price = radioButton1.Checked ?
AllFlights[flightIndex].BusinessPrice:AllFlights[flightIndex].EconomicPrice,
SeatNo =
(_presenter.GetTicketId(A llFlights[flightIndex])+1).ToString(),
FlightId = AllFlights[flightIndex].Id
};
if(radioButton1.Checked)
{
int seats = _presenter.GetSeatsNumber(All Flights[flightIndex])[0];
if (_presenter.SoldTicketsNumber(AllFlights[flightIndex])[0] ==
seats)
{
MessageBox .Show("There are no more seats available" ); ;
return;
}
else
{
PersonBO person = new PersonBO ()
{
Name = textBox2.Text,
Cnp = textBox4.Text,
Ticket = ticket
};
_presenter.AddTicket(ticket);
_presenter.AddPerson(person);
PrintTicket(ticket, person);
textBox2.Clear();
textBox4.Clear();
}
}
else
{
int seats = _pr esenter.GetSeatsNumber(AllFlights[flightIndex])[1];
if (_presenter.SoldTicketsNumber(AllFlights[flightIndex])[1] ==
seats)
{
MessageBox .Show("There are no more seats available" ); ;
return;
}
else
{
PersonBO person = new PersonBO ()
{
Name = textBox2 .Text,
Cnp = textBox4.Text,
Ticket = ticket
};
_presenter.AddTicket(ticket);
_presenter.AddPerson(person);
PrintTicket(ticket, person);
textBox2.Clear();
textBox4.Clear();
}
}
}
catch (ArgumentOutOfRangeE xception ex)
{
MessageBox .Show("No flight found" );
}
}
}
//crearea biletului in format pdf si deschiderea documentului
public void PrintTicket( TicketBO ticket, PersonBO person)
{
PdfDocument pdf = new PdfDocument ();
pdf.Info.Title = "Ticket ID: " + ticket.Id;
PdfPage pdfPage = pdf.AddPage();
XGraphics graph = XGraphics .FromPdfPage(pdfPage);
XFont font = new XFont("Verdana" , 20, XFontStyle .Bold);
DateTime date = _presenter.GetFlightById(ticket.FlightId).DepartureDate;
string dateString = date.Day + "/"+date.Month + "/" + date.Year + " " +
date.Hour + ":"+date.Minute;
TimeSpan duration = _presenter.GetFlightById(ticket.FlightId).ArriveDate -date;
string durationString = duration.Hours + "h " + duration.Minutes+ "m";
string ticketContent = "Traveler: " + person.Name + " CNP: " +
person.Cnp.ToString ();
graph.DrawString(ticketContent, font, XBrushes .Black, new XRect(10, 10,
pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "Flight ID: " + ticket.FlightId, font, XBrushes .Black, new
XRect(10, 70, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
string seatNumber = ticket.SeatNo;
string cls = ticket.Type.ToString();
graph.DrawString( "\tFrom: " +
_presenter.GetFlightById(ticket.FlightId).Sour ce.Name + "\n\tTo: " +
_presenter.GetFlightById(ticket.FlightId).Destination.Name, font, XBrushes .Black, new
XRect(30, 130, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "clasa: " + cls, font, XBrushes .Black, new XRect(30, 130,
pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "Departure date: " + dateString, font, XBrushes .Black, new
XRect(10, 190, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
graph.DrawString( "Duration: " + durationString, font, XBrushes .Black, new
XRect(10, 250, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats .TopLeft);
string pdfFilename = "ticket.pdf" ;
pdf.Save(pdfFilena me);
Process.Start(pdfFilename);
}
//evenimentul de inchidere al ferestrei principale, inchiderea aplicatiei
private void MainWindow_FormClosed( object sender, FormClosedEventArgs e)
{
_presenter.EndSh ift();
Application .Exit();
}
//evenimentul de click al elementului 'Exit' din meniu
private void exitToolStripMenuItem_Click( object sender, EventArgs e)
{
Application .Exit();
}
private void settingsToolStripMenuItem_Click( object sender, EventArgs e)
{
_presenter.EndShift();
this.Hide();
Application .Restart();
}
private void timer1_Tick( object sender, EventArgs e)
{
label3.Text = "Conectat ca: " + Common. GlobalValues .loggedEmployee.Name;
label5.Text = "Data: " + DateTime .Now.ToString( "dd-MM-yyyy");
label7.Text = "Ceas: " + DateTime .Now.ToString( "hh:mm:ss tt" );
}
}
}
o Fereastr a ViewLocations
namespace Airlines_Tickets
{ public partial class ViewLocations : Form, IViewLocation
{
private ViewLocationPresenter _presenter;
public ViewLocations()
{
InitializeComponent();
AttachPres enter(new ViewLocationPresenter ());
}
public void AttachPresenter( ViewLocationPresenter presenter)
{
_presenter = presenter;
_presenter.SetView( this);
}
public void ShowException( Exception e)
{
MessageBox .Show(e.ToString());
}
private void ViewLocations_Load( object sender, EventArgs e)
{
foreach (LocationBO item in _presenter.GetLocations())
{
listBox1.Items.Add(it em);
}
}
//evenimentul de click al butonului care elimina o locatie
private void button1_Click( object sender, EventArgs e)
{
if(listBox1.SelectedIndex <0)
{
MessageBox .Show("No location selected" );
}
else
{
_presenter.RemoveLocation(listBox1.SelectedItem as LocationBO );
Reload();
}
}
//reincarcarea listei de locatii dupa ce au fost eliminate locatii
public void Reload()
{
listBox1.Items.Clear();
foreach (LocationBO item in _presenter.GetLocations())
{
listBox1.Items.Add(item);
}
}
}
}
o IEditFlight
namespace AirlinesTicketsBLL.Interfaces
{
public interface IEditFlight
{
void ShowException( Exception e);
//incarcarea zborurilor zilnice
void LoadDailyFlights( List<DailyFlightBO > flights);
//incarcarea zboruril or saptamanale
void LoadWeeklyFlights( List<WeeklyFlightBO > flights);
//incarcarea zborurilor la doua saptamani
void LoadTwoWeeksFlights( List<TwoWeeksFlightBO > flights);
//incarcarea zborurilor lunare
void LoadMonthly Flights( List<MonthlyFlightBO > flights);
}
}
o IHistory
namespace AirlinesTicketsBLL.Interfaces
{
public interface IHistory
{
void ShowException( Exception e);
//incarcarea istoricului zborurilor
void LoadFlight( HistoryFlig ht flight);
}
}
Proiectul AirlinesTicketsBLL
Interfaces
o IAddFlight
namespace AirlinesTicketsBLL.Interfaces
{
public interface IAddFlight
{
//afisarea exceptiilor
void ShowException( Exception e);
}
}
o IAddLocation
namespace AirlinesTicketsBLL.Interfaces
{
public interface IAddLocation
{
void ShowException( Exception e);
}
}
o IAdminView
namespace AirlinesTicketsBLL.Interfaces
{
public interface IAdminView
{
void ShowException( Exception e);
}
}
o IHistory
namespace AirlinesTicketsBLL.Interfaces
{
public interface IHistory
{
void ShowException( Exception e);
//incarcarea istoricului zborurilor
void LoadFlight( HistoryFlight flight);
}
}
o IMainWindow
namespace AirlinesTicketsBLL.Interfaces
{
public interface IMainWindow
{
void ShowException( Exception e);
//incarcarea zborurilor gasite in urma cautarii
void LoadFlight( List<IFlight> flights);
//afisarea messajelor care anunta utilizatorul ca nu a completat toate campurile
void ShowMessage( string message);
}
}
Presenters
o AddFlightPresenter
namespace AirlinesTicketsBLL.Presenters
{
public class AddFlightPresenter
{
IAddFlight _view;
//atasarea unei ferestre prezenterului curent
public void SetView( IAddFlight view)
{
_view = view;
}
//intoarce locatiile din baza de date
public List<LocationBO > GetLocations()
{
try
{
return new LocationBLL ().GetLocations();
}
catch (Exception e)
{
_view.ShowException(e);
return new List<LocationBO >();
}
}
//adauga zbor zi lnic in baza de date
public void AddDailyFlight( DailyFlightBO flight)
{
try
{
new FlightBLL ().AddDailyFlight(flight);
}
catch (Exception e)
{
_view.ShowException(e);
}
}
//adauga zbor saptamanal in baza de date
public void AddWeeklyFlight( WeeklyFlightBO flight)
{
try
{
new FlightBLL ().AddWeeklyFlight(flight);
}
catch (Exception e)
{
_view.ShowException(e);
}
}
//adauga zbor la doua saptamani in baza de date
public void AddTwoWeeksFlight( TwoWeeksFlightBO flight)
{
try
{
new FlightBLL ().AddTwoWeeksFlight(flight);
}
catch (Exception e)
{
_view.ShowException(e);
}
}
//adauga zbor lunar in baza de date
public void AddMonthlyFlight( MonthlyFlightBO flight)
{
try
{
new FlightBLL ().AddMonthlyFlight(flight);
}
catch (Exception e)
{
_view.ShowException(e);
}
}
}
}
o AddLocationPresenter
namespace AirlinesTicketsBLL.Presenters
{
public class AddLocationPresenter
{
Interfaces. IAddLocation _view;
//atasaza o fereastra presenterului curent
public void SetView(Interf aces.IAddLocation view)
{
_view = view;
}
//adauga o locatie in baza de date
public void AddLocation( string name)
{
try
{
new LocationBLL ().AddLocation( new Location BO() { Name = name });
}
catch (Exception e)
{
_view.ShowException(e);
}
}
}
}
o AdminFormPresenter
namespace AirlinesTicketsBLL.Presenters
{
public class AdminFormPresenter
{
private Interfaces. IAdminView _view;
public void SetView(Interfaces. IAdminView view)
{
_view = view;
}
//returneaza o lista cu toti angajatii
public List<EmployeeBO > GetEmployees()
{
try
{
return new EmployeeBLL ().GetEmployees();
}
catch (Exception e)
{
_view.ShowException(e);
return new List<EmployeeBO >();
}
}
//returneaza numarul de bilete vandute de un angajat
public int GetTicketsAmount( EmployeeBO emp)
{
try
{
return new EmployeeBLL ().GetTicketsAmount(emp);
}
catch (Exception e)
{
_view.ShowException(e);
return 0;
}
}
}
}
Class
o FlightBLL
namespace AirlinesTicketsBLL
{
public class FlightBLL
{
//adaugarea unui zbor zilnic in baza de date
public void AddDailyFlight( DailyFlightBO flight)
{
try
{
new DailyFlightDAL ().AddFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//adaugarea unui zbor saptamanal in baza de date
public void AddWeeklyFlight( WeeklyFlightBO flight)
{
try
{
new WeeklyFlightDAL ().AddFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//adaugarea unui zbor la doua saptamani in baza de date
public void AddTwoWeeksFlight( TwoWeeksFlightBO flight)
{
try
{
new TwoWeeksFlightDAL ().AddFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//adaugarea unui zbor lunar in baza de date
public void AddMonthlyFlight( MonthlyFlightBO flight)
{
try
{
new MonthlyFlightDAL ().AddFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//returneaza un z bor in functie de id
public IFlight GetFlightById( int id)
{
try
{
return new DailyFlightDAL ().GetFlightById(id);
}
catch (Exception e)
{
throw e;
}
}
//returneaza istoricul zborurilor din baza de date
public List<HistoryFlight > GetHistory()
{
try
{
return new FlightDAL ().GetHistory();
}
catch (Exception e)
{
throw e;
}
}
//returneaza zborurile zilnice din baza de date
public List<DailyFlightBO > GetDailyFlights()
{
try
{
return new DailyFlightDAL ().GetFlights();
}
catch (Exception e)
{
throw e;
}
}
//returneaza zborurile saptamanale din baza de date
public List<WeeklyFlightBO> GetWeeklyFlights()
{
try
{
return new WeeklyFlightDAL ().GetFlights();
}
catch (Exception e)
{
throw e;
}
}
//returneaza zborurile la doua saptamani din baza de date
public List<TwoWeeksFlightBO > GetTwoWeeksFlights()
{
try
{
return new TwoWeeksFlightDAL ().GetFlights();
}
catch (Exception e)
{
throw e;
}
}
//returneaza zborurile lunare din baza de date
public List<MonthlyFlightBO > GetMonthlyFlights()
{
try
{
return new MonthlyFlightDAL ().GetFlights();
}
catch (Exception e)
{
throw e;
}
}
//returneaza zborurile gasite in functie de criteriile de cautare
public List<IFlight> FoundFlight( LocationBO source, LocationBO destination,
DateTime date, bool business)
{
try
{
return new FlightDAL ().FoundFlight(source, destination, date, business);
}
catch (Exception e)
{
throw e;
}
}
//returneaza numarul de locuri ale unui zbor
public int[] GetSeatsNumber( IFlight flight)
{
try
{
return new FlightDAL ().GetSeatsNumber(fl ight);
}
catch (Exception e)
{
throw e;
}
}
//returneaza numarul de bilete vandute pentru un zbor
public int[] SoldTicketsNumber( IFlight flight)
{
try
{
return new FlightDAL ().SoldTicketsNumber(flight);
}
catch (Exception e)
{
throw e;
}
}
//stergerea unui zbor zilnic din baza de date
public void RemoveDailyFlight( DailyFlightBO flight)
{
try
{
new DailyFlightDAL ().RemoveFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//stergerea unui zbor saptamanal din baza de date
public void RemoveWeeklyFlight( WeeklyFlightBO flight)
{
try
{
new WeeklyFlightDAL ().RemoveFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//stergerea unui zbor la doua saptamani din baza de date
public void RemoveTwoWeeksFlight( TwoWeeksFlightBO flight)
{
try
{
new TwoWeeksFlightDAL ().RemoveFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//stergerea unui zbor lunar din baza de date
public void RemoveMonthlyFlight( MonthlyFlightBO flight)
{
try
{
new MonthlyFlightDAL ().RemoveFlight(flight);
}
catch (Exception e)
{
throw e;
}
}
//editarea unui zbor lunar
public void EditMonthlyFlight( MonthlyFlightBO flight, MonthlyFlightBO editedFlight,
int hour, int min, int depH, int depM)
{
try
{
new MonthlyFlightDAL ().EditFlight(flight, editedFlight, ho ur, min, depH,
depM);
}
catch (Exception e)
{
throw e;
}
}
//editarea unui zbor zilnic
public void EditDailyFlight( DailyFlightBO flight, DailyFlightBO editedFlight, int
hour, int min, int depH, int depM)
{
try
{
new DailyFlightDAL ().EditFlight(flight, editedFlight, hour, min, depH,
depM);
}
catch (Exception e)
{
throw e;
}
}
//editarea unui zbor saptamanal
public void EditWeeklyFlight( WeeklyFlightBO flight, WeeklyFlightBO editedFlight,
int hour, int min, int depH, int depM)
{
try
{
new WeeklyFlightDAL ().EditFlight(flight, editedFlight, hour, min, depH,
depM);
}
catch (Exception e)
{
throw e;
}
}
//editarea unui zbor la doua saptamani
public void EditTwoWee ksFlight( TwoWeeksFlightBO flight, TwoWeeksFlightBO
editedFlight, int hour, int min, int depH, int depM)
{
try
{
new TwoWeeksFlightDAL ().EditFlight(flight, editedFlight, hour, min, depH,
depM);
}
catch (Exception e)
{
throw e;
}
}
}
}
Proiectul AirlinesTicketsBO
o DailyFlightBO
namespace AirlinesTicketsBO
{
public class DailyFlightBO : IFlight
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
private int businessSeats;
public int BusinessSeats
{
get { return businessSeats; }
set { businessSeats = value; }
}
private int economicSeats;
public int EconomicSeats
{
get { return economicSeats; }
set { economicSeats = value; }
}
private int businessPrice;
public int BusinessPrice
{
get { return businessPrice; }
set { businessPrice = value; }
}
private int economicPrice;
public int EconomicPrice
{
get { return economicPrice; }
set { economicPrice = value; }
}
private FlightType flightType;
public FlightType FlightType
{
get { return flightType; }
set { flightType = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private LocationBO source;
public LocationBO Source
{
get { return source; }
set { source = value; }
}
private LocationBO destination;
public LocationBO Destination
{
get { return destination; }
set { destination = value; }
}
private DateTime departureDate;
public DateTime DepartureDate
{
get { return departureDate; }
set { departureDate = value; }
}
private DateTime arriveDate;
public DateTime ArriveDate
{
get { return arriveDate; }
set { arriveDate = value; }
}
public override string ToString()
{
return Name;
}
}
}
o PersonBO
namespace AirlinesTicketsBO
{
public class PersonBO
{
private TicketBO ticket;
public TicketBO Ticket
{
get { return ticket; }
set { ticket = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string cnp;
public string Cnp
{
get { return cnp; }
set { cnp = value; }
}
}
}
o TicketBO
namespace AirlinesTicketsBO
{
public class TicketBO
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
private TicketType type;
public TicketType Type
{
get { return type; }
set { type = value; }
}
private double price;
public double Price
{
get { return price; }
set { price = value; }
}
private string seatNo;
public string SeatNo
{
get { return seatNo; }
set { seatNo = value; }
}
private int flightId;
public int FlightId
{
get { return flightId; }
set { flightId = value; }
}
}
}
Proiectul AirlinesTicketsDAL
o AdministratorDAL
namespace AirlinesTicketsDAL
{
public class AdministratorDAL
{
string getAdmin = "select * from [Administrator] where Username=@username and
[Password]=@password" ;
//verifica daca datele de logare introduse de administrator sunt corecte
public bool ValidateAdmin( AdministratorBO adm)
{
bool valid = false;
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (getAdmin, con.myCon nection);
command.Parameters.Add( "@username" , adm.Username);
command.Parameters.Add( "@password" , adm.Password);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRo ws)
{
while (reader.Read())
{
AdministratorBO ad = new AdministratorBO ()
{
Username = reader[ "Username"].ToString(),
Name = reader[ "Name"].ToString(),
Password = reader[ "Password" ].ToString(),
Id = Convert.ToInt32(reader[ "Id"].ToString())
};
if (ad.Username == adm.Username && ad.Password == adm.Password)
{
valid = true;
}
}
}
}
catch (Exception e)
{
throw e;
}
return valid;
}
}
}
}
o DailyFlightDAL
namespace AirlinesTicketsDAL
{
public class DailyFligh tDAL
{
//stringurile care reprezinta interogari ale bazei de date: insert, update, delete
#region queries
string addFlight = "Insert into Flight values(@name, @sourceId, @destinationId,
@departureDate, @arriveDate, @businessSea ts, @economicSeats, @businessPrice,
@economicPrice, @type)" ;
string getFlights = @"SELECT Min(Id) as [Id], Name, Min(SourceId) as [SourceId],
Min(DestinationId) as [DestinationId], Min(DepartureDate) as [DepartureDate],
Min(ArriveDate) as [ArriveDa te], Min(BusinessSeats) as [BusinessSeats], Min(EconomicSeats)
as [EconomicSeats], Min(BusinessPrice) as [BusinessPrice], Min(EconomicPrice) as
[EconomicPrice], Min(Type) as [Type] from Flight
where Type='Daily'
GROUP BY Name" ;
string removeFligh tIndex = "select top 1 Flight.Id from Flight inner join Ticket on
Ticket.FlightId=Flight.Id where Flight.Name= @flightName order by Flight.Id desc" ;
string remove = "delete from Flight where Id>@id and Type='Daily'" ;
string selectFor Edit = "select top 1 Flight.Id from Flight inner join Ticket on
Ticket.FlightId=Flight.Id where Flight.Name=@flightName and Flight.Type='Daily' order by
Flight.Id desc" ;
string update = "update Flight set BusinessPrice = @bPrice,
EconomicPrice=@e Price,BusinessSeats=@bSeats, EconomicSeats = @eSeats,
DepartureDate=@depDate, ArriveDate=@arrDate where Name=@name and Id>@id" ;
string select = "select * from Flight where Id>@id and Type='Daily' and
Name=@name" ;
string getById = "select * from Flight where Id=@id" ;
#endregion
//editarea unui zbor zilnic
public void EditFlight( DailyFlightBO flight, DailyFlightBO editedFlight, int hour,
int min, int depH, int depM)
{
int index = 0;
//conectarea la baza de date prin intermediul constructorului clasei
DbConnector
using (DbConnector con = new DbConnector ())
{
try
{
//crearea unei interogari asupra bazei de date – command
SqlCommand command = new SqlCommand (selectForEdit, con.myConnection);
command.Parameters.Add( "@flightName" , flight.Name);
//citirea bazei de date – reader
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
index = Convert.ToInt32(reader[ "Id"].ToString());
}
}
catch (Exception e)
{
//prinde exceptiile aparute in prelucrarea datelor bazei de date
throw e;
}
}
List<DailyFlightBO > Flights = new List<DailyFlightBO >();
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (select, con.myConnection);
//inlocuirea parametrilor interogarii
command.Parameters. Add("@id", index);
command.Parameters.Add( "@name", flight.Name);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
//crearea obie ctului in functie de rezultatul citirii bazei de date
DailyFlightBO flg = new DailyFlightBO ();
flg.Id = Convert.ToInt32(reader[ "Id"].ToString());
flg.DepartureDate = reader.GetDateTim e(4);
flg.ArriveDate = reader.GetDateTime(5);
flg.BusinessPrice =
Convert.ToInt32(reader[ "BusinessPrice" ].ToString());
flg.EconomicPrice =
Convert.ToInt32(reader[ "EconomicPrice" ].ToString());
flg.BusinessSeats =
Convert.ToInt32(reader[ "BusinessSeats" ].ToString());
flg.EconomicSeats =
Convert.ToInt32(reader[ "EconomicSeats" ].ToString());
flg.Name = reader[ "Name"].ToString();
Flights.Add(flg);
}
}
catch (Exception e)
{
throw e;
}
}
using (DbConnector con = new DbConnect or())
{
try
{
foreach (DailyFlightBO fl in Flights)
{
if (fl.DepartureDate > DateTime .Now)
{
SqlCommand command = new SqlCommand (update, con.myConnection);
command.Parameters.Add( "@bPrice" , editedFlight.BusinessPrice);
command.Parameters.Add( "@ePrice" , editedFlight.EconomicPrice);
command.Parameters.Add( "@bSeats" , editedFlight.BusinessSeats);
command.Parameters.Add( "@eSeats" , editedFlight.EconomicSeats);
DateTime dep = new DateTime (fl.DepartureDate.Year,
fl.Depart ureDate.Month, fl.DepartureDate.Day, depH, depM, 1);
DateTime arr = dep.AddHours(hour).AddMinutes(min);
command.Parameters.Add( "@depDate" , dep);
command.Parameters.Add( "@arrDate", arr);
command.Parameters.Add( "@id", fl.Id);
command.Parameters.Add( "@name", fl.Name);
command.ExecuteNonQuery();
}
}
}
catch (Exception e)
{
throw e;
}
}
}
//cautarea unui zbor in functie de id
public IFlight GetFlightById( int id)
{
using (DbConnector con = new DbConnector ())
{
DailyFlightBO fl = new DailyFlightBO ();
try
{
SqlCommand command = new SqlCommand (getById, con.myConnection);
command.Parameters.Add( "@id", id);
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
fl = new DailyFlightBO ()
{
Name = reader[ "Name"].ToString(),
Source = new
LocationDAL ().GetLocationById( Convert.ToInt32(reader[ "SourceId" ].ToString())),
Destination = new
LocationDAL ().GetLocationById( Convert.ToInt32 (reader[ "DestinationId" ].ToString())),
DepartureDate =
Convert.ToDateTime(reader[ "DepartureDate" ].ToString()),
ArriveDate =
Convert.ToDateTime(reader[ "ArriveDate" ].ToString()),
BusinessSeats =
Convert.ToInt32(reader[ "BusinessSeats" ].ToString()),
EconomicSeats =
Convert.ToInt32(reader[ "EconomicSeats" ].ToString()),
BusinessPrice =
Convert.ToInt32(reader[ "BusinessPrice" ].ToString()),
EconomicPrice =
Convert.ToInt32(reader[ "EconomicPrice" ].ToString()),
FlightType = FlightType .Daily
};
}
return fl;
}
catch (Exception e)
{
throw e;
}
}
}
//returneaza toate zborurile zilnice
public List<DailyFlightBO > GetFlights()
{
using (DbConnector con = new DbConnector ())
{
List<DailyFlightBO > flights = new List<DailyFlightBO >();
try
{
SqlCommand command = new SqlCommand (getFlights, con.myConnection);
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
DailyFlightBO fl = new DailyFlightBO ()
{
Name = reader[ "Name"].ToString(),
Source = new
LocationDAL ().GetLocationById( Convert.ToInt32(reader[ "SourceId" ].ToString())),
Destination = new
LocationDAL ().GetLocationById( Convert.ToInt32(reader[ "DestinationId" ].ToString())),
DepartureDate =
Convert.ToDateTime(reader[ "DepartureDate" ].ToString()),
ArriveDate =
Convert.ToDateTime(reader[ "ArriveDate" ].ToString()),
BusinessSeats =
Convert.ToInt32(reader[ "BusinessSeats" ].ToString()),
EconomicSeats =
Convert.ToInt32(reader[ "EconomicSeats" ].ToString()),
BusinessPrice =
Convert.ToInt32(reader[ "BusinessPrice" ].ToString()),
EconomicPrice =
Convert.ToInt32(reader[ "EconomicPrice" ].ToString()),
FlightType = FlightType .Daily
};
flights.Add(fl);
}
return flights;
}
catch (Exception e)
{
throw e;
}
finally
{
con.Dispose();
}
}
}
//adaugarea unui zbor zilnic in bazade date
public void AddFlight( DailyFlightBO flight)
{
using(DbConnector con = new DbConnector ())
{
try
{
for (int i = 0; i<60; i++)
{
SqlCommand command = new SqlCommand (addFlight, con.myConnection);
command.Parameters.Add( "@name", flight.Name);
command.Parameters.Add( "@sourceId" , flight.Source.Id);
command.Parameters.Add( "@destinationId" , flight.Destination.Id);
command.Parameters.Add( "@departureDate" , flight.DepartureDate);
command.Parameters.Add( "@arriveDate" , flight.ArriveDate);
command.Parameters.Add( "@businessSeats" , flight.BusinessSeats);
command.Parameters.Add( "@economicSeats" , flight.EconomicSeats);
command.Parameters.Ad d("@businessPrice" , flight.BusinessPrice);
command.Parameters.Add( "@economicPrice" , flight.EconomicPrice);
command.Parameters.Add( "@type", "Daily");
command.ExecuteNonQuery();
flight.DepartureDate = flight.DepartureDate.AddDays(1);
flight.ArriveDate = flight.ArriveDate.AddDays(1);
}
}
catch (Exception e)
{
throw e;
}
finally
{
con.Dispose();
}
}
}
//stergerea unui zbor zilnic din baza de date
public void RemoveFlight( DailyFlightBO flight)
{
int index = 0;
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (removeFlightIndex,
con.myConnection);
command.Parameters.Add( "@flightName" , flight.Name);
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
index = Convert.ToInt32(reader[ "Id"].ToString());
}
}
catch (Exception e)
{
throw e;
}
finally
{
con.Dispose();
}
}
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (remove, con.myConnection);
command.Parameters.Add( "@id", index);
command.ExecuteNonQuery();
}
catch (Exception e)
{
throw e;
}
finally
{
con.Dispose();
}
}
}
}
}
o PersonDAL
namespace AirlinesTicketsDAL
{
public class PersonDAL
{
#region Queries
string addPerson = "insert into Person values(@name, @cnp, @ticketId)" ;
#endregion
//adaugarea unei persoane in baza de date
public void AddPerson( PersonBO person)
{
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlComma nd(addPerson, con.myConnection);
command.Parameters.Add( "@name", person.Name);
command.Parameters.Add( "@cnp", person.Cnp);
command.Parameters.Add( "@ticketId" , new TicketDAL ().GetLastTicketId());
command.ExecuteNonQuery();
}
catch (Exception e)
{
throw e;
}
}
}
}
}
o TicketDAL
namespace AirlinesTicketsDAL
{
public class TicketDAL
{
#region Queries
string getLastId = "select MAX(SeatNumber) [Max] from Ticket where FlightId =
@flightId" ;
string addTicket = "insert into [Ticket] values (@type, @price, @seatNumber,
@flightId, @date, @empId)" ;
string getLastTicketId = "select MAX(Id) [Max] from Ticket" ;
string getTicketsAmount = "select count(t.Id) [Num] from Ticket t, Employee e
where e.Id = t.EmployeeId and e.Id= @empId and [Date]>@date" ;
#endregion
public int GetAmount(EmployeeBO emp)
{
int am = 0;
using(DbConnector con = new DbConnector ())
{
try
{
SqlCommand comm = new SqlCommand (getTicketsAmount, con.myConnection);
comm.Parameters.Add( "@empId" , emp.Id);
comm.Parameters.Add( "@date", DateTime .Now.AddDays( -30));
SqlDataReader reader = comm.ExecuteReader();
while(reader.Read())
{
am = Convert.ToInt32(reader[ "Num"].ToString());
}
}
catch (Exception e)
{
throw e;
}
}
return am;
}
public void AddTicket( TicketBO ticket)
{
using (DbConnector con = new DbConnector ())
{
try
{
SqlCommand command = new SqlCommand (addTicket, con.myConnect ion);
command.Parameters.Add( "@type", ticket.Type.ToString());
command.Parameters.Add( "@price" , ticket.Price);
command.Parameters.Add( "@seatNumber" , ticket.SeatNo);
command.Par ameters.Add( "@flightId" , ticket.FlightId);
command.Parameters.Add( "@date", DateTime .Now);
command.Parameters.Add( "@empId" , GlobalValues .loggedEmployee.Id);
command.ExecuteNonQuery();
}
catch (Exception e)
{
throw e;
}
}
}
//returneaza id -ul ultimului bilet intriodus in baza de date
public int GetLastTicketId()
{
using (DbConnector con = new DbConnector ())
{
int id = 0;
try
{
SqlCommand command = new SqlCommand (getLastTicketId, con.myConnection);
SqlDataReader reader = command.ExecuteReader();
if(reader.HasRows)
{
while (reader.Read())
{
try
{
id = Convert.ToInt32(reader[ "Max"].ToString());
}
catch (Exception e)
{
id = 1;
}
}
}
else
{
id = 1;
}
return id;
}
catch (Exception e)
{
throw e;
}
}
}
//returneaza id -ul unui bilet in functie de zbor
public int GetTicketId( IFlight flight)
{
using (DbConnector con = new DbConnector ())
{
try
{
int id = 0;
SqlCommand command = new SqlCommand (getLastId, con.myConnection);
command.Parameters.Add( "@flightId" , flight.Id);
SqlDataReader reader = c ommand.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
try
{
id = Convert.ToInt32(reader[ "Max"].ToString());
}
catch (Exception )
{
id = 0;
}
}
}
else
{
id = 0;
}
return id;
}
catch (Exception e)
{
throw e;
}
}
}
}
}
Proiectul Common
namespace Common
{ public class DbConnector : IDisposable
{
public SqlConnection myConnection = new SqlConnection ("user id=bogdan;" +
"password=qwer ty;server=BODY \\SQLEXPRESS;" +
"Trusted_Connection=yes;" +
"database=BileteAvion; " +
"connection timeout=30" );
public DbConnector( )
{
//deschide conexiunea la baza de date fara apelare explicita
myConnection.Open();
}
//implementarea metodei Dispose aflata in interfata IDisposable
public void Dispose()
{
//inchide conexi unea la baza de date in momentul distrugerii obiectului de tip
DbConnector
myConnection.Close();
}
}
//date folosite la nivel global in aplicatie
public static class GlobalValues
{
public static EmployeeBO loggedEmployee = new EmployeeBO ();
public static DateTime startShift;
}
}
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: Șef lucrări dr. Ing. Ionuț Cristian Resceanu Iulie, 2015 CRAIOVA ii UNIVERSITATEA DIN CRAIOVA FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI ELECTRONICĂ… [611719] (ID: 611719)
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.
