APLICAȚIE PENTRU EVIDENȚA ANGAJAȚILOR ȘI CALCULUL SALARIILOR LA CICLOP SRL Anul 2017 INFORMATICĂ ECONOMICĂ APLICAȚIE PENTRU EVIDENȚA ANGAJAȚILOR ȘI… [310693]

INFORMATICĂ ECONOMICĂ

APLICAȚIE PENTRU EVIDENȚA ANGAJAȚILOR ȘI CALCULUL SALARIILOR LA CICLOP SRL

Anul

2017

INFORMATICĂ ECONOMICĂ

APLICAȚIE PENTRU EVIDENȚA ANGAJAȚILOR ȘI CALCULUL SALARIILOR LA CICLOP SRL

Anul

2017

Lucrarea de licență cu titlul Aplicație pentru evidența angajaților și calculul salariilor la Ciclop SRL elaborată de studenta face o trecere în revistă a modului de lucru cu baze de date pe platforma Microsoft Visual Studio.NET și prezintă ca studiu de caz o [anonimizat] C# [anonimizat].

Lucrarea de licență îndeplinește condițiile de formă și conținut pentru a fi susținută în fața comisiei de acordare a [anonimizat] 2017.

Timișoara, Coordonator științific,

30.06.2017

CUPRINS

APLICAȚIE PENTRU EVIDENȚA ANGAJAȚILOR ȘI CALCULUL SALARIILOR LA CICLOP SRL

Rezumat: Lucrarea de față are ca obiectiv realizarea unei aplicații software pentru calculul salariilor. Astfel, mai întâi va fi prezentat cadrul teoretic pentru crearea unei aplicații cu ajutorul tehnologiei .NET Framework, a mediului de programare Visual Studio.NET și a limbajului de programare C#. Deoarece o astfel de aplicație este strâns legată de conexiunea cu o [anonimizat].NET care oferă facilitatea conexiunii prin clase de obiecte precum: Connection, Command, DataReader și DataAdapter. [anonimizat]-se modul de realizarea a unui asemenea program informatic pentru o societate comercială. [anonimizat], vor putea întocmi prezența angajaților la locul de muncă și vor calcula avansurile și salariile ce revin angajaților companiei. [anonimizat], [anonimizat].

Cuvinte cheie: salariu, aplicație, .NET, [anonimizat].

Introducere

Lucrarea de față abordează o [anonimizat] o [anonimizat]. Aplicația, [anonimizat] a oferi o [anonimizat].

Lucrarea este structurată pe trei capitole. [anonimizat] .NET, Visual Studio ca mijloc de scriere a codului, limbajul de programare C# (ales pentru dezvoltarea aplicației) și arhitectura ADO.NET pentru facilitarea conexiunii cu baza de date. Al doilea capitol este cel în care se prezintă și explică dezvoltarea unei aplicații pentru evidența anagajaților și calculul salariilor.

Primul capitol este împărțit în trei subcapitole. Primul subcapitol este o prezentarea a tehnologiei .[anonimizat]. Aceasta suportă o multitudine de limbaje de programare și oferă un set de biblioteci comune pentru toate limbajele de programare suportate. Acest fapt este principalul avantaj al platformei .NET. Al doilea subcapitol face referire la Visual Studio.[anonimizat], depanator, [anonimizat]telliSense, etc. Tot aici este prezentat limbajul de programare ales pentru dezvoltarea aplicației de salarizare. De asemenea, este explicat modul de utilizare a programării vizuale pentru dezvoltarea de aplicații și interfețe cu utilizatorii. Ultimul subcapitol este despre ADO.NET (ActiveX Data Object) ca arhitectură ce facilitează conexiunea dintre aplicație și baza de date. Sunt explicate obiectele .NET cu ajutorul cărora este posibilă această conexiune. Astfel, pentru a accesa bazele de date, se folosesc următoarele patru clase de obiecte: Connection, Command, DataReader și DataAdapter. ADO a introdus conceptul de conexiune deconectată, care este folosit pentru a nu avea conexiuni deschide permanent sau pe perioade lungi de timp. În acest mod se face economie de resurse.

Cel de al doilea capitol este cel care prezintă dezvoltarea propriu-zisă a aplicației de salarizare. Mai întâi este expusă analiza efectuată asupra companiei Ciclop SRL pentru a se cunoaște cerințele înaintate de către companie, dar și pentru a cunoaște procesul de salarizare, astfel aplicația să corespundă nevoilor. Este important ca aplicația să efectueze corect calculele avansurilor și a salariilor. Deoarece, aplicația se bazează pe conexiunea cu baza de date, aceasta a fost creată și explicată mai întâi. Baza de date este una creată cu ajutorul Microsoft Access. Ulterior este expusă crearea formularelor în interfața grafică cu ajutorul cărora se vor introduce, modifica, prelucra date și se vor obține ca rezultate avansurile și salariile. Se adaugă apoi codul aferent instrucționilor formularelor pentru a îndeplini funcțiile dorite. În final au fost create rapoarte, considerate a fi ieșirile sistemului. Aceste rapoarte sunt utile utilizatorului aplicației, deoarece rapoartele prezintă niște situații finale, date prelucrate.

În cele din urmă, se vor trage concluzii asupra acestei lucrări și asupra aplicației dezvoltate.

Literatura de specialitate

Noțiuni generale despre utilizarea .NET Framework

Având în vedere subiectul prezentei lucrări, se vor menționa metodele utilizate pentru a crea un sistem informatic pentru calculul salariilor, care accesează o bază de date cu ajutorul .NET Framework. La momentul actual, se consideră o metodă potrivită accesarea bazei de date printr-o interfață grafică pentru o asemenea aplicație, .NET oferind o modalitate facilă pentru programarea codului necesar. .NET Framework este un mediu de programare care a fost creat de către Microsoft pentru a elimina complexitatea fostelor medii de programare și pentru a oferi în acest fel, o flexibilitate în ceea ce privește programarea. Principalul scop al .NET fiind oferirea facilității de a dezvolta și executa aplicații, indiferent de platforma în care se programează. Programatorii au fost atrași să folosească această nouă tehnologie deoarece le făcea munca mai ușoară.

Printre principalele funcționalități ale .NET Framework, care sunt în același timp si avantajele importante pe care le prezintă această platformă de programare, se pot enumera: este suport pentru numeroase limbaje de programare (numărul limbajelor de programare depășind 20), este un model pentru programarea pur orientată pe obiecte, este independent de platforma folosită, execuția este comună tuturor limbajelor de programare cu ajutorul Common Language Runtime, conține o bibliotecă de clase de bază pentru toate limbajele de programare, face legătura dintre sistemul de operare și limbajul de programare. Ceea ce a dus la reușita acestui framework este faptul că nu există clasă separată pentru fiecare limbaj de programare, toate folosind biblioteca de clase a .NET. Acest fapt a dus la inexistența diferențelor între folosirea unor limbaje de programare, în defavoarea altor limbaje. Spre exemplu, scrierea codului în limbajul C# sau în oricare alt limbaj de programare nu are o relevanță prea mare. Codul nu va fi diferit ca număr de linii, ca performanță sau eficacitate deoarece toate limbajele folosesc clase comune a bibliotecii .NET.

La baza funcționării .NET stau Common Language Runtime, Common Type System și Common Language Specification, .Net Framework Class Library. Toate aceste sunt necesare pentru ca platforma să poată include numeroase limbaje de programare, având un set unic de biblioteci comune. În continuare se vor explica cele trei noțiuni pentru a se putea înțelege modul de funcționare a .NET.

Common Language Runtime, prescurtat CLR se ocupă cu serviciile de tipul runtime, aceste servicii fiind responsabile pentru integrarea limbajelor, securitate, managementul momeriei, managementul thread-urilor, execuția programului. La modul general se poate spune că CLR este un strat între sistemul de operare și limbajul de programare al aplicației, de aceea mai este numit și ca fiind un mediu gestionat. Funcția primară a CLR este de compilare și convertire a codului în cod nativ pentru a executa aplicația. Acesta nu ține cont de limbajul de programare utilizat în codul sursă, atâta timp cât compilatorul este unul compatibil cu Common Language Runtime.

Pentru a compila, CLR are nevoie de compilatorul JIT (Just in Time), deoarece atunci când se compilează programul, codul sursă este convertit în Microsoft Intermediate Language (MSIL), acesta fiind un cod intermediar. JIT este cel care face convertirea codului din fișierele sursă ale programului. Acest fapt se poate înțelege mai bine din figura 1.

Figura 1. Modul de compilare cu ajutorul JIT, Sursa: http://blog.zeltera.eu/?p=1634

Tot cu ajutorul JIT, instrucțiunile prezente în codul sursă sunt executate doar atunci când sunt apelate de anumite funcții, compilarea efectuându-se atunci când este nevoie.

De asemenea, CLR este cel care definește Common Type System, acesta fiind responsabil pentru modul în care tipurile de date sunt declarate și modul în care acestea sunt administrate în execuție. Acesta ajută la reprezentarea comună a tipurilor de date pentru toate limbajele suportate de .NET. Se elimină în acest mod problemele legate de tipurile de date în alte limbaje. Spre exemplu, o variabilă de tip întreg se declară în C# ca int, iar în Visual Basic sub forma cuvântului cheie integer, dar în ambele cazuri se face referire la tipul de date System.Int32 din assembly-ul mscrolib.dll.

Common Language Specification este responsabil de modul în care fiecare limbaj de programare este unic prin sintaxa proprie, deși toate limbajele duc la aceleași construcții de programare. Spre exemplu, fiecare limbaj folosește caractere diferite pentru instrucțiuni precum concatenarea (unele folosind caracterul +, altele caracterul &). CLS cuprinde un set de reguli, prin care se delimitează funcționalitățile pe care un compilator .Net trebuie să îl respecte pentru a conduce la găzduirea codului sursă de către CLR. De aceea, este necesară compilarea codului cu ajutorul unui compilator compatibil cu limbajul de programare, acesta fiind mai apoi compilat cu ajutorul JIT. Reprezentarea acestei operațiuni este mai clar definită în figura 2, unde codul CIL este Common Intermediate Language, noua denumire utilizată pentru MSIL.

Figura 2. Compilarea codului cu ajutorul compilatorului limbajului de programare și compilatorul JIT, Sursa: http://blog.zeltera.eu/?p=1634

O altă caracteristică dominantă a .NET Framework este biblioteca .NET Frame Class Library. Clasele de bază ale acesteia sunt responsabile de funcționalitățile standard, spre exemplu: intrare sau ieșire, utilizarea tipului de date string, managementul securității, folosirea comunicației în rețea, managementul execuției programului, managementul textului și ale elementelor ce țin de design-ul interfeței. De asemea, Base Class Libraries furnizeaza suport pentru conectarea la baza de date, manipularea XML-ului. Clasele ADO.NET oferă facilitatea interacțiunii cu date în format XML, date care se accesează cu ajutorul unor interfețe precum: OLE DB, ODBC, Oracle și SQL Server. Clasele XML se ocupă cu manipularea și translatarea XML. XML a fost creat pentru transmiterea ușoară a datelor. Clasele ASP.NET sunt cele utilizate în dezvoltarea aplicațiilor Web, clasele Windows Forms sunt utile în dezvoltarea aplicațiilor desktop-based smart client. De exemplu, cu ajutorul clasei Form se pot crea ferestre pentru interacțiunea cu utilizatorul. Această clasă va fi foarte utilă în crearea sistemului informatic pentru calculul salariilor. Clasa face parte din System.Windows.Forms. Totalitatea bibliotecilor de clase existente garantează o interfață de dezvoltare comună pentru limbajele de programare suportate de .NET Framework.

Putem concluziona prin faptul că platforma .NET Framework oferă o variantă utilă, ușor de folosit și performantă programatorilor pentru dezvoltarea aplicațiilor/programelor. Renunțarea la complexitatea existentă în ceea ce privea vechile metode de dezvoltare a adus un mare avantaj platformei, dar și celor care o utilizează. .NET este o platformă comună limbajelor de programare precum Visual Basic, C#, F#, C++ și altele. Programatorii nu mai sunt obligați să cunoască bibliotecile distincte ale fiecărui limbaj, .NET Framework având o blibliotecă de clase unică tuturor limbajelor. De aceea, orice limbaj ați folosi pentru a scrie cod, nu vor exista diferențe de performanță.

Un alt avantaj este reprezentat de faptul că diferite versiuni ale .Net Framework pot fi utilizate pe Windows, pe Zune media player, in Azure Cloud, PocketPC și pe console de jocuri de tipul celor Xbox.

Noțiuni generale privind Visual Studio.NET și limbajul de programare C#

Pentru a dezvolta sistemul informatic pentru calculul salariilor am ales Visual Studio.NET ca mediu de programare, deoarece face parte din .NET Framework și oferă facilități precum un editor de cod, compilator, depanator, automatizarea procesului de compilare, etc. Visual Studio oferă în acelați timp și posibilitatea creării aplicațiilor de tip consolă, cu interfață grafică (GUI), de tip Windows Form și de tip Web.

Editorul de cod oferă facilitatea IntelliSense prin care, atunci când se scrie un cuvănt cheie, metodele care pot fi utilizate alături de cuvântul cheie vor apărea evidențiate într-o listă, din care se poate selecta cu ajutorul butonalor Enter și Tab sau prin dublu click. IntelliSense aduce un mare avantaj programatorilor.

Un alt avantaj în dezvoltarea de aplicații cu ajutorul Visual Studio.NET este faptul că debugger-ul integrat al acestuia poate depana atât cod sursă, cât și cod mașină. Totodată, mediul de programare dispune și de un set de design printre care se pot enumera form designer, Web designer, class designer și scheme designer. Form designer-ul se folosește în cazul aplicațiilor cu interfață grafică, iar Web designer-ul este utilizat în cazul site-urilor dinamice. Class designer ajută în crearea unei noi biblioteci customizate. Pentru suportul bazelor de date este folosit scheme designer-ul.

Visual studio grupează fișierele sursă și ale altor resurse ale aplicației în două categorii de fișiere:

Proiect: conține informațiile de care este nevoie pentru a se putea compila un modul al aplicației;

Soluție: conține toate proiectele care împreună alcătuiesc o aplicație, dar și relațiile de dependență dintre acestea. Toate proiectele sunt implicit puse într-o soluție, proiectele fiind modalitatea prin care Visual Studio poate compila o aplicație.

Conform informațiilor care se găsesc pe site-ul ase.softmentor.ro /POO /IntroducereInCSharp .htm, „proiectele sunt fișiere XML care conțin următoarele informații:

lista fișierelor necesare, poziția pe disc a acestora precum și modul în care vor fi utilizate;

lista de module externe referite;

