SPECIALIZAREA REȚELE ȘI SOFTWARE DE TELECOMUNICAȚII Aplicație de management de contracte pentru comerț de produse COORDONATOR ȘTIINȚIFIC PROF. UNIV…. [618840]
ORADEA
2018 UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ ȘI TEHNOLOGIA
INFORMAȚIEI
LUCRARE DE LICENȚĂ
COORDONATOR ȘTIINȚIFIC
PROF. UNIV. DR. SORIN CURILĂ
ABSOLVENT: [anonimizat]
2018
ORADEA
2018
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ Ș I TEHNOLOGIA
INFORMAȚIEI
SPECIALIZAREA REȚELE ȘI SOFTWARE DE
TELECOMUNICAȚII
Aplicație de management de contracte
pentru comerț de produse
COORDONATOR ȘTIINȚIFIC
PROF. UNIV. DR. SORIN CURILĂ
ABSOLVENT: [anonimizat]
4
CUPRINS
CUPRINS ………………………….. ………………………….. ………………………….. ………………………….. …….. 4
Capitolul 1 Introducere ………………………….. ………………………….. ………………………….. ………….. 5
1.1 Descriere ………………………….. ………………………….. ………………………….. ……………………… 5
1.2 Motivație ………………………….. ………………………….. ………………………….. …………………….. 5
1.3 Sumar ………………………….. ………………………….. ………………………….. …………………………. 6
Capitolul 2 Tehnologii folosite ………………………….. ………………………….. ………………………….. .. 7
2.1 HTML ………………………….. ………………………….. ………………………….. …………………………. 7
2.2 CSS ………………………….. ………………………….. ………………………….. ………………………….. … 7
2.3 JavaScript ………………………….. ………………………….. ………………………….. ……………………. 8
2.3.1 jQuery ………………………….. ………………………….. ………………………….. ………………… 9
2.4 Bootstrap ………………………….. ………………………….. ………………………….. …………………… 10
2.5 SQL ………………………….. ………………………….. ………………………….. ………………………….. 10
2.6 ASP.NET ………………………….. ………………………….. ………………………….. …………………… 12
2.6.1 ASP.NET WebForms ………………………….. ………………………….. ………………………. 12
2.6.2 ASP.NET Component Model ………………………….. ………………………….. …………… 13
2.7 ASP.NET Core ………………………….. ………………………….. ………………………….. …………… 14
2.7.1 ASP.NET Core MVC ………………………….. ………………………….. ………………………. 15
2.8 Entity Framework ………………………….. ………………………….. ………………………….. ……….. 17
2.9 RAZOR View Engine ………………………….. ………………………….. ………………………….. …. 19
Capitolul 3 Implementarea Aplicației ………………………….. ………………………….. …………………. 20
3.1 Arhtitectura ………………………….. ………………………….. ………………………….. ………………… 20
3.2 Înregistrare și autentificare ………………………….. ………………………….. ……………………….. 20
3.3 Adăugarea de manager de cont ………………………….. ………………………….. …………………. 25
3.4 Înregistrarea unei companii noi în sistem ………………………….. ………………………….. …… 26
3.4.1 Contracte ………………………….. ………………………….. ………………………….. …………… 30
3.4.2 Adăugare ………………………….. ………………………….. ………………………….. …………… 31
3.4.3 Editare ………………………….. ………………………….. ………………………….. ………………. 31
3.4.4 Aprobare ………………………….. ………………………….. ………………………….. …………… 32
Capitolul 4 Concluzii ………………………….. ………………………….. ………………………….. …………… 33
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. … 34
Anexe ………………………….. ………………………….. ………………………….. ………………………….. ………… 36
Anexa nr.1. Adaugare companie ………………………….. ………………………….. …………………………. 36
Anexa nr.2. Editare companie ………………………….. ………………………….. ………………………….. … 38
Anexa nr.3. Listare companii ………………………….. ………………………….. ………………………….. …. 39
Anexa nr.4. Diagrama bazei de date ………………………….. ………………………….. ……………………. 40
5
Capitolul 1 Introducere
1.1 Descriere
În această lucrare este prezentată o aplicaț ie de manag ement al contractelor de vânzare și
cumpă rare de produse indiferent de categorie. Aplicaț ia poate fi folosită de catre companii care
cumpără de la o firma ce produce o gamă de produse și vinde la altă companie care este interesată
de anumite produse. Se po t adăuga companii î n sistem, contracte, emitere de document pentru
contractele respective, trimite rea de e -mail cu documentul atașat. Este implementată sub forma
unei aplicaț ii web, folosind framework -ul ASP.Net Core, folosind arhit ectura MVC de a organiza
aplicația ș i MS-SQL pentru stocare de informaț ii.
1.2 Motivați e
Implementarea acestei aplicaț ii a oferit o portuniatea de a studia o varietate de tehnologii
noi apă rute de la Microsoft cum ar fi: ASP.Net Core pentru aplicaț ia web, MSSQL pentru
stocarea date lor, Azure Storage pentru a stoca documentele gener ate de că tre sistem , Entity
Framework Core pe ntru interogarea bazei de date ș i salvarea datelor.
Folosirea acestor tehnologii a permis o dezolvatare rapid ă a aplicației pentru că permite să
ne concentrăm pe partea de logică a aplicaț iei. Partea de logică ce ține de infrastructura aplicației
și marea majoritatea aplicaț iilor, acestea sunt cunoscute sub denumirea de „Crosscutting
Concerns”[ 33] , cum ar fi autorizarea, caching, management -ul erorilor genera te de sistem pot fi
ușor ge stionat e cu ASP.Net Core pentru că pune la dispoziție utilități ori să permită integrarea
externă a unor libră rii dezolvate de alte persoane sa u servicii interne care se ocupă de chestiile de
bază care sunt în sistem ș i nu necesi tă personalizarea logicii.
6
1.3 Sumar
În această lucrare se descrie o aplicaț ie atat di n punct de vedere teoretic dar și al implementării,
o aplicaț ie de management al contractelor de vânzare și cumpărare al produselor între compania
care se ocupă de a cumpă ra produse și să le vândă la alte companii care cumpără produsele
respective. Prima versiune a aplicației este destinată pe post de aplicaț ie pilot cu cerințele de bază
implementate care sunt caracteristice scopului aplicaț iei.
În al doilea capitol „Tehnolog ii folosite” se prezintă tehnologiile folosite în implementarea
aplicaț iei, metode de programare abordate.
În capitolul al treilea „Împlementarea aplicaț iei” se va prezenta arhitectura aplicației ș i
implementarea unui schelet de bază a unei aplicaț ii care poate fi personalizată pentru clienți
individuali și modul de funcționarea a acestei aplicaț ii.
În capitolul final al lucră rii, vo i prezenta concluziile la care am ajuns după implementarea
aplicației și ce functionalități viitoare care pot fi adă ugate pent ru extinderea aplicaț iei.
7
Capitolul 2 Tehnologii folosite
2.1 HTML
Tehnologia fundamentală folosită pentru structurarea unei pagini web este HTML[1][2]
( HyperText MarkUp Language ). HTML este standardul de marcare pentru crearea paginilor și
aplicațiilor web.
Constr ucțiile HTML, imaginile, și alte obiecte, precum și formularele interactive pot fi
încorporate în pagina redată. Aceasta oferă un mijloc de a crea documente structurate prin
desemnarea structurata a semanticii pentru text, titluri, paragrafe, liste, imagin i, citate și alte
elemente.
Elementele HTML sunt formate din etichete, scrise folosind paranteze unghiulare. Etichete
precum <img /> și <input /> introduc conținut direct în pagină. Altele precum <p>…</p> ,
<div>…</div> înconjoara și oferă informații și pot să conțină alte etichete.
2.2 CSS
Cascading Style Sheet[3][4][5] ( CSS ) este un standard folosit pentru a seta stilul vizual al
paginiilor web și al interfețelor utilizatoriilor scrise în HTML. CSS este o tehnologie de temelie
folosită de majoritatea site -urilor web pentru a creea pagini web cu aspect vizual captivant,
interfețe de utilizator pentru aplicații web și interfețe de utilizator pentru multe aplicații mobile.
CSS este conceput în primul r ând pentru a permite separarea prezentării și a conținutulu i,
inclusiv aspecte precum aspectul, culorile, font -urile. Această separare poate îmbunatăți
accesibilitatea conținutului, poate oferi mai multă flexibilitate și control în specificațiile
caracteristicilor de prezentare, permite mai multor pagini HTML să împărtășească formatarea
8
specificând CSS -ul relevant într -un fișier separat și reducând complexitatea și repetarea în
conținutul structural.
CSS are o sintaxa simplă și utilizează un număr de cuvinte cheie în limba engleză pentru a
specifica numele diferit elor proprietăți ale stilului. Un style sheet constă dintr -o listă de reguli.
Fiecare regulă sau set de reguli constă dintr -unul sau mai mulți selectori și un bloc de declarații.
<div style=”color: red;”> Chapter One </div>
<div class=”color -class”> Chapt er One </div>
<style>
div {
color: red;
}
.color-class {
color: red;
}
</style>
2.3 JavaScript
JavaScript[6] [7][8] este un limbaj ușor, interpretat, orientat pe obiecte și este cel mai bine
cunoscut sub numele de limbaj de scripting pentru pagi nile web, dar este folosit și în multe aplicații
non-browser. Este un limbaj de scripting bazat pe prototip care este dinamic și susține stiluri de
programare orientate pe obiecte, imperative și funcționale.
JavaScript rulează pe partea de client a pagini i web, care poate fi folosită pentru design /
programa modul în care se comportă paginile web la apariția unui eveniment. JavaScript este ușor
de învățat și este un limbaj puternic de scripting, folosit pentru a controla comportamentul paginii
web.
9
JavaScr ipt poate ca limbaj procedural și orientat pe obiecte. Obiectele sunt create în mod
programabil in JavaScript, prin atașarea de metode și proprietăți la alte obiecte goale la timpul de
execuție, spre deosebire de definițiile clasei sintactice comune în C++ și JAVA. Odată ce un obiect
a fost construit, acesta poate fi folosit ca un model pentru a crea obiecte similare.
Avantajele JavaScript :
Mai puțină interacțiune cu serverul : Se poate valida intrarea utilizatorului înainte
de a trimite pagina pe server. Acest lucru economisește traficul serverului, ceea ce
înseamnă o încărcare mai mică pe server.
Feedback imediat către vizitatori : Nu este necesar să aștepte o reîncărcare a paginii
pentru a vedea dacă au uitat să introducă ceva.
Interactivitate sporită : Se pot crea interfețe care reacționează atunci când
utilizatorul se deplasează cu mouse -ul peste ele sau activându -le prin intermediul tastaturii.
Interfețe mai bogate : Puteti utiliza JavaScript pentru a include elemente precum
tragere și plasare (drag -and-drop) și sliders pentru a oferii o interfață bogată vizitatorilor
site-ului.
2.3.1 jQuery
jQuery[9][10] este o librărie a JavaScriptului. Scopul acestei librării este de a face mult mai
ușor navigarea documentelor HTML, selectarea elementelor, crearea animații lor, gestionarea
evenimentelor și dezvoltarea aplicațiilor.
jQuery se ocupă de multe sarcini comune care necesită multe linii de cod JavaScript pentru a
le realiza și le împachetează în metode pe care le puteți apela cu o singură linie de cod.
10
2.4 Bootstra p
Bootstrap[11] este un framework ( schelet ) open -source JavaScript dezvoltat de echipa de la
Twitter. Este o combinație de cod HTML, CSS și JavaScript proiectat pentru a ajuta la crearea
componentelor interfeței utilizatorilor. Bootstrap a fost de aseme nea, programat să suporte atât
HTML5, cât și CSS3. De asemenea se numește și Front -end-framework.
Bootstrap este o colecție gratuită de instrumente pentru crearea unui site web și a aplicațiilor
web. Acesta conține șabloane de design HTML și CSS pentru nav igație, butoane, formulare, alerte,
simboluri, etichete, tipografie și alte componente de interfață, precum și extensii JavaScript
opționale.
Unele motive pentru care programatorii aleg Bootstrap :
1. Este ușor de utilizat
2. Un sistem de sită împărțit pe doispr ezece coloane.
3. Elemente de bază pentru majoritatea elementelor HTML ( Tipgrafie, Cod,
Tabele, Formulare, Butoane, Imagini, Icoane).
4. Listă extinsă de componente.
2.5 SQL
SQL[12][13] ( Structured Query Language ) este un limbaj de programare standardizat și
utilizat pentru gestionarea bazelor de date relaționale și efectuarea diferitelor operații asupra
datelor din ele. SQL este folosit în mod regulat de administratorii de baze de date, precum și
dezvoltatorii care scriu scripturi de integrare a datelor și ana liști de date care doresc să creeze și să
execute interogări analitice.
SQL oferă doua avantaje principale. În primul rând, a introdus conceptul de accesare a mai
multor înregistrări cu o singură comandă. În al doilea rând a eliminat nevoia de a specifica cum se
ajunge la o înregistrare, de exemplu cu sau fără indice.
11
Utilizările SQL includ modificarea tabelei de baze de date și a structurilor indice. Adaugare,
actualizare și stergerea rândurilor de date și preluarea subseturilor de informații dintr -o bază de
date pentru procesarea tranzacțiilor și pentru aplicațiile de analiză. Interogările și alte operații
SQL iau forma comenzilor scrise ca instrucțiuni.
Instrucțiunile SQL utilizate in mod obișnuit includ selectarea, adaugarea, inserarea,
actualizarea, ș tergerea, crearea, modificarea și trunchierea.
12
2.6 ASP.NET
ASP.NET[14][15] este un model de dezvoltare web care include serviciile necesare pentru a
construi aplicații web de clasă cu un minim de codificare. ASP.NET face parte din .NET
Framework, iar când s e scrie cod în aplicațiile ASP.NET, se pot accesa clase din .NET Framework.
Se poate scrie cod în orice limba compatibilă cu limbajul de rulare comun, inclusiv Microsoft
Visual Basic și C#.
Aceste limbaje de programare vă permit să dezvoltați aplicații AS P.NET care beneficiază de
modul de funcționare a limbajului comun, de tipul de siguranță și asa mai departe.
ASP.NET funcționează împreună cu protocolul HTTP și utilizează comenzile și politicile
HTTP pentru a stabili o comunicare și cooperare bilaterală î ntre browser și server.
ASP.NET este folosit pentru a produce aplicații web interactive, bazate pe date, pe internet.
Se compune dintr -un număr mare de comenzi, cum ar fi blocurile de text, butoanele și etichetele
pentru asamblarea, configurarea și manipul area codului pentru a crea pagini HTML.
2.6.1 ASP.NET WebForms
Formularele web ASP.NET prelungesc modelul de interacțiune cu aplicațiile web. Browser –
ul trimite un formular web către serverul web, iar serverul returnează o pagină completă de marcare
sau o pagi nă HTML ca răspuns.
Toate activitățiile utilizatoriilor de pe partea clientului sunt redirecționate către server pentru
a fi procesate. Serverul procesează rezultatele acțiunilor clientului și produce reacțiile.
13
2.6.2 ASP.NET Component Model
Modelul de comp onentă ASP.NET oferă diferite blocuri de construcție a paginilor ASP.NET.
ASP.NET este o tehnologie care funcționează în cadrul .NET care conține toate
funcționalitățiile legate de web. Framework -ul .NET este alcătuit dintr -o ierarhie orientată pe
obiecte. Fiecare pagină ASP.NET este un obiect și toate componentele sale, precum controalerele
de pe server care sunt de asemenea, obiecte.
14
2.7 ASP.NET Core
ASP.NET Core[16][17][18] este un framework pentru toate platformele, de înaltă
performanță, open -source pen tru construirea de aplicații moderne, bazate pe cloud, conectate la
internet. Aplicațiile ASP.NET Core pot rula pe .NET Core sau pe întregul .NET Framework. A
fost proiectat pentru a oferii un cadru de dezvoltare optimizat pentru aplicațiile care sunt
implementate în cloud sau care rulează local. Se compune din componente modulare cu un nivel
minim de control, astfel încât să se păstreze flexibilitatea în timp ce se crează soluții. Există
posibilitatea să dezvoltăm și să rulăm aplicațiile principale ASP.NET pe platforme precum
Window, Mac și Linux.
Figură 2-1 ASP.NET Core workflow
15
2.7.1 ASP.NET Core MVC
MVC[19][20] ( Model -View -Controller ) este un model arhitectural care separă o aplicație în
trei grupe p rincipale de componente : Models, Views și Controller. Utilizând acest models,
requesturi -le făcute de catre utilizatori sunt direcționate către un controler care este responsabil
împreună cu modelul pentru a efectua acțiuni de utilizator și a prelua rez ultatele interogărilor.
Controller -ul alege View -ul pentru a fi afișat utilizatorului și îi servește toate datele din
Models pe care îl solicită.
Models într -o aplicație MVC reprezintă starea aplicației și orice logică de afaceri sau
opera țiuni care ar trebui să fie efectuate de aceasta. Logica de afaceri ar trebui încapsulată în
models, împreună cu orice logică de implementare pentru persistența stării aplicației. View -urile
vor folosi cu certitudine tipurile ViewModel proiectate special pentru a conține datele de afișat in
acel View. Controlerul va crea și va popula aceste instanțe de ViewModel din model.
View
Controller
Model
Figură 2-2 Diagrama MVC
16
View -urile sunt responsabile pentru prezentarea conținutului utilizatorului cu ajutorul
interfeței. Pentru a incopora codul .NET în li mbajul de marcare HTML se folosește un View
Engine numit Razor. Este nevoie de o logică minimă în cadrul View -ului și orice logică ar trebui
să se refere la prezentarea conținutului. Dacă se simte nevoia de a executa o mare parte din logică
în fișierul Vie w pentru a afișa date dintr -un model complex, se recomandă utilizarea unui șablon
ViewModel, ViewComponent pentru a simplifica vizualizarea.
Controller -ele sunt componente care manipulează interacțiunea cu utilizatorul, lucrează cu
model -urile și în cele din urma selectează un view pentru prezentarea conținutului către utilizator.
În aplicația MVC, view -ul se ocupă de afișarea informației, controller -ul se ocupă și răspunde
la interacțiunea utilizatorilor. În modelul MVC controller -ul este responsabil pent ru selectarea
tipurilor de model cu care să lucreze și a vizualizării acestora.
17
2.8 Entity Framework
Entity Framework[21][22] este setul de API -uri .NET pentru efectuarea accesului la date.
Entity Framework se încadrează într -o cateogrie de tehnologie de a cces la date numită ORM (
Object Relation Mappers.
ORM sunt concepute pentru a reduce fricțiunea dintre modul în care sunt structurate datele în
baza de date relațională și modul în care vă definiți clasele. Fară ORM trebuie să scrieți o mulțime
de coduri pentru a transforma rezultatele bazei de date în instanțe ale claselor din software -ul
nostru.
Un ORM ne permite să ne exprimăm interogările utilizând clasele noastre și apoi ORM
construiește și execută SQL -ul relavant pentru noi precum și materializarea obiectelor din datele
care au revenit din baza de date. Entity Framework este diferit de multe ORM -uri pe care le
cunoașteți. În timp ce un ORM tipic deduce că, clasele și tabelele de baze de date au o structură
similară, Entity Framework are un strat de l egături între ele și ne oferă mult mai multă flexibilitate
în ceea ce privește modul de obținere a obiectelor la tabele și de la proprietățile unui obiect la
coloane de tabel, iar pentru aceste legături, Entity Framework începe cu unele ipoteze și noi ne
referim la acele ca niște convenții pentru a fi siguri că într -un scenariu specific, datele sunt capabile
să își găsească drumul înainte și înapoi între obiecte și baza de date.
Așadar, de ce un ORM peste alte modalități de a face accesul la date și de ce acest ORM, de
ce Entity Framework?
Folosirea unui ORM poate elimina într -adevăr o serie de sarcini reduntante. Entity Framework
poate spori cu adevărat productivitatea developerilor.
18
De asemenea, asigură coerența în sarcina pe acera o face în loc să aibă diverși membri ai
echipei să își inventeze propriile mijloace de proiectare a accesului la date. Mai degrabă decît să
scrieți SQL -ul relevant pentru a viza baza de date relațională cu care lucrați, Entity Framework
folosește sintaxa LINQ, care face parte din cadrul .NET.
LINQ -to-Entities permite dezvoltatorilor să utilizeze o limbă de interogare consistentă și
puternică, indiferent de baza de date pe care o țintesc. În plus, LINQ -to-Objects este folosit pentru
interogarea altor elemen te ale .NET, chiar și obiecte în memorie, deci developerii beneficiază de
cunoștințele lor despre LINQ, indeferent daca folosesc LINQ -to-Entities, LINQ -to-Objects sau alt
tip de LINQ.
Utilizarea unui ORM permite developeriilor să se concentreze pe domeniul lor, regulile lor de
afaceri și obiectele lor de afaceri.
Figură 2-3 Structura ORM Domeniu Mappings Database Schema
19
2.9 RAZOR View Engine
Un concept important de înțeles despre Razor este acela că este pur și simplu o implementare
mai abstractă a conceptului de View engine în MVC.
Razor View Engine este View en gine implicit al MVC -ului. Razor oferă o mulțime de
caracteristici care îl fac eficient și ușor de utilizat, cum ar fi fișierele de aspect, metode de ajutor,
vederi, vederi parțiale și multe altele. Combinația dintre clasele de bază View Engine și aceste
instrumente sunt ceea ce generează în cele din urmă vederi și standarul de marcare.
Razor oferă multe caracteristici puternice de productivitate care se integrează cu celelalte
straturi ale MVC -ului.
20
Capitolul 3 Implementarea Aplicației
3.1 Arhtitectura
Aplicația a fo st scrisă sub forma unei aplicații web folosind framework -ul MVC creat de
Microsoft, ASP.NET Core. Folosind structura MVC, se ușurează modul de lucru și permite
modificarea cu ușurință a aplicației din cauza separării de roluri a fiecărei entități.
Partea de design a aplicatiei a fost implementata folosind framework -ul bootstrap pentru ca
ofera un mod uniform de a structura aplicatia folosind sistemul de grid, facand posibila si a oferi
utilizatorilor o pagina responsive pentru aplicatiile mobile.
3.2 Înregi strare și autentificare
ASP.NET Core pune la dispoziție un sistem simplu de autentificare și înregistrare numit
ASP Identity[23]. Acest sistem a fost implementat pentru înlocuirea unui sistem mai vechi
ASP.NET Membership și Simple Membership.
ASP Identity oferă în mod implicit suport pentru rol -urile utilizatorilor, management de
profil, schimbare de parolă, mecanism pentru autentificare prin doi pași, integrare cu servicii
externe de socializare cum ar fii Facebook, Google etc.
Este posibilă extinderea s istemului prin modificarea mecanismului de stocare unde implicit
este folosit EntityFramework Core, prin integrare cu OAuth[24], poate fi extins prin ASP.NET
Core middleware[25].
21
La crearea șablon -ului pentru acest proiect, sa optat pentru mecanismul de autentificare și
înregistrare normal prin ASP Identity, iar conturile utilizatorilor vor fi stocate în aceeași bază de
date folosită de restul aplicației. O alta alternativă la acest sistem este integrarea cu Azure Active
Directory[26], care permite ca dat ele utilizatorilor să nu fie păstrate în același sistem crescând
nivelul de securitate dar în același timp și timpul de dezvoltare și complexitatea proiectului. În
cazul de față a fost aleasă prima variantă deoarece aplicația nu este destul de complexă să necesite
un sistem mai complex și securizat de management al cont -urilor.
Figură 3-1 Diagramă ASP Identity
22
Folosind structura MVC, aplicația creată adaugă două controller -e AccountController și
respectiv ManageController. AccountController este folosit pentru autentificare și înregistra rea
utilizatorilor.
a) Pentru autentificare se apelează Login( LoginViewModel mode, string returnUrl =
null ) în cadrul AccountController din formularul de autentificare. În acest pas se poate
verifica daca utilizatorul a optat pentru autentificare prin doi pași sau dacă cumva contul
a fost blocat din cauza unor autentificări anterioare care au eșuat, însă această opțiune
poate fii dezactivată. În următoarea secvență de cod se apelează serviciul SignInManager
pentru autentificare prin parolă.
var result = a wait _signInManager.PasswordSignInAsync(model.Email,
model.Password, model.RememberMe, lockoutOnFailure: false );
Această metodă nu va arunca nici o excepție, dar o să returneze un obiect care va conține
proprietăți necesare pentru a verifica daca aut entificarea a fost cu succes
if ( result.Succeeded ).
Dacă se necesită autentificare prin doi pași, se poate verifica prin accesarea proprietății
RequiresTwoFactor . În cazul în care sistemul necesită autentificarea prin doi pași,
utilizatorul va fi redire cționat la acțiunea LoginWith2fa( bool rememberMe, string
returnUrl = null ) .
23
b) Înregistrarea utilizatorilor se face apelând Register( RegisterViewModel model, string
returnUrl = null ) din AccountController. În cazul unei înregistrări cu succes,
utilizatoru l poate primii un e -mail prin care să își poată confirma contul. Următoarea
secvență de cod este folosită pentru a crea contul de utilizator
Figură 3-2 Pagina de înregistrare
var result = await _userMan ager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.EmailConfirmati onLink(user.Id, code, Request.Scheme);
await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);
await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation("User created a new account with password.");
return RedirectToLocal(returnUrl);
}
24
c) Management de profil este sec țiunea unde utilizatorii găsesc detaliile despre profilul
contului cum ar fii, schimbarea de parolă, schimbarea de e -mail , numarul de telefon,
verificarea contului pe e -mail etc. accesân d Manage profile de pe bara de meniu.
Schimbarea de parolă se face apelând ChangePassword( ChangePasswordViewModel
model ) din ManageController. În cazul unei schimbări de parolă cu succes , utilizatorul
va primii un mesaj pozitiv informându -l că, parola sa schimbat cu succes.
Pentru trimiterea unui e -mail de verificare a contului se apelează
SendVerificationEmail( IndexViewModel model ) . Utilizatorul va fii informat când
a fost trimit un email pentru verificare. Email -ul la care este trimis, este acela car e sa
setat la crearea contului sau cel care a fost actualizat în cazul în care sa optat pentru
această opțiune.
Asocierea contului din sistem cu un cont existent de la serviciile externe de socializare
precum Facebook, Google, Instagram etc. se va face ape lând LinkLogin( string provide
). Dacă nu se întâ mpină nici o problemă utilizatorul va fii informat de adăugarea acestei
asocieri. Pe server se face verificarea dată iar sistemul permite autentificării cu
Facebook, Google etc, iar în cod se face verificarea pentru a afișa link în meniul de pe
pagina de m anagement.
_ManageNav.cshtml
@if ( hasExternalLogins ) {
<li class=”@ManageNavPages.ExternalLoginsNavClass(ViewContext)”>
<a asp-action=”ExternalLogins”>External logins</a></li>
}
25
3.3 Adăugarea de manager de cont
În sistem există două tipuri de utilizator: utilizator normal ș i un manager de cont.
Aceste tipuri pot fi interpret ate ca ș i un ro l separat, dar exista o diferență între un utilizator adăugat
sau înregistrat ș i un manager de cont. Un utilizator are asociată o companie când este adă ugat în
sistem și alte informații care definesc o companie î n sistem.
Un manager de cont poate fi considerat un administrator în sistem pentru companiile
existente. Managerul este respo nsabil de una sau mai multe companii , el are dreptul de a adăuga
compani i noi în sistem, să aprobe companiile înregistrate sau să le ș tearg ă.
Managerii la ra ndul lor sunt adăugați de un admin principal creat în sistem când sistemul
este iniț ializat pentru prim a oara. Codul folosit pentru adăugarea unui manager folosește libr ăria
pusă la dispoziț ie de ASP Identity pentru a crea ș i a seta rol -urile necesare, ace astă secvență de
cod este folosită pentru a creea și cont -ul de utilizator și compania în sistem, pentru că aceasta
parte este folosită pentru management -ul contului de fiecare utilizator în parte: schimbare parolă,
schimbare nume etc. Se foloseș te clasa Use rManager din ASP Identity și implementarea interfeț ei
IEmailSender pentru a trimite un e -mail d e notifcare a utilizator -ului că a fost creat cont -ul. Pentru
secur itate parolele nu sunt salvate în forma transmisă, ele sunt serializate de că tre clasa
Passwor dHasher pusă la dispoziț ie implicit de ASP Identity, dar implementarea acesteia poate fi
modifica tă prin implementarea interfeț ei IPasswordHasher.
{insert code snipep t for user creation here}
În mod normal administrator -ul principal are access la toate resu rsele aplicației, dar ceilalț i
manager i sunt asociaț i unui sub rol, care le da acces doar la anumite resurse ale sistemu -lui. Spre
exempl u, avem un manager care se ocupă doar de companii care oferă servicii de transport acest
manager nu va avea access î n zon e ale aplicației care se ocupă de finanț e, nu po ate aproba
contracte, nu pot adă uga contracte. Ac est manager are acces doar la părți ce ț in de transport, cum
nu toate contractele au n evoie de o companie intermediară de transport, într -o pagină separată ,
acești manageri pot să vizualizeze o listă de contrac te care au nevoie de transport ș i au contracte
cu fur nizori pe care ei ii gestionează .
26
3.4 Înregistrarea unei compa nii noi î n sistem
În sistem înregistrarea unei companii prin două metode. Utilizatorii pot să iși creeze propria
companie în sistem sau prin adăugarea lor de că tre un manager de cont.
Înregistrarea unei companii de că tre utili zatori permite utilizatorulu i să iși seteze informaț iile
despre compania lui, singurul lu cru care nu poate fi setat de că tre utilizator este manager -ul care
se va ocupa de contul lui. După î nregistrare, contul nu este activat pentru a putea fi folosit, este
nevoie de aprobare de la un manager cu drepturi de aprobare a utilizatorilor.
Managerii de cont se ocupă de modificarea datelor asociate, un utilizator normal nu are voie
să modif ice aceste date direct pentru că pot influența informațiile din sistem dacă managerii nu
știu de acest e modificări, o soluție pentru acest lucru ar fi să se ceară o aprobare de editare a datelor,
dar pentru prima versiune a aplicației și pentru siguranță, utilizatorii trebuie să ceară explicit
manageri -lor să modifice anumite date.
Companiile sunt folosite în crearea contract elor. La crearea unei companii î n sistem, se alege
ce fel de rol are compa nia: Distribuitor, Cumpărător sau Transport. Totodată se setează ș i
câmpurile cu valori cum ar fi:
„VAT”(T.V.A – taxa pe valoare adăugată) – este un număr de î nregistrare pentru or ice
companie care face afaceri în Uniunea Europeana și foloseș te sistem cu T.V.A[ 27]
Număr de î nregistrare a companiei: este un in dentificator unic eliberat de că tre „Companies
House” [ 28] companiilor de tip LLP (Limited Liability Partne rship), indentificator este format
din 8 cifre sau 2 litere urmate de 6 cifre, el mai este cunoscut ș i ca CRN;
◦ Companiile for mate în Anglia sau Țara Galilor au CRN -ul încep ând cu 0(zero)
◦ Companiile scotiene au asociat un CRN prefixat cu „SC”
◦ LLP primesc u n CRN prefixat cu „OC”
◦ Parteneriatele LLP scoțiene au un CRN începâ nd cu „SO”
27
Condiție de plată (Payment term) [29]: condi ția de plată define ște o perioadă în care
cumpărător -ul este obligat să facă plata restantă asociată contractului sau metoda accepta tă
de retur. În sistem sunt definite urmă toarele condiții de plată :
public enum PaymentTerms
{
[Display(Name = "Payment in advance" )]
PIA = 0,
[Display(Name = "Payment seven days after invoice date" )]
Net7 = 1,
[Display(Name = "Payment ten days after invoice date" )]
Net10 = 2,
[Display(Name = "Payment 30 days after invoice date" )]
Net30 = 3,
[Display(Name = "Payment 60 days after invoice date60" )]
Net60 = 4,
[Display(Name = "Payment 90 days after invoice date" )]
Net90 = 5,
[Display(Name = "End of month" )]
EOM = 6,
[Display(Name = "Cash on delivery" )]
COD = 7,
[Display(Name = "Cash next delivery" )]
CND = 8
}
◦ Plata î n avans
◦ Plata la 7/10/30/6 0 sau 90 zile de la data factură rii
◦ Plata la sfârș itul lunii
◦ Plata la livrare
◦ Plata la urmatoarea livrare
28
Termeni de livrare (Incoterms)[ 30]: sunt folosite î n pr ocesele internaționale ș i sunt
indentificate prin 3 liter e în relație cu practicile de bază ale contractelor, rolul principal este
pentru a comunica clar sarcinile, costurile ș i riscurile asociate la transportare și livrare.
Aceș ti term eni sunt recunoscuți de către guverne, autorităț i legale pentru interpretare a celor
mai folosite. În sistem sunt folosiț i urm ătorii termeni de livrare:
public enum ShippingTerms
{
[Display(Name = "Ex Works" )]
EXW = 0,
[Display(Name = "Free Carrier" )]
FCA,
[Display(Name = "Free On Bo ard")]
FAS,
[Display(Name = "Cost And Freight" )]
CFR,
[Display(Name = "Cost, Insurence and Freight" )]
CIF
}
◦ EXW (Ex Works) – vânzătorul pune la dispoziție bunurile la sediu sau în altă locaț ie, acest
termen pun e obligaț ii mai multe pe cumpărător și obligații minime pe vânză tor.
◦ FCA (Free Carrier) – vânzătorul livrează bunurile, ap robate pentru export, la o locație
specificată de cumpără tor sau la un intermediar nominat de că tre cump ărător.
◦ FAS (Free on Board) – vânză torul su portă cheltuielile și riscurile până în punctul î n care
bunurile au fost livrate pe vas .
◦ CFR (Cost and Freight) – compania de transport se ocupă de costurile de origine, incluzând
și aprobarea de export ș i costurile navale de transport până la port dar nu e ste responsabil
de livrarea până la destinația finală.
◦ CIF (Cost, Insurence and Freight) – este la fel ca și CFR doar că necesită ca vânzătorul să
obțină asigurare pentru bunuri p e tot parcursul transportului până la portul. Vânzătorul este
obligat să facă asigurarea să acopere 110% din valoare .
29
Companiei îi este asociată o adresă folosită pentru sediul com paniei, pentru adresa se
foloseș te Googl e Maps Geocoding API pentru a căuta o adresă și returna informațiile necesare.
API-ul returnează cod-ul tarii, longitu dine, latitudine, număr de stradă, numele stră zii, oraș , județ,
aceste informații sunt foarte untile și pot fi folosite pentru a afiș a pe un widget de la Google unde
se afla sediul.
În sistem, compania ș i utilizator -ul nu poate fi co mplet ș terse, ele sunt marcate ca și șterse
prin coloana „IsDeleted” î n baza de date. Motivul pentru care companiile nu sunt șterse din sistem
este pentru că ele sunt normal într -o relaț ie directă cu contractele generate și alte entități din sistem.
Șterge a lor pune sistemul î ntr-o stare inconsistentă și dacă la un moment î n timp este necesara
recrearea datelor si cu utilizatorii asociati v -a fi imposibil ă, din acest motiv este indicat să marcheze
datele șterse. ORM -ul folosit î n aplicaț ie este EF Core, ce pune la dispoziț ie filtre globale[ 31] pe
entități să excludă automat entități marcate ca ș terse pentru a simplifica tim pul de dezvoltare prin
faptul că elimină necesitatea de a adăuga o verificare de fiecare dată câ nd este necesară interogarea
entităț ilor din baza de date, din moment ce entitatea a fost ștearsă nu este necesar să o returnam,
dar este posibil să existe cazuri cand nu este necesară condiția globală iar EF Core API pune la
dispoziție o metodă IgnoreQueryFilters .
Pe lângă adăugarea unei com panii și utilizator, se poate face și editare de informaț ii
asociate la crearea compan iei. Editarea se face doar de că tre mangerii de cont .
30
3.4.1 Contracte
Scopul principal al aplicației î i managementul de contracte dintre firmele care vând produse
și compa niile care cumpără produsele. Unele contracte în funcție de termenii ș i conditile de livrare
au nevoie de o companie de transport care să se ocupe de livrarea produselor. În cazurile în care
contractele au asociată o companie de transport, se crează un co ntract adițional care conține
informaț iile necesare pentru livrarea produselor.
Ciclul de viață a unui contract î n sistem este format din: crear e, editare, ș tergere, aprobare ș i
anulare. Orice manager poate să creeze un contract și să îl editeze. Aprobare a și anularea unui
contract se face doar de că tre managerii principal i. Un contract poate fi și șters din sistem, dar ca
și o co mpanie, el este doar marcat ca și șters, ștergerea îi diferită de anulare prin faptul ca se face
doar atunci când s -a facut o gr eșeala utilizatorul î nainte de aprobare. Anularea se întampla câ nd
client -ul sau distribuitorul doresc să anuleze contractul.
Există o pagină de listare a contra ctelor, de unde managerii pot să vizualizeze contractele,
stadiul în care se află ș i să aibe ac cess la anumite operații: editare, ș tergere, anulare, aprobare,
vizualizare documente asociate.
31
3.4.2 Adăugare
Adăugarea unui contract constă din selec tarea companiilor care participă: vânzător,
cumpărător și î n unele cazuri o companie de transport. Se pot s electa produse din lista disponibilă
în aplicație, setarea de preț cumpărare și vânzare, unitate de măsură, data colectării produselor de
la vânzător ș i data de livrare a produselor la cumpărător. Pe lângă informaț iile astea se mai pot
salva informații adi ționale dacă este nevoie ca ele sa apară pe documentele generate .
3.4.3 Editare
La editarea contractelor, aceleași câ mpuri care au fost setate în pasul de adă ugare pot fi
modificate, se pot șterge sau adă uga mai multe produs e. Contractele pot fi editate până în pun ctul
care au fost aprobate, după aprobare aces tea pot fi modificate doar de către managerii principali.
În mod normal document -ul generat pentru contract este trimis la client, editarea contractului ar
necesita o recreare a documentului ș i retrimite rea lui. Codul ce urmează este folosit pentru
returnarea din baza de date a detaliilor unui contract bazat pe identificatorul de contract , aceste
detalii sunt folosite pentru afișarea detaliilor ș i editarea lui.
var contract = await _context.Contracts
.Include(c => c.CustomerUser)
.Include(c => c.ShippingUser)
.Include(c => c.SupplierUser)
.SingleOrDefaultAsync(m => m.ContractId == id);
32
3.4.4 Aprobare
După ce un contract a ajuns în forma finală și nu mai sunt necesare m odifică ri la el, atunci
manager -ul principal poate aproba contractele. În momentul aprobării, folosind informaț iile
salvate, se generează un document de tip PDF ș i acesta este asociat cu contract -ul. Acest document
poate fi transmis la client prin email. D ocumentul va fi salvat în Azure Storage pentru că salvarea
lui local, nu Înseamnă că dacă proiectul este migrat Î ntr-un alt sistem de hosting, documentele nu
vor dis parea, acest lucru nu trebuie să se întample. Salvarea î n Azure Storage sau alt sistem exte rn
de stocare , scade riscul ca documentele să se piardă pentru că majoritatea serviciilor au planuri de
recuperare a datelor în cazul î n care se pierd.
33
Capitolul 4 Concluzii
Implementarea acestei aplicații a avut ca scop dezvoltarea unei platforme de comerț care
să ușureze distribuirea de produse între companiile interesate. Platforma simplifică managementul
și indexarea contractelor iar îmbunătățiri viitoare ale aplicației poate ajuta la automatizarea
procesului, permițând utilizatorii să plaseze comanda pentru p roduse sau plasare de oferte. Un
scop adițional a fost folosirea tehnologiilor cele mai recente pentru a studia și simplifica procesul
de dezvoltare.
În această lucrare aplicația a fost implementată cu funcționalitățiile de bază necesare pentru
o aplicație web folosită pentru gestionarea de contracte și plăți între două sau mai multe companii
implicate în vânzarea și cumpărarea de produse. Aplicația poate fi extinsă în funcț ie de clienti
pentru a include funcționalități adiț ionale cum ar fi : înregistrare de plăți, implementarea unui
sistem de reduceri sau d iferite discounturi, un sistem îmbună tățit pentru clienții fideli, un sistem
de garanții, o interfață web și aplicație mobilă pentru cumpararea sau î nregistrarea de oferte de
produs direct de către clienți (distribuitori și cumpără tori), un posibil sistem de licitaț ii.
Folosirea tehnologiilor e numerate în această lucra re permit dezvoltarea mai rapidă a
aplicațiilor web și asigură o securitate implicit mai ridicată pentru că framework -urile s unt
implementate cu securitate ș i scalabilitate. Pe lângă aceste funcționalități implicite, aplicaț ia poat e
fi îmbunătățită prin separarea parții de autentificare și autorizare î ntr-un proiect indepenent de
aplicaț ie și implementarea protocolului OpenId Connect [ 32] sau in tegrarea cu platformele de
socializare( Facebook, Google etc. ).
34
Bibliografie
[1] https://teamtreehouse.com/library/what -is-html
[2] https://www.w3schools.com/html/html_intro.asp
[3] https://www.w3schools.com/css/css_intro.asp
[4] https://en.wikiped ia.org/wiki/Cascading_Style_Sheets
[5] https://developer.mozilla.org/en –
US/docs/Learn/CSS/Introduction_to_CSS/How_CSS_works
[6] https://developer.mozilla.org/en -US/docs/Web/JavaScript/About_JavaScript
[7] https://www.w3schools.com/js/js_intro.asp
[8] https://www.tutorialspoint.com/javascript/javascript_overview.htm
[9] https://jquery.com/
[10] http://api.jquery.com/
[11] https://stackoverflow.com/questions/14546709/what -is-bootstrap
[12] http://www.sqlcourse.com/intro.h tml
[13] https://www.w3schools.com/sql/sql_intro.asp
[14] Glenn Block, Pablo Cibraro, Pedro Felix, Howard Dierking, Darrel Miller. 2014.
„Designing Evolvable Web APIs with ASP.NET”
[15] https://docs.microsoft.com/en -us/aspnet/overview
[16] https://docs.microsoft.com/en -us/aspnet/core/
[17] https://docs.microsoft.com/en -us/aspnet/core/tutorials/index
[18] https://github.com/aspnet/Home
[19] https://docs.microsoft.com/en -us/aspnet/core/mvc/overview
[20] https://en.wikipedia.org/wiki/ASP.NET_MVC
[21] Julia, Lerman. 2010. „Programming EntityFramework, 2nd Edition ”
35
[22] https://app.pluralsight.com/library/courses/entity -framework -core-getting –
started/table -of-contents
[23] https://www.asp.net/identity
[24] https://docs.microsoft.com/en -us/aspnet/a spnet/overview/owin -and-katana/owin –
oauth -20-authorization -server
[25] https://docs.microsoft.com/en –
us/aspnet/core/fundamentals/middlew are?tabs=aspnetcore2x
[26] https://docs.microsoft.com/en -us/aspnet/identity/ove rview/getting –
started/developing -aspnet -apps-with-windows -azure -active -directory – Consultat la
09.01.2018
[27] http://traveltips.usatoday.com/vat -number -61927.html
[28] https://en.wikipedia.org/wiki/Companies_House
[29] https://quickbooks.intuit.com/r/bookkeeping/ch oosing -and-defining -invoice –
payment -terms/
[30] https://en.wikipedia.org/wiki/Incoterms
[31] https://docs.microsoft.com/en -us/ef/core/querying/filters
[32] http://openid.net/connect/
[33] https://msdn.microsoft.com/en -us/library/ee658105.aspx
36
Anexe
Anexa nr.1. Adaugare companie
[HttpPost]
public async Task<IActionRes ult> AddContact(CompanyUserCreateViewModel formData)
{
[…]
var user = new ApplicationUser { UserName = formData.Email, Email =
formData.Email };
var password = "123!@#qweQWE" ;
var result = await _userManager.CreateAsync(user, password);
if (result.Succeeded)
{
await _emailSender.SendEmailAsync(formData.Email, "Your account has been
created" ,
$"Your account has been created for {formDat a.Email} , with password
{password} . Please Change password after login" );
var address = new Address()
{
City = formData.Address.City,
Country = formData.Address.Country,
County = formData.Address.County,
FormattedName = formData.Address.FormattedName,
Street = formData.Address.Street,
StreetNumber = formData.Address.StreetNumber,
Longitude = formData.Address.Longitude,
Latitude = formData.Address.Latitude,
};
var contract = new CompanyUser()
{
AccountManagerId = formData.AccountManagerId,
Email = formData.Email,
FirstName = formData.FirstName,
ShippingTerms = formData.ShippingTerms,
PaymentTerms = formData.PaymentTerms,
PhoneNumber = formData.PhoneNumber ,
UserType = formData.UserType,
Surname = formData.Surname,
UserId = user.Id,
Address = address,
CommercialContact = formData.CommercialContact,
CompanyName = formData.CompanyName,
Vat = formData.Vat,
HasHalal = formData.HasHalal,
HasBrc = formData.HasBrc,
HasOrganic = formData.HasOrganic,
HasRedTractor = formData.HasRedTractor
37
};
_context.CompanyUsers.Add(contract);
await _context.SaveChangesAsync();
}
return RedirectToAction(nameof(Index));
}
38
Anexa nr.2. Editare companie
[HttpPost]
public async Task<IActionResult> EditContact(CompanyUserEditViewModel formData)
{
[…]
var companyUser = _context.CompanyUsers
.Include(x => x.Address)
.FirstOrDefa ult(x => x.CompanyUserId == formData.CompanyUserId);
var address = _context.Addresses.FirstOrDefault(x => x.Id ==
formData.Address.Id.Value);
address.City = formData.Address.City ?? companyUser.Address.City;
address.Country = formData.Address.Country ?? companyUser.Address.Country;
address.County = formData.Address.County ?? companyUser.Address.County;
address.FormattedName = formData.Address.FormattedName ??
companyUser.Address.Forma ttedName;
address.Street = formData.Address.Street ?? companyUser.Address.Street;
address.StreetNumber = formData.Address.StreetNumber ??
companyUser.Address.StreetNumber;
address.Longitude = formData.Address.Longitude ? ?
companyUser.Address.Longitude;
address.Latitude = formData.Address.Latitude ?? companyUser.Address.Latitude;
[…]
this._context.CompanyUsers.Update(companyUser);
await _context.SaveChangesA sync();
return RedirectToAction(nameof(Index));
}
39
Anexa nr.3. Listare companii
var users = _context.CompanyUsers
.Include(x => x.AccountManager)
.Include(x => x.Address)
.Select( x => new CompanyUserListViewModel()
{
CompanyUserId = x.CompanyUserId,
AccountManager = x.AccountManager.FirstName + " " +
x.AccountManager.SurName,
CompanyName = x.CompanyName,
FirstName = x.FirstName,
Surname = x.Surname,
ActiveContracts = "3",
Status = CompanyUserStatus.Active,
AddressFormattedName = x.Address.FormattedName
})
.ToList();
40
Anexa nr.4. Diagrama bazei de date
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: SPECIALIZAREA REȚELE ȘI SOFTWARE DE TELECOMUNICAȚII Aplicație de management de contracte pentru comerț de produse COORDONATOR ȘTIINȚIFIC PROF. UNIV…. [618840] (ID: 618840)
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.
