From 5398f5a0eefb8bd3eade4f760d54c3d724d17afe Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 14 Apr 2026 15:09:46 +0530 Subject: [PATCH 01/10] 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 02/10] 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 03/10] 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 From 1836be1234369e40b02c14abcd4b8389394dad4a Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Tue, 14 Apr 2026 14:48:58 +0530 Subject: [PATCH 04/10] To Add Shortlisted Candidates As Employee EMP012 : Add Shorlisted Candidates As Employee - Added getShorlistedCandidates method in ZenvyController - Added candidateMap to store candidate data in DataStore.h - Added addShortlistedCandidatesAsEmployee method in EmployeeManagementService.h and implemented the logic. Smitha Mohan --- .../controllers/ZenvyController.cpp | 5 ++ .../controllers/ZenvyController.h | 2 + .../Trenser.Zenvy/datastores/DataStore.cpp | 5 ++ .../Trenser.Zenvy/datastores/DataStore.h | 3 + .../Trenser.Zenvy/models/Candidate.cpp | 4 +- .../Trenser.Zenvy/models/Candidate.h | 10 +-- .../services/EmployeeManagementService.cpp | 14 +++ .../services/EmployeeManagementService.h | 1 + Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 3 +- .../Trenser.Zenvy/views/AdminMenu.cpp | 5 +- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 5 +- .../Trenser.Zenvy/views/MenuHelper.cpp | 85 ++++++++++++++++++- .../Trenser.Zenvy/views/MenuHelper.h | 5 +- 13 files changed, 132 insertions(+), 15 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 87164e6..1f095ee 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -47,6 +47,11 @@ bool ZenvyController::updateDesignation(const std::string& id,Enums::EmployeeDes return m_employeeManagementService->updateDesignation(id,designation); } +std::vector>& ZenvyController::getShorlistedCandidates() +{ + return m_employeeManagementService->getShorlistedCandidates(); +} + //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 8345148..78b3123 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -51,6 +51,8 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); bool updateDesignation(const std::string&,Enums::EmployeeDesignation); + std::vector>& getShorlistedCandidates(); + template Employees getEmployees(Types ...types) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index fe9dad4..be0897e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -12,6 +12,11 @@ logMap& DataStore::getLogs() return m_logs; } +candidateMap& DataStore::getCandidates() +{ + return m_candidates; +} + std::shared_ptr& DataStore::getAuthenticatedEmployee() { return m_authenticatedEmployee; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index 9f79fc8..972e580 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -25,6 +25,7 @@ using employeeMap = std::map>; using payrollMap = std::map>; using payslipMap = std::map>; using logMap = std::map>; +using candidateMap = std::map>; class DataStore { @@ -34,6 +35,7 @@ private: payrollMap m_payrolls; payslipMap m_payslips; logMap m_logs; + candidateMap m_candidates; DataStore() = default; public: static DataStore& getInstance(); @@ -45,6 +47,7 @@ public: payrollMap& getPayrolls(); payslipMap& getPayslips(); logMap& getLogs(); + candidateMap& getCandidates(); std::shared_ptr& getAuthenticatedEmployee(); void setAuthenticatedEmployee(std::shared_ptr < Employee>); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp index 779652f..254aff2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp @@ -12,7 +12,7 @@ const std::string& Candidate::getCandidateName() const return m_name; } -long int Candidate::getCandidatePhone() const +const std::string& Candidate::getCandidatePhone() const { return m_phone; } @@ -37,7 +37,7 @@ void Candidate::setCandidateName(const std::string& name) m_name = name; } -void Candidate::setCandidatePhone(long int phone) +void Candidate::setCandidatePhone(const std::string& phone) { m_phone = phone; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h index db55250..59b9e9b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h @@ -8,24 +8,24 @@ private: static int m_uid; std::string m_id; std::string m_name; - long int m_phone; + std::string m_phone; std::string m_qualification; Enums::CandidateStatus m_status; public: - Candidate() : m_id("CD" + std::to_string(++m_uid)), m_name(""), m_phone(0), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} + Candidate() : m_id("CD" + std::to_string(++m_uid)), m_name(""), m_phone(""), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} Candidate(const std::string& name, - long int phone, + const std::string& phone, const std::string& qualification, Enums::CandidateStatus status) : m_id("CD" + std::to_string(++m_uid)), m_name(name), m_phone(phone), m_qualification(qualification), m_status(status) {} const std::string& getCandidateId() const; const std::string& getCandidateName() const; - long int getCandidatePhone() const; + const std::string& getCandidatePhone() const; const std::string& getCandidateQualification() const; Enums::CandidateStatus getCandidateStatus() const; void setCandidateId(const std::string& id); void setCandidateName(const std::string& name); - void setCandidatePhone(long int phone); + void setCandidatePhone(const std::string& phone); void setCandidateQualification(const std::string& qualification); void setCandidateStatus(Enums::CandidateStatus status); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 179b057..d9add47 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -235,3 +235,17 @@ void EmployeeManagementService::saveEmployees() employeeFileManager.save(employees); generalEmployeeFileManager.save(generalEmployees); } + +std::vector>& EmployeeManagementService::getShorlistedCandidates() +{ + candidateMap candidates = m_dataStore.getCandidates(); + std::vector> shortlistedCandidates; + for (auto& candidate : candidates) + { + if (candidate.second->getCandidateStatus() == Enums::CandidateStatus::SHORTLISTED) + { + shortlistedCandidates.push_back(candidate.second); + } + } + return shortlistedCandidates; +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 45f4526..4cd2da2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -21,6 +21,7 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); + std::vector>& getShorlistedCandidates(); void loadEmployees(); void saveEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 1539ee9..a9f29f5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -19,7 +19,8 @@ namespace Enums { { PENDING, SHORTLISTED, - REJECTED + REJECTED, + HIRED }; enum class NotificationStatus diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index bbe895b..df08e23 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. Update Designation \n7. 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. Add Shortlisted Candidate As Employee\n8. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -51,6 +51,9 @@ bool AdminMenu::handleOperation(int choice) updateDesignation(m_zenvyController); break; case 7: + addShortlistedCandidateAsEmployee(m_zenvyController); + break; + case 8: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index d3723f7..580cf89 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. Update Designation\n16. 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. Add Shortlisted Candidate as Employee\n17. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -54,6 +54,9 @@ bool HRManagerMenu::handleOperation(int choice) updateDesignation(m_zenvyController); break; case 16: + addShortlistedCandidateAsEmployee(m_zenvyController); + break; + case 17: 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 43b8faf..a88989c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -30,12 +30,12 @@ static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) { Enums::EmployeeType::TALENT_ACQUISITION, "Talent Executive" }, { Enums::EmployeeType::GENERAL, "General Employee" } }; - auto it = employeeTypeOptions.find(employeeType); - if (it == employeeTypeOptions.end()) + auto employeeOptionsIterator = employeeTypeOptions.find(employeeType); + if (employeeOptionsIterator == employeeTypeOptions.end()) { throw std::runtime_error("You do not have the authority to create a new Employee!"); } - const auto& options = it->second; + const auto& options = employeeOptionsIterator->second; std::cout << "Select Employee Type\n"; for (int index = 0; index < options.size(); ++index) { @@ -121,4 +121,81 @@ void createEmployee(std::shared_ptr controller) std::cout << "Employee not found\n"; util::pressEnter(); } -} \ No newline at end of file +} + +void displayCandidateDetails(const std::vector>& shorlistedCandidates) +{ + std::cout << std::left + << std::setw(10) << "Index" + << std::setw(10) << "ID" + << std::setw(20) << "Name" + << std::setw(15) << "Phone" + << std::setw(15) << "Qualification" + << std::setw(10) << "Status" + << std::endl; + int index = 0; + for (auto& candidate : shorlistedCandidates) + { + std::cout << std::left + << std::setw(10) << ++index + << std::setw(10) << candidate->getCandidateId() + << std::setw(20) << candidate->getCandidateName() + << std::setw(15) << candidate->getCandidatePhone() + << std::setw(15) << candidate->getCandidateQualification() + << std::setw(10) << Enums::getCandidateStatusString(candidate->getCandidateStatus()) + << std::endl; + } +} + +void addShortlistedCandidateAsEmployee(const std::shared_ptr& controller) +{ + int index; + std::string name, email, phone; + util::clear(); + std::vector> shortlistedCandidates = controller->getShorlistedCandidates(); + if (shortlistedCandidates.empty()) + { + std::cout << "No candidates Found!"; + util::pressEnter(); + return; + } + displayCandidateDetails(shortlistedCandidates); + std::cout << "Enter the Index: "; + util::read(index); + auto currentEmployee = controller->getCurrentEmployee(); + Enums::EmployeeType employeeType; + Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; + if (index > 0 && index < shortlistedCandidates.size()) + { + employeeType = getEmployeeType(currentEmployee->getEmployeeType()); + std::shared_ptr candidate = shortlistedCandidates[index - 1]; + switch (employeeType) + { + case Enums::EmployeeType::INVALID: + std::cout << "Invalid Choice"; + util::pressEnter(); + return; + case Enums::EmployeeType::GENERAL: + employeeDesignation = getEmployeeDesignation(); + if (employeeDesignation == Enums::EmployeeDesignation::INVALID) + { + std::cout << "Invalid Choice"; + util::pressEnter(); + return; + } + break; + } + std::cout << "Enter email: "; + util::read(email); + name = candidate->getCandidateName(); + phone = candidate->getCandidatePhone(); + controller->createEmployee(employeeType, employeeDesignation, email, name, phone); + candidate->setCandidateStatus(Enums::CandidateStatus::HIRED); + std::cout << "\nCreated Employee Successfully."; + util::pressEnter(); + } + else + { + throw std::runtime_error("Enter a valid Index."); + } +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 940333c..61d96b7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -59,6 +59,9 @@ inline void viewProfile(std::shared_ptr controller) } } +void displayCandidateDetails(const std::vector>& shorlistedCandidates); +void addShortlistedCandidateAsEmployee(const std::shared_ptr& controller); + inline void updateProfile(std::shared_ptr m_zenvyController) { int choice; @@ -223,7 +226,7 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) util::pressEnter(); } -inline void searchEmployee(std::shared_ptr& m_zenvyController) +inline void searchEmployee(std::shared_ptr m_zenvyController) { std::string name; util::clear(); From f15d5b7f1df2913f3e03182ce8c18b92887bca9e Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Tue, 14 Apr 2026 18:32:02 +0530 Subject: [PATCH 05/10] Updates based on comments EMP012 : Add Shorlisted Candidates As Employee - Added clear method to clear console before displaying candidate details in MenuHelper.cpp - Removed spaces in MenuHelper.h Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index a88989c..d1d4ba3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -125,6 +125,7 @@ void createEmployee(std::shared_ptr controller) void displayCandidateDetails(const std::vector>& shorlistedCandidates) { + util::clear(); std::cout << std::left << std::setw(10) << "Index" << std::setw(10) << "ID" From 7351186baf7251c287353275885793a4668626dd Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Thu, 16 Apr 2026 10:05:19 +0530 Subject: [PATCH 06/10] Refactor shortlisted candidates access and fix index check EMP0012 : Employee Management - Changed getShorlistedCandidates() to return by value instead of reference - Updated controller and service method signatures accordingly - Fixed off-by-one error when selecting shortlisted candidate Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h | 2 +- .../Trenser.Zenvy/services/EmployeeManagementService.cpp | 2 +- .../Trenser.Zenvy/services/EmployeeManagementService.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 1f095ee..ee04e1c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -47,7 +47,7 @@ bool ZenvyController::updateDesignation(const std::string& id,Enums::EmployeeDes return m_employeeManagementService->updateDesignation(id,designation); } -std::vector>& ZenvyController::getShorlistedCandidates() +std::vector> ZenvyController::getShorlistedCandidates() { return m_employeeManagementService->getShorlistedCandidates(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 78b3123..0fbe2b8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -51,7 +51,7 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); bool updateDesignation(const std::string&,Enums::EmployeeDesignation); - std::vector>& getShorlistedCandidates(); + std::vector> getShorlistedCandidates(); template Employees getEmployees(Types ...types) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index d9add47..855e445 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -236,7 +236,7 @@ void EmployeeManagementService::saveEmployees() generalEmployeeFileManager.save(generalEmployees); } -std::vector>& EmployeeManagementService::getShorlistedCandidates() +std::vector> EmployeeManagementService::getShorlistedCandidates() { candidateMap candidates = m_dataStore.getCandidates(); std::vector> shortlistedCandidates; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 4cd2da2..a292c31 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -21,7 +21,7 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); - std::vector>& getShorlistedCandidates(); + std::vector> getShorlistedCandidates(); void loadEmployees(); void saveEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index d1d4ba3..bba68d0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -166,7 +166,7 @@ void addShortlistedCandidateAsEmployee(const std::shared_ptr& c auto currentEmployee = controller->getCurrentEmployee(); Enums::EmployeeType employeeType; Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; - if (index > 0 && index < shortlistedCandidates.size()) + if (index > 0 && index <= shortlistedCandidates.size()) { employeeType = getEmployeeType(currentEmployee->getEmployeeType()); std::shared_ptr candidate = shortlistedCandidates[index - 1]; From 72e7db04a501b10cde50fe2b7aad90e0b2ebab11 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Thu, 16 Apr 2026 10:26:54 +0530 Subject: [PATCH 07/10] Fix HR Manager menu option ordering and switch mapping EMP012 : Employee Management - Updated HR Manager menu text to remove obsolete options - Reordered menu items to match current functionality Smitha Mohan --- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 580cf89..28dec14 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. Update Designation\n16. Add Shortlisted Candidate as Employee\n17. 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. Update Profile\n12. Deactivate Employee\n13. View Profile\n14. Update Designation\n15. Add Shortlisted Candidate as Employee\n16. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -41,22 +41,22 @@ bool HRManagerMenu::handleOperation(int choice) case 8: createEmployee(m_zenvyController); break; - case 12: + case 11: updateProfile(m_zenvyController); break; - case 13: + case 12: deactivateEmployee(m_zenvyController); break; - case 14: + case 13: viewProfile(m_zenvyController); break; - case 15: + case 14: updateDesignation(m_zenvyController); break; - case 16: + case 15: addShortlistedCandidateAsEmployee(m_zenvyController); break; - case 17: + case 16: return false; default: std::cout << "Enter a valid choice!" << std::endl; From b9b83ad42938f8a3aa86966182af08942cf27f91 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Tue, 14 Apr 2026 18:11:29 +0530 Subject: [PATCH 08/10] Add View Payslip feature for employees EMP010 : View Payslip - Added Timestamp support to Payroll and Payslip models - Implemented getPayslipForMonth flow from Controller to Service - Enabled payslip retrieval based on year and month - Updated menus to allow payslip viewing - Enhanced MenuHelper with a unified viewPayslip helper - Added date-based filtering using Timestamp utilities Smitha Mohan --- .../controllers/ZenvyController.cpp | 8 ++++ .../controllers/ZenvyController.h | 2 + .../Trenser.Zenvy/models/Payroll.cpp | 5 +-- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 2 + .../services/PayslipManagementService.cpp | 24 +++++++++++ .../services/PayslipManagementService.h | 2 + .../Trenser.Zenvy/utilities/Timestamp.cpp | 15 +++++++ .../Trenser.Zenvy/utilities/Timestamp.h | 3 ++ .../Trenser.Zenvy/views/EmployeeMenu.cpp | 10 ++--- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 3 ++ .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 3 ++ .../Trenser.Zenvy/views/MenuHelper.h | 41 ++++++++++++++++++- .../views/TalentExecutiveMenu.cpp | 3 ++ .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 3 ++ .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 3 ++ 15 files changed, 118 insertions(+), 9 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index ee04e1c..bbf0272 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -76,3 +76,11 @@ void ZenvyController::persistStates() m_payslipManagementService->savePayrolls(); m_payslipManagementService->savePayslips(); } + +std::pair, std::shared_ptr> +ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) +{ + return m_payslipManagementService->getPayslipForMonth(employeeId, month, year); +} + + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 0fbe2b8..3d0190e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -62,6 +62,8 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); + std::pair, std::shared_ptr> + getPayslipForMonth(const std::string&, int, int); //File Management void loadStates(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index b145a4f..b85153b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -19,7 +19,7 @@ Payroll::Payroll(const std::string& id, m_houseRentAllowance(houseRentAllowance), m_foodAllowance(foodAllowance), m_employeePFContribution(employeePFContribution), - m_employerPFContribution(employerPFContribution) + m_employerPFContribution(employerPFContribution) { int idNumber = util::extractNumber(m_id); if (idNumber > m_uid) @@ -118,7 +118,6 @@ std::shared_ptr Payroll::deserialize(const std::string& record) std::getline(serializedPayroll, foodAllowanceString, ','); std::getline(serializedPayroll, employeePFString, ','); std::getline(serializedPayroll, employerPFString, ','); - try { double basicSalary = std::stod(basicSalaryString); @@ -145,4 +144,4 @@ std::shared_ptr Payroll::deserialize(const std::string& record) std::string Payroll::getHeaders() { return "PayrollId,EmployeeId,BasicSalary,HouseRentAllowance,FoodAllowance,EmployeePFContribution,EmployerPFContribution"; -} \ No newline at end of file +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index cd747ed..460c596 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include "Timestamp.h" class Payroll { @@ -13,6 +14,7 @@ private: double m_foodAllowance; double m_employeePFContribution; double m_employerPFContribution; + util::Timestamp m_timestamp; public: Payroll() : m_id("PR" + std::to_string(++m_uid)), diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 0d43120..c889143 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -87,6 +87,30 @@ void PayslipManagementService::savePayrolls() payrollFileManager.save(payrolls); } +std::pair, std::shared_ptr> +PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) +{ + auto& payrolls = m_dataStore.getPayrolls(); + auto& payslips = m_dataStore.getPayslips(); + for (const auto& payrollsPair : payrolls) + { + const auto& payroll = payrollsPair.second; + if (payroll->getEmployeeId() == employeeId) + { + auto iterator = payslips.find(payroll->getId()); + if (iterator != payslips.end()) + { + const auto& payslip = iterator->second; + if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) + { + return { payroll, payslip }; + } + } + } + } + return { nullptr, nullptr }; +} + void PayslipManagementService::loadPayslips() { FileManager payslipFileManager(Config::File::PAYSLIP_FILE); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 298c248..74ec3b4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -15,4 +15,6 @@ public: void savePayrolls(); void loadPayslips(); void savePayslips(); + std::pair, std::shared_ptr> + getPayslipForMonth(const std::string&, int, int); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp index 1341da9..fb9dab0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp @@ -40,6 +40,21 @@ double util::Timestamp::getDurationInSeconds(const Timestamp& startTimestamp, co return std::difftime(endTimestamp.m_time, startTimestamp.m_time); } +int util::Timestamp::getYear() const +{ + return 0; +} + +int util::Timestamp::getMonth() const +{ + return 0; +} + +int util::Timestamp::getDay() const +{ + return 0; +} + int util::Timestamp::getDateAsInt() const { std::tm timeStruct{}; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h index 8aedc35..4a130a3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h @@ -16,6 +16,9 @@ namespace util static double getDurationInHours(const Timestamp&, const Timestamp&); static double getDurationInMinutes(const Timestamp&, const Timestamp&); static double getDurationInSeconds(const Timestamp&, const Timestamp&); + int getYear() const; + int getMonth() const; + int getDay() const; int getDateAsInt() const; int getMonth() const; int getYear() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index a2f2a56..bbe9462 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -33,14 +33,14 @@ bool EmployeeMenu::handleOperation(int choice) { switch (choice) { - /* - case 1: + + /*case 1: m_zenvyController.applyLeave(); - break; + break;*/ case 2: - m_zenvyController.viewPayslip(); + viewPayslip(m_zenvyController); break; - case 3: + /*case 3: m_zenvyController.viewPayslipHistory(); break; case 4 : diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 28dec14..bcda466 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -32,6 +32,9 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index d691228..c73ceef 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool ITExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 61d96b7..0e0a129 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -296,4 +296,43 @@ 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 +} + +inline void viewPayslip(std::shared_ptr controller) +{ + int year, month; + util::clear(); + std::cout << "Enter the year: "; + util::read(year); + std::cout << "\nEnter the month: "; + util::read(month); + auto employee = controller->getCurrentEmployee(); + if (!employee) + { + std::cout << "No authenticated employee.\n"; + util::pressEnter(); + return; + } + auto result = controller->getPayslipForMonth(employee->getId(), year, month); + auto payroll = result.first; + auto payslip = result.second; + if (payroll && payslip) + { + std::cout << "\nPayslip for " << employee->getEmployeeName() + << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; + + std::cout << "Basic Salary : " << payroll->getBasicSalary() << "\n"; + std::cout << "House Rent Allowance : " << payroll->getHouseRentAllowance() << "\n"; + std::cout << "Food Allowance : " << payroll->getFoodAllowance() << "\n"; + std::cout << "Employee PF Contribution : " << payroll->getEmployeePFContribution() << "\n"; + std::cout << "Employer PF Contribution : " << payroll->getEmployerPFContribution() << "\n"; + std::cout << "----------------------------------------\n"; + std::cout << "Net Salary (after deductions): " << payslip->getSalary() << "\n"; + std::cout << "Generated on: " << payslip->getTimestamp().toString() << "\n"; + } + else + { + std::cout << "Payslip not available for " << year << "-" << month << ".\n"; + } + util::pressEnter(); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 1c28319..967c986 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool TalentExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 89ebf9d..ea03f8d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool TeamExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 0084158..3f504f5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -32,6 +32,9 @@ bool TeamLeadMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 7: viewEmployees(m_zenvyController); break; From 47ca953eacc0a227d227342cef9d4a8bb0b0c636 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Thu, 16 Apr 2026 12:07:47 +0530 Subject: [PATCH 09/10] Implement Review Fixes --- .../Trenser.Zenvy/controllers/ZenvyController.cpp | 9 +++------ .../Trenser.Zenvy/controllers/ZenvyController.h | 3 +-- .../services/PayslipManagementService.cpp | 9 ++++----- .../services/PayslipManagementService.h | 5 ++--- .../Trenser.Zenvy/utilities/Timestamp.cpp | 15 --------------- Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h | 3 --- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h | 6 ++---- 7 files changed, 12 insertions(+), 38 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index bbf0272..9207108 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -77,10 +77,7 @@ void ZenvyController::persistStates() m_payslipManagementService->savePayslips(); } -std::pair, std::shared_ptr> -ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) +std::pair, std::shared_ptr> ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) { - return m_payslipManagementService->getPayslipForMonth(employeeId, month, year); -} - - + return m_payslipManagementService->getPayslipForMonth(employeeId, year, month); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 3d0190e..261cb67 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -62,8 +62,7 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); - std::pair, std::shared_ptr> - getPayslipForMonth(const std::string&, int, int); + std::pair, std::shared_ptr>getPayslipForMonth(const std::string&, int, int); //File Management void loadStates(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index c889143..e35937d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -87,8 +87,7 @@ void PayslipManagementService::savePayrolls() payrollFileManager.save(payrolls); } -std::pair, std::shared_ptr> -PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) +std::pair, std::shared_ptr> PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) { auto& payrolls = m_dataStore.getPayrolls(); auto& payslips = m_dataStore.getPayslips(); @@ -97,10 +96,10 @@ PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int const auto& payroll = payrollsPair.second; if (payroll->getEmployeeId() == employeeId) { - auto iterator = payslips.find(payroll->getId()); - if (iterator != payslips.end()) + auto payslipIterator = payslips.find(payroll->getId()); + if (payslipIterator != payslips.end()) { - const auto& payslip = iterator->second; + const auto& payslip = payslipIterator->second; if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) { return { payroll, payslip }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 74ec3b4..843371c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -11,10 +11,9 @@ public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); + std::pair, std::shared_ptr>getPayslipForMonth(const std::string&, int, int); void loadPayrolls(); void savePayrolls(); void loadPayslips(); void savePayslips(); - std::pair, std::shared_ptr> - getPayslipForMonth(const std::string&, int, int); -}; +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp index fb9dab0..1341da9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp @@ -40,21 +40,6 @@ double util::Timestamp::getDurationInSeconds(const Timestamp& startTimestamp, co return std::difftime(endTimestamp.m_time, startTimestamp.m_time); } -int util::Timestamp::getYear() const -{ - return 0; -} - -int util::Timestamp::getMonth() const -{ - return 0; -} - -int util::Timestamp::getDay() const -{ - return 0; -} - int util::Timestamp::getDateAsInt() const { std::tm timeStruct{}; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h index 4a130a3..8aedc35 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h @@ -16,9 +16,6 @@ namespace util static double getDurationInHours(const Timestamp&, const Timestamp&); static double getDurationInMinutes(const Timestamp&, const Timestamp&); static double getDurationInSeconds(const Timestamp&, const Timestamp&); - int getYear() const; - int getMonth() const; - int getDay() const; int getDateAsInt() const; int getMonth() const; int getYear() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 0e0a129..3261460 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -318,9 +318,7 @@ inline void viewPayslip(std::shared_ptr controller) auto payslip = result.second; if (payroll && payslip) { - std::cout << "\nPayslip for " << employee->getEmployeeName() - << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; - + std::cout << "\nPayslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; std::cout << "Basic Salary : " << payroll->getBasicSalary() << "\n"; std::cout << "House Rent Allowance : " << payroll->getHouseRentAllowance() << "\n"; std::cout << "Food Allowance : " << payroll->getFoodAllowance() << "\n"; @@ -335,4 +333,4 @@ inline void viewPayslip(std::shared_ptr controller) std::cout << "Payslip not available for " << year << "-" << month << ".\n"; } util::pressEnter(); -} +} \ No newline at end of file From 04ef7744f72d86d3452079aec878cce028b2350e Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Thu, 16 Apr 2026 14:09:28 +0530 Subject: [PATCH 10/10] Fix payslip lookup logic and enable view option for finance executive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EMP010 : View Payslip - Refactored getPayslipForMonth() to fetch payroll and payslips via employee data - Added validation for invalid employee ID - Simplified payslip search using employee-specific payslip records - Enabled “View Payslip” option in Finance Executive menu - Minor UI cleanup in payslip view (spacing and screen clear) Smitha Mohan --- .../services/PayslipManagementService.cpp | 24 +++++++++---------- .../views/FinanceExecutiveMenu.cpp | 2 ++ .../Trenser.Zenvy/views/MenuHelper.h | 5 ++-- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index e35937d..7c74f9a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -89,21 +89,21 @@ void PayslipManagementService::savePayrolls() std::pair, std::shared_ptr> PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) { - auto& payrolls = m_dataStore.getPayrolls(); - auto& payslips = m_dataStore.getPayslips(); - for (const auto& payrollsPair : payrolls) + auto& employees = m_dataStore.getEmployees(); + auto employeeIterator = employees.find(employeeId); + if (employeeIterator == employees.end()) { - const auto& payroll = payrollsPair.second; - if (payroll->getEmployeeId() == employeeId) + throw std::runtime_error("Employee not found!"); + } + auto payroll = employeeIterator->second->getPayroll(); + auto& payslips = employeeIterator->second->getEmployeePayslips(); + for (const auto& payslipPair : payslips) + { + const auto& payslip = payslipPair.second; { - auto payslipIterator = payslips.find(payroll->getId()); - if (payslipIterator != payslips.end()) + if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) { - const auto& payslip = payslipIterator->second; - if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) - { - return { payroll, payslip }; - } + return { payroll, payslip }; } } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 74aadbc..2ee8c75 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -65,6 +65,8 @@ bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 3261460..ab35efa 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -304,7 +304,7 @@ inline void viewPayslip(std::shared_ptr controller) util::clear(); std::cout << "Enter the year: "; util::read(year); - std::cout << "\nEnter the month: "; + std::cout << "Enter the month: "; util::read(month); auto employee = controller->getCurrentEmployee(); if (!employee) @@ -318,7 +318,8 @@ inline void viewPayslip(std::shared_ptr controller) auto payslip = result.second; if (payroll && payslip) { - std::cout << "\nPayslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; + util::clear(); + std::cout << "Payslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; std::cout << "Basic Salary : " << payroll->getBasicSalary() << "\n"; std::cout << "House Rent Allowance : " << payroll->getHouseRentAllowance() << "\n"; std::cout << "Food Allowance : " << payroll->getFoodAllowance() << "\n";