mai multe seturi de parametri de compilare numite configurații (implicit sunt doar două – Debug și Release – dar se pot defini și alte configurații);

diverse opțiuni legate de proiect.”

Actualmente, Visual Studio suportă limbajele de programare Visual Basic, C#, F#, C++ și altele. Dintre acestea am ales limbajul C# pentru dezvoltarea sistemului informatic care face subiectul acestei lucrări. Se vor prezenta caracteristicile acestui limbaj de programare, care vor face și argumentul pentru care a fost ales acest limbaj.

Limbajul C# a fost creat de către o echipă din cadrul Microsoft. Principalul reprezentant al echipei de ingineri care au participat la crearea limbajului este Anders Hejlsberg. A fost lansat în anul 2000, iar de atunci a avut o evoluție pozitivă, foarte mulți programatori renunțând la vechile limbaje de programare precum C, C++ sau Java, pentru a trece la programarea cu ajutorul limbajului C#.

C# este un limbaj orientat pe obiecte (incapsularea, moștenirea și polimorfismul fiind păstrate ca principii de bază), un limbaj simplu, modern. Este considerat un limbaj simplu deoarece are doar 80 de cuvinte cheie și 12 tipuri de date. Cu toate acestea, oferă o productivitate foarte bună în ceea ce privește programarea, având o utilitate generală. Se poate considera că acest limbaj este unul și orientat pe componente. Limbajul oferă suport pentru dezvoltarea de componente software, cât și pentru sisteme de tipul embeded system (dedicate). „Acestea din urmă se întind pe o arie largă, de la dispozitive portabile cum ar fi ceasuri digitale, telefoane mobile, MP3 playere, până la dispozitive staționare ca semafoare de trafic, sau controlere pentru automatizarea producției,” conform informațiilor furnizate în sursa: C. Gălățan, S. Gălățan, C# pentru elevi – Programare în Visual C# 2008 Express Edition.

Un mare avantaj oferit programatorilor este faptul că memoria utilizată de C# este automat gestionată, astfel obiectele care nu sunt necesare vor fi șterse prin eliberarea memoriei ocupate de acestea. Programatorii nu mai sunt nevoiți să știe unde este locul în care obiectele trebuie eliberate din memorie, așa cum trebuiau să facă la dezvoltarea codului în limbajele mai vechi de programare.

Limbajul C# a fost inițial creat pentru dezvoltarea platformei .NET, astfel acesta se află într-o relație strânsă cu această platformă, funcționarea lui fiind posibilă datorită .NET. C# folosește bibliotecile comune cu celelalte limbaje suportate de .NET, fără să aibă o bibliotecă de clase proprie. Așa cum am explicat și anterior, la compilarea codului scris în limbajul C# acesta este transformat într-un cod intermediar care, cu ajutorul JIT, este mai apoi transformat într-un cod executabil. În acest mod, codul intermediar poate fi transmis oricărui calculator și compilat mai apoi dacă există o versiune a .NET Framework pe acel calculator.

La modul general, C# moștenește principiile existente în limbajul C++. Desigur, există diferențe. Ca exemplu, s-au adaugat tipuri noi de date, au fost adăgate funcțiuni, a fost modificat tipul string, au fost eliminate moștenirea multiplă și pointerii.

Principalul motiv pentru care s-a ales limbajul C# pentru dezvoltarea aplicației de calcul al salariilor este faptul că acesta oferă posibilitatea programării vizuale, prin interfețe grafice, care sunt necesare aplicației. O definiție a programării vizuale este: „Programarea vizuală trebuie privită ca un mod de proiectare a unui program prin operare directă asupra unui set de elemente grafice (de aici vine denumirea de programare vizuală). Această operare are ca efect scrierea automată a unor secvențe de program, secvențe care, împreună cu secvențele scrise textual, vor forma programul.” (Sursa: N. Dumitru-Lupan, R. Pintea, A. Niță, M. Niță, C. Sichiu, N. Olăroiu, M. Tătăran, P. Jucovschi, T. Salomie, Introducere în programarea .Net Framework, p. 25)

Limbajul Visual C# are instrumente specializate pentru programarea vizuală, de aceea interfața se crează ușor și rapid. Cu ajutorul acestuia se realizează aplicații Windows, utilizând ferestre denumite „form” în C#. În Visual Studio există o fereastră Solution Explorer în care se gasesc toate formularele și fișierele proiectului. Fereastra Properties este cea care oferă posibilitatea introducerii și schimbării proprietăților obiectelor create. Fereastra Toolbox conține principalele controale și componente pentru dezvoltarea aplicației. Prin drag-and-drop controalele pot fi poziționate în cadrul aplicației.

Cu ajutorul claselor existente în cadrul Visual C# se pot crea ferestre/formulare și elemente specifice precum butoane, liste, casete pentru text. Crearea unei ferestre duce la generarea automată a unui cod pentru fereastră și elementele care sunt introduse de către programator. O fereastră se poate activa cu ajutorul comenzii form.Show() sau form.ShowDialog(), iar vizibilitatea unei ferestre se setează cu ajutorul metodelor Show sau Hide. Spre exemplu, codul utilizat pentru ascunderea unei ferestre este:

this.Hide();

sau this.Visible = false;

Cu ajutorul grupului Event din cadrul ferestrei Properties se poate defini modul în care se va comporta formularul în anumite evenimente. Cele mai comune evenimente sunt: Load (este evenimentul care apare atunci când formularul este încărcat în memorie pentru prima dată), FormClosed (evenimentul care apare atunci când fereastra este închisă), FormClosing (apare atunci cănd utilizatorul acționează butonul Close), Activated (formularul este activ) și Deactivated (pentru momentul în care utilizatorul trece pe un al formularul prin click pe acesta).

Controalele sunt elementele de bază ale unei interfețe. Acestea pot fi atribuite unui formular sau unui container din cadrul formularului. Definiția dată în manualul Introducere în programarea .Net Framework, p. 29 pentru controale este: „Un control este o instanță a unei clase derivate din System.Windows.Forms și este reponsabil cu desenarea unei părți din container. Visual Studio .NET vine cu o serie de controale standard, disponibile în Toolbox.” O clasificare a acestor controale, conform aceleași surse este:

Controale de acțiune, spre exemplu Button. Aceste controale execută o secțiune de cod atunci când sunt acționate. La butoane se scrie codul aferent acțiunii dorite în cadrul evenimentului Click. Un exemplu pentru acest fapt este:

private void button1_Click(object sender, System.EventArgs e)

{

MessageBox.Show(”Ați acționat butonul button1”);

}

Acest cod va afișa mesajul „Ați acționat butonul button1” atunci când se va da click pe butonul button1.

Controale valoare, care deobicei conțin text sau imagini. Exemple de astfel de controale sunt: label, textbox, picturebox.

Controale de selecție, permit selectarea unui element dintr-o listă cu ajutorul evenimentului Checked, atunci când se dă click pentru bifarea dintr-o listă a unui element. Exemple de controale de selecție sunt: CheckBox și RadioButton.

LinkLabel, care permite introducerea de hyperlink-uri prin LinkArea. Pentru a putea accesa link-ul trebuie utilizat evenimentul LinkClicked.

Controale de listare, care pot prelua date dintr-un DataSet, ArrayList sau orice altă sursă de date. De asemenea, se pot introduce date manual prin proprietatea Colection. Exemple de astfel de controale sunt: ComboBox, ListBox, CheckedListBox, ImageList.

MonthCalendar, prin care se afișează un calendar cu ajutorul căruia se poate selecta o anumită dată, oferind o afișare grafică a calendarului.

DateTimePicker, este de asemenea un calendar care permite selectarea unei date, fiind foarte asemănător lui MonthCalendar.

ListView, prin care se afișează o listă compusă din text, text și imagini mici, imagini mari, detalii. Este un control complex având ca proprietăți: View, LargeImageList, SmallImageList, Colums și Items. Ultimele două proprietăți ajută în stabilirea coloanelor și a elementelor ce vor fi afișate în ListView.

Controale de control, precum Timer (pentru controlul executării), OpenFileDialog, SaveFileDialog, ColorDialog, FontDialog, ContexMenu (utilizate pentru controlul dialogurilor).

Controale Toolbar, prin care se afișează o listă de butoane sub formă de bară în partea de sus a ferestrei.

Controale container. Aceste controale pot conține alte controale. Exemple de containere: GroupBox, TabControl, Panel.

Controale tip Menu, cu ajutorul căruia un formular poate conține un meniu principal (poate conține doar unul singur), iar editarea acestui meniu se face folosind Menu Designer. Exemple de meniuri: MenuStrip, ContexMenuStrip.

Cu ajutorul acestor controale se pot crea ferestrele aplicației și se pot implementa toate funcționalitățile aplicației. Utilizarea acestor controale produce automat un cod pentru ele, dar pentru funcționalitățile și funcțiile dorite la executarea aplicației este nevoie ca programatorii să dezvolte singuri codul aferent.

Programarea vizuală presupune de asemenea și spațiul System.Drawing. Acesta permite desenarea pentru a dezvolta interfețe grafice. Obiectul Point oferă coordonatele unui punct. Acesta este folosit și pentru a identifica un punct din spațiul unei ferestre sau container, astfel se poate modifica poziția controalelor. Structura Color este cea prin care se stabilesc culorile. Aceasta conține date și metode pentru culori. În ultimul rănd, clasa Graphics reprezintă o arie rectangulară în cadrul căreia se pot realiza reprezentări grafice.

Datele introduse de utilizator trebuie validate. Acest fapt este obligatoriu atunci când dorim să evităm eventualele erori care pot apărea. Un exemplu care ar crea o eroare este introducere unui caracter atunci când aplicația așteaptă o valoare numerică. Datele trebuie validate inainte de transmiterea acestora către alte clase sau către baza de date.

Validarea se poate face la nivel de câmp, datele fiind verificate la introducerea acestora cu ajutorul evenimentelor Leave, TextChanged și altele existente. De asemenea, validarea se poate face și la nivel de buton sau închidere a ferestrei, după ce toate informațiile au fost introduse. Există modalitate prin care utilizatorul este avertizat printr-un mesaj că a introdus o valoare greșită. Această modalitate este oferită de ErrorProvider. ErrorProvider semnalează eroarea separat pentru fiecare control. Un exemplu de cod pentru un Error Provider este:

errorProvider1.SetError(textBox1,"Ați introdus un caracter într-un câmp numeric!");

În cazul aplicației pentru calculul salariilor este foarte importantă validarea datelor. Introducerea unor date eronate va duce la returnarea unor rezultate eronate în ceea ce privește avansurile și salariile angajaților companiei.

Accesul la baza de date cu ajutorul ADO.NET

Conexiunea cu baza de date este foarte importantă atunci cănd se dorește dezvoltarea unei aplicații precum cea pentru calculul salariilor. Referirea la clasele obiectelor, furnizate de către .NET Framework pentru a avea acces la baza de date, se face cu ajutorul ADO.NET (ADO provenind de la ActiveX Data Objects). Principiul după care funcționează conexiunea prin ADO.NET este următorul: mai întâi se deschide conexiunea la baza de date, datele sunt preluate în recordset-uri, care conțin field-uri, apoi se fac modificările și operațiunile dorite asupra datelor extrase, acestea se salvează și actualizează în server, ca la final conexiunea urmând să se inchidă. Conform informațiilor găsite pe site-ul http:// www.rasfoiesc.com/educatie/informatica/Obiectele-ADONet36.php, „Conexiunea 'spune' celorlalte obiecte cu ce bază de date lucrează. Conexiunea se ocupă de logica low-level asociată protocolului. Acest lucru ușurează foarte mult munca unui programator, acesta neavând decât să instanțieze obiectul conexiune, să deschidă conexiunea, să facă operațiile de care are nevoie asupra bazei de date și apoi să închidă conexiunea.”

Inițial ADO a fost o bibliotecă de clase pentru componentele COM, dar datorită faptului că evoluția se îndrepta tot mai mult spre programarea de tip Web, a fost necesară trecerea la ADO.NET. Principalul avantaj adus prin ADO.NET este faptul că acesta reprezintă o arhitectură de date deconectată. Astfel, datele sunt preluate și memorate pe un calculator local, conectarea la baza de date făcându-se doar atunci când se adaugă sau modifică datele din baza de date și în cazul în care se dorește extragerea de noi date. Se face o economie de resurse, deoarece este mult mai eficientă folosirea unei arhitecturi deconectate, mai ales când există un număr foarte mare de conexiuni, care în trecut ar fi însemnat ca sute de conexiuni să fie continuu deschise. Pe lângă economia de resurse, arhitectura deconectată duce la o execuție mai rapidă a programului. Deși ADO.NET a dus la utilizarea mult mai simpla a conexiunilor cu baza de date, programatorii sunt nevoiți să înțeleagă foarte bine conexiunile pentru a lua deciziile potrivite în dezvoltarea corectă a aplicațiilor. ADO.NET a impus utilizarea unor convenții de denumire, a unor modele de design, în general a dus a utilizarea unui sistem de tip comun.

ADO.NET oferă acces la surse de date precum Microsoft SQL, OLE DB și XML. XML este utilizat pentru a coda datele ce urmează a fi transmise prin rețele. O definiție a ADO.NET este dată pe site-ul http:// vb.net-informations.com/framework/what_is_net_framework.htm: „ADO.NET este o tehnologie Microsoft .Net Framework 17 cu ajutorul căreia se pot accesa date, care asigură comunicarea între sisteme relaționale și non-relaționale printr-un set de componente ADO.NET, care constau într-un set de obiecte, ce furnizează servicii de acces de date în mediul .NET. ” În următoarea figură se poate vedea o schemă a ADO.NET și a modului în care aceasta funcționează.

Figura 3. Structura ADO.NET, Sursa: http://asp.net-informations.com/ado.net/ado-architecture.htm

Principalele obiecte cu ajutorul cărora arhitectura ADO.NET poate fi utilizată sunt: Connection, Command, Recordset și Field, iar componentele principale ale arhitecturii sunt Data Provider și DataSet. Data Provider este cunoscut și sub denumirea de furnizor de date, iar DataSet-ul este transpus în limba romănâ ca fiind un set de date. Structura acestora poate fi observată în figura ce urmează.

Figura 4. Structura DataProvider și DataSet, Sursa: http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate3/EN/html/devnet/adonetov_xml.html

Principalii furnizori de date utilizați de către programatori sunt:

SQL Server .NET Data Provider – obiectul utilizat fiind de tip SqlConnection, care face parte din namespace-ul System.Data.SqlClient;

OLE DB .NET Data Provider – obiectul utilizat este de tip OleDbConnection, făcând parte din System.Data.OleDb;

ODBC .NET Data Provider – obiectul utilizat pentru conexiune fiind Odbc Connection definit in System.Data.Odbc.

