From 5398f5a0eefb8bd3eade4f760d54c3d724d17afe Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 14 Apr 2026 15:09:46 +0530 Subject: [PATCH 1/3] Add Update Designation functionality for General Employees EMP005 : Update Designation - Added updateDesignation method in ZenvyController and EmployeeManagementService. - Implemented update designation logic with authorization checks. - Enabled Admin menu option to update employee designation - Display employee designation in employee selection list - Extended GeneralEmployee to expose and update designation - Integrated role selection flow in MenuHelper. Smitha Mohan --- .../controllers/ZenvyController.cpp | 5 ++ .../controllers/ZenvyController.h | 2 +- .../Trenser.Zenvy/models/GeneralEmployee.cpp | 2 +- .../Trenser.Zenvy/models/GeneralEmployee.h | 9 ++- .../services/EmployeeManagementService.cpp | 18 +++++ .../services/EmployeeManagementService.h | 1 + .../Trenser.Zenvy/views/AdminMenu.cpp | 5 +- .../Trenser.Zenvy/views/MenuHelper.cpp | 20 +++++ .../Trenser.Zenvy/views/MenuHelper.h | 73 ++++++++++++------- 9 files changed, 102 insertions(+), 33 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index aced692..87164e6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -42,6 +42,11 @@ std::shared_ptr ZenvyController::getCurrentEmployee() return m_employeeManagementService->getCurrentEmployee(); } +bool ZenvyController::updateDesignation(const std::string& id,Enums::EmployeeDesignation designation) +{ + return m_employeeManagementService->updateDesignation(id,designation); +} + //Payslip Management void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 56140de..8345148 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -50,7 +50,7 @@ public: std::shared_ptr getCurrentEmployee(); void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); - + bool updateDesignation(const std::string&,Enums::EmployeeDesignation); template Employees getEmployees(Types ...types) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 2392097..00a7085 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -2,7 +2,7 @@ #include "GeneralEmployee.h" #include "Factory.h" -Enums::EmployeeDesignation GeneralEmployee::getDesignation() const +Enums::EmployeeDesignation GeneralEmployee::getDesignation() const { return m_designation; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 61b1a06..b3f38dc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -8,7 +8,8 @@ private: Enums::EmployeeDesignation m_designation; public: GeneralEmployee() - : m_designation(Enums::EmployeeDesignation::JUNIOR) {} + : m_designation(Enums::EmployeeDesignation::JUNIOR) { + } GeneralEmployee(const std::string& name, const std::string& phone, const std::string& email, @@ -19,7 +20,8 @@ public: email, Enums::EmployeeType::GENERAL, payroll), - m_designation(designation) {} + m_designation(designation) { + } GeneralEmployee(const std::string& id, const std::string& name, const std::string& phone, @@ -38,7 +40,8 @@ public: teamStatus, Enums::EmployeeType::GENERAL, accountStatus), - m_designation(employeeDesignation) {} + m_designation(employeeDesignation) { + } Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); std::string serialize() const override; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 5f639da..bb5c259 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -131,6 +131,24 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) return true; } +bool EmployeeManagementService::updateDesignation(const std::string& id, Enums::EmployeeDesignation designation) +{ + auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); + util::enforceAuthorization(authenticatedEmployee->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + std::map> employee = m_dataStore.getEmployees(); + auto iterator = employee.find(id); + if (iterator == employee.end()) + { + return false; + } + auto generalEmployee = std::dynamic_pointer_cast((*iterator).second); + if (generalEmployee) + { + generalEmployee->setDesignation(designation); + } + return true; +} + std::shared_ptr EmployeeManagementService::getCurrentEmployee() { return m_dataStore.getAuthenticatedEmployee(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 4551b6f..45f4526 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -17,6 +17,7 @@ public: EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); + bool updateDesignation(const std::string&,Enums::EmployeeDesignation); void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 6c3c0d5..bbe895b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -13,7 +13,7 @@ void AdminMenu::run() { int choice; util::clear(); - std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Logout\nEnter your Choice: "; + std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Update Designation \n7. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -48,6 +48,9 @@ bool AdminMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 6: + updateDesignation(m_zenvyController); + break; + case 7: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 37da2d2..9a657ae 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -102,3 +102,23 @@ void createEmployee(std::shared_ptr controller) std::cout << "\nCreated Employee Successfully."; util::pressEnter(); } + + void updateDesignation(std::shared_ptr m_zenvyController) +{ + std::string selectedEmployeeId = selectEmployeeId(m_zenvyController->getEmployees(Enums::EmployeeType::GENERAL)); + if (selectedEmployeeId.empty()) + { + return; + } + Enums::EmployeeDesignation designation = getEmployeeDesignation(); + if (m_zenvyController->updateDesignation(selectedEmployeeId, designation)) + { + std::cout << "Assign Employee Role successfull\n"; + util::pressEnter(); + } + else + { + std::cout << "Employee not found\n"; + util::pressEnter(); + } +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 09b084e..25e7a07 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -14,6 +14,7 @@ #include "Validator.h" void createEmployee(std::shared_ptr controller); +void updateDesignation(std::shared_ptr m_zenvyController); inline void viewProfile(std::shared_ptr controller) { @@ -134,14 +135,31 @@ inline std::string selectEmployeeId(std::vector> << std::setw(10) << "Index" << std::setw(15) << "Employee ID" << std::setw(20) << "Name" - << std::setw(20) << "Employee Type" << std::endl; + << std::setw(20) << "Employee Type" + << std::setw(20) << "Employee Designation" << std::endl; for (const auto& employee : employeeList) { - std::cout << std::left << std::setw(10) << employee.first - << std::setw(15) << employee.second->getId() - << std::setw(20) << employee.second->getEmployeeName() - << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()) - << std::endl; + auto generalEmployee = std::dynamic_pointer_cast(employee.second); + if (generalEmployee) + { + std::cout << std::left + << std::setw(10) << employee.first + << std::setw(15) << generalEmployee->getId() + << std::setw(20) << generalEmployee->getEmployeeName() + << std::setw(20) << Enums::getEmployeeTypeString(generalEmployee->getEmployeeType()) + << std::setw(20) << Enums::getEmployeeDesignationString(generalEmployee->getDesignation()) + << std::endl; + } + else + { + std::cout << std::left + << std::setw(10) << employee.first + << std::setw(15) << employee.second->getId() + << std::setw(20) << employee.second->getEmployeeName() + << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()) + << std::setw(20) << "NULL" + << std::endl; + } } std::cout << "Enter the Index: "; util::read(choice); @@ -163,7 +181,7 @@ inline void deactivateEmployee(const std::shared_ptr& controlle { return; } - if(controller->deactivateEmployee(selectedEmployeeId)) + if (controller->deactivateEmployee(selectedEmployeeId)) { std::cout << "Employee deactivated successfully\n"; util::pressEnter(); @@ -210,13 +228,13 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) inline void searchEmployee(std::shared_ptr& m_zenvyController) { - std::string name; - util::clear(); - std::cout << "Enter Employee Name: "; - util::read(name); - std::pair>> searchResults = m_zenvyController->searchEmployee(name); - if (!(searchResults.second).empty()) - { + std::string name; + util::clear(); + std::cout << "Enter Employee Name: "; + util::read(name); + std::pair>> searchResults = m_zenvyController->searchEmployee(name); + if (!(searchResults.second).empty()) + { std::cout << std::left << std::setw(10) << "ID" << std::setw(20) << "Name" @@ -238,10 +256,10 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) << std::setw(15) << "HouseRentAllowance"; } std::cout << std::endl; - for (const auto& employee : searchResults.second) - { - if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) - { + for (const auto& employee : searchResults.second) + { + if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { std::cout << std::left << std::setw(10) << employee->getId() << std::setw(20) << employee->getEmployeeName() @@ -257,8 +275,8 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) { std::cout << std::setw(15) << employee->getEmployeeTeamId(); } - if (searchResults.first == Enums::EmployeeType::FINANCE - || searchResults.first == Enums::EmployeeType::HR + if (searchResults.first == Enums::EmployeeType::FINANCE + || searchResults.first == Enums::EmployeeType::HR || searchResults.first == Enums::EmployeeType::ADMIN) { std::cout << std::left @@ -270,12 +288,13 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) << std::setw(15) << employee->getPayroll()->getHouseRentAllowance(); } std::cout << std::endl; - } - } - } - else - { - std::cout << "No Employee found with this name" << std::endl; - } + } + } + } + else + { + std::cout << "No Employee found with this name" << std::endl; + } util::pressEnter(); } + From 55f94f4d45ce2ad0ad6a646cbfc381d942d3e800 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 14 Apr 2026 17:03:33 +0530 Subject: [PATCH 2/3] Update Update Designation functionality EMP005 : Update Designation - Enabled HR Manager menu option to update employee designation Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 0709976..d3723f7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -13,7 +13,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "HR Manager Menu\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. View Profile\n15. Logout\nEnter your Choice: "; + std::cout << "HR Manager Menu\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. View Profile\n15. Update Designation\n16. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -51,6 +51,9 @@ bool HRManagerMenu::handleOperation(int choice) viewProfile(m_zenvyController); break; case 15: + updateDesignation(m_zenvyController); + break; + case 16: return false; default: std::cout << "Enter a valid choice!" << std::endl; From ce86b7f59e4a902cb8908e8b00b15b8f0a3357f8 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 14 Apr 2026 18:38:42 +0530 Subject: [PATCH 3/3] Update Update Designation functionality based on review EMP005 : Update Designation - Refactor GeneralEmployee constructors clean. - update Designation logic. - Improve menu display messages. Smitha Mohan --- .../Trenser.Zenvy/models/GeneralEmployee.h | 9 +++------ .../services/EmployeeManagementService.cpp | 8 ++++---- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h | 16 ++++++---------- 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index b3f38dc..61b1a06 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -8,8 +8,7 @@ private: Enums::EmployeeDesignation m_designation; public: GeneralEmployee() - : m_designation(Enums::EmployeeDesignation::JUNIOR) { - } + : m_designation(Enums::EmployeeDesignation::JUNIOR) {} GeneralEmployee(const std::string& name, const std::string& phone, const std::string& email, @@ -20,8 +19,7 @@ public: email, Enums::EmployeeType::GENERAL, payroll), - m_designation(designation) { - } + m_designation(designation) {} GeneralEmployee(const std::string& id, const std::string& name, const std::string& phone, @@ -40,8 +38,7 @@ public: teamStatus, Enums::EmployeeType::GENERAL, accountStatus), - m_designation(employeeDesignation) { - } + m_designation(employeeDesignation) {} Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); std::string serialize() const override; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index bb5c259..179b057 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -135,13 +135,13 @@ bool EmployeeManagementService::updateDesignation(const std::string& id, Enums:: { auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); util::enforceAuthorization(authenticatedEmployee->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); - std::map> employee = m_dataStore.getEmployees(); - auto iterator = employee.find(id); - if (iterator == employee.end()) + std::map> employees = m_dataStore.getEmployees(); + auto employeeIterator = employees.find(id); + if (employeeIterator == employees.end()) { return false; } - auto generalEmployee = std::dynamic_pointer_cast((*iterator).second); + auto generalEmployee = std::dynamic_pointer_cast((*employeeIterator).second); if (generalEmployee) { generalEmployee->setDesignation(designation); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 9a657ae..43b8faf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -113,7 +113,7 @@ void createEmployee(std::shared_ptr controller) Enums::EmployeeDesignation designation = getEmployeeDesignation(); if (m_zenvyController->updateDesignation(selectedEmployeeId, designation)) { - std::cout << "Assign Employee Role successfull\n"; + std::cout << "Assigned Employee Role Successfully\n"; util::pressEnter(); } else diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 25e7a07..940333c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -140,23 +140,20 @@ inline std::string selectEmployeeId(std::vector> for (const auto& employee : employeeList) { auto generalEmployee = std::dynamic_pointer_cast(employee.second); + std::cout << std::left + << std::setw(10) << employee.first + << std::setw(15) << employee.second->getId() + << std::setw(20) << employee.second->getEmployeeName() + << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()); if (generalEmployee) { std::cout << std::left - << std::setw(10) << employee.first - << std::setw(15) << generalEmployee->getId() - << std::setw(20) << generalEmployee->getEmployeeName() - << std::setw(20) << Enums::getEmployeeTypeString(generalEmployee->getEmployeeType()) << std::setw(20) << Enums::getEmployeeDesignationString(generalEmployee->getDesignation()) << std::endl; } else { std::cout << std::left - << std::setw(10) << employee.first - << std::setw(15) << employee.second->getId() - << std::setw(20) << employee.second->getEmployeeName() - << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()) << std::setw(20) << "NULL" << std::endl; } @@ -296,5 +293,4 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) std::cout << "No Employee found with this name" << std::endl; } util::pressEnter(); -} - +} \ No newline at end of file