1+ #include < iostream>
2+ #include < string>
3+ #include < numeric>
4+ #include < vector>
5+ #include < algorithm>
6+ #include < iterator>
7+ #include < fstream>
8+ #include < sstream>
9+
10+ using namespace std ;
11+
12+ class Employee {
13+ private:
14+ int id, salary;
15+ string name, department;
16+
17+ public:
18+ // constructor
19+ Employee (int id, string n, string d, int s) : id(id), name(n), department(d), salary(s) {}
20+
21+ // Getter
22+ int getID () const {
23+ return id;
24+ }
25+ int getSalary () const {
26+ return salary;
27+ }
28+ string getName () const {
29+ return name;
30+ }
31+ string getDepartment () const {
32+ return department;
33+ }
34+
35+ // Setter
36+ void setSalary (int sal) {
37+ salary = sal;
38+ }
39+ void setName (string n) {
40+ name = n;
41+ }
42+ void setDepartement (string dep) {
43+ department = dep;
44+ }
45+
46+
47+ // methods to be used
48+
49+ // display details of an employee
50+ void displayEmployee () const {
51+ cout << " ID: " << id <<endl;
52+ cout << " Name: " << name <<endl;
53+ cout << " Department: " << department <<endl;
54+ cout << " Salary: Rs " << salary <<endl<<endl;
55+ }
56+
57+ // update existing employee
58+ void updateEmpData (string n, string depart, int sal){
59+ name=n;
60+ department=depart;
61+ salary=sal;
62+
63+ cout << " Data of emp id " << id << " is updated\n " ;
64+ }
65+
66+ };
67+
68+
69+ // Utility fucntions
70+
71+ // Functions to take inputs
72+ int takeID (){
73+ int id;
74+ cin >> id;
75+ return id;
76+ }
77+ int takeSalary (){
78+ int sal;
79+ cin >> sal;
80+ return sal;
81+ }
82+ string takeName (){
83+ string name;
84+ cin.ignore (); // will be used after some int input everytime
85+ getline (cin, name);
86+ return name;
87+ }
88+ string takeDepartment (){
89+ string dep;
90+ getline (cin, dep); // will be used after takeName() so no cin.ignore() req
91+ return dep;
92+ }
93+
94+ // Check if the user exist - this will be used by other functions and methods
95+ // it is not of bool type or Employee type for their lack of functionality
96+ Employee* empExist (vector<Employee> &emps, int id){
97+ for (auto &e : emps){
98+ if (e.getID ()==id){
99+ return &e;
100+ }
101+ }
102+ return nullptr ;
103+ }
104+
105+ // Quick function to print the emp not found message
106+ void empNotFoundMsg (int id){ cout << " Employee with ID " << id << " not found.\n " ; }
107+
108+
109+
110+ // All the performable operations
111+ // 1 - Display all employees
112+ void displayAll (vector<Employee> &emps){
113+ for (const auto &e : emps){
114+ e.displayEmployee ();
115+ }
116+ }
117+ // 2 - Search and employee
118+ void searchEmp (vector<Employee> &emps){
119+ cout << " Enter employee id to be searched: " ;
120+ int id = takeID ();
121+ Employee* empPtr = empExist (emps, id);
122+ if (empPtr) {
123+ cout << " Employee found here are the details:-\n " ;
124+ empPtr->displayEmployee ();
125+ } else {
126+ empNotFoundMsg (id);
127+ }
128+ }
129+
130+ // 3 - Add employee
131+ void addEmps (vector<Employee> &emps){
132+ int n;
133+ cout << " Enter number of employees you want to add: " ;
134+ cin >> n;
135+ for (int i = 0 ; i < n; i++){
136+ cout << " Enter the employee id: " ;
137+ int id = takeID ();
138+ cout << " Enter the employee name: " ;
139+ string n = takeName ();
140+ cout << " Enter the employee department: " ;
141+ string dep = takeDepartment ();
142+ cout << " Enter the employee salary: " ;
143+ int sal = takeSalary ();
144+
145+ emps.push_back (Employee (id, n, dep, sal));
146+ }
147+ cout << " \n All employees added!\n " ;
148+ }
149+
150+ // 4 - Update an employee detail
151+ void updateEmp (vector<Employee> &emps){
152+ cout << " Enter employee id to be updated: " ;
153+ int id = takeID ();
154+
155+ Employee* empPtr = empExist (emps, id);
156+ if (empPtr){
157+ cout << " Enter the updated name: " ;
158+ string n = takeName ();
159+
160+ cout << " Enter the updated department: " ;
161+ string dep = takeDepartment ();
162+
163+ cout << " Enter the updated salary: " ;
164+ int sal = takeSalary ();
165+
166+ empPtr->updateEmpData (n, dep, sal);
167+ } else {
168+ empNotFoundMsg (id);
169+ }
170+
171+ }
172+
173+ // 5 - Removing an employee by searching id
174+ void deleteEmp (vector<Employee> &emps){
175+ cout << " Enter id of the employee to be deleted: " ;
176+ int id = takeID ();
177+ if (empExist (emps,id)){
178+ emps.erase (
179+ remove_if (emps.begin (), emps.end (), [id](const Employee &e){ return e.getID () == id; }),
180+ emps.end ()
181+ );
182+ cout << " Data of employee with id " << id << " is deleted" ;
183+ } else {
184+ empNotFoundMsg (id);
185+ }
186+ }
187+
188+ // 6 - Custom sort method to sort according to id (joining date) or salary
189+ // Oldest -> newest
190+ // or, highest salary -> least salary
191+ void sortEmps (vector<Employee>& emps){
192+ int by;
193+ while (true ){
194+ cout << " How do you want to sort the employees? (1 - by salary, 2 - by joining date or id)" ;
195+ cin >> by;
196+
197+ if (by==1 ){ // sort by salary
198+ sort (emps.begin (), emps.end (), [](const Employee& e1 , const Employee& e2 ){
199+ return e1 .getSalary () > e2 .getSalary ();
200+ });
201+
202+ cout << " Employees sorted by descending order of salary\n " ;
203+ break ;
204+ } else if (by==2 ) { // sort by joining date (emp id)
205+ sort (emps.begin (), emps.end (), [](const Employee& e1 , const Employee& e2 ){
206+ return e1 .getID () < e2 .getID ();
207+ });
208+ cout << " Employees sorted by accending order of joining date\n " ;
209+ break ;
210+ } else {
211+ cout << " \t Invalid sorting type\n " ;
212+ }
213+ }
214+ }
215+
216+ // 7 - Save changes
217+ void saveChanges (vector<Employee> &emps){
218+ ofstream out (" ../data/employees.csv" );
219+ if (out){
220+ for (const auto &e : emps){
221+ int id = e.getID ();
222+ string n = e.getName ();
223+ string dep = e.getDepartment ();
224+ int sal = e.getSalary ();
225+
226+ out << id << ' ,' << n << ' ,' << dep << ' ,' << sal << endl ;
227+ }
228+ cout << " All the changes are saved!\n " ;
229+ } else {
230+ cout << " Unable to save changes - cant open the file ../data/employees.csv" ;
231+ }
232+ }
233+
234+
235+ // Saving file data
236+ void saveData (vector<Employee> &emps){
237+ ofstream out (" ../data/employees.csv" );
238+ if (out){
239+ for (const auto &e : emps){
240+ out << e.getID () << ' ,' << e.getName () << ' ,' << e.getDepartment () << ' ,' << e.getSalary () << ' \n ' ;
241+ }
242+ out.close ();
243+ cout << " Data saved successfully!!\n " ;
244+ } else {
245+ cout << " !!! Cant open the ../data/employees.csv !!!" ;
246+ }
247+ }
248+
249+ // Loading file data
250+ void loadData (vector<Employee> &emps){
251+ ifstream in (" ../data/employees.csv" );
252+ if (in){
253+ string line;
254+ while (getline (in, line)){
255+ stringstream word (line);
256+
257+ int id, sal;
258+ string n, dep;
259+ char comma; // to pass the delimiter comma
260+
261+ word >> id >> comma;
262+ getline (word, n, ' ,' );
263+ getline (word, dep, ' ,' );
264+ word >> sal;
265+
266+ emps.push_back (Employee (id, n, dep, sal));
267+ }
268+ in.close ();
269+ } else {
270+ cout << " ../data/employees.csv file doesn't exist." ;
271+ }
272+ }
273+
274+ // Main interaction ui
275+ void ui (vector<Employee> &emps){
276+ while (true ){
277+ cout << " \n\t\t WELCOME TO EMPLOYEE MANAGEMENT SYSTEM\n " ;
278+ cout << " Please enter what operation you want to perform\n " ;
279+ cout << " 1 - Display all employees\n " ;
280+ cout << " 2 - Search employee\n " ;
281+ cout << " 3 - Add employees\n " ;
282+ cout << " 4 - Update an employee\n " ;
283+ cout << " 5 - Delete an employee\n " ;
284+ cout << " 6 - Sort Employees\n " ;
285+ cout << " 7 - Save all changes\n " ;
286+ cout << " 8 - Exit the program\n " ;
287+
288+ int choice;
289+ cin >> choice;
290+
291+ switch (choice){
292+ case 1 :
293+ displayAll (emps);
294+ break ;
295+ case 2 :
296+ searchEmp (emps);
297+ break ;
298+ case 3 :
299+ addEmps (emps);
300+ break ;
301+ case 4 :
302+ updateEmp (emps);
303+ break ;
304+ case 5 :
305+ deleteEmp (emps);
306+ break ;
307+ case 6 :
308+ sortEmps (emps);
309+ break ;
310+ case 7 :
311+ saveChanges (emps);
312+ break ;
313+ case 8 :
314+ cout << " \t\t Exiting the program!!" ;
315+ return ;
316+ default :
317+ cout << " \t !!! Invalid input !!!\n " ;
318+ break ;
319+ }
320+ }
321+ }
322+
323+
324+ int main () {
325+ vector<Employee> employees;
326+ loadData (employees);
327+
328+ ui (employees);
329+ return 0 ;
330+ }
0 commit comments