DataSet oferă posibilitatea unei arhitecturi deconectate prin care seturile de date sunt extrase din sursă și se poate lucra cu aceste date în mod independent de sursa de date. DataSet este alcătuit dintr-o mulțime de obiecte DataTable, care pot fi relaționate între ele cu obiecte de tip DataRelation. DataTable este format din obiecte de tip DataRow și DataColumn, care conțin date sub formă de randuri și coloane. Obiectul DataAdapter oferă o punte de legătură între DataSet și sursa de date.

Cadrul ADO.NET presupune două modele de Data Access Architecture: Connection Oriented Data Access Architecture și Disconnected Data Access Architecture. Connection Oriented Data Access Architecture presupune existența unei conexiuni permanent deschise pentru a putea interacționa cu baza de date utilizând comenzi SQL. DataSet-ul este o soluție în acest caz, deoarece incarcă datele din baza de date ca apoi să nu mai interacționeze deloc cu sursa datelor.

În Connection Oriented Data Access accesarea datelor se face folosind un obiect de tip DataReader, astfel trebuind să se mențină o conexiune continuu deschisă între aplicație și sursa datelor. Spre deosebire, DataSet nu are nevoie de o conxiune directă cu baza de date, neavând informații referitoare la sursa datelor.

Prin menținerea conexiunilor deschise numai pe perioada modificărilor datelor din baza de date sau pentru preluarea unor noi date, ADO .NET economisește resurse de sistem, ajutând astfel și la securitatea bazelor de date. Astfel, accesarea datelor în mod deconectat are impact pozitiv asupra performanțelor aplicației dezvoltate.

Așa cum am precizat anterior, obiectele utilizate în accesarea bazelor de date sunt: Connection, Command, DataReader și DataAdapter. O schemă cu modul în care aceste obiecte interacționează pentru a se stabili conexiunea la baza de date este următoarea:

Figura 5. Structura obiectelor utilizate la conexiunea cu baza de date,

Sursa: http://csharp.net-informations.com

Modul în care se face conexiunea la baza de date este următorul:

Cu obiectul Connection se stabilește o conexiune cu baza de date;

Conexiunea poate fi utilizata direct cu ajutorul unui obiect de tip Command sau cu un obiect de tip DataAdapter;

Obiectul de tip Command execută o comandă SQL asupra bazei de date;

Atunci când comanda SQL returnează valori multiple se folosește un obiect de tip DataReader, care va prelua datele;

O alternativă este utilizarea obiectului de tip DataAdapter pentru a prelua datele într-un DataSet. În acest caz modificările asupra bazei de date se pot face cu ajutorul unui DataAdapter, sau a obiectului Command.

Obiectul Connection facilitează accesarea bazelor de date. Prin obiectul Connection se pot face următoarele tipuri de conexiuni: SQLConnection, OleDbConnection, ODBCConnection, OracleConnection. SQLConnection este utilizat pentru conectarea la SQL Server, OleDbConnection este utilizat pentru conexiunile cu baze de date ale Microsoft (de exemplu Access), ODBCConnection este folosit pentru diverse baze date, iar precum ii spune și numele, OracleConnection este utilizat în cazul conexiunilor la baze de date din Oracle. Pentru aplicația care face subiectul studiului de caz, ce urmează a fi prezentat, s-a ales ca baza de date să fie Microsoft Access, astfel conexiunea se va realiza cu ajutorul obiectului OleDbConnection. Un exemplu de cod care face conexiunea la baza de date este:

public OleDbConnection con = new OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=salarii.accdb");

private void modificareDateAngajatToolStripMenuItem_Click(object sender, EventArgs e)

{con.Open();

FrmModifDateAng f = new FrmModifDateAng();

f.Show();

this.Visible = false;

}

Obiectul de tip Command este folosit pentru a declara o comandă SQL sau pentru a apela proceduri, care vor fi executate asupra bazei de date. Exemple de obiecte Command: SQLCommand, OleDbCommand.

Metodele prin care se efectuează comenzile sunt:

ExecuteNonQuery – execută comenzi precum INSERT, UPDATE, DELETE pentru baza de date, fără să returneze ceva;

ExecuteScalar – utilizată atunci când comanda returnează o singură valoare;

ExecuteReader – utilizată atunci când comanda returnează o mulțime de valori, folosindu-se un obiect tip DataReader.

Un exemplu de comandă prin metoda ExecuteNonQuery utilizând o bază de date Access este:

OleDbCommand cmd = new OleDbCommand();

cmd.Connection = f1.con;

cmd.CommandText = "INSERT INTO loguri(data, ora, utilizator, buton, operatia) VALUES (:data, :timp, :utilizator, :buton, :operatia)";

cmd.Parameters.AddWithValue(":data", String.Format("{0:dd/MM/yyyy}", data));

cmd.Parameters.AddWithValue(":timp", String.Format("{0:HH:mm:ss}", data));

cmd.Parameters.AddWithValue(":utilizator", GlobalVar.u);

cmd.Parameters.AddWithValue(":buton", Button1.Text);

cmd.Parameters.AddWithValue(":operatia", "vizualizare stat de plata");

cmd2.ExecuteNonQuery();

„Obiectul DataReader se bazează pe un flux unidirecțional, accesarea în mod read-only a rezultatelor interogării sursei de date, care nu actualizează datele,” conform informațiilor preluate din sursa: B. Hamilton, ADO.NET 3.5 Cookbook, p. 43.

DataReader conține un recordset bazat pe conxiune, fiind necesar să se mențină un obiect de tip Connection pe durata utilizării sale. Obiectele de tip DataReader sunt rezultatul utilizării metodei ExecuteReader sau a unui obiect Command.

Obiectul DataAdapter este utilizat pentru a se putea face legătura între baza de date și DataSet. Data Adapter transmite datele pentru popularea DataSet-urilor sau a DataTable-urilor, atunci când se apelează metoda Fill. Cu ajutorul metodei Update se pot înregistra în baza de date modificările efectuate în DataSet. La apelul metodei Update, modificările din DataSet sunt copiate în baza de date prin execuția uneia dintre comenzile de InsertCommand, DeleteCommand sau UpdateCommand.

SelectCommand conține obiectul sau textul din cadrul comenzii care va fi efectuată la apelul metodei Fill, InsertCommand conține textul sau obiectul care se va insera în baza de date, DeleteCommand conține textul sau obiectul care va fi sters din baza de date, iar UpdateCommand conține textul sau obiectul comenzii prin care se vor actualiza valori din baza de date.

Exemplu:

private void FrmModifContract_Load(object sender, EventArgs e)

{

TipAngajareDA = new OleDbDataAdapter("SELECT * FROM tip_angajare", f1.con);

TipAngajareDS = new DataSet();

TipAngajareDS.Tables.Add("tip_angajare");

TipAngajareDA.Fill(TipAngajareDS.Tables["tip_angajare"]);

}

Studiu de caz și rezultate

Prezentarea cerintelor

SC.Ciclop.SRL este o companie înființată în anul 1993, inițial având ca domeniu de activitate comercializarea pieselor auto pentru marca de automobile Dacia. În prezent au ca domeniu de activitate comercializarea pieselor auto, inclusiv piese pentru mașini din import, electrice și fitinguri, elemente de instalații pentru construcții, iar din anul 1998 și-au diversificat activitatea prin înființarea unui service auto. A ocupat locul al 19-lea în topul 100 Companii pentru care să lucrezi, realizat în anul 2007 de către revista Capital.

Se dorește realizarea unui nou sistem informatic pentru calculul salariilor care să corespundă noilor cerințe ale companiei. Necesitatea acestui sistem de calcul al salariilor derivă din necesitatea stocării datelor într-un mod sigur, rapid, fără posibilitatea erorilor umane care apar atunci când salarizarea este efectuată manual de către o persoană. Calculele efectuate pentru salarizare fiind interdependente între acestea, o singură eroare va duce la un rezultat necorespunzător. Compania are nevoie de un sistem care să fie capabil să calculeze automat avansurile și salarile acordate angajaților, în conformitate cu legislația referitoare la salariu, la contribuțiile angajatului și deducerile salariale care se pot aplica.

Această metodă presupune plata veniturilor salariale ale angajaților în două rate, avansul reprezentând ultima tranșă a drepturile salariale din luna precedentă, acestea fiind plătite deobicei în prima jumătate a lunii următoare celei în care a fost stabilit salariul angajatului. Sistemul informatic trebuie să asigure facilitatea de a înregistra zilnic prezența angajaților la locul de muncă, incluzând calcularea salariilor pentru perioada concediului de odihnă, a concediului de boală, concediului de maternitate și a altor cazuri în care lipsa de la locul de muncă a angajaților este plătită într-o oarecare măsură prin salariu.

De asemenea, printre cerințele exprimate de către companie se numără și existența unei posibilități de a înregistra angajații, de a înregistra contractele de muncă ale acestora și modificarea datelor angajaților sau a contractelor de muncă. Este de dorit ca datele tuturor celor care au fost și sunt angajați, respectiv contractele de muncă ale acestora să poată fi arhivate.

Actele normative care reglementează activitatea de salarizare

Conform art. 159 din Codul Muncii, „salariul reprezintă contraprestația muncii depuse de salariat,” în conformitate cu contracul de muncă individual încheiat la data angajării salariatului. De asemenea, fiecare angajat are dreptul la plata salariului exprimat în formă bănească, salariul fiind stabilit prin negocierea individuală dintre angajator și salariat, după cum este precizat în articolul 162.

Conform art 161 din Codul Muncii, salariile trebuie plătite inaintea oricăror altor obligații bănești ale angajatorului, acestea fiind creanțe privilegiate.

Salariul este confidențial, astfel plata salariului se face către una dintre următoarele persoane: salariatul deținător al drepturilor salariale, o persoană imputernicită de către salariat, soțul supraviețuitor, copiii majori sau părinții salariatului, persoane care dețin calitatea de moștenitor în cazul decesului angajatului.

Angajatorii sunt obligați ca plata salariaților să se facă cel puțin lunar, plata putând fi efectuată în numerar, prin virament în contul bancar al salariatului sau în numerar și în natură. Pentru plata prin virament, sau plata în numerar și natură, acestea trebuie prevăzute în contractul colectiv de muncă. Plata în natură poate reprezenta oferirea de cazare, hrană sau alte facilități, dar nu poate reprezenta plata integrală a salariului. Salariul trebuie să se ridice cel puțin la nivelul salariului minim brut pe țară, în formă bănească.

În conformitate cu articolul 168 din Codul Muncii, plata salariului este dovedită prin semnarea de către fiecare salariat la efectuare plății a statului de plată, sau a altor documente justificative. Statele de plată și celelalte documente justificative ale plății salariilor trebuie arhivate de către companie.

Salariul poate fi plătit în mai multe rate. Deobicei, se practică lichidarea în luna următoare celei pentru care a fost stabilit salariul. Ultima tranșă a salariului, denumită lichidare sau chenzina a doua, se plătește între datele 5 și 15 ale lunii pentru salariile din luna precedentă.

Pentru a putea calcula corect salariile este nevoie a se cunoaște și reglementările privind deducerile salariale, cotele de contribuții salariale ale angajatului și nivelul impozitului pe salariu ale anului curent.

Inventarul documentelor utilizate în activitatea de salarizare

Printre documentele utilizate în activitatea studiată se pot enumera: contractul de muncă, foaia de prezență, fișa de pontaje, fluturaș de avans, fluturaș de salariu, stat de plată.

Conform Codului Muncii, contractul de muncă se poate defini ca fiind  „contractul in temeiul caruia o persoana fizica, denumita salariat, se obliga sa presteze munca pentru si sub autoritatea unui angajator, persoana fizica sau juridica, in schimbul unei remuneratii denumite salariu.” Contractul de muncă se incheie la data angajării, între angajator și angajat, prin acesta stabilindu-se și reglementările referitoare la salarizarea angajatului.

Foaia de prezență se întocmește zilnic, prin înregistrarea prezenței fiecărui angajat la locul de muncă, pentru a se putea apoi calcula salariile acestora pe baza numărului de ore lucrate pe lună.

Fișa de pontaje se întocmește de asemenea zilnic, cuprinzând prezența, concediile, orele suplimentare, delegațiile, învoirile de la programul de muncă ale angajaților.

Statul de plată, conform site-ului http://legestart.ro/statul-de-salarii-ce-trebuie-sa-stim-despre-acest-document-financiar-contabil/ , este un „document pentru calculul drepturilor bănești cuvenite salariaților, precum și al contribuțiilor și al altor sume datorate, dar și document justificativ de înregistrare în contabilitate.” Se întocmește lunar pe baza pontajelor, a deducerilor și sporurilor salariale, a listelor cu avansurile, a concediilor salariaților. Acesta se poate întocmi pe secții, ateliere, departamente, etc.

Fluturașii se întocmesc în cazul plății în numerar a salariului și sunt oferiți salariatului la data plății salariului. Un exemplar este oferit angajatului, celălalt fiind arhivat împreună cu statul de plată. Fluturașul cuprinde toate detalii despre modul în care s-a efectuat calculul salariului pentru luna respectivă.

Inventarul documentelor poate fi mai bine înțeles din tabelul prezentat în cadrul anexei 1.

Analiza sistemului informațional cu ajutorul Flowchart-ul

Sistem informațional pentru activitatea analizată începe odată cu încheierea contractelor de muncă a angajaților. Unul din cele două exemplare este oferit noului angajat. În conformitatea cu reglementările înscrise în contract, se va completa zilnic prezența angajaților pentru a se putea mai apoi completa pontajele acestora. Astfel, se vor obține foaia de prezență și fișa de pontaje ale tuturor angajaților. Între datele 5 și 15 ale lunii se vor calcula avansurile pentru fiecare angajat în parte și se va întocmi statul de plată pentru avansurile ce urmează a fi acordate salariaților. Odată cu plata avansului, angajații vor primi fluturașul pentru avans, Procesul se reia cu întocmirea prezențelor și pontajelor pentru sfârșitul lunii, când se va face calculul salariilor și a restului de plată, pentru a se întocmi statul de plată și a se oferi angajaților fluturașii de salariu împreună cu forma bănească a acestuia. Flowchart-ul sistemului este reprezentat la anexe.

Entitățile sistemului

În următorul tabel vor fi enumerate entitățile identificate ale sistemul și atributele determinante ale acestora.

Tabelul 1. Entitățile sistemului

Aceste entități, atributele lor și relațiile dintre entități vor ajuta mai târziu în crearea bazei de date, necesară aplicației informatice de calcul al salariului. De aceea, este importantă dezvoltarea corectă a relațiilor dintre entități. Pentru a putea înțelege relațiile existente între aceste entități, se va prezenta o diagramă DER (Entitate-Relație), care se găsește în cadrul anexelor.

