From f85614ecc545752e49bde3ced20d602ebcb86422 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Tue, 7 Apr 2026 19:35:20 +0530 Subject: [PATCH 1/4] Implement Deactive Employee functionality EMP002 : Deactivate Employee - Added deactivateEmployee logic to set employee status to INACTIVE - Enabled Deactivate Employee option in AdminMenu - Implemented listing of active employees for selection - Connected UI flow for employee deactivation - Fix minor syntax issues Smitha Mohan --- .../Trenser.Zenvy.vcxproj.filters | 6 ++ .../controllers/ZenvyController.cpp | 4 - .../AuthenticationManagementService.cpp | 2 +- .../services/EmployeeManagementService.cpp | 8 ++ .../Trenser.Zenvy/views/AdminMenu.cpp | 6 +- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 11 +-- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 5 +- .../Trenser.Zenvy/views/MenuHelper.h | 77 +++++++++++++++++-- 8 files changed, 98 insertions(+), 21 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters index d9514f7..0def00c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters @@ -192,6 +192,9 @@ Services + + Views + @@ -338,6 +341,9 @@ Services + + Views + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 144f6d4..6b5d67a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -50,7 +50,3 @@ Employees ZenvyController::getEmployees() { return m_employeeManagementService->getEmployees(); } - -std::shared_ptr ZenvyController::getEmployee(const std::string&) { - -} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp index 952b832..613cc90 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp @@ -49,7 +49,7 @@ AuthenticationDTO AuthenticationManagementService::login(const std::string& emai void AuthenticationManagementService::changePassword(const std::string& password) { - std::shared_ptr authenticatedUser = m_dataStore.getAuthenticatedUser(); + std::shared_ptr authenticatedUser = m_dataStore.getAuthenticatedEmployee(); if (authenticatedUser) { authenticatedUser->setEmployeePassword(password); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 21fd3df..022bf6e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -98,6 +98,14 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, bool EmployeeManagementService::deactivateEmployee(const std::string& id) { + auto& employee = m_dataStore.getEmployees(); + auto iterator = employee.find(id); + if (iterator == employee.end()) + { + return false; + } + iterator->second->setEmployeeAccountStatus(Enums::AccountStatus::INACTIVE); + return true; } Employees EmployeeManagementService::getEmployees() diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index bf65e3f..44388bf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -118,10 +118,10 @@ bool AdminMenu::handleOperation(int choice) break; /*case 2: m_zenvyController.viewEmployee(); - break; - case 3: - m_zenvyController.deactivateEmployee(); break;*/ + case 3: + deactivateEmployee(m_zenvyController); + break; case 5: updateProfile(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index a4eb3ac..5b82b20 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -32,7 +32,8 @@ bool EmployeeMenu::handleOperation(int choice) { switch (choice) { - /*case 1: + /* + case 1: m_zenvyController.applyLeave(); break; case 2: @@ -49,11 +50,11 @@ bool EmployeeMenu::handleOperation(int choice) break; case 6: m_zenvyController.viewTicketHistory(); - break;*/ - /*case 7: + break; + case 7: viewEmployees(); - break;*/ - /*case 8: + break; + case 8: m_zenvyController.searchEmployee(); break; case 9: diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 5b635b6..7fd76cc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -1,3 +1,4 @@ + #include #include "HRManagerMenu.h" #include "InputHelper.h" @@ -91,7 +92,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Logout\nEnter your Choice: "; + std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -147,6 +148,8 @@ bool HRManagerMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 13: + deactivateEmployee(m_zenvyController); + case 14: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 2f557d1..502b9c2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -1,6 +1,13 @@ #pragma once -#include"ZenvyController.h" -#include"InputHelper.h" +#include +#include +#include +#include +#include +#include "Employee.h" +#include "ZenvyController.h" +#include "MenuHelper.h" +#include "InputHelper.h" #include"OutputHelper.h" inline void updateProfile(std::shared_ptr m_zenvyController) @@ -10,7 +17,7 @@ inline void updateProfile(std::shared_ptr m_zenvyController) name = m_zenvyController->getCurrentEmployee()->getEmployeeName(); phone = m_zenvyController->getCurrentEmployee()->getEmployeePhone(); while (true) - { + { util::clear(); std::cout << "Please choose the information you want to update:\n" "1. Name\n" @@ -19,7 +26,7 @@ inline void updateProfile(std::shared_ptr m_zenvyController) "Enter your choice: "; util::read(choice); switch (choice) - { + { case 1: std::cout << "Enter your updated Name :"; util::read(name); @@ -33,10 +40,66 @@ inline void updateProfile(std::shared_ptr m_zenvyController) std::cout << "Profile Updated Successfully\n"; break; case 3: - return; + return; default: std::cout << "Enter a valid choice!" << std::endl; break; - } - } + } + } +} + + +inline std::map> listActiveEmployees(const std::shared_ptr& controller) +{ + auto employees = controller->getEmployees(); + std::map> employeeList; + int index = 1; + std::cout << "Active Employees:\n"; + for (auto& activeEmployees : employees) + { + std::cout << std::setw(3) << index << ". " + << std::setw(10) << "ID: " + << std::setw(10) << activeEmployees->getEmployeeId() + << " | " + << std::setw(10) << "Name: " + << std::setw(20) << activeEmployees->getEmployeeName() + << "\n"; + employeeList[index] = activeEmployees; + ++index; + } + if (employeeList.empty()) + { + std::cout << "No active employees available.\n"; + } + return employeeList; +} + +void deactivateEmployee(const std::shared_ptr& controller) +{ + auto employeeList = listActiveEmployees(controller); + if (employeeList.empty()) + { + return; + } + int choice; + std::cout << "\nEnter the index of the employee to deactivate: "; + util::read(choice); + auto iterator = employeeList.find(choice); + if (iterator != employeeList.end()) + { + std::string id = iterator->second->getEmployeeId(); + bool success = controller->deactivateEmployee(id); + if (success) + { + std::cout << "Employee deactivated successfully\n"; + } + else + { + std::cout << "Employee not found\n"; + } + } + else + { + std::cout << "Invalid selection.\n"; + } } From daf33e1aab82479bb72b2fd4d15f51eff0f6a4dc Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Wed, 8 Apr 2026 10:29:06 +0530 Subject: [PATCH 2/4] Implement Review Fixes EMP002 : Deactivate Employee - Updated employee listing to display in a tabular format with headers - Renamed helper function from listActiveEmployees to listEmployees - Updated error messages - Removed blank spaces Smitha Mohan --- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 65 +++++++++---------- .../Trenser.Zenvy/views/MenuHelper.h | 25 +++---- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 7fd76cc..8d51e73 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -1,4 +1,3 @@ - #include #include "HRManagerMenu.h" #include "InputHelper.h" @@ -111,39 +110,39 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { - //case 1: - // m_zenvyController.applyLeave(); - // break; - //case 2: - // m_zenvyController.viewPayslip(); - // break; - //case 3: - // m_zenvyController.viewPayslipHistory(); - // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; - //case 5: - // m_zenvyController.searchEmployee(); - // break; - //case 6: - // m_zenvyController.viewNotifications(); - // break; - //case 7: - // m_zenvyController.viewAnnouncements(); - // break; - case 8: - createEmployee(m_zenvyController); + /*case 1: + m_zenvyController.applyLeave(); break; - //case 9: - // m_zenvyController.regularizeAttenance(); - // break; - //case 10: - // m_zenvyController.updateLeaveRequest(); - // break; - //case 11: - // m_zenvyController.registercandidateAsEmployee(); - // break; + case 2: + m_zenvyController.viewPayslip(); + break; + case 3: + m_zenvyController.viewPayslipHistory(); + break; + case 4: + m_zenvyController.viewEmployees(); + break; + case 5: + m_zenvyController.searchEmployee(); + break; + case 6: + m_zenvyController.viewNotifications(); + break; + case 7: + m_zenvyController.viewAnnouncements(); + break; + case 8: + m_zenvyController.createEmployee(); + break; + case 9: + m_zenvyController.regularizeAttenance(); + break; + case 10: + m_zenvyController.updateLeaveRequest(); + break; + case 11: + m_zenvyController.registercandidateAsEmployee(); + break;*/ case 12: updateProfile(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 502b9c2..6df1fce 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -8,7 +8,7 @@ #include "ZenvyController.h" #include "MenuHelper.h" #include "InputHelper.h" -#include"OutputHelper.h" +#include "OutputHelper.h" inline void updateProfile(std::shared_ptr m_zenvyController) { @@ -49,20 +49,22 @@ inline void updateProfile(std::shared_ptr m_zenvyController) } -inline std::map> listActiveEmployees(const std::shared_ptr& controller) +inline std::map> listEmployees(const std::shared_ptr& controller) { auto employees = controller->getEmployees(); std::map> employeeList; + std::cout << std::left + << std::setw(5) << "Index" + << std::setw(15) << "ID" + << std::setw(25) << "Name" + << "\n"; int index = 1; - std::cout << "Active Employees:\n"; for (auto& activeEmployees : employees) { - std::cout << std::setw(3) << index << ". " - << std::setw(10) << "ID: " - << std::setw(10) << activeEmployees->getEmployeeId() - << " | " - << std::setw(10) << "Name: " - << std::setw(20) << activeEmployees->getEmployeeName() + std::cout << std::left + << std::setw(5) << index + << std::setw(15) << activeEmployees->getEmployeeId() + << std::setw(25) << activeEmployees->getEmployeeName() << "\n"; employeeList[index] = activeEmployees; ++index; @@ -76,12 +78,13 @@ inline std::map> listActiveEmployees(const void deactivateEmployee(const std::shared_ptr& controller) { - auto employeeList = listActiveEmployees(controller); + auto employeeList = listEmployees(controller); if (employeeList.empty()) { return; } int choice; + util::clear(); std::cout << "\nEnter the index of the employee to deactivate: "; util::read(choice); auto iterator = employeeList.find(choice); @@ -100,6 +103,6 @@ void deactivateEmployee(const std::shared_ptr& controller) } else { - std::cout << "Invalid selection.\n"; + std::cout << "Invalid index.\n"; } } From a955b64462af1b1335688d4d7395bdeaa3c62a54 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Wed, 8 Apr 2026 10:51:48 +0530 Subject: [PATCH 3/4] Ensure Role based access EMP002 : Deactivate Employee - Ensure Role based access Smitha Mohan --- .../Trenser.Zenvy/services/EmployeeManagementService.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 022bf6e..fdd0c0b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -98,6 +98,7 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, bool EmployeeManagementService::deactivateEmployee(const std::string& id) { + util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); auto& employee = m_dataStore.getEmployees(); auto iterator = employee.find(id); if (iterator == employee.end()) From 4d4974efd718bb2703d3de0e4b3e0c02d44cd929 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Wed, 8 Apr 2026 11:47:00 +0530 Subject: [PATCH 4/4] Protect Admin account from deactivation EMP002 : Deactivate Employee - Ensure admin account cannot be deactivated Smitha Mohan --- .../Trenser.Zenvy/services/EmployeeManagementService.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index fdd0c0b..29ef5b5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -98,13 +98,18 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, bool EmployeeManagementService::deactivateEmployee(const std::string& id) { - util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); + util::enforceAuthorization(authenticatedEmployee->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); auto& employee = m_dataStore.getEmployees(); auto iterator = employee.find(id); if (iterator == employee.end()) { return false; } + if (iterator->second->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + throw std::runtime_error("Cannot deactivate Admin Account"); + } iterator->second->setEmployeeAccountStatus(Enums::AccountStatus::INACTIVE); return true; }