Gestionarea Angajatilor In Cadrul Firmei

Cuprins

Introducere

Această lucrare reprezintă o aplicație web de gestionare a angajaților și inventarului unei firme. Ce o face să fie mai mult decât un simplu site este portabilitatea pe desktop, tabletă sau telefon, având design responsive.

Am realizat această aplicație din mai multe motive. Primul motiv este fiindcă am considerat inutilă existența mai multor aplicații separate pentru intranet și management-ul inventarului, așadar, ea le reunește pe cele două.

În acest fel, monitorizarea inventarului și asignările acestuia la angajați se face mai ușor împreună cu păstrarea evidenței angajaților și inserarea lor în structura organizațională pe departamente. Așadar, scopul acestei aplicații este de a putea fi folosită de mai multe departamente, în cazul acesta de Administrativ și Relații Umane.

Al doilea motiv este deoarece am avut ocazia să mă familiarizez cu majoritatea tehnologiilor folosite pentru această aplicație în perioada de internship la locul de muncă și am dorit să le aprofundez.

Tehnologiile folosite pentru aplicație au fost alese pentru a fi în ton cu evoluția domeniului și fiindcă sunt open-source, însemnând reducerea costurilor în dezvoltarea acesteia.

Modul în care ea a fost gândită și construită facilitează mentenanța și posibilitatea de extindere ulterioară a funcționalităților acesteia.

Limbaje de programare utilizate

C#

Acesta este limbajul principal utilizat în aplicație. C# este un limbaj de programare de nivel înalt care combină facilități testate de-a lungul timpului cu inovații de ultim moment. Este dezvoltat de Microsoft ca și concurent împotriva limbajului Java, ambele derivate din C++. Faptul că este creat de Microsoft nu înseamnă că este limitat a fi folosit doar pe platformele lor. Compilatoare C# există și pentru alte sisteme precum Linux sau Macintosh. [1]

C# este înzestrat cu mai multe calități care explică succesul acestuia din prezent:

Este un limbaj de programare de utilitate generală, cu productivitate mare.

Este un limbaj orientat pe obiecte.

Permite dezvoltarea de aplicații industriale robuste și durabile.

Oferă suport complet pentru dezvoltarea de componente software

Este și orientat spre componente.

La aceste caracteristici generale se adaugă și altele, cum este de pildă suportul pentru internaționalizare, adică posibilitatea de a scrie aplicații care pot fi adaptate cu ușurință pentru a fi utilizate în diferite regiuni ale lumii unde se vorbesc limbi diferite, fără să fie necesare pentru aceasta schimbări în arhitectura software.

C# gestionează în mod automat memoria utilizată. Eliberarea memoriei ocupate (garbage collection) de către obiectele care nu mai sunt necesare aplicației, este o facilitate importantă a limbajului.

În C# se scriu de asemenea aplicații și pentru sisteme dedicate (embeded systems). Acestea se întind pe o arie largă, de la dispozitive portabile cum ar fi ceasuri digitale, telefoane mobile, MP3 playere, până la dispozitive staționare ca semafoare de trafic, sau controlere pentru automatizarea producției.[2]

C# are mai multe versiuni, iar cea folosită de mine este versiunea 5. Motivul pentru care am ales acest limbaj este faptul că îl consider curat, logic și orientat pe obiecte. Este și foarte ușor de organizat pe clase, fișiere, proiecte și soluții.

Tehnologii utilizate

ASP.NET MVC

ASP.NET MVC este un framework pentru dezvoltare web creat de  Microsoft care combină arhitectura model-view-controller cu cele mai bune componente ale platformei ASP.NET. [4]

Model-View-Controller (MVC) este un model arhitectural care separă funcționalitățile de interfața grafică a aplicației, permițând dezvoltarea, întreținerea și testarea separată a celor două părți. În Fig. 2.1 este descris grafic modelul arhitectural MVC. Acest model împarte un sistem software în trei piese, și anume: controller, view și model. [5]

Fig. 2.1 Model-View-Controller [5]

Modelul gestionează datele sistemului software, răspunde la interogări referitoare la stare (de obicei solicitate de View) și realizează operații de modificare a datelor (de obicei invocate de controller).

View-ul redă modelul într-o formă care permite interacțiunea cu utilizatorul, de obicei prin intermediul elementelor de interfață cu utilizatorul. Pentru un singur model pot exista mai multe view-uri pentru a deservi diferite scopuri.

Controller-ul recepționează acțiunile utilizatorului și răspunde interogând modelul.

În cazul ASP.NET MVC modelul poate fi implementat prin clase .NET care modelează structurile de date, controller-ul trebuie derivat dintr-o clasă specială (Controller), iar viewurile sunt implementate sub forma unor fișiere care conțin un amestec de cod C# și HTML (Razor view engine). [5]

Razor este o sintaxă template markup bazată pe C#. Razor începe zone de cod cu @ și nu necesită închidere explicită a zonelor.

Ideea din spatele sintaxei Razor este de a oferi sintaxă optimizată pentru generarea HTML folosing o abordare de template-uri concentrate pe cod, cu tranziție minimală între HTML și cod. [6]

ASP.NET MVC are mai multe versiuni, la fel ca și C#, fiecare aducând elemente noi și interesante. Am folosit versiunea 5 și am ales acest framework deoarece modelul MVC oferă o implementare mai organizată, fiind mai rapid și în a depista unde apar erori, dacă e cazul, și să facă debugging.

ASP.NET Identity

ASP.NET Identity este un sistem de membership folosit la crearea aplicațiilor web ASP.NET. Identity oferă posibilitatea de a adăuga funcționalități de login și ușurează personalizarea datelor despre un utilizator logat.

Acestea sunt câteva din caracteristicile pe care le are ASP.NET Identity:

Un singur sistem care poate fi folosit cu toate framework-urile ASP.NET, de exemplu ASP.NET MVC, Web Forms, Web Pages, Web API și SignalR

Folosește Entity Framework Code First pentru a stoca datele utilizatorilor într-o bază de date și este posibilă extinderea claselor POCO

Posibilitate de a face unit tests

Furnizează roluri astfel încât se poate restricționa accesul în anumite părți ale aplicației

Logare externă cu conturi Microsoft, Facebook, Twitter, Google, dar și Windows Azure Active Directory și stocarea datelor în aplicație cu acest sistem

Integrarea autentificării OWIN pentru generarea de cookies folosite la login-ul și logout-ul utilizatorului [6]

Am ales să folosesc ASP.NET Identity 2.0 pentru că oferă mai multă siguranță conturilor. Asta se întâmplă cu ajutorul generării unui GUID (Globally Unique Identifier) și folosirea unei funcții Key Derivation cu ′salt′ aleator ca să se creeze un hash pentru parolă.

Entity Framework

Entity Framework este un set de tehnologii în ADO.NET ce suportă dezvoltarea de aplicații software cu baze de date și aplicații orientate pe obiecte. ADO.NET este un set de clase care oferă servicii de access al datelor pentru programatorii care folosesc framework-ul .NET.

Comenzile din ADO.NET lucrează cu scalări (date la nivel de coloană dintr-o tabelă) în timp ce Entity Framework lucrează cu obiecte (din baza de date se returnează obiecte).

În Fig. 2.2 este redată arhitectura ADO.NET Entity Framework.

Fig. 2.2 Arhitectura ADO.NET Entity Framework [7]

Cu ajutorul Entity Framework, aplicația poate fi centrată pe o bază de date sau pe un model.

Aplicația centrată pe o bază de date presupune că baza de date este creată și apoi se generează modelul logic ce conține tipurile folosite în logica aplicației. Se generează clasele POCO (plain-old CLR object) și fișierele necesare pentru nivelul conceptual, nivelul de mapare și nivelul de memorare.

Aplicația centrată pe un model poate fi dezvoltată alegând una din variantele :

Code first.

Model design first.

În cazul Code First, dezvoltatorul scrie toate clasele modelului (clase POCO – plain old CLR object) și clasa derivată din DbContext cu toate entitățile necesare și apoi cu ajutorul mediului de dezvoltare se crează și generează baza de date, tabelele și informațiile adiționale necesare pentru EF.

În cazul Model Design First, mediul de dezvoltare permite crearea unei diagrame a modelului aplicației și pe baza acesteia se va crea și genera baza de date, tabelele din baza de date și informațiile adiționale necesare pentru EF. [8]

Pentru aplicație am ales să folosesc abordarea Code First cu Entify Framework versiunea 6 deoarece consider că mai bine se poate crea un model pornind de la o clasă și apoi Entity Framework îl transformă într-o tabelă decât invers. Aplicațiile cu MVC se folosesc de obiecte, nu de tabele, de aceea trebuie să existe certitudinea că obiectele au fost create bine de la început. Baza de date folosită este LocalDB.

Bootstrap

Bootstrap este un framework web open-source pentru aplicații web. Bootstrap este compatibil cu cele mai recente versiuni ale Google Chrome, Firefox, Internet Explorer, Opera, și Safari, deși unele dintre acestea nu sunt acceptate pe toate platformele.

Bootstrap oferă din punct de vedere CSS și Javascript:

web design responsive ( PC, tabletă, telefon )

sistem grid

meniuri ( orizontale, verticale )

formulare

butoane

meniuri dropdown în JavaScript

Se află în topul celor mai folosite framework-uri CSS deoarece aspectul paginilor web se ajustează în mod dinamic, ținând cont de caracteristicile dispozitivului utilizat (desktop, tabletă, telefon mobil). [9]

Din cauza acestei calități esențiale și a faptului că toate componentele acestuia pot fi refolosite, am ales să folosesc acest framework.

Workflow Foundation

Windows Workflow Foundation (WF) este o componentă .NET Framework. Unul dintre cele mai interesante aspecte ale WF este separarea dintre codul de procesului de business și implementarea efectivă, de multe ori fiind o cerință în arhitectura orientată spre servicii. Înainte de Windows Workflow Foundation, scenariul tipic a fost să se scrie atât logica de business și cât și implementarea efectivă. Rezultatul a fost nicio separare clară între logica de business și implementarea acesteia. Odată cu lansarea WF, logica de business poate fi definită într-un workflow în timp ce implementarea efectivă se face în C#, Visual Basic .NET sau un alt limbaj .NET.

Cel mai bun mod de a privi un workflow este o descriere schematică a unei probleme din lumea reală. [10] WF este utilizat pentru a crea aplicații care execută un proces de business ordonat, cum ar fi pașii necesari pentru a aproba un document, angaja un candidat pentru o poziție, sau a face o achiziție. [11] Aceste activități sunt modelate într-un mod grafic care face workflow-ul mult mai ușor de înțeles. Activitățile în sine, cum ar fi trimiterea unui e-mail, sunt făcute în cod tradițional C# sau Visual Basic .NET în așa fel încât acestea nu sunt conștiente de contextul lor, tot ce știu este că ele trebuie să trimită un e-mail după cum a dispus workflow-ul. [10]

Aceste procese se pot executa într-un interval scurt de timp, dar sunt, de obicei de lungă durată, în care aplicația va trebui să se închidă pentru a conserva memoria între stadii. De obicei, procesele de business care se modeleză ca workflow au următoarele caracteristici:

Au logică de business specifice, care ar putea fi necesar să se schimbe periodic, cum ar fi calcularea fiscală sau seria de pași necesari pentru a aproba o achiziție, închiriere sau proces.

Au mai multe intrări în fluxul de lucru care ar putea veni la distanță de ore sau zile unele de altele

Au logică avansată de business care ar putea cere workflow-ului să se deplaseze în jos pe diferite ramuri, în funcție de circumstanțe diferite.

Necesitatea de a interacționa cu alte sisteme, cum ar fi o bază de date, website sau altă aplicație client. [11]

Windows Workflow Foundation este de fapt o bibliotecă constând dintr-un motor de execuție, un motor de reguli, o serie de activități, un număr de servicii de suport runtime și un designer care permite dezvoltatorilor să proiecteze workflow. De fapt, acesta include chiar și un debugger vizual care permite dezvoltatorului să pășească prin workflow și chiar în codul .NET care stau la bază. Motorul este conceput în așa fel încât dezvoltatorul are posibilitatea de a alege între construirea workflow-ului utilizând cod sau într-un mod declarativ folosind XAML. Orice ar alege, el poate utiliza designer-ul în același mod, tot ceea ce se schimbă este ieșirea. Deoarece motorul de rulare are capacitatea de a parsa și executa XAML în sine, există o flexibilitate extraordinară în workflow-uri. Nu este nevoie să fie compilate în același timp cu restul aplicației. [10]

Workflow-urile State Machine oferă un stil de modelare cu care se poate modela workflow-ul într-un mod bazat pe evenimente. O activitate StateMachine conține stările și tranzițiile care alcătuiesc logica State Machine-ului și pot fi folosite oriunde o activitate poate fi utilizată. Există mai multe clase în runtime-ul State Machine:

StateMachine

State

Transition

Pentru a crea un workflow State Machine, stările sunt adăugate la o activitate StateMachine și tranzițiile sunt utilizate pentru a controla fluxul între stări. [12]

Am ales să folosesc acest framework deoarece lucrez cu o variantă a acestuia și este foarte utilă separarea aceasta dintre logica de business și implementare. Am implementat un workflow State Machine care se ocupă de gestionarea cererii unui angajat de a primi un calculator.

Tipuri de software utilizate

Visual Studio

Microsoft Visual Studio este un mediu de dezvoltare integrat (integrated development environment – IDE) de la Microsoft. Acesta poate fi folosit pentru a dezvolta aplicații consolă și aplicații cu interfață grafică pentru toate platformele suportate de Microsoft Windows (ex. .NET Framework, Windows Mobile etc). [13]

Visual Studio include un editor de cod care suportă IntelliSense (componentă de completare a codului) și de asemenea refactorizarea codului. Debugger-ul integrat funcționează atât pentru nivelul sursă, cât și pentru nivelul mașină. Alte unelte integrate sunt designer-e pentru construirea aplicațiilor GUI, pentru web, pentru clase și pentru scheme de baze de date. Acceptă componente care îmbunătățesc funcționalitatea sa, incluzând adăugarea de suport pentru sisteme de source-control și sisteme care acoperă tot ciclul de viață a dezvoltării software (ca exemplu, Team Foundation Server).

Sunt incluse și mai multe limbaje de programare care se pot folosi: Microsoft Visual C++, Microsoft Visual C#, Microsoft Visual Basic, Microsoft Visual Web Developer, Team Foundation Server. [14]

Visual Studio este oferit în mai multe versiuni, dar și variante: Express, Professional, Premium, Ultimate și Test Professional. Varianta Express este gratuită, celelalte sunt cu licență.

Pentru dezvoltarea aplicației, am folosit Visual Studio 2013, varianta Premium.

Descrierea aplicației

Acest capitol va prezenta structura și funcționalitatea acestei aplicații de management al angajaților și al inventarului.

Structura aplicației

Am folosit două proiecte pentru această aplicație, unul pentru ASP.NET MVC și unul pentru Workflow Foundation, evidențiate în Fig 4.1.

Fig. 4.1 Structura fișierelor în aplicație

În proiectul ASP.NET MVC, diferitele tipuri de fișiere sunt grupate pe directoare, iar cele mai importante sunt:

Content – fișierele CSS folosite de Bootstrap pentru a crea interfața aplicației.

Fig. 4.2 Directorul Content

Controllers – clasele derivate din Controller, fiecare având acțiuni și interogări asupra unui singur obiect asociat.

Fig. 4.3 Directorul Controllers

Filters – filtrele folosite în controller-e pentru a restricționa accesul la anumite secțiuni.

Fig. 4.4 Directorul Filters

Fonts – fișierele cu font-uri folosite de Bootstrap pentru icoane.

Fig. 4.5 Directorul Fonts

Migrations – fișierul de configurare care transformă clasele POCO în tabele pentru baza de date

Fig. 4.6 Directorul Migrations

Models – clasele POCO, contextul bazei de date și view models

Fig. 4.7 Directorul Models

Scripts – scripturile jQuery de bază ale Bootstrap si ASP.NET MVC

Fig. 4.8 Directorul Scripts

Views – view-urile pentru toate controller-e, grupate în directoare cu numele controller-ului de care aparține fiecare view

Fig. 4.9 Directorul Scripts

Structura bazei de date

Baza de date este creată de Entity Framework cu metoda Code First, deci prima dată am creat clase și extins unele existente deja din ASP.NET Identity, apoi Entity Framework le-a transformat în tabele.

Clasele folosite în aplicație sunt:

Computer

Departament

IdentityRole

ApplicationUser

Request

Clasa Computer are următoarele proprietăți:

Id – int, cheia primară pentru tabelă

Name – string

InventoryNumber –string

SerialNumber – string

MACAddress – string

CPUCoreCount – int

RAMSize – int

OperatingSystem – string

OwnerName – string

UserID – Guid?

Proprietățile OwnerName și UserID sunt folosite pentru a face legătura cu tabela de utilizatori. Motivul pentru care UserID are tipul Guid? este ca să poată fi nul în cazul în care se adaugă un calculator fără să i se facă asocierea cu un utilizator.

Clasa Departament are proprietățile:

ID – int , cheia primară pentru tabelă

Name – string

Employees – List<ApplicationUser>

Modul în care a fost gândită structura organizațională a fost ca relația dintre departament și utilizator să fie one-to-many. Din acest motiv, departamentul are ca proprietate o listă care conține elemente de tip ApplicationUser.

Clasa IdentityRole care provine de la ASP.NET Identity este folosită pentru a crea o oarecare ierarhie între utilizatori și în unele cazuri pentru a oferi acces la unele funcționalități doar unui anumit grup de utilizatori. Această clasă de fapt moștenește de la IdentityRole<string, IdentityUserRole> care conține un constructor fără parametri și proprietățile Id de tip TKey, Name de tip string și o proprietate generică Users de tip ICollection<TUserRole>. TKey este o convenție folosite la tipurile generice pentru a acorda mai multă flexibilitate.

Clasa ApplicationUser provine și ea de la ASP.NET Identity, moștenind la rândul ei din IdentityUser. Aceasta din urmă e pregătită deja “out of the box” pentru adăugarea de autentificare în doi pași, cu număr de telefon, confirmarea adresei de e-mail și logare cu conturi de socializare.

Am extins ApplicationUser cu următoarele proprietăți:

FirstName – string

LastName – string

Street – string

City – string

County – string

PostalCode – string

Department – Department

Computer – Computer

Proprietatea folosită ca și cheie primară este deja inclusă în IdentityUser, numele ei este Id și este tot de tipul TKey. Cu toate astea, în baza de date în coloana de Id apare un Guid generat sub formă de string.

Alte proprietăți deja incluse în IdentityUser sunt Email, UserName, PhoneNumber și PasswordHash. Conținutul proprietăților Email și UserName coincid prin default, dar este foarte rapid și simplu de modificat. PasswordHash va conține parola în varianta criptată cu ajutorul unei funcții Key Derivation cu ′salt′ aleator astfel încât doi utilizatori pot să aibe exact aceeași parolă, dar în baza de date valoarea din PasswordHash va fi diferită.

Clasa Request a fost creată astfel:

Id – int, cheia primară pentru baza de date

Type – HardwareType care este un enum ce conține diversele tipuri de hardware pentru care se poate face o cerere, în acest caz conține doar Computer

ReasonForRequest – string

Status – RequestStatus care este un enum ce conține stadiile în care se poate afla o cerere la un moment dat: New, Approved, Rejected, Ordered, Delivered

Requester – ApplicationUser

Proprietatea Requester este pentru a putea identifica utilizatorul care a făcut cererea ca, în eventualitatea în care i se aprobă și trece în stadiul Delivered, administratorul să știe cărui utilizator să îi asigneze un calculator.

Funcționalitățile aplicației

Aplicația a fost concepută să aibe în primă fază funcționalitățile de administrator. Acest subcapitol va descrie fiecare pagină a aplicației și fiecare funcționalitate a acesteia. Aplicația este alcătuită din următoarele pagini:

Pagina de autentificare

Pagina de start

Secțiunea cererilor de calculatoare

Secțiunea departamentelor

Secțiunea utilizatorilor

Secțiunea rolurilor

Secțiunea calculatoarelor

Pagina de autentificare

Atunci când se deschide aplicația, daca persoana nu este autentificată atunci i se va afișa această pagină.

Fig. 4.10 Pagina de autentificare

Aplicația vine cu un cont de administrator care se creează în clasa Configuration din directorul Migrations. Cu acest cont, administratorul aplicației se poate autentifica și poate crea restul utilizatorilor folosind pagina de utilizatori, având în vedere că aplicația a fost proiectată a doar administratorul să poată adăuga utilizatori. Din acest motiv, se poate observa că nu există link spre pagina de înregistrare.

Un formular de autentificare este folosit care validează câmpurile, iar introducerea greșită a unuia dintre ele va determina afișarea unui mesaj corespunzător de eroare. Același lucru se va întâmpla și dacă unul dintre aceste câmpuri nu e completat.

Prin apăsarea butonului “Log In”, datele introduse vor fi preluate și transmise controller-ului “AccountController”. Aici, acestea se vor prelucra și verifica cu informațiile din baz de date. Dacă utilizatorul a fost găsit și parola este corectă, se va face o redirecționare la pagina de start.

Pagina de start

De aici se poate ajunge la oricare din celelalte pagini cu ajutorul barei de navigație și conține detalii informative despre firmă.

Fig. 4.11 Pagina de start

Secțiunea cererilor de calculatoare

Pentru această funcționalitate a fost creat un workflow care este strâns legat de obiectul Request și de controller-ul și view-urile aferente lui. Am creat o activitate ce conține State Machine-ul care se ocupă de cerere.

Fig. 4.12 RequestWorkflow

Numele stărilor acestui State Machine corespund cu valorile enum-ului RequestType despre care am menționat că e folosit în acest scop.

Ca acestă activitate să poată funcționa, este nevoie o clasă care se folosește de WorkflowApplication fiindcă acesta oferă un set bogat de funcționalități pentru managementul instanțelor de workflow. El se comportă ca un thread safe proxy către WorkflowInstance care încapsulează runtime-ul, oferă metode pentr crearea și încărcarea instanțelor, întreruperea și reluarea, terminarea și notificarea evenimentelor din ciclul de viață. Clasa arată în felul următor:

public class WorkflowUtil

{

private static WorkflowApplication _appWorkflowApplication;

static AutoResetEvent instanceUnloaded = new AutoResetEvent(false);

public bool _isCompleted = false;

public WorkflowUtil()

{

StartWorkflow();

}

private void StartWorkflow()

{

_appWorkflowApplication = new WorkflowApplication(new RequestWorkflow());

_appWorkflowApplication.Completed = (e) =>

{

_isCompleted = true;

instanceUnloaded.Set();

};

_appWorkflowApplication.Idle = (e) =>

{

instanceUnloaded.Set();

};

_appWorkflowApplication.Run();

instanceUnloaded.WaitOne();

}

public void RunWorkflow(RequestStatus status)

{

string bookmarkname = _appWorkflowApplication.GetBookmarks()[0].BookmarkName;

_appWorkflowApplication.ResumeBookmark(bookmarkname, status);

instanceUnloaded.WaitOne();

}

}

În constructorul clasei se face apelul metodei StartWorkflow() a cărui scop e să lanseze host-ul workflow-ului. În interiorul acesteia, se crează o nouă instanță de workflow a cărui paramentru este definiția workflow-ului și se salvează în variabila _appWorkflowApplication.

Acestei instanțe i se adaugă un event handler pentru evenimentul de Completed. În interiorul handlerului, se utilizează obiectul instanceUnloaded care a fost creat pentru a închide instanța când workflow-ul și-a termina execuția.

Mai jos, se cheamă metoda Run() a workflow-ului care porneste runtime-ul și lansează host-ul, iar instanceUnloaded.WaitOne() nu returnează până când nu s-a terminat workflow-ul.

Metoda RunWorkflow() primeste ca parametru un status și cu ajutorul acestuia se poate folosi de un bookmark care ține minte în ce stare a rămas ultima dată. Cu ajutorul apelului ResumeBookmark, acesta poate să avanseze în starea următoare.

Între stări se navighează cu ajutorul tranzițiilor. Acestea au un trigger în care elementul declanșator este schimbarea valorii RequestStatus. Această valoare este transmisă printr-o activitate scrisă în cod:

public sealed class WaitForCommand : NativeActivity<object>

{

public RequestStatus Status { get; set; }

protected override void Execute(NativeActivityContext context)

{

context.CreateBookmark(this.Status.ToString(), (activityContext, bookmark, value) => activityContext.SetValue(this.Result, value));

}

protected override bool CanInduceIdle

{

get

{

return true;

}

}

}

Această activitate este chemată în interiorul trigger-ului pentru a crea un bookmark cu valoarea curentă a statusului.

Fig. 4.13 Tranziția între stările New și Approved

Pentru ca activitatea de Wait For Approved să știe ce valoare anume să aștepte, există o variabilă status creată de tipul RequestStatus a cărei valoare e apoi folosită pentru Wait For Approved.

Fig. 4.14 Variabila status

Fig. 4.15 Configurarea activității Wait For Approved

Cererile au o pagină de index unde administratorul poate să vadă toate cererile si detaliile lor.

Fig. 4.16 Indexul cererilor

De aici, administratorul poate să creeze o cerere nouă dacă e cazul, și pentru cereri existente să editeze, să vadă detaliile și să șteargă.

Fig. 4.17 Crearea a unei cereri

Se poate observa în Fig 4.17 faptul că statusul deja e pus pe New. Acest lucru se întâmplă deoarece logica de business a aplicației specifică faptul că orice cerere care se crează nu poate avea alt status decât New. Cazuri în care deja s-au început demersurile pentru asignarea unui calculator la un utilizator, dar s-a făcut cerere mai târziu nu sunt acceptate.

De asemenea se poate vedea că nu este niciun câmp pentru Requester aici. Lipsește fiindcă el se completează atunci când instanța de cerere se salvează în baza de date.

Mai departe vor fi arătate paginile pentru editare, detalii și ștergere.

Fig. 4.18 Editarea unei cereri

Fig. 4.19 Detaliile unei cereri

Fig. 4.20 Ștergerea unei cereri

Secțiunea departamentelor

Departamentele sunt structura organizațională pentru această aplicație. Și acestea dispun de aceleași pagini de index, creare, editare, detalii și stergere.

Fig. 4.21 Indexul departamentelor

Fig. 4.22 Crearea unui departament

Deși am menționat mai devreme că un departament are o listă de utilizatori, aceasta se umple doar în momentul în care din secțiunea utilizatorilor se face asignarea unui utilizator la un departament.

Același lucru se petrece și în cazul paginii de editare.

Fig. 4.23 Editarea unui departament

Pe de altă parte, atunci când se deschide pagina de detalii, există mai multă interacțiune cu lista de utilizatori, după cum se poate observa în Fig 4.24.

Fig. 4.24 Detaliile unui departament

Fig. 4.25

Secțiunea utilizatorilor

În cazul paginilor din această secțiune, este mai multă interacțiune cu obiectele și conținutul lor.

În Fig 4.26 se poate observa că utilizatorii se pot filtra după departament. Nu doar atât, dar se și pot accesa departamentul din care face parte utilizatorul și calculatorul care îi este asignat.

Fig. 4.26

Când se crează un nou utilizator, avem posibilitatea să alegem dintr-o listă de departamente și calculatoare existente care să îi fie asignate și atunci când se salvează utilizatorul în baza de date, și în obiectele departament și calculator asignate se face legătura cu utilizatorul. Așadar, așa se populează lista de utilizatori ai departamentului.

Totuși, doar asignarea la un departament e obligatorie și cu erori de validare dacă nu se face. Calculatorul poate să i se asigneze oricând, fie la creare, fie la editare.

Fig. 4.27 Crearea unui utilizator

Atunci când se editează un utilizator și i se alege alt departament și/sau computer, controller-ul șterge relația cu departamentul și/sau computerul anterior și crează una nouă cu obiectul nou selectat.

Fig. 4.28 Editarea unui utilizator

Fig. 4.28 Detaliile unui utilizator

Fig. 4.29 Ștergerea unui utilizator

Secțiunea rolurilor

Această secțiune este printre cele mai importante deoarece asigură compartimentarea aplicației pe segmente vizibile sau nu în funcție de ce drepturi are persoana în firmă. Deși are impact mare, este printre cele mai simple din cele de până acum.

Fig. 4.30 Indexul rolurilor

Fig. 4.31 Crearea unui rol

Fig. 4.32 Editarea unui rol

Fig 4.33 care arată pagina de detalii oferă până acum cele mai multe detalii, afișând un tabel cu utilizatorii care au acel rol.

Fig. 4.33 Detaliile unui rol

Această pagină oferă un mesaj elaborat despre ce s-ar întâmpla dacă se șterge rolul.

Fig. 4.34 Ștergerea unui rol

Secțiunea calculatoarelor

Și pentru această secțiune, indexul are link către detaliile obiectului asignat, în acest caz, utilizatorul.

Fig. 4.35 Indexul calculatoarelor

În momentul în care se crează un calculator sau se editează unul existent, asignarea unui utilizator la acesta nu e obligatorie, dar atunci când se asignează, în controller se salvează numele utilizatorului în OwnerName.

Fig. 4.36 Crearea unui calculator

În momentul în care deja există un utilizator asignat, dar la editare se schimbă, în controler se șterge relația veche și se crează cea nouă.

Fig. 4.37 Editarea unui calculator

Fig. 4.37 Detaliile unui calculator

Fig. 4.37 Ștergerea unui calculator

Concluzii

Scopul aplicației prezentate în această lucrare este de a reuni intranetul și managementul inventarului pentru a avea o vedere de ansamblu mai bună și mai ușoară.

Prin dezvoltarea aceastei aplicații am dorit să învăț mai multe și să pun în valoare funcționalitățile și avantajele framework-urilor folosite și descrise în lucrare.

Este o aplicație portabilă datorită tehnologiilor cu care a fost realizată și a structurii sale, cu un design minimalist și neîncărcat. Avantajele sunt reducerea costurilor în dezvoltarea acesteia deoarece tehnologiile folosite sunt open-source și mentenabilitatea acesteia.

Modul în care a fost structurată lasă loc de o eventuală extindere a funcționalităților acesteia în viitor. Câteva exemple ar fi folosirea framework-ului Workflow Foundation pentru a acoperi mai multe feluri de cereri, dezvoltarea clasei Departament ca să includă poziții (Project Manager, Scrum Master), extinderea tipurilor de obiecte din inventar (monitoare, tastaturi etc) și extinderea capabilităților secțiunii de roluri.

Bibliografie

[1] http://www.math.uaic.ro/~cgales/csharp/Curs1.pdf

[2] http://www.ls-infomat.ro/user/content/e9efcsharp.pdf

[3] https://en.wikipedia.org/wiki/ASP.NET_MVC

[4] http://www.aut.upt.ro/staff/diercan/data/PSSC/curs-11.pdf

[5] https://en.wikipedia.org/wiki/ASP.NET_Razor

[6] http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

[7] https://en.wikipedia.org/wiki/Entity_Framework

[8] http://profs.info.uaic.ro/~iasimin/Special/Curs_EntityFramework.pdf

[9] https://en.wikipedia.org/wiki/Bootstrap_(front-end_framework)

[10] http://windowsworkflowfoundation.eu/

[11] https://en.wikipedia.org/wiki/Windows_Workflow_Foundation

[12] https://msdn.microsoft.com/en-us/library/ee264171%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

[13] http://www.math.uaic.ro/~mapetrii/POO/depozit/Curs7.pdf

[14] https://en.wikipedia.org/wiki/Microsoft_Visual_Studio

Similar Posts