Merged PR 935: UserStory EMP006 Search Employee

Related work items: #951
This commit is contained in:
Ajmal Jalaludeen
2026-04-13 17:24:07 +05:30
committed by Joel Thomas
15 changed files with 148 additions and 206 deletions
@@ -32,6 +32,11 @@ void ZenvyController::updateProfile(const std::string& name, const std::string&
m_employeeManagementService->updateProfile(name,phone); m_employeeManagementService->updateProfile(name,phone);
} }
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> ZenvyController::searchEmployee(const std::string& name)
{
return m_employeeManagementService->searchEmployee(name);
}
void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution)
{ {
m_payslipManagementService->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); m_payslipManagementService->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution);
@@ -50,6 +50,7 @@ public:
Employees getEmployees(); Employees getEmployees();
std::shared_ptr<const Employee> getCurrentEmployee(); std::shared_ptr<const Employee> getCurrentEmployee();
void updateProfile(const std::string&,const std::string&); void updateProfile(const std::string&,const std::string&);
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> searchEmployee(const std::string&);
//Payslip management //Payslip management
void updateSalary(const std::string&, double, double, double, double, double); void updateSalary(const std::string&, double, double, double, double, double);
@@ -112,7 +112,6 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType,
m_dataStore.getPayrolls().emplace(std::make_pair(payroll->getId(), payroll)); m_dataStore.getPayrolls().emplace(std::make_pair(payroll->getId(), payroll));
m_dataStore.getEmployees().emplace(std::make_pair(employee->getId(), employee)); m_dataStore.getEmployees().emplace(std::make_pair(employee->getId(), employee));
} }
bool EmployeeManagementService::deactivateEmployee(const std::string& id) bool EmployeeManagementService::deactivateEmployee(const std::string& id)
{ {
auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee();
@@ -161,6 +160,34 @@ void EmployeeManagementService::updateProfile(const std::string& name,const std:
employee->setEmployeePhone(phone); employee->setEmployeePhone(phone);
} }
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> EmployeeManagementService::searchEmployee(const std::string& name)
{
std::shared_ptr<Employee> currentUser = m_dataStore.getAuthenticatedEmployee();
Enums::EmployeeType employeeType = currentUser->getEmployeeType();
employeeMap& employees = m_dataStore.getEmployees();
std::vector<std::shared_ptr<const Employee>> employeeList;
if (employees.empty())
{
return std::make_pair(employeeType, employeeList);
}
for (const auto& employeePair : employees) {
const auto& employee = employeePair.second;
if (!employee)
{
continue;
}
std::string employeeName = employee->getEmployeeName();
std::transform(employeeName.begin(), employeeName.end(), employeeName.begin(), ::tolower);
std::string searchName = name;
std::transform(searchName.begin(), searchName.end(), searchName.begin(), ::tolower);
if (employeeName.find(searchName) != std::string::npos)
{
employeeList.push_back(employee);
}
}
return { employeeType, employeeList };
}
void EmployeeManagementService::loadEmployees() void EmployeeManagementService::loadEmployees()
{ {
FileManager<Employee> employeeFileManager(Config::File::EMPLOYEES_FILE); FileManager<Employee> employeeFileManager(Config::File::EMPLOYEES_FILE);
@@ -1,6 +1,8 @@
#pragma once #pragma once
#include <vector> #include <vector>
#include <tuple> #include <tuple>
#include <algorithm>
#include <utility>
#include "DataStore.h" #include "DataStore.h"
#include "Enums.h" #include "Enums.h"
@@ -16,6 +18,7 @@ public:
bool deactivateEmployee(const std::string&); bool deactivateEmployee(const std::string&);
Employees getEmployees(); Employees getEmployees();
void updateProfile(const std::string&,const std::string&); void updateProfile(const std::string&,const std::string&);
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> searchEmployee(const std::string&);
std::shared_ptr<const Employee> getCurrentEmployee(); std::shared_ptr<const Employee> getCurrentEmployee();
void loadEmployees(); void loadEmployees();
void saveEmployees(); void saveEmployees();
@@ -159,6 +159,17 @@ namespace Enums {
} }
} }
inline std::string getCandidateStatusString(CandidateStatus status)
{
switch (status)
{
case CandidateStatus::PENDING: return "Pending";
case CandidateStatus::SHORTLISTED: return "Shortlisted";
case CandidateStatus::REJECTED: return "Rejected";
default: return "Unknown";
}
}
inline AccountStatus getAccountStatus(const std::string& input) inline AccountStatus getAccountStatus(const std::string& input)
{ {
if (input == "ACTIVE") if (input == "ACTIVE")
@@ -1,5 +1,4 @@
#pragma once #pragma once
#include <iostream> #include <iostream>
#include <limits> #include <limits>
#include <string> #include <string>
@@ -41,6 +41,9 @@ bool AdminMenu::handleOperation(int choice)
case 3: case 3:
deactivateEmployee(m_zenvyController); deactivateEmployee(m_zenvyController);
break; break;
case 4:
searchEmployee(m_zenvyController);
break;
case 5: case 5:
updateProfile(m_zenvyController); updateProfile(m_zenvyController);
break; break;
@@ -55,24 +55,9 @@ bool EmployeeMenu::handleOperation(int choice)
case 7: case 7:
viewEmployees(m_zenvyController); viewEmployees(m_zenvyController);
break; break;
/*case 8: case 8:
m_zenvyController.searchEmployee(); searchEmployee(m_zenvyController);
break; break;
case 9:
m_zenvyController.viewTeamMembers();
break;
case 10:
m_zenvyController.bookMeetingRoom();
break;
case 11:
m_zenvyController.viewBookingHistory();
break;
case 12:
m_zenvyController.viewNotifications();
break;
case 13:
m_zenvyController.viewAnnouncements();
break;*/
case 14: case 14:
updateProfile(m_zenvyController); updateProfile(m_zenvyController);
break; break;
@@ -58,33 +58,12 @@ bool FinanceExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
//case 1:
// m_zenvyController.applyLeave();
// break;
//case 2:
// m_zenvyController.viewPayslip();
// break;
//case 3:
// m_zenvyController.viewPayslipHistory();
// break;
case 4: case 4:
viewEmployees(m_zenvyController); viewEmployees(m_zenvyController);
break; break;
//case 5: case 5:
// m_zenvyController.searchEmployee(); searchEmployee(m_zenvyController);
// break; break;
//case 6:
// m_zenvyController.viewNotifications();
// break;
//case 7:
// m_zenvyController.viewAnnouncements();
// break;
//case 8:
// m_zenvyController.resolveTicket();
// break;
//case 9:
// m_zenvyController.generatePayslip();
// break;
case 10: case 10:
updatePayroll(); updatePayroll();
break; break;
@@ -32,39 +32,15 @@ bool HRManagerMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
//case 1:
// m_zenvyController.applyLeave();
// break;
//case 2:
// m_zenvyController.viewPayslip();
// break;
//case 3:
// m_zenvyController.viewPayslipHistory();
// break;
case 4: case 4:
viewEmployees(m_zenvyController); viewEmployees(m_zenvyController);
break; break;
//case 5: case 5:
// m_zenvyController.searchEmployee(); searchEmployee(m_zenvyController);
// break; break;
//case 6:
// m_zenvyController.viewNotifications();
// break;
//case 7:
// m_zenvyController.viewAnnouncements();
// break;
case 8: case 8:
createEmployee(m_zenvyController); createEmployee(m_zenvyController);
break; break;
//case 9:
// m_zenvyController.regularizeAttenance();
// break;
//case 10:
// m_zenvyController.updateLeaveRequest();
// break;
//case 11:
// m_zenvyController.registercandidateAsEmployee();
// break;
case 12: case 12:
updateProfile(m_zenvyController); updateProfile(m_zenvyController);
break; break;
@@ -32,30 +32,12 @@ bool ITExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1:
m_zenvyController.applyLeave();
break;
case 2:
m_zenvyController.viewPayslip();
break;
case 3:
m_zenvyController.viewPayslipHistory();
break;*/
case 4: case 4:
viewEmployees(m_zenvyController); viewEmployees(m_zenvyController);
break; break;
/*case 5: case 5:
m_zenvyController.searchEmployee(); searchEmployee(m_zenvyController);
break; break;
case 6:
m_zenvyController.viewNotifications();
break;
case 7:
m_zenvyController.viewAnnouncements();
break;
case 8:
m_zenvyController.resolveTicket();
break;*/
case 9: case 9:
updateProfile(m_zenvyController); updateProfile(m_zenvyController);
break; break;
+76 -3
View File
@@ -4,13 +4,14 @@
#include <vector> #include <vector>
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <utility>
#include "Enums.h"
#include"InputHelper.h"
#include"OutputHelper.h"
#include "Employee.h" #include "Employee.h"
#include "ZenvyController.h" #include "ZenvyController.h"
#include "MenuHelper.h" #include "MenuHelper.h"
#include "InputHelper.h"
#include "OutputHelper.h"
#include "Validator.h" #include "Validator.h"
#include "Enums.h"
void createEmployee(std::shared_ptr<ZenvyController> controller); void createEmployee(std::shared_ptr<ZenvyController> controller);
@@ -152,3 +153,75 @@ inline void viewEmployees(std::shared_ptr<ZenvyController> m_zenvyController)
} }
util::pressEnter(); util::pressEnter();
} }
inline void searchEmployee(std::shared_ptr<ZenvyController>& m_zenvyController)
{
std::string name;
util::clear();
std::cout << "Enter Employee Name: ";
util::read(name);
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> searchResults = m_zenvyController->searchEmployee(name);
if (!(searchResults.second).empty())
{
std::cout << std::left
<< std::setw(10) << "ID"
<< std::setw(20) << "Name"
<< std::setw(25) << "Email"
<< std::setw(15) << "Phone"
<< std::setw(20) << "Type"
<< std::setw(20) << "TeamStatus"
<< std::setw(15) << "TeamID";
if (searchResults.first == Enums::EmployeeType::FINANCE
|| searchResults.first == Enums::EmployeeType::HR
|| searchResults.first == Enums::EmployeeType::ADMIN)
{
std::cout << std::left
<< std::setw(17) << "PayrollID"
<< std::setw(20) << "BasicSalary"
<< std::setw(15) << "EmployeePF"
<< std::setw(15) << "EmployerPF"
<< std::setw(15) << "FoodAllowance"
<< std::setw(15) << "HouseRentAllowance";
}
std::cout << std::endl;
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()
<< std::setw(25) << employee->getEmployeeEmail()
<< std::setw(15) << employee->getEmployeePhone()
<< std::setw(20) << Enums::getEmployeeTypeString(employee->getEmployeeType())
<< std::setw(20) << Enums::getTeamStatusString(employee->getEmployeeTeamStatus());
if (employee->getEmployeeTeamId() == "")
{
std::cout << std::setw(15) << "NULL";
}
else
{
std::cout << std::setw(15) << employee->getEmployeeTeamId();
}
if (searchResults.first == Enums::EmployeeType::FINANCE
|| searchResults.first == Enums::EmployeeType::HR
|| searchResults.first == Enums::EmployeeType::ADMIN)
{
std::cout << std::left
<< std::setw(17) << employee->getPayroll()->getId()
<< std::setw(20) << employee->getPayroll()->getBasicSalary()
<< std::setw(15) << employee->getPayroll()->getEmployeePFContribution()
<< std::setw(15) << employee->getPayroll()->getEmployerPFContribution()
<< std::setw(15) << employee->getPayroll()->getFoodAllowance()
<< std::setw(15) << employee->getPayroll()->getHouseRentAllowance();
}
std::cout << std::endl;
}
}
}
else
{
std::cout << "No Employee found with this name" << std::endl;
}
util::pressEnter();
}
@@ -32,42 +32,12 @@ bool TalentExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
//case 1:
// m_zenvyController.applyLeave();
// break;
//case 2:
// m_zenvyController.viewPayslip();
// break;
//case 3:
// m_zenvyController.viewPayslipHistory();
// break;
case 4: case 4:
viewEmployees(m_zenvyController); viewEmployees(m_zenvyController);
break; break;
//case 5: case 5:
// m_zenvyController.searchEmployee(); searchEmployee(m_zenvyController);
// break; break;
//case 6:
// m_zenvyController.viewNotifications();
// break;
//case 7:
// m_zenvyController.viewAnnouncements();
// break;
//case 8:
// m_zenvyController.createNewJob();
// break;
//case 9:
// m_zenvyController.viewJobOpenings();
// break;
//case 10:
// m_zenvyController.addCandidate();
// break;
//case 11:
// m_zenvyController.updateCandidateStatus();
// break;
//case 12:
// m_zenvyController.viewShortlistedCandidates();
// break;
case 13: case 13:
updateProfile(m_zenvyController); updateProfile(m_zenvyController);
break; break;
@@ -78,4 +48,4 @@ bool TalentExecutiveMenu::handleOperation(int choice)
util::pressEnter(); util::pressEnter();
} }
return true; return true;
} }
@@ -32,45 +32,12 @@ bool TeamExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
//case 1:
// m_zenvyController.applyLeave();
// break;
//case 2:
// m_zenvyController.viewPayslip();
// break;
//case 3:
// m_zenvyController.viewPayslipHistory();
// break;
case 4: case 4:
viewEmployees(m_zenvyController); viewEmployees(m_zenvyController);
break; break;
//case 5: case 5:
// m_zenvyController.searchEmployee(); searchEmployee(m_zenvyController);
// break; break;
//case 6:
// m_zenvyController.viewNotifications();
// break;
//case 7:
// m_zenvyController.viewAnnouncements();
// break;
//case 8:
// m_zenvyController.createTeam();
// break;
//case 9:
// m_zenvyController.updateTeam();
// break;
//case 10:
// m_zenvyController.removeTeam();
// break;
//case 11:
// m_zenvyController.assignEmployee();
// break;
//case 12:
// m_zenvyController.unassignEmployee();
// break;
//case 13:
// m_zenvyController.viewTeams();
// break;
case 14: case 14:
updateProfile(m_zenvyController); updateProfile(m_zenvyController);
break; break;
@@ -81,4 +48,4 @@ bool TeamExecutiveMenu::handleOperation(int choice)
util::pressEnter(); util::pressEnter();
} }
return true; return true;
} }
@@ -32,51 +32,12 @@ bool TeamLeadMenu::handleOperation(int choice)
{ {
switch (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.raiseTicket();
break;
case 5:
m_zenvyController.viewTicket();
break;
case 6:
m_zenvyController.viewTicketHistory();
break;*/
case 7: case 7:
viewEmployees(m_zenvyController); viewEmployees(m_zenvyController);
break; break;
/*case 8: case 8:
m_zenvyController.searchEmployee(); searchEmployee(m_zenvyController);
break; break;
case 9:
m_zenvyController.viewTeamMembers();
break;
case 10:
m_zenvyController.bookMeetingRoom();
break;
case 11:
m_zenvyController.viewBookingHistory();
break;
case 12:
m_zenvyController.viewNotifications();
break;
case 13:
m_zenvyController.viewAnnouncements();
break;
case 14:
m_zenvyController.regularizeAttendance();
break;
case 15:
m_zenvyController.updateLeaveRequest();
break;*/
case 16: case 16:
updateProfile(m_zenvyController); updateProfile(m_zenvyController);
break; break;
@@ -87,4 +48,4 @@ bool TeamLeadMenu::handleOperation(int choice)
util::pressEnter(); util::pressEnter();
} }
return true; return true;
} }