SPECIALIZAREA REȚELE ȘI SOFTWARE DE TELECOMUNICAȚII Aplicație de management de contracte pentru comerț de produse COORDONATOR ȘTIINȚIFIC PROF. UNIV…. [618841]
ORADEA
2017 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
jQuery ………………………….. ………………………….. ………………………….. ………………………….. ….. 9
2.4 Bootstrap ………………………….. ………………………….. ………………………….. …………………… 10
2.5 SQL ………………………….. ………………………….. ………………………….. ………………………….. 10
2.6 ASP.NET ………………………….. ………………………….. ………………………….. …………………… 12
2.6.1 ASP.NET WebForms ………………………….. ………………………….. ………………………. 12
ASP.NET Component Model ………………………….. ………………………….. …………………………. 13
2.7 ASP.NET Core ………………………….. ………………………….. ………………………….. …………… 14
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 management 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 pot 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 datelor, 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 tehnol ogii 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 „Crosscut ting
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 contracte lor 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 resp ective. Prima versiune a aplicației este destinată pe post de aplicaț ie pilot cu
cerințele de bază implem entate 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 pentr u 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.
Construcț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 pri n
desemnarea structurata a semanticii pentru text, titluri, paragrafe, liste, imagini, 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 utilizator iilor 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ținutului,
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 uti lizează un număr de cuvinte cheie în limba engleză pentru a
specifica numele diferitelor 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 decla rații.
<div style=”color: red;”> Chapter One </div>
<div class=”color -class”> Chapter 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 paginile 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 paginii 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
JavaScript 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 serve rul: 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 : Putet i utiliza JavaScript pentru a include elemente precum
tragere și plasare (drag -and-drop) și sliders pentru a oferii o interfață bogată vizitatorilor
site-ului.
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țiilor, 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 îm pachetează în metode pe care le puteți apela cu o singură linie de cod.
10
2.4 Bootstrap
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 asemenea, 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 navigație, butoane, formulare,
alerte, simboluri, etichete, tipografie și alte componente de interfață, precum și extensii
JavaScript opționale.
Unele motive pentru care progra matorii aleg Bootstrap :
1. Este ușor de utilizat
2. Un sistem de sită împărțit pe doisprezece 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 analiș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 înr egistră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 se 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 Vis ual Basic și C#.
Aceste limbaje de programare vă permit să dezvoltați aplicații ASP.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ă c omenzile ș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 bl ocurile de text, butoanele și etichetele
pentru asamblarea, configurarea și manipularea 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 pagină 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țiu nilor clientului și produce reacțiile.
13
ASP.NET Component Model
Modelul de componentă 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 le gate 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 pentru 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ă so luț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
15
ASP.NET Core MVC
MVC[19][20] ( Model -View -Controller ) este un model arhitectural care separă o aplicație
în trei grupe principale 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 m odelul pentru a efectua acțiuni de utilizator și a prelua rezultatele 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 repr ezintă 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 utilizatorul ui cu ajutorul
interfeței. Pentru a incopora codul .NET în limbajul 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 simt e nevoia de a executa o mare parte din
logică în fișierul View 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ă inter acț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 utili zatorilor. În modelul MVC controller -ul este responsabil pentru
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.
Entit y Framework se încadrează într -o cateogrie de tehnologie de acces 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ă defin iț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 dat e au o structură
similară, Entity Framework are un strat de legă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 d e 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 elemente 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 abstrac tă a conceptului de View engine în MVC.
Razor View Engine este View engine 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 fost 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 posibil a si a oferi
utilizatorilor o pagina responsive pentru aplicatiile mobile.
3.2 Înregistrare ș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 înl ocuirea 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 sistemului 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 datele 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 înregistrarea
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 = await _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 autentificarea a fost cu succes
if ( result.Succeeded ).
Dacă se necesită autentificare prin doi pași, se poate verifica prin accesarea proprietății
RequiresTwoFactor . În cazu l în care sistemul necesită autentificarea prin doi pași,
utilizatorul va fi redirecționat la acțiunea LoginWith2fa( bool rememberMe, string
returnUrl = null ) .
23
b) Înregistrarea utilizatorilor se face apelând Register( RegisterViewModel model,
string returnUr l = null ) din AccountController. În cazul unei înregistrări cu succes,
utilizatorul 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 _userManager.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.EmailConfirmationLink(user.Id, code, Request.Scheme);
await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);
await _signInManager.SignInAsync(user, isPersistent: f alse);
_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ând Manage profile de pe bara de meniu.
Schimbarea de parolă se face ap elâ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 co ntului 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 care sa
setat la crearea contului sau cel care a fost actualizat în cazu l î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 apelâ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 management.
_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: utili zator 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
companii 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 sa lvate î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 snipept for user creation h ere}
Î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 compani i care oferă servicii de
transport acest manager nu va avea access î n zon e ale aplicației care se ocupă de finanț e, nu
poate 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 companii 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 utilizatorului să iși seteze
infor maț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 dreptur i 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 aceste 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 Partnership), indentificato r 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 un 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 litere în relație cu pract icile 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 interpretarea 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 Board" )]
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 pune 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ă ch eltuielile ș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 complet ș terse, ele sun t 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. Ștergea 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 companii ș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 companiile care cumpără pr odusele. 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 contract 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. Aprobarea ș 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 greș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 acces s 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 selecta produse din l ista
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 ne voie 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 retrimiterea 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 modifică ri la el,
atunci manager -ul principal poate aproba contractele. În momentul aprobării, folosind
informaț iile sa lvate, se generează un document de tip PDF ș i acesta este asociat cu contract -ul.
Acest document poate fi transmis la client prin email. Documentul 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 extern 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 produ se 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(dis tribuitori ș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 s ecuritate ș i scalabilitate. Pe lângă aceste funcționalități implicite, aplicaț ia
poate 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 integr area 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.wikipedia.o rg/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://ap i.jquery.com/
[11] https://stackoverflow.com/questions/14546709/what -is-bootstrap
[12] http://www.sqlcourse.com/intro.htm l
[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 Editio n”
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/aspnet/ overview/owin -and-katana/owin –
oauth -20-authorization -server
[25] https://docs.microsoft.com/en –
us/aspnet/core/fundamentals/middleware?ta bs=aspnetcore2x
[26] https://docs.microsoft.com/en -us/aspnet/identity/overview/ 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/choosing -and-defining -invoice –
payment -terms/
[30] https://en.wikipedia.org/wiki/Incoterms
[31] https://docs.microsoft.com/en -us/ef/c ore/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<IActionResult> A ddContact(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 {formData.Emai l}, 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 = f ormData.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 co mpanie
[HttpPost]
public async Task<IActionResult> EditContact(CompanyUserEditViewModel formData)
{
[…]
var companyUser = _context.CompanyUsers
.Include(x => x.Address)
.FirstOrDefault(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.FormattedNa me;
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.SaveChangesAsync() ;
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…. [618841] (ID: 618841)
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.