Proiectarea ieșirilor sistemului informatic

Ieșirile sistemului informatic, dezvoltat pentru calculul salariilor la compania Ciclop SRL, includ un set de rapoarte printre care: stat de plată al salariilor, listă cu avansurile, fluturașii pentru salarii, fluturașii pentru avansuri și un centralizator al salariilor în funcție de departamentul și funcția ocupată de către angajat.

În ceea ce urmează se vor prezenta machetele acestor rapoarte împreună cu tipul de date ales pentru câmpurile care le dețin.

Macheta pentru statul de plata este reprezentată în figurile 6.1 și 6.2.

Figura 6.1. Macheta statului de plată

Figura 6.2. Continuarea machetei statului de plată

Loc obținere: Resurse umane

Destinație:Resurse umane, Contabilitate

Număr de exemplare: 2

Frecvența: lunar

Dispozitiv sau periferic de ieșire: monitor, imprimanta

Validalea datelor necesare se face prin validarea tipului de date, iar în cazul câmpului CNP se va verifica numărul de cifre introduse, acesta neputând fi nici mai mare, nici mai mic de 13. În cazul denumirilor domeniului și a funcției, acestea trebuie să ia una din valorile înscrise în tabelele aferente denumirilor acestora, din baza de date.

Macheta listei cu avansurile angajaților va fi expusă în figura 7.

Figura 7. Macheta listei cu avansurile

Loc obținere: Resurse umane

Destinație:Resurse umane, Contabilitate

Număr de exemplare: 2

Frecvența: lunar

Dispozitiv sau periferic de ieșire: monitor, imprimanta

Validarea datelor se face prin validarea tipului de date pentru fiecare câmp, iar în mod special se va verifica numărul de cifre pentru câmpul CNP, respectiv pentru câmpul NR_contract, ca fiind 13, respectiv 10. Denumirea funcției trebuie să fie una dintre cele înscrise în tabelul aferent denumirilor funcțiilor din baza de date.

Figura 8 va reprezenta macheta centralizatorului salariilor pe funcții.

Figura 8. Macheta centralizatorului salariilor pe funcții

Loc obținere: Resurse umane

Destinație:Resurse umane, Contabilitate

Număr de exemplare: 2

Frecvența: lunar

Dispozitiv sau periferic de ieșire: monitor, imprimanta

Validarea datelor se face în fucție de tipul acestora de date. Denumirea domeniului și a funcției trebuie să se încadreze în valorile înscrise în baza de date, în tabelele aferente acestora.

În următoarea figură se va prezenta macheta fluturașului pentru avans.

Figura 9. Macheta fluturașului pentru avans

Loc obținere: Resurse umane

Destinație: Angajat, Contabilitate

Număr de exemplare: 2

Frecvența: lunar

Dispozitiv sau periferic de ieșire: monitor, imprimanta

Validarea datelor este identică cu cea din cazul listei cu avansurile.

Macheta ultimei ieșiri a sistemului informatic va fi prezentată in figura numărul 10.

Figura 10. Macheta fluturașului pentru salarii

Loc obținere: Resurse umane

Destinație: Angajat, Contabilitate

Număr de exemplare: 2

Frecvența: lunar

Dispozitiv sau periferic de ieșire: monitor, imprimanta

Validarea datelor este identică celei din cazul statului de plată.

Proiectarea intrărilor sistemului informatic

Intrările sistemului sunt foarte importante. De acestea depinde acuratețea ieșirilor. Orice eroare va duce la un rezultat final incorect. De asemenea, este necesară proiectarea acestora astfel încât să includă toate datele care sunt necesare calculelor. Spre exemplu, nu putem avea un salariu calculat corect, în condițiile în care acesta este calculat fără să se țină seama de deducerile personale.

Intrările sistemului informatic de calcul al salariilor sunt: contractul de muncă, foaia de prezență și fișa cu pontajele. Pentru validarea tuturor datelor din intrările sistemului se va ține cont de faptul că toate câmpurile sunt obligatorii, trebuind să fie completate. Următoarele machete vor reprezenta baza pentru implementarea acestora în cadrul aplicației.

Macheta contractului de muncă este următoarea:

Figura 11. Macheta contractului de muncă

Tipurile de date ale câmpurilor se pot observa în macheta contractului de muncă. Validarea valorilor câmpurilor se face, în primul rând, după tipul acestora. Apoi pentru câmpurile NR_contract, CNP și Nr_carte_muncă se vor face validări în funcție de lungimea câmpului. Funcția și tipul angajării trebuie să corespundă funcțiilor și tipurilor de angajare din cadrul tabelelor aferente din baza de date.

În următoarea figură se poate observa macheta foii de prezență și tipurile de date ale câmpurilor acesteia.

Figura 12. Macheta foii de prezență

Validarea se face prin verificarea tipului de date și lungimea câmpurilor.

În cele din urmă, va fi introdusă macheta pentru fișa cu pontajele angajaților prin figura ce urmează:

Figura 13. Macheta fișei de pontaje

La fel ca în cazul anterior, validarea datelor se face în funcție de tipul și lungimea acestora.

Proiectarea structurii interfeței cu utilizatorul

Pentru a putea mai apoi implementa interfața necesară aplicației, s-a ales proiectarea mai întâi a structurii acesteia. Rezultatul proiectării poate fi văzut în cadrul anexei cu numărul 4.

Proiectarea securității aplicației

Securitatea unui program informatic este foarte importantă. Nu este de dorit ca oricine să aibă acces la datele din interiorul programului, deoarece acestea pot fi confidențiale, sau pentru evitarea introducerii unor date eronate în sistem.

Pot fi introduse date eronate, pot fi modificate datele deja salvate sau se pot șterge anumite date care sunt necesare companiei. Aceste acțiuni pot fi înfăptuite intenționat sau neintenționat, utilizatorii programului informatic nefiind bine instruiți în ceea ce privește funcționarea corectă a programului.

Pentru a se evita situațiile neplăcute, utilizarea sistemului va fi condiționată de deținerea unui cont pentru accesarea acestuia. Astfel, pentru a se autentifica, utilizatorii vor avea nevoie de un nume și o parolă.

Vor exista trei tipuri de utilizatori. Primul tip este reprezentat de administrator, cel care va avea acces la întreaga aplicație, dar va putea, de asemenea, să schimbe parolele utilizatorilor și să vizualizeze registrul cu operații. Registrul cu operații este acela în care se vor înregistra toate acțiunile efectuate de utilizatori în cadrul sistemului informatic. Registrul va înregistra data și ora, utilizatorul, butonul acționat și operația efectuată.

Cel de-al doilea utilizator este pentru angajații care sunt însărcinați cu toată activitatea de salarizare. Aceștia nu vor putea schimba parolele și nici nu vor putea vizualiza registrul cu operații, dar pot efectua toate operațiile cu referire la întocmirea prezenței, la calculul avansurilor și a salariilor, la rapoartele sistemului. De asemenea, vor putea încheia, modifica și suspenda contracte de muncă. În caz de nevoie, vor putea modifica datele angajaților.

Ultimul tip de utilizator va avea acces doar la încheierea, modificarea, suspendarea contractelor de muncă și la modificarea datelor angajaților. Acesta nu va putea accesa partea din program necesară calculării avansurilor și salariilor, din motive de confidențialitate a salariului. De asemenea, nu va putea schimba parole alea utilizatorilor și nici să vizualizeze registrul cu operațiile efectuate de către ceilalți utilizatori în cadrul programului informatic.

Baza de date

Deoarece aplicația necesită o bază de date pentru a putea funcționa, s-a creat o bază de date în Microsoft Acces. Aceasta este formată din 14 tabele. 9 dintre aceste tabele sunt relaționate între ele. Cele 14 tabele create sunt: contracte, angajati, salarii, prezenta, pontaje, retineri, tip_angajare, domenii, functii, procente, transa_vechime, transa_fidelitate, useri și loguri. Dintre acestea, ultimele 5 fiind cele fără legătură cu alte tabele.

În următoarea figură se va prezenta schema ralațiilor dintre tabele.

Figura 14. Structura relațională a bazei de date

Tabela „contracte” este cea în care se înregistreză datele corespunzătoare contractelor de muncă ale angajaților companiei. Tabela conține câmpurile care se pot observa în figura 15.

Figura 15. Câmpurile tabelei „contracte”

După cum se vede în figura cu numărul 18, cheia primară a tabelei este câmpul NR_contract. Câmpul tip_angajare face legătura acestei tabele cu tabela „tip_angajare”, astfel angajatul poate avea un contract încheiat pe o perioadă determinată sau nedeterminată. Legătura cu tabela „functii” se face prin câmpul fuctia al tabelei „contracte”, angajatul putând avea doar o funcție care se regăsește în tabela „functii”.

În figura cu numărul 16 se poate vedea tabela „contracte” cu conținutul acesteia.

Figura 16. Conținutul tabelei „contracte”

Pentru tipul angajării s-a creat tabela „tip_angajare”, conținând câmpurile ID_tip_angajare și tip_angajare. ID_tip_angajare este de tip Autonumber și este cheia primară a tabelei. Conform tabelei, tipul de angajare al unei personae poate fi pe perioada determinată sau nedeterminată.

Conținutul tabelei se află afișat în figura numarul 17.

Figura 17. Conținutul tabelei „tip_angajare”

S-a creat separat o tabelă cu datele angajaților, deoarece un angajat poate avea mai multe contracte de muncă în cadrul companiei, în perioade diferite de timp. Aceasta conține datele generale ale fiecărui angajat. Lista câmpurilor tabelei este prezentată în figura ce urmează.

Figura 18. Câmpurile tabelei „angajati”

Câmpul CNP este cheia primară a tabelului. Astfel se evită dubla înregistrare, fiecare persoană având un CNP unic. Tabela „angajati” se află într-o relație cu tabela „domenii” pentru a facilita întocmirea statelor de plată, care se fac în funcție de domeniul angajaților. De asemenea, tabela „angajati” are o legătură cu tabela „funcții” prin câmpul functia.

Tabela „domenii” conține două câmpuri, primul fiind ID_domeniu, iar cel de-al doilea fiind denumire_domeniu. Primul câmp este cheia primară a tabelei „domenii”. Prin acest câmp se face legătura cu tabela „functii”, care are trei câmpuri: ID_functie (cheia primară), ID_domeniu, denumire_functie. În acest fel fiecare funcție este atribuită unui domeniu. Domeniile și funcțiile înregistrate în tabele corespund departamentelor și funcțiilor ocupate de angajații companiei Ciclop SRL.

În următoarele trei figuri se pot observa conținutul tabelelor „angajati”, „domenii” și „functii”.

Figura 19. Conținutul tabelei „angajati”

Figura 20. Conținutul tabelei „domenii”

Figura 21. Conținutul tabelei „functii”

Tabela „prezenta” este cea în care se înregistrează prezența angajaților. Prezența se întocmește în fiecare zi pentru fiecare salariat, în fiecare lună. Cheia primară a acestui tabel este ID_salariu. Acest fapt se datorează legăturii tabelei „prezenta” cu tabela „salarii”, care are același câmp pentru cheia primară. În tabela „salarii”, câmpul ID_salariu este determinat în mod unic de câmpurile ce dețin CNP-ul, luna și anul. Tabela „prezenta” conține orele lucrate, orele suplimentare, zilele de concediu și orele lipsite pentru fiecare angajat în parte, identificat prin ID_salariu. O parte din conținutul tabelei „prezenta” poate fi observată în figura 22.

Figura 22. Parte a conținutului tabelei “prezenta”

Tabela „pontaje” este utilizată în întocmirea fișei de pontaje. În această tabelă se realizează o cumulare de date din tabela “prezenta”, astfel câmpurile tabelei “pontaje” sunt: ID_salar, un câmp pentru fiecare zi a lunii, totalul orelor lucrate, totalul orelor suplimentare și totalul orelor nelucrate, ore concediu odihna, ore concediu de boală, și ore lipsite împărțite în ore pentru accident de muncă, ore concediu de maternitate, ore în care angajatul este învoit, orele nemotivate și orele pentru obligații cetățenești. Ultimele 7 câmpuri enumerate sunt defapt detaliile pentru câmpul orelor nelucrate. Tabela „pontaje” este relaționată cu tabela „salarii” prin câmpul ID_salar, cheia primară a tabelei. În următoarea figură se poate vedea o parte a conținutului acestei tabele.

Figura 23. Parte din conținutul tabelei „pontaje”

Tabela „procente” este cea care conține parametrii de calcul necesari salariilor. Această tabelă

conține trei câmpuri, și anume: ID de tip Autonumber, prin care se identifică parametrii, fiind cheia primară a tabelei, denumire, care conține denumirea parametrului și valoarea procentuală a acestuia. Această tabelă este independentă de restul tabelelor. Este utilizată în calcularea salariilor. Valoare parametrilor poate fi modificată pentru a corespunde legislației în vigoare. Această modificare se face cu ajutorul interfeței aplicației prin meniul „Modificare parametrii”.

Figura 24 va prezenta conținutul tabelei „procente”, care este populată cu parametrii la valorile legislației în vigoare. Denumirile Co, Cb, M, Am, O sunt prescurtări ale concediului de odihnă, concediului de boală, maternității, accidentului de muncă, obligațiilor cetățenești.

Figura 24. Conținutul tabelei „procente”

Tabela „retineri” a fost creată pentru a înregistra salariul brut, reținerile pentru șomaj, sănătate, CAS, deducerea personală, valoarea netă a salariului, baza de impozitare, impozitul reținut, salariul net, rata CAR, avansul acordat și restul de plată. Aceasta are, de asemenea, câmpul ID_salariu ca fiind cheia primară. În acest mod se face legătura dintre tabela „retineri” și tabela „salarii”. Conținutul tabelei poate fi văzut în cadrul figurii 25.

Figura 25. Parte a conținutului tabelei “retineri”

Tabela „salarii” este cea în care se înregistrează salariile din fiecare lună pentru fiecare angajat în parte. Astfel, în această tabelă se regăsesc informațiile necesare calculării salariilor. Informațiile necesare sunt următoarele: CNP-ul angajatului, salariul de încadrare al acestuia, numărul de zile lucrătoare ale lunii pentru care se calculează salariul, salariul lunii, salariul cuvenit pentru orele suplimentare efectuate, salariul pentru orele de concediu de odihnă, concediu de boală, concediu de maternitate, concediu pentru accident de muncă și concediul pentru obligații cetățenești. Pe lângă acestea, se adaugă sporurile de conducere, de fidelitate, de vechime și de asemenea, salariul brut. Deoarece valorile procentoale ale parametrilor de calcul al salariilor se pot schimba cu trecerea timpului, valorile parametrilor sunt salvate în această tabelă pentru a putea avea o imagine despre modul de calcul al salariilor, chiar și după ce valorile parametrilor s-ar fi schimbat. În ultimul rând, s-a creat un câmp de tipul Yes/No, care atunci când este bifat se vor arhiva datele salariilor pe o anumită lună, neputând să mai fie modificate valorile înregistrate. Cheia primară a tabelei „salarii” este ID_salariu, de tip Autonumber, care este identificat de câmpurile CNP, luna și an, așa cum s-a precizat anterior.

