Sunteți pe pagina 1din 44

Universitatea POLITEHNICA București

Facultatea Automatică şi Calculatoare


Departamentul Automatică şi Informatică Industrială

LUCRARE DE LICENŢĂ

Aplicație web pentru pontaj și emitere facturi

Coordonator Absolvent

Conf. Dr. Ing. Andreea Udrea Bӧgӧzi Alice Alexandra

2016

0
Cuprins

1. Introducere ..................................................................................... 2
1.1 Scopul lucrării ......................................................................................... 2
1.2 Comparație cu alte aplicații similare ....................................................... 2
2. Descrierea aplicației și funcționalitățile acesteia ............................... 7
2.1.1 Modulul My account ...................................................................... 7
2.1.2 Modulul Config ............................................................................ 11
2.1.3 Modulul Management .................................................................. 21
2.1.4 Modulul Finance .......................................................................... 23
3. Prezentarea tehnologiilor folosite ................................................ 26
4. Arhitectura aplicației și baza de date ........................................... 30
5. Concluzii și dezvoltări ulterioare ................................................. 42
6. Bibliografie .................................................................................. 44

1
1. Introducere
1.1 Scopul lucrării

În zilele noastre, majoritatea companiilor au început să ofere pentru angajații săi programe de
lucru flexibile. Totodată, datorită faptului că oamenii nu mai au un program fix de lucru, este
necesar un program prin care să se poată ține cont cât a lucrat fiecare angajat într-o anumită zi
sau lună și la ce anume.
Din acest motiv, am considerat că poate fi necesar un program de pontaj pentru angajați, dar
care să ofere, în același timp, și un sistem de management pentru administratori.
Prin această aplicație administratorii companiilor au la dispoziție un modul de management
prin care să poată adăuga, modifica și șterge proiecte, utilizatori, activitați, concedii, etc.
Angajații pot să își logheze orele lucrate, să facă cereri de concediu și să vizualizeze rapoarte
pentru acestea.
De asemenea, administratorii pot să facă și facturi pentru clienții companiei în funcție de
orele lucrate la proiectele acestora.
Consider că prin aplicația Timelog, companiile pot să realizeze cele mai comune și frecvente
activități de management a resurselor umane, dar nu numai.

1.2 Comparație cu aplicații similare

Pe piaţă mai există aplicaţii similare, care sunt prezentate în tabelul 1.1.

Nume aplicaţie / Feature Timelog SVT pass Pontaj Human My Staff


web Online resources Time
planning

Tehnologie web x x x

Adăugare / editare / x x
ştergere utilizatori

Adăugare / editare / x x

2
ştergere proiecte

Adăugare / editare / x
ştergere faze

Adăugare / editare / x
ştergere activitati

Adăugare / editare / x
ştergere roluri

Emitere facturi clienților x


în funcţie de orele lucrate
la proiectele acestora

Nivel acces pe baza de x x x


utilizator şi parolă

Drepturi utilizator x
configurabile

Asignare utilizatori în x x
proiect

Asignare faze în proiecte x

Cereri concediu x x x

Configurare tipuri x
concedii

Aprobare / respingere x x x
cerere concediu

Situaţii concedii x x

3
Notificare prin email la x x
cerere concediu

Notificare prin email la x


aprobare / respingere
cerere concediu

Ore suplimentare / ore de x x


noapte

Delegaţii / evenimente x

Bilet de voie x

Program de lucru x x

Raport pt întârzieri / pauze x

Foaie colectivă de x
prezenţă

Fişă de pontaj x x

Export fişă pontaj pdf / xls x

Calcul salariu pe baza x x


pontajului

Logare ore x x x

Logare ore: selectare x x


interval orar

Logare ore: alegere proiect x x

Logare ore: alegere task x

4
Logare ore: introduce x x
descriere

Logare ore: alege fază x

Logare ore: alege dată x x

Afişare loguri din ziua x x


curentă cu posibilitate de
ştergere

Afişare toate logurile x x x

Afişare nr total de ore x x

Tabel 1.1 – Aplicații similare conform [13],[17],[18],[22]

Consider că aplicaţia mea este mai bună decât aplicaţiile deja existente deoarece are mai
multe opţiuni decât acestea. Spre deosebire de majoritatea aplicaţiilor existente pe piaţă, Timelog
are posibilitatea ca administratorii să adauge, modifice, şteargă și asigneze utilizatori, faze,
proiecte, activtități.
Un alt plus faţă de majoritatea aplicatiilor deja existente este faptul că utilizatorii își pot
aloca ore în funcţie de proiect, fază şi activitate şi pot vedea numărul total de ore lucrate. De
asemenea, utilizatorii își pot face cereri de concediu și pot să vadă situaţia numărul zilelor de
concediu, lucru pe care o parte din aplicaţiile existente nu îl oferă.
Ca minusuri faţă de alte aplicaţii, este faptul că Timelog nu are implementată gestiunea
orelor suplimentare, managementul delegaţiilor şi proiectarea foilor colective de prezenţă, dar
aceste opțiuni se pot adăuga cu ușurință în viitor prin extinderea bazei de date și a interfeței.
În una din aplicații, administratorii primesc mail de fiecare dată când un angajat face
cerere de concediu, lucru care nu am reușit să îl implementez în aplicația mea.
Per total, comparativ cu celelalte aplicaţii, consider că Timelog este cea mai complexa
dintre acestea. Pe lângă acest lucru, Timelog este o aplicaţie generică și poate fi folosită pentru
firme cu diverse domenii, dar şi pentru instituţii precum cabinet medicale, cabinete de avocatură,
etc.

5
Tocmai de aceea, aplicaţia are implementat și un modul de emitere facturi în funcţie de
orele lucrate de angajaţi pe anumite proiecte, care este foarte util firmelor
de avocatură sau firmelor specializate în IT.
În capitolul doi am descris pe larg aplicația, din punct de vedere al interfeței utilizator,
funcționalităților și al bazei de date.
În capitolul trei am vorbit despre tehnologiile pe care le-am folosit pentru implementarea
aplicației.
În capitolul patru am descris arhitectura aplicației și cea a bazei de date, iar în capitolul
cinci am evidențiat câteva concluzii referitoare la aplicație.

6
2. Descrierea aplicației și funcționalitățile acesteia
Am ales să împart aplicația în mai multe module, denumite generic, pentru a fi mai ușor
utilizatorilor să ajungă pe paginile dorite, acestea fiind organizate. Cele trei module sunt: My
Account (Fig. 1.1), Config (Fig. 1.7), Management (Fig. 1.24) și Finance (Fig. 1.29).

2.1 Modulul My Account

În modulul My account (Fig. 1.1) utilizatorii au mai multe posibilitați:

Fig. 1.1 – Submeniu My account

Să logheze ore pentru ziua curentă (Fig. 1.2). Pentru logarea orelor, utilizatorul trebuie să
selecteze proiectul, faza și activitatea la care a lucrat. Acestea sunt luate din baza de date,
ținându-se cont la care din acestea are dreptul să logheze utilizatorul.
Pentru a finaliza procesul de logare, utilizatorul trebuie să introduca timpul lucrat (ex: 6h
30m) și dacă dorește, să adauge o descriere. Formularul de logare ore nu se poate submita fără
câmpurile obligatorii, adică proiectul, faza, activitatea și numărul de ore.
Dupa ce acesta adaugă orele lucrate, apare mesajul de succes și i se afiseaza într-un tabel
toate orele introduse în ziua curentă și numărul total de ore lucrate la acea fază și la acel proiect.
Acestea pot fi folositoare dacă pentru anumite proiecte sau faze se dorește un număr maxim de
ore lucrate.
De asemenea, dacă utilizatorul observă că a greșit ceva, are posibilitatea să modifice
numărul de ore sau descrierea, sau să șteargă acel log.
De menționat faptul că aplicația nu permite utilizatoriilor obișnuiți să modifice sau să
ștearga decât orele logate în ziua curentă, decât dacă acestora li se dau dreptul la pagina Update
Worklogs (Fig. 1.28).

7
Fig. 1.2 – Pagina Log work

Utilizatorii mai au posibilitatea să își vadă cererile de concediu sau să facă altele noi.
Dacă utilizatorul selectează opțiunea My holidays (Fig. 1.3), acesta este dus pe o nouă pagină,
unde îi apar toate cererile de concediu din anul curent.
Pentru fiecare cerere se afișează data când aceasta a fost facută, perioada pentru care s-a
cerut concediu, câte zile lucratoare sunt cuprinse în acel interval și la câte zile mai are dreptul (în
funcție de tip), ce tip de concediu este (cu plată, fără plată, de studii, sărbătoare legală...), statusul
acesteia și supervizorul (cel care a acceptat sau refuzat cererea).
De asemenea, dacă utilizatorul are cereri care nu au fost încă procesate, acesta are
posibilitatea să le șteargă. Toate cererile pot fi filtrate după status și după perioada concediului.
Tot pe această pagină (Fig. 1.3), utilizatorul vede câte zile de concediu are luate în anul
curent, câte mai are disponibile și poate să își facă o noua cerere de concediu.
.

8
Fig. 1.3 – Pagina My holidays

Pentru a crea o noua cerere, în pagina de cere concediu (Fig. 1.4), acesta trebuie să
selecteze data de început, data de sfârșit și tipul de concediu

Fig. 1.4 – Pagina Ask for leave

9
Utilizatorii au și posibilitatea să vadă numărul total de ore logate ale tuturor angajaților
sau fiecare log în parte. Pe pagina de My worklogs (Fig. 1.5), implicit, utilizatorul poate să vadă
numărul de ore lucrate de fiecare angajat per proiect în luna curentă și numărul total de ore din
luna curentă.
De asemenea, toate aceste date pot fi filtrate în funcție de angajat, proiect, fază și dată,
dacă utilizatorul dorește să vadă numărul total de ore doar pentru el sau doar cele lucrate pe un
anume proiect sau pe o fază anume. Filtrarea după dată permite utilizatorilor să vadă numărul de
ore logate pentru orice perioadă de timp.

Fig. 1.5 – Pagina My Worklogs

Dacă utilizatorul selectează Project history (Fig. 1.6) îi apare pagina cu toate logurile
angajaților din luna curentă. Aceste date, de asemenea, pot fi filtrate în funcție de angajat,
proiect, fază și dată, pentru a putea vedea cum a fost împărțit timpul lucrat la un proiect sau o
fază și ce anume au făcut angajații în acele ore, adică descrierea log-ului.

10
Fig. 1.6 – Pagina Project history

2.2 Modulul Config

În modulul Config (Fig. 1.7) utilizatorul are următoarele posibilități:

Fig. 1.7 – Submeniu Config

- În pagina de proiecte (Fig. 1.8), utilizatorul vede lista de proiecte și pentru fiecare id,
nume, risc, flag de activ, prioritate, faze, număr de ore lucrate, manager, executiv și client.

11
Acestea pot fi filtrate și sortate in funcție de id, nume, manager, executiv, client, activ,
numărul de ore lucrate, risc și prioritate. De aici se pot și crea noi proiecte sau edita cele deja
existente.

Fig. 1.8 – Pagina Projects

Pentru fiecare proiect există posibilitatea de editare, dezactivare, de asignare faze sau
utilizatori.
În pagina de asignare faze pentru proiecte (Fig. 1.9) există o listă cu fazele active și
pentru fiecare, câte un checkbox pentru ca utilizatorul să afle dacă urmeaza să contribuie la fază
sau să aleagă faza respectivă.
Tot pentru fiecare fază, se poate vedea câte ore s-au lucrat în respectivul proiect și se
poate modifica data de începere și de terminare a fazei și numărul de ore contractate pentru acea
fază.

12
Fig. 1.9 – Pagina Project phases

În pagina de asignare utilizatori (Fig. 1.10) se încarcă o listă cu utilizatorii activi și câte
un checkbox pentru fiecare pentru a selecta dacă aceștia sunt sau nu asignați proiectului.

Fig. 1.10 – Pagina Project users

13
Pagina de editare proiect (Fig. 1.11) este la fel ca cea de creare proiect, doar că sunt
câmpurile deja completate pentru proiectul care este editat. Câmpurile ce pot fi setate sunt
numele, proritatea, managerul și executivul, clientul ce deține proiectul și dacă acesta este sau nu
activ.

Fig. 1.11 – Pagina Edit Project

- În pagina de utilizatori (Fig. 1.12), este prezentată lista utilizatorilor activi, care pot fi
sortați după nume, email, username și flag de activ. Pentru fiecare utilizator se prezintă numele,
email-ul, username-ul, flag-ul de activ și rolurile pe care acesta le are. De asemenea, utilizatorii
pot fi filtrați după mai multe criterii, precum nume, email și username. În dreptul fiecărui
utilziator există și două butoane ce permit editarea sau dezactivarea acestora.

14
Fig. 1.12 – Pagina Users
Tot din pagina Users (Fig. 1.12) se poate ajunge pe pagina de creare utilizator sau editare
utilizator (Fig. 1.13) unde se pot seta numele, username-ul, adresa de email, numărul de zile de
concediu de odihnă disponibile pe an, rolul și dacă acesta este sau nu activ.

Fig. 1.13 – Pagina Edit User

15
Tot din interfața de Users (Fig. 1.12) se poate ajunge și pe pagina User Rights (Fig. 1.14),
de unde se poate selecta utilizatorul și i se pot da sau lua drepturi pentru anumite module sau
submodule. Această interfață este utilă dacă pentru un utilizator cu drepturi date de un anumit rol
se dorește acordarea sau limitarea anumitor drepturi.

Fig. 1.14 – Pagina Users rights

În pagina de roluri (Fig. 1.15) este afișată lista rolurilor cu nume, descriere și posibilitatea
de a le edita sau șterge.

Fig. 1.15 – Pagina Roles

16
În pagina de creare sau editare roluri (Fig. 1.16) există posiblitatea de adăugare sau
editare a numelui rolului, descrierii și activarea sau dezactivarea acestora.

Fig. 1.16 – Pagina Edit Role


Din pagina principală de roluri (Fig. 1.15) se poate ajunge și pe pagina de Role rights
(Fig. 1.17), de unde se poate selecta pe ce module vor avea sau nu dreptul angajații cu rolul
respectiv.

Fig. 1.17 – Pagina Roles rights

17
În pagina de faze (Fig. 1.18) sunt afișate toate fazele active cu posibilitatea de filtrare și
sortare în funcție de nume, prioritate și dacă sunt sau nu active sau standard.

Fig. 1.18 – Pagina Phases


De aici se poate ajunge și pe pagina de creare sau editare faze (Fig. 1.19), de unde se pot
adăuga sau modifica numele, prioritatea și se poate seta dacă faza este activă sau standard.

Fig. 1. 19 – Pagina Edit Phase

18
În pagina de activități (Fig. 1.20) sunt toate activitățile afișate cu nume, prioritate și
opțiuni (editare, ștergere). De aici se pot adăuga sau edita activitățile deja existente.

Fig. 1.20 – Pagina Activities

În pagina de creare sau editare activități (Fig. 1.21) există posiblitatea de adăugare sau
editare a numelui activității și a priorității acesteia.

Fig. 1.21 – Pagina Edit Activity

În pagina de clienți (Fig. 1.22), este prezentată lista clienților activi, care pot fi filtrați și
sortați după nume, email, adresă și flag de activ. Pentru fiecare client se prezintă numele, email-
ul, adresa și flag-ul de activ.
Tot de aici se poate ajunge pe paginile de creare client, editare client sau se pot dezactiva
unul din cei deja existenți.

19
Fig. 1.22 – Pagina Customers

Când se ajunge pe pagina de creare sau editare clienți (Fig. 1.23) utilizatorii au
posiblitatea de adaugare sau editare a numelui, email-ului și adresei clienților, dar și activarea
sau dezactivarea acestora.

Fig. 1.23 – Pagina Edit Customer

20
2.3 Modulul Management

În modulul Management (Fig. 1.24) utilizatorul poate să vadă concediile și să updateze


worklog-urile.

Fig. 1.24 – Submeniu Management

Dacă utilizatorul intră în pagina de concedii (Fig. 1.25), i se afișează o listă cu toate
concediile din anul curent, ordonate în funcție de dată. Acesta are posibilitatea să le filtreze
și/sau ordoneze în funcție de utilizator, data cererii, supervizor, status, tip și data concediului. De
asemenea, pentru fiecare concediu în parte există posibilitatea de a-i modifica statusul in
pending, accepted sau denied.

Fig. 1.25 – Pagina All Holidays

21
De aici, se poate ajunge in pagina de cereri în așteptare (Fig. 1.26), unde se pot aproba
sau respinge cererile care sunt înca în așteptare.

Fig. 1.26 – Pagina Pending holidays

Tot din pagina de Holidays (Fig. 1.25) se poate ajunge și în pagina de Manage leave days
(Fig. 1.27). Aici se afișeaza lista tuturor utilizatorilor activi, și pentru fiecare numărul total de
zile de concediu, numărul de zile rămase, anul în care au fost updatate ultima oară zilele de
concediu și opțiuni (decide mai târziu, reporteaza zilele sau plătește zilele).

Fig. 1.27 – Pagina Manage users holidays

Dacă utilizatorul selectează pagina Update worklogs (Fig. 1.28) acesta are posibilitatea să
updateze logurile angajaților pentru zile din trecut. Utilizatorii au dreptul să își logheze ore doar
pentru ziua curentă, dar dacă au uitat sau au greșit ceva într-o anumită zi, pot lua legătura cu
administratorii, sau cu alte persoane care au acces pe această pagină pentru a le actualiza/
modifica log-urile.

22
Fig. 1.28 – Pagina Update workogs

2.4 Modulul Finance

În modulul Finance (Fig. 1.29) administratorii au posibilitatea sa creeze facturi pentru


clienți.

Fig. 1.29 –Modul Finances

Atunci când utilizatorii intră în pagina Invoices (Fig. 1.30), se afișează lista cu toate
facturile emise și, pentru fiecare, data când a fost emisă, pentru ce proiect a fost emisă, perioada
pentru care a fost emisă și numele clientului.
Utilizatorul are posibilitatea să descarce factura în format .pdf sau să o șteargă. Lista
poate fi sortată și filtrată în funcție de data emiterii, data de început sau de sfârșit a perioadei
facturate, dar și în funcție de proiect sau cumpărător, pentru ca utilizatorul sa poată căuta o
anumită factură ușor.

23
Fig. 1.30 – Pagina Invoices

Dacă utilizatorul dă click pe butonul Make a new invoice, acesta ajunge într-o pagină
(Fig. 1.31) unde poate sa creeze o nouă factură. Aici, utilizatorul trebuie să introducă perioadele
pentru care dorește să emită factura si proiectul pe care dorește să îl factureze.

Fig. 1.31 – Pagina Make a new invoice

24
În momentul în care utilizatorul submitează formularul de creare factură, acesta este
redirecționat către pagina de listare a facturilor (Fig. 1.30), de unde poate sa o descarce în format
pdf (Fig. 1.32). Factura este construită automat, ținându-se cont de perioadă, numărul de ore
lucrate. Completarea facturii se face automat căutând în baza de date ce client deține proiectul
respectiv si tariful pentru fiecare proiect.

Fig. 1.32 – Factură

25
3. Prezentarea tehnologiilor folosite
Pentru construirea aplicației am folosit limbajul de programare PHP, împreună cu Laravel,
HTML, CSS, JQuery si Bootstrap, pentru baza de date am folosit MySql, iar pentru serverul
web, am folosit Apache. Codul a fost scris în IDE-ul PhpStorm.
PHP (Hypertext Preprocessor) este un limbaj open source care este folosit, în general, pentru
aplicații web. PHP este un limbaj ușor de utilizat datorită faptului că paginile conțin atât cod, cât
și HTML. În PHP, spre deosebire de limbaje client-side, codul se execută pe server, generând
HTML, care este mai apoi trimis către client.
Clientul primește rezultatele, dar fără sa știe care a fost codul din spatele acestuia. PHP este
totodată un limbaj destul de simplu pentru începători, dar oferă și multe caracteristici avansate
pentru programatori cu experiență. PHP permite crearea de formulare și colectarea datelor din
acestea, generarea conținutului dinamic în pagini sau trimiterea și primirea cookie-urilor.
PHP poate fi utilizat pe majoritatea sistemelor de operare, cum ar fi Linux, Unix (aproape
toate variantele), Windows sau MAC OS, conform [11]. De asemenea, PHP are suport și pentru
majoritatea serverelor, cum ar fi Apache și IIS, conform [19]. Deci, PHP oferă libertatea de a
alege sistemul de operare și serverul web pe care să ruleze, dar și folosirea programării
procedurale, sau a celei orientate pe obiect. Una dintre cele mai importante caracteristici ale PHP
este faptul că suportă o gamă largă de baze de date.
Conform [15], principalele domenii unde este folosit PHP sunt:
- Server-side scripting: aceasta este cea mai tradițională utilizare a PHP-ului. Nu este
nevoie decât de un server web, un browser web și un parser de PHP. Rezultatele se
pot vedea pe paginile web pe browser prin server.
- Scrierea aplicațiilor desktop: Deși PHP nu este cel mai potrivit limbaj pentru crearea
aplicațiilor desktop cu interfața grafică pentru utilizator, se poate face acest lucru
utilizând caracteristicile avansate ale PHP.

Laravel este un framework open source care ajută sau simplifică cele mai comune
activități utilizate în programarea web, cum ar fi autentificarea, rutarea, lucrul cu sesiune și
folosirea cache-ului. Acesta permite dezvoltarea de aplicații după modelul MVC (model – view –
controller).

26
Laravel oferă o sintaxa nouă, mai ușor de utilizat decât clasica sintaxă PHP. Laravel are
și o interfață linie de comandă, numită Artisan, care oferă mai multe comenzi utile ce pot fi
folosite pe timpul dezvoltării aplicației.
Conform [9], acesta are mai multe caracteristici: Bundle (sistem de packaging modular),
Eloquent ORM (object-relational mapping - care oferă metode interne de aplicare a
constrangerilor asupra relațiilor dintre obiectele bazei de date), Query Builder (oferă o alternativă
mai directă de acces la baza de date cu Eloquent ORM; acesta oferă un set de metode și clase
capabile de interogări), controllere de tip REST (separă logica dintre cererile de tip GET și
POST) și template-uri de tip Blade (care oferă un set de structuri proprii de control, ce sunt
mapate intern cu corespondenții din PHP).
JQuery este o bibliotecă open source de JavaScript care simplifică partea de HTML.
JQuery are o sintaxă ce face mai ușoară navigarea într-un document, crearea animațiilor,
utilizarea evenimentelor și dezvoltarea aplicațiilor Ajax. Conform [6], JQuery, este de fapt, o
bibliotecă DOM (Document Object Model) ce are o sintaxă simplificată pentru selectarea si
manipularea elementelor dintr-o pagină web. Folosind JQuery se poate scrie foarte ușor codul
JavaScript separat de HTML. De asemenea, JQuery este suportat de majoritatea browserelor,
conform [14].
HTML (HyperText Markup Language) este limbajul standard de creare al paginilor web.
Împreună cu CSS și JavaScript, acesta reprezintă temelia pentru crearea paginilor web. HTML
descrie structura unei pagini web. HTML permite integrarea imaginilor și a altor tipuri de obiecte
pentru a crea documente structurate (titlu, paragraf, listă, etc).
Elementele HTML sunt delimitate de tag-uri, care sunt interpretate de browsere pentru a
afișa conținutul paginilor. HTML încorporează script-uri de JavaScript ce pot modifica paginile
web. Nu am folosit HTML 5 (ultima versiune) deoarece Internet Explorer, un browser destul de
folosit, încă nu suportă această versiune.
CSS (Cascading Style Sheet) este un limbaj folosit pentru prezentarea unui document
scris în HTML. CSS a fost dezvoltat, în primul rând, pentru a permite separarea conținutului
documentului de prezentarea documentului, incluzând aspecte precum culori, font, aspect.
Această separare imbunătățește accesibilitatea conținutului și oferă mai multă flexibilitate prin
faptul că tot codul CSS este ținut într-un fișier separat.

27
Modificări ale design-ului unui document se pot face foarte ușsor prin editarea unor linii
din fișierul .css pe care documentul îl folosește. CSS are o schemă de prioritate pentru a
determina ce reguli se aplică unui element dacă mai mult de una i se potrivește.
Bootstrap este un framework open source pentru front-end folosit pentru proiectarea site-
urilor și aplicațiilor web. Acesta conține template-uri bazate pe HTML și CSS pentru tipografie,
formulare, butoane, navigare și alte componente de interfață. Acesta este compatibil cu cele mai
recente versiuni ale browserelor. Conform [3], începând cu versiunea 2.0, Bootstrap sprijină
design-ul responsive, însemnând ca aspectul paginilor se ajustează dinamic în funcție de
caracteristicile dispozitivului utilizat.
AJAX (Asynchronous JavaScript și XML) este folosit pentru request-ui asincrone prin
HTTP, conform [1]. Prin AJAX se pot trimite și primi informații de la și către server de mai
multe tipuri, cum ar fi JSON, XML, HTTP. AJAX este foare bun pentru faptul că toate
schimburile de informații se întâmplă fără să fie nevoie ca pagina să fie actualizată, în mod
dinamic și pentru că permite schimbarea unor porțiuni doar pe baza evenimentelor.

Datepicker este un plugin al jQuery folosit pentru calendare interactive ce sunt legate de
câmpuri de tip input pentru a stoca valori de tip date. Funcția pentru acesta arată ca în secvența
de cod de mai sus. Datepicker oferă practic o interfață grafică printr-un pop-up în care
utilizatorul poate alege data și ora pentru a ușura modul de introducere a datei de către utilizator,
conform [7].
Acesta oferă și avantaje precum validarea câmpurilor de data pentru un interval (ex: dacă
se setează o dată de început, utilizatorul nu va putea seta o dată de sfârșit mai mică decât cea de
început) sau validarea datelor posibile (ex: datepicker nu va accepta opțiune de 30 februarie).
Deși HTML 5 oferă și el câmp de dată, am ales să folosesc datepicker deoarece acesta este
suportat și de Internet Explorer, spre deosebire de HTML5.

28
Apache HTTP Server este cel mai folosit soft open source de tip server web, conform [2].
Apache are foarte multe carcateristici, majoritatea implementate ca și module compilate ce
extind funcționalitatea de bază. Apache folosește virtual hosting, pentru a putea susține mai
multe site-uri web. Are mesaje de eroare ce pot fi configurabile, baze de date de autentificare și
poate fi susținut de mai multe interfețe grafice.
Apache suportă autentificarea cu parolă și cu certificat digital și se poate adapta în funcție
de nevoile fiecăruia, deoarece codul sursă este disponibil gratuit. Apache funcționează pe
sistemele moderne de operare, incluzând UNIX și Windows.
MySQL este un sistem open source de management al bazelor de date relaționale.
MySQL este unul dintre cele mai folosite sisteme de baze de date, folosit mai ales în aplicațiile
web. Conform [10], MySQL este scris în C si C++ și funcționează pe foarte multe sisteme de
operare, incluzându-le și pe cele mai populare (Linux, Windows, QNX).
Pe lânga faptul că permite accesarea datelor și manipularea acestora prin query-uri,
MySql are disponibilă și o interfață grafică prin care să se poată face aceste operațiuni. De
asemenea, acesta poate genera și schemele bazelor de date. După ce a fost testat, conform [19], s-
a constatat că este un server de baze de date rapid, stabil, multi-user și multi-threaded.
PhpStorm este un IDE pentru PHP dezvoltat de JetBrains IntelliJ IDEA. PhpStorm este
un editor de PHP, HTML și JavaScript, ce poate să analizeze codul pe masură ce este scris și
care poate să depisteze erorile.
PhpStorm permite completarea automată a codului PHP, știind cuvinte cheie și sintaxe.
Conform [5], PhpStorm permite instalarea de plugin-uri și știe foarte bine să lucreze cu
Symfony, Drupal, Wordpress, Zend, Laravel, Magento și alte framework-uri, dar și cu tehnologii
front-end precum HTML5, CSS, JavaScript, etc.
Pentru construirea facturilor am importat o librărie de PHP, numită SnappyPDF care știe
sa transforme cod HTML in fișiere PDF.

29
4. Arhitectura aplicației și baza de date
Aplicația este construită după modelul MVC (Model-view-controller), un model arhitectural
de software, folosit pentru interfețe utilizator pe computere. Acest model împarte aplicația în trei
părți interconectate, pentru a separa informațiile interne de informațiile prezentate utilizatorilor.
Nucleul modelului MVC îl reprezintă modelul, el fiind cel care gestionează datele și logica
aplicației. View-urile reprezintă ieșirile, adică ce anume vede utilizatorul, iar controller-ul este
cel care știe ce comenzi să execute în funcție de ce intrare primește.

Aplicația respectă structura impusă de Laravel, care este construită in formatul MVC.
Aplicația are opt controllere:
- AccountController: controller-ul unde se gestionează toate acțiunile ce țin de cont
(modulul MyAccount, schimbă parola)
- CustomersController: controller-ul unde se gestionează toate acțiunile ce țin de clienți
(creare/ editare/ ștergere clienți, afișare clienți, etc)
- FinancesController: controller-ul ce gestionează acțiunile ce țin de finanțe (adaugă
factura, listă facturi, descarcă factura)
- PhasesController: controller-ul ce gestionează acțiunile ce țin de faze (creare/ editare/
ștergere fază, afișare faze, afișare faze pentru proiecte, etc)
- ProjectsController: controller-ul ce gestionează acțiunile ce țin de proiecte (creare/
editare/ ștergere proiect, afișare proiecte, afișare activitați, creare/ editare/ ștergere
activitați, gestiune faze-proiecte, gestiune utilizatori-proiecte, etc)
- UsersController: controller-ul ce gestionează acțiunile ce țin de utilizatori (afișare
utilizatori, creare/ editare/ ștergere utilizatori, logare ore, afișare loguri, adaugă/
șterge/ aprobă/ respinge concedii, afișează concedii, adaugă/ editează/ șterge roluri,
gestiune roluri-utilizatori, gestiune drepturi-utilizatori, etc)
- AuthController: controller-ul ce gestionează acțiunile ce țin de logarea utilizatorilor în
aplicație.
- PasswordController: controller-ul ce gestionează acțiunile ce țin de parolă, resetare
parolă, etc.

30
Controller-ele apelează funcții din servicii, care sunt în număr de cinci:
- CustomerService: unde se țin toate funcțiile legate de clienți
- InvoiceService: unde se țin toate funcțiile legate de facturi
- PhaseService: unde se țin toate funcțiile legate de faze
- ProjectService: unde se țin toate funcțiile legate de proiecte
- UserService: unde se țin toate funcțiile legate de utilizatori

Serviciile apelează funcții din “repositories”, care sunt în număr de zece:


- AbstractRepository: unde sunt ținute funcții care sunt folosite în mai multe
repository-uri pentru a nu fi duplicate
- ActivityRepository: unde sunt ținute funcțiile pentru activitați
- CustomerRepository: unde sunt ținute funcțiile pentru clienți
- HolidayRepository: unde sunt țiute funcțiile pentru vacanțe
- InvoiceRepository: unde sunt ținute funcțiile pentru facturi
- PhaseRepository: unde sunt ținute funcțiile pentru faze
- ProjectRepository: unde sunt ținute funcțiile pentru proiecte
- RoleRepository: unde sunt ținute funcțiile pentru roluri
- UserRepository: unde sunt ținute funcțiile pentru utilizatori
- WorklogRepository: unde sunt ținute funcțiile pentru log-uri

Modelele sunt în număr de unsprezece, ele reprezintă tabele din baza de date și toate extind
BaseModel:
- Modelul Activity care are definită cheia primară a_id, are mappate coloanele a_name,
a_active, a_order și a_c_id cu name, active, priority și clientId și are definit un vector
fillable în care sunt trecute toate atributele ce pot fi modificate
- Modelul BaseModel în care sunt definite funcțiile hasMapping și setData. Acestea
sunt folosite pentru verificarea dacă modelele ce le apelează au mappări pentru
anumite atribute și pentru a seta atributele acestora.
- Modelul Customer care are definită cheia primară cu_id, are mappate coloanele
cu_name, cu_email, cu_adress, cu_c_id cu name, email, adress și clientId și are
definit un vector fillable în care sunt trecute atributele ce pot fi modificate

31
- Modelul Holiday care are definită cheia primară h_id, are mappate coloanele h_u_id,
h_date, h_start, h_end, h_ht_id, h_status_key, h_days, h_u_id_supervisor, h_c_id cu
userId, date, start, end, typeId, status, days, supervisorId și clientId și are definit un
vector fillable în care sunt trecute atributele ce pot fi modificate. Modelul Holiday are
definite și trei funcții user, supervisor și type prin care se definesc cheile străine către
tabelele (clasele) user și holiday_types
- Modelul HolidayTypes care are definită cheia primară ht_id, are mappate coloanele
ht_key, ht_payroll_perc, ht_active, ht_substract_from_allowed și ht_c_id cu name,
percent, active, substractAllowed și clientId și are definit un vector fillable în care
sunt trecute atributele ce pot fi modificate
- Modelul Invoice care are definită cheia primară i_id, are mappate coloanele i_date,
i_start, i_end, i_minutes, i_c_id, i_p_id, i_cu_id cu date, start, end, minutes, clientId,
projectId și customerId și are definit un vector fillable în care sunt trecute atributele
ce pot fi modificate. Modelul Invoice are definite și două funcții customer și project
prin care se definesc cheile străine către tabelele (clasele) customer si project.
- Modelul Phase care are definită cheia primară ph_id, are mappate coloanele
ph_name, ph_active, ph_standard, ph_order și ph_c_id cu name, active, standard,
priority și clientId și are definit un vector fillable în care sunt trecute atributele ce pot
fi modificate. Modelul Phase are definită și o funcție projects prin care se definește
cheia străină către tabela project_phases.
- Modelul Project care are definită cheia primară p_id, are mappate coloanele p_name,
p_nice_name, p_active, p_prio, p_u_id_manager, p_u_id_executive, p_hours și
p_risk cu name, long_name, active, priority, managerId, executiveId, hours și risk și
are definit un vector fillable în care sunt trecute atributele ce pot fi modificate.
Modelul Project are definite trei funcții manager, executive și phases prin care se
definesc cheile străine către tabela (clasa) user si tabela project_phases.
- Modelul Role care are definită cheia primară r_id, are mappate coloanele r_name,
r_active, r_description și r_c_id cu name, active, description și clientId și are definit
un vector fillable în care sunt trecute atributele ce pot fi modificate. Modelul Role are
definită și o funcție users prin care se definește cheia străină către tabela user_roles.

32
- Modelul User care are definită cheia primară u_id, are mappate coloanele u_name,
u_crypt_password, u_passwd, u_email, u_login, u_active, u_vacation_days,
u_last_updated_holidays, u_carried_days și u_c_id cu name, password, clear, email,
username, active, vacationDays, lastUpdatedHolidays, carriedDays și clientId și are
definit un vector fillable în care sunt trecute atributele ce pot fi modificate și un
vector hidden în care sunt trecute atributele ce trebuie ascunse (ex: password).
Modelul User are definită și o funcție roles prin care se definește cheia străină către
tabela user_roles.
- Modelul Worklog care are definită cheia primară w_id, are mappate coloanele
w_u_id, w_date, w_u_id_impersonated_by, w_minutes, w_p_id, w_ph_id, w_a_id,
w_extra, w_validated și w_c_id cu user, date, user_impersonated, minutes, project,
phase, activity, description, validated și clientId și are definit un vector fillable în care
sunt trecute atributele ce pot fi modificate.

Interfața aplicației este de tip CRUD (create, read, update, delete) sau BREAD (browse,
read, edit, add, delete). Termenul CRUD descrie o convenție de intarfață utilizator care ușurează
vizualizarea, căutarea și schimbul de informații. CRUD se referă la toate funcțiile ce sunt
implementate in aplicații de baze de date relaționale, fiecare litera mapându-se la o operație SQL.
După modelul CRUD, aplicația folosește request-uri de tip GET, POST și PUT.
Am ales să folosesc atât servicii, cat și repository pentru a organiza mai bine aplicația. În
timp ce repository conține mai mult operații CRUD, serviciile conțin și logica de business și se
folosesc de repository. Cu ajutorul serviciilor, codul se poate reutiliza mai ușor. Un exemplu de
utilizare al funcțiilor de serviciu se regăsește mai jos.

33
Pentru a updata un utilizator, în serviciu se caută utilizatorul după id, se verifică să nu
existe deja username-ul și email-ul ales pentru a păstra condiția de unicitate, se updatează
rolurile și drepturile, dacă este cazul și la sfârșit se apelează funcția de update din repository.
Formularele folosite pentru crearea și modificarea obiectelor, dar și pentru logarea orelor,
asignarea utilizatorilor proiectelor, crearea cererilor de concedii și a facturilor sunt construite
prin intermediul formularelor Laravel. Sintaxa acestora arată ca în secvența de cod de mai jos.

34
Pentru textele din aplicație, am folosit pagini de traduceri și le-am împărțit pe module,
pentru a fi structurate (account, finances, phases, modules, projects, users și messages – pentru
cuvinte generale).
Toate fișierele se află într-un folder en. Deci, dacă se dorește ca aplicația să fie
disponibilă și în alte limbi, trebuie doar să se mai creeze un nou folder cu fișierele necesare în
limba respectivă.
View-urile sunt și ele împarțite în mai multe foldere, în funcție de controller-ele din care
sunt solicitate. Pentru fiecare pagină și formular există un view definit, care sunt făcute tot după
modelul Laravel, adică sunt fișiere de tip .blade.php.
Pentru view-uri mai sunt două foldere layout și partials în care sunt adăugate view-urile
ce sunt folosite în mai multe locuri (ex: layout: footer, header; partials: filter, flash-messages).
Laravel oferă o opțiune mult mai simpla de introducere a fișierelor parțiale in view-uri, așa cum
este arătat în secvența de mai jos.

Codul CSS și JavaScript sunt scrise în fișiere separate style.css și main.js pentru a facilita
scrierea curată a codului și pentru ca modificarea acestuia să fie mai ușoară. În fișierul javascript
sunt definite diverse evenimente și funcții, dar și request-uri de tip ajax, așa cum este prezentat în
funcția de mai jos.

35
Aici sunt definite funcții pentru submitarea formularelor, funcția pentru autocompletare,
ce este exemplificată mai jos, funcția pentru paginare, funcția pentru datepicker, dar și diferite
modificări de layout sau culori în funcție de modificările utilizatorilor.

În aplicație am mai definit un fișier routes.php în care sunt definite rutele aplicației.
Pentru fiecare posibilitate de url, în funcție de tipul request-ului (get, post, put sau resource) se
direcționează către o anumită acțiune din controllere. Tot aici se pot seta și alias-uri pentru rute/
acțiuni. Un model de a defini rutele și seta aliasurile pentru acestea este prezentat în secvența de
cod de mai jos.

În fișierul modules.php sunt definite mappări pentru rute și modulele aplicației, astfel
încât fiecare rută să fie recunoscută cărui modul aparține pentru a putea avea acces. Tot aici sunt
definite și modulele din baza de date ce trebuie ascunse din meniu.
Pentru a vedea fiecare utilizator la ce module are acces am făcut o funcție în
UserRepository în care am căutat în baza de date modulele disponibile utilizatorului prin
drepturile oferite acestuia, dar și prin drepturile pe care le are în funcție de rolul acestuia. După

36
cum se poate observa, select-urile din baza de date sunt făcute cu ajutorul Laravel-ului, folosind
clasele puse la dispoziție de acesta, așa cum este prezentat în funcția de mai jos.

În fișierul app.php se definește environment-ul aplicației, timezone-ul aplicației, limba


aplicației și provider-ele folosite de aplicație.

Fig. 4.1 – Diagrama de clase

37
Pentru aplicația Timelog folosesc o bază de date MySQL. Structura bazei de date este
reprezentată în Fig. 4.2.
Fiecare tabelă este legată de tabela “clients” printr-o cheie catre “c_id”, deoarece
aplicația are o bază de date comună pentru toate firmele ce utilizează aplicația. În clients este
ținută fiecare companie ce folosește aplicația, și în funcție de id-ul acesteia se afișează în
aplicație doar datele corespunzătoare acelei companii.
Cheia primară din tabela “users” este și ea legată de mai multe tabele:
- Holidays (unde se țin toate cererile de concedii): pentru a ști ce utilizator a cerut concediu
și ce utilizator l-a aprobat/respins;
- User_roles si user_rights: pentru a ști ce drepturi și roluri are fiecare utilizator;
- Worklogs: pentru a ști fiecare log cărui utilizator îi aparține;
- Project_users: pentru a ști ce proiect are asignat fiecare utilizator;
- Projects: pentru a ști ce utilizatori sunt manageri sau au rol executiv pentru fiecare
proiect.

Tabela Worklogs este legată de cheile primare din project, phases si activities, pentru a ști
fiecare log pentru care din acestea a fost înregistrat si de users pentru a ști al cui este log-ul
respectiv.
Pentru legătura între proiecte și faze există o tabelă de legatură project_phases deoarece sunt
faze care pot exista în mai multe proiecte și pentru că proiectele pot avea mai multe faze.
Tabela modules este tabela unde sunt ținute toate modulele și submodulele aplicației. Aceasta
este legată de role_rights și user_rights pentru a determina fiecare rol/utilizator la ce module are
acces.
Tipurile de concediu se țin într-o tabela holiday_types, care are o cheie străina către clients
pentru ca fiecare companie ce utilizează aplicația să își poată adăuga tipurile de concedii dorite.
Aceasta este legată și de holidays pentru a ști de ce tip este fiecare cerere de concediu.
Tabelele config_values și config_fields sunt folosite pentru a reține anumite valori care pot fi
diferite în funcție de companiile ce folosesc aplicația (ex: zilele de concediu de studii pe care le
ofera compania pe an). Tabela config_values are și ea o cheie străina către clients.
Tabela customers ține toți clienții companiilor și este și ea legata de clients prin cheie străină,
pentu a ști fiecare client cărei companii aparține. Tabela projects este și ea legată de tabela
customers pentru a ști cui aparține fiecare proiect.

38
Fig. 4.2 – Schema bazei de date

39
În tabela invoices se stochează toate facturile. Aceasta are două chei străine către clients și
customers pentru a ști fiecare factură cărei companii aparține si cărui client este adresată..
Pe lângă acestea, mai este tabela password_resets pe care o folosește Laravel-ul pentru
resetarea parolelor.
Pentru crearea interogărilor în baza de date am folosit clase puse la dispoziție de Laravel
pentru a face codul mai ușor de citit și de urmărit așa cum e prezentat în secvența de mai jos.

De asemena, am folosit și funcții care lucrează cu obiectele definite în modele precum în


funcția de mai jos.

În acest capitol am prezentat arhitectura aplicației, baza de date, dar și diferite funcții din
biblioteca Laravel pe care le-am folosit pentru a ușura implementarea aplicației. Pe lângă
funcțiile puse la dispoziție de biblioteca Laravel am folosit și funcții JavaScript care ajută la
implementarea aplicației într-un mod mai ușor și structurat.

40
5. Concluzii și dezvoltări ulterioare
Aplicația Timelog permite managementul resurselor umane, al proiectelor și al cliențior într-
o companie. Aplicația este construită modular, astfel încat informațiile sunt organizate, iar
utilizatorilor le este ușor să o folosească. Aplicația permite adăugarea, editarea și ștergerea
utilizatorilor, clienților, proiectelor, fazelor și activtăților într-o companie.
De asemenea, se pot asigna proiecte utilizatorilor și se pot seta faze pentru proiecte. Aplicația
are și module de management a concediilor, utilizatorii putând să facă cereri de concediu, pe care
administratorii să le gestioneze. În aplicație se pot înregistra orele lucrate de angajați și
proiectele, fazele proiectului la care aceștia au lucrat, dar și ce activități au desfașurat. De
asemenea, pe baza înregistrărilor angajaților cu orele lucrate la proiecte, se pot emite facturi către
clienți pe diferite intervale de timp.
Deși aplicația este destul de complexă, aceasta mai poate fi îmbunătățită prin adăugarea de
noi module în funcție de cerințele companiilor ce o vor folosi.
. În primul rând, se mai poate adăuga notificare prin email către administratori atunci când
cineva face o cerere de concediu și către angajați atunci când statusul concediului se schimbă
(aprobă/ respinge). Această funcționalitate am încercat să o adaug, dar nu am reușit datorită
faptului că aplicația rulează local. Dacă aplicația se va urca pe un server, funcționalitatea de
email către administratori atunci când angajații fac cereri de concediu va funcționa.
În acest moment, în aplicație nu se face nicio diferențiere între orele obișnute de lucru și
orele de noapte, acest lucru putând fi adăugat în aplicație dacă se dorește. De asemenea, în
aplicație se mai poate adăuga un modul pentru delegații și/sau evenimente.
Deși nu mai sunt utilizate în multe companii, ar mai putea fi adăugate și formulare pentru
bilete de voie și rapoarte pentru întârzieri sau pauze. Se pot adăuga și module pentru program de
lucru și formulare pentru foaia colectivă de prezență. De asemenea, se mai poate face un modul
pentru fișe de pontaj care sa poată fi exportate.
Și pentru modulul de logat ore, se mai pot face îmbunătațiri. În pagina de logat ore, se poate
adăuga opțiunea de selecție a intervalului orar. De asemenea, se poate da posibilitatea
utilizatorilor să logheze pentru mai multe zile, nu doar pentru ziua curentă.
Tot aici, s-ar putea adăuga un modul pentru task-uri, care să se poată asigna mai multor
utilizatori, astfel încât aceștia să specifice în momentul când logheaza la ce task au lucrat.

41
În modulul Finances, pe lângă partea de facturare, se mai poate adăuga și calculul salariilor
pentru angajați, ținându-se cont de numarul de ore lucrate într-o lună și de zilele de concediu (și
de tipul acestora).
În concluzie, aplicația Timelog este o aplicație generică și complexă, ce poate fi folosită de
aproape orice companie (ex: companie de arhitectura, companie de outsourcing, etc) pentru
managementul resurselor umane, al proiectelor și al clienților din companii.

42
Bibliografie

1. Documentație Ajax http://api.jquery.com/jquery.ajax/ Accesat: 2016


2. Documentație Apache https://httpd.apache.org/ Accesat: 2016
3. Documentație Bootstrap http://getbootstrap.com/ Accesat: 2016
4. Documentație JavaScript https://www.javascript.com/ Accesat: 2016
5. Documentație JetBrains PhpStorm
https://www.jetbrains.com/phpstorm/specials/phpstorm/phpstorm.html?&gclid=CjwKEA
jwka67BRCk6a7_h_7Pui8SJABcMkWROdptl_Os2djdtAU1QOsVJBHUuuUHltTLU3zd
DHt4kBoCwA3w_wcB&gclsrc=aw.ds.ds&dclid=CMrwq6flvs0CFYyjFgodIgcHPg
Accesat: 2016
6. Documentație jQuery https://jquery.com/ Accesat: 2016
7. Documentație Datepicker https://jqueryui.com/datepicker/ Accesat: 2016
8. Documentație jQuery Bootstrap https://jqueryui.com/datepicker/ Accesat: 2016
9. Documentație Laravel https://laravel.com/ Accesat: 2016
10. Documentație MySql https://www.mysql.com/ Accesat: 2016
11. Documentație Php http://php.net/ Accesat: 2016
12. https://en.wikipedia.org/ Accesat: 2016
13. http://hrp.ro/?gclid=Cj0KEQjwwMi7BRDGptbvwOCDj8oBEiQAIALyDDqkriQGD2L9
RO_zbWDs9CNynbO7Gfj7WAGlpKP8hp4aAnkc8P8HAQ
14. Jon Duckett JavaScript & jQuery interactive frot-end web development
15. Josh Lockhart Modern PHP: New Features and Good Practices
16. Kyle Simpson (2015) You don’t know JS: Up & Going
17. http://www.smartree.com/en/mystaff-time-attendance-software-for-effective-personnel-
management/
18. http://pontajonline.ro/index.php?lang=en
19. Robin Nixon Learning PHP, MySQL & JavaScript: With jQuery, CSS & HTML5
20. Seyed M.M. Tahaghoghi, Hugh Williams Learning MySQL
21. http://www.svtech.ro/

43

S-ar putea să vă placă și