diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index aced692..9207108 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -42,6 +42,16 @@ 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); +} + +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) { @@ -66,3 +76,8 @@ 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, 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 56140de..261cb67 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -50,6 +50,8 @@ 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); + std::vector> getShorlistedCandidates(); template Employees getEmployees(Types ...types) @@ -60,6 +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); //File Management void loadStates(); 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/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/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/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 5f639da..855e445 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> employees = m_dataStore.getEmployees(); + auto employeeIterator = employees.find(id); + if (employeeIterator == employees.end()) + { + return false; + } + auto generalEmployee = std::dynamic_pointer_cast((*employeeIterator).second); + if (generalEmployee) + { + generalEmployee->setDesignation(designation); + } + return true; +} + std::shared_ptr EmployeeManagementService::getCurrentEmployee() { return m_dataStore.getAuthenticatedEmployee(); @@ -217,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 4551b6f..a292c31 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -17,9 +17,11 @@ 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(); + std::vector> getShorlistedCandidates(); void loadEmployees(); void saveEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 0d43120..7c74f9a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -87,6 +87,29 @@ void PayslipManagementService::savePayrolls() payrollFileManager.save(payrolls); } +std::pair, std::shared_ptr> PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) +{ + auto& employees = m_dataStore.getEmployees(); + auto employeeIterator = employees.find(employeeId); + if (employeeIterator == employees.end()) + { + 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; + { + 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 9b8d372..cf72793 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -13,8 +13,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(); -}; +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index b4de6f3..0ac464a 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 6c3c0d5..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. 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)) { @@ -48,6 +48,12 @@ bool AdminMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 6: + 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/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 9239fca..f6bafd2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -33,24 +33,12 @@ bool EmployeeMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; case 2: m_zenvyController.viewPayslip(); - break;*/ + break; case 3: viewPayslipHistory(m_zenvyController); break; - /*case 4 : - m_zenvyController.raiseTicket(); - break; - case 5 : - m_zenvyController.viewTicket(); - break; - case 6: - m_zenvyController.viewTicketHistory(); - break;*/ case 7: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 5fbb32f..2bfd221 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -65,6 +65,9 @@ bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 3: viewPayslipHistory(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 0ae8a81..8c76ecb 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. 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)) { @@ -32,6 +32,9 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 3: viewPayslipHistory(m_zenvyController); break; @@ -44,16 +47,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 14: + updateDesignation(m_zenvyController); + break; case 15: + addShortlistedCandidateAsEmployee(m_zenvyController); + break; + case 16: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index 161ec9d..cdc1c74 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 3: viewPayslipHistory(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 37da2d2..bba68d0 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) { @@ -102,3 +102,101 @@ 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 << "Assigned Employee Role Successfully\n"; + util::pressEnter(); + } + else + { + std::cout << "Employee not found\n"; + util::pressEnter(); + } +} + +void displayCandidateDetails(const std::vector>& shorlistedCandidates) +{ + util::clear(); + 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 0ceac6e..35c7ddb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -16,6 +16,7 @@ #include "Validator.h" void createEmployee(std::shared_ptr controller); +void updateDesignation(std::shared_ptr m_zenvyController); inline void viewPayslipHistory(std::shared_ptr controller) { @@ -87,6 +88,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; @@ -163,14 +167,28 @@ 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 + 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()) - << std::endl; + << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()); + if (generalEmployee) + { + std::cout << std::left + << std::setw(20) << Enums::getEmployeeDesignationString(generalEmployee->getDesignation()) + << std::endl; + } + else + { + std::cout << std::left + << std::setw(20) << "NULL" + << std::endl; + } } std::cout << "Enter the Index: "; util::read(choice); @@ -192,7 +210,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(); @@ -237,15 +255,15 @@ 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(); - 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" @@ -267,10 +285,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() @@ -286,8 +304,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 @@ -299,12 +317,50 @@ 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(); } + +inline void viewPayslip(std::shared_ptr controller) +{ + int year, month; + util::clear(); + std::cout << "Enter the year: "; + util::read(year); + std::cout << "Enter 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) + { + 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"; + 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(); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 4e52414..e82c9df 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 3: viewPayslipHistory(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 8a67820..78f06a0 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 3: viewPayslipHistory(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 7f5af31..740d7c7 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 3: viewPayslipHistory(m_zenvyController); break;