În următoarele 2 figuri se va prezenta o parte din conținutul tabelei „salarii”. Cele două figure cuprind tabela una în continuarea celeilalte.

Figura 26. Prima parte din conținutul tabelei „salarii”

Figura 27. A doua parte din conținutul tabelei „salarii”

Tabela „transa_fidelitate” estea cea care conține sporurile acordate în funcție de vechimea angajatului în firmă. Această tabelă este alcătuită din două câmpuri: ANI, care este cheia primară a tabelei, și spor_fidelitate, în care este înregistrată valoarea procentuală a sporului acordat. În cadrul câmpului ANI se precizează numărul de ani pentru care se acordă procentele pentru sporul de fidelitate. Dacă această tabelă nu conține înregistrări (așa cum este cazul de față), înseamnă că firma nu acordă spor de fidelitate, tabela „transa_fidelitate” fiind creată în cazul în care firma va schimba politica de salarizare și va dori acordarea unui asemenea spor.

Asemănătoare tabelei „transa_fidelitate”, este tabela „transa_vechime”. În această tabelă sunt incluse sporurile pentru vechimea în muncă acordate angajaților. Tabela „transa_vechime” este alcătuită din două câmpui: ANI (cheia primară a tabelei) și spor_vechime, în care sunt reținute procentele pentru acordarea sporului. Cu ajutorul înregistrărilor din tabela „transa_vechime” se poate calcul valoarea bănească ce revine angajatului pentru sporul de vechime. Figura 28 afișează conținutul tabelei „transa_vechime”.

Figura 28. Conținutul tabelei „transa_vechime”

Pentru partea de securitate a aplicației este nevoie de crearea a două tabele. Prima este tabela „useri”, în care se vor înregistra numele și parola utilizatorilor. Câmpul numelui fiind cheia primară a tabelei. Cea de a doua tabelă este denumită “loguri”, în care se înregistrează data, ora, utilizatorul, butonul acționat și operația efectuată de utilizator. Cheia primară a tabelei este câmpul ID de tipul Autonumber.

În figurile 29 și 30 se poate observa conținutul tabelelor „useri” și „loguri”.

Figura 29. Conținutul tabelei „useri”

Figura 30. Conținutul tabelei „loguri”

Dezvoltarea codului aplicației și a interfaței cu utilizatorul

Meniul principal este cel prin care există posibiltatea accesării tuturor opțiunilor. Cu ajutorul submeniului „Angajati” se pot accesa modulele pentru încheierea, modificarea sau anularea contractelor, precum și modulul creat pentru modificarea datelor angajaților. În figura 31 se va putea observa meniul principal și submeniul „Angajati”.

Meniul principal oferă posibilitatea accesării submeniului „Pontaje si calcul salarii”, cu ajutorul căruia se pot accesa următoarele opțiuni: schimbarea parametrilor de calcul al salariilor, întocmirea prezenței angajaților la locul de muncă din cadrul Ciclop SRL, calcularea avansurilor și ale salariilor ce se cuvin angajaților.

Există și submeniul „Rapoarte”, fiind accesat pentru a se putea realiza și vizualiza toate situațiile de ieșire ale aplicației.

Administratorul aplicației va putea accesa submeniul „Securitate”, unde acesta poate schimba numele și parolele utilizatorilor, dar și să vizualizeze registrul cu operațiile efectuate de utilizatori.

Ultima opțiune a meniului principal este „Iesire”. Prin acționarea acestei opțiuni se părăsește programul.

Cele 3 figuri în care se pot observa submeniurile „Pontaje si calcul salarii”, „Rapoarte” și „Securitate” pot fi observate în cadrul anexei 5.

Figura 31. Meniul principal cu submeniul „Angajati”

Conexiunea la baza de date este definită în cadrul meniului principal ca un obiect public definit cu numele „con”, urmând apoi să fie utilizat in toate formularele proiectului. Codul aferent este:

public OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=salarii.accdb");

Baza de date a fost salvată în fișierul implicit bin/Debug al proiectului pentru a-l putea muta oriunde fără a se pierde conexiunea cu baza de date. Din această cauza, la Data Source apare direct numele bazei de date din Access.

Directiva Imports System.Data.OleDb este necesară accesării obiectelor din ierarhia de clase OleDb, facilitând lucrul cu o baza de date din Access. De aceea această directivă va fi utilizată în cadrul tuturor formulare ale aplicației.

Meniul principal are ca scop gestionarea tuturor celorlalte formulare ale aplicației. Codul aferent acestei operații este următorul:

using System.Data.OleDb;

namespace Salarii

{ public partial class Form1 : Form

{ public Form1()

{ InitializeComponent(); }

public OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=salarii.accdb");

private void sfarsitToolStripMenuItem_Click(object sender, EventArgs e)

{ Application.Exit(); }

private void modificareDateAngajatToolStripMenuItem_Click(object sender, EventArgs e) { con.Open();

FrmModifDateAng f = new FrmModifDateAng();

f.Show();

this.Visible = false;

}

// asemanator si celelalte optiuni de meniu

}

}

Încheierea contractelor de muncă cu persoanele noi angajate se poate realiza cu ajutorul formularului „FrmIncheiereContract”. Numărul contractului de muncă se generează automat, succesiv, astfel va primi o valoarea cu un număr mai mare față de ultimul contract creat. Pentru câmpurile de tip dată calendaristică, precum data angajării, s-a ales controlul DateTimePicker. Pentru tipul angajării și funcția angajatului s-a ales controlul ComboBox, încărcat în prealabil (la evenimentul Form_Load al formei „FrmIncheiereContract”) cu valorile existente în tabelele „tip_angajare”, respectiv „functii”. Pentru celelalte câmpuri s-a utilizat controlul TextBox.

Pentru a încheia un nou contract de muncă este necesară completarea datelor cuprinse în contract, apoi se apasă butonul „Încheiere contract” pentru a salva noul contract. Datele se vor salva în tabelele „contracte” și „angajati”. În cazul în care se dorește renunțarea la încheierea contractului, se poate folosi butonul „Renuntare”. Pentru a putea reveni la meniul principal, a fost creat butonul „Revenire la meniu”. Formularul poate fi observat în figura 32.

Figura 32. Formularul “FrmIncheiereContract”

Codul aferent încărcării formularului este următorul:

private void FrmIncheiereContract_Load(object sender, EventArgs e)

{ AngajatiDA = new OleDbDataAdapter("SELECT * FROM angajati", f1.con);

AngajatiDS = new DataSet();

AngajatiDS.Tables.Add("angajati");

AngajatiDA.Fill(AngajatiDS.Tables["angajati"]);

ContracteDA = new OleDbDataAdapter("SELECT * FROM contracte", f1.con);

ContracteDS = new DataSet();

ContracteDS.Tables.Add("contracte");

ContracteDA.Fill(ContracteDS.Tables["contracte"]);

calculMaxNrContract();

TipAngajareDA = new OleDbDataAdapter("SELECT * FROM tip_angajare", f1.con);

TipAngajareDS = new DataSet();

TipAngajareDA.Fill(TipAngajareDS, "tip_angajare");

comboBox1.DataSource = TipAngajareDS.Tables["tip_angajare"];

comboBox1.DisplayMember = "tip_angajare";

comboBox1.ValueMember = "ID_tip_angajare";

comboBox1.SelectedIndex = -1;

FunctiiDA = new OleDbDataAdapter("SELECT * FROM functii", f1.con);

FunctiiDS = new DataSet();

FunctiiDA.Fill(FunctiiDS, "functii");

comboBox2.DataSource = FunctiiDS.Tables["functii"];

comboBox2.DisplayMember = "denumire_functie";

comboBox2.ValueMember = "ID_functie";

comboBox2.SelectedIndex = -1;

txtSalariu.Text = "0.00";

this.AcceptButton = btnIncheiereContract;

}

Funcția calculMaxNrContract() este cea care generează automat numărul contractului.

Codul aferent evenimentului click al butonului pentru încheierea contractelor poate fi văzut în cadrul anexei cu numărul 6.

Formularele pentru modificarea și suspendarea contractelor utilizează câte un BindingNavigator și un BindingSource, pentru a putea vizualiza și alege contractele existente. Cele două formulare se numesc „FrmModifContract”, respectiv „FrmSuspendareContract” și vor putea fi vizualizate în figurile 33 și 34.

Pentru modificarea contractelor este nevoie să se apeleze o interogare UPDATE, acest formular permițând modificarea doar a câmpurilor care conțin datele contractului, pentru modificarea datelor angajatului existând un alt formular separat. Modificarea este posibilă doar după ce este acționat butonul „Editare” (), iar după modificarea datelor se apasă butonul pentru salvarea modificărilor, reprezentat grafic prin .

Suspendarea unui contract presupune tot o interogare UPDATE, astfel se setează starea contractului ca fiind anulat. Suspendarea se face apăsând butonul .

Figura 33. Formularul „FrmModifContract”

Figura 34. Formularul “FrmSuspendareContract”

Codul aferent salvării modificărilor efectuate asupra unui contract și codul aferent suspendării unui contract sunt puse în anexa numărul 7.

Asemănător formularului pentru modificarea contractelor de muncă, este realizat și formularul pentru modificarea datelor generale despre angajați („FrmModifDateAng”). Textbox-urile cu datele angajaților sunt implicit dezactivate și pot fi activate și editate cu ajutorul butonului .

La fel ca în cazul ultimelor doua formulare prezentate, se folosește câte un BindingNavigator și un BindingSource pentru a putea vizualiza datele tuturor angajaților. După efectuarea modificărilor dorite, se apasă butonul pentru a salva modificările în baza de date. Următoarele doua imagini prezintă formularul în timpul execuției. Prima afișează formularul înainte de acționarea butonului ce permite editarea, iar cea de a doua ne afișează formularul în urma acționării butonului pentru salvarea modificărilor efectuate.

Figura 35. Formularul „FrmModifDateAng” la rularea aplicației

Figura 36. Formularul „FrmModifDateAng” în urma salvării modificărilor

Pentru a verifica dacă valorile introduse pentru câmpurile câmpurile nu conțin alte caractere înafara valorilor numerice se utilizeaza funcția „verificare_numeric”, aceasta fiind apelată la modificarea valorii din textbox-ul aferent fiecărui câmp.

private void verificare_numeric(string a, string numeob)

{ if (!a.All(char.IsDigit) && a.Length > 0)

switch (numeob)

{ case "Telefon":

MessageBox.Show("Ati introdus cel putin un caracter in campul pentru telefon", "Eroare", MessageBoxButtons.OK, MessageBoxIcon.Error); break;

case "CNP":

MessageBox.Show("Ati introdus cel putin un caracter in campul pentru CNP", "Eroare", MessageBoxButtons.OK, MessageBoxIcon.Error); break;

case "copii":

MessageBox.Show("Ati introdus cel putin un caracter in campul pentru copii", "Eroare", MessageBoxButtons.OK, MessageBoxIcon.Error); break;

case "cartemunca":

MessageBox.Show("Ati introdus cel putin un caracter in campul pentru numarul cartii de munca", "Eroare", MessageBoxButtons.OK, MessageBoxIcon.Error); break;

}

}

private void txtCNP_TextChanged(object sender, EventArgs e)

{verificare_numeric(txtCNP.Text, "CNP"); }

//asemănător se face verificarea si pentru celelelalte TextBox-uri cu date numerice.

}

Pentru a se întocmi prezența salariaților este nevoie de accesarea formularului „FrmIntocmirePrezanta”. Pentru a afișa și încărca datele angajaților și câmpurile necesare întocmirii prezenței, s-a utilizat controlul DataGridView.

S-au creat trei câmpuri pentru anul, luna și ziua pentru care se dorește întocmirea prezenței, aceasta fiind întocmită zilnic. Câmpul pentru valoarea anului este creat cu ajutorul unui TextBox, pentru alegerea lunii este folosit un ComboBox, iar pentru selectarea zilei este folosit un control de tip DomainUpDown. De asemenea, s-au prevăzut trei butoane: cel pentru salvarea prezenței în baza de date, cel pentru renunțarea la întocmirea prezenței și butonul pentru revenirea la meniul principal. Butonul de renunțare va seta toate valorile pe 0. Pentru salvarea prezenței se apelează interogări de tip UPDATE.

Afișarea formularului atunci când aplicația este în execuție se face cu ajutorul următoarei figuri. Figura va prezenta formularul la momentul salvării prezenței.

Figura 37. Formularul „FrmIntocmirePrezenta” în modul de excuție după salvarea prezenței

S-a creat o procedură de verificare a datelor introduse de către utilizator atunci când se întocmește prezența. Cu ajutorul procedurii se încearcă evitarea introducerii unor date eronate, care vor duce la calcularea greșită a salariilor.Codul aferent acestei proceduri este:

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)

{ String headerText = dataGridView1.Columns[e.ColumnIndex].HeaderText;

if (headerText.Equals("Ore lucrate") && (String.IsNullOrEmpty(e.FormattedValue.ToString()) || !Information.IsNumeric(e.FormattedValue.ToString())))

{ MessageBox.Show("Numarul de ore lucrate introdus este eronat", "Numar de ore lucrate", MessageBoxButtons.OK, MessageBoxIcon.Error);

e.Cancel = true;

}

if (headerText.Equals("Ore suplimentare") && (String.IsNullOrEmpty(e.FormattedValue.ToString()) || !Information.IsNumeric(e.FormattedValue.ToString())))

{ MessageBox.Show("Numarul de ore suplimentare introdus este eronat", "Numar de ore lucrate", MessageBoxButtons.OK, MessageBoxIcon.Error);

e.Cancel = true;

}

if (headerText.Equals("Invoit") && (String.IsNullOrEmpty(e.FormattedValue.ToString()) || !Information.IsNumeric(e.FormattedValue.ToString())))

{ MessageBox.Show("Numarul de ore invoite introdus este eronat", "Numar de ore lucrate", MessageBoxButtons.OK, MessageBoxIcon.Error);

e.Cancel = true;

}

if (headerText.Equals("Nemotivat") && (String.IsNullOrEmpty(e.FormattedValue.ToString()) || !Information.IsNumeric(e.FormattedValue.ToString())))

{ MessageBox.Show("Numarul de ore lucrate introdus este eronat", "Numar de ore lucrate", MessageBoxButtons.OK, MessageBoxIcon.Error);

e.Cancel = true;

}

if (headerText.Equals("Obligatii cetatenesti") && (String.IsNullOrEmpty(e.FormattedValue.ToString()) || !Information.IsNumeric(e.FormattedValue.ToString())))

{ MessageBox.Show("Numarul de ore lucrate introdus este eronat", "Numar de ore lucrate", MessageBoxButtons.OK, MessageBoxIcon.Error);

e.Cancel = true;

}

}

Câmpurile pentru contractul, numele, prenumele și CNP-ul angajaților ajută la ușurarea căutării unui anumit angajat, sau a unei categorii de angajat prin scrierea într-unul sau mai multe dintre TextBox-uri a datelor angajaților. Practic, este un filtru de căutare. De exemplu se pot cauta angajații cu CNP-ul având prima cifră ca fiind 1. În imaginea următoare se poate vizualiza exemplul în timpul execuției.

Figura 38. Formularul “FrmIntocmirePrezenta” afișând angajații cu prima cifră a CNP-ul fiind cifra 1

Acest mod de afișare este posibil datorită funției afisare(). Codul pentru această funcție se află la anexa 8.

Datorită faptului că firma Ciclop SRL face plata salariului în doua tranșe, s-a creat opțiunea pentru calcularea avansurilor. Formularul pentru această operațiune este „FrmCalcAvansuri”.

Pentru a putea calcula avansul, trebuie mai întâi indicate anul și luna pentru care se dorește efectuarea calculului. Va fi afișat într-un control de tip TextBox numărul de zile lucrătoare ale lunii alese. Într-un DataGridView se vor încărca angajații în ordine alfabetică și numărul de zile lucrate de aceștia în primele 15 zile ale lunii respective.

Și în cadrul acestui formular există eticheta cu textul „Luna inchisa". Astfel se aduce la cunoștiință utilizatorului că pentru luna pe care o vizualizează s-a efectuat deja plata salariului. Odată ce o lună este inchisă nu se mai pot aduce modificări asupra bazei de date cu referire la prezență, calculul avansurilor sau calculul salariilor.

Butonul „Calcul avansuri” este cel care la evenimentul click permite efectuarea calculului necesar avansurilor și înregistrarea acestora în tabela „retineri”, respectiv afișarea în coloana „Avans” a DataGridView-ului. Această operațiune poate fi vizualizată în figura 39.

Figura 39. Calcularea avansurilor

Codul necesar pentru evenimentul click al butonului „Calcul avansuri” este vizibil la anexa 9.

Pentru calculul salariilor, s-a creat formularul “FrmCalcSalarii”, în cadrul căreia este existent de asemenea eticheta cu textul "Luna inchisa". Eticheta va deveni vizibilă după ce este apăsat butonul „Inchidere luna".

Cu ajutorul codului se vor încărca date pentru luna curentă în DataGridView, odata cu încărcarea formularului la rulare. După selectarea anului și a lunii dorite se apasă butonul „Calcul salarii”, astfel fiind înregistrate în baza de date, dar și în coloana corespunzătoare din cadrul DataGridView-ului. Datele angajaților vor apărea în DataGridView conform următoarelor două figuri, care trebuie private ca fiind una în continuarea celeilalte, deoarece a fost nevoie de glisarea cursorului pe orizontală pentru a vizualiza toate coloanele.

Figura 40. Prima parte a formularului “FrmCalcSalarii” la rulare

Figura 41. A doua parte a formularului “FrmCalcSalarii” la rulare

După cum se poate vedea în figura anterioară coloana “Rata CAR” mai trebuie a fi completată și apăsat butonul Calcul salarii pentru calculul necesar salariilor, care va fi afișat în coloana „Rest de plata” și salvat în tabela “retineri”.

Pentru calcularea salariilor fără a se completa coloana “Rata CAR” va apărea un mesaj, precum cel din figura 42.

Figura 42. Calculare salariilor fără completarea coloanei “Rata CAR”

După apăsare butonului OK, se vor calcula salariile și vor fi afișate în coloana „Rest de plata”, precum în următoarea imagine.

Figura 43. Afișarea salariilor în cadrul formularului “FrmCalcSalarii”

Pentru calculul salariilor sunt necesare mai multe proceduri: pentru calculul deducerilor în funcție de numărul de copii al angajatului, pentru determinarea procentului de fidelitate și al procentului de vechime. Funcțiile aferente sunt denumite: deducere, procent_fidelitate și procent_vechime.

Codul pentru funcționarea procedurilor este următorul:

private double deducere(double salariu, int nrcopii)

{ double ded;

if (salariu <= 1500)

{

switch (nrcopii)

{

case 0:

ded = 0; break;

case 1:

ded = 400; break;

case 2:

ded = 500; break;

case 3:

ded = 600; break;

default:

ded = 800; break;

}

}

else if ((salariu <= 3000) && (salariu > 1500))

{ switch (nrcopii)

{

case 0:

ded = (300 * (1 – (salariu – 1500) / 1500)); break;

case 1:

ded = (400 * (1 – (salariu – 1500) / 1500)); break;

case 2:

ded = (500 * (1 – (salariu – 1500) / 1500)); break;

case 3:

ded = (600 * (1 – (salariu – 1500) / 1500)); break;

default:

ded = (800 * (1 – (salariu – 1500) / 1500)); break;

}

}

else

ded = 0;

return ded;

}

private int procent_fidelitate()

{return 0; //deoarece compania nu ofera un spor pentru fidelitate }

private int procent_vechime(DateTime data_angajare)

{ DateTime data_curenta = new DateTime();

int ani;

data_curenta = DateTime.Now;

ani = data_curenta.Year – data_angajare.Year;

if (data_curenta.Month < data_angajare.Month)

ani -= 1;

else

if ((data_curenta.Month == data_angajare.Month) && (data_curenta.Day < data_angajare.Day))

ani -= 1;

if (ani != 0)

{

if (procentevDS.Tables["procentev"].Rows.Count > 0)

{ DataRow dr = procentevDS.Tables["procentev"].Rows[0];

if (ani < Convert.ToInt32(dr.ItemArray.GetValue(0)))

return 0;

else

{ DataRow dx = procentevDS.Tables["procentev"].Rows[procentevDS.Tables["procentev"].Rows.Count – 1];

if (ani >= Convert.ToInt32(dx.ItemArray.GetValue(0)))

return Convert.ToInt32(dx.ItemArray.GetValue(1));

else

{ int aux = 0;

for (int i = 0; i < procentevDS.Tables["procentev"].Rows.Count – 2; i++)

{DataRow di = procentevDS.Tables["procentev"].Rows[i];

DataRow dii = procentevDS.Tables["procentev"].Rows[i + 1];

if (ani >= Convert.ToInt32(di.ItemArray.GetValue(0)) && ani < Convert.ToInt32 (dii.ItemArray.GetValue(0)))

{ aux = i;

break; }

}

DataRow daux = procentevDS.Tables["procentev"].Rows[aux];

return Convert.ToInt32(daux.ItemArray.GetValue(1));

}

}

}

else return 0;

}

else return 0;

}

Parametrii de calcul al salariilor se pot modifica odată cu modificarea legislației cu privire la aceștia. Astfel s-a creat formularul „FrmModifParametrii”, în cadrul căruia se pot modifica parametrii pentru calculul salariilor, în caz de nevoie. La încărcarea acestui formular se încarcă valorile standard salvate în tabela „procente”. Salvarea modificării valorilor parametrilor se face apăsând butonul „Salvare parametri calcul”. Formularul poate fi observant mai jos, în figura cu numărul 44.

Codul pentru salvarea parametrilor este următorul:

private void Button1_Click(object sender, EventArgs e)

{ if (f1.con != null && f1.con.State == ConnectionState.Closed)

f1.con.Open();

OleDbCommand comanda = new OleDbCommand();

comanda.Connection = f1.con;

comanda.CommandText = "UPDATE procente SET procente.valoare=" + Cotxt.Text.Replace(",", ".").ToString() + " WHERE ID=1";

comanda.ExecuteNonQuery();

comanda.CommandText = "UPDATE procente SET procente.valoare=" + Cbtxt.Text.Replace(",", ".").ToString() + " WHERE ID=2";

comanda.ExecuteNonQuery();

(…)

comanda.CommandText = "UPDATE procente SET procente.valoare=" + Impozittxt.Text.Replace(",", ".").ToString() + " WHERE ID=11";

comanda.ExecuteNonQuery();

MessageBox.Show("Parametrii de calcul au fost modificati", "Parametri calcul", MessageBoxButtons.OK, MessageBoxIcon.Information);

Figura 44. Formularul „FrmModifParametrii”

Rapoartele sistemului

Meniul „Rapoarte” conține opțiuni pentru cele cinci rapoarte ale sistemului, și anume: „Stat de plat”, „Lista avansuri”, „Fluturas avans”, „Fluturas salariu”, și „Centralizator salarii pe functii”. Toate acestea rapoarte pot fi exportate Excel, PDF sau Word. De asemenea, există posibilitatea ca acestea să fie printate.

Pentru a vizualiza statul de plata al salariilor se folosește formularul „FrmStatPlata”. Aceasta permite selectarea anului și lunii dorite printr-un control de tip TextBox pentru an și printr-un control de tip ComboBox pentru selectarea lunii. Se afișează la apăsarea butonului „Vizualizare” o situație pe domenii, și în cadrul aceluiași domeniu se afișează în ordine alfabetică după nume angajațiii cu avansurile și restul de plată calculate. Figurile următoare afișează formularul la rulare, acestea reprezentând formularul una în continuarea celeilalte.

Figura 45. Prima parte a formularului „FrmStatPlata” în timpul execuției

Figura 46. A doua parte a formularului „FrmStatPlata” în timpul execuției

Raportul conține câmpuri din mai multe tabele ale bazei de date, bazându-se pe setul de date „DataSetStatPlata”, vizibil în figura 47, având ca parametri luna și anul pentru care se face statul de plată.

Fișierul .rdlc creat ca sursă de date pentru controlul ReportViewer din formular este Report1.rdlc. În cadrul acestuia se observă faptul că s-a creat o grupare a înregistrărilor după câmpul domeniu și s-au calculat sume pe aceste grupuri pentru toate coloanele numerice.

Figura 47. Setul de date “DataSetStatPlata”

Codul aferent formularului “FrmStatPlata” este:

namespace Salarii

{ public partial class FrmStatPlata : Form

{ public FrmStatPlata()

{ InitializeComponent(); }

Form1 f1 = new Form1();

int an;

private void FrmStatPlata_Load(object sender, EventArgs e)

{ txtAn.Text = DateTime.Now.Year.ToString();

cboLuna.SelectedIndex = DateTime.Now.Month – 1;

this.AcceptButton = Button1;

}

private void btnRev_Click(object sender, EventArgs e)

{ Close();

f1.Visible = true;

}

private void Button1_Click(object sender, EventArgs e)

{ if (!txtAn.Text.All(char.IsDigit))

an = 0;

else

an = Convert.ToInt32(txtAn.Text);

this.DataTable1TableAdapter.Fill(this.DataSetStatPlata.DataTable1, cboLuna.SelectedIndex + 1, an);

ReportParameter param = new ReportParameter("ReportParameter1", cboLuna.Text + " " + txtAn.Text);

reportViewer1.LocalReport.SetParameters(param);

this.reportViewer1.RefreshReport();

}

Codul pentru evenimentul click al butonului de vizualizare este asemănător și în cazul celorlalte rapoarte.

Pentru opțiunea de meniu „Lista avansuri” se afișează forma „FrmAvansuri” din figura 48. Aceasta permite, de asemenea, selectarea anului și lunii dorite și afișează după apăsarea butonului „Vizualizare”, într-un control ReportViewer, o situație în ordine alfabetică cu datele angajaților și avansurile calculate pentru aceștia, situație ce poate fi exportată în Excel, PDF sau Word. La fel ca în cazul statului de plată, raportul se face pe baza unui set de date, având ca parametri anul și luna. Setul de date utilizat este „DataSetAvansuri”, vizibil în figura 49.

Figura 48. Formularul „FrmAvansuri” la rulare

Fișierul .rdlc creat ca sursă pentru controlul ReportViewer din cadrul formularului este Report1.rdlc, vizibil în figura cu formularul la rulare.

Figura 49. Setul de date „DataSetAvansuri”

Pentru întocmirea fluturașilor pentru avansuri se folosește formularul „FrmFlAvans” din figura 50. Acesta este asemănător cu formularul pentru lista avansuri, permițând selectarea anului și lunii dorite și afișează într-un control ReportViewer o situație alfabetică a angajaților cu avansurile calculate. Raportul afișat este identic cu cel de la opțiunea „Lista Avansuri”, doar formatat ca niște fluturași.

Fișierul .rdlc existent ca sursă pentru controlul ReportViewer este RapAv.rdlc, iar setul de date este același set de date utilizat pentru lista avansurilor.

Figura 50. Formularul pentru afișarea fluturașilor de avans pentru

Pentru opțiunea de meniu Fluturas Salariu se afișează fereastra „FrmFlSalari” din figura 51. La fel ca în cazul statului de plată, pentru a vizualiza fluturașii se permite selectarea anului și lunii, iar la click pe butonul „Vizualizare” se vor putea vedea într-un control ReportViewer o succesiune de fluturași ordonați alfabetic după numele angajaților. Fluturașii pot fi din nou exportați în Excel, PDF sau Word. Fișierul de tipul rdlc utilizat este Report6.rdlc. DataSet-ul utilizat este același ca în cazul statului de plată, dar afișarea se face sub formă de fluturași.

Figura 51. Formularul pentru afișarea fluturașilor de salariu

Multitudinea câmpurilor din fluturașii de salariu poate fi observată în imaginile următoare:

Figura 52. Raportul Report6.rdlc (1) Figura 53. Raportul Report6.rdlc (2)

Ultimul raport este un centralizator al salariilor. Acesta este accesat cu ajutorul formularului „FrmCentralizator” (figura 54). Acesta afișează salariile angajaților în ordine alfabetică, în funcție de domeniu. La fel ca în cazul celorlalte rapoarte, se vor selecta mai întâi anul și luna, iar apoi se va apăsa butonul de vizualizare.

Fișierul .rdlc utilizat pentru controlul RaportViewer este Report3.rdlc, iar setul de date utilizat este același DataSet utilizat în cazul statului de plată și a fluturașilor pentru salarii.

Figura 54. Formularul „FrmCentralizator” la rulare pentru luna mai

Securitatea sistemului

Pentru partea de securitate a programului, s-a creat un formular pentru autentificarea în cadrul aplicației. Autentificarea se face cu ajutorul unui nume și o parolă de utilizator. În cadrul formularului „FrmLogin” au fost introduse două controale de tip TextBox în care utilizatorul poate introduce numele și parola, iar apoi va apăsa butonul „Autentificare” pentru a putea accesa programul. Numele și parola trebuie să coincidă cu numele și parola înregistrată în tabela “useri” din baza de date. Pentru ca fiecare formular să cunoască utilizatorul s-a creat o clasă global, codul acesteia fiind:

class GlobalVar

{ public static string u;

public static string p; }

Unde „u” reține utilizatorul, iar „p” reține parola utilizatorului. De asemenea, utilizatorul trebuie reținut pentru pentru a putea fi înregistrat în cadrul registrului de operații efectuate de acesta.

În următoare imagine poate fi vizualizat formularul “FrmLogin”.

Figura 55. formularul “FrmLogin”

Codul aferent butonului de autentificare pentru a fi inregistrată autentificarea în registrul de operații este:

OleDbCommand cmd2 = new OleDbCommand();

cmd2.Connection = f1.con;

cmd2.CommandText = "INSERT INTO loguri(data, ora, utilizator, buton, operatia) VALUES (:data, :timp, :utilizator, :buton, :operatia)";

cmd2.Parameters.AddWithValue(":data", String.Format("{0:dd/MM/yyyy}", data));

cmd2.Parameters.AddWithValue(":timp", String.Format("{0:HH:mm:ss}", data));

cmd2.Parameters.AddWithValue(":utilizator", GlobalVar.u);

cmd2.Parameters.AddWithValue(":buton", btnLogare.Text);

cmd2.Parameters.AddWithValue(":operatia", "logare");

cmd2.ExecuteNonQuery();

Codul pentru înregistrarea operației în registrul de operații se va adăuga tuturor butoanelor utilizate la execuția unei operații importante. Se va schimba de fiecare dată denumirea butonului și al operației efectuate.

Deoarece cele trei tipuri de utilizatori pot accesa opțiuni diferite ale aplicației, s-a introdus următorul cod în cadrul încărcării formularului cu meniul principal:

private void Form1_Load(object sender, EventArgs e)

{ if (GlobalVar.u == "user2")

{

pontajeSiCalculSalariiToolStripMenuItem.Visible = false;

rapoarteToolStripMenuItem.Visible = false;

utilizatoriSiParoleToolStripMenuItem.Visible = false;

}

if (GlobalVar.u == "user1")

{utilizatoriSiParoleToolStripMenuItem.Visible = false;

}

}

Nu s-a prevăzut nicio instrucțiune pentru utilizatorul „admin” deoarece administratorul are acces la toată aplicația. Acesta poate vizualiza și formularul pentru schimbarea numelor și parolelor, dar și să vizualizeze registrul de operații.

În figura următoare poate fi vizualizat formularul „FrmModifParole”.

Figura 56. Formularul „FrmModifParole”

Se folosește un BindingNavigator și un BindingSource pentru a putea naviga printre cele trei tipuri de utilizatori. Butonul oferă posibilitatea de a modifica datele utilizatorilor, iar butonul salvează modificările efectuate. Codul aferent butonului pentru salvarea modificării numelui și/sau a parolei utilizatorilor este:

private void salvare_Click(object sender, EventArgs e)

{ OleDbCommand com = new OleDbCommand();

com.Connection = f1.con;

if (f1.con != null && f1.con.State == ConnectionState.Closed)

f1.con.Open();

int rand_curent = Convert.ToInt32(bindingNavigatorPositionItem.Text);

if (txtNume.Text == "" || txtParola.Text == "" )

MessageBox.Show("Nu ati introdus toate campurile obligatorii", "Lipsa date", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

if (editare.Enabled.Equals(false))

{

bool gasit = false;

DataRow dRow;

for (int i = 0; i <= userDS.Tables["useri"].Rows.Count – 1; i++)

if (i != (rand_curent – 1))

{ dRow = userDS.Tables["useri"].Rows[i];

if (txtNume.Text == dRow.ItemArray.GetValue(0).ToString())

{ gasit = true;

break;

}

}

if (gasit == true)

{ MessageBox.Show("Numele introdus apartine altui utilizator", "Eroare", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

return;

}

else

{ try

{com.CommandText = "UPDATE useri SET nume='" + txtNume.Text + "', parola='" + txtParola.Text + "' WHERE nume='" + nume_vechi + "'";

com.ExecuteNonQuery();

MessageBox.Show("Parola si/sau numele au fost schimbate!", "Parametri calcul", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

catch (Exception ex)

{ MessageBox.Show(ex.Message + " " + com.CommandText, "Eroare2", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

}

Formularul accesat pentru vizualizarea registrului de operații este „FrmRegistruOp”. Formularul conține două câmpuri pentru introducerea celor două date care indică perioada pentru care se dorește a se vizualiza operațiile efectuate. Pentru afișarea registrului de operații se utilizează controlul RaportViewer, afișarea datelor din registru efectuându-se în urma stabilirii celor două date calendaristice necesare și apăsarea butonului „Vizualizare”.

Raportul conține câmpurile din tabela „loguri”. S-a creat un fișier de tip rdlc care este sursa pentru RaportViewer-ul din cadrul formularului, iar DataSet-ul necesare funcționării raportului este următorul:

Figura 57. Setul de date “DataSetRegistru”

Codul aferent vizualizării raportului încărcat cu datele din registrul de operații pentru o anumită perioadă este următorul:

private void Button1_Click(object sender, EventArgs e)

{ this.loguriTableAdapter.Fill(this.DataSetRegistru.loguri, txtData.Text, textBox1.Text);

ReportParameter param = new ReportParameter("ReportParameter1", txtData.Text);

reportViewer1.LocalReport.SetParameters(param);

ReportParameter i = new ReportParameter("ReportParameter2", textBox1.Text );

reportViewer1.LocalReport.SetParameters(i);

this.reportViewer1.RefreshReport(); }

În cele din urmă formularul “FrmRegistruOp” în timpul execuției, după stabilirea datelor și acționarea butonului pentru vizualizare, arată în felul următor:

Figura 58. Formularul “FrmRegistruOp” în timpul execuției

Concluzii

Toate cele prezentate anterior pot fi considerate argumente pentru faptul că această lucrare tratează o tematică modern, iar programul software creat și prezentat în cadrul studiului de caz poate fi implementată în compania Ciclop.SRL sau orice altă companie care întocmește salariile în funcție de prezența angajaților la locul de muncă și care acordă salariile în două tranșe. Un avantaj fiind si faptul că aplicația este ușor de adaptat în cadrul arhitecturii informatice ale companiei. Spre exemplu, în cazul nevoii de creștere a bazei de date în dimensiune, se poate face ușor un upgrade la MySQL, Oracle sau Microsoft SQL Server. Aplicația va avea modificări foarte mici în ceea ce privește adaptarea codului acesteia.

Se poate spune că alegerea de a dezvolta o aplicație pentru salarizare prin tehnologia .NET Framework este un succes, în condițiile în care mediul de programare Visual Studio.NET este un editor pentru codul sursă foarte simplu de utilizat și performant. ADO.NET este un alt element important, aplicație pentru calcularea salariilor neputând fi creată fără conexiune la o bază de date. Din punct de vedere legal, datele ce țin de salariile plătite angajaților trebuie arhivate, această operațiune putând fi efectuată cu ajutorul bazei de date și a rapoartelor întocmite cu ajutorul aplicației.

Compania are de câștigat de pe urma utilizării unei astfel de aplicații, deoarece timpul alocat pentru calculul salariilor, dar și pentru întocmirea prezenței, a pontajelor este mult redus. Contractele și datele angajaților sunt ușor de înregistrat, dar și modificarea unor date se face rapid, putând ajunge ușor la angajatul pentru care se dorește modificarea datelor. De asemenea, rapoartele ajută în procesul de salarizare, aplicația oferind posibilitatea salvării acestora în format Excel, PDF sau Word, sau aceste pot fi listate, mai ales în cazul fluturașilor fiind important ca aceștia să poate fi listați și oferiți angajaților. Centralizatorul salariilor pe domenii este util în luarea unor decizii, deoarece oferă o imagine de ansamblu al cheltuielilor cu salariile datorate angajaților. Necesarul de persoane angajate pentru a întocmi prezența, a face calculele pentru avansuri și salarii, a pregătii situațiile necesare achitării drepturilor angajaților la salariu va fi redus la minim. În acest mod, se poate spune că firma va avea de câștigat prin efectuarea unor economii atât legate de timp, dar și de cheltuieli.

Alegerea creării acestei aplicații cu ajutorul limbajului de programare C# nu aduce un avantaj considerabil în comparație cu alte limbaje, dar nici nu prezintă vreun dezavantaj. Acest fapt se datorează faptului că tehnologia .NET presupune o biblitecă comună de clase pentru toate limbajele de programare. De aceea, daca la un moment dat se va dori trecerea aplicației într-un alt limbaj, acest lucru va putea fi ușor de realizat de către un programator. Totusi, un posibil avantaj al limbajului C# ar putea fi faptul că este un limbaj nou, creat special pentru dezvoltarea platformei .NET. Este un limbaj ușor, neavând o multitudine prea mare de cuvinte cheie.

Programarea vizuală cu ajutorul C# și Visual Studio este facilă, părți ale codului fiind dezvoltate automat, iar ferestrele aplicației se pot crea prin drag-and-drop. Se oferă posibilitatea personalizării aplicației în funcție de preferințele utilizatorilor, dar și în funcție de estetică. Astfel, în programul informatic ce face subiectul acestei lucrări s-au folosit nuanțe de albastru, această culoare fiind caracteristică firmei Ciclop.SRL, s-a afișat în cadrul situațiilor de ieșire sigla companiei. Pe fereastra de autentificare a fost introdusă o imagine cu mascot firmei, iar pe fereastra meniului principal a fost expusă o fotografie cu sediul Ciclop. Pentru a fi ușor utilizatorilor să identifice semnificația butoanelor, pe langă titlul butonului, s-a afișat câte o iconiță reprezentativă butonului.

În urma testării aplicației cu date fictive, va urma ca în primă fază aceasta să fie implementată în cadrul firmei pentru a fi testată de persoanele desemnate de firmă pentru calcularea salariilor. Doar utilizatorii efectivi ai aplicației, cei care vor opera calculele cu ajutorul aplicației pot depista bug-urile sau greșelile legate de calculele, parametrii sau procentele utilizate de aplicație pentru a da ca situație finală o situatie a salariilor. Odată depistate eventualele erori, acestea poti fi corectate prin colaborarea dintre utilizatori și dezvoltatorul software.

De asemenea, pe viitor pot fi aduse noi opțiuni aplicației sau pot fi îmbunătățite cele existente. Acestea se vor face odată cu dezvoltarea companiei, cu schimbarea politicii de salarizare aplicată, sau cu schimbarea legislației în vigoare. Se pot crea de asemenea, la cererea utilizatorilor, noi rapoarte care să ajute la luarea unor decizii în legătură cu salarizarea angajaților.

Se poate afirma că alegerea acestei soluții pentru efectuarea și pregătirea salarizării este una optimă pentru compania Ciclop. Dezvoltarea aplicației cu ajutorul platformei .NET Framework este una de viitor deoarece Microsoft urmărește ca toate tehnologiile sale viitoare să se bazeze pe .NET, Runtime.NET dorindu-se a fi integrat în toate sistemele de operare. Pe scurt, dacă se dorește dezvoltarea cu ajutorul tehnologiilor de programare ale Microsoft-ului, .NET este singura și optima opțiune.

Bibliografie

J. Richter, Applied Microsoft .NET Framework Programming

L. O’Brien, B. Eckel, Thinking in C#

Smeureanu, M. Dârdală, A. Reveiu, Visual C# .NET

W. Doberenz, T. Gewinnus, Visual Basic 2012 – Grundlagen und Profiwissen

C. Petzold, Programming Microsoft Windows with C#

T. Patrick, Microsoft ADO.NET 4 Step by Step,

D. Mertins, J. Neumann, SQL Server 2012: Das Programmierhandbuch. Inkl. ADO.NET 4.0 Entity Framework,

P. D. Sheriff, Fundamentals of ADO.NET

N. Dumitru-Lupan, R. Pintea, A. Niță, M. Niță, C. Sichiu, N. Olăroiu, M. Tătăran, P. Jucovschi, T. Salomie, Introducere în programarea .Net Framework

B. Hamilton, ADO.NET 3.5 Cookbook

C. Gălățan, S. Gălățan, C# pentru elevi – Programare în Visual C# 2008 Express Edition

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

http:// vb.net-informations.com/framework/what_is_net_framework.htm

http:// blog.zeltera.eu/?p=1634

http://vb.net-informations.com/framework/just_in_time_compiler.htm

http://vb.net-informations.com/language/vb.net_data_types.htm

https://biblioteca.regielive.ro/cursuri/limbaje-de-programare/programarea-aplicatiilor-windows-in-net-framework-101615.html

http://ase.softmentor.ro/POO/IntroducereInCSharp.htm

http:// www.rasfoiesc.com/educatie/informatica/Obiectele-ADONet36.php

http://asp.net-informations.com/ado.net/ado-architecture.htm

http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate3/EN/html/devnet/adonetov_xml.html

http://legestart.ro/statul-de-salarii-ce-trebuie-sa-stim-despre-acest-document-financiar-contabil/

http://claudiubrandas.ro/index.php?page=studcourses&curs=asi

http://claudiubrandas.ro/index.php?page=studcourses&curs=psiie

Anexe

Anexa 1.

Anexa 1. Inventarul documentelor

Anexa 2.

Anexa 2. Flowchart-ul sistemului informațional pentru activitatea de salarizare

Anexa 3.

Anexa 3. Diagrama Entitate-Relație

Anexa 4.

Anexa 4. Structura interfeței cu utilizatorul

Anexa 5.

Submeniurile „Pontaje si calcul salarii”, „Rapoarte” și „Securitate”:

Anexa 5.1. Meniul principal cu submeniul “Pontaje si calcul salarii”

Anexa 5.2. Meniul principal cu submeniul “Rapoarte”

Anexa 5.3. Meniul principal cu submeniul “Securitate”

Anexa 6.

Codul aferent evenimentului click al butonului pentru încheierea contractelor:

private void btnIncheiereContract_Click(object sender, EventArgs e)

{ OleDbCommand comanda;

comanda = new OleDbCommand();

comanda.Connection = f1.con;

if (f1.con != null && f1.con.State == ConnectionState.Closed)

f1.con.Open();

try

{ bool gasit = false;

DataRow dRow;

for (int i = 0; i <= AngajatiDS.Tables["angajati"].Rows.Count – 1; i++)

{ dRow = AngajatiDS.Tables["angajati"].Rows[i];

if (txtCNP.Text == dRow.ItemArray.GetValue(0).ToString())

{ gasit = true;

break;

}

}

//introduc noul contract in baza de date

if (gasit == false)

{ comanda.CommandText = "INSERT INTO angajati VALUES ('" + txtCNP.Text + "','" + txtNume.Text + "','" + txtPrenume.Text + "','" + txtAdresa.Text + "','" + txtTelefon.Text + "'," + txtNrCopii.Text + "," + comboBox2.SelectedValue.ToString() + ",'" + dateTimePicker2.Value.ToShortDateString() + "'," + txtSalariu.Text + ",'" + dateTimePicker1.Value.ToShortDateString() + "'," + txtProcentSporConducere.Text + "," + txtProcentOreSuplim.Text + ")";

comanda.ExecuteNonQuery();

}

else

{ comanda.CommandText = "UPDATE angajati SET Functia = " + comboBox2.SelectedValue.ToString() + ", Sal_incadrare=" + txtSalariu.Text + ", data_angajare='" + dateTimePicker1.Value.ToShortDateString() + "',spor_conducere=" + txtProcentSporConducere.Text + ",ore_suplimentare= " + txtProcentOreSuplim.Text + " WHERE CNP='" + txtCNP.Text + "'";

comanda.ExecuteNonQuery();

}

}

catch

{ MessageBox.Show("Nu ati introdus toate campurile obligatorii", "Lipsa date", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }

try

{ //daca este angajat pe perioada limitata

if (txtDurataAng.Enabled.Equals(true)) {

comanda.CommandText = "INSERT INTO contracte VALUES ('" + txtNrContract.Text + "','" + txtCNP.Text + "','" + txtNrCarte.Text + "'," + comboBox1.SelectedValue.ToString() + "," + txtDurataAng.Text + "," + comboBox2.SelectedValue.ToString() + ",'" + dateTimePicker1.Value.ToShortDateString() + "'," + txtSalariu.Text + "," + txtNrOre.Text + "," + txtNrZileConcediu.Text + "," + txtZiPlata.Text + ",0)";

comanda.ExecuteNonQuery();

}

else //daca este angajat pe perioada nedeterminata

{comanda.CommandText = "INSERT INTO contracte (NR_contract,CNP,Nr_carte_munca,tip_angajare,functia,data_angajare,sal_incadrare,nr_ore_zi,nr_zile_concediu,zi_plata,anulat) VALUES ('" + txtNrContract.Text + "','" + txtCNP.Text + "','" + txtNrCarte.Text + "'," + comboBox1.SelectedValue.ToString() + "," + comboBox2.SelectedValue.ToString() + ",'" + dateTimePicker2.Value.ToShortDateString() + "'," + txtSalariu.Text + "," + txtNrOre.Text + "," + txtNrZileConcediu.Text + "," + txtZiPlata.Text + ",0)";

comanda.ExecuteNonQuery();

}

MessageBox.Show("Contractul a fost incheiat", "Incheiere contract", MessageBoxButtons.OK, MessageBoxIcon.Information);

FrmIncheiereContract_Load(sender, e);

resetare();

}

catch

{ MessageBox.Show("Nu ati introdus toate datele necesare!!", "Incheiere contract", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

Anexa 7.

Codul aferent salvării modificărilor efectuate asupra unui contract:

private void btnSalvare_Click(object sender, EventArgs e)

{ OleDbCommand comanda = new OleDbCommand();

comanda.Connection = f1.con;

if (f1.con != null && f1.con.State == ConnectionState.Closed)

f1.con.Open();

try

{ if (txtDurataAng.Enabled.Equals(true))

{comanda.CommandText = "UPDATE contracte SET Nr_carte_munca='" + txtNrCarte.Text + "', tip_angajare=" + comboBox1.SelectedValue.ToString() + ", durata=" + txtDurataAng.Text + ", functia=" + comboBox2.SelectedValue.ToString() + ", data_angajare='" + dateTimePicker2.Value.ToShortDateString() + "', sal_incadrare=" + txtSalariu.Text + ", nr_ore_zi=" + txtNrOre.Text + ", nr_zile_concediu=" + txtNrZileConcediu.Text + ", zi_plata=" + txtZiPlata.Text + " WHERE NR_contract='" + txtNrContract.Text + "';";

comanda.ExecuteNonQuery();

}

else

{comanda.CommandText = "UPDATE contracte SET Nr_carte_munca='" + txtNrCarte.Text + "', tip_angajare=" + comboBox1.SelectedValue.ToString() + ", functia=" + comboBox2.SelectedValue.ToString() + ", data_angajare='" + dateTimePicker2.Value.ToShortDateString() + "', sal_incadrare=" + txtSalariu.Text + ", nr_ore_zi=" + txtNrOre.Text + ", nr_zile_concediu=" + txtNrZileConcediu.Text + ", zi_plata=" + txtZiPlata.Text + " WHERE NR_contract='" + txtNrContract.Text + "';";

comanda.ExecuteNonQuery();

}

}

catch (Exception ex)

{ MessageBox.Show(ex.Message + " " + comanda.CommandText, "Eroare1", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

try

{ comanda.CommandText = "UPDATE angajati SET functia=" + comboBox2.SelectedValue.ToString() + ", data_angajare='" + dateTimePicker2.Value.ToShortDateString() + "', sal_incadrare=" + txtSalariu.Text + ", spor_conducere=" + txtProcentSporConducere.Text + ", ore_suplimentare=" + txtProcentOreSuplim.Text + " WHERE CNP='" + txtCNP.Text + "'";

comanda.ExecuteNonQuery();

editare_capuri(false);

MessageBox.Show("Contract modificat", "Modificare contract", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

}

catch (Exception ex)

{ MessageBox.Show(ex.Message + " " + comanda.CommandText, "Eroare2", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Codul pentru suspendarea unui contract de muncă este:

private void btnSuspendare_Click(object sender, EventArgs e)

{ if (f1.con != null && f1.con.State == ConnectionState.Closed)

f1.con.Open();

OleDbCommand comanda = new OleDbCommand();

comanda.Connection = f1.con;

if (MessageBox.Show("Confirmati suspendarea contractului?", "Suspendare contract", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)

try

{comanda.CommandText = "UPDATE contracte SET anulat=1 WHERE NR_contract='" + txtNrContract.Text + "';";

comanda.ExecuteNonQuery();

MessageBox.Show("Contractul a fost anulat", "Anulare contracte", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

afisare();

}

catch (Exception ex)

{ MessageBox.Show(ex.Message + " " + comanda.CommandText, "Eroare", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Anexa 8.

Codul aferent funcției afisare() din cadrul formularului “FrmIntocmirePrezenta”:

private void afisare()

{ //afisez in datagridview

OleDbCommand com = new OleDbCommand();

com.Connection = f1.con;

com.CommandText = "SELECT salarii.id_salar AS [ID], contracte.NR_contract AS [Nr contract], angajati.CNP, angajati.Nume, angajati.Prenume, contracte.nr_ore_zi AS [Nr ore pe zi], prezenta.ore_lucrate AS [Ore lucrate], prezenta.ore_suplimentare AS [Ore suplimentare], prezenta.invoit_fara_salarii as [Invoit], prezenta.obligatii_cetatenesti AS [Obligatii cetatenesti], prezenta.nemotivat AS [Nemotivat], prezenta.concediu_odihna AS [Concediu odihna], prezenta.boala_obisnuita AS [Concediu boala], prezenta.accident_munca AS [Accident munca], prezenta.maternitate AS [Maternitate], salarii.arhivat FROM angajati, contracte, prezenta, salarii WHERE angajati.CNP=contracte.cnp AND contracte.anulat=0 AND salarii.an=";

com.CommandText += AnTextBox.Text;

com.CommandText += " AND salarii.luna=";

com.CommandText += (ComboBox1.SelectedIndex + 1);

com.CommandText += " AND prezenta.id_salar=salarii.id_salar AND salarii.CNP=angajati.CNP AND prezenta.zi=" + DomainUpDown1.Items[DomainUpDown1.SelectedIndex].ToString().Substring(0, 2) + "";

if (contractTXT.Text != "" || NumeTXT.Text != "" || PrenumeTXT.Text != "" || CNPTXT.Text != "")

{

com.CommandText += " AND contracte.NR_contract LIKE @nr_contract AND angajati.Nume LIKE @nume AND angajati.Prenume like @prenume AND angajati.CNP LIKE @cnp";

com.Parameters.AddWithValue("@nr_contract", "%" + contractTXT.Text + "%");

com.Parameters.AddWithValue("@nume", NumeTXT.Text + "%");

com.Parameters.AddWithValue("@prenume", "%" + PrenumeTXT.Text + "%");

com.Parameters.AddWithValue("@cnp", CNPTXT.Text + "%");

}

com.CommandText += " ORDER BY angajati.Nume, angajati.Prenume";

prezentaDA = new OleDbDataAdapter(com);

prezentaDS = new DataSet();

prezentaDS.Tables.Add("prezenta");

prezentaDA.Fill(prezentaDS, "prezenta");

dataGridView1.DataSource = prezentaDS.Tables["prezenta"];

dataGridView1.AllowUserToAddRows = false;

dataGridView1.AllowUserToDeleteRows = false;

dataGridView1.Columns[0].Visible = false;

dataGridView1.Columns[1].Width = 80;

dataGridView1.Columns[2].Width = 90;

dataGridView1.Columns[5].Width = 60;

dataGridView1.Columns[6].Width = 60;

dataGridView1.Columns[7].Width = 70;

dataGridView1.Columns[8].Width = 60;

dataGridView1.Columns[9].Width = 65;

dataGridView1.Columns[10].Width = 65;

dataGridView1.Columns[11].Width = 63;

dataGridView1.Columns[12].Width = 63;

dataGridView1.Columns[13].Width = 63;

dataGridView1.Columns[14].Width = 65;

dataGridView1.Columns[1].ReadOnly = true;

dataGridView1.Columns[2].ReadOnly = true;

dataGridView1.Columns[3].ReadOnly = true;

dataGridView1.Columns[4].ReadOnly = true;

dataGridView1.Columns[5].ReadOnly = true;

dataGridView1.Columns[15].Visible = false;

DataRow dr = prezentaDS.Tables["prezenta"].Rows[0];

if (prezentaDS.Tables["prezenta"].Rows.Count > 0)

if (Convert.ToBoolean(dr.ItemArray.GetValue(15)))

Label8.Visible = true; //Label pentru afisat textul Luna Inchisa

else

Label8.Visible = false;

else

Label8.Visible = false;

}

Anexa 9.

Codul necesar pentru evenimentul click al butonului „Calcul avansuri” este:

private void Button1_Click(object sender, EventArgs e)

{ if (TextBox1.Text.Length < 4)

MessageBox.Show("Valoarea anului este prea indepartata pentru a putea fi utilizata", "An incorect", MessageBoxButtons.OK, MessageBoxIcon.Error);

else

{

//calculez avansul si il introduc si in tabele

OleDbCommand comanda = new OleDbCommand();

if (f1.con != null && f1.con.State == ConnectionState.Closed)

f1.con.Open();

comanda.Connection = f1.con;

if (dataGridView1.RowCount > 0)

{

DataRow dr = avansuriDS.Tables["retineri"].Rows[0];

if (Convert.ToBoolean(dr.ItemArray.GetValue(9)) == true)

MessageBox.Show("Luna a fost inchisa", "Luna salariala inchisa", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

else

{

for (int i = 0; i <= dataGridView1.RowCount – 1; i++)

{

comanda.CommandText = "UPDATE retineri SET avans = " + Math.Round(Double.Parse(dataGridView1[6, i].Value.ToString()) * Double.Parse(dataGridView1[7, i].Value.ToString()) * 0.7 / Double.Parse(TextBox2.Text), 0).ToString().Replace(",", ".").ToString() + " WHERE retineri.id_salar=" + dataGridView1[0, i].Value.ToString() + "";

comanda.ExecuteNonQuery();

}

comanda.CommandText = "UPDATE salarii SET zile_luna=" + TextBox2.Text + " WHERE salarii.an=" + TextBox1.Text + " AND salarii.luna=" + (ComboBox1.SelectedIndex + 1).ToString() + "";

comanda.ExecuteNonQuery();

MessageBox.Show("Avansurile au fost calculate", "Calcul avansuri", MessageBoxButtons.OK, MessageBoxIcon.Information);

afisare();

}

}

else

MessageBox.Show("Nu exista pontaje pentru perioada selectata", "Calcul avansuri", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

}

private void afisare()

{ //afisez si angajatii

OleDbCommand com = new OleDbCommand();

com.CommandText = "SELECT salarii.ID_salar, contracte.NR_contract AS [Nr contract], angajati.Nume, angajati.Prenume, angajati.CNP, functii.denumire_functie AS [Functie], contracte.sal_incadrare AS [Sal incadrare], Count(prezenta.ore_lucrate) AS [Zile lucrate], retineri.avans AS Avans, salarii.arhivat FROM salarii, contracte, angajati, functii, prezenta, retineri WHERE salarii.ID_salar = prezenta.ID_salar AND salarii.ID_salar = retineri.ID_salar AND salarii.CNP = angajati.CNP AND angajati.CNP = contracte.CNP AND contracte.functia = functii.ID_functie AND salarii.luna=" + (ComboBox1.SelectedIndex + 1).ToString() + " AND salarii.an=" + TextBox1.Text + " AND contracte.anulat=0 AND prezenta.ore_lucrate>0 AND prezenta.zi<16 GROUP BY salarii.ID_salar, contracte.NR_contract, angajati.Nume, angajati.Prenume, angajati.CNP, functii.denumire_functie, contracte.sal_incadrare, retineri.avans, salarii.arhivat ORDER BY angajati.Nume, angajati.Prenume, angajati.CNP;";

com.Connection = f1.con;

avansuriDA = new OleDbDataAdapter(com);

avansuriDS = new DataSet();

avansuriDS.Tables.Add("retineri");

avansuriDA.Fill(avansuriDS.Tables["retineri"]);

dataGridView1.DataSource = avansuriDS.Tables["retineri"];

dataGridView1.Columns[0].Visible = false;

dataGridView1.ReadOnly = true;

dataGridView1.Columns[9].Visible = false;

dataGridView1.RowHeadersVisible = false;

dataGridView1.AllowUserToAddRows = false;

if (avansuriDS.Tables["retineri"].Rows.Count > 0)

{ DataRow dr = avansuriDS.Tables["retineri"].Rows[0];

if (Convert.ToBoolean(dr.ItemArray.GetValue(9)) == true)

Label4.Visible = true; //eticheta cu textul Luna inchisa

else

Label4.Visible = false; }

else

Label4.Visible = false; }

Similar Posts