Utilizarea Tehnologiei Java în Domeniul Resurselor Umane

Utilizarea tehnologiei Java în domeniul resurselor umane

Cuprins

Introducere 3

1. Prezentarea domeniului resurselor umane 4

1.1 Descrierea activității resurselor umane 4

1.2 Planificarea și prognoza resurselor umane

1.3 Managerul departamentului de resurse umane

1.4 Recompense

1.5 Concedii

1.5 Avantajele si dezavantajele folosirii unui sistem informatic in domeniul resurselor umane

2. Tehnologii utilizate

2.1 Java

2.2 MySQL

2.3 JavaRMI

2.4 JasperReports

2.5 UML

3. Analiza și proiectarea bazei de date

3.1 Diagrame UML

3.2 Date de intrare

3.3 Schema bazei de date

3.4 Date de ieșire

3.5 Validarea datelor

4. Prezentarea și testarea aplicației

4.1 Prezentarea funcționalității aplicației

4.2 Testarea aplicației

Concluzii

Listă figuri

Bibliografie

Anexe

Introducere

Tema economică abordată în această lucrare este domeniul resurselor umane. Într-o companie, o resursă foarte importantă este forța de muncă, de aceea angajații sunt văzuți ca fiind parte a evoluției de-a lungul timpului a acesteia.

În cadrul unei organizții va exista mereu un department sau câțiva angajați, ce se vor ocupa de gestiunearesurselor umane. Acest lucru constă în asigurarea, dezvoltarea și recompensarea forței de muncă; iar rolurile unui astfel de departament pot varia de la o organizație la alta. Indiferent de plaja de atribuții a departamentului, rolul său este unul foarte mare în creșterea profitabilității companiei, realizarea eficientă a obiectivelor și asigurarea bunei funcționări a acesteia, ca un întreg. Departamentul de resurse umane interacționează, de regulă, cu toate celelalte departamente existente în cadrul companiei, existând o stransă legatură între ele.

Consider că acest domeniu, fiind esențial în economie, trebuie tratat cu seriozitate și atenție, iar datorită erei tehnologice în care trăim, este foarte importantă existența unui sistem de gestiune a datelor necesare personalului organizației. De asemenea, acesta trebuie să fie cât mai ușor de utilizat, cât mai eficient și cât mai puțin costisitor. Aplicația vine mai ales în ajutorul firmelor mici, cu cel mult 50 de angajați, care au un buget redus și care nu își permit să achiziționeze un sistem de tip ERP(SAP)[1] sau Middleware(Oracle) [2]. Tocmai din acest motiv, aplicația a fost creată cu ajutorul tehnologiilor Java și MySQL, ambele fiind cu sursa deschisă (engl. open-source). Funcționalitatea unei astfel de aplicații se poate schimba la cererea clienților, în cazul în care se va dori o personalizare a sistemului, deoarece odată ce o bază solidă este creată, aplicația poate fi ușor extinsă.

Prin urmare, scopul acestei lucrări este să trateze o parte a acestui domeniu vast, să ofere companiilor un serviciu prin care să își pună în valoare forța de muncă de care dispune sau de care va dispune, astfel încât profitabilitatea companiei să tindă spre maximum posibil, însă cu un efort minim.

Prezentarea domeniului resurselor umane

Descrierea activității resurselor umane

“Ce este o organizație fără angajații săi?” – Aceasta este o întrebare pe care mulți dintre noi și-o adresează, al cărei răspuns sugerat de specialiștii în domeniu evidențiază faptul că, fără prezența efectivă a oamenilor care știu ce, când și cum trebuie făcut, este imposibil ca o organizație să își atingă obiectivele.[3]

Resursele umane, înțelese și tratate ca totalitate a aptitudinilor fizice și intelectuale pe care omul le utilizează în procesul de producere a bunurilor materiale necesare existenței, reprezintă o noțiune care variază […]. Conținutul acestei noțiuni, în care se include, de obicei, și experiența dobandită în procesul muncii, alături de aptitudinile native și cele dobândite prin calificare, se îmbogățeste pe măsura evoluției societății omenești, dezvoltarea sa fiind corelată cu evoluția uneltelor de muncă. În analiza fenomenelor și proceselor care țin de utilizarea resurselor umane, trebuie pornit de la faptul că ele reprezintă principala forță de producție a societății. [4]

Acest lucru se aplică și în zilele noastre, în care lumea se schimbă extrem de repede, tehnologia evoluează cu o viteză fără precedent și există necesitatea unei resurse umane competente, informate, loială, talentată și gata să se adapteze oricărei schimbări.

În orice societate comercială, tocmai pentru a pune în valoare această forță de muncă, se acordă o importanță deosebită managementului resurselor umane. Obiectivul principal al managementului resurselor umane este de a se asigura că sunt folosite cele mai bune metode pentru a obține performanțele dorite.

Precum sunt prezentate în mai multe cărți dedicate practicii manageriale, problemele cele mai des întâlnite ce fac obiectul preocupărilor în acest domeniu sunt:

Asigurarea de personal pentru fiecare post din structura organizatorică, pe baza evaluării CV-urilor aplicanților, interviuri de grup, interviuri individuale, scrisori de intenție, recomandări, etc

Asigurarea ca personalul selectat în urma mai multor etape este capabil, că are cunoștințele și educația necesare pentru a se plia pe fișa postului

Negocierea contractului individual de muncă și elaborarea contractului colectiv de muncă, dacă este cazul (pentru organizațiile cu peste 21 de angajați)

Încetarea contractului individual de muncă

Comunicarea informațiilor despre posturi noi, despre schimbările de salarii, despre beneficii noi

Desfășurarea unor activități cu caracter social-cultural ce au în vedere creșterea nivelului de comunicare între angajați, ceea ce va duce ulterior la o mai bună colaborare în atingerea scopurilor companiei

Motivarea personalului, stimularea lui pentru a crește dorința de îmbunătățire continuă a propriei activități

Integrarea rapidă a noilor angajați

Instruirea personalului, oferirea de cursuri ce vin în ajutorul angajatului, aceștia putând să țină pasul cu tot ce este nevoie pentru a acoperi aria postului ocupat

Asigurarea unei bune comunicări între manager și angajați, de unde reiese dacă angajatul dă randament sau nu

Motivarea personalului prin recompense, directe sau indirecte. Elaborarea unui plan bine pus la punct ce va trebui să respecte toate regulile cu privire la salarizarea angajaților

Elaborarea unui plan corect de acordare a măririlor de salariu, a bonusurilor, a concediilor

Evaluarea periodică a performanțelor individuale ale personalului

Asigurarea stimulentelor nefinanciare

Elaborarea criteriilor de promovare

Obligativitatea de a propune spre aprobare managerului politică de personal și măririle corespunzătoare, inclusiv salarizarea, condițiile de muncă, de protecție a muncii și de pensionare

Astfel se poate observa ca atribuțiile departamentului de resurse umane nu pot fi definite în câteva rânduri, acestea putând varia de la o organizație la alta. Putem afirma , totuși, că rolul său, deși nu este acela de a lua decizii cu privire la funcționarea companiei, este de a alege oamenii care vor lua aceste decizii, ceea ce face ca acest departament să fie parte importantă a unei afaceri de succes.

Potrivit cursului Managementul relațiilor de muncă, documentele după care se ghidează departamentul de resurse umane sunt următoarele:

Regulamentul de Organizare și Funcționare – cuprinde elementele de organizare a unității, structura organizatorică a unității, sistemul de management, atribuții și sarcini, diagrama de relații a fiecărui post și a fiecărui departament.

Organigrama – reprezentarea grafică a structurii organizatorice.

Fișa postului – document în care sunt precizate sarcinile, competențele și responsabilitățile ce revin titularului de post.

Regulamentul Intern – reglementează raporturile de muncă; acesta cuprinde: reguli privind conduita și etica profesională, prevenirea și stingerea incendiilor, reguli privind protecția, igiena și securitatea în muncă, organizarea timpului de muncă și a timpului de odihnă, drepturile și obligațiile angajatorului și ale salariatului, criteriile și procedura de evaluare profesională a salariaților, salarizarea și alte drepturi de natură salarială, răspunderea disciplinară și patrimonială, sancțiuni aplicabile etc. Acest regulament trebuie cunoscut de toți angajații companiei respective.

1.2 Planificarea și prognoza resurselor umane

Planificarea resurselor umane

Conform teoriei managementului resurselor umane, planificarea resurselor umane reprezintă procesul de analiză și identificare a necesarului de personal.

O definiție în același sens, dar mai detaliată este dată de P.W.Anthony[5] și colaboratorii care subliniază că planificarea resurselor umane reprezintă suma strategiilor de recrutare, selectare, pregătire, orientare profesională, promovare și a regulilor de muncă ale unei organizații; este un proces menit să transpună planurile și obiectivele organizației în cerințe viitoare de angajare, precum și în planuri prevăzute să îndeplinească acele cerințe atât pe termen lung cât și pe termen scurt, prin utilizarea și dezvoltarea resurselor umane, a sistemului de recrutare și angajare a acestora.

Planificarea resurselor umane trebuie să se încadreze în limite rezonabile din punct de vedere al cheltuielilor și să fie cât mai eficientă. Această planificare trebuie să aibă în vedere metodele de planificare, exactitatea, obiectivele organizaționale, principiile de planificare, complexitatea informațiilor.

Metodele de planificare trebuie să fie cât mai clare și accesibile, pe când informațiile pe care se bazează aceasta trebuie să fie exacte și adecvate specificului organizației. Important în urma acestor planificări este să se ajungă la îndeplinirea obiectivelor propuse, chiar dacă pe parcurs au existat mici abateri. De asemenea, trebuie să fie elaborate principii raționale, minusuri și plusuri pentru oricare acțiune întreprinsă în cadrul planificării. La finalul planificării, organizația poate realiza o concordanță între obiective și resurse și să asigure toate condițiile pentru buna funcționare a planificării, ceea ce definește complexitatea menționată anterior.

Etapele unei planificări, în teoria managementului resurselor umane, sunt:

Planul de recrutare (Recrutare , Selectie, Plasare)

Planul de pregatire și perfecționare

Planul de promovare (Performanțe, Promovare)

Înainte de a începe aceste etape, trebuie realizate o serie de activități, cum ar fi: identificarea profesiilor și meseriilor care nu au acoperire cu personal – adică analiza situației prezente a resurselor existente, analiza piramidei vârstei personalului, analiza fluctuației personalului pe departamente, compararea cererii cu oferta, determinarea posibilităților interne și externe organizației de asigurare și completare a forței de muncă.

Trebuie menționat și faptul că sunt o serie de factori ce influențează acest plan, precum: progresul tehnologic, nivelul resurselor, situația economică generală, piața muncii, reglementările guvernamentale etc. ce trebuie luați în considerare pentru a putea elabora un plan cât mai realist.

Prognoza resurselor umane

După parcurgerea etapelor de planificare, adică colectarea și analizarea informațiilor, se trece la etapa de prognozare a resurselor umane. Acest lucru se întâmplă numai după ce ne asigurăm că realitatea este cunoscută în totalitate corect, că avem suficiente date și acestea sunt pe perioade suficient de lungi.

Există trei categorii de prognoză a resurselor umane:

Metode intuitive (cele mai cunoscute):

Brainstorming

Delphi (aplicată de organizațiile la care specificul lor face dificilă cuantificarea volumului activităților viitoare)

Metode explorative (cele mai cunoscute):

Extrapolare (aplicată de organizațiile care au previzionate activități cuantificabile ca volum)

Analiza economică

Metode normative (cele mai cunoscute):

Metoda balanței

Cercetare operațională[6]

În general, orice metodă ar fi aplicată, estimările ce privesc necesarul de resursă umana nu pot fi exacte. Tocmai de aceea, pentru a evita pe cât posibil crearea unor situații dificilealitatea este cunoscută în totalitate corect, că avem suficiente date și acestea sunt pe perioade suficient de lungi.

Există trei categorii de prognoză a resurselor umane:

Metode intuitive (cele mai cunoscute):

Brainstorming

Delphi (aplicată de organizațiile la care specificul lor face dificilă cuantificarea volumului activităților viitoare)

Metode explorative (cele mai cunoscute):

Extrapolare (aplicată de organizațiile care au previzionate activități cuantificabile ca volum)

Analiza economică

Metode normative (cele mai cunoscute):

Metoda balanței

Cercetare operațională[6]

În general, orice metodă ar fi aplicată, estimările ce privesc necesarul de resursă umana nu pot fi exacte. Tocmai de aceea, pentru a evita pe cât posibil crearea unor situații dificile în ceea ce privește prognozarea aceasta, organizația ar trebui să aibă în vedere mai ales verificarea necesității de personal nou. Este posibil ca postul să poată fi preluat de personalul existent al companiei, astfel ar trebui să se facă o analiză a responsabilităților pe posturi, dacă personalul le îndeplinește corect, timpul în care acestea sunt realizate, etc și apoi să se stabilească dacă este nevoie de achiziționarea de noi resurse de muncă pentru noul post sau nu.

Un alt factor important este forța de muncă la momentul analizei, deoarece, în urma oricărei metode de prognoză se poate ajunge la creșteri sau descreșteri în raport cu această forță de muncă.

De obicei, organizațiile de dimensiuni mai mici optează pentru subdimensionarea resurselor, față de cele indicate prin prognoză, pentru că, în urma unor evoluții dramatice ale pieței, organizația să nu intre în declin. Aceste firme analizează cu rigurozitate fiecare posibilă influență asupra viitorului organizației, astfel încât viitoarea structură de personal să fie temeinic justificată. Organizațiile de mari dimensiuni, prognozează fonduri mai mari de resurse, inclusiv umane, pentru că au capacitatea de a se dezvolta prin obiective, planuri și programe alternative.[7]

1.3 Managerul departamentului de resurse umane

Am stabilit importanța resurselor umane și a departamentului în cauză, însă la fel de importantă este și persoana care conduce acest departament. Managerul departamentului de resurse umane este cel responsabil cu gestionarea eficientă a forței de muncă și este direct subordonat directorului general. Între cei doi este esențială o comunicare foarte bună, ce va duce ulterior la rezultatele dorite.

Un astfel de manager trebuie să aibă o experiență în domeniul resurselor umane, trebuie sa fie rațional, să aibe o gândire critică, trebuie să fie organizat, trebuie să știe să lucreze sub presiune și să aibă capacitatea de a lua decizii, să aibe o exprimare clară care nu lasă loc de interpretări, trebuie să știe să comunice foarte bine cu oamenii și să înțeleagă diverse comportamente umane, să aibe calități de lider, etc. Unele dintre aceste aptitudini și abilități se pot forma și pe parcurs, în urma unor programe de instruire speciale. Nu trebuie uitată, însă, nici educația și formarea ce însoțesc și completează caracteristicile enumerate mai sus.

Likert[8] prezintă 4 stiluri manageriale dominante:

tipul autoritar-exploatator, cu următoarele caracteristici:

conducătorul nu are încredere în subordonați;

aproape toate deciziile se iau la nivelul superior, al conducerii organizației;

motivația subordonaților este frica și sistemul de sancțiuni;

comunicarea se face aproape exclusiv de sus în jos.

tipul autoritar-binevoitor, caracterizat de următoarele:

controlul este strict menținut în mâinile conducerii superioare;

se pretinde ca subordonații să fie loiali, docili și aserviți;

managerii tratează paternalist subordonații;

permite ceva mai multă comunicare de jos în sus.

tipul consultativ, ce prezintă următoarele caracteristici:

încredere parțială în subordonați;

se solicită deseori idei din partea angajaților, însă majoritatea deciziilor se iau de către conducerea superioară;

unele aspecte ale controlului sunt delegate în josul piramidei ierarhice;

comunicarea se realizează în ambele sensuri.

tipul participativ, având următoarele caracteristici:

încredere deplină în subordonați; se iau decizii la toate nivelele organizației, prin participarea în grup la acest proces;

comunicarea se desfășoară pe verticală în ambele sensuri și pe orizontală între cei egali în grad;

participarea la procesul decizional generează motivații puternice de a realiza scopurile și obiectivele organizației.[9]

Printre sarcinile și responsabilitățile unui manager de resurse umane se numară: organizarea personalului de resurse umane, soluționarea eventualelor conflicte și a plângerilor angajaților, întocmește bugetul de activitate al departamentului, investighează accidentele de muncă și recomandă măsurile corespunzătoare, asigură interpretarea corectă și aplicarea politicilor de personal, formulează și aprobă programele de recompensare, se implică în negocierea și readactarea contractelor individuale de muncă, etc.

1.4 Recompense

Atunci când vorbim despre resurse umane este important să aducem vorba despre recompensarea angajaților, adică despre veniturile materiale sau nemateriale care i se cuvin pentru munca depusă. Angajații astfel motivați, li se va dezvolta interesul pentru muncă în vederea realizării obiectivelor organizației, li se va stimula inițiativa și creativitatea și li se va modifica și comportamentul, îmbunătățindu-se climatul grupurilor de lucru.

Mărimea recompensei este în primul rând influențată de performanța angajatului în cadrul organizației, alți factori fiind și educația acestuia, experiența, cunoștințe, loialitate, etc.

În general, este recomandat ca aceste recompense să se facă în ordinea meritelor, adică să se țină cont de un set de reguli, de norme, de măsuri stabilite apriori și cunoscute de către toți cei ce fac evaluările angajaților pentru oferirea recompenselor.

Așa cum sunt clasificate de specialiști în domeniu, recompensele pot fi de două feluri: directe și indirecte. Cele directe sunt, de exemplu, salariul de bază, bonusuri, sporuri, indexări, indemnizații, comisioane etc. iar cele indirecte sunt reprezentate de diverse beneficii (plata transportului, masa gratuită, mașina de serviciu, facilitate de recreere, compensație la concediu), asigurări medicale, recompense privind pensiile, plata concediilor de odihnă, a zilelor libere prin lege etc.

Recompensele mai pot fi și materiale, adică salariu, sporuri, etc sau pot fi nemateriale, precum: diplome, felicitări, medalii etc.

O formă importantă de recompensare a personalului este salariul. Conform art. 163 din Legea 53/2003 – Codul Muncii, republicată salariul este confidențial, de acest lucru asigurându-se angajatorul. Potrivit definiției, salariul este un mijloc de a satisface nevoile fizice, biologice, sociale și personale ale individului. Este foarte important să existe o corelare între salariu și munca depusă a angajatului sau complexitatea postului ocupat.

Evoluția salariului depinde, de asemenea, de dedicarea fiecărui angajat în parte, însă un factor important de influență este și vechimea. În sistemul public, salariul individual crește direct proporțional cu vechimea angajatului în organizație sau în profesie. Tot vechimea contribuie și la promovarea salariatului de pe un post pe altul, spre vârful ierarhiei posturilor, într-o clasă de salarizare superioară.

Potrivit cursurilor ce tratează tema Resurselor Umane, echitatea salarizării respectă trei condiții:

Echitate internă (trebuie să existe un echilibru al salariilor de pe diferite posturi, în funcție de atribuțiile fiecărui angajat, la nivelul firmei)

Echitate externă (trebuie să existe un echilibru între salariile de pe același post, dar în unități diferite)

Echitate individuală (presupune o diferențiere a angajaților în funcție de realizările, cunoștințele,capacitatea fiecăruia)

Principiile generale ale sistemelor de salarizare sunt următoarele:

Formarea salariului este supusă mecanismelor pieței și implicării agenților economico-sociali

Principiul negocierii salariilor

Principiul existenței sau fixărilor salariilor minime

Principiul la muncă egală, salariu egal

Principiul salarizării după cantitatea muncii

Principiul salarizării în funcție de nivelul de calificare profesională

Principiul salarizării după calitatea muncii

Principiul salarizării în funcție de condițiile de muncă

Principiul liberalizării salariilor

Principiul caracterului confidențial al salariului[3]

Urmează să fie prezentate câteva noțiuni folosite conform codului fiscal. În primul rând se face o distincție la nivelul veniturilor salariale:

venitul din salarii (reprezentată de veniturile în bani sau în natură obținută de un angajat al unei organizații în baza unui contract individual de muncă, la care se adaugă indemnizațiile de materninate, de îngrijire a copilului bolnav între 7 și 18 ani, etc)

venitul brut din salariu (reprezintă suma tuturor veniturilor salariatului)

venitul net din salariu (reprezintă venitul rămas după deducerea din venitul brut a contribuțiilor reținute potrivit legii, pentru asigurări sociale, pentru șomaj și pentru asigurări de sănătate)

venitul impozabil (reprezintă diferența dintre venitul net și suma deducerilor personale)

Alte sume, ce nu sunt incluse în venituri salariale, sunt: contravaloarea locuinței de serviciu, costul convorbirilor telefonice în scopuri de serviciu, cheltuieli cu pregătirea profesională a angajatului, ajutoare pentru boli incurabile, pentru nașterea unui copil, cadouri pentru salariate cu ocazia zilei de 8 martie, contravaloarea transportului, etc.

Dintre recompensele indirecte le menționăm pe cele mai importante în cele ce urmează.

Plata timpului nelucrat cuprinde sărbătorile legale (Anul Nou, Ziua Națională, Crăciun, Paște, etc), zilele libere pentru evenimente personale (căsătorie, deces, naștere), concediul de odihnă (acesta poate fi inițial de 21 zile pe an, dar crește odată cu vechimea în muncă a angajatului sau poate diferi de la o organizație la alta).

Beneficiile, care constau în produse și servicii ce țin de profilul organizației, acordate gratuit angajatului, facilități pentru petrecerea timpului liber (aici este vorba de subvenționarea unei părți din prețul unor abonamente la săli de sport, la tratamente, în stațiuni, etc), reducerea sau oferirea gratuită a echipamentului de protecție, etc.

Asigurarea de sănătate, ale cărei elemente sunt: asistență medicală gratuită (asigurarea consultațiilor periodice), plata concediului medical (angajatul ce nu poate să își exercite obligațiunile pe motiv de boală, are dreptul la o perioadă în care acesta poate lipsi și pentru care este plătit), gratuitatea serviciilor medicale (consultații, spitalizare), subvenția unei părți a costului medicamentelor, etc.

Protecția salariaților împotriva anumitor factori ce pot duce la diminuarea veniturilor (accidente profesionale, creșterea costului vieții, etc).

Din toate cele de mai sus, putem observa cu ușurință cât de important este să cunoaștem și să ajutăm la dezvoltarea resurselor umane, atât ca membru de departament, ca manager de departament, dar și ca simplu angajat.

Totodată, am aflat că “cel mai important cuvânt în Managementul Resurelor umane este: NOI, iar cel mai puțin important cuvânt este: EU”, după cum afirmă Liana Heavin – profesor irlandez în Managementul Resurselor Umane.

1.5 Concedii

Orice angajat trebuie să poată fi răsplătit cu zile libere drept recompense a muncii sale zilnice. Angajații au dreptul la concediu anual plătit, durata minimă a concediului de odihnă annual fiind de 20 de zile lucrătoare. Alte tipuri de concedii sunt: concediu de odihnă suplimentar, concediu medical, concediu pentru formare profesională, concediu de maternitate, de paternitate, concediu pentru îngrijirea copilului bolnav etc.

În primul rând, concediul de odihnă, are, după cum aminteam anterior minim 20 de zile lucrătoare și asta deoarece companiile pot oferi zile de concediu de odihnă suplimentar, conform contractului individual de muncă, în limitele legii. Așa cum este prevăzut în art. 145 din Legea 53/2003 – Codul Muncii, republicată durata efectivă a concediului de odihnă anual se stabilește în contractul individual de muncă, cu respectarea legii și a contractelor colective de muncă, după caz. Sărbătorile legale în care nu se lucrează, precum și zilele libere plătite stabilite prin contractul colectiv de muncă, nu sunt incluse în durata concediului de odihnă anual. Conform art. 139 din Legea 53/2003 – Codul Muncii, republicată, zilele de sărbătoare legală sunt considerate a fi: 1 și 2 ianuarie, prima și a doua zi de Paști, 1 mai, prima și a doua zi de Rusalii, Adormirea Maicii Domnului, 30 noiembrie – Sf. Apostol Andrei, 1 decembrie, prima și a doua zi de Crăciun. Pentru alte culte religioase, în afara creștinismului, angajaților le sunt oferite doua zile pentru fiecare dintre cele trei sărbători religioase anuale. De asemenea, în Codul muncii este menționat faptul că se pot stabili prin contractul colectiv de muncă și alte zile libere specifice fiecărei companii.

În cel de-al doilea rând, un concediu des întâlnit este cel medical. Durata de acordare a concediului pentru incapacitate temporară de muncă, pentru fiecare tip de afecțiune, este de cel mult 183 de zile în interval de un an, așa cum este precizat de art. 12-17 din Ordonanța de Urgență a Guvernului nr 158/2005, actualizată. Durata de acordare a concediului de acest tip poate fi mai mare în cazul unor boli speciale (tuberculoză, SIDA, etc). În situații temeinic motivate de posibilitatea recuperării, medicul poate propune prelungirea concediului medical peste 183 de zile, în scopul evitării pensionării de invaliditate și menținerii asiguratului în activitate. Medicul expert al asigurărilor sociale decide, după caz, prelungirea concediului medical, reducerea programului de lucru, etc.

Conform art. 152 din Legea nr. 53/2003 – Codul Muncii, republicată, în cazul unor evenimente familiale deosebite, salariații au dreptul la zile libere plătite, care nu se includ în durata concediului de odihnă. Evenimentele familiale deosebite și numărul zilelor libere plătite sunt stabilite prin lege, prin contractul colectiv de muncă sau prin regulamentul intern.

În art. 154 din Legea nr. 53/2003 – Codul Muncii, este menționat faptul că salariații au dreptul să beneficieze, la cerere, de concedii pentru formare profesională. Acestea pot fi plătite sau neplătite, dar și aprobate sau neaprobate în funcție de consecințele lipsei angajatului respectiv. Durata acestui concediu nu poate fi dedusă din durata concediului de odihnă anual.

Concediul de maternitate este reglementat de art. 23-25 din Ordonanța de urgență a Guvernului nr. 158/2005, actualizată conform căruia asiguratele au dreptul la concedii pentru sarcină și lăuzie, pe o perioadă de 126 de zile calendaristice, perioadă în care beneficiază de indemnizație de maternitate. Cuantumul brut lunar al indemnizației de maternitate este de 85% din baza de calcul. Concediul pentru sarcină se acordă pe o perioadă de 63 de zile înainte de naștere, iar concediul pentru lăuzie pe o perioadă de 63 de zile după naștere. De reținut este faptul că indemnizația de maternitate nu se impozitează, singurul procent ce se reține este cel de CAS. Conform Legii nr. 210/1999se acordă concediu paternal cu scopul participării efective a tatălui la îngrijirea copilului nou-născut. În cazul nașterii copilului, tatăl poate beneficia de următoarele concedii: concediu pentru creșterea copilului până la împlinirea vârstei de 2 ani, respectiv 3 ani în cazul copilului cu handicap; concediu pentru îngrijirea copilului bolnav, constând într-un număr de 14 zile de concediu anual sau concediu paternal, care se acordă pentru o perioadă până la 5 zile lucrătoare. Singura persoana care poate solicita concediul paternal, este tatăl noului-născut, în calitate de salariat, asigurat în cadrul sistemului asigurărilor sociale de stat.

Un ultim tip de concediu tratat în această lucrare este cel fără plată. Art. 153 din Legea 53/2003 – Codul Muncii, republicată prevede faptul că salariații sau dreptul la concedii fără plată pentru rezolvarea unor situații personale. Durata concediului fără plată se stabilește prin contractul colectiv de muncă sau prin regulamentul intern.

1.5 Avantajele si dezavantajele folosirii unui sistem informatic in domeniul resurselor umane

Pentru a trata acest subiect este nevoie să știm ce este acela un sistem informatic și de ce este nevoie de el.

În primul rând trebuie să vorbim despre sistemul informațional, ca parte a sistemului de management. Acesta poate fi definit ca un ansablu tehnico-organizatoric de proceduri de constatare, consemnare, culegere, verificare, transmitere, stocare și prelucrare a datelor, în scopul satisfacerii cerințelor informaționale necesare conducerii în procesul fundamentării și elaborării deciziilor. […] Deci, prin scopul urmărit, putem considera sistemul informational ca un instrument al amnagementului în vederea realizării obiectivelor organizațiilor economico-sociale.[10]

Odată cu evoluția tehnologică, s-a ajuns să se folosească diverse echipamente pentru rezolvarea problemelor enumerate anterior, ce au dus la automatizarea sistemului informational.

Acest lucru a dus la apariția conceptului de sistem informatic. Acesta reprezintă un ansamblu de elemente intercorelate funcționale, în scopul automatizării obținerii informațiilor necesare conducerii în procesul de fundamentare și elaborare a deciziilor.[10]

Așa cum este prezentat în teorie, un sistem informatic are următoarele compenente:

Hardware-ul (totalitatea mijloacelor tehnice)

Software-ul (totalitatea programelor ce îndeplinesc funcțiile pentru care a fost creat sistemul)

Comunicațiile (echipamentele și tehnologiile folosite pentru comunicația datelor între sisteme)

Baza științifică și metodologică (metodologii, modele matematice ale proceselor economice)

Baza informațională (datele ce sunt supuse prelucrării)

Utilizatorii (personalul specializat ce se ocupă de buna funcționare a sistemului informatic)

Cadrul organizatoric (cel specificat în regulamentul de funcționare al unității respective)

Este de menționat faptul că organizarea datelor are un rol crucial în proiectarea sistemelor informatice, deoarece eficiența pe termen lung este dată de modul origanizării datelor de la bun început.

În lucrările despre baze de date, s-a stabilit că la organizarea datelor, este important să luăm în cosiderare anumiți factori, precum: timpul de acces la date să fie minim, datele organizate trebuie sa fie unice în sistem (uneori, pentru un acces mai rapid la date, se acceptă o redundanță minimă a datelor), datele trebuie să fie flexibile, să se poată schimba structural ori fără a modifica tot programul ce le gestionează și de asemenea ele trebuie să reflecte cât mai bine realitatea.

O organizație care vrea să se mențină pe piață trebuie să promoveze folosirea mijlocelor moderne de prelucrare, de analiză și de decizie. Astfel că un sistem informatic joacă un rol important în viața economică a organizației. Acest lucru se întâmplă și datorită faptului că în ultimii ani au apărut foarte multe produse software, care s-au dovedit a fi profitabile pentru companii. S-a observant și o tendință clară spre tehnologia sistemelor informatice bazate pe rețele de calculatoare și pe baze de date relaționale și orientate pe obiect. În primul caz, datorită creșterii complexității și varietății de aplicații a fost necesară conectarea calculatoarelor în cadrul unor rețele. În cel de-al doilea caz, bazele de date relaționale, deși folosite, au ajuns să fie considerate insuficiente, astfel că bazele de date orientate pe obiect câștigă teren, ele permițând crearea de obiecte complexe din componente mai simple, fiecare având propriile atribute și propriul comportament.[10]

Interfața om-mașină a evoluat și ea de-a lungul timpului, lucru ce a contribuit la popularitatea sistemelor informatice, acestea au devenit mai prietenoase, implicit mai ușor de utilizat de angajații nespecializați în informatică ai unei organizații.

Alte avantaje ale utilizării unui sistem informatic, ce au fost dovedite de-a lungul anilor de utilizare a acestora, sunt:

Erorile privind colectarea și prelucrarea datelor au scăzut considerabil

Eficiența costurilor

Rapiditatea cu care problemele, cerințele departamentului sunt rezolvate

Profesionalismul rapoartelor ce pot fi create

Diminuarea volumului de documente fizice

Reducerea timpului alocat activității administrative

Accesul la date este mai ușor, mai rapid și se face controlat

Confidențialitatea datelor personale, ce determină încrederea mai mare a angajaților

Comunicarea mai ușoară, mai rapidă și mai bună între departamentele ce folosesc informații commune

Dezavantajele privind utilizarea unui sistem informatic sunt puține, însă se poate întâmpla ca acestea să fie prea costisitoare pentru organizația în cauză. De obicei, însă, se găsesc soluții, precum crearea unui sistem personalizat ce să îndeplinească aproximativ aceleași funcții ca și cele al produselor de pe piață.

Un alt dezavantaj pot fi problemele tehnice ce pot apărea, precum diminuarea, stricarea echipamentelor hardware, virusarea documentelor sau a sistemului de calcul, etc. în acest caz este important să fie o persoană care să știe cum să intervină în astfel de situații.

De asemenea, este probabilă lipsa cunoștiințelor în utilizarea diverselor tehnologii, situație întâlnită mai ales în cazurile persoanelor dintr-o categorie de vârstă mai înaintată. Și acest lucru se poate rezolva prin oferirea de cursuri specializate angajaților care vor urma sa lucreze cu produsul software, respectiv personalului de resurse umane.

Într-adevăr, un sistem informatic nu poate funcționa fără unul din elementele sale. Neglijarea, chiar și numai a unei componente va crea prejudicii în cadrul organizației ce nu vor duce la profitabilitatea așteptată de la un astfel de sistem informatic.

Tehnologii utilizate

Tehnologiile pe care le voi folosi pentru realizarea aplicației sunt: Java, MySQL, JavaRMI, JasperReports și UML.

2.1 Java

Java este un limbaj de programare orientat pe obiect conceput de către James Gosling la Sun Microsystems (acum filială Oracle) la începutul anilor ʼ90, fiind lansat în 1995. [11]

Încă de la început, limbajul a avut un impact remarcabil asupra dezvoltării software și chiar și în ziua de azi, este folosit de foarte multe companii din toate domeniile, existând multe posturi pe piață care să necesite cunoștințe de limbaje orientate pe obiect, printre care și Java.

Este de menționat faptul că Java a fost construit pe baza limbajului C++ și a fost creat tocmai pentru că s-au găsit unele neajunsuri în cazul celui de-al doilea limbaj, cum ar fi folosirea a prea multă memorie, portabilitate scăzută, nu se puteau realiza programe distribuite, etc. Au fost eliminate unele facilități considerate inutile și au fost adăugate unele noi, ce au dus la soluționarea problemelor menționate anterior și la obținerea de rezultate mai eficiente.

Conform părerilor persoanelor de specialitate, trecerea la Java se face foarte ușor indiferent de ce limbaj de programare s-a folosit înainte. S-au realizat chiar și studii care au demonstrat că celor care nu au cunoștințe de programare deloc, le este mai ușor să învețe Java decât C sau C++, datorită faptului că acesta este complet orientat pe obiect, datorită graficii, interfețelor prietenoase, etc.

Java este un limbaj atât de utilizat datorită caracteristicilor sale. Dintre aceastea, amintim:

Portabilitatea – aplicațiile pot rula pe orice platformă de lucru care are instalată o mașină virtuală (în engleză, Java Virtual Machine- JVM, care reprezintă mediul în care se execută programele Java), fără a se face nicio modificare.

Simplitate și ușurință – se pot crea programe complexe, fie în rețea, fie utilizând baze de date și multe altele, fiind mai simplu și mai practic decât C++; plus posibilitatea creării unei interfețe pentru aplicație, fiind mai ușor de lucrat decât cu consola

Robustețe – erorile sunt eliminate odată cu eliminarea anumitor facilități ale limbajului C++ (de exemplu: renunțarea la pointeri,administrarea automată a memoriei, etc)

Complet orientat pe obiect (nu mai există programare procedurală)

Performanță – Java asigură o performanță ridicată, deși nu este specific unei anumite platforme de lucru

Securitatea – Java are mecanisme sigure de securitate a programelor

Java are 3 platforme furnizate de Sun Microsystems. Acestea vor fi descrise în continuare conform unui curs de Java:

J2SE (Ediția Standard- în engleză, Standard Edition) –oferă suport pentru crearea de aplicații independente și appleturi(un applet reprezintă un mic program ce face parte dintr-un program mai mare). De asemenea, aici este inclusă și tehnologia Java Web Start ce furnizează o modalitate extrem de facilă pentru lansarea și instalarea locală a programelor scrise în Java direct de pe Web, oferind cea mai comodă soluție pentru distribuția și actualizarea aplicațiilor Java

J2ME (Ediția Micro – în engleză, Micro Edition) – oferă suportul necesar scrierii de programe pentru dispositive mobile.

J2EE (Ediția de Întreprindere – în engleză, Enterprise Edition) – oferăAPI-ul necesar dezvoltării de aplicații complexe (API-Application Programming Interface, ceea ce înseamnă interfețe pentru programarea de aplicații), formate din componente ce trebuie să ruleze în sisteme eterogene, cu informațiile memorate în baze de date distribuite, etc. Tot aici găsim și suportul necesar pentru crearea de aplicații și servicii Web, bazate pe componente cum ar fi servleturi (un servlet este o clasă scrisă în limbajul Java al cărei scop este generarea dinamică de date într-un server HTTP[12]), pagini JSP (Java Server Pages – reprezintă o tehnologie care ajută dezvoltatorii de software să creeze pagini web generate dinamic pe baza de HTML, XML sau alte tipuri de documente ), etc.

Este important să vorbim despre costuri, lucru ce interesează foarte mult companiile, astfel că toate distribuțiile Java pot fi descărcate gratuit de pe internet, de la adresa java.sun.com.

Limbajul Java este un limbaj interpretat și compilat. Conform literaturii de specialitate asta înseamnă că există un compilator responsabil de transformarea surselor programelor în cod de octeți (codul de octeți este un intermediar între codul mașină și codul sursă, generat de compilator[13]), precum și un interpretor ce va executa acest cod de octeți.

În cadrul aplicației, am folosit ca mediu de programare NetBeans. Acesta este un mediu integrat (IDE = Integrated Development Environment), cu ajutorul căruia se pot dezvolta aplicații folosind numeroase limbaje: Java, PHP, C, C++, HTML5, etc).

După cum este relatat și pe pagina https://netbeans.org, NetBeans este un proiect ce are întregul cod sursă disponibil (în engleză, open-source), ceea ce înseamnă că oricine poate contribui cu îmbunătațiri, cu rapoarte pentru erorile apărute (în engleză, bug-uri), etc, astfel toată lumea poate beneficia de un mediu de programare cât mai bun.

Indiferent de tehnologia folosită pentru crearea unei aplicații, NetBeans oferă o gamă largă de plug-in-uri (plug-in-urile reprezintă un set de componente software care se adaugă abilități specifice unei aplicații mai mari) ce vin în ajutorul programatorilor pentru ușurarea procesului de dezvoltare.

2.2 MySQL

Pentru crearea bazei de date am folosit tehnologia MySQL.

Conform Tratatului de baze de date, MySQL este un sistem de gestiune a bazelor de date relațional (SGBDR), dezvoltat în prezent de compania suedeză MySQL AB, subsidiară aOracle Corporation și distribuită sub GNU (Licența Publică Generală).

Potrivit aceleiași publicații, un SGDR reprezintă un pachet software prin care se realizează gestiunea unei baze de date și utilizează drept concepție de organizare a datelor, modelul relațional. Cerințele ce trebuie satisfăcute de un astfel de sistem sunt numeroase, însă Codd a formulat 13 astfel de reguli.

Prima versiune MySQL a fost lansată în anul 1995, iar în 2008 a fost achiziționat de Sun Microsystems.[14]

MySQL este un sistem ce are codul sursă disponibil (open-source), motiv pentru care a devenit din ce în ce mai popular, fiind folosit pentru numeroasele sale caracteristici, printre care și gratuitatea, care a dus la o reducere semnificativă a costurilor. Mulți specialiști în domeniu, precum DuBois, recomandă acest sistem și încurajează participarea la rezolvarea problemelor și postarea lor în comunitatea MySQL, pentru că și alții să își găsească răspunsurile la întrebări acolo.

Această tehnologie este des folosită împreună cu limbajul de programare PHP (Hypertext Preprocessor), însă cu ajutorul MySQL se pot construi aplicații în orice limgaj major, cum ar fi: C, C++, C#, Java,etc.

La fel ca în cazul limbajului de programare Java, utilizatorii susțin că MySQL este ușor de învățat și de folosit pentru aplicații de gestiune a bazelor de date.

MySQL oferă suport pentru majoritatea tipurilor de date fără limitări privind dimensiunea maximă a bazei de date și putând stoca valori într-o coloană CLOB (Character Large Object) de maxim 4 GB. [14]

Precum apare definite și în Tratatul dedicate acesteia, o bază de date este un ansamblu de colecții de date aflate în interdependență, împreună cu descrierea datelor și a legăturilor dintre ele. Putem spune că o bază de date este relațională dacă structura de bază a datelor este aceea de relație – tabelă.

Tehnologia MySQL folosește limbajul de programare SQL (Structured Query Language) pentru manipularea și interogarea datelor. SQL este un limbaj de descriere și manipulare acceptat de toate SGBDR –urile. Acest limbaj datează încă din anii 1970, astăzi fiind cel mai popular limbaj folosit pentru crearea, modificarea, regăsirea, ștergerea și manipularea datelor. Structura generală a unei comenzi SQL este următoarea: un cuvânt cheie (precum INSERT, UPDATE, SELECT), la care se adaugă relațiile, atributele și funcțiile. Pe lângă SQL, MySQL poate folosi ca limbaj chiar și ODBC (Open Database Conectivity – protocol de comunicație cu bazele de date creat de Microsoft).

După cum descrie DuBois în cartea sa, distribuțiile MySQL cuprind următoarele instrumente: serverul SQL, care permite accesul la baza de date; un program care să permita utilizatorului/clientului să însereze interogările dorite și să poată vedea rezultatul acestora și o librărie ce va fi baza pentru interfața MySQL.

Pentru a administra bazele de date MySQL se poate folosi modul linie de comandă sau, prin descărcare de pe internet, o interfață grafică: MySQL Administrator și MySQL Query Browser.[15]

În aplicație, am ales să folosesc un alt instrument de management al bazelor de date, și anume, aplicația gratuită, scrisă în PHP, phpmyadmin, care necesită deschiderea sa într-un browser Web.

Prin această aplicație, se pot efectua diverse sarcini (creare, modificare, etc a tabelelor, câmpurilor sau a întregii baze de date), executarea de instrucțiuni SQL sau administrarea utilizatorilor și a permisiunilor.

Un alt instrument, pe care l-am folosit la realizarea diagramelor și expunerea relațiilor dintre tabele , este MySQL Workbench. Acesta reprezintă un instrument vizual de proiectare a bazei de date care integrează dezvoltare SQL, administrare, creare și mentenanță a bazelor de date într-un singur mediu de dezvoltare integrat pentru sistemul de baze de date MySQL.

Acest produs permite, pe lângă modelarea și desenarea bazei de date și administrarea acesteia, editarea de comenzi SQL, etc. Instrumentul are, totodată, o interfață prietenoasă, ce îl face ușor de utilizat.

Am ales să folosesc această tehnologie, gândindu-mă la un sistem de gestiune cât mai ieftin și totuși cât mai bun. Pe lângă acestea, este și foarte ușor de folosit, este sigur, este popular în rândul dezvoltatorilor de aplicații, și mai ales, poate fi folosit împreună cu o gamă largă de limbaje de programare. Astfel s-a pliat perfect pe ideea unei aplicații cu un cost de lucru cât mai scăzut, alături de tehnologia Java, care oferea același lucru.

2.3 JavaRMI

Aplicația realizată în această lucrare este una client-server. Această tehonologie face ca o aplicație să aibe trei componente: un client, un server și o rețea ce face legătura între cele două.

O aplicație server este aceea care primește o anumită informație de la unul sau mai mulți clienți, o procesează apoi trimite un răspuns clientului înapoi.

Aplicația client este cea care beneficiază de serviciile unui server. Aceasta trimite informație și primește răspunsul aplicației server ce reprezintă informația trimisă procesată.

În termeni mai concreți, calculatorul server de obicei are rolul de a aștepta și rezolva cererile clientului, de a administra accesul la baza de date, iar calculatorul client are responsabilitatea de a rezolva toate cerințele ce pot exista în interfața aplicației, ceea ce dorește clientul să realizeze.

Am ales să construiesc o aplicație client-server, deoarece marele avantaj al acestui tip de aplicație este faptul că mai mulți cliențise pot conecta la același server. Un alt avantaj ar fi raportul calitate-preț care este unul bun, ușurința accesului la o bază de date, fie ea cât de complexă, securitatea datelor, etc.

De obicei, în aplicațiile client server, calculatorul client are două mari responsabilități, și anume: gestionarea interacțiunii cu utilizatorul, care se poate referi la preluarea informației introduse de utilizator, la afișarea rezultatelor căutării înregistrărilor dorite, afișarea erorilor și a meniurilor cu opțiuni în respectivele ferestre, în casete de dialog, etc. Cea de-a doua responsabilitate este logica în care sunt create și dipuse toate elementele menționate anterior.

O astfel de aplicație în care serverul și clientul comunică, se numește aplicație cu obiecte distribuite.

Pentru implementarea aplicației distribuite, am folosit tehnologia Java, RMI. Acest sistem, RMI, asigură comunicarea la distanță între două programe scrise în Java, adică permite ca obiectele ce sunt pe mașini virtuale diferite să colaboreze.

RMI tratează un obiect depărtat diferit de un obiect local, adică, în loc de a face o copie a obiectului implementat pe mașina virtuală receptoare, RMI transmite un ciot (stub, în engleză) depărtat al obiectului depărtat. Acest ciot acționează ca un reprezentant local pentru obiectul îndepărtat. Apelantul invocă o metodă a ciotului local, care este responsabil pentru transmiterea mai departe a apelului către obiectul depărtat. Un ciot al unui obiect depărtat implementează același set de interfețe depărtate pe care le implementează obiectul depărtat.[16]

Transportul datelor în cazul RMI este realizat cu ajutorul protocolului TCP/IP (Trasmission Control Protocol).

TCP reprezintă un protocol sigur orientat pe conexiune care permite ca un flux de octeți trimiși de pe o mașină să ajungă fără erori pe orice altă mașină din inter-rețea. [17]

Așa cum afirmă Asist. Carmen Stanciu, în revista Informatică Economică, nr 9/1999 , în viitor, RMI poate oferi replicare la invocarea metodei și poate chiar alte protocoale de transport diferite de TCP/IP, putând deveni viitorul comunicațiilor orientate pe obiecte.

O astfel de aplicație presupune rularea serverului, după care rularea clientului ce va face cereri către server.

Crearea unui server web nu este întotdeauna un lucru ușor, așadar, pentru a-l face cât mai eficient și cât mai rapid posibil, se poate descărca XAMPP. Acesta reprezintă un pachet de programe free software, open source și cross-platform web server. Pachetul întreg XAMPP cuprinde: Apache, MySQL, PHP + PEAR, MiniPerl, OpenSSL, phpMyAdmin, Panoul de control XAMPP, Webalizer, Sistemul de transport mail Mercury, FileZilla FTP Server, SQLite, ADODB, Zend Optimizer, XAMPP Security, Tomcat. Acestea sunt instrumentele de care este nevoie pentru a crea bazele de date și / sau pentru a administra site-uri web.[18]

Pentru realizarea aplicației mele, am ales să mă folosesc de instrumentul gratuit, scris în PHP, numit phpmyadmin. Acest instrument este destinat să se ocupe de administrarea MySQL și suporta o gamă largă de operații cu MySQL. De exemplu, se pot efectua creări, modificări sau ștergeri baze de date, tabele, câmpuri sau rânduri; executări de instrucțiuni SQL sau administrarea utilizatorilor și a permisiunilor.

De asemenea, XAMPP este disponibil pentru Microsoft Windows, Linux, Solaris și Mac OS X. [19]

Toate cele menționate mai sus atestă avantajul major al folosirii acestui instrument, din punctul de vedere al unei organizații, și anume, reducerea costurilor pentru realizarea aplicației. Din punctul de vedere al realizatorului aplicației este ușor de instalat, întrucât la o singură instalare se obțin toate componentele pachetului XAMPP; panoul de control este foarte accesibil și intuitiv, nu este nevoie de cunoștințe avansate pentru a porni serviciile necesare, iar cerințele pentru sistem sunt minime.

2.4 JasperReports

JasperReports este un program open-source de generare a rapoartelor utilizând bazele de date, având codul scris în Java și care poate scrie într-o varietate de dispozitive de ieșire: ecran, imprimantă, sau poate exporta datele de ieșire în format PDF , HTML , Microsoft Excel , XML, etc. Poate fi folosit în aplicații Java, inclusiv Java EE (Enterprise Edition) sau aplicații Web pentru a genera conținut dinamic. Rapoartele JasperReports sunt definite într-un format de fișier XML, denumit JRXML, care pot fi codate manual, generate, sau proiectate, folosind un instrument. [20]

Pentru a putea folosi astfel de rapoarte este nevoie de importarea în cadrul proiectului a unor librării, ce se descracă gratiut de pe site-ul netbeans.org și de un instrument ce va realiza partea de proiectare a rapoartelor, numit iReports. Acesta poate fi obținut tot gratiut de pe site-ul netbeans.org. Cu ajutorul acestui instrument se pot obține o serie de rapoarte, subrapoarte, grafice, tabele, etc, care pot fi modelate în funcție de nevoile utilizatorului. De exemplu, aceste rapoarte pot fi aranjate înca de la încadrare, de la textul afișat până la introducerea de imagini. În cadrul diverselor firme, este necesară realizarea unor astfel de rapoarte ce sa fie ușor de interpretat, de înțeles și să fie cât mai lizibile. iReports are această calitate de a oferi rapoarte complexe, utile, dar în același timp nu foarte greu de realizat. Un alt avantaj este ca aceste rapoarte pot fi care integrate în orice aplicație Java. De asemenea, JasperSoft este perfect compatibil cu MySQL, ce reprezintă  sistemul de gestiune a bazelor de date  folosit in această aplicație.

2.5 UML

UML sau Unified Modeling Language este un limbaj de modelare standard ce a fost pus la punct de Ivar Jacobson, Grady Booch și James Rumbaugh și a avut un imediat succes, fiind adoptat ca standard de organismul de standardizare pentru comunitatea orientată pe obiect, Object Management Group (OMG).

Acest limbaj a apărut ca un răspuns la dezvoltarea orientată pe obiect a sistemelor informatice și este considerat un pas important spre standardizarea de dezvoltare software.

A înțelege o companie și afacerea dezvoltată de aceasta poate fi o sarcină foarte dificilă. Trebuie să fie înțeleasă activitatea principală a firmei și tot ce implică aceasta, care sunt informațiile cu care se lucrează, care sunt clienții, care sunt partenerii și multe altele. Pe lângă înțelegerea activității desfășurate de o firmă în prezent, trebuie să se privească în perspectivă și să se înțeleagă direcția și viziunea acesteia atât pe termen scurt, cât și pe termen lung.

Cel mai bun mod de a înțelege informațiile ce vin de la o companie este de a începe modelarea descrierii lor. Aici apare importanța deosebită a modelării afacerii, deoarece a fi capabil să vizualizezi afacerea este mult mai util decât să o descrii în cuvinte, fiind mai ușor de înțeles și interpretat.

Utilizând UML, este mult mai rapid pentru diverși proiectanți ce lucrează la anumite sisteme să înțeleagă munca celuilalt, asta pentru că nu mai este nevoie să se piardă timpul cu analiza notațiilor și a semanticii metodologiei, înainte de a-și da seama de logica proiectării.

În drumul său spre analiza și proiectarea orientată pe obiect a diverselor tipuri de sisteme, se folosesc o serie de diagrame. Conform studiilor de specialitate, aceastea pot fi clasificate după patru categorii: diagrame pentru modelarea proceselor de afaceri, pentru modelarea structurii statice și modelarea dinamicii și pentru implementare.

În cadrul primei categorii intră diagrama cazurilor de utilizare, prin care se monitorizează întreg procesul de dezvoltare al sistemului; aceasta modelează felul în care sistemul ar trebui să meargă (cum?), mai degrabă decât ce ar trebui să se facă pentru acest lucru (ce?). Totodată, acest model reprezintă legătura dintre client și dezvoltator, arătând ceea ce utilizatorul așteaptă ca funcționalitate din partea sistemului.

Diagramele pentru modelarea structurii statice sunt: diagrama claselor și cea a obiectelor. Acestea oferă un „instantaneu” al elementelor sistemului, dar nu spun cum se vor comporta elementele. Diagrama claselor sunt modele logice ce se referă la modelarea structurii statice a claselor sistemului și arată structura de bază a acestuia. Diagrama obiectelor modelează structura statică a obiectelor sistemului, adică oferă fapte sub formă de obiecte, ce sunt folosite pentru a testa sau pur și simplu pentru a înțelege diagrama. De cele mai multe ori, câteva exemple concrete (obiecte) reușesc să dezvăluie relații și informații ce au fost ascunse în descrierea generalizată (clasele).

Diagramele pentru modelarea structurii dinamice sunt reprezentate de diagrame de interacțiune și diagrame de comportament. Diagramele de interacțiune arată interacțiunea obiectelor în cadrul sistemului și pot fi folosite pentru a întelege interogările ce vor afecta baza de date și chiar ajută la construirea indecsilorbazați pe informațiile modelate. Diagramele de interacțiune sunt și ele de două feluri: de secvența, care modelează circuitul mesajelor între obiecte; și de colaborare, care modelează interacțiunile între obiecte. Diagramele de comportament sunt: diagrame de stare, care se ocupă de modelarea comportamentului obiectelor din interiorul sistemului; și diagrame de activitate, care se ocupă de modelarea comportamentului cazurilor de utilizare, obiectelor sau operațiilor. Pe scurt, diagrama de activitate descrie procesele și arată demersul acestora, indicând o vedere de calitate superioară asupra afacerii și modul în care aceasta funcționează.

Diagramele pentru implementare sunt, la rândul lor, de trei feluri. Diagrama comportamentelor, care arată stocarea fizică a bazei de date, inclusiv sistemul de gestiune al bazei de date, spațiile de tabele și partițiile. Ele mai pot include și aplicații și interfețele lor, ce sunt folosite pentru accesarea bazei de date. Mai sunt diagramele de desfășurate, care sunt folosite pentru modelarea distribuirii sistemului și arată configurația hardware care este utilizată pentru bazele de date și aplicațiile aferente. Ultimele din această categorie sunt diagramele pachetelor, care se rezumă la gruparea elementelor diagramelor în pachete.

Toate aceste diagrame interacționează între ele pe toată durata ciclului de viață al unui sistem informatic.

UML poate fi folosit, practic, pentru orice fel de analiză și design de proiect, indiferent dacă implică lucrul cu baze de date sau dacă sistemele sunt orientate pe obiect.

Astfel, putem concluziona că folosirea limbajului unificat de modelare are multe avantaje. Un prim avantaj ar fi acela că reușește să împartă o sarcină complexă în mai mulți pași marunți, care sunt mai ușor de urmărit, de înțeles și de administrat. Fiecare diagramă în parte ocupă un loc important în obținerea rezultatului final.

Al doilea avantaj este dat de ideea vizualizării cerințelor, ceea ce ajută mult echipa de dezvoltare să înțeleagă întregul proces. Și eventualele schimbări sunt mai ușor de înțeles cu ajutorul imaginilor, mai degrabă decât din citirea unor paragrafe greoaie și încurcate, care practic descriu același lucru. De asemena, este oferită posibilitatea ca echipă să examineze întrebări precum „Ce se va întâmpla dacă…”.

Alt avantaj al folosirii UML-ului este comunicarea facilă între client și dezvoltator, deoarece în urma diagramelor, clientul știe exact la ce să se aștepte de la aplicație, ce funcționalități va avea la final și totodată lucrul cu un nou dezvoltator se va desfășura ușor, digramele îi vor pune la dipoziție tot ce este necesar pentru a întelege munca dezvoltată până în acel moment.

De asemnea, faptul că se folosește UML, ne asigurăm ca deciziile luate sunt cele mai bune, că aplicația este întocmai ceea ce își dorește clientul, înainte ca dezvoltatorul să treacă la etapa scrierii codului aferent.

Alt mare avantaj, mai ales din punctul de vedere al organizațiilor, este reducerea costurilor de instruire și schimbare a instrumentelor de lucru atunci când se face trecerea de la un proiect la altul sau de la o organizație la alta. [10]

Pentru realizarea diagramelor menționate anterior, am folosit proiectul cu sursă disponibilă (open-source), StarUML. Scopul proiectului StarUML este de a construi un instrument de modelare software și deoarece este un proiect multi-lingvistic, orice limbaje de programare pot fi folosite pentru a dezvolta StarUML (C / C + +, Java, Visual Basic, Delphi, JScript, VBScript, C #, etc).

Analiza și proiectarea bazei de date

3.1 Diagrame UML

După cum aminteam în capitolul 2, în drumul său spre analiza și proiectarea orientată pe obiect a diverselor tipuri de sisteme, se folosesc o serie de diagrame.

Voi incepe cu o diagramă ce implică interacțiuni între actori și sistem. Este vorba de Diagrama cazurilor de utilizare, în care se specifică comportamentul întregului sistem sau a unei părți ale acestuia și care descrie un set de secvențe de acțiuni, pe care sistemul le execută pentru a produce rezultatul dorit de utilizator. Aici, utilizatorii poartă denumirea de actori și pot fi reprezentați de oameni sau de sisteme automate. Acești actori nu fac parte din sistem, ci sunt în afara acestuia, putând fi conectați la cazurile de utilizare prin asocieri.

În cazul de față, actorul va fi reprezentat de angajatul din departamentul se Resurse Umane, iar diagrama va stabili cerințele sistemului prin identificarea utilizărilor necesare unui astfel de departament.

Digramacazurilor de utilizare pentru aplicația realizată vor arăta precum în figura 1:

Figură 2

În al doilea rând, voi aduce in discuție Diagrama de activități, caredescrie procesele și arată demersul acestora pas cu pas, indicând o vedere de calitate asupra afacerii și modul în care aceasta funcționează. De obicei este folosită pentru a descrie activitațile realizate în cadrul unei operații, folosind, dacă este cazul, decizii și condiții. Prin urmare, cei care sunt interesați de acest tip de vizualizare a sistemului sunt designerii și dezvoltatorii.

În cazul aplicației mele, diagramade activitate este prezentată în figura 2:

Următoarea diagramă este cea de clase, ce este utilizată pentru descrierea structurii statice, adică a entitățilorsau claselor existente într-un sistem.Acest tip de diagramă este utilizat cel mai adesea tot de către dezvoltatori pentru specificarea claselor. 

Fiecare clasă din diagramă conține un nume ce o deosebește de celelalte clase, dar șiatribute și operații necesare pentru îndeplinirea resposabilităților fiecărei clase. De asemenea,tot aici se evidențiază și relațiile ce există între acestea.

Diagrama claselor pentru aplicația mea este prezentată în figura 3.

O diagramă de tranziție a stărilor este utilă în modelarea ciclului de viață a unui obiect. Această diagramă arată stările prin care trece obiectul, pe parcursul vieții sale, ca răspuns la diferite eveneimente.O stare este reprezentată de respectarea unei anumite condiții la un moment dat de către un obiect. Modificarea acstor stări se numește tranziție.O tranziție are cinci părți: starea sursă, evenimentul declanșator, condiția, acțiunea și starea destinație. Despre acțiuni putem spune ca se recunosc ușor după verbele standard ce le însoțesc: Entry / intrare – acțiune efectuată la intrare într-o stare, Exit / ieșire – acțiune efectuată la ieșirea dintr-ostare, Do / acțiune efectuată pe parcursul unei stări. Un exemplu de diagramă de stare pentru aplicația mea poate fi observant în figura 4:

Figură 4. Diagrama de stare

3.2 Date de intrare

Aplicația a fost construită astfel încât accesul la date să poată fi făcut doar de către angajații din departamentul de Resurse Umane sau de persoanele autorizate, care se ocupă cu managementul personalului.

Pentru a fi posibil acest lucru, înainte de a putea introduce date despre angajați, de a obține informații despre aceștia, rapoarte, etc. este necesar autentificarea persoanei ce va lucra cu aceste date.În procesul de înregistrare, fiecărui angajat i se va cere numele de utilizator, care va avea o structură standard pentru toți angajații, și anume: nume. prenume, și o parolă pentru a spori gradul de securitate prin identificarea unică a fiecărui utilizator.

Datele de înregistrare ale tuturor utilizatorilor se vor stoca într-o singură tabelă, numită utilizatori, care va cuprinde următoarele informații: utilizator și parolă. Ambele câmpuri vor fi de tip Text.

După ce un angajat se conectează, acesta poate introduce mai multe date referitoare la tot personalul organizației. Datele necesare vor fi prezentate în cele ce urmează, grupate pe tabele.

Este de menționat faptul că fiecare tabelă va beneficia de un ID, de tip int, pe lângă alte atribute, care reprezintă cheia primară și va avea proprietatea de autoincrementare.

Datele personale ce corespund fiecărui angajat în parte sunt stocate într-o tabelă numită angajați. Aceasta va avea următoarele coloane:

numele de familie al angajatului, de tip Text

prenumele angajatului, de tip Text ; împreună cu numele, aceste coloane rețin numele complet al angajatului cu care s-a încheiat contractul de muncă

CNP, de tip Text, care va reține codul numeric personal al fiecărui angajat

numărul de telefon, de tip Text

adresa de mail, de tip Text

data nașterii, de tip Date, care va reține data nașterii angajatului pentru diverse scopuri, precum: bonusuri la aniversări, pensionare, etc.

data angajării, de tip Date, care este utilă la stabilirea vechimii pentru acordarea bonusurilor, pentru promovare, etc.

starea civilă, de tip Text, care este o dată personală importantă în funcție de care depinde disponibilitatea angajatului pentru delegații, în principal

statuspersoana întreținută, de tip boolean, care va determina dacă un angajat are persoane în întreținere sau nu, lucru ce va fi folosit la calcul salariului și ale bonusurilor de sărbători, ș.a.m.d.

Departamentele organizației sunt păstrate într-o tabelă cu numele departamente și care are următoarele câmpuri:

denumire, de tip Text, care va purta numele departamentului

descriere, de tip Text, care va descrie pe scurt departamentul în cauză

Posturile ce sunt disponibile în fiecare departament, vor fi stocate într-o tabelă cu numele posturi și va conține următoarele informații:

denumire, de tip Text, care va reprezenta numele postului conform structurii organizatorice

descriere, de tip Text, care va puncta pe scurt câteva idei din fișa postului

salariul minim, de tip double, care va reprezenta limita inferioară a oricărui salariu oferit pentru acest post

salariul maxim, de tip double, care va reprezenta limita superioară a oricărui salariu oferit pentru acest post

ID-ul departamentului, care este o cheie externă (în engleză, Foreign Key- FK) de tip int și care va face legătura postului cu departamentul de care aparține

spor manager, de tip boolean și va determina dacă un angajat este manager sau nu, lucru util la salarizare, bonusuri, etc.

spor confidențialitate, de tip boolean, care determină dacă un angajat lucrează cu date confidențiale sau nu, în funcție de asta vor exista anumite bonusuri, beneficii, etc.

Beneficiile de care poate dispune un angajat sunt regăsite într-o tabelă intitulată beneficii și are următoarele informații:

denumire, de tip Text , care dă numele tipului de beneficiu acordat, care poate fi legat de asigurare medicală, reduceri la sala de sport, etc.

suma datorată de organizație, de tip double, care va reprezenta costul total al beneficiilor acordate fiecărui angajat

Tabela următoare, pachete_beneficii, este construită ca legătură între angajat și beneficiul ce îi corespunde. Această tabelă dispune de următoarele informații:

ID-ul angajatului, cheie externă de tip int, care face conexiunea cu angajatul în cauză

ID-ul beneficiului, cheie externă de tip int, ce corespunde beneficiului oferit

Informațiile referitoare la concediile fiecărui angajat sunt prezentate în tabela concedii, astfel:

Id-ul angajatului, de tip int, care leagă tipul și zilele de concediu de fiecare angajat în parte

zilele de concediu, de tip int, care reprezintă zilele disponibile/ rămase

ID-ul tipului de concediu, ce reprezintă cheie externă de tip int și care va determina tipul de concediu pe care angajatul îl cere

anul, de tip float, ce va fi folositor în cazul adăugării în baza de date a informațiilor pe durata a doi ani consecutivi

statusul, de tip int, care va stabili dacă un concediu este aprobat (1), respins (2) sau dacă necesită aprobare (0)

dată_început, de tip Date, necesară demersului de aprobare concedii

dată_sfârșit, de tip Date, necesară, de asemenea, demersului de aprobare concedii

O altă tabelă este cea denumită tipuri_concediu și are următoarele informații:

denumirea, de tip Text, care reprezintă denumirea tipului de concediu, acesta putând fi de odihnă, medical, de formare profesională, etc.

coloana cu_fără_plată, de tip boolean, care reține dacă concediul respectiv va fi plătit sau nu

Informațiile de bază referitoare la salariul fiecărui angajat se află în tabela salarii, care are următoarele coloane:

salariul brut, de tip double și care reprezintă veniturile salariale din care se obține salariul net după deducerea unor cheltuieli și se mai obține în continuare venitul impozabil după aplicarea deducerilor asupra salariului net

data plății salariului, de tip Date

valuta, de tip Text, care reprezintă valuta în care salariul a fost negociat prin contract; aceasta poate fi RON sau EUR

Informațiile ce țin de istoricul unui angajat într-o firmă se află în tabela istoric_angajați și are rolul de a urmări evoluția fiecăruia în cadrul organizației. Coloanele acestei tabele sunt:

ID-ul angajatului, cheie externă de tip int, care face legătura cu tabela angajați

ID-ul departamentului, cheie externă de tip int, care face legătura cu tabela departamente

ID-ul postului, cheie externă de tip int, care face legatura cu tabela posturi

ID-ul salariului, cheie externă de tip int, care face legătura cu tabela salarii

status, de tip boolean, care are rolul de a preciza dacă datele unui angajat sunt actuale sau nu.

Informațiile despre persoanele întreținute ale fiecărui angajat sunt stocate în tabela persoane_intreținute. Aceste informații sunt:

denumire, de tip Text, care desemnează tipul persoanei întreținute, precum soț, copil sau orice rudă de maxim gradul 2, inclusiv

data nașterii persoanei întreținute, de tip Date, care este importantă mai ales în cazul denumirii „copil”

venit, de tip double, care reprezintă venitul persoanei întreținute, ce nu poate depăși suma de 250 RON

ID-ul angajatului, cheie externă de tip int, care face legătura cu tabela angajați pentru a stabili cărui angajat îi corespunde persoana întreținută

Ultima tabela este cea de constante, după cum am denumit-o, deoarece va stoca date referitoare , CASS, șomaj, deduceri personale, bonuri, prime, sporuri, etc. Aceste informații de obicei sunt date prin lege sau în funcție de politica fiecărei firme în parte. Câmpurile tabelei sunt:

nume, de tip Text, ce va desemna denumirea constantei

procent , de tip double, care va reprezenta procentul aferent constantei

Toate cele 12 tabele prezentate anterior au, în plus, câte un câmp de unicitate, ID, ce va reprezenta cheia primară a fiecărei tabele.

3.3 Schema bazei de date

În activitatea de proiectare a structurii bazei de date relaționale este esențial să ținem cont de formele de normalizare, care au scopul de a înlătura anomaliile sau de le evita de la bun început. Normalizarea bazei de date împiedică, de exemplu, existența datelor redundante, existența unor date ce se pot obține din interogări ale datelor deja existente, etc.

În mod normal, există șase forme normale definite de teoria bazelor de date, însă ultimele trei sunt rar folosite. Primele trei forme normale aparțin lui Edgar Codd și sună în felul următor:

Forma normală 1 (FN1) constă în faptul că entitatea nu conține atribute cu valori multiple și nu conține atribute sau grupuri de atribute care să se repete. În cazul în care acestea există, se crează o tabelă suplimentară ce se va lega de entitatea originală printr-o relație unul-la-mai-mulți.

Forma normală 2 (FN2) presupune ca entitatea să fie deja în forma normală 1 și, în plus, orice atribut non-cheie primară al tabelei este dependent funcțional complet de cheia primară.

Forma normală 3 (FN3) presupune ca o entitate să fie în forma normală 2 și, în plus, nici un atribut care nu este cheie primară, nu depinde de un alt atribut non-cheie primară.

Pe lângă regulile lui Codd, la realizarea bazei de date am ținut cont și de restricțiile de integritate. Acestea definesc cerințele pe care trebuie să le satisfacă datele în cadrul bazei de date pentru a putea fi considerate corecte și coerente în raport cu domeniul pe care îl reflectă. [14]

Baza de date folosită în aplicație aparține serverului MySQL, are 12 tabele și se prezintă sub forma următoare, din figura 5:

Schema conceptuală a bazei de date a fost obținută cu ajutorul instrumentului MySQL Workbench și este prezentată în continuare în figura 6:

3.4 Date de ieșire

Rezultatele procesărilor și orice altă informație pe care utilizatorul o va cere sistemului reprezintă datele de ieșire ale aplicației. Pentru a obține aceste date se vor apela funcții ce au în spate comenzi SQL și care vor fi vizibile utilizatorului prin intermediul interfețelor.

Date de ieșire pot fi, de exemplu, afișarea unei liste cu toți angajații, cu toate departamentele sau posturile, etc; pot fi căutări în rândul acelorași tabele, pot fi modificări ce trebuie aplicate tabelelor, pot fi informații referitoare la salarii, măriri, promovări, dar și la concedii –zile rămase, tip de concediu, etc – și la pachetele de beneficii de care dispun angajații organizației.

Pentru fiecare cerere a utilizatorului, returnarea rezultatului propriu-zis va fi însoțit și de o notificare. Aceasta are scopul de a asigura angajatul departamentului de resurse umane că datele introduse de el sunt corecte (acest lucru se obține în urma validărilor), dar și ca funcționalitatea apelată de acesta a fost îndeplinită; pe scurt, există mesaje de confirmare/succes și de eroare.

3.5 Validarea datelor

Într-o aplicație este foarte important ca datele introduse să respecte anumite reguli, care să fie considerate standard pentru fiecare utilizator. Astfel că la introducerea în câmpuri a datelor, acestea vor fi verificate conform algoritmului din spatele aplicației, care va returna un mesaj de eroare, alături de soluția pentru rezolvarea erorii, în cazul introducerii incorecte a unui caracter/a unei cifre.

În tabela utilizatori, pentru câmpurile utilizator și parolă, se va verifica dacă utilizatorul a introdus date, adică câmpurile nu trebuie să fie nule. De asemenea, a fost stabilit ca numele utilizatorului să fie sub forma nume.prenume, lucru ce va fi verificat la fiecare autentificare.

În tabela angajați, pentru câmpul mail, se va verifica dacă acesta conține “@” și “. “. Mailul anagajaților este foarte important în comunicarea internă, dar și în relațiile angajaților cu exteriorul/ cu alte organizații. Totodată numărul de telefon este foarte util, iar acesta trebuie verificat dacă are exact 10 cifre.

Tot în această tabelă se va verifica dacă CNP-ul este introdus corect. Acesta este supus unei validări în cadrul căreia câmpul nu trebuie să fie lăsat necompletat; apoi numărul de cifre trebuie să fie exact 13, și abia apoi se face verificarea cifrelor introduse astfel încât acestea să urmeze modelul: SAALLZZJJNNNC. Validarea privește autenticitatea CNP-ului după un algoritm precis. S reprezintă sexul utilizatorului, AA este anul în care acesta s-a născut, LL luna în care s-a născut și ZZ ziua în care s-a născut, iar NNN este un număr format din 3 cifre din intervalul 001 – 999. Numerele din acest interval se împart pe județe, cărora îi sunt atribuite două cifre, iar Capitalei și sectoarelor câte o cifră și care diferențiază și persoanele de același sex născute la aceeași dată.C este cifră de control (un cod autodetector) aflată în relație cu toate celelalte 12 cifre ale CNP-ului. În plus, CNP-ul este cosiderat unic, astfel nu vor putea exista două persoane cu același CNP înregistrate în baza de date.

În tabela persoane_întreținute, se face verificarea vârstei persoanei întreținute, a cărei venit nu trebuie să depășească 250 RON. De asemenea, dacă din lista de opțiuni ale tipului persoanei întreținute se alege Copil < 18 ani sau Student <26 ani, vârsta acestora trebuie verificată cu data nașterii introduse anterior pentru acest câmp.

În tabela posturi, se verifică dacă salariul maxim are o valoare mai mică decât salariul minim introdus, iar salariul minim nu trebuie sa fie sub valoarea 0.

În tabela salarii, se verifică dacă valoarea introdusă în câmpul salariu brut, se află între limitele minime și maxime corespunzătoare postului angajatului în cauză.

Prezentarea și testarea aplicației

4.1 Prezentarea funcționalității aplicației

În capitolul anterior, la prezentarea tabelelor, au fost prezentate succint și validările necesare datelor de intrare. În capitolul 4, vor fi prezentate într-un cadru mai practic aceste validări, fiind explicat întregul proces per ansamblu. Acest lucru înseamnă, că pe lângă menționarea tuturor validărilor necesare, voi menționa motivele alegerilor făcute, dar și mesajele returnate utilizatorului în cazul unei introduceri eronate a informațiilor.

În primul rând, accesul la date se va face doar pe baza unui utilizator și a unei parole ce va fi cunoscută doar de persoana în cauză. În acest fel se împiedică accesul persoanelor neautorizate la datele personale ce țin de angajații firmei.

După autentificarea personalului, acestora li se va deschide fereastra principală ce va conține o serie de meniuri cu opțiuni în funcție de ce operații se dorește a se realiza.

Pentru lucrul cu angajații efectiv, va exista un meniu special Angajați, ce va conține alte submeniuri, care se vor referi la adăugare –Adaugă angajat, afișare –Afișează angajați și încă unul pentru a adauga un beneficiu sau mai multe unui angajat anume – Adaugă beneficiu.

La apăsarea pe submeniul de Adaugă angajat, se va deschide o fereastră nouă ce va permite introducerea datelor necesare unui angajat al firmei: nume, prenume, număr de telefon, adresă de mail, data nașterii, adresă curentă, CNP, starea civilă, data angajării, salariul brut, data plății salariului, departamentul și postul, dar și dacă acesta are persoane de întreținut. Pentru datele introduse există diverse validări înainte ca acestea să fie adăugate în baza de date. Un exemplu de validare importantă este valoarea salariului brut, care trebuie sa fie cuprins între limitele- inferioară și superioară- ale postului ocupat, astfel făcându-se și o restricție împotriva completării câmpului cu o valoare negativă. În plus, o validare foarte importantă este aceea că un CNP nu poate fi adăugat de doua ori în baza de date, acesta fiind considerat unic pentru fiecare angajat în parte. La acestea se adaugă validările pentru CNP menționate în capitolul 3 – conform cărora un CNP inexistent nu poate fi adăugat. De asemenea, se face și validarea mail-ului conform criteriilor menționate tot în capitolul 3, astfel încât acesta să fie de forma [anonimizat]. În cazul înserării greșite, utilizatorul va fi informat de greșeala comisă.

După cum este menționat în art. 56 din Codul Fiscal, persoanele fizice , pentru veniturile realizate pe teritoriul României, au dreptul la deducerea din venitul net lunar din salarii, a unei sume impozabile, doar dacă salariul lunar brut al acestora nu depășeste 1000 lei.

În acest scop, aplicația va face o verificare a valorii salariului brut, iar în cazul în care acesta este sub 1000 lei, se va activa butonul de alegere “DA” pentru adăugarea unei persoane întreținute, altfel, butonul va rămâne setat pe “NU”, cel cu “DA” fiind inactiv pentru a nu se adăuga persoane întreținute din greșeală atunci când nu este cazul. La apăsarea butonului de adăugare angajat, în cazul unui răspuns afirmativ pentru persoana întreținută, se va deschide o nouă fereastră de adăugare a acestei persoane, cu mențiunea că aceasta poate fi adăugată în baza de date doar dacă veniturile sale, impozabile sau nu, nu depășesc 250 lei lunar. Pe lângă câmpul pentru venit, există unul pentru data nașterii persoanei respective, ce se va alege dintr-un control de tip calendar; și încă o listă de selecție pentru a alege categoria de persoană, lista ce este populată conform persoanelor permise prin lege: copil până la 18 ani, student până la 26 ani, soț/soție, rudă de gradul întâi sau doi.

De asemenea, după deschiderea ferestrei de Adăugare persoane întreținute, butonul de Adaugă angajat devine inactiv pentru a nu putea introduce de două ori aceleași date despre o persoană, prin apăsarea repetată, fără voie, a butonului de adăugare. Oricum, într-o astfel de situație, ar interveni validarea pentru unicitatea CNP-ului în baza de date, care nu ar permite înserarea aceleași persoane de două ori. Pe de altă parte, fereastra de Adăugare persoană întreținută va sta deschisă atâta timp cât nu se apasă pe butonul Închide formular persoană întreținută; în acest fel se pot adăuga mai multe persoane întreținute de-o dată, pentru același angajat, în cazul în care acest lucru este necesar. La apăsarea butonului de Adaugă persoana întreținută, datele introduse sunt adăugate în baza de date în tabela corespunzătoare, iar câmpurile revin la starea inițială, adică necompletate, pentru a se realiza o nouă intrare.

Deducerile personale se acordă în funcție de numărul de persoane întreținute – 350 lei pentru o persoană, 450 lei pentru 2 persoane întreținute, 550 lei pentru 3 persoane și 650 lei lunar pentru 4 sau mai multe persoane. În categoria persoanelor întreținute intră, după cum sunt afișate și în formularul de adăugare, următoarele: soț/soție, copiii sau alți membri ai familiei, precum și rudele contribuabilului sau ale soțului/soției până la gradul II de rudenie. Este de menționat faptul că în cazul copiilor, poate beneficia de deducerea personală doar un contribuabil (un părinte) conform întelegerii între părți. Copiii sunt considerați cei minori, în vârstă de până la 18 ani împliniți și cei până la 25-26 ani, dacă urmează studii universitare, cursuri de zi.[21]

Revenind la fereastra principală, după cum spuneam, unui angajat i se pot oferi anumite beneficii, precum: tichete valorice pentru vacanță, tichete cadou de sărbători, cadouri la diferite ocazii, telefon și cartelă telefonică, prima de ajutor – acodate tuturor angajaților la nașterea unui copil sau, în cazuri nefericite, la decesul unei rude de gradul maxim doi,asigurare medicală – pachete individuale și pentru familie, asigurare servicii stomatologice, facilitate transport, facilitate de recreere, mese gratiuite etc.

La apăsarea pe meniul de Adaugă beneficii se va deschide o nouă fereastră ce va avea o listă de tip selecție, actualizată, cu toți angajații din care se poate alege angajatul căruia se dorește a i se oferi un beneficiu sau, dimpotrivă, a i se retrage unul. Beneficiile curente ale angajatului ales vor apărea într-o listă în partea stângă, iar lista tuturor beneficiilor oferite de firmă, se vor afla într-o listă, de asemenea actualizată, în partea dreaptă a ferestrei. Pentru a oferi beneficii sau pentru a le lua, mecanismul este unul simplu, și anume, de Trage și Adaugă (Drag and Drop), funcționând din partea stângă către partea dreaptă pentru înlăturarea beneficiului și invers, din partea dreaptă către partea stângă pentru a adăuga un nou beneficiu angajatului. Fereastra va dispune și de un buton – Adaugă beneficii, care va finaliza operațiile realizate de către angajatul de Resurse Umane pentru un anumit angajat.

În fereastra principală, se mai află un meniu numit Management, care cuprinde o nouă serie de submeniuri referitoare la adăugări și afișări de departamente, posturi, beneficii (cele generale) și tipuri de concedii. Astfel, vom avea submeniul de Adaugă department, iar la apăsarea acestuia se va deschide o noua fereastră, ce va avea următoarele câmpuri de completat: nume și descriere. Noua fereastră va dispune și de un buton, care va înregistra modificările realizate de angajatul din departamentul de Resurse Umane și va actualiza baza de date în tabela corespunzătoare –departamente. De asemenea, câmpurile sunt obligatorii, astfel că nu se va putea lăsa vreunul necompletat, iar aplicația va sesiza eroarea și va anunța utilizatorul care a fost greșeala făcută.

Următorul submeniu este pentru adăugarea postului, iar la apăsarea acestuia se va deschide o nouă fereastră, ce va avea următoarele câmpuri: denumire, descriere, departamentul din care face parte postul – această listă va fi încărcată din baza de date, cu departamentele deja existente, astfel că există un control al legăturii dintre un departament și posturile sale; niciun post nu va putea în acest fel să nu aparțină de un departament; salariul minim și salariul maxim –acestea vor fi verificate împreună astfel încât să nu existe greșeala completării unui salariu minim mai mare ca cel maxim-, după care urmează două liste pentru spor de manager și spor de confidențialitate, ce vor avea ca opțiuni de răspuns DA și NU, adică unui angajat i se acordă sau nu unul dintre aceste sporuri. Toate câmpurile sunt, din nou, obligatorii și niciunul nu poate fi lăsat necompletat.

Un alt submeniu în fereastra principală este acela de a adăuga un nou beneficiu în baza de date, presupunând ca firma alege să introducă o nouă motivare pentru angajații săi. Se va deschide o nouă fereastră, ce va conține două câmpuri: denumire și valoare beneficiu, dar și un buton ce va permite stocarea informațiilor în baza de date. La fel ca și până acum, în cazul introducerii eronate a sumei (introducerea unui număr negativ, de exemplu) sau al necompletării câmpurilor,se va atenționa utilizatorul asupra greșelilor făcute.

Submeniul de adăugare a unui tip de concediu, va deschide o nouă fereastră ce va avea câmpurile: denumire și tip plată. Pentru tipul plății, se va alege dintr-o listă de două elemente, dacă concediul va fi cu sau fără plată. Tipurile de concedii pot fi următoarele: de odihnă, medical, de formare profesională, pentru îngrijirea copilului bolnav, pentru evenimente familiale speciale.

Un al treilea meniu în fereastra principală este acela de Utilizatori, care dispune de un submeniu ce permite adăugarea unui nou utilizator, adică a unui nou angajat în departamentul de Resurse Umane ce va trebui să aibă acces la datele confidențiale ale angajaților firmei. La apăsarea pe submeniul Adaugă utilizator nou, se va deschide o nouă fereastră, ce va conține câmpuri de completat pentru nume și parolă, fiind, la rândul lor validate corespunzător (precum la o adăugare normală).

Așadar, în ceea ce privește adăugarea, dar și modificarea datelor din baza de date, acestea trec printr-o serie de validări, după caz, iar în situația în care câmpurile nu sunt completate corespunzător, un mesaj de eroare va apărea pe ecran, informând utilizatorul ce trebuie modificat; în plus, câmpul completat greșit va fi încadrat de un chenar roșu.

Fereastra principală dispune și de o listă actualizată o dată la o secundă (1000 ms) cu ajutorul firelor de execuție (engl. Threads)[22] în care se pot afișa angajații, departamentele, posturile, beneficiile, tipurile de concediu și utilizatorii curenți, în funcție de ce submeniu este ales.

Pentru afișarea angajaților se va accesa submeniul Afișează angajați din meniul Angajați, iar pentru restul se va accesa meniul Management din care se va selecta dintre submeniurile: Afișează departamente, Afișează posturi, Afișează beneficii, Afișează tipurile de concediu sau meniul Utilizatori, din care se poate selecta cel de-al doilea submeniu – Afișează utilizatori.

Tot la nivelul fereastrei principale, există facilitatea căutării unui angajat după nume, acest lucru ușurând în mod evident munca personalului de Există un câmp special în care se va introduce numele dorit sau o parte a acestuia (prima literă, un grup de litere, etc), iar după apăsarea butonului numit intuitiv, “Caută angajat”, se vor afișa în aceeași listă menționată anterior, angajații sau angajatul, aceștia fiind preluați anterior din baza de date și aduși în lista respectivă.

Pentru modificarea și ștergerea oricărui angajat, post, departament, beneficiu sau utilizator, tot în fereastra principală am implementat o funcționalitate la dublu-click pe elementele afișate în listă. Astfel că, pentru a realiza oricare dintre cele doua operații, în primul rând se va selecta submeniul corespunzător elementelor de modificat sau de șters, din meniul Angajați, Management sau Utilizator, urmând a se încărca lista actualizată a acestora. Apoi, utilizatorul poate alege numele/denumirea asupra căror informații dorește a realiza schimbări. Aceste schimbări pot fi făcute și pentru angajații afișați în urma căutării anterior menționate.

Mai concret, la dublu click pe un element al listei, se va deschide o mică fereastră intermediară ce va avea două butoane cu următoarele opțiuni: Modifică și Șterge. Pentru salarizare, va exista un buton numit Afișează salariu net, tot în această fereastră, care însă va fi vizibil doar la selectarea unui angajat. La fel este și în cazul aprobării concediilor, pentru care există un buton cu textul Aprobare concedii și este vizibil doar la selectarea angajaților. Înainte de a se deschide fereastra intermediară, se va face o verificare pentru a vedea ce instanță de obiect este elementul ales din lista actualizată. În cazul în care a fost selectat un angajat, butonul pentru salarizare și el pentru concedii vor deveni active, iar în cazul alegerii oricărui alt element din lista, butoanele nu vor fi vizibile utilizatorului, deci nu le va putea accesa.

La apăsarea butonului de ștergere, elementul selectat va fi șters din baza de date și, automat, din lista de afisaj. În plus, un mesaj de informare corespunzător va fi afișat pe ecran, pentru a anunța utilizatorul ca operațiunea a fost realizată cu succes.

La apăsarea butonului de modificare, se vor deschide ferestre corespunzătoare elementului selectat, ale căror câmpuri vor fi deja completate la deschidere cu informațiile din baza de date existente pentru elementul în cauză.

În cazul în care lista de afișaj conține angajații firmei, la apăsarea opțiunii de modificare, se va deschide o fereastră ce va avea patru file (engl. Tab-uri) poziționate în partea de sus a ferestrei cu următoarele denumiri aferente funcționalității lor:

Date personale, care va cuprinde câmpuri precompletate în genul: nume, prenume, număr de telefon, adresa de mail, CNP, adresa fizică curentă, data nașterii, data angajării, starea civilă și un meniu cu răspuns DA sau NU pentru a anunța că există sau nu o persoană întreținută de respectivul angajat.

Beneficii, de unde se pot adăuga sau înlătura beneficii la lista inițială de beneficii deținute de respectivul angajat. Acest lucru se realizează printr-un sistem de Trage și Adaugă (Drag & Drop), la fel ca în cazul adăugării de noi beneficii unui angajat. Această fereastră pentru Beneficii este împărțită în două liste, cea din stânga populate cu beneficiile deja existente în lista angajatului resepctiv, iar cea din dreapta, care afișează toate beneficiile oferite în general de firma respectivă.

Concedii, care va conține un câmp special în care se va afișa actualizat numărul de zile rămase, permise pentru concediu din numărul de zile disponibile într-un an pentru fiecare angajat-pentru concediu medical și pentru cel de odihnă. Există un câmp deja populat cu tipurile de concedii posibile, din care utilizatorul va alege ceea ce angajatul dorește, dar și două calendare ce vor prelua data de început și data de sfârșit a concediului. Aplicația realizează o operație prin care se va calcula numărul de zile selectate din calendar, din care le va exclude pe cele de sfârșit de săptămână (weekend), dar va exclude și acele zile, care sunt libere prin lege deoarece sunt considerate sărbători naționale. Astfel, se va obține un nou număr, ce se va scădea din numărul de zile disponibile pentru concediu într-un an și se va afișa în câmpul aferent textului “Zile concediu rămase”. Zilele libere prin lege sunt următoarele: 1 și 2 ianuarie; prima și a doua zi de Paște –acestea sunt calculcate conform unui algoritm specific ce determină zilele în care se va sărbători Paștele în anii ce urmează; 1 mai; prima și a doua zi de Rusalii- care se sărbătoresc la 50 de zile după Paște; 15 august Adormirea Maicii Domnului; 30 noiembrie Sfântul Apostol Andrei, 1 decembrie, prima și a doua zi de crăciun – 25 și 26 decembrie.

Aceasta este modalitatea prin care se acordă concediu unui angajat.

Post, care va conține informațiile curente ale angajatului cu privire la postul, departamentul aferent, limitele salariului brut, salariul brut, alături de valuta corespunzătoare din contractul individual și data plății salariului lunar. Mai întâi se va selecta departamentul de care aparține noua funcție, iar apoi aplicația va încărca într-o listă de selecție posturile disponibile pentru respectivul departament, permițând astfel utilizatorului să aleagă noua funcție. Salariul brut se va afla într-un câmp text pentru a putea fi modificat conform fișei noului post, însă nu va avea voie să se afle în afara limitelor, minime și maxime, stabilite. Salariile minime și maxime vor fi încărcate într-un câmp ce nu poate fi modificat de către utilizator, iar la selectarea altui post din listă, câmpurile se vor reîncarca cu limitele salariale corespunzătoare noii selecții. Toate aceste câmpuri sunt necesare, deoarece în cazul în care se dorește schimbarea funcției unui angajat în cadul firmei, toate modificările ce au legatură ce acesta trebuie să fie corecte (de exemplu salariul trebuie să corespundă limitelor salariale). Pentru a se respecta condițiile de corectitudine, vor fi făcute validări specifice, iar în cazul completării greșite a salariului, de exemplu, chenarul aferent acestuia se va face roșu, iar utilizatorul va primi un mesaj de eroare, alături de un text cu instrucțiunile necesare unei completări corecte a câmpului.

În afară de fila pentru concedii, care va dispune de un buton inscripționat Adaugă concediu, restul vor conține butoane ce vor indica textul Modifică. Toate ferestrele de modificare vor conține aceleași metode de validare precum cele inițiale de la adăugare, în acest fel, noile informațiile stocate în baza de date vor fi la fel de corecte.

Dacă în lista din fereastra principală se vor găsi afișate departamentele, la apăsarea butonului de modificare, se va deschide o nouă fereastră ale cărei câmpuri vor fi deja completate la deschidere cu informațiile existente în baza de date referitoare la numele și la descrierea departamentului. Fereastra dispune de un buton Modifică, ce va finaliza schimbările realizate de utilizator în cadrul respectivului departament. Datele introduse vor fi validate precum sunt la introducerea unui nou departament.

Dacă în listă se află posturile disponibile în cadrul companiei, atunci la apăsarea pe butonul de modificare din fereastra intermediară, va deschide o nouă fereastră ce va conține câmpuri precompletate cu infomații din baza de date, referitoare la denumire, descriere, departamentul din care face parte, salariul minim și cel maxim, plus încă două câmpuri cu răspuns unic -DA sau NU pentru sporuri – de manager și de confidențialitate. Validările vor fi aceleași ca în cazul adăugării unui post nou, astfel încât informația trimisă în baza de date va fi cât se poate de corectă.

Pentru beneficiile afișate în listă, la alegerea opțiunii de modificare din fereastra intermediară, se va deschide o nouă fereastră, care va permite schimbarea denumirii și valorii beneficiului selectat, aplicând aceste modificări și în baza de date. După realizarea validărilor corespunzătoare, la apăsarea butonului de Modificare beneficiu, se vor înregistra schimbările corespunzătoare.

În cazul în care lista este populată cu tipurile de beneficii oferite în prezent de către firma respectivă, după selectarea unui tip de concediu și alegerea opțiunii de modificare din fereastra principală, se va deschide o nouă fereastră. Aceasta va fi deja completată cu informațiile aferente tipului de concediu respectiv, cu posibilitatea de modificare a denumirii, dar și a tipului de plată –cu sau fără plată. După validările corespunzătoare, la apăsarea butonului de Modificare tip concediu, schimbările vor fi înregistrate în baza de date.

În fereastra principală, la afișarea listei cu utlizatorii existenți, se poate face click de două ori pe un utilizator și se deschide fereastra intermediară ce permite ștergerea sau modificarea unui utilizator. În principiu, această opțiune este utilă în cazul în care un utilizator își uită parola, astfel o poate schimba sau în cazul părăsirii departamentului de Resurse Umane a unui angajat.

În capitolul 1 am vorbit despre recompense, care au rolul de a dezvolta interesul pentru muncă, în vederea realizării obiectivelor organizației. Aici am amintit o formă importantă de recompensare a angajaților –cea materială, și anume: salariul. Pentru a acorda unui angajat salariul cuvenit lună de lună, am implementat o fereastră ce se va deschide la apasărea butonului Afișează salariul net din fereastra intermediară discutată anterior, buton ce este este vizibil doar în cazul selectării unui angajat din listă.

Noua fereastră, numită Salarizare, va fi de tipul unui fluturaș ce va putea fi printat și acordat fiecărui angajat în parte. Deoarece s-a dorit tipărirea acestui raport de salarizare, în partea dreaptă a ferestrei va exista o zonă needitabilă, numită Date Angajat, care va afișa numele, postul și departamentul curent al angajatului selectat din listă. Astfel, fiecare va primi un raport personalizat cu datele referitoare la salariu. Câmpurile conținute de această fereastră sunt următoarele: Salariul BRUT- alături de valută, Zile concediu plătit – numărul zilelor într-un câmp, dar și suma ce îi revine angajatului pentru acele zile – calculată ca număr de zile înmulțit cu plata zilnică; Zile concediu neplătit – zile și suma aferentă – calculată ca număr de zile înmulțit cu plata zilnică; Spor manager, Spor confidențialitate, Spor vechime – toate având un câmp alâturi cu suma aferentă ce se calculează ca parte din venitul brut inițial; Valoare totală beneficii alese de angajat –ce se va aduna la total salariul brut pentru ca mai apoi să se impoziteze; Bonus- și acesta se adaugă în totalul salariului brut; Total salariu brut –suma celor menționate anterior, Valoare bonuri de masă; apoi sunt trei câmpuri referitoare la taxe: CAS, CASS, ȘOMAJ, care conțin procentul reținut prin lege și suma aferentă procentului, calculată din salariul brut (care conține și valoarea beneficiilor; un câmp pentru Total taxe- în care se vor însuma câmpurile de mai sus; Valoare deducere personală- calculate în funcție de numărul de persoane întreținute; Venitul impozabil – care reprezintă totalul salariului brut din care se scade totalul taxelor și valoarea deducerilor personale – care nu trebuie să fie impozitate cu 16% și la care se adună valoarea bonurilor de masă – care sunt impozabile de la 01.iulie 2010, conform art. 55 din Codul Fiscal care prevede ca veniturile acestea se impozitează precum venituri din salarii în luna în care acestea sunt primite; Beneficii reținute –sumă ce se va scădea din venitul impozabil și un ultim câmp Salariul NET – ce va reprezenta suma totală primită lunar de către un angajat. Salariul NET se obține scăzând din venitul impozabil valoarea impozitelor și beneficiile angajatului, dar la care se adaugă suma totală a deducerilor personale.

Toate aceste câmpuri sunt needitabile, pot fi doar vizualizate de către utilizator, toate calculele realizându-se automat, pe baza informațiilor stocate în baza de date. De asemenea, câmpurile au fost așezate astfel încât totul să fie ușor vizibil oricărui angajat.

Inițial, fereastra va conține câmpurile necompletate, iar utilizatorul are rolul de a selecta din partea stânga-sus a ferestrei luna și anul pe care se dorește a se realiza salarizarea. Aceste două câmpuri vor fi setate la deschidere cu luna și anul curente. Alături, se află un buton Afișează salariu, pe care utilizatorul trebuie să îl apese pentru a se încarca restul campurilor existente, mentionate anterior. Salariul final, primit de angajat, asa cum spuneam, se va afla in ultimul camp, numit Salariu TOTAL. Astfel, se poate observa ușurința cu care un utilizator poate obține salariul unui angajat, cu un minim de efort, fiind scutit de multe calcule în urma cărora puteau apărea greșeli nedorite.

Aplicația poate genera salariul și în altă valută, diferită de RON. În cazul meu, am ales o valută destul de populară în negocierea contractelor de muncă în zilele noastre, și anume EURO. Fereastra de Salarizare poate permite schimbarea cursului valutar din EURO în RON și invers prin alegerea, din meniul de selecție, valuta dorită și apăsarea butonului Afișează salariu. Toate câmpurile se vor reîncărca conform acelorlași calcule, însă diferă valuta. Pentru a realiza acest lucru, am folosit o clasă cu extensia “.xml”, în care se află sursa xml a cursului de schimb valutar preluat de pe site-ul bnr.ro.

Încă un avantaj al acestei ferestre pentru salarizare este butonul pentru previzualizarea imprimării fluturașului cu scopul de a fi distribuit angajatului posesor. La apăsarea butonului cu textul Imprimare fluturaș salariu, se va deschide o fereastră standard pentru a putea salva pe calculatorul local fluturașul, sub forma unei imagini –extensia va fi .oxps sau .xps. După selectarea numărului de pagini, formatului –portret sau peisaj- și a numărului de exemplare, la apărea butonului OK, se va deschide o fereastră de unde putem alege destinația imaginii pe calculatorul propriu. După respectarea pașilor anteriori, mai trebuie doar să conectăm calculatorul la o imprimantă și astfel vom obține fluturașul de salarizare și în format fizic.

În cazul schimbării legii sau a politicii firmei, toate elementele ce au fost considerate constante și egale pentru toată lumea –CAS, CASS, ȘOMAJ, IMPOZIT, valoarea bonurilor de masă, primele, etc-, se va apela la furnizorul aplicației pentru modificarea acestor valori din tabela constante a bazei de date. Acest lucru necesită minim de efort din partea furnizorului, tocmai de aceea s-a apelat la varianta stocării acestora în baza de date.

Tot în capitolul 1 am vorbit pe scurt despre concedii. Importanța acestora este deosebită, deoarece există situații inevitabile în care un angajat să aibe nevoie de timp liber personal, iar acest lucru nu trebuie să influențeze negativ munca departamentului. De cele mai multe ori, există responsabili ce vor continua munca persoanelor care lipsesc, astfel, sarcinile nu vor rămâne neacoperite. Anterior am discutat despre adăugarea concediilor, însă o problemă întâlnită în acest domeniu este faptul că un concediu trebuie aprobat înainte ca el să fie consumat sau trecut la salarizare. Astfel, vin în completarea acestei problematici cu o nouă fereastră, numită Aprobare Concedii, care va avea scopul de a vizualiza concediile conform statusului. La deschidere, fereastra va avea în partea de sus numele angajatului selectat, pentru care dorim să vedem situația concediilor; va avea o listă de tip selecție, pentru a selecta concediile conform statusului – Necesită aprobare, Aprobate, Refuzate și un buton care va încărca într-o listă rezultatele selectării –tipul de concediu și perioada. În baza de date se va reține statusul astfel: 0 pentru cele care necesită aprobare, 1 pentru concediile aprobate și 2 pentru cele respinse. În cazul afișării concediilor ce necesită revizuire, se poate da dublu click pe acestea, moment în care va apărea un mesaj de confirmare aprobare concediu cu două opțiuni: DA și NU. În cazul selectării unui răspuns negativ, utilizatorul este informat că respectivul concediu a fost respins. În cazul selectării unui răspuns afirmativ, mesajul va fi de aprobare concediu cu succes. În cazul în care angajatul selectat nu are niciun concediu ce trebuie aprobat, lista va conține un mesaj corespunzător: “Nu există concedii care să necesite revizuire!”. În cazul selectării concediilor aprobate sau refuzate, acetea pot fi doar vizualizate, nu se pot face modificări la dublu click; au rolul doar de a păstra un istoric cu privire la concediile cerute de un angajat.

O finalitate importantă a acestei aplicații este legată de rapoartele ce pot fi obținute cu ajutorul datelor introduse anterior și a calculelor pe baza acestora. În aplicația mea am ales sa tratez câteva rapoarte uzuale întalnite într-un departament de Resurse Umane. Rapoartele sunt obținute cu ajutorul unui instrument specializat, open-source, care poate crea diverse machete, de la simple rapoarte la grafice, imagini, subrapoarte, etc. Instrumentul se numește iReports și se poate descărca gratuit de pe site-ul http://community.jaspersoft.com/project/ireport-designer, iar librăriile ce trebuie importate în proiect pot fi descărcate tot gratuit de pe netbeans.org. Pentru a crea un astfel de raport, în fereastra principală, există un meniu special, numit Rapoarte, ce are ca opțiune Vizualizare rapoarte. În acest moment, se va deschide o nouă fereastră ce va permite utilizatorului să aleagă raportul dorit. Pentru tema economică abordată, am creat rapoarte precum: evidența personalului firmei, rapoarte salariale, evidența privind persoanele întreținute, raportul concediilor, etc. Aceste evidențe lunare sau chiar săptămânale s-au dovedit a fi în realitate foarte utile. Un lucru deloc de neglijat este faptul că toate aceste rapoarte au opțiuni precum imprimare, salvare, zoom, etc, ceea ce aduce un mare plus funcționalității aplicației.

În acest subcapitol au fost prezentate ferestrele și funcționalitățile acestora la modul general. Urmează ca în următorul subcapitol să se prezinte adăugarea datelor în ferestrele inițiale, dar și mesajele ce pot fi trimise de către aplicație pentru informarea utilizatorului. Pe scurt, pentru o înțelegere cât mai bună a funcționalității aplicației, toate aceste lucruri prezentate aici, vor fi și testate în cele ce urmează.

4.2 Testarea aplicației

Înregistrare și conectare

În primul rând, un angajat al departamentului de resurse umane trebuie să își creeze cont pentru a se putea conecta. Numele unui utilizator este unic și poate fi creat o singură dată. În cazul încercării introducerii aceluiași utilizator, un mesaj de eroare se va afișa, așa cum apare în figura 7.

Figură 7. Fereastră înregistrare

De asemenea, parola introdusă va fi afișată sub forma “********” pentru a nu putea fi văzută de persoane neautorizate atunci când este introdusă. Pentru creare de nou utilizator se va apăsa butonul Înregistrare, iar pentru a se conecta un utilizator existent, se va apăsa Conectare. În cazul introducerii greșite a numelui sau a parolei, aplicația nu permite conectarea. Mesajul de informare va fi cel din figura 8:

Figură 8. Fereastră conectare

Adăugarea unui angajat

Pentru adăugarea unui angajat se va deschide următorul formular, imagine aflată sub numele de Figură 9:

Figură 9. Adăugare angajat

În cazul introducerii datelor eronat, un mesaj de atenționare va fi afișat pe ecran, iar chenarele câmpurilor respective vor avea chenarul roșu, precum în figura 10:

Figură 10. Eroare introducere angajat

De asemenea se poate observa faptul că salariul depășește pragul de 1000 RON, prin urmare, butonul pentru alegerea adăugării unei persoane întreținute este inactiv.

Afișare angajați

Pentru a vizualiza lista angajaților, se alege aceeastă opțiune din primul meniu. Lista va arăta precum în figura 11 :

Figură 11. Listă angajați

Pentru vizualizarea celorlalte elemente, se vor folosi pașii descriși în subcapitolul anterior.

De exemplu, pentru afișarea posturilor, lista poate fi vizualizată în figura 12:

Căutare angajat

Pentru a căuta un angajat după nume, în fereastra principală există un câmp special, ce va returna informația în aceeași listă de vizualizare precizată mai sus. Există posibilitatea căutării unui angajat după prima literă, calup de litere consecutive sau după întregul nume. Rezultatul va fi încărcat în aceeași listă, precum în figura 13.

Figură 13. Căutare angajat

Odată ce angajații sunt afișați, utilizatorul poate selecta un angajat, iar la dublu click să poată executa diverse operații precum: ștergere, modificare, salarizare, aprobare concedii. Acetse opțiuni se observă în figura cu numărul 14.

Modificarea unui angajat

Dupa selectarea unui angajat, datele sunt deja încărcate în formularul deschis, după cum se poate observa în figura 15. Validările necesare introducerii corecte a informațiilor în baza de date rămân aceleași, așa că în cazul unei modificări neregulametare, utilizatorul este atenționat.

Figură 15. Modificicare angajat

Acordare beneficii

Pentru acordarea de beneficii, procesul se poate observa în figura 16.

Figură 16. Acordare beneficii

Numele se poate selecta din lista de selecție prezentă în această fereastră, iar după alegerea beneficiilor dorite, se apasă pe butonul de adăugare în baza de date, operațiunile fiind finalizate.

Concedii

Pentru adăugarea unui concediu fereastra este prezentată în figura 17, unde putem observa lista de selecție a tipului de concediu, dar și numărul de ore rămase conform legii, după selectarea unei date de început și una de sfârșit și finalizarea operațiunii la apăsarea butonului de Adaugă concediu. În cazul alegerii unei date anterioare celei actuale, aplicația va afișa următorul mesaj :

Figură 17. Acordare concedii

Schimbare post

Pentru a schimba postul sau salariul brut al angajatului, se va utiliza ultima filă, în care datele curente ale angajatului sunt deja încărcate la deschidere. În cazul unei introduceri incorecte a datelor, mesajul va fi precum cel din figura 18:

Figură 18. Schimbare post

La deschidere, câmpurile vor fi completate cu informațiile din baza de date, astfel, utilizatorul cunoaște datele curente înainte de a face modificări. În cazul încercării introducerii unui salariu ce este în afara intervalului, aplicația va semnala o eroare. De asemenea, în cazul în care noul post aduce cu sine un salariu semnificativ mai mare decât cel vechi, aplicația va verifica, în primul rând, dacă persoana respectivă are sau nu persoane întreținute. În cazul în care acest lucru se confirmă, utilizatorul este anunțat de situație și este întrebat dacă dorește să renunțe la persoanele întreținute, deoarece noul salariu nu îi permite păstrarea acestora. Acest caz poate fi vizualizat în figura 19.

Ștergere

Pentru ștergerea unui angajat, se va da dublu click pe numele acestuia din listă și se va selecta din fereastra butonul “Sterge”. Mesajul către utilizator va fi cel din figura 20:

Figură 20. Ștergere angajat

La fel se procedează și în cazul departamentelor, posturilor, etc, iar mesajul va fi diferit doar în sensul în care se schimbă elementul șters.

La adăugarea unui departament, în cazul necompletării unui câmp, utilizatorul va fi informat de acest lucru așa cum este prezentat în figura 21.

Figură 21. Adăugare departament

Pentru a adăuga un post nou, toate câmpurile sunt obligatorii, salariul minim trebuie să fie mai mic ca cel maxim, iar lista pentru alegerea departamentului de care va aparține postul, este încărcată automat cu departamentele existente în cadrul companiei. Aceste lucruri se pot observa în figura 22:

Figură 22. Adăugare post

La adăugarea unui nou beneficiu în lista celor oferite de companie, mesajul de eroare va arăta precum cel din figura 23:

Pentru adăugarea unui tip de concediu, este important să se completeze câmpul pentru denumire, dar și să se aleagă tipul acestuia: cu sau fără plată, dupa cum se poate observa în figura 24.

În figura 25 putem observa cum arată fereastra intermediară, dupa ce s-a făcut dublu click pe un element precum departament, post, beneficiu, tipuri concediu.

În cazul selectării unui angajat din listă, fereastra intermediară va avea mai multe elemente vizibile utilizatorului și va arăta precum în figura 26:

Figură 26. Opțiuni fereastră intermediară 2

Deoarece mai devreme menționam concediile, amintim faptul că acestea necesită aprobare, astfel că se alege această opțiune din fereastra intermediară, după care utilizatorul va putea vizualiza o fereastră, ce poate fi vizualizată în figura 27:

Figură 27. Afișare concedii

Lista cu opțiunile posibile va determina ce se va afișa în lista existentă aici. Concediile afișate în urma selectării opțiunii “Necesită revizuire” pot fi aprobate la dublu-click precum arată figura 28.

Figură 28. Aprobare concedii

Celelalte opțiuni din meniul de selecție sunt destinate exclusiv vizualizării pentru a urmări istoricul concediilor unui angajat.

Pentru a obține salariul net al angajaților se va selecta opțiunea “Afișează salariu net”, ce va deschide o fereastră inițial necompletată, însă la apăsarea butonului pentru afișare a salariului, aceasta va arăta ca în figura 29:

Figură 29. Afișare salariu net RON

Câmpurile acestei ferestre, după cum se poate observa, sunt needitabile, astfel încât, calculul salariului cu tot ce implică acesta se generează automat, fără ca utilizatorul să intervină. Precum aminteam în subcapitolul anterior salariul putea fi negociat în contract, în diverse valute. Exemplul meu se bazează pe două valute: RON și EUR. Așadar, la calcularea salariului în această fereastră, există posibilitatea comutării între cele două valute, în cazul în care acest lucru este necesar. Cursul valutar este preluat de pe site-ul bnr.ro. Schimbarea valorii fluturașului poate fi observată în figura 30 :

Figură 30. Afișare salariu net EURO

De asemenea aplicația are opțiune de a imprima fluturașul personalizat, pentru ca mai apoi sa fie distribuit angajaților. Acesta va arăta precum în figura cu numărul 31:

Figură 31. Fluturaș salariu

Pentru a vizualiza diverse situații actuale, nu neapărat lunare, există un meniu special pentru asta în fereastra principală, de unde se poate selecta opțiunea Rapoarte. Aceste situații depind de la firmă la firmă, în funcție de necesități. Câteva exemple ar fi cele din figurile 32 și 33:

Figură 32. Evidență personal

Figură 33. Raport concedii

După cum se poate observa din imagini, în colțul din stânga sus, există opțiunea de a salva sau de a imprima aceste rapoarte. Pentru salvare, fereastra va arăta precum în imaginea cu numărul 34.

Concluzii

În introducere am stabilit faptul că resursele umane reperezintă un bun valoros oricărei companii, ce se îmbină cu tehnologia pentru obținerea rezultatelor așteptate.

Folosirea unui sistem de gestiune pentru prelucrarea și analiza datelor angajaților s-a dovedit a fi un avantaj de-a lungul timpului, atât din punct de vedere al reducerii costurilor cu personalul, dat fiind faptul că există un număr mic de angajați responsabili cu gestiunea tuturor angajaților; reducerea timpului de lucru, dar și din punctual de vedere al eficienței și al profitului obținut pe termen lung. Având în vedere și durata de viață îndelungată a sistemului – de câțiva ani, alegerea făcută, de a implementa un sistem de gestiune, este perfect justificată.

Prin aplicația creată am încercat să îndeplinesc toate obiectivele propuse la începutul prezentării lucrării. Prin urmare, consider că am realizat o aplicație utilă, care să trateze unele dintre cerințele esențiale ale unei companii privind datele angajaților săi. Aplicația vizează securitatea informațiilor deținute, stocarea acestora într-o bază de date corespunzătoare, corectitudinea datelor introduse, dar și realizarea unor rapoarte folositoare în multe situații pe care le poate întâmpina o companie.

În primul rând, o companie are nevoie ca datele deținute să nu poată fi accesate de oricine, oriunde, astfel că au fost create conturi utilizatorilor, care pot fi doar angajații din departamentul de Resurse Umane. O îmbunătățire în acest sens ar fi crearea unui cont cu drepturi depline – un administrator, acestea fiind separate de cele ale angajaților care se ocupă de gestionarea datelor; astfel complexitatea aplicației, dar și securitatea cresc. Un alt lucru ce a fost implementat pentru ușurarea muncii departamentului este acela al creării unei aplicații distribuite, client-server, ce permite folosirea aplicației de către mai mulți utilizatori în același timp. Dacă nu ar fi fost astfel creată, nu ar fi putut fi folsită decât de către un utilizator, ceea ce ar fi însemnat multă muncă pentru un singur angajat, dar ar fi dus și la mulți timpi morți, iar per total timpul irosit s-ar fi scontat cu mari pierderi pentru o companie.

În al doilea rând, este importantă corectitudinea datelor stocate în baza de date a firmei. Pentru acest lucru, a fost creată o bază de date complexă, care să cuprindă toate tabelele necesare, alături de tabelele de legatură ce au fost obținute în urma normalizărilor. De asemenea, au fost realizate o serie de validări în funcție de datele introduse și în funcție de dependențele dintre acestea. Pentru o imagine cât mai clară a ceea ce se întâmplă în spatele aplicației, utilizatorului i se afișează mesajele corepunzătoare operațiilor executate, fie că sunt de informare, fie că sunt de eroare. În cazul erorilor, am încercat să afișez utilizatorului mesaje cât mai clare cu privire la greșeala făcută, oferindu-i instrucțiuni de corectare ale acestor erori. Un lucru foarte important este faptul că datele nu sunt stocate în baza de date până nu trec de toate validările. Utilizatorul este astfel obligat să introducă date corecte pentru a nu fi indus în eroare mai târziu, la afișarea datelor sau la diverse calcule.Am ales să introduc și valuta pentru salariul fiecărui angajat și am tratat posibilitatea generării salariului în EURO sau RON. Valutele se pot schimba dupa caz, cerințe și nevoi. În cazul în care se dorește trecerea de la o valută la alta din diverse motive, există o implementare ce va face această conversie, la cursul curent, venind astfel în ajutorul utilizatorului.

O îmbunătățire ce ar putea fi dezvoltată ulterior ar fi în ceea ce privește beneficiile acordate. Ar putea fi adăugată o funcționalitate prin care fiecare angajat își poate alege și bifa singur din listă anumite beneficii pe care și le dorește, iar acestea să se introducă automat în sistem. Tot în această direcție, pe viitor se poate dezvolta o soluție prin care angajații sa își aleagă singuri zilele de concediu, iar din aplicația inițială să se poată aproba sau respinge.

Un alt fel de motivare al angajaților ce ar putea fi implementat ulterior este acela al acordării de zile în plus de concediu de odihnă, față de cele 21 prin lege, care să fie acordate în funcție de vechimea în muncă. De asemenea, se poate trata cazul deducerilor personale conform alineatului 2 din Art. 56, care menționează deducerile corespunzătoare unor salarii ce se încadrează între 1001 RON și 3000 RON, și care se stabilesc prin ordin al ministrului finanțelor publice. În acest caz, utilizatorul trebuie să consulte tabele standard ce cuprind valori ale deducerilor posibile în funcție de salariul brut.

Vorbind despre un aspect foarte important – salariul angajaților, în cadrul aplicației am încercat să fie cât mai aproape de realitate. Se pleacă de la un salariu brut, la care se adaugă beneficii, deduceri personale, se scad/ adaugă zilele de concediu plătite/neplătite, se adaugă, după caz, sporuri, se aplică taxele legale, astfel încât la sfârșitul raportului de salarizare, atât utilizatorul, cât și angajatul vor știi exact de unde provine fiecare sumă și care este remunerația finală a angajatului. Pentru prezentarea acestor date, a fost creat un fluturaș, ale căror elemente au fost așezate astfel încât vizibilitatea să fie maximă. Astfel, fiecare angajat va primi un raport personalizat –deoarece conține data curentă, numele, prenumele, postul și departamentul angajatului în cauză- cu datele referitoare la salariu.

În cazul rapoartelor, acestea au avut ca fundament situații reale, obținute în urma unei documentații pe aceasta temă în cadrul mai multor firme. Necesitățile companiilor s-au dovedit a fi diverse, însă nu întru totul diferite, astfel că în cadrul aplicației rapoartele se pot diversifica mult mai mult, uneori doar prin câteva linii de cod. Eu am ales să tratez problema rapoartelor referitoare la situația concediilor, la situația persoanelor întreținute, la evidența personalului, rapoarte salariale, etc.

În cazul unei aplicații de gestiune a resurselor umane, se pot implementa multe cerințe, ce pot să difere de la companie la companie, care însă nu necesită foarte mult efort în cazul existenței unei baze solide. Odată avută o bază de lucru, ulterior pot fi adăugate funcționalități necesare companiei care va folosi aplicația.

Nu în ultimul rând, aplicația beneficiază de o interfață atractivă și ușor de utilizat, atenționând utilizatorii de fiecare dată când aceștia doresc să facă o acțiune nepermisă sau anunțându-ide finalizarea cu succes a operațiunilor întreprinse.

Listă figuri

Figură 1. Diagrama cazurilor de utilizare 28

Figură 2Diagrama de activitate 29

Figură 3. Diagrama claselor 30

Figură 4. Diagrama de stare 31

Figură 5. Tabele baza de date 35

Figură 6. Schema conceptuala a baze de date 36

Figură 7. Fereastră înregistrare 50

Figură 8. Fereastră conectare 50

Figură 9. Adăugare angajat 51

Figură 10. Eroare introducere angajat 51

Figură 11. Listă angajați 52

Figură 12. Listă posturi 52

Figură 13. Căutare angajat 53

Figură 14. Fereastră intermdiară 53

Figură 15. Modificicare angajat 54

Figură 16. Acordare beneficii 54

Figură 17. Acordare concedii 55

Figură 18. Schimbare post 56

Figură 19. Verificare persoană întreținută 57

Figură 20. Ștergere angajat 57

Figură 21. Adăugare departament 58

Figură 22. Adăugare post 58

Figură 23. Adăugare beneficiu 59

Figură 24. Adăugare tip concediu 59

Figură 25. Opțiuni fereastră intermediară 1 60

Figură 26. Opțiuni fereastră intermediară 2 60

Figură 27. Afișare concedii 61

Figură 28. Aprobare concedii 61

Figură 29. Afișare salariu net RON 62

Figură 30. Afișare salariu net EURO 63

Figură 31. Fluturaș salariu 63

Figură 32. Evidență personal 64

Figură 33. Raport concedii 64

Figură 34. Salvare raport 65

Bibliografie

[1]http://www.sap.com/romania/solutions/business-suite/erp/index.epx

[2]http://www.oracle.com/ro/products/middleware/overview/index.html

[3]Lector Dragoș Ovidiu Ioan Mihai –Curs “Managementul relațiilor de muncă”

[4] Ion Petrescu, Gheorghe Seghete – Fundamentele practicii manageriale, Ed Maiko, 1994

[5]http://mailer.fsu.edu/~banthon/

[6] Robert L. Mathis, Panaite C. Nica, Costache Rusu – Managementul resurselor umane, Ed. Economică

[7]http://www.scrigroup.com/management/resurse-umane/PROGNOZA-RESUSELOR-UMANE24599.php

[8]http://en.wikipedia.org/wiki/Rensis_Likert

[9] Asist. Univ. Drd. Marius Dodu, Asist. Cercet. Dr. Horia Raboca, Asist. Univ. Drd. Ciprian Tripon- Suport de curs – Managementul resurselor umane

[10]Ion Lungu, GheorgheSabău, Manole Velicanu – Sisteme informatice: Analiză, proiectare și implementare, Ed. Economică 2013

[11]https://ro.wikipedia.org/wiki/Java_(limbaj_de_programare)

[12]http://ro.wikipedia.org/wiki/Server

[13] http://ro.wikipedia.org/wiki/Compilator

[14]Ion Lungu, Adela Bâra, Constanta Bodea, Iuliana Botha, Vlad Diaconița, Alexandra Florea, Anda Velicanu- Tratat de baze de date –Ed. ASE, 2011

[15]http://ro.wikipedia.org/wiki/MySQL

[16]http://fpce9.fizica.unibuc.ro/pgsysd/java_rmi.htm

[17]http://ro.wikipedia.org/wiki/TCP/IP

[18]http://portableapps.com/apps/development/xampp

[19]http://ro.wikipedia.org/wiki/Xampp

[20]http://ro.wikipedia.org/wiki/JasperReports

[21]Lector Dragoș Ovidiu Ioan Mihai – Suport de curs “Inspector Resurse Umane”

[22]http://ro.wikipedia.org/wiki/Fir_de_execu%C8%9Bie

[23] *** Java – How To Program, 4th Edition, 2002

[24] *** Addison Wesley – UML for Database Design

[25] ***Paul DuBois – MySQL, Fifth Edition

[26] *** Wiley Publishing – UML Weekend Crash Course

[27] *** Gabriela Diță, Alexei Delimart, Ana Bontea – Memo Relații de muncă, Ed. Rentrop & Straton, 2013

[28] *** Rodica Mihalca, Csaba Fabian, Adina Uță, Iulian Întorsureanu, Anca Andreescu, Dan Jișa – Modelarea Orientată obiect, Ed. ASE, 2009

Anexe

Declararile funcțiilor existente în aplicație

public interface InterfataRemote extends Remote{

public boolean conectare(String utilizator,String parola) throws RemoteException;

public boolean inregistrare(String utilizator, String parola) throws RemoteException;

public boolean adaugaDepartament(String nume, String descriere) throws RemoteException;

public boolean adaugaPost(String denumire, String descriere, int id_dep, double sal_min, double sal_max,boolean spor_manager, boolean spor_confid ) throws RemoteException;

public ArrayList<Departament> getDepartamente() throws RemoteException;

public ArrayList<Post> getPosturi(String departament) throws RemoteException;

public boolean adaugaAngajat(String nume, String prenume, String telefon, String mail, String cnp, String adresa, Date data_nasterii, Date data_angajare, String stare_civila, boolean persoane_intretinute, int id_departament, int id_post, double salariu, Date data_plata, String valuta ) throws RemoteException;

public Post getPostByID(String denumire) throws RemoteException;

public int getDepByID(String denumire) throws RemoteException;

public int getLastID() throws RemoteException;

public boolean adaugaPersIntretinuta(int id_ang, double venit,String denumire, Date data_nasterii) throws RemoteException;

public ArrayList<Angajat> getAngajati() throws RemoteException;

public ArrayList<Post> getPosturi() throws RemoteException;

public ArrayList<Angajat> cautaAngajat(String param_cautare) throws RemoteException;

public void stergeAngajat(int id_ang) throws RemoteException;

public void stergePost(int id_post) throws RemoteException;

public void stergeDepartament(int id_dep) throws RemoteException;

public boolean adaugaBeneficii(String denumire, double suma_datorata) throws RemoteException;

public ArrayList<Beneficiu> getBeneficii() throws RemoteException;

public void stergeBeneficiu(int id_ben) throws RemoteException;

public int numarBeneficii() throws RemoteException;

public boolean adaugaBeneficii(int a, ListModel model) throws RemoteException;

public boolean modificaAngajat(Angajat ang) throws RemoteException;

public boolean modificaSalariu(Salariu sal) throws RemoteException;

public Salariu getSalariuByIdAngajat(int id_ang) throws RemoteException;

public boolean modificaDepartament(Departament d) throws RemoteException;

public boolean modificaPost(Post p) throws RemoteException;

public ArrayList<Beneficiu> getBenefByAng(int id_ang) throws RemoteException;

public ArrayList<Beneficiu> getBenefByNotAng(int id_ang) throws RemoteException;

public boolean stergeBeneficiuAngajat(int idAngajat, String denumire) throws RemoteException;

public boolean adaugaBeneficiuNou(int idAngajat, String denumire) throws RemoteException;

public void stergeBeneficiileAngajatului(int idAngajat) throws RemoteException;

public boolean modificaBeneficii(Beneficiu ben) throws RemoteException;

public ArrayList<Utilizator> getUtilizatori() throws RemoteException;

public boolean stergeContUtilizator(int id_utilizator) throws RemoteException;

public boolean modificaUtilizator(Utilizator u) throws RemoteException;

public boolean adaugaTipConcediu(String denumire, boolean cu_fara_plata) throws RemoteException;

public ArrayList<Tip_concediu> getTipuriConcediu() throws RemoteException;

public void stergeTipConcediu(int id_tip) throws RemoteException;

public boolean modificaTipConcediu(Tip_concediu t) throws RemoteException;

public int getZileConcediuRamase(Angajat a, int tip) throws RemoteException;

public int getZileConcediuRamase(Angajat a) throws RemoteException;

public boolean adaugaConcediu( int id_tip, int id_angajat, int zile_concediu, int id_luna, int an, int status, Date inceput, Date sfarsit) throws RemoteException;

public IstoricAngajati getIstoric(int id_angajat) throws RemoteException;

public boolean modificaTabPost(String post, String dept,Angajat a) throws RemoteException;

public boolean unicCNP(String cnp) throws RemoteException;

public Departament getDepartament(int id) throws RemoteException;

public Post getPost(int id) throws RemoteException;

public ArrayList<Concedii> getConcedii(int id, int luna, int an) throws RemoteException;

public boolean getTipConcediu(int id) throws RemoteException;

public ArrayList<PersoaneIntretinute> getPersoaneIntretinute(Angajat a) throws RemoteException;

public ArrayList<Angajat> getAngByVechime() throws RemoteException;

public Constante getConstanta(String nume) throws RemoteException;

public ArrayList<ConcediiView> getConcedii(int status, int idAngajat) throws RemoteException;

public boolean aprobaConcediul(ConcediiView c) throws RemoteException;

public boolean stergeConcediul(int id) throws RemoteException;

public ArrayList<Salarii> raport1() throws RemoteException;

public ArrayList<Angajati> raport1(ArrayList salarii) throws RemoteException;

public ArrayList<String> raport2() throws RemoteException;

public boolean adaugaConstanta(String denumire, double procent) throws RemoteException;

public boolean modificaConstante(Constanta con) throws RemoteException;

public void stergeConstanta(int idc) throws RemoteException;

public ArrayList<Constanta> getConstantele() throws RemoteException;

public Connection getConnection() throws RemoteException;

}

Funcțiile existente în clasa Angajat

public void create(Angajati angajati) {

EntityManager em = null;

try {

em = getEntityManager();

em.getTransaction().begin();

em.persist(angajati);

em.getTransaction().commit();

} finally {

if (em != null) {

em.close();

}

}

}

public void edit(Angajati angajati) throws NonexistentEntityException, Exception {

EntityManager em = null;

try {

em = getEntityManager();

em.getTransaction().begin();

angajati = em.merge(angajati);

em.getTransaction().commit();

} catch (Exception ex) {

String msg = ex.getLocalizedMessage();

if (msg == null || msg.length() == 0) {

Integer id = angajati.getId();

if (findAngajati(id) == null) {

throw new NonexistentEntityException("The angajati with id " + id + " no longer exists.");

}

}

throw ex;

} finally {

if (em != null) {

em.close();

}

}

}

public void destroy(Integer id) throws NonexistentEntityException {

EntityManager em = null;

try {

em = getEntityManager();

em.getTransaction().begin();

Angajati angajati;

try {

angajati = em.getReference(Angajati.class, id);

angajati.getId();

} catch (EntityNotFoundException enfe) {

throw new NonexistentEntityException("The angajati with id " + id + " no longer exists.", enfe);

}

em.remove(angajati);

em.getTransaction().commit();

} finally {

if (em != null) {

em.close();

}

}

}

public List<Angajati> findAngajatiEntities() {

return findAngajatiEntities(true, -1, -1);

}

public List<Angajati> findAngajatiEntities(int maxResults, int firstResult) {

return findAngajatiEntities(false, maxResults, firstResult);

}

private List<Angajati> findAngajatiEntities(boolean all, int maxResults, int firstResult) {

EntityManager em = getEntityManager();

try {

CriteriaQuery cq = em.getCriteriaBuilder().createQuery();

cq.select(cq.from(Angajati.class));

Query q = em.createQuery(cq);

if (!all) {

q.setMaxResults(maxResults);

q.setFirstResult(firstResult);

}

return q.getResultList();

} finally {

em.close();

}

}

public Angajati findAngajati(Integer id) {

EntityManager em = getEntityManager();

try {

return em.find(Angajati.class, id);

} finally {

em.close();

}

}

public int getAngajatiCount() {

EntityManager em = getEntityManager();

try {

CriteriaQuery cq = em.getCriteriaBuilder().createQuery();

Root<Angajati> rt = cq.from(Angajati.class);

cq.select(em.getCriteriaBuilder().count(rt));

Query q = em.createQuery(cq);

return ((Long) q.getSingleResult()).intValue();

} finally {

em.close();

}

}

public int getLastAngajat(){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findLast");

Angajati ang = (Angajati)q.getResultList().get(0);

return ang.getId();

}

public ArrayList<Angajat> cautaAngajat(String param){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findByParam");

param="%"+param+"%";

q.setParameter("param",param);

ArrayList<Angajat> angajati = new ArrayList<Angajat>();

List<Angajati> lista= q.getResultList();

for(int i=0;i<lista.size();i++){

Angajat a = new Angajat(lista.get(i).getId(),

lista.get(i).getNume(),

lista.get(i).getPrenume(),

lista.get(i).getTelefon(),

lista.get(i).getMail(),

lista.get(i).getCnp(),

lista.get(i).getAdresa(),

lista.get(i).getDataNasterii(),

lista.get(i).getDataAngajare(),

lista.get(i).getStareCivila(),

lista.get(i).getStatusPersIntretinuta());

angajati.add(a);

System.out.println(i+" – "+a);

}

return angajati;

}

public ArrayList<Angajat> getAngByVechime(){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findByVechime");

List<Angajati> lista_ang = q.getResultList();

ArrayList<Angajat> angajati = new ArrayList<Angajat>();

for(int i=0; i< lista_ang.size(); i++){

Angajat a = new Angajat(lista_ang.get(i).getId(),

lista_ang.get(i).getNume(),

lista_ang.get(i).getPrenume(),

lista_ang.get(i).getTelefon(),

lista_ang.get(i).getMail(),

lista_ang.get(i).getCnp(),

lista_ang.get(i).getAdresa(),

lista_ang.get(i).getDataNasterii(),

lista_ang.get(i).getDataAngajare(),

lista_ang.get(i).getStareCivila(),

lista_ang.get(i).getStatusPersIntretinuta());

angajati.add(a);

}

return angajati;

}

public boolean unicCNP(String cnp){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findByCNP");

q.setParameter("cnp", cnp);

List<Angajati> ang = q.getResultList();

if(ang.size()<1) return true;//pot introduce, nu mai exista

else return false;

}

@NamedQueries({

@NamedQuery(name = "Angajati.findAll", query = "SELECT a FROM Angajati a"),

@NamedQuery(name = "Angajati.findLast", query = "SELECT a FROM Angajati a ORDER BY a.id DESC"),

@NamedQuery(name = "Angajati.raportSalariu", query = "SELECT a FROM Angajati a WHERE a.id in (:listaID)"),

@NamedQuery(name = "Angajati.findByVechime", query = "SELECT a FROM Angajati a ORDER BY a.dataAngajare DESC"),

@NamedQuery(name = "Angajati.findById", query = "SELECT a FROM Angajati a WHERE a.id = :id"),

@NamedQuery(name = "Angajati.findByCNP", query = "SELECT a FROM Angajati a WHERE a.cnp = :cnp"),

@NamedQuery(name = "Angajati.findByParam", query = "SELECT a FROM Angajati a WHERE a.nume like :param or a.prenume like :param or a.cnp like :param"),

@NamedQuery(name = "Angajati.findByDataNasterii", query = "SELECT a FROM Angajati a WHERE a.dataNasterii = :dataNasterii"),

@NamedQuery(name = "Angajati.findByDataAngajare", query = "SELECT a FROM Angajati a WHERE a.dataAngajare = :dataAngajare"),

@NamedQuery(name = "Angajati.findByStatusPersIntretinuta", query = "SELECT a FROM Angajati a WHERE a.statusPersIntretinuta = :statusPersIntretinuta")})

Validare CNP

public boolean isValidCNP(String Cnp) {

final int[] CNP_KEY = new int[] { 2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9 };

if (Cnp == null)

return false;

if (Cnp.length() != 13)

return false;

// string – int[] conversion

int[] cnpInt = new int[13];

for (int i = 0; i < 13; i++)

cnpInt[i] = Integer.parseInt(new Character(Cnp.charAt(i))

.toString());

int suma_produse = 0;

for (int i = 0; i < 12; i++)

suma_produse += CNP_KEY[i] * cnpInt[i];

int suma_control_obtinuta = 1;

if (suma_produse % 11 < 10)

suma_control_obtinuta = suma_produse % 11;

return suma_control_obtinuta == cnpInt[12]; }

Funcția pentru stabilirea zilelor libere prin lege

public boolean checkDate(Calendar data){

ArrayList<Calendar> lista= new ArrayList<Calendar>();

Calendar c1 = Calendar.getInstance();

Calendar c2 = Calendar.getInstance();

Calendar c3 = Calendar.getInstance();

Calendar c4 = Calendar.getInstance();

Calendar c5 = Calendar.getInstance();

Calendar c6 = Calendar.getInstance();

Calendar c7 = Calendar.getInstance();

Calendar c8 = Calendar.getInstance();

Calendar c9 = Calendar.getInstance();

Calendar c10 = Calendar.getInstance();

Calendar c11 = Calendar.getInstance();

Calendar c12 = Calendar.getInstance();

int an = c1.get(Calendar.YEAR); //anul curent

//setam 1 ian

c1.set(an,Calendar.JANUARY,1);

lista.add(c1);

//setam 2 ian

c2.set(an,Calendar.JANUARY,2);

lista.add(c2);

//setam 5 mai

c3.set(an,Calendar.MAY,1);

lista.add(c3);

//setam Adormirea Maicii Domnului

c4.set(an,Calendar.AUGUST,15);

lista.add(c4);

//setam sf Andrei

c5.set(an,Calendar.NOVEMBER,30);

lista.add(c5);

//setam 1 dec

c6.set(an,Calendar.DECEMBER,1);

lista.add(c6);

//setam prima si a 2a zi de craciun

c7.set(an,Calendar.DECEMBER,25);

lista.add(c7);

c8.set(an,Calendar.DECEMBER,26);

lista.add(c8);

//setam Pastele

c9 = EasterCalculator.calculate(an);

lista.add(c9);

//setam a 2a zi de paste

c10.setTime(c9.getTime());

c10.add(c10.DATE, 1);

lista.add(c10);

//setam rusaliile – la 50(+1) zile de la Paste

c11.setTime(c9.getTime());

c11.add(c11.DATE, 49);

lista.add(c11);

//a 2a zi de rusalii

c12.setTime(c11.getTime());

c12.add(c12.DATE, 1);

lista.add(c12);

for(int i=0; i< lista.size(); i++){

Calendar c = lista.get(i);

if(c.get(Calendar.YEAR) == data.get(Calendar.YEAR) &&

c.get(Calendar.MONTH) == data.get(Calendar.MONTH) &&

c.get(Calendar.DAY_OF_MONTH) == data.get(Calendar.DAY_OF_MONTH)){

return true;

}

}

return false; }

Sintaxa SQL pentru rapoarte

<![CDATA[SELECT

angajati.`nume` AS angajati_nume,

angajati.`prenume` AS angajati_prenume,

istoric_angajati.`id` AS istoric_angajati_id,

istoric_angajati.`id_angajat` AS istoric_angajati_id_angajat,

istoric_angajati.`id_salariu` AS istoric_angajati_id_salariu,

salarii.`id` AS salarii_id,

salarii.`salariu_brut` AS salarii_salariu_brut,

salarii.`valuta` AS salarii_valuta

FROM

`istoric_angajati` istoric_angajati INNER JOIN `salarii` salarii ON istoric_angajati.`id_salariu` = salarii.`id`

INNER JOIN `angajati` angajati ON istoric_angajati.`id_angajat` = angajati.`id`

ORDER BY

salarii_salariu_brut DESC]]>

<![CDATA[SELECT

angajati.`id` AS angajati_id,

angajati.`nume` AS angajati_nume,

angajati.`prenume` AS angajati_prenume,

concedii.`id` AS concedii_id,

concedii.`id_tip` AS concedii_id_tip,

concedii.`id_angajat` AS concedii_id_angajat,

concedii.`data_inceput` AS concedii_data_inceput,

concedii.`data_sfarsit` AS concedii_data_sfarsit,

case

when concedii.`status` = 0 then 'spre aprobare'

when concedii.`status` = 1 then 'aprobat'

when concedii.`status` = 2 then 'respins'

END AS concedii_status,

tipuri_concediu.`id` AS tipuri_concediu_id,

tipuri_concediu.`denumire` AS tipuri_concediu_denumire

FROM

`concedii` concedii INNER JOIN `angajati` angajati ON concedii.`id_angajat` = angajati.`id`

INNER JOIN `tipuri_concediu` tipuri_concediu ON concedii.`id_tip` = tipuri_concediu.`id`]]>

Bibliografie

[1]http://www.sap.com/romania/solutions/business-suite/erp/index.epx

[2]http://www.oracle.com/ro/products/middleware/overview/index.html

[3]Lector Dragoș Ovidiu Ioan Mihai –Curs “Managementul relațiilor de muncă”

[4] Ion Petrescu, Gheorghe Seghete – Fundamentele practicii manageriale, Ed Maiko, 1994

[5]http://mailer.fsu.edu/~banthon/

[6] Robert L. Mathis, Panaite C. Nica, Costache Rusu – Managementul resurselor umane, Ed. Economică

[7]http://www.scrigroup.com/management/resurse-umane/PROGNOZA-RESUSELOR-UMANE24599.php

[8]http://en.wikipedia.org/wiki/Rensis_Likert

[9] Asist. Univ. Drd. Marius Dodu, Asist. Cercet. Dr. Horia Raboca, Asist. Univ. Drd. Ciprian Tripon- Suport de curs – Managementul resurselor umane

[10]Ion Lungu, GheorgheSabău, Manole Velicanu – Sisteme informatice: Analiză, proiectare și implementare, Ed. Economică 2013

[11]https://ro.wikipedia.org/wiki/Java_(limbaj_de_programare)

[12]http://ro.wikipedia.org/wiki/Server

[13] http://ro.wikipedia.org/wiki/Compilator

[14]Ion Lungu, Adela Bâra, Constanta Bodea, Iuliana Botha, Vlad Diaconița, Alexandra Florea, Anda Velicanu- Tratat de baze de date –Ed. ASE, 2011

[15]http://ro.wikipedia.org/wiki/MySQL

[16]http://fpce9.fizica.unibuc.ro/pgsysd/java_rmi.htm

[17]http://ro.wikipedia.org/wiki/TCP/IP

[18]http://portableapps.com/apps/development/xampp

[19]http://ro.wikipedia.org/wiki/Xampp

[20]http://ro.wikipedia.org/wiki/JasperReports

[21]Lector Dragoș Ovidiu Ioan Mihai – Suport de curs “Inspector Resurse Umane”

[22]http://ro.wikipedia.org/wiki/Fir_de_execu%C8%9Bie

[23] *** Java – How To Program, 4th Edition, 2002

[24] *** Addison Wesley – UML for Database Design

[25] ***Paul DuBois – MySQL, Fifth Edition

[26] *** Wiley Publishing – UML Weekend Crash Course

[27] *** Gabriela Diță, Alexei Delimart, Ana Bontea – Memo Relații de muncă, Ed. Rentrop & Straton, 2013

[28] *** Rodica Mihalca, Csaba Fabian, Adina Uță, Iulian Întorsureanu, Anca Andreescu, Dan Jișa – Modelarea Orientată obiect, Ed. ASE, 2009

Anexe

Declararile funcțiilor existente în aplicație

public interface InterfataRemote extends Remote{

public boolean conectare(String utilizator,String parola) throws RemoteException;

public boolean inregistrare(String utilizator, String parola) throws RemoteException;

public boolean adaugaDepartament(String nume, String descriere) throws RemoteException;

public boolean adaugaPost(String denumire, String descriere, int id_dep, double sal_min, double sal_max,boolean spor_manager, boolean spor_confid ) throws RemoteException;

public ArrayList<Departament> getDepartamente() throws RemoteException;

public ArrayList<Post> getPosturi(String departament) throws RemoteException;

public boolean adaugaAngajat(String nume, String prenume, String telefon, String mail, String cnp, String adresa, Date data_nasterii, Date data_angajare, String stare_civila, boolean persoane_intretinute, int id_departament, int id_post, double salariu, Date data_plata, String valuta ) throws RemoteException;

public Post getPostByID(String denumire) throws RemoteException;

public int getDepByID(String denumire) throws RemoteException;

public int getLastID() throws RemoteException;

public boolean adaugaPersIntretinuta(int id_ang, double venit,String denumire, Date data_nasterii) throws RemoteException;

public ArrayList<Angajat> getAngajati() throws RemoteException;

public ArrayList<Post> getPosturi() throws RemoteException;

public ArrayList<Angajat> cautaAngajat(String param_cautare) throws RemoteException;

public void stergeAngajat(int id_ang) throws RemoteException;

public void stergePost(int id_post) throws RemoteException;

public void stergeDepartament(int id_dep) throws RemoteException;

public boolean adaugaBeneficii(String denumire, double suma_datorata) throws RemoteException;

public ArrayList<Beneficiu> getBeneficii() throws RemoteException;

public void stergeBeneficiu(int id_ben) throws RemoteException;

public int numarBeneficii() throws RemoteException;

public boolean adaugaBeneficii(int a, ListModel model) throws RemoteException;

public boolean modificaAngajat(Angajat ang) throws RemoteException;

public boolean modificaSalariu(Salariu sal) throws RemoteException;

public Salariu getSalariuByIdAngajat(int id_ang) throws RemoteException;

public boolean modificaDepartament(Departament d) throws RemoteException;

public boolean modificaPost(Post p) throws RemoteException;

public ArrayList<Beneficiu> getBenefByAng(int id_ang) throws RemoteException;

public ArrayList<Beneficiu> getBenefByNotAng(int id_ang) throws RemoteException;

public boolean stergeBeneficiuAngajat(int idAngajat, String denumire) throws RemoteException;

public boolean adaugaBeneficiuNou(int idAngajat, String denumire) throws RemoteException;

public void stergeBeneficiileAngajatului(int idAngajat) throws RemoteException;

public boolean modificaBeneficii(Beneficiu ben) throws RemoteException;

public ArrayList<Utilizator> getUtilizatori() throws RemoteException;

public boolean stergeContUtilizator(int id_utilizator) throws RemoteException;

public boolean modificaUtilizator(Utilizator u) throws RemoteException;

public boolean adaugaTipConcediu(String denumire, boolean cu_fara_plata) throws RemoteException;

public ArrayList<Tip_concediu> getTipuriConcediu() throws RemoteException;

public void stergeTipConcediu(int id_tip) throws RemoteException;

public boolean modificaTipConcediu(Tip_concediu t) throws RemoteException;

public int getZileConcediuRamase(Angajat a, int tip) throws RemoteException;

public int getZileConcediuRamase(Angajat a) throws RemoteException;

public boolean adaugaConcediu( int id_tip, int id_angajat, int zile_concediu, int id_luna, int an, int status, Date inceput, Date sfarsit) throws RemoteException;

public IstoricAngajati getIstoric(int id_angajat) throws RemoteException;

public boolean modificaTabPost(String post, String dept,Angajat a) throws RemoteException;

public boolean unicCNP(String cnp) throws RemoteException;

public Departament getDepartament(int id) throws RemoteException;

public Post getPost(int id) throws RemoteException;

public ArrayList<Concedii> getConcedii(int id, int luna, int an) throws RemoteException;

public boolean getTipConcediu(int id) throws RemoteException;

public ArrayList<PersoaneIntretinute> getPersoaneIntretinute(Angajat a) throws RemoteException;

public ArrayList<Angajat> getAngByVechime() throws RemoteException;

public Constante getConstanta(String nume) throws RemoteException;

public ArrayList<ConcediiView> getConcedii(int status, int idAngajat) throws RemoteException;

public boolean aprobaConcediul(ConcediiView c) throws RemoteException;

public boolean stergeConcediul(int id) throws RemoteException;

public ArrayList<Salarii> raport1() throws RemoteException;

public ArrayList<Angajati> raport1(ArrayList salarii) throws RemoteException;

public ArrayList<String> raport2() throws RemoteException;

public boolean adaugaConstanta(String denumire, double procent) throws RemoteException;

public boolean modificaConstante(Constanta con) throws RemoteException;

public void stergeConstanta(int idc) throws RemoteException;

public ArrayList<Constanta> getConstantele() throws RemoteException;

public Connection getConnection() throws RemoteException;

}

Funcțiile existente în clasa Angajat

public void create(Angajati angajati) {

EntityManager em = null;

try {

em = getEntityManager();

em.getTransaction().begin();

em.persist(angajati);

em.getTransaction().commit();

} finally {

if (em != null) {

em.close();

}

}

}

public void edit(Angajati angajati) throws NonexistentEntityException, Exception {

EntityManager em = null;

try {

em = getEntityManager();

em.getTransaction().begin();

angajati = em.merge(angajati);

em.getTransaction().commit();

} catch (Exception ex) {

String msg = ex.getLocalizedMessage();

if (msg == null || msg.length() == 0) {

Integer id = angajati.getId();

if (findAngajati(id) == null) {

throw new NonexistentEntityException("The angajati with id " + id + " no longer exists.");

}

}

throw ex;

} finally {

if (em != null) {

em.close();

}

}

}

public void destroy(Integer id) throws NonexistentEntityException {

EntityManager em = null;

try {

em = getEntityManager();

em.getTransaction().begin();

Angajati angajati;

try {

angajati = em.getReference(Angajati.class, id);

angajati.getId();

} catch (EntityNotFoundException enfe) {

throw new NonexistentEntityException("The angajati with id " + id + " no longer exists.", enfe);

}

em.remove(angajati);

em.getTransaction().commit();

} finally {

if (em != null) {

em.close();

}

}

}

public List<Angajati> findAngajatiEntities() {

return findAngajatiEntities(true, -1, -1);

}

public List<Angajati> findAngajatiEntities(int maxResults, int firstResult) {

return findAngajatiEntities(false, maxResults, firstResult);

}

private List<Angajati> findAngajatiEntities(boolean all, int maxResults, int firstResult) {

EntityManager em = getEntityManager();

try {

CriteriaQuery cq = em.getCriteriaBuilder().createQuery();

cq.select(cq.from(Angajati.class));

Query q = em.createQuery(cq);

if (!all) {

q.setMaxResults(maxResults);

q.setFirstResult(firstResult);

}

return q.getResultList();

} finally {

em.close();

}

}

public Angajati findAngajati(Integer id) {

EntityManager em = getEntityManager();

try {

return em.find(Angajati.class, id);

} finally {

em.close();

}

}

public int getAngajatiCount() {

EntityManager em = getEntityManager();

try {

CriteriaQuery cq = em.getCriteriaBuilder().createQuery();

Root<Angajati> rt = cq.from(Angajati.class);

cq.select(em.getCriteriaBuilder().count(rt));

Query q = em.createQuery(cq);

return ((Long) q.getSingleResult()).intValue();

} finally {

em.close();

}

}

public int getLastAngajat(){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findLast");

Angajati ang = (Angajati)q.getResultList().get(0);

return ang.getId();

}

public ArrayList<Angajat> cautaAngajat(String param){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findByParam");

param="%"+param+"%";

q.setParameter("param",param);

ArrayList<Angajat> angajati = new ArrayList<Angajat>();

List<Angajati> lista= q.getResultList();

for(int i=0;i<lista.size();i++){

Angajat a = new Angajat(lista.get(i).getId(),

lista.get(i).getNume(),

lista.get(i).getPrenume(),

lista.get(i).getTelefon(),

lista.get(i).getMail(),

lista.get(i).getCnp(),

lista.get(i).getAdresa(),

lista.get(i).getDataNasterii(),

lista.get(i).getDataAngajare(),

lista.get(i).getStareCivila(),

lista.get(i).getStatusPersIntretinuta());

angajati.add(a);

System.out.println(i+" – "+a);

}

return angajati;

}

public ArrayList<Angajat> getAngByVechime(){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findByVechime");

List<Angajati> lista_ang = q.getResultList();

ArrayList<Angajat> angajati = new ArrayList<Angajat>();

for(int i=0; i< lista_ang.size(); i++){

Angajat a = new Angajat(lista_ang.get(i).getId(),

lista_ang.get(i).getNume(),

lista_ang.get(i).getPrenume(),

lista_ang.get(i).getTelefon(),

lista_ang.get(i).getMail(),

lista_ang.get(i).getCnp(),

lista_ang.get(i).getAdresa(),

lista_ang.get(i).getDataNasterii(),

lista_ang.get(i).getDataAngajare(),

lista_ang.get(i).getStareCivila(),

lista_ang.get(i).getStatusPersIntretinuta());

angajati.add(a);

}

return angajati;

}

public boolean unicCNP(String cnp){

EntityManager em = getEntityManager();

Query q = em.createNamedQuery("Angajati.findByCNP");

q.setParameter("cnp", cnp);

List<Angajati> ang = q.getResultList();

if(ang.size()<1) return true;//pot introduce, nu mai exista

else return false;

}

@NamedQueries({

@NamedQuery(name = "Angajati.findAll", query = "SELECT a FROM Angajati a"),

@NamedQuery(name = "Angajati.findLast", query = "SELECT a FROM Angajati a ORDER BY a.id DESC"),

@NamedQuery(name = "Angajati.raportSalariu", query = "SELECT a FROM Angajati a WHERE a.id in (:listaID)"),

@NamedQuery(name = "Angajati.findByVechime", query = "SELECT a FROM Angajati a ORDER BY a.dataAngajare DESC"),

@NamedQuery(name = "Angajati.findById", query = "SELECT a FROM Angajati a WHERE a.id = :id"),

@NamedQuery(name = "Angajati.findByCNP", query = "SELECT a FROM Angajati a WHERE a.cnp = :cnp"),

@NamedQuery(name = "Angajati.findByParam", query = "SELECT a FROM Angajati a WHERE a.nume like :param or a.prenume like :param or a.cnp like :param"),

@NamedQuery(name = "Angajati.findByDataNasterii", query = "SELECT a FROM Angajati a WHERE a.dataNasterii = :dataNasterii"),

@NamedQuery(name = "Angajati.findByDataAngajare", query = "SELECT a FROM Angajati a WHERE a.dataAngajare = :dataAngajare"),

@NamedQuery(name = "Angajati.findByStatusPersIntretinuta", query = "SELECT a FROM Angajati a WHERE a.statusPersIntretinuta = :statusPersIntretinuta")})

Validare CNP

public boolean isValidCNP(String Cnp) {

final int[] CNP_KEY = new int[] { 2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9 };

if (Cnp == null)

return false;

if (Cnp.length() != 13)

return false;

// string – int[] conversion

int[] cnpInt = new int[13];

for (int i = 0; i < 13; i++)

cnpInt[i] = Integer.parseInt(new Character(Cnp.charAt(i))

.toString());

int suma_produse = 0;

for (int i = 0; i < 12; i++)

suma_produse += CNP_KEY[i] * cnpInt[i];

int suma_control_obtinuta = 1;

if (suma_produse % 11 < 10)

suma_control_obtinuta = suma_produse % 11;

return suma_control_obtinuta == cnpInt[12]; }

Funcția pentru stabilirea zilelor libere prin lege

public boolean checkDate(Calendar data){

ArrayList<Calendar> lista= new ArrayList<Calendar>();

Calendar c1 = Calendar.getInstance();

Calendar c2 = Calendar.getInstance();

Calendar c3 = Calendar.getInstance();

Calendar c4 = Calendar.getInstance();

Calendar c5 = Calendar.getInstance();

Calendar c6 = Calendar.getInstance();

Calendar c7 = Calendar.getInstance();

Calendar c8 = Calendar.getInstance();

Calendar c9 = Calendar.getInstance();

Calendar c10 = Calendar.getInstance();

Calendar c11 = Calendar.getInstance();

Calendar c12 = Calendar.getInstance();

int an = c1.get(Calendar.YEAR); //anul curent

//setam 1 ian

c1.set(an,Calendar.JANUARY,1);

lista.add(c1);

//setam 2 ian

c2.set(an,Calendar.JANUARY,2);

lista.add(c2);

//setam 5 mai

c3.set(an,Calendar.MAY,1);

lista.add(c3);

//setam Adormirea Maicii Domnului

c4.set(an,Calendar.AUGUST,15);

lista.add(c4);

//setam sf Andrei

c5.set(an,Calendar.NOVEMBER,30);

lista.add(c5);

//setam 1 dec

c6.set(an,Calendar.DECEMBER,1);

lista.add(c6);

//setam prima si a 2a zi de craciun

c7.set(an,Calendar.DECEMBER,25);

lista.add(c7);

c8.set(an,Calendar.DECEMBER,26);

lista.add(c8);

//setam Pastele

c9 = EasterCalculator.calculate(an);

lista.add(c9);

//setam a 2a zi de paste

c10.setTime(c9.getTime());

c10.add(c10.DATE, 1);

lista.add(c10);

//setam rusaliile – la 50(+1) zile de la Paste

c11.setTime(c9.getTime());

c11.add(c11.DATE, 49);

lista.add(c11);

//a 2a zi de rusalii

c12.setTime(c11.getTime());

c12.add(c12.DATE, 1);

lista.add(c12);

for(int i=0; i< lista.size(); i++){

Calendar c = lista.get(i);

if(c.get(Calendar.YEAR) == data.get(Calendar.YEAR) &&

c.get(Calendar.MONTH) == data.get(Calendar.MONTH) &&

c.get(Calendar.DAY_OF_MONTH) == data.get(Calendar.DAY_OF_MONTH)){

return true;

}

}

return false; }

Sintaxa SQL pentru rapoarte

<![CDATA[SELECT

angajati.`nume` AS angajati_nume,

angajati.`prenume` AS angajati_prenume,

istoric_angajati.`id` AS istoric_angajati_id,

istoric_angajati.`id_angajat` AS istoric_angajati_id_angajat,

istoric_angajati.`id_salariu` AS istoric_angajati_id_salariu,

salarii.`id` AS salarii_id,

salarii.`salariu_brut` AS salarii_salariu_brut,

salarii.`valuta` AS salarii_valuta

FROM

`istoric_angajati` istoric_angajati INNER JOIN `salarii` salarii ON istoric_angajati.`id_salariu` = salarii.`id`

INNER JOIN `angajati` angajati ON istoric_angajati.`id_angajat` = angajati.`id`

ORDER BY

salarii_salariu_brut DESC]]>

<![CDATA[SELECT

angajati.`id` AS angajati_id,

angajati.`nume` AS angajati_nume,

angajati.`prenume` AS angajati_prenume,

concedii.`id` AS concedii_id,

concedii.`id_tip` AS concedii_id_tip,

concedii.`id_angajat` AS concedii_id_angajat,

concedii.`data_inceput` AS concedii_data_inceput,

concedii.`data_sfarsit` AS concedii_data_sfarsit,

case

when concedii.`status` = 0 then 'spre aprobare'

when concedii.`status` = 1 then 'aprobat'

when concedii.`status` = 2 then 'respins'

END AS concedii_status,

tipuri_concediu.`id` AS tipuri_concediu_id,

tipuri_concediu.`denumire` AS tipuri_concediu_denumire

FROM

`concedii` concedii INNER JOIN `angajati` angajati ON concedii.`id_angajat` = angajati.`id`

INNER JOIN `tipuri_concediu` tipuri_concediu ON concedii.`id_tip` = tipuri_concediu.`id`]]>

Similar Posts