Aplicatie de Gestiune Devize
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ ȘI TEHNOLOGIA INFORMAȚIEI
PROGRAMUL DE STUDIU MASTERAT
FORMA DE ÎNVĂȚĂMÂNT ZI
Aplicație de gestiune devize
COORDONATOR ȘTIINȚIFIC
Prof. dr.ing. Ștefan Vari Kakas
ABSOLVENT
Porumb Mihai
ORADEA
2016
Introducere
Prezenta lucrare are ca scop realizarea unei aplicații destinată oricărei companii care lucrează pe bază de devize pentru clienții săi.
Am ales această temă deoarece o companie mi-a cerut să le fac o aplicație asemănătoare și mi s-a părut o provocare. De asemenea mi s-a părut un mod bun de a-mi arăta cunoștiințele dobândite pe parcursul studiilor de licență și masterat având în vedere pregătirea mea ca viitor manager în IT.
Scopul major al acestei aplicații este acela de a gestiona devizele clienților pentru o companie. Pentru îndeplinirea acestui scop aplicația trebuie să țină și evidența clienților și a contractelor deci aplicația va avea și această funcționalitate, de a gestiona clienții și contractele cu ei. Având în vedere că pentru orice linie din deviz trebuie trecut un executant aplicația va gestiona și angajații firmei. În concluzie pornind de la scopul principal, acela de a ține evidența devizelor, aplicația va avea un spectru mai larg de utilizare:
Ține evidența clienților
Gestionează contractele cu clienții
Gestionează devizele cu clienții
Exportă devizele în Word
Ține evidența angajaților, inclusiv pontajul
Aplicația nu are ca scop calcularea unei oferte de preț, sau a etapizării devizelor. În interfață se va crea un deviz la care se vor adăuga linii de deviz. În fiecare linie se va descrie ce s-a lucrat pentru clientul respectiv. Pe baza liniilor introduse aplicația va face calculul devizului.
Având în vedere că programul software ține și pontajul angajaților și fiecare angajat trebuie să introducă linii în devize pentru ce lucrează, aplicația poate fi folosită și ca un program de verificare a timpului de lucru efectiv al angajaților. Multe firme folosesc astfel de aplicații în care un angajat trebuie să scrie ce a lucrat în ziua respectivă și în ce interval orar.
Importanța acestei aplicații este aceea că se pot gestiona informațiile despre clienți și angajați într-un singur loc, fără a fi nevoie de mai multe aplicații. Un alt avantaj ar fi acela al structurii datelor, datele sunt structurate în tabele în așa fel încât generarea de rapoarte să fie facilă.
Pe piață există și alte aplicații care țin evidența devizelor, cum ar fi:
http://www.proiectinvest.ro/
http://www.deviz.ro/
http://www.cibpro.ro/main/produse/SICO%20Devize/
Aplicația este de tip desktop, scrisă în Visual Studio 2012, limbajul C# cu .NET Framework 4.0.
Baza de date este de tip MySQL. Am ales acest tip deoarece firma mai avea aplicații care folosesc server MySQL și de aceea licențierea nu era o problemă. Era mai bine dacă se folosea MSSQL ca să fie aceeași tehnologie de la Microsoft dar, pentru ce am nevoie în dezvoltarea aplicației e de ajuns si MySQL.
Interfața este creată în Windows Presentation Foundation (WPF), șablonul folosit fiind Model View ViewModel (MVVM). Am ales acest șablon deoarece lucrez cu el la locul de muncă și îmi place modul de structurare a elementelor ce întregesc interfața.
Această îmbinare de tehnologii am ales-o deoarece proiectul scris în C# se comportă bine cu baza de date MySQL. Un alt motiv ar fi experiența personală acumulată în munca cu aceste tehnologii.
Este structurată într-o singură componentă, și anume nu este o aplicație client și o aplicație server care conlucrează, există doar parte de client care comunică direct cu baza de date. Structura claselor este făcută în așa fel încât aplicația poate fi împărțită în cele două componente dacă se dorește.
Aplicația poate rula pe platforme Windows 7, 8, 8.1, 10.
I.1 Structura documentului
Capitolul 1 prezintă o scurtă descriere despre aplicație, tehnologiile folosite și structura documentului.
Capitolul 2 conține aspectele teoretice ale aplicației, adică descrierea tehnologiilor folosite. Acest capitol începe cu descrierea .NET Framework 4.0 și se continuă cu câteva date despre MySQL. La sfârșitul capitolului sunt prezentate părțile componente ale interfeței utilizator și anume Windows Presentation Foundation și șablonul Model View ViewModel.
Capitolul 3 este dedicat proiectului în sine. Structura proiectului: model, storage, manager, view, viewmodel. Structura bazei de date: tabelele cu legăturile dintre ele. Urmează descrierea fiecărei părți, ce face și cum a fost implementată. Se continuă cu descriere interfeței utilizator, modulele din care este formată. În final sunt descrise pe larg modulele interfeței utilizator.
În capitolul 4 sunt prezentate aspectele economice și de management ale aplicației.
Ultimul capitol, capitolul 5, este destinat concluziilor. În acest capitol de prezintă o balanță între ce mi-am propus să fac și ce am reușit, enumerare a contribuțiilor personale, avantajele și aplicabilitatea lucrării, posibilele dezvoltări viitoare.
Capitolul II. Aspecte teoretice
II.1 .NET Framework 4
.NET Framework este dezvoltat de Microsoft și rulează în principal pe sistemele de operare Windows [1].
.NET Framework este o platformă ce ajută la dezvoltarea aplicațiilor de tip desktop, web sau cele destinate dispozitivelor mobile. Este compus din Common Language Runtime (CLR), ce execută gestionarea memoriei, serviciilor si a altor componente ale sistemului. CLR conține o vastă bibliotecă de clase si cod reutilizabil ce ajută dezvoltatorii de aplicații în dezvoltarea aplicațiilor. Include și Framework Class Library (FCL) care este o mare bibliotecă de clase ce asigură interoperabilitatea limbă adică fiecare limbaj poate utiliza cod scris în alte limbaje de programare [2].
FCL și CLR împreună formează .NET Framework. FCL oferă interfață utilizator, conexiuni cu baze de date, criptografie, rețea de comunicații [8].
.NET Framework a fost lansat pentru prima dată în luna noiembrie anul 2000, versiunea 1.0 Beta. Azi a ajuns la versiunea 4.5.2 care a fost lansata anul acesta în luna mai.
Pentru programatori această platformă asigură câteva facilități [3]:
gestionarea memoriei: în multe limbaje de programare programatorii trebuie să acorde o atenție specială alocării și eliberării memoriei, în NET Framework CLR oferă aceste servicii.
o vastă bibliotecă de clase: programatorii nu mai trebuie să scrie mult cod pentru operații de programare de nivel scăzut, ei putând utiliza membri si clase din această bibliotecă.
anumite cadre de dezvoltare și tehnologii: include biblioteci pentru anumite domenii cum ar fi: ASP.NET pentru aplicațiile web, ADO.NET pentru acces la date, Windows Communication Foundation (WPF) pentru aplicațiile menite sa utilizeze servicii.
compatibilitate versiune: de cele mai multe ori aplicațiile dezvoltate într-o anumită versiune pot rula fără probleme pe o versiune mai nouă.
II.2 Baze de date MySQL
MySQL este un sistem de gestiune a bazelor de date relaționale, produs de compania suedeza MySQL AB și distribuit sub Licența Publică Generală GNU [14].
În anul 2008 Sun Microsystems a cumpărat compania MySQL AB iar în anul 2010 Oracle a cumpărat compania Sun Microsystems, deci în prezent MySQL este deținut de Oracle [14].
Licențierea pentru MySQL se împarte în două părți [15]:
programatori (pentru dezvoltare software)
companii (pentru utilizare)
Licența pentru programatori este gratuită și poate fi descărcată după pagina de internet www.mysql.com. Versiunea gratis a MySQL are denumirea MySQL Community Edition [16].
Licența pentru companii se împarte în 3 categorii, fiecare având specificații și prețuri diferite [16]:
MySQL Standard Edition
MySQL Enterprise Edition
MySQL Cluster Carrier Grade Edition
Pentru consultarea prețurilor și a specificațiilor se poate accesa pagina de internet https://www.mysql.com/products/ [17].
Pentru realizarea aplicației am folosit licența pentru programatori pe calculatorul meu.
MySQL este folosit foarte des în combinație cu limbajul de programare PHP și face parte din platforma LAMP (Linux, Apache, MySQL, PHP). Pentru a folosi MySQL cu alte limbaje de programare este nevoie de scheme API (application program interface) disponibile pentru el, ce permit accesarea bazelor de date. Limbajele de programare care pot comunica cu MySQL sunt: C, C++, C#, Java, Perl, PHP, FreeBasic, Python, etc [14].
Administrarea unei baze de date MySQL se poate face în două moduri [14]:
linie de comandă
interfață grafică cu ajutorul uneltelor MySQL Administration sau MySQL Query Browser.
Un alt instrument folosit pentru administrare este aplicația gratuită phpMyAdmin.
Platforme compatibile pe care MySQL poate rula [14]:
Windows 9x/NT/2000/XP/Vista/7/8/8.1/10
Windows Server
AIX
FreeBSD
GNU/Linux
Mac OS X
NetBSD
Solaris
SunOS
II.3 Windows Presentation Foundation
Windows Presentation Foundation (WPF) este un subsistem grafic utilizat pentru construcția interfeței utilizator în aplicațiile bazate pe sistemul de operare Windows. Cunoscut anterior ca Avalon a fost inițial lansat ca parte a .NET Framework 3.0 [10].
WPF folosește XAML, un limbaj bazat pe XML, pentru a defini și a lega diferitele elemente de interfață. Aceste elemente pot fi apoi legate și manipulate de diferite evenimente, interacțiunile utilizatorului și legături de date [10].
Bibliotecile de rulare pentru WPF sunt incluse în toate versiunile sistemelor de operare Microsoft de la Windows Vista și Windows Server 2008 încoace. Utilizatorii de Windows XP și Windows Server 2003 le pot instala opțional [9].
WPF a fost lansat inițial sub numele de Avalon ca parte a .NET Framework 3.0. De atunci Microsoft a lansat cinci versiuni majore: WPF 3.0 (noiembrie 2006), WPF 3.5 (noiembrie 2007), WPF 3.5 sp1 (august 2008), WPF 4 (aprilie 2010) și WPF 4.5 (august 2012) [10].
WPF este încă dezvoltat activ dar încă nu e adaptat să ruleze pe dispozitive de consum redus cum ar fi telefoanele sau tabletele.
Ferestrele sunt redate cu ajutorul Direct3D. Acest lucru permite afișarea de elemente grafice mai complexe și de teme personalizate. Utilizarea acestei tehnologii permite reducerea volumului de operații pentru procesorul grafic și procesorul calculatorului [10].
WPF are un set de servicii de date pentru a permite dezvoltatorilor de aplicații să lege și să manipuleze datele in cadrul aplicațiilor. Sunt patru tipuri de legări de date [9]:
o dată: caz în care clientul ignoră actualizările de pe server
o cale: în cazul în care clientul are acces numai la citire pentru datele de pe server
două căi: în cazul în care clientul poate citi și scrie date la server
o cale către sursă: caz în care clientul are acces numai la scriere pe server
Interogările LINQ pot acționa de asemenea ca surse de date pentru legarea de date.
WPF oferă un set de controale care conțin elemente cum ar fi butoane, meniuri, grile, casete. Aceste controale pot folosi șablonul predefinit sau pot folosi un șablon definit de utilizator. Se poate defini aspectul unui element în mod direct, prin proprietățile sale, sau indirect folosind un șablon sau stil. Stilul este o combinație de setări sau proprietăți care poate fi aplicată unui element.
Există suport pentru cele mai comune formate de imagine BMP, JPEG, PNG, TIFF, Windows Media Photo, GIF și ICON, de asemenea suportă formate video cum ar fi WMV, MPEG și unele fișiere AVI.
II.4 Model View ViewModel
Model View ViewModel este un model de design folosit în dezvoltarea interfețelor utilizator .
Acest șablon ajută la separarea logicii de prezentare de logica business. Acesta este structurat în trei părți esențiale ce pot fi deduse și din denumire: un Model, un View și un ViewModel.
Modelul se referă la datele efective cu care se lucrează dar și la nivelul de acces la ele. View-ul se referă la partea vizuală, care va fi afișată utilizatorului, de exemplu: ferestrele, butoanele si alte elemente grafice. Marele avantaj constă în faptul că toată construcția poate fi împărțită în două categorii: interfața de care se poate ocupa un designer și logica din spatele interfeței de care se poate ocupa programatorul. Dacă se dorește schimbarea unor elemente din partea grafică, logica din spate nu va fi afectată.
ViewModelul este un punctul intermediar între View și model, adică face legătura dintre datele din Model și elementele din View. View-ul comunică doar cu ViewModelul. Modelul comunica cu baza de date și cu ViewModelul.
O diagramă de funcționare a acestui șablon poate fi vizualizată în Figura 1.
Figura 1 – Diagramă Model View ViewModel
Întrucât acest șablon este destul de greu de implementat au fost create câteva platforme care ajută la implementarea lui: MVVM Light, Calibrum. În această aplicație am folosit MVVM Light.
Capitolul III. Implementarea aplicației
Aplicația software este destinată firmelor care lucrează pe bază de devize pentru clienții lor. Este capabilă să gestioneze datele clienților (nume, adresa, număr de telefon, contracte, devize, persoană de contact), datele angajaților (nume, contract ore de munca, pontaj, număr de telefon. ).
III.1 Baza de date
Baza de date este de tip MySQL și conține 10 tabele. Structura bazei de date se poate vedea în Figura 2.
Figura 2 – Structură bază de date
III.2 Structură proiect
Codul sursă este împărțit în mai multe dosare, părți: Resources, Model, Storage, Manager, UI, Settings, Helpers. Principalele legături dintre aceste părți pot fi observate în Figura 3.
Figura 3 – Structură proiect
În dosarul Resources se vor afla fișierele folosite la crearea interfeței utilizator.
Dosarul Settings conține doar un fișier xml cu setările pentru conexiunea cu baza de date.
Partea Helpers este destinată claselor cu rol de ,,ajutor” în scrierea codului. Conține doar o clasă statică, Helper, care are rolul de a face legăturile dintre obiecte. De exemplu dacă sunt 2 liste, una conține obiecte de tip Client și una conține obiecte de tip Persoana.cs, în această clasă este definită o metodă ce va face legăturile corecte dintre cele 2 liste pe bază de id-uri.
Dosarul Model conține clasele principale ale proiectului, tipurile enum, clasele ,,requester”. Clase ,,requester” sunt folosite pentru a ,,umple” proprietățile obiectelor. De exemplu dacă se lucrează cu un obiect de tip client nu trebuie neapărat ca acel obiect să aibă și proprietatea locații completată și atunci clasei manager I se va cere obiectul client fără acea proprietate cu ajutorul clasei requester. În acest mod se salvează timp de execuție și apeluri inutile la baza de date.
Clasele principale a proiectului sunt:
Angajat.cs
AngajatDevizLinii.cs
BdSaveResultsWithData.cs – această clasă ajută la partea de storage unde se comunică cu baza de date.
Client.cs
Comanda.cs
Concediu.cs
Costuri.cs
DevizHeader.cs
DevizLinii.cs
Locatie.cs
Luna.cs
Persoana.cs
Pontaj.cs
Uistatus.cs
ValidationError.cs
Dosarul Storage conține clasele ce fac legătura cu baza de date. Fiecare clasă care are o tabelă în baza de date automat va avea și o clasă de tip storage. Conținutul dosarului Storage este:
AngajatStorage.cs
AngajatDevizLiniiStorage.cs
ClientStorage.cs
ComandaStorage.cs
DevizHeaderStorage.cs
DevizLiniiStorage.cs
LocatieStorage.cs
PersoanaStorage.cs
PontajStorage.cs
Dosarul Manager conține clasele de tip manager. Nu toate clasele din model au un manager. Un rol a clasei manager este acela de a apela clasele storage necesare pentru furnizarea rezultatului dorit. Clasa manager este folosită și pentru a furniza rapoarte care nu au nevoie doar de date din baza de date, ci și de anumite calcule pe baza acelor date. Pentru o clasă cu mai multe proprietăți care trebuiesc luate din baza de date un manager apelează clasele storage ale acelor proprietăți și face legăturile necesare astfel încât rezultatul să aibă toate proprietățile completate corect. Pentru unele clase rezultatul va fi returnat în funcție de o clasă solicitant (requester) . O clasă solicitant îi spune unui manager dacă o anumită proprietate trebuie luată din baza de date și completată sau nu. În unele cazuri nu e nevoie ca rezultatul să aibă toate proprietățile completate.
Conținutul dosarului Manager:
AngajatManager.cs
AngajatDevizLiniiManager.cs
ClientManager.cs
ComandaManager.cs
DevizHeaderManager.cs
DevizLiniiManager.cs
LocatieManager.cs
PersoanaManager.cs
PontajManager.cs
CostManager.cs
RapoarteManager.cs
Partea UI conține toate clasele si ferestrele ce aparțin interfeței utilizator. Componentele principale sunt:
Converters
UserControls
ViewModels
Views
,,Convertes” conține clasele de convertire folosite în interfața utilizator. O clasă de convertire este o clasă care ajută la conversia unei valori de un anumit tip într-o valoare de alt tip. De exemplu o valoare de tip bool (true, false) într-o valoare de tip culoare. Am folosit două clase de conversie:
BooleanToWidthconverter.cs
DateTimeConverter.cs
UserControls conține toate componentele de tip usercontrol folosite in interfață. O componentă usercontrol se comportă ca o fereastră dar poate fi reutilizată în mai multe ferestre. Și pentru un usercontrol sunt definite părțile principale ale unei ferestre: view și viewmodel. Proiectul conține doar o componentă usercontrol și anume EditarePontajControlView.xaml cu EditarePontajControlViewModel.cs aferent.
În dosarul ViewModels există un BasicViewModel.cs ce este moștenit de fiecare clasă de tip viewModel. Această clasă de bază implementează 2 funcționalități, și anume: schimbarea culorilor în interfață și afișarea statusului.
În fereastra principală sunt 5 mari funcționalități descrise: devize, clienți, angajați, rapoarte, setări. Dosarele viewmodel și view au în componența lor pentru fiecare din aceste funcționalități un dosar, deci componentele ferestrelor sunt împărțite și în cod la fel ca în fereastra principală.
Clase viewmodel:
AngajațiViewModel.cs
EditareAngajatViewModel.cs
PontajItemViewModel.cs
PontajViewModel.cs
ClientiOverviewViewModel.cs
ClientiViewModel.cs
ClientViewModel.cs
ClientOverviewViewModel.cs
DetaliiClientViewModel.cs
EditareClientViewModel.cs
EditareComandaViewModel.cs
EditareDevizViewModel.cs
EditareLocatieViewModel.cs
AdaugaDevizLinieViewModel.cs
DevizProblemeViewModel.cs
DevizeViewModel.cs
SelectareDevizViewModel.cs
RaportCompletAngajatViewModel.cs
SettingsViewModel.cs
MainWindowsViewModel.cs
Componente view:
AgajatiView.xaml
EditareAngajatView.xaml
PontajView.xaml
ClientiOverview.xaml
ClientiView.xaml
ClientView.xaml
DetaliiClientView.xaml
EditareComandaView.xaml
EditareDevizView.xaml
EditareLocatieView.xaml
AdaugaDevizLinieView.xaml
DevizeClientiView.xaml
DevizeProblemeView.xaml
SelectareDeviz.xaml
RaportCompletAngajatView.xaml
SettingsView.xaml
III.3 Descriere clase de bază
Clasele de bază sunt clasele din categoria Model.
Clasa Angajat.cs are următoarele proprietăți:
public int Id { get; set; }
public string Nume { get; set; }
public string Prenume { get; set; }
public string TelMobil { get; set; }
public string TelPersonal { get; set; }
public string Adresa { get; set; }
public int ProgramDeLucru { get; set; }
public string Username { get; set; }
public bool Activ { get; set; }
public TipUser Tip { get; set; }
public double CostOra { get; set; }
public List<Client> Clienti { get; set; }
public Status State { get; set; }
Un angajat poate avea asignați clienți de care răspunde, de aceea există proprietatea List<Client> Clienti { get; set; }. Proprietatea TipUser este de tip enum și poate avea valorile: Nimic, Admin, User. Se folosește această proprietate deoarece în funcție de ce tip este utilizatorul acesta va avea sau nu acces la unele operațiuni în aplicație. Proprietatea State de tip status este folosită la parte de lucru cu baza de date. Este de tip enum și poate avea valorile: ToBeUpdated, ToBeInserted, ToBeDeleted, Unchage. Această proprietate ajută la luarea deciziilor când trebuie să salvăm un obiect în baza de date. Fiecare clasă are această proprietate.
Clasa AngajatDezLinii.cs ajută la crearea legăturii dintre angajat și linia din deviz. Un angajat poate avea mai multe linii deviz, și o linie deviz poate avea mai mulți angajați. De aceea este o relație mai mulți la mai mulți și avem nevoie de o clasă de legătură. Această clasă are următoarele proprietăți:
public int Id { get; set; }
public int IdPersoana { get; set; }
public int IdDevizLinii { get; set; }
public DevizLinii Linie { get; set; }
public Angajat { get; set; }
string format = "dd/MM/yyyy hh:mm:ss.ffffff";
private DateTime data;
public DateTime Data { get { return data; } set { data = DateTime.ParseExact(value.ToString(format), format,new CultureInfo("en-EN")); } }
public Status State { get; set; }
Clasa Client.cs manipulează datele pentru un client și are proprietățile:
public int Id { get; set; }
public string Nume { get; set; }
public string Adresa { get; set; }
public int IdPersoanaDeContact { get; set; }
public Persoana PersoanaDeContact { get; set; }
public List<Locatie> Locatii {get;set;}
public List<DevizHeader> Devize {get;set;}
public List<Comanda> Comenzi { get; set; }
public bool Activ { get; set; }
public int IdPersoanaResponsabila { get; set; }
public Angajat PersoanaResponsabila { get; set; }
public Status State { get; set; }
Fiecare client trebuie să aibă o persoană de contact de aceea sunt prezente proprietățile: IdPersoanaDeContact și PersoanaDeContact. Un client poate avea mai multe locații de lucru mai multe devize, și mai multe comenzi. O comandă este privită ca un contract. De asemenea cum un angajat poate avea asignat unu sau mai mulți clienți de care este responsabil clasa client are proprietatea PersoanaResponsabila. Proprietatea Activ ajută la ștergerea clientului. Dacă se dorește ștergerea unui client aceasta nu va fi șters efectiv din baza de date, va fi doar inactiv.
Clasa Comanda.cs conține următoarele proprietăți:
public int Id { get; set; }
public int IdClient { get; set; }
public Client Client { get; set; }
public string Nume { get; set; }
public long Numar { get; set; }
public int NumarOreIncluse { get; set; }
public double CostOreIncluse { get; set; }
public double CostOraSuplimentara { get; set; }
public double TaxareKM { get; set; }
public double TaxareCazare { get; set; }
public Status State { get; set; }
public bool Activ { get; set; }
string format = "dd/MM/yyyy hh:mm:ss.ffffff";
private DateTime data;
public DateTime Data { get { return data; } set { data = DateTime.ParseExact(value.ToString(format), format, new CultureInfo("en-EN")); } }
Clasa Comanda.cs poate fi considerată un contract. Fiecare contract conține anumite tarife cum ar fi: cost total pentru un anumit număr de ore incluse, cost pentru o oră suplimentară, taxă pentru un km, taxă de cazare (în cazul în care e nevoie de cazare peste noapte, aceasta e pentru clienții care nu sunt din aceeași localitate). Toate aceste costuri sunt definite în proprietățile clasei pentru comenzi.
Clasa DevizHeader.cs are rolul unui antet pentru fiecare deviz. Are următoarele proprietăți:
public int Id { get; set; }
public int IdClient { get; set; }
public Client Client { get; set; }
string format = "dd/MM/yyyy hh:mm:ss.ffffff";
private DateTime data;
public DateTime Data { get { return data; } set { data = DateTime.ParseExact(value.ToString(format), format, new CultureInfo("en-EN")); } }
public int IdComanda { get; set; }
public int Numar { get; set; }
public Comanda TipContract { get; set; }
public List<DevizLinii> Linii { get; set; }
public double CostTotal { get; set; }
public int NumarCazari { get; set; }
public string Descriere { get; set; }
public Status State { get; set; }
public bool Activ { get; set; }
public bool Blocat { get; set; }
Un obiect de tipul DevizHeader.cs este legat de un obiect Client.cs și Comanda.cs. Legătura dintre antet și comandă poate lipsi deoarece nu e nevoie de fiecare data de un contract pentru a efectua niște servicii. Un antet poate fi blocat de administratori și în acel moment nu se mai pot face operații de ștergere, modificare, adăugare de linii asignate acestui antet, de aceea este prezentă proprietatea Blocat. La fel ca în cazul unui client la ștergere proprietatea Activ este pusă pe false, nimic nu se șterge din baza de date.
Clasa DevizLinii.cs este clasa cu ajutorul căreia se fac înregistrările lucrului efectuat de unul sau mai mulți angajați. Proprietățile clasei sunt:
public int Id{ get; set; }
public int IdDevizHeader { get; set; }
public DevizHeader Header { get; set; }
string format = "dd/MM/yyyy hh:mm:ss.ffffff";
private DateTime data;
public DateTime Data { get { return data; } set {data = DateTime.ParseExact(value.ToString(format), format,null); }}
public List<AngajatDevizLinii> Angajati { get; set; }
public int DurataFacturareOre { get; set; }
public int DurataFacturareMinute { get; set; }
public int DurataEfectivaOre { get; set; }
public int DurataEfectivaMinute { get; set; }
public string Descriere { get; set; }
public bool Remote { get; set; }
public Locatie Locatie { get; set; }
public int IdLocatie { get; set; }
public Status State { get; set; }
public bool Activ { get; set; }
public int Km { get; set; }
public int Cazari { get; set; }
La fiecare operațiune pe care un angajat o face pentru un client acesta trebuia să adauge în deviz o linie în care să descrie ce a lucrat. Un angajat poate lucra singur sau în echipă. O operațiune poate fi efectuată la sediul clientului sau remote. Dacă operațiunea nu ea remote atunci trebuie specificați numărul de km pe care angajatul i-a parcurs și dacă a avut sau nu nevoie de cazare. De asemenea dacă un client are mai multe locații trebuie specificată locația unde s-a efectuat lucrul.
Clasa Locatie.cs are menirea de a manipula locațiile unui client. Proprietăți:
public int Id { get; set; }
public string Nume { get; set; }
public int IdClient { get; set; }
public Client Client { get; set; }
public string Adresa { get; set; }
public string Telefon { get; set; }
public string TelefonMobil { get; set; }
public int Km { get; set; }
public bool Activ { get; set; }
public Status State { get; set; }
Fiecare locație are un număr de telefon fix și mobil. Proprietatea Km setează numărul de kilometri de la sediul companiei care utilizează aplicația până la locația respectivă.
Clasa Persoana.cs este utilizată pentru salvarea datelor unei persoane de contact a unui client, si are proprietățile:
public int Id { get; set; }
public string Nume { get; set; }
public string Prenume { get; set; }
public string TelMobil { get; set; }
public string TelPersonal { get; set; }
public string Adresa { get; set; }
public Status State { get; set; }
public bool Activ { get; set; }
Clasa Pontaj.cs ajută la salvarea pontajului pentru angajații companiei cu ajutorul proprietăților:
public Pontaj(){ TipConcediu=TipConcediu.Nimic;}
public int Id { get; set; }
public int Idangajat { get; set; }
public Angajat Angajat { get; set; }
string format = "dd/MM/yyyy hh:mm:ss.ffffff";
private DateTime data;
public DateTime Data { get { return data; } set { data = DateTime.ParseExact(value.ToString(format), format, new CultureInfo("en-EN")); } }
public int ProgramDeLucruEfectuat { get; set; }
public bool Concediu { get; set; }
public TipConcediu TipConcediu { get; set; }
public Status State { get; set; }
Pontajul are propritatea de tip enum TipConcediu. Acest enum poate avea valorile: Nimic, ConcediuOdihna, ConcediuMedical, ConcediuNeplatit. Dacă angajatul a fost în concediu trebuie să selecteze și ce fel ce concediu a avut.
III.4 Descriere storage
Fiecare clasă care are legătura cu baza de date, adică are o tabelă aferentă în baza de date are și o clasa Storage ce conține metode care apelează baza de date. Metodele din storage sunt de inserare date, actualizare date, ștergere date, luare date din baza de date. Legătura dintre codul .NET și baza de date MySQL se face cu ajutorul unui conector denumit MySQL.Data.Entity.
Un exemplu de metodă care adaugă în baza de date ar fi cea pentru un angajat:
public BdSaveResultsWithData<Angajat> Add(List<Angajat> angajati)
{var result = new BdSaveResultsWithData<Angajat>
{ ValidationErrors = new List<ValidationError>() };
conMy = new MysqlConnectionClass();
if (!conMy.OpenConnection())
{result.ValidationErrors.Add(new ValidationError
{
Name = "Error connect to mysql",
Description = "Error connect to mysql"
});
return result;
}
result.Datas = new List<Angajat>();
foreach (var angajat in angajati)
{string script = @"INSERT INTO bd_inova.angajat(Programdelucru, Username, Activ, Tip, CostOra, Nume, Prenume, TelMobil, TelPersonal, Adresa) VALUES (@ProgramDeLucru,@Username,@Activ,@Tip,@CostOra,@Nume,@Prenume,@TelMobil,@TelPersonal,@Adresa ); Select LAST_INSERT_ID();";
using(var transaction=conMy.ConMy.BeginTransaction())
{try
{using (var command = new MySqlCommand(script, conMy.ConMy, transaction))
{command.Parameters.Add("@ProgramDeLucru", MySqlDbType.String).Value = angajat.ProgramDeLucru; command.Parameters.Add("@Username", MySqlDbType.String).Value = angajat.Username;
command.Parameters.Add("@Nume",MySqlDbType.String).Value = angajat.Nume;
command.Parameters.Add("@Prenume",MySqlDbType.String).Value=angajat.Prenume; command.Parameters.Add("@TelMobil",MySqlDbType.String).Value = angajat.TelMobil; command.Parameters.Add("@TelPersonal",MySqlDbType.String).Value = angajat.TelPersonal;
command.Parameters.Add("@Adresa",MySqlDbType.String).Value = angajat.Adresa;
command.Parameters.Add("@Activ",MySqlDbType.Bit).Value = (angajat.Activ) ? 1 : 0;
command.Parameters.Add("@Tip", MySqlDbType.VarChar).Value = angajat.Tip.ToString();
command.Parameters.Add("@CostOra", MySqlDbType.Double).Value = angajat.CostOra;
angajat.Id = Convert.ToInt32(command.ExecuteScalar());
command.Parameters.Clear();
}transaction.Commit();
}catch(Exception exception )
{Thread.Sleep(1000);
try{transaction.Commit();}
catch (Exception ex)
{transaction.Rollback();
result.ValidationErrors.Add(new ValidationError
{Name="Transaction error",
Description = ex.Message});}
} } }
conMy.CloseConnection();conMy.Dispose();
result.Datas = angajati;
return result;}
Se folosește o tranzacție la operațiile care schimbă date în baza de date deoarece dacă se întâmplă ceva pe parcurs tranzacția să dea înapoi și datele să rămână intacte.
Exemplu metodă de actualizare date (pentru clasa Client.cs):
public BdSaveResultsWithData<Client> Update(List<Client> clienti)
{ var result = new BdSaveResultsWithData<Client>
{ ValidationErrors = new List<ValidationError>() };
conMy = new MysqlConnectionClass();
if (!conMy.OpenConnection())
{result.ValidationErrors.Add(new ValidationError
{Name = "Error connect to mysql",
Description = "Error connect to mysql"});
return result;}
}
result.Datas = new List<Client>();
foreach (var client in clienti)
{ string script = @"UPDATE bd_inova.client SET Nume = @Nume,IdPersoanaDeContact = @IdPersoanaDeContact ,Activ = @Activ, Adresa = @Adresa, IdPersoanaResponsabila=@IdPersoanaResponsabila WHERE id = @id";
using (var transaction = conMy.ConMy.BeginTransaction())
{try
{using (var command = new MySqlCommand(script, conMy.ConMy, transaction))
{command.Parameters.Add("@Nume", MySqlDbType.VarChar).Value = client.Nume; command.Parameters.Add("@IdPersoanaDeContact",MySqlDbType.Int32).Value=client.IdPersoanaDeContact; command.Parameters.Add("@Activ",MySqlDbType.Bit).Value= client.Activ ? 1 : 0;
command.Parameters.Add("@Adresa",MySqlDbType.VarChar).Value = client.Adresa; command.Parameters.Add("@id",MySqlDbType.Int32).Value =client.Id; command.Parameters.Add("@IdPersoanaResponsabila",MySqlDbType.Int32).Value = client.IdPersoanaResponsabila;
command.ExecuteNonQuery(); command.Parameters.Clear();
}transaction.Commit();
}catch
{Thread.Sleep(1000);
try{transaction.Commit();}
catch (Exception ex)
{transaction.Rollback();
result.ValidationErrors.Add(new ValidationError
{Name = "Transaction error",
Description = ex.Message});
}
}}}
conMy.CloseConnection();
conMy.Dispose();
result.Datas=GetById(clienti.Select(v=>v.Id).ToList()).Datas;
return result;}
III.5 Descriere clase manager
Clasele manager sunt folosite pentru a returna obiecte cu date complete, sau parțiale, pentru a șterge, insera sau actualiza date în baza de date. Aceste clase apelează clasele storage necesare pentru a duce la bun sfârșit operațiunile cerute. De exemplu dacă pentru clasa Client se vrea un rezultat cu toate proprietățile completate, managerul acestei clase va apela clasa storage a clasei Locatii.cs, după care va apela clasa storage a clasei Comanda.cs, va face legăturile necesare și așa mai departe. La final vom avea obiectul cameră cu toate proprietățile completate corect.
Toate clasele manager conțin metode de tip
Get
Save
Delete
Unele clase manager pot conține și alt tip de metode ce manipulează datele, aceste metode sunt mai ales pentru rapoarte.
Proprietățile de tip get pot primi ca și parametri diferite clase de tip requester. O clasă de tip solicitant este o clasă ce are proprietăți de tip bool. De exemplu pentru clasa Client solicitantul ei va fi:
public class ClientRequester{
public ClientRequester()
{ PersoanaDeContact = false;
Locatii = false;
Devize = false;
DevizeLunaCurenta = false;
Comenzi = false;
PersoanaResponsabila = false;
}
public bool PersoanaDeContact { get; set; }
public bool Locatii { get; set; }
public bool Devize { get; set; }
public bool DevizeLunaCurenta { get; set; }
public bool Comenzi { get; set; }
public bool PersoanaResponsabila { get; set; } }
Acest solicitant are mai multe proprietăți deoarece clasa Client are acele proprietăți care sunt salvate în alte tabele în baza de date. DevizeLunaCurenta s-a adăugat deoarece în interfață se lucrează mult cu devizele din luna curentă și pentru un plus de performanță se iau din baza de date doar acele devize pe baza acestei clase solicitant.
Fiecare clasă va avea clasa solicitant specifică ei. Toate clasele de tip solicitant sunt salvate în dosarul ,,Requesters”. Acest dosar face parte din dosarul părinte ,,Model” ce conține toate clasele necesare pentru ca sa funcționeze corect toate clasele manager.
În dosarul ,,Helpers” avem o singură clasă și anume Helper.cs. Această clasă este folosită pentru a face legăturile între clase.
III.6 Descriere view și viewmodel
View-urile și viewmodel-urile sunt părțile interfeței utilizator. În dosarul ,,Views” sunt fișierele grafice pentru interfață iar în dosarul ,,ViewModels” sunt clasele ce conțin logica din spatele interfeței.
Fiecare clasă viewmodel implementează GalaSoft.MvvmLight.ObservableObject din pachetul Galasoft. Pachetul Galasoft este utilizat pentru a implementa șablonul Model View ViewModel. ObservableObject este folosit pentru a atenționa proprietatea din fereastră ce este legată cu obiectul respectiv că acesta si-a schimbat valoarea. De exemplu dacă avem un element de tip TextBox în fișierul grafic (xaml) care are conținutul legat de o proprietate string din viewModel, atenționarea se face prin metoda ,,RaisePropertyChanged” [7].
Exemplu proprietate viewmodel:
public string Numar
{ get { return numar; }
set { numar = value;
RaisePropertyChanged(()=>Numar);
}
}
Legătura din view în viewmodel:
<TextBox Text="{Binding Numar, Mode=TwoWay, ValidatesOnDataErrors=True}" />
Prin ,,Binding Numar” se face legătura între proprietatea clasei viewModel și acest TextBox. Legătura între view și clasa ViewModel am realizat-o în liniile de cod prin proprietatea DataContext a obiectului de tip view [12].
Setare legătură:
var mvm = new ViewModel();
var view = new View();
view.DataContext = mvm;
view.ShowDialog();
Pentru comenzile butoanelor folosesc referința către GalaSoft.MvvmLight.Command.
Proprietatea comandă în clasa viewModel am declarat-o astfel [7]:
public RelayCommand Command { get; private set; }
Pentru fiecare comandă am creat o metodă ce realizează operațiile din spatele acelei comenzi. Exemplu declarare metodă:
Command = new RelayCommand([nume_metoda]);
Legătura dintre comanda unui buton și proprietatea comandă a clasei viewModel se face astfel [7]:
<Button Command="{Binding Command}" />
Pentru orice element din interfață legăturile sunt făcute în acest fel. Pentru elementele din fereastră care afișează liste de obiecte proprietatea din clasa viewmodel care este legată de fereastră este de tip ObservableCollection.
Pentru setările de privilegii ale utilizatorilor am folosit o proprietate în clasa angajat cu numele Tip. La pornirea aplicației se verifică utilizatorul logat pe acel calculator dacă există în baza de date și dacă da ce tip de utilizator este. În clasa Variables.cs se salvează informațiile despre acea sesiune de lucru.
public static class Variables
{
public static bool Administrator;
public static Angajat AngajatLogat;
public static string Calculator;
}
Codul pentru inițializarea aplicației:
private void InitializeSecurity()
{var angajatManager = new AngajatManager();
var result=angajatManager.GetByUsername(Environment.UserName);
if (result != null)
{if (result.Datas.Count == 1 )
{if (result.Datas.Single().Tip == TipUser.Admin)
{Variables.Administrator = true;
Variables.AngajatLogat = result.Datas.Single();
Variables.Calculator = Environment.MachineName;
}
else
{Variables.Administrator = false;
Variables.AngajatLogat = result.Datas.Single();
Variables.Calculator = Environment.MachineName;
}
Vizibil = Variables.Administrator;
}
else
{ RefreshUiStatus(new UIStatus{Flag = "Red",Message = "Sunt mai multi angajati definiti cu acelasi username in baza de date"});}
}
else
{
RefreshUiStatus(new UIStatus { Flag = "Red", Message = "Utilizatorul nu a fost gasit in baza de date" });
}
}
private void InitializeDetails()
{Version="Version:"+ Assembly.GetExecutingAssembly().GetName().Version.ToString();
RaisePropertyChanged(()=>Version);
User=Environment.UserName+"@"+Environment.MachineName;}
Acest cod se găsește în clasa viewmodel a ferestrei principale. Fereastra principală inițializează toate ferestrele secundare și așa fiecare fereastră afișează elementele specifice tipului de utilizator. Cum pot fi doar două tipuri: Administrator și utilizator normal, atunci am folosit pentru implementare în partea vizuală o proprietate bool. Un element este vizibil dacă acea proprietate are valoare true după inițializarea ferestrei.
Exemplu cod de activare element:
Visibility="{Binding Path= Vizibil, Converter={StaticResource BoolToVis}}"
III.7 Descriere funcționalitate aplicație
Aplicația pornește cu fereastra Meniu din care utilizatorul poate alege secțiune unde vrea să lucreze.
Figura 4 – Fereastră principală
În fereastra principală se afișează categoriile de lucru din aplicație, versiunea, utilizatorul și numele calculatorului pe care rulează.
Secțiunea de devize conține două mari părți:
Devize – unde se fac toate operațiunile pentru un deviz
Devize cu probleme – se afișează devizele din luna curentă care au numărul de ore înregistrare egal cu 0 sau mai mic decât numărul de ore trecut în contractual aferent devizului.
Partea de clienți:
Clienti – unde se pot vizualiza toți clienții, adăuga clienți noi, șterge, morfica
Clienti Oberview – pentru un client se pot administra locațiile, persoana de contact, contractele, devizele
În parte de angajați sunt:
Angajați – se afișează toți angajații, se pot modifica, șterge sau adăuga
Pontaj – aici fiecare angajat trebuie să introduce orele lucrate, sau concediul
La rapoarte este disponibil doar un raport care va fi legat de angajați. Ce au lucrat pe o perioadă de timp aleasă.
Partea de setări este pentru a face setările pentru baza de date, nu se afișează nimic, doar se salvează setările și se testează conexiunea.
Figura 5 – Fereastră devize cu probleme
Fereastra ,,Devize cu probleme” afișează devizele a căror ore lucrate sunt mai mici decât orele incluse în contract. Dacă devizul e cu roșu atunci nu s-a lucrat deloc pentru acel contract. În acest fel se verifică dacă angajații au trecut în deviz toate operațiunile care le-au desfășurat într-o zi.
Dacă se dă dublu click pe o linie se va deschide fereastra pentru devize cu acel deviz selectat.
Figura 6 – Fereastră administrare devize
Fereastra de administrare devize are rolul de a gestiona totul pentru un deviz.
Modul de lucru este ușor, se selectează în partea stângă clientul pentru care se dorește vizualizarea devizului. În partea de jos, sub lista clienților se dă click pe butonul ,,Afisare deviz” și va apărea fereastra de selectare a devizului dorit:
Figura 7 – Fereastră selectare deviz
În această fereastră se selectează luna și anul și se vor încărca devizele din acea perioadă. Butoanele de blocare și deblocare au rolul de a bloca/debloca un deviz pentru editare. Dacă devizul e blocat nu se vor mai putea introduce/șterge/modifica liniile. Aceste butoane sunt vizibile doar pentru administratorii aplicației.
La selectarea devizului interfața de selectare se va închide și fereastra mare va încărca devizul selectat. Utilizatorul va vedea liniile introduse, dacă s-a introdus ceva (în cazul în care nu sunt linii un mesaj va apărea în parte dea jos cum că devizul are 0 linii), va putea introduce/modifica/șterge linii.
Utilizatorul de tip administrator vede în partea de jos a ferestrei și costurile devizului până la acea data și poate exporta devizul în Word.
Fiecare linie are două tipuri de durată:
Durată efectivă – cât a luat efectiv angajatului să finalizeze operațiunea
Durată facturare – cât va fi facturat clientului. Se aplică regula de la telefonia mobilă unde dacă convorbirea a fost sub un minut clientul va plăti tot un minut.
Figura 8 – Fereastră administrare devize
În Figura 6 este prezentat modul de vizualizare pentru un utilizator fără drepturi de
administrator.
Figura 9 – Fereastră cu toți clienții
Fereastră ,,Toți clienții” afișează toți clienții companiei, cu nume, adresă, persoană de contact, persoană responsabilă (angajatul responsabil de acel client).
Aici se pot adăuga, edita sau șterge clienți. La editare sau inserare doar datele generale se manipulează, locațiile, contractele și devizele nu se pot edita din această fereastră.
Figura 10 – Fereastră vizualizare client
Interfața ,,Clienți Overview” este folosită pentru a manipula locațiile, contractele și devizele pentru clienți. Poate încărca doar un client odată.
Fiecare locație pentru un client are un nume, adresă, telefon, telefon mobil și număr km până la ea. Se Editează toate aceste detalii cu ajutorul interfeței de mai jos.
Figura 11 – Fereastră editare locație client
Fiecare contract are un număr pentru acel client, nume, data la care a fost înregistrat, ore incluse, cost ore incluse, cost oră suplimentară, Taxa pentru un km, taxa pentru cazare. Toate aceste date se pot modifica cu ajutorul ferestrei de mai jos
Figura 12 – Fereastră editare comandă client
Devizele sunt încărcate pentru o anumită lună și an. Fiecare deviz are prezentat antetul în această interfață cu proprietățile specifice: număr contractual la care este asignat, data, descrierea. Toate aceste proprietăți se pot modifica din interfața de mai jos.
Figura 13 – Fereastră editare antet deviz
Fereastra ,,Clienti Overview” se încarcă în funcție de drepturile utilizatorului. În Figura 9 este prezentată fereastra pentru un utilizator care nu este administrator.
Figura 14 – Fereastră vizualizare client
Contractele și editarea de client nu este disponibilă pentru acest tip de utilizator.
Fereastra ,,Angajati” afișează toți angajații companiei.
Figura 15 – Fereastră cu toți angajații companiei
Datele unu angajat pot fi modificate cu ajutorul interfeței prezentate în Figura 14.
Figura 16 – Fereastră editare detalii angajat
Dreptul de a modifica datele unui angajat îl are doar administratorul, pentru un utilizator normal nu sunt activate acele butoane și nici coloanele ce descriu costul/oră.
Fereastra de pontaj afișează pontajul pentru un anumit angajat. Această fereastră nu depinde de drepturile pe care utilizatorul le are, este la fel pentru toți. Tot aici se pot modifica, adăuga înregistrări în pontaj.
Figura 17 – Fereastră vizualizare pontaj
Fereastra ,,Raport” este activă doar pentru administrator. Ea afișează raportul pentru o perioadă de timp pentru un angajat.
Figura 18 – Fereastră raport pentru angajat
Raportul se poate și exporta în fișier excel. Pentru fiecare client se va genera o foaie de lucru nouă în care se va preciza contractual și liniile din deviz introduse. Un exemplu este în Figura 17.
Figura 19 – Document exportat din raport
Ultima foaie de lucru prezintă un sumar al raportului și este prezentat în Figura 18:
Figura 20 – Foaie de lucru sumar al documentului exportat din raport
Sumar este format din orele trecute în pontaj, orele suplimentare, ore lucrate la sfârșit de săptămână, ore lucrate efectiv și ore facturate pentru clienți.
Fereastra ,,Setari” ajută la configurarea setărilor pentru conexiunea cu baza de date.
Figura 21 – Fereastră setări bază de date
Capitolul IV. Aspecte economice si manageriale
Unul din domeniile delicate ale teoriei economice și manageriale îl reprezintă eficiența și eficacitatea, pe de o parte, datorită complexității celor două categorii economice și pe de alta parte, datorită greutăților reale înregistrate în comensurarea lor [18].
Urmărirea angajaților la locul de muncă poate fi efectuată în mai multe feluri:
înregistrare pontaj și acces prin cartela de pontaj
Urmărire operații efectuate prin aplicații instalate pe calculatoare ce înregistrează tot ce se lucrează pe acel calculator
Înregistrarea operațiunilor efectuate de un angajat într-un anumit interval de timp
Instalarea camerelor video pentru a vedea fiecare mișcare a angajaților
Aplicația prezentată în această lucrare se încadrează în categoria programelor ce înregistrează munca efectuată într-un anumit interval de timp.
Aceste tehnici de monitorizare a angajaților pot avea efecte negative sau pozitive. Efectele pozitive sunt atunci când angajatul nu se simte frustrat sau agasat de aceste sisteme de supraveghere. Orice incomodare adusă de aceste sisteme poate avea efecte negative asupra angajaților, mediului de lucru și a productivității muncii. Dacă productivitatea scade automat atrage după sine și diminuarea profitabilității organizației.
Implementarea unor astfel de aplicații din partea managerilor trebuie făcută astfel încât angajații să o simtă ca o unealtă de ajutor, nu ,,ceva nou ce încurcă mai mult”.
Un sistem de înregistrare a muncii făcute de un angajat într-o zi este benefic pentru o afacere deoarece administratorul poate vizualiza cum decurge munca angajaților într-o anumită zi, sau perioadă de timp. Acest sistem ajută și la prioritizarea muncii de către angajați. Ei știu ce au de făcut dar prin înregistrarea în sistem a lucrului deja efectuat pot avea o viziunea mai clară asupra situației de la acel moment. Acest mod de lucru duce în viitor la o mai bună apreciere a timpului necesar realizării anumitor lucrări sau operațiuni.
Partea negativă a unui program de înregistrare a muncii efectuate apare atunci când managerul folosește această unealtă împotriva persoanelor din subordine. Unii șefi de echipă pot fi agasanți prin întrebări de genul: ,, De ce a durat atât de mult?” puse în mod excesiv angajaților fiind conștienți de faptul că acea operațiune nu putea fi dusă la bun sfârșit mai repede.
Un alt beneficiu al programelor de tip înregistrare timp de lucru este acela de a genera rapoarte clienților pentru a confirma prețul serviciilor. De asemenea angajații își pot evidenția munca în diferite ocazii sau ședințe.
O altă componentă utilă, pentru un șef de echipă, a acestei aplicații este aceea de pontaj. Prin pontaj se vede câte ore a lucrat fiecare angajat și dacă un angajat este sau nu în concediu, deci dacă se poate baza pe el sau nu.
Partea economică a acestei aplicații se referă la gestionarea veniturilor și a tarifelor pentru clienți.
Aplicația poate fi extinsă cu anumite rapoarte specifice pentru clienți. Aceste rapoarte sunt dezvoltate sau modificate în funcție de cererile managerilor.
Majoritatea organizațiilor includ în prețul total, pentru un serviciu efectuat, costurile cu transportul, costurile cu efectuarea lucrării și costurile de cazare, dacă e nevoie. Dacă la un moment dat un manager dorește să verifice pentru un client dacă veniturile de la acel client acoperă costurile, cu această aplicație acest lucru este posibil prin anumite rapoarte.
Generările de rapoarte se pot face direct din baza de date sau se pot dezvolta în aplicație la cerere.
Prin componenta de pontaj a aplicației se pot vizualiza și anumite costuri cu angajatul:
Câte ore plătite are
Câte ore suplimentare are
Cât concediu plătit sau câte zile neplătite are
Pentru o companie mică sau mijlocie această aplicație, sau una asemănătoare, poate ajuta foarte mult la îmbunătățirea modului de lucru, a organizării sarcinilor și a calcului corect a prețurilor.
Concluzii
Pe parcursul acestei lucrări au fost prezentate cele mai importante elemente ce o compun:
structura proiectului
legătura cu baza de date și modul de interogare în baza de date (storage)
tabelele ce conțin baza de date
clasele principale și cele auxiliare ce duc la buna funcționare a sistemului
structura și aspectele teoretice ale interfeței utilizator
Cu ajutorul acestei aplicații administratorul unei companii poate gestiona cu ușurință devizele pentru clienți, custurile cu aceștia, dar și operațiunile făcute de angajați într-un anumit interval de timp.
Un alt avantaj al aplicației constă în utilizarea bazei de date MySQL care poate gestiona date de mari dimensiuni. Setările pentru copiile de rezervă ale serverului se fac cu ușurință iar în cazul în care trebuie făcută o restaurare a datelor procesul se derulează cu ușurință.
Pentru această aplicație mi-am propus să dezvolt toate modulele principale ce o compun. Aceste module sunt:
parte de client cu: date client, devize, locații, contracte
partea de angajați: datele angajaților, pontajul acestora
Din ce mi-am propus la începutul lucrării pot spune că am dus totul la bun sfârșit dar am adăugat și două părți importante:
partea de control acces în aplicație în funcție de tipul de utilizator
raportul pentru un angajat
Contribuția mea la această lucrare a fost în proporție de 100% pe partea de dezvoltare a codului sursă, interfeței utilizator și a bazei de date și de 80% pe partea de funcționalitate finală. Pentru funcționalitatea finală am consultat managerul firmei unde aplicația urmează să fie implementată.
Posibilele dezvoltări ulterioare ar fi:
accesul în funcție de utilizator să fie mai flexibil
printr-o interfață să se poată adăuga tipuri noi de utilizatori cu acces diferit
integrarea cu un server de tipul Active Directory de la Microsoft
mai multe rapoarte accesibile din interfață
Pentru o implementare de început a aplicației funcționalitatea prezentată în lucrare e suficientă. Se pot face pașii principali pentru a folosi pe viitor aplicația în întregime.
Bibliografie
Pro C# 5,0 and the .NET 4.5 Framework – Andrew Troelsen, Ed. Apress, 2012
Professional C# 5.0 and .NET 4.5.1 – Cristian Nagel, Ed. Wiley, 2014
Professional Visual Studio 2012 – Bruce Johnson, Ed. WROX PRESS, 2012
Microsoft SQL Server 2012 Step by step – Mike Hotek, Ed. Microsoft Press, 2013
Microsoft SQL Server 2012 Internals – Kalen Delaney, Ed. Microsoft Press, 2013
Head First Design Patterns – Elisabeth Freeman, Ed. O’REILLY, 2004
Raise propety changed: http://stackoverflow.com/questions/2429140/automatically-raise-propertychanged-when-an-inner-object-property-got-changed – Dată vizualizare: 20.05.2016
.Net Framework: http://en.wikipedia.org/wiki/.NET_Framework – Dată vizualizare: 20.05.2016
WPF: http://en.wikipedia.org/wiki/Windows_Presentation_Foundation – Dată vizualizare: 15.05.2016
WPF: http://msdn.microsoft.com/en-us/library/ms754130(v=vs.110).aspx – Dată vizualizare: 15.05.2016
Model View ViewModel: http://en.wikipedia.org/wiki/Model_View_ViewModel – Dată vizualizare: 18.05.2016
Implementare Model View ViewModel: http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx – Dată vizualizare: 18.05.2016
Model View ViewModel: http://wpftutorial.net/MVVM.html – Dată vizualizare: 18.05.2016
Baze de date MySql: https://en.wikipedia.org/wiki/MySQL – Dată vizualizare: 22.05.2016
Licențiere MySql: http://www.mysql.com/about/legal/licensing/oem/ – Dată vizualizare: 22.05.2016
Produse MySql: https://www.mysql.com/downloads/ – Dată vizualizare: 22.05.2016
Produse MySql : https://www.mysql.com/products/ – Dată vizualizare: 22.05.2016
Eficiența și eficacitatea managementului organizației: http://www.rasfoiesc.com/business/management/Eficienta-si-eficacitatea-mana74.php – 05.06.2016
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: Aplicatie de Gestiune Devize (ID: 109925)
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.
