diff --git a/.gitignore b/.gitignore index 47a94ef..fe37065 100644 --- a/.gitignore +++ b/.gitignore @@ -426,3 +426,6 @@ FodyWeavers.xsd *.msix *.msm *.msp + +# CSV Files +*.csv diff --git a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp new file mode 100644 index 0000000..8697eb3 --- /dev/null +++ b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp @@ -0,0 +1,27 @@ +#include "pch.h" +#include "FileIO.h" + +std::vector FileIO::readAllLines(const std::string& path) +{ + std::ifstream file(path); + if (!file.is_open()) + { + std::ofstream newFile(path); + newFile.close(); + file.open(path); + } std::vector lines; + std::string line; + while (std::getline(file, line)) + lines.push_back(line); + return lines; +} + +void FileIO::writeAllLines(const std::string& path, + const std::vector& lines) +{ + std::ofstream file(path, std::ios::trunc); + if (!file.is_open()) + throw std::runtime_error("Failed to open file " + path); + for (const auto& line : lines) + file << line << '\n'; +} diff --git a/Trenser.FileManager/Trenser.FileManager/FileIO.h b/Trenser.FileManager/Trenser.FileManager/FileIO.h new file mode 100644 index 0000000..c628003 --- /dev/null +++ b/Trenser.FileManager/Trenser.FileManager/FileIO.h @@ -0,0 +1,18 @@ +#pragma once +#include +#include +#include +#include +#include + +#ifdef TRENSERFILEMANAGER_EXPORTS +#define TRENSERFILEMANAGER_API __declspec(dllexport) +#else +#define TRENSERFILEMANAGER_API __declspec(dllimport) +#endif + +class TRENSERFILEMANAGER_API FileIO { +public: + static std::vector readAllLines(const std::string& path); + static void writeAllLines(const std::string& path, const std::vector& lines); +}; diff --git a/Trenser.FileManager/Trenser.FileManager/FileManager.h b/Trenser.FileManager/Trenser.FileManager/FileManager.h new file mode 100644 index 0000000..1c9f3b2 --- /dev/null +++ b/Trenser.FileManager/Trenser.FileManager/FileManager.h @@ -0,0 +1,52 @@ +#pragma once +#include +#include "FileIO.h" + +template using objects = std::map>; + +template +class FileManager +{ +private: + std::string m_filePath; +public: + FileManager() : m_filePath("") {} + FileManager(const std::string& filePath) : m_filePath(filePath) {} + objects load(); + void save(const objects&); +}; + +template +objects FileManager::load() +{ + objects records; + auto lines = FileIO::readAllLines(m_filePath); + bool isHeader = true; + for (const auto& record : lines) + { + if (isHeader) + { + isHeader = false; + continue; + } + auto object = T::deserialize(record); + if (!object) + { + throw std::runtime_error("Failed to deserialize record"); + } + records[object->getId()] = object; + } + return records; +} + +template +void FileManager::save(const objects& records) +{ + std::vector lines; + lines.push_back(T::getHeaders()); + for (const auto& recordPair : records) + { + lines.push_back(recordPair.second->serialize()); + } + FileIO::writeAllLines(m_filePath, lines); +} diff --git a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj index c7c45c3..7511f8e 100644 --- a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj +++ b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj @@ -135,11 +135,14 @@ + + + Create Create diff --git a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters index 1e57c7b..8faaab1 100644 --- a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters +++ b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters @@ -21,6 +21,12 @@ Header Files + + Header Files + + + Header Files + @@ -29,5 +35,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/Trenser.FileManager/Trenser.FileManager/pch.h b/Trenser.FileManager/Trenser.FileManager/pch.h index 885d5d6..a4ee448 100644 --- a/Trenser.FileManager/Trenser.FileManager/pch.h +++ b/Trenser.FileManager/Trenser.FileManager/pch.h @@ -9,5 +9,10 @@ // add headers that you want to pre-compile here #include "framework.h" +#include +#include +#include +#include +#include #endif //PCH_H diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp index 4413069..9c953a9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp @@ -1,4 +1,5 @@ #include "UserInterface.h" +#include "FileManager.h" int main() { UserInterface userInterFace; diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index 3116d41..f3f2e5f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -102,12 +102,17 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - $(ProjectDir)models;$(ProjectDir)controllers;$(ProjectDir)services;$(ProjectDir)utilities;$(ProjectDir)factories;$(ProjectDir)datastores;$(ProjectDir)views;%(AdditionalIncludeDirectories) + $(ProjectDir)models;$(ProjectDir)controllers;$(ProjectDir)services;$(ProjectDir)utilities;$(ProjectDir)factories;$(ProjectDir)datastores;$(ProjectDir)views;%(AdditionalIncludeDirectories);..\..\Trenser.FileManager\Trenser.FileManager Console true + ..\..\Trenser.FileManager\$(IntDir);%(AdditionalLibraryDirectories) + Trenser.FileManager.lib;%(AdditionalDependencies) + + xcopy /y /d "..\..\Trenser.FileManager\$(IntDir)Trenser.FileManager.dll" "$(OutDir)" + @@ -117,11 +122,17 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + ;..\..\Trenser.FileManager\Trenser.FileManager Console true + ..\..\Trenser.FileManager\$(IntDir);%(AdditionalLibraryDirectories) + Trenser.FileManager.lib;%(AdditionalDependencies) + + xcopy /y /d "..\..\Trenser.FileManager\$(IntDir)Trenser.FileManager.dll" "$(OutDir)" + @@ -162,9 +173,11 @@ + + @@ -213,9 +226,11 @@ + + diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters index 0def00c..1c6dff6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters @@ -195,6 +195,12 @@ Views + + Services + + + Utilities + @@ -344,6 +350,12 @@ Views + + Services + + + Utilities + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index f02f774..bc34097 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -17,9 +17,9 @@ void ZenvyController::changePassword(const std::string& password) } //Employee Management -void ZenvyController::createEmployee(Enums::EmployeeType employeeType, const std::string& email, const std::string& password, const std::string& name, const std::string& phone) +void ZenvyController::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { - m_employeeManagementService->createEmployee(employeeType, email, password, name, phone); + m_employeeManagementService->createEmployee(employeeType, employeeDesignation, email, name, phone); } bool ZenvyController::deactivateEmployee(const std::string& id) @@ -27,15 +27,39 @@ bool ZenvyController::deactivateEmployee(const std::string& id) return m_employeeManagementService->deactivateEmployee(id); } +void ZenvyController::updateProfile(const std::string& name, const std::string& phone) +{ + m_employeeManagementService->updateProfile(name,phone); +} + std::pair>> ZenvyController::searchEmployee(const std::string& name) { - m_employeeManagementService->searchEmployee(name); + return m_employeeManagementService->searchEmployee(name); +} + +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); +} + +std::shared_ptr ZenvyController::getCurrentEmployee() +{ + return m_employeeManagementService->getCurrentEmployee(); } Employees ZenvyController::getEmployees() { + return m_employeeManagementService->getEmployees(); } -std::shared_ptr ZenvyController::getEmployee(const std::string& id) +void ZenvyController::loadStates() { + m_employeeManagementService->loadEmployees(); + m_payslipManagementService->loadPayrolls(); +} + +void ZenvyController::persistStates() +{ + m_employeeManagementService->saveEmployees(); + m_payslipManagementService->savePayrolls(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 2c8a260..424e386 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -45,9 +45,17 @@ public: void changePassword(const std::string&); //Employee Management - void createEmployee(Enums::EmployeeType, const std::string&, const std::string&, const std::string&, const std::string&); + void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); Employees getEmployees(); - std::shared_ptr getEmployee(const std::string&); + std::shared_ptr getCurrentEmployee(); + void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); + + //Payslip management + void updateSalary(const std::string&, double, double, double, double, double); + + //File Management + void loadStates(); + void persistStates(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index e4f3c0c..dadcfdc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -27,8 +27,7 @@ employeeMap& DataStore::getEmployees() return m_employees; } -std::shared_ptr& DataStore::getAuthenticatedUser() +payrollMap& DataStore::getPayrolls() { - return m_authenticatedEmployee; + return m_payrolls; } - diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index 5ecfb70..d05d5f4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -18,8 +18,10 @@ #include "Notification.h" #include "Announcement.h" #include "Faq.h" +#include "Payroll.h" using employeeMap = std::map>; +using payrollMap = std::map>; using logMap = std::map>; class DataStore @@ -27,6 +29,7 @@ class DataStore private: std::shared_ptr m_authenticatedEmployee; employeeMap m_employees; + payrollMap m_payrolls; logMap m_logs; DataStore() = default; public: @@ -36,7 +39,7 @@ public: DataStore(DataStore&&) = delete; DataStore& operator=(DataStore&&) = delete; employeeMap& getEmployees(); - std::shared_ptr& getAuthenticatedUser(); + payrollMap& getPayrolls(); logMap& getLogs(); std::shared_ptr& getAuthenticatedEmployee(); void setAuthenticatedEmployee(std::shared_ptr < Employee>); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h index 5233d8d..c483a61 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h @@ -3,15 +3,30 @@ class Admin : public Employee { +public: Admin() = default; Admin( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::ADMIN, payroll) {}; + Admin(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::ADMIN, + accountStatus) {} ~Admin() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp index 2b61e80..403222b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp @@ -1,6 +1,6 @@ #include "Announcement.h" -int Announcement::m_anid = 0; +int Announcement::m_uid = 0; const std::string& Announcement::getAnnouncementId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h index 5d69bdb..5c46514 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h @@ -5,14 +5,14 @@ class Announcement { private: - static int m_anid; + static int m_uid; std::string m_id; util::Timestamp m_timestamp; std::string m_message; public: - Announcement() : m_id("AN" + std::to_string(++m_anid)), m_timestamp(), m_message("") {} + Announcement() : m_id("AN" + std::to_string(++m_uid)), m_timestamp(), m_message("") {} Announcement(const std::string& message) - : m_id("AN" + std::to_string(++m_anid)), m_message(message) {} + : m_id("AN" + std::to_string(++m_uid)), m_message(message) {} const std::string& getAnnouncementId() const; const util::Timestamp& getAnnouncementTimestamp() const; const std::string& getAnnouncementMessage() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp index a6220dd..b4a51ef 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp @@ -1,6 +1,6 @@ #include "Attendance.h" -int Attendance::m_aid = 0; +int Attendance::m_uid = 0; const std::string& Attendance::getAttendanceId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h index 9f6d481..013fb0b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h @@ -5,15 +5,15 @@ class Attendance { private: - static int m_aid; + static int m_uid; std::string m_id; util::Timestamp m_loginTime; util::Timestamp m_logoutTime; public: - Attendance() : m_id("AD" + std::to_string(++m_aid)), m_loginTime(), m_logoutTime() {} + Attendance() : m_id("AD" + std::to_string(++m_uid)), m_loginTime(), m_logoutTime() {} Attendance(const util::Timestamp& loginTime, const util::Timestamp& logoutTime) - : m_id("AD" + std::to_string(++m_aid)), m_loginTime(loginTime), m_logoutTime(logoutTime) {} + : m_id("AD" + std::to_string(++m_uid)), m_loginTime(loginTime), m_logoutTime(logoutTime) {} const std::string& getAttendanceId() const; const util::Timestamp& getLoginTime() const; const util::Timestamp& getLogoutTime() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp index 4c0dcb0..1b0f141 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp @@ -1,6 +1,6 @@ #include "Booking.h" -int Booking::m_bid = 0; +int Booking::m_uid = 0; const std::string& Booking::getBookingId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h index c8bc55c..2100841 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h @@ -7,19 +7,19 @@ class Booking { private: - static int m_bid; + static int m_uid; std::string m_id; util::Timestamp m_startTime; util::Timestamp m_endTime; std::string m_employeeId; std::shared_ptr m_team; public: - Booking() : m_id("BK" + std::to_string(++m_bid)), m_startTime(), m_endTime(), m_employeeId(""), m_team(nullptr) {} + Booking() : m_id("BK" + std::to_string(++m_uid)), m_startTime(), m_endTime(), m_employeeId(""), m_team(nullptr) {} Booking(const util::Timestamp& startTime, const util::Timestamp& endTime, const std::string& employeeId, std::shared_ptr team) - : m_id("BK" + std::to_string(++m_bid)), m_startTime(startTime), m_endTime(endTime), m_employeeId(employeeId), m_team(team) {} + : m_id("BK" + std::to_string(++m_uid)), m_startTime(startTime), m_endTime(endTime), m_employeeId(employeeId), m_team(team) {} const std::string& getBookingId() const; const util::Timestamp& getStartTime() const; const util::Timestamp& getEndTime() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp index c48c2a1..779652f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp @@ -1,6 +1,6 @@ #include "Candidate.h" -int Candidate::m_cid = 0; +int Candidate::m_uid = 0; const std::string& Candidate::getCandidateId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h index 646a8ef..db55250 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h @@ -5,19 +5,19 @@ class Candidate { private: - static int m_cid; + static int m_uid; std::string m_id; std::string m_name; long int m_phone; std::string m_qualification; Enums::CandidateStatus m_status; public: - Candidate() : m_id("CD" + std::to_string(++m_cid)), 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(0), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} Candidate(const std::string& name, long int phone, const std::string& qualification, Enums::CandidateStatus status) - : m_id("CD" + std::to_string(++m_cid)), m_name(name), m_phone(phone), m_qualification(qualification), m_status(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; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index 57db7a9..8b5aa80 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -1,8 +1,45 @@ +#include #include "Employee.h" +#include "Factory.h" +#include "StringHelper.h" +#include "Admin.h" +#include "HRManager.h" +#include "ITExecutive.h" +#include "TalentExecutive.h" +#include "TeamExecutive.h" +#include "FinanceExecutive.h" +#include "GeneralEmployee.h" int Employee::m_uid = 0; -const std::string& Employee::getEmployeeId() const +Employee::Employee(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::EmployeeType employeeType, + Enums::AccountStatus accountStatus) + : m_id(id), + m_password(password), + m_name(name), + m_phone(phone), + m_email(email), + m_accountStatus(accountStatus), + m_teamStatus(teamStatus), + m_teamId(teamId), + m_employeeType(employeeType), + m_payroll() +{ + int idNumber = util::extractNumber(m_id); + if (idNumber > m_uid) + { + m_uid = idNumber; + } +} + +const std::string& Employee::getId() const { return m_id; } @@ -130,3 +167,115 @@ Enums::EmployeeType Employee::getEmployeeType() const { return m_employeeType; } + +std::string Employee::serialize() const +{ + std::ostringstream serializedEmployee; + serializedEmployee << m_id << ',' + << m_email << ',' + << m_name << ',' + << m_phone << ',' + << m_password << ',' + << m_teamId << ',' + << Enums::getTeamStatusString(m_teamStatus) << ',' + << Enums::getAccountStatusString(m_accountStatus) << ',' + << Enums::getEmployeeTypeString(m_employeeType); + return serializedEmployee.str(); +} + +std::shared_ptr Employee::deserialize(const std::string& record) +{ + std::string id, name, phone, password, email; + std::string teamId, teamStatusString, accountStatusString, employeeTypeString; + std::istringstream serializedEmployee(record); + getline(serializedEmployee, id, ','); + getline(serializedEmployee, email, ','); + getline(serializedEmployee, name, ','); + getline(serializedEmployee, phone, ','); + getline(serializedEmployee, password, ','); + getline(serializedEmployee, teamId, ','); + getline(serializedEmployee, teamStatusString, ','); + getline(serializedEmployee, accountStatusString, ','); + getline(serializedEmployee, employeeTypeString, ','); + Enums::TeamStatus teamStatus = Enums::getTeamStatus(teamStatusString); + Enums::AccountStatus accountStatus = Enums::getAccountStatus(accountStatusString); + Enums::EmployeeType employeeType = Enums::getEmployeeType(employeeTypeString); + switch (employeeType) + { + case Enums::EmployeeType::IT: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::FINANCE: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::HR: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::TEAM: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::TALENT_ACQUISITION: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::ADMIN: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::GENERAL: + throw std::runtime_error("Cannot deserialize GeneralEmployee!"); + default: + return nullptr; + } +} + +std::string Employee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType"; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index 4b26cd0..46657c1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -7,13 +7,14 @@ #include "Leave.h" #include "Payroll.h" #include "Enums.h" +#include "ApplicationConfig.h" using payslipMap = std::map>; using attendanceMap = std::map>>; using leaveMap = std::map>; class Employee { -private: +protected: static int m_uid; std::string m_id; std::string m_password; @@ -29,16 +30,41 @@ private: leaveMap m_leaves; Enums::EmployeeType m_employeeType; public: - Employee() : m_id("EMP" + std::to_string(++m_uid)), m_password(""), m_name(""), m_phone(""), m_email(""), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(Enums::EmployeeType::GENERAL) {} - Employee(const std::string& password, - const std::string& name, + Employee() + : m_id("EMP" + std::to_string(++m_uid)), + m_password(Config::Authentication::DEFAULT_PASSWORD), + m_name(""), + m_phone(""), + m_email(""), + m_accountStatus(Enums::AccountStatus::ACTIVE), + m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), + m_teamId(""), + m_employeeType(Enums::EmployeeType::GENERAL) {} + Employee(const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, Enums::EmployeeType employeeType, std::shared_ptr payroll) - : m_id("EMP" + std::to_string(++m_uid)), m_password(password), m_name(name), m_phone(phone), m_email(email), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(teamId), m_employeeType(employeeType), m_payroll(payroll) { } - const std::string& getEmployeeId() const; + : m_id("EMP" + std::to_string(++m_uid)), + m_password(Config::Authentication::DEFAULT_PASSWORD), + m_name(name), + m_phone(phone), + m_email(email), + m_accountStatus(Enums::AccountStatus::ACTIVE), + m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), + m_teamId(""), + m_employeeType(employeeType), + m_payroll(payroll) {} + Employee(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::EmployeeType employeeType, + Enums::AccountStatus accountStatus); + const std::string& getId() const; const std::string& getEmployeePassword() const; const std::string& getEmployeeName() const; const std::string& getEmployeePhone() const; @@ -62,5 +88,8 @@ public: void addAttendance(std::shared_ptr attendance); void addLeave(std::shared_ptr leave); Enums::EmployeeType getEmployeeType() const; + virtual std::string serialize() const; + static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); virtual ~Employee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h index 8956d13..e877627 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h @@ -1,5 +1,4 @@ #pragma once -#include #include "Employee.h" class FinanceExecutive : public Employee @@ -7,13 +6,28 @@ class FinanceExecutive : public Employee public: FinanceExecutive() = default; FinanceExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) {}; + ) :Employee(name, phone, email, Enums::EmployeeType::FINANCE, payroll) {}; + FinanceExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::FINANCE, + accountStatus) {} ~FinanceExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 46f9e61..2392097 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -1,4 +1,6 @@ +#include #include "GeneralEmployee.h" +#include "Factory.h" Enums::EmployeeDesignation GeneralEmployee::getDesignation() const { @@ -8,4 +10,57 @@ Enums::EmployeeDesignation GeneralEmployee::getDesignation() const void GeneralEmployee::setDesignation(Enums::EmployeeDesignation designation) { m_designation = designation; +} + +std::string GeneralEmployee::serialize() const +{ + std::ostringstream serializedEmployee; + serializedEmployee << m_id << ',' + << m_email << ',' + << m_name << ',' + << m_phone << ',' + << m_password << ',' + << m_teamId << ',' + << Enums::getTeamStatusString(m_teamStatus) << ',' + << Enums::getAccountStatusString(m_accountStatus) << ',' + << Enums::getEmployeeTypeString(m_employeeType) << ',' + << Enums::getEmployeeDesignationString(m_designation); + return serializedEmployee.str(); +} + +std::shared_ptr GeneralEmployee::deserialize(const std::string& record) +{ + std::string id, name, phone, password, email; + std::string teamId, teamStatusString, accountStatusString, employeeTypeString, employeeDesignationString; + std::istringstream serializedEmployee(record); + getline(serializedEmployee, id, ','); + getline(serializedEmployee, email, ','); + getline(serializedEmployee, name, ','); + getline(serializedEmployee, phone, ','); + getline(serializedEmployee, password, ','); + getline(serializedEmployee, teamId, ','); + getline(serializedEmployee, teamStatusString, ','); + getline(serializedEmployee, accountStatusString, ','); + getline(serializedEmployee, employeeTypeString, ','); + getline(serializedEmployee, employeeDesignationString, ','); + Enums::TeamStatus teamStatus = Enums::getTeamStatus(teamStatusString); + Enums::AccountStatus accountStatus = Enums::getAccountStatus(accountStatusString); + Enums::EmployeeType employeeType = Enums::getEmployeeType(employeeTypeString); + Enums::EmployeeDesignation employeeDesignation = Enums::getEmployeeDesignation(employeeDesignationString); + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + employeeDesignation, + accountStatus + ); +} + +std::string GeneralEmployee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType,EmployeeDesignation"; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 14b33a4..61b1a06 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -7,16 +7,42 @@ class GeneralEmployee : public Employee private: Enums::EmployeeDesignation m_designation; public: - GeneralEmployee() : m_designation(Enums::EmployeeDesignation::JUNIOR) {} - GeneralEmployee(const std::string& id, - const std::string& password, - const std::string& name, + GeneralEmployee() + : m_designation(Enums::EmployeeDesignation::JUNIOR) {} + GeneralEmployee(const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll, - Enums::EmployeeDesignation designation) : Employee(password, name, phone, email, teamId,Enums::EmployeeType::GENERAL, payroll), m_designation(designation) {} + Enums::EmployeeDesignation designation) + : Employee(name, + phone, + email, + Enums::EmployeeType::GENERAL, + payroll), + m_designation(designation) {} + GeneralEmployee(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::EmployeeDesignation employeeDesignation, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::GENERAL, + accountStatus), + m_designation(employeeDesignation) {} Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); + std::string serialize() const override; + static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); ~GeneralEmployee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h index 5ace8bc..43f572c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h @@ -3,16 +3,31 @@ class HRManager : public Employee { +public: HRManager() = default; HRManager( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::HR, payroll) {}; + HRManager(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::HR, + accountStatus) {} ~HRManager() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h index c8b1c0f..a69f673 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h @@ -3,16 +3,31 @@ class ITExecutive : public Employee { +public: ITExecutive() = default; ITExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::IT, payroll) {}; + ITExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::IT, + accountStatus) {} ~ITExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp index 5c2f704..c2152cb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp @@ -1,6 +1,6 @@ #include "JobListing.h" -int JobListing::m_jid = 0; +int JobListing::m_uid = 0; const std::string& JobListing::getJobId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h index 7310897..61af21d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h @@ -9,7 +9,7 @@ using candidateMap = std::map>; class JobListing { private: - static int m_jid; + static int m_uid; std::string m_id; std::string m_name; std::string m_description; @@ -17,13 +17,13 @@ private: int m_numberOfVacancies; candidateMap m_candidates; public: - JobListing() : m_id("JL" + std::to_string(++m_jid)), m_name(""), m_description(""), m_status(Enums::JobListingStatus::CLOSED), m_numberOfVacancies(0) {} + JobListing() : m_id("JL" + std::to_string(++m_uid)), m_name(""), m_description(""), m_status(Enums::JobListingStatus::CLOSED), m_numberOfVacancies(0) {} JobListing(const std::string& name, const std::string& description, Enums::JobListingStatus status, int numberOfVacancies, const candidateMap& candidates) - : m_id("JL" + std::to_string(++m_jid)), m_name(name), m_description(description), m_status(status), m_numberOfVacancies(numberOfVacancies), m_candidates(candidates) {} + : m_id("JL" + std::to_string(++m_uid)), m_name(name), m_description(description), m_status(status), m_numberOfVacancies(numberOfVacancies), m_candidates(candidates) {} const std::string& getJobId() const; const std::string& getJobName() const; const std::string& getJobDescription() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp index 1163bcb..bbb0ff2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp @@ -1,6 +1,6 @@ #include "Leave.h" -int Leave::m_lid = 0; +int Leave::m_uid = 0; const std::string& Leave::getLeaveId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h index b745dbf..4c50bf1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h @@ -6,7 +6,7 @@ class Leave { private: - static int m_lid; + static int m_uid; std::string m_id; std::string m_employeeId; util::Timestamp m_timestamp; @@ -16,12 +16,12 @@ private: static int m_numberOfMedicalLeave; Enums::LeaveType m_leaveType; public: - Leave() : m_id("LV" + std::to_string(++m_lid)), m_employeeId(""), m_timestamp(), m_reason(""), m_leaveType(Enums::LeaveType::GENERAL) {} + Leave() : m_id("LV" + std::to_string(++m_uid)), m_employeeId(""), m_timestamp(), m_reason(""), m_leaveType(Enums::LeaveType::GENERAL) {} Leave(const std::string& employeeId, const util::Timestamp& timestamp, const std::string& reason, Enums::LeaveType leaveType) - : m_id("LV" + std::to_string(++m_lid)), m_employeeId(employeeId), m_timestamp(timestamp), m_reason(reason), m_leaveType(leaveType) {} + : m_id("LV" + std::to_string(++m_uid)), m_employeeId(employeeId), m_timestamp(timestamp), m_reason(reason), m_leaveType(leaveType) {} const std::string& getLeaveId() const; const std::string& getEmployeeId() const; const util::Timestamp& getTimestamp() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp index dae35ee..2f63026 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp @@ -1,6 +1,6 @@ #include "Notification.h" -int Notification::m_nid = 0; +int Notification::m_uid = 0; const std::string& Notification::getNotificationId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h index 000f381..194183d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h @@ -6,18 +6,18 @@ class Notification { private: - static int m_nid; + static int m_uid; std::string m_id; std::string m_employeeId; std::string m_message; util::Timestamp m_timestamp; Enums::NotificationStatus m_notificationStatus; public: - Notification() : m_id("NF" + std::to_string(++m_nid)), m_employeeId(""), m_message(""), m_timestamp(), m_notificationStatus(Enums::NotificationStatus::UNREAD) {} + Notification() : m_id("NF" + std::to_string(++m_uid)), m_employeeId(""), m_message(""), m_timestamp(), m_notificationStatus(Enums::NotificationStatus::UNREAD) {} Notification(const std::string& employeeId, const std::string& message, Enums::NotificationStatus notificationStatus) - : m_id("NF" + std::to_string(++m_nid)), m_employeeId(employeeId), m_message(message), m_notificationStatus(notificationStatus) {} + : m_id("NF" + std::to_string(++m_uid)), m_employeeId(employeeId), m_message(message), m_notificationStatus(notificationStatus) {} const std::string& getNotificationId() const; const std::string& getEmployeeId() const; const std::string& getNotificationMessage() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index 71a3d5a..b145a4f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -1,12 +1,48 @@ +#include +#include #include "Payroll.h" +#include "StringHelper.h" +#include "Factory.h" -int Payroll::m_prid = 0; +int Payroll::m_uid = 0; -const std::string& Payroll::getPayrollId() const +Payroll::Payroll(const std::string& id, + const std::string& employeeId, + double basicSalary, + double houseRentAllowance, + double foodAllowance, + double employeePFContribution, + double employerPFContribution) + : m_id(id), + m_employeeId(employeeId), + m_basicSalary(basicSalary), + m_houseRentAllowance(houseRentAllowance), + m_foodAllowance(foodAllowance), + m_employeePFContribution(employeePFContribution), + m_employerPFContribution(employerPFContribution) +{ + int idNumber = util::extractNumber(m_id); + if (idNumber > m_uid) + { + m_uid = idNumber; + } +} + +const std::string& Payroll::getId() const { return m_id; } +const std::string& Payroll::getEmployeeId() const +{ + return m_employeeId; +} + +void Payroll::setEmployeeId(const std::string& employeeId) +{ + m_employeeId = employeeId; +} + double Payroll::getBasicSalary() const { return m_basicSalary; @@ -32,9 +68,9 @@ double Payroll::getEmployerPFContribution() const return m_employerPFContribution; } -void Payroll::setPayrollID(const std::string& id) +void Payroll::setBasicSalary(double basicSalary) { - m_id = id; + m_basicSalary = basicSalary; } void Payroll::setHouseRentAllowance(double value) @@ -55,4 +91,58 @@ void Payroll::setEmployeePFContribution(double value) void Payroll::setEmployerPFContribution(double value) { m_employerPFContribution = value; +} + +std::string Payroll::serialize() const +{ + std::ostringstream serializedPayroll; + serializedPayroll << m_id << ',' + << m_employeeId << ',' + << m_basicSalary << ',' + << m_houseRentAllowance << ',' + << m_foodAllowance << ',' + << m_employeePFContribution << ',' + << m_employerPFContribution; + return serializedPayroll.str(); +} + +std::shared_ptr Payroll::deserialize(const std::string& record) +{ + std::string id, employeeId; + std::string basicSalaryString, houseRentAllowanceString, foodAllowanceString, employeePFString, employerPFString; + std::istringstream serializedPayroll(record); + std::getline(serializedPayroll, id, ','); + std::getline(serializedPayroll, employeeId, ','); + std::getline(serializedPayroll, basicSalaryString, ','); + std::getline(serializedPayroll, houseRentAllowanceString, ','); + std::getline(serializedPayroll, foodAllowanceString, ','); + std::getline(serializedPayroll, employeePFString, ','); + std::getline(serializedPayroll, employerPFString, ','); + + try + { + double basicSalary = std::stod(basicSalaryString); + double houseRentAllowance = std::stod(houseRentAllowanceString); + double foodAllowance = std::stod(foodAllowanceString); + double employeePFContribution = std::stod(employeePFString); + double employerPFContribution = std::stod(employerPFString); + return Factory::getObject( + id, + employeeId, + basicSalary, + houseRentAllowance, + foodAllowance, + employeePFContribution, + employerPFContribution + ); + } + catch (...) + { + throw std::runtime_error("Failed to deserialize Payroll object"); + } +} + +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 48215f5..6b063c8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -1,33 +1,58 @@ #pragma once #include +#include class Payroll { private: - static int m_prid; + static int m_uid; std::string m_id; + std::string m_employeeId; double m_basicSalary; double m_houseRentAllowance; double m_foodAllowance; double m_employeePFContribution; double m_employerPFContribution; public: - Payroll() : m_id("PR" + std::to_string(++m_prid)), m_basicSalary(0.0), m_houseRentAllowance(0.0), m_foodAllowance(0.0), m_employeePFContribution(0.0), m_employerPFContribution(0.0) {} + Payroll() + : m_id("PR" + std::to_string(++m_uid)), + m_basicSalary(0.0), + m_houseRentAllowance(0.0), + m_foodAllowance(0.0), + m_employeePFContribution(0.0), + m_employerPFContribution(0.0) {} Payroll(double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) - : m_id("PR" + std::to_string(++m_prid)), m_basicSalary(basicSalary), m_houseRentAllowance(houseRentAllowance), m_foodAllowance(foodAllowance), m_employeePFContribution(employeePFContribution), m_employerPFContribution(employerPFContribution) {} - const std::string& getPayrollId() const; + : m_id("PR" + std::to_string(++m_uid)), + m_basicSalary(basicSalary), + m_houseRentAllowance(houseRentAllowance), + m_foodAllowance(foodAllowance), + m_employeePFContribution(employeePFContribution), + m_employerPFContribution(employerPFContribution) {} + Payroll(const std::string& id, + const std::string& employeeId, + double basicSalary, + double houseRentAllowance, + double foodAllowance, + double employeePFContribution, + double employerPFContribution); + const std::string& getId() const; + const std::string& getEmployeeId() const; + void setEmployeeId(const std::string&); double getBasicSalary() const; double getHouseRentAllowance() const; double getFoodAllowance() const; double getEmployeePFContribution() const; double getEmployerPFContribution() const; - void setPayrollID(const std::string& id); - void setHouseRentAllowance(double value); - void setFoodAllowance(double value); - void setEmployeePFContribution(double value); - void setEmployerPFContribution(double value); + void setBasicSalary(double); + void setHouseRentAllowance(double); + void setFoodAllowance(double); + void setEmployeePFContribution(double); + void setEmployerPFContribution(double); + virtual std::string serialize() const; + static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp index fd40ee6..614e525 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp @@ -1,6 +1,6 @@ #include "Payslip.h" -int Payslip::m_pid = 0; +int Payslip::m_uid = 0; const std::string& Payslip::getPayslipId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h index 78e37b1..10dc3bf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h @@ -4,12 +4,12 @@ class Payslip { private: - static int m_pid; + static int m_uid; std::string m_id; double m_salary; public: - Payslip() : m_id("PS" + std::to_string(++m_pid)), m_salary(0.0) {} - Payslip(const double salary) : m_id("PS" + std::to_string(++m_pid)), m_salary(salary) {} + Payslip() : m_id("PS" + std::to_string(++m_uid)), m_salary(0.0) {} + Payslip(const double salary) : m_id("PS" + std::to_string(++m_uid)), m_salary(salary) {} const std::string& getPayslipId() const; double getSalary() const; void setPayslipId(const std::string& id); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp index 8134102..b5c4d50 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp @@ -1,6 +1,6 @@ #include "Room.h" -int Room::m_rid = 0; +int Room::m_uid = 0; const std::string& Room::getRoomId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h index e0084e9..1dfe66a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h @@ -8,13 +8,13 @@ using bookingMap = std::map>; class Room { private: - static int m_rid; + static int m_uid; std::string m_id; std::string m_name; bookingMap m_bookings; public: - Room() : m_id("RM" + std::to_string(++m_rid)), m_name("") {} - Room(const std::string& name) : m_id("RM" + std::to_string(++m_rid)), m_name(name) {} + Room() : m_id("RM" + std::to_string(++m_uid)), m_name("") {} + Room(const std::string& name) : m_id("RM" + std::to_string(++m_uid)), m_name(name) {} const std::string& getRoomId() const; const std::string& getRoomName() const; const bookingMap& getBookings() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h index 88c5018..90bc664 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h @@ -3,16 +3,32 @@ class TalentExecutive : public Employee { +public: TalentExecutive() = default; TalentExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::TALENT_ACQUISITION, payroll) {}; + TalentExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::TALENT_ACQUISITION, + accountStatus) { + } ~TalentExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp index fce9fd5..abf8a23 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp @@ -1,6 +1,6 @@ #include "Team.h" -int Team::m_tmid = 0; +int Team::m_uid = 0; const std::string& Team::getTeamId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h index b4782cd..fca1698 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h @@ -8,19 +8,19 @@ using employeeMap = std::map>; class Team { private: - static int m_tmid; + static int m_uid; std::string m_id; std::string m_name; std::shared_ptr m_lead; employeeMap m_employees; int m_maximumNumberOfEmployees; public: - Team() : m_id("TM" + std::to_string(++m_tmid)), m_name(""), m_lead(nullptr), m_maximumNumberOfEmployees(0) {} + Team() : m_id("TM" + std::to_string(++m_uid)), m_name(""), m_lead(nullptr), m_maximumNumberOfEmployees(0) {} Team( const std::string& name, std::shared_ptr lead, int maximumNumberOfEmployees) - : m_id("TM" + std::to_string(++m_tmid)), m_name(name), m_lead(lead), m_maximumNumberOfEmployees(maximumNumberOfEmployees) { + : m_id("TM" + std::to_string(++m_uid)), m_name(name), m_lead(lead), m_maximumNumberOfEmployees(maximumNumberOfEmployees) { } const std::string& getTeamId() const; const std::string& getTeamName() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h index e948a78..3f79197 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h @@ -3,16 +3,31 @@ class TeamExecutive : public Employee { +public: TeamExecutive() = default; TeamExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::TEAM, payroll) {}; + TeamExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::TEAM, + accountStatus) {} ~TeamExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp index 431093e..84fd042 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp @@ -1,6 +1,6 @@ #include "Ticket.h" -int Ticket::m_tid = 0; +int Ticket::m_uid = 0; const std::string& Ticket::getTicketId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h index 1ab88aa..56d39af 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h @@ -5,20 +5,20 @@ class Ticket { private: - static int m_tid; + static int m_uid; std::string m_id; Enums::TicketType m_type; std::string m_description; Enums::TicketStatus m_status; std::string m_employeeId; public: - Ticket() : m_id("TKT" + std::to_string(++m_tid)), m_type(Enums::TicketType::UNKNOWN), m_description(""), m_status(Enums::TicketStatus::OPEN), m_employeeId("") {} + Ticket() : m_id("TKT" + std::to_string(++m_uid)), m_type(Enums::TicketType::UNKNOWN), m_description(""), m_status(Enums::TicketStatus::OPEN), m_employeeId("") {} Ticket( Enums::TicketType type, const std::string& description, const std::string& employeeId, Enums::TicketStatus status) - : m_id("TKT" + std::to_string(++m_tid)), m_type(type), m_description(description), m_status(status), m_employeeId(employeeId) {} + : m_id("TKT" + std::to_string(++m_uid)), m_type(type), m_description(description), m_status(status), m_employeeId(employeeId) {} const std::string& getTicketId() const; Enums::TicketType getTicketType() const; const std::string& getDescription() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h index 0f3ab3d..25231c2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -9,30 +9,32 @@ namespace Config namespace Payroll { - constexpr double TEAM_LEAD_BASIC_SALARY = 0.0; - constexpr double TEAM_LEAD_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double TEAM_LEAD_FOOD_ALLOWANCE = 0.0; - constexpr double TEAM_LEAD_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double TEAM_LEAD_EMPLOYER_PF_CONTRIBUTION = 0.0; - constexpr double SENIOR_BASIC_SALARY = 0.0; - constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double SENIOR_FOOD_ALLOWANCE = 0.0; - constexpr double SENIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double SENIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; - constexpr double JUNIOR_BASIC_SALARY = 0.0; - constexpr double JUNIOR_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double JUNIOR_FOOD_ALLOWANCE = 0.0; - constexpr double JUNIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double JUNIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; - constexpr double HR_MANAGER_BASIC_SALARY = 0.0; - constexpr double HR_MANAGER_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double HR_MANAGER_FOOD_ALLOWANCE = 0.0; - constexpr double HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double HR_MANAGER_EMPLOYER_PF_CONTRIBUTION = 0.0; - constexpr double EXECUTIVE_BASIC_SALARY = 0.0; - constexpr double EXECUTIVE_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double EXECUTIVE_FOOD_ALLOWANCE = 0.0; - constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 0.0; + constexpr double SENIOR_BASIC_SALARY = 80000.0; + constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 32000.0; + constexpr double SENIOR_FOOD_ALLOWANCE = 3000.0; + constexpr double SENIOR_EMPLOYEE_PF_CONTRIBUTION = 9600.0; + constexpr double SENIOR_EMPLOYER_PF_CONTRIBUTION = 9600.0; + constexpr double JUNIOR_BASIC_SALARY = 25000.0; + constexpr double JUNIOR_HOUSE_RENT_ALLOWANCE = 10000.0; + constexpr double JUNIOR_FOOD_ALLOWANCE = 1500.0; + constexpr double JUNIOR_EMPLOYEE_PF_CONTRIBUTION = 3000.0; + constexpr double JUNIOR_EMPLOYER_PF_CONTRIBUTION = 3000.0; + constexpr double HR_MANAGER_BASIC_SALARY = 60000.0; + constexpr double HR_MANAGER_HOUSE_RENT_ALLOWANCE = 24000.0; + constexpr double HR_MANAGER_FOOD_ALLOWANCE = 2500.0; + constexpr double HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION = 7200.0; + constexpr double HR_MANAGER_EMPLOYER_PF_CONTRIBUTION = 7200.0; + constexpr double EXECUTIVE_BASIC_SALARY = 45000.0; + constexpr double EXECUTIVE_HOUSE_RENT_ALLOWANCE = 18000.0; + constexpr double EXECUTIVE_FOOD_ALLOWANCE = 2000.0; + constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 5400.0; + constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 5400.0; + } + + namespace File + { + constexpr const char* EMPLOYEES_FILE = "files/Employee.csv"; + constexpr const char* GENERAL_EMPLOYEES_FILE = "files/GeneralEmployee.csv"; + constexpr const char* PAYROLL_FILE = "files/Payroll.csv"; } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp index 9d7fc4f..613cc90 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp @@ -49,7 +49,7 @@ AuthenticationDTO AuthenticationManagementService::login(const std::string& emai void AuthenticationManagementService::changePassword(const std::string& password) { - std::shared_ptr authenticatedUser = m_dataStore.getAuthenticatedUser(); + std::shared_ptr authenticatedUser = m_dataStore.getAuthenticatedEmployee(); if (authenticatedUser) { authenticatedUser->setEmployeePassword(password); @@ -61,8 +61,8 @@ void AuthenticationManagementService::changePassword(const std::string& password } void AuthenticationManagementService::logout() { - if (m_dataStore.getAuthenticatedUser()) { - m_dataStore.getAuthenticatedUser() = nullptr; + if (m_dataStore.getAuthenticatedEmployee()) { + m_dataStore.getAuthenticatedEmployee() = nullptr; } else { throw std::runtime_error("No user currently logged In..."); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 0a151c8..09906fd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -1,17 +1,165 @@ +#include +#include #include "EmployeeManagementService.h" +#include "Factory.h" +#include "Validator.h" +#include "AuthorizationHelper.h" +#include "Enums.h" +#include "HRManager.h" +#include "ITExecutive.h" +#include "TalentExecutive.h" +#include "TeamExecutive.h" +#include "FinanceExecutive.h" +#include "GeneralEmployee.h" +#include "FileManager.h" +#include "ApplicationConfig.h" -void EmployeeManagementService::createEmployee(Enums::EmployeeType, const std::string& email, const std::string& password, const std::string& name, const std::string& phone) +void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { + auto& employees = m_dataStore.getEmployees(); + std::shared_ptr authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); + if (!authenticatedEmployee) + { + throw std::runtime_error("No authenticated user"); + } + Enums::EmployeeType authenticatedEmployeeType = authenticatedEmployee->getEmployeeType(); + std::shared_ptr employee; + std::shared_ptr payroll; + if (employeeType != Enums::EmployeeType::GENERAL && util::hasActiveEmployeeOfType(employeeType, employees)) + { + throw std::runtime_error("Cannot create more than one employee of type " + Enums::getEmployeeTypeString(employeeType)); + } + if (!util::isEmailValid(email)) + { + throw std::runtime_error("Invalid Email"); + } + if (!util::isPhoneNumberValid(phone)) + { + throw std::runtime_error("Invalid Phone"); + } + if (util::isEmailDuplicate(email, employees)) + { + throw std::runtime_error("Duplicate Email"); + } + if (util::isPhoneDuplicate(phone, employees)) + { + throw std::runtime_error("Duplicate Phone Number!"); + } + switch (employeeType) + { + case Enums::EmployeeType::HR: + util::enforceAuthorization(authenticatedEmployeeType, Enums::EmployeeType::ADMIN); + payroll = Factory::getObject(Config::Payroll::HR_MANAGER_BASIC_SALARY, + Config::Payroll::HR_MANAGER_HOUSE_RENT_ALLOWANCE, + Config::Payroll::HR_MANAGER_FOOD_ALLOWANCE, + Config::Payroll::HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::HR_MANAGER_EMPLOYER_PF_CONTRIBUTION); + employee = Factory::getObject(name, phone, email, payroll); + break; + case Enums::EmployeeType::IT: + case Enums::EmployeeType::FINANCE: + case Enums::EmployeeType::TEAM: + case Enums::EmployeeType::TALENT_ACQUISITION: + util::enforceAuthorization(authenticatedEmployeeType, Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + payroll = Factory::getObject(Config::Payroll::EXECUTIVE_BASIC_SALARY, + Config::Payroll::EXECUTIVE_HOUSE_RENT_ALLOWANCE, + Config::Payroll::EXECUTIVE_FOOD_ALLOWANCE, + Config::Payroll::EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::EXECUTIVE_EMPLOYER_PF_CONTRIBUTION); + switch (employeeType) + { + case Enums::EmployeeType::IT: + employee = Factory::getObject(name, phone, email, payroll); + break; + case Enums::EmployeeType::FINANCE: + employee = Factory::getObject(name, phone, email, payroll); + break; + case Enums::EmployeeType::TEAM: + employee = Factory::getObject(name, phone, email, payroll); + break; + case Enums::EmployeeType::TALENT_ACQUISITION: + employee = Factory::getObject (name, phone, email, payroll); + break; + } + break; + case Enums::EmployeeType::GENERAL: + util::enforceAuthorization(authenticatedEmployeeType, Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + switch (employeeDesignation) + { + case Enums::EmployeeDesignation::JUNIOR: + payroll = Factory::getObject(Config::Payroll::JUNIOR_BASIC_SALARY, + Config::Payroll::JUNIOR_HOUSE_RENT_ALLOWANCE, + Config::Payroll::JUNIOR_FOOD_ALLOWANCE, + Config::Payroll::JUNIOR_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::JUNIOR_EMPLOYER_PF_CONTRIBUTION); + break; + case Enums::EmployeeDesignation::SENIOR: + payroll = Factory::getObject(Config::Payroll::SENIOR_BASIC_SALARY, + Config::Payroll::SENIOR_HOUSE_RENT_ALLOWANCE, + Config::Payroll::SENIOR_FOOD_ALLOWANCE, + Config::Payroll::SENIOR_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::SENIOR_EMPLOYER_PF_CONTRIBUTION); + break; + default: + throw std::runtime_error("Invalid General Employee Designation"); + } + employee = Factory::getObject(name, phone, email, payroll, employeeDesignation); + break; + default: + throw std::runtime_error("Invalid Employee Type"); + } + payroll->setEmployeeId(employee->getId()); + m_dataStore.getPayrolls().emplace(std::make_pair(payroll->getId(), payroll)); + m_dataStore.getEmployees().emplace(std::make_pair(employee->getId(), employee)); } bool EmployeeManagementService::deactivateEmployee(const std::string& id) { + auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); + util::enforceAuthorization(authenticatedEmployee->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + auto& employee = m_dataStore.getEmployees(); + auto iterator = employee.find(id); + if (iterator == employee.end()) + { + return false; + } + if (iterator->second->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + throw std::runtime_error("Cannot deactivate Admin Account"); + } + iterator->second->setEmployeeAccountStatus(Enums::AccountStatus::INACTIVE); + return true; } + Employees EmployeeManagementService::getEmployees() { + Employees result; + auto& employees = m_dataStore.getEmployees(); + if (employees.size() <= 0) + { + return result; + } + for (const auto& iterator : employees) + { + if (iterator.second->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + result.push_back(iterator.second); + } + } + return result; } -std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) + +std::shared_ptr EmployeeManagementService::getCurrentEmployee() { + return m_dataStore.getAuthenticatedEmployee(); } + +void EmployeeManagementService::updateProfile(const std::string& name,const std::string& phone) +{ + std::shared_ptr employee = m_dataStore.getAuthenticatedEmployee(); + employee->setEmployeeName(name); + employee->setEmployeePhone(phone); +} + std::pair>> EmployeeManagementService::searchEmployee(const std::string& name) { std::shared_ptr currentUser = m_dataStore.getAuthenticatedEmployee(); @@ -22,8 +170,8 @@ std::pair>> Emp { return std::make_pair(employeeType, employeeList); } - for (const auto& entry : employees) { - const auto& employee = entry.second; + for (const auto& employeePair : employees) { + const auto& employee = employeePair.second; if (!employee) { continue; @@ -39,3 +187,50 @@ std::pair>> Emp } return { employeeType, employeeList }; } + +void EmployeeManagementService::loadEmployees() +{ + FileManager employeeFileManager(Config::File::EMPLOYEES_FILE); + FileManager generalEmployeeFileManager(Config::File::GENERAL_EMPLOYEES_FILE); + bool isAdminFound = false; + auto& employees = m_dataStore.getEmployees(); + auto employeesMap = employeeFileManager.load(); + auto generalEmployeesMap = generalEmployeeFileManager.load(); + employees.insert(employeesMap.begin(), employeesMap.end()); + employees.insert(generalEmployeesMap.begin(), generalEmployeesMap.end()); + for (auto& employeePair : employees) + { + if (employeePair.second->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + isAdminFound = true; + break; + } + } + if (!isAdminFound) + { + auto admin = Factory::getObject("Admin", "", "admin@trenser.com", nullptr); + employees.emplace(std::make_pair(admin->getId(), admin)); + } +} + +void EmployeeManagementService::saveEmployees() +{ + FileManager employeeFileManager(Config::File::EMPLOYEES_FILE); + FileManager generalEmployeeFileManager(Config::File::GENERAL_EMPLOYEES_FILE); + const auto& allEmployees = m_dataStore.getEmployees(); + employeeMap employees; + std::map> generalEmployees; + for (auto& employeePair : allEmployees) + { + if (employeePair.second->getEmployeeType() == Enums::EmployeeType::GENERAL) + { + generalEmployees.emplace(employeePair.first, std::static_pointer_cast(employeePair.second)); + } + else + { + employees.emplace(employeePair); + } + } + employeeFileManager.save(employees); + generalEmployeeFileManager.save(generalEmployees); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index e355154..8c24d2b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -14,9 +14,12 @@ private: DataStore& m_dataStore; public: EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; - void createEmployee(Enums::EmployeeType, const std::string&, const std::string&, const std::string&, const std::string&); + void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); Employees getEmployees(); - std::shared_ptr getEmployee(const std::string&); + void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); + std::shared_ptr getCurrentEmployee(); + void loadEmployees(); + void saveEmployees(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 154cf1f..ecc326d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -1 +1,50 @@ +#include #include "PayslipManagementService.h" +#include "ApplicationConfig.h" +#include "AuthorizationHelper.h" +#include "Enums.h" +#include "FileManager.h" + +void PayslipManagementService::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) +{ + util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::FINANCE); + auto employee = m_dataStore.getEmployees().find(employeeId); + if (employee != m_dataStore.getEmployees().end() && employee->second->getEmployeeType() != Enums::EmployeeType::ADMIN) + { + auto payroll = employee->second->getPayroll(); + payroll->setBasicSalary(basicSalary); + payroll->setHouseRentAllowance(houseRentAllowance); + payroll->setFoodAllowance(foodAllowance); + payroll->setEmployeePFContribution(employeePFContribution); + payroll->setEmployerPFContribution(employerPFContribution); + } + else + { + throw std::runtime_error("Employee not found, unable to update the salary"); + } +} + +void PayslipManagementService::loadPayrolls() +{ + FileManager payrollFileManager(Config::File::PAYROLL_FILE); + auto& payrolls = m_dataStore.getPayrolls(); + auto& employees = m_dataStore.getEmployees(); + auto payrollObjects = payrollFileManager.load(); + for (const auto& payrollPair : payrollObjects) + { + auto employeeIterator = employees.find(payrollPair.second->getEmployeeId()); + if (employeeIterator == employees.end()) + { + throw std::runtime_error("Payroll Object not associated with an existing employee"); + } + employeeIterator->second->setEmployeePayroll(payrollPair.second); + } + payrolls.insert(payrollObjects.begin(), payrollObjects.end()); +} + +void PayslipManagementService::savePayrolls() +{ + FileManager payrollFileManager(Config::File::PAYROLL_FILE); + auto& payrolls = m_dataStore.getPayrolls(); + payrollFileManager.save(payrolls); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 510ffe3..fd91da1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -1,4 +1,7 @@ #pragma once +#include +#include +#include"DataStore.h" class PayslipManagementService { @@ -6,4 +9,7 @@ private: DataStore& m_dataStore; public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; + void updateSalary(const std::string&, double, double, double, double, double); + void loadPayrolls(); + void savePayrolls(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.cpp new file mode 100644 index 0000000..d021692 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.cpp @@ -0,0 +1 @@ +#include "AuthorizationHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h new file mode 100644 index 0000000..e9c4d4b --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h @@ -0,0 +1,31 @@ +#pragma once +#include +#include "Enums.h" + +namespace util +{ + inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first) + { + return current == first; + } + + template + inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first, + Rest... rest) + { + if (current == first) + { + return true; + } + return isAuthorized(current, rest...); + } + + template + inline void enforceAuthorization(Enums::EmployeeType current, Allowed... allowed) + { + if (!isAuthorized(current, allowed...)) + { + throw std::runtime_error("You are unauthorized to perform this operation!"); + } + } +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 2f3fc5e..1539ee9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -76,7 +76,7 @@ namespace Enums { GENERAL, IT, FINANCE, - TAG, + TALENT_ACQUISITION, HR, TEAM, ADMIN, @@ -91,33 +91,75 @@ namespace Enums { INVALID_PASSWORD }; - std::string getAccountStatus(AccountStatus status) + inline std::string getAccountStatusString(AccountStatus status) { - switch (status) + switch (status) { - case AccountStatus::ACTIVE: - return "Active"; - case AccountStatus::INACTIVE: - return "Inactive"; - default: - return "Unknown"; + case AccountStatus::ACTIVE: + return "ACTIVE"; + case AccountStatus::INACTIVE: + return "INACTIVE"; + default: + return "UNKNOWN"; } } - std::string getTeamStatus(TeamStatus status) + inline std::string getEmployeeTypeString(EmployeeType type) { - switch (status) + switch (type) { - case TeamStatus::IN_TEAM: - return "In Team"; - case TeamStatus::NOT_IN_TEAM: - return "Not in Team"; - default: - return "Unknown"; + case EmployeeType::GENERAL: + return "GENERAL"; + case EmployeeType::IT: + return "IT"; + case EmployeeType::FINANCE: + return "FINANCE"; + case EmployeeType::TALENT_ACQUISITION: + return "TALENT_ACQUISITION"; + case EmployeeType::HR: + return "HR"; + case EmployeeType::TEAM: + return "TEAM"; + case EmployeeType::ADMIN: + return "ADMIN"; + case EmployeeType::INVALID: + return "INVALID"; + default: + return "UNKNOWN"; } } - std::string getCandidateStatus(CandidateStatus status) + inline std::string getTeamStatusString(TeamStatus status) + { + switch (status) + { + case TeamStatus::IN_TEAM: + return "IN_TEAM"; + case TeamStatus::NOT_IN_TEAM: + return "NOT_IN_TEAM"; + default: + return "UNKNOWN"; + } + } + + inline std::string getEmployeeDesignationString(EmployeeDesignation designation) + { + switch (designation) + { + case EmployeeDesignation::JUNIOR: + return "JUNIOR"; + case EmployeeDesignation::SENIOR: + return "SENIOR"; + case EmployeeDesignation::TEAM_LEAD: + return "TEAM_LEAD"; + case EmployeeDesignation::INVALID: + return "INVALID"; + default: + return "UNKNOWN"; + } + } + + inline std::string getCandidateStatusString(CandidateStatus status) { switch (status) { @@ -128,149 +170,79 @@ namespace Enums { } } - std::string getNotificationStatus(NotificationStatus status) { - switch (status) + inline AccountStatus getAccountStatus(const std::string& input) + { + if (input == "ACTIVE") { - case NotificationStatus::READ: - return "Read"; - case NotificationStatus::UNREAD: - return "Unread"; - default: - return "Unknown"; + return AccountStatus::ACTIVE; } + if (input == "INACTIVE") + { + return AccountStatus::INACTIVE; + } + return AccountStatus::INACTIVE; } - std::string getLeaveStatus(LeaveStatus status) + inline EmployeeType getEmployeeType(const std::string& input) { - switch (status) + if (input == "GENERAL") { - case LeaveStatus::PENDING: - return "Pending"; - case LeaveStatus::APPROVED: - return "Approved"; - case LeaveStatus::REJECTED: - return "Rejected"; - default: - return "Unknown"; + return EmployeeType::GENERAL; } + if (input == "IT") + { + return EmployeeType::IT; + } + if (input == "FINANCE") + { + return EmployeeType::FINANCE; + } + if (input == "TALENT_ACQUISITION") + { + return EmployeeType::TALENT_ACQUISITION; + } + if (input == "HR") + { + return EmployeeType::HR; + } + if (input == "TEAM") + { + return EmployeeType::TEAM; + } + if (input == "ADMIN") + { + return EmployeeType::ADMIN; + } + return EmployeeType::INVALID; } - std::string getLeaveType(LeaveType type) + inline TeamStatus getTeamStatus(const std::string& str) { - switch (type) + if (str == "IN_TEAM") { - case LeaveType::GENERAL: - return "General Leave"; - case LeaveType::MEDICAL: - return "Medical Leave"; - case LeaveType::RESTRICTED: - return "Restricted Leave"; - default: - return "Unknown"; + return TeamStatus::IN_TEAM; } + if (str == "NOT_IN_TEAM") + { + return TeamStatus::NOT_IN_TEAM; + } + return TeamStatus::NOT_IN_TEAM; } - std::string getJobListingStatus(JobListingStatus status) + inline EmployeeDesignation getEmployeeDesignation(const std::string& input) { - switch (status) + if (input == "JUNIOR") { - case JobListingStatus::OPEN: - return "Open"; - case JobListingStatus::CLOSED: - return "Closed"; - default: - return "Unknown"; + return EmployeeDesignation::JUNIOR; } - } - - std::string getTicketStatus(TicketStatus status) - { - switch (status) + if (input == "SENIOR") { - case TicketStatus::OPEN: - return "Open"; - case TicketStatus::RESOLVED: - return "Resolved"; - case TicketStatus::CLOSED: - return "Closed"; - default: - return "Unknown"; + return EmployeeDesignation::SENIOR; } - } - - std::string getTicketType(TicketType type) - { - switch (type) + if (input == "TEAM_LEAD") { - case TicketType::IT: - return "IT"; - case TicketType::FINANCE: - return "Finance"; - case TicketType::ATTENDANCE: - return "Attendance"; - case TicketType::UNKNOWN: - return "Unknown"; - default: - return "Unknown"; - } - } - - std::string getEmployeeDesignation(EmployeeDesignation designation) - { - switch (designation) - { - case EmployeeDesignation::JUNIOR: - return "Junior"; - case EmployeeDesignation::SENIOR: - return "Senior"; - case EmployeeDesignation::TEAM_LEAD: - return "Team Lead"; - case EmployeeDesignation::INVALID: - return "Invalid"; - default: - return "Unknown"; - } - } - - std::string getEmployeeType(EmployeeType type) - { - switch (type) - { - case EmployeeType::HR: - return "HR Manager"; - case EmployeeType::TEAM: - return "Team Executive"; - case EmployeeType::ADMIN: - return "Admin"; - case EmployeeType::IT: - return "IT Executive"; - case EmployeeType::FINANCE: - return "Finance Executive"; - case EmployeeType::TAG: - return "Talent Acquisition Executive"; - case EmployeeType::GENERAL: - return "General Employee"; - case EmployeeType::INVALID: - return "Invalid"; - default: - return "Unknown"; - } - } - - std::string getLoginStatus(LoginStatus status) - { - switch (status) - { - case LoginStatus::SUCCESS: - return "Login Success"; - case LoginStatus::FIRST_LOGIN: - return "First Login"; - case LoginStatus::USER_NOT_FOUND: - return "User Not Found"; - case LoginStatus::INVALID_PASSWORD: - return "Invalid Password"; - default: - return "Unknown"; + return EmployeeDesignation::TEAM_LEAD; } + return EmployeeDesignation::INVALID; } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h index f7d3fbf..a82c0a3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h @@ -24,6 +24,7 @@ namespace util inline void pressEnter() { + std::cout << std::endl; system("pause"); } } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp new file mode 100644 index 0000000..00af011 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp @@ -0,0 +1,15 @@ +#include "StringHelper.h" +#include + +int util::extractNumber(const std::string& input) +{ + int result = 0; + for (char character : input) + { + if (std::isdigit(static_cast(character))) + { + result = result * 10 + (character - '0'); + } + } + return result; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h new file mode 100644 index 0000000..12df49a --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h @@ -0,0 +1,7 @@ +#pragma once +#include + +namespace util +{ + int extractNumber(const std::string&); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp index 9d14b40..ee99e68 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp @@ -1,6 +1,6 @@ -#include #include #include "Validator.h" +#include "Employee.h" #include "ApplicationConfig.h" bool util::isPhoneNumberValid(const std::string& phoneNumber) { @@ -18,7 +18,10 @@ bool util::isPhoneNumberValid(const std::string& phoneNumber) { bool util::isEmailValid(const std::string& email) { size_t index = email.find('@'); - if (index == std::string::npos) return false; + if (index == std::string::npos) + { + return false; + } if (email.find('@', index + 1) != std::string::npos) { return false; @@ -69,3 +72,54 @@ bool util::isPasswordValid(const std::string& password) } return hasUpper && hasLower && hasDigit && hasSpecial; } + +bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std::map> & employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeeType() == employeeType && employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + return true; + } + } + return false; +} + +bool util::isEmailDuplicate(const std::string& email, const std::map>& employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeeEmail() == email) + { + return true; + } + } + return false; +} + +bool util::isPhoneDuplicate(const std::string& phone, const std::map>& employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeePhone() == phone) + { + return true; + } + } + return false; +} + +bool util::isPhoneDuplicate(const std::string& phone, const std::vector>& employees) +{ + for (const auto& employee : employees) + { + if (employee->getEmployeePhone() == phone) + { + return true; + } + } + return false; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h index fbdf962..588b820 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h @@ -1,11 +1,21 @@ #pragma once #include +#include +#include +#include #include #include +#include "Enums.h" + +class Employee; namespace util { bool isPhoneNumberValid(const std::string&); bool isEmailValid(const std::string&); bool isPasswordValid(const std::string&); + bool hasActiveEmployeeOfType(Enums::EmployeeType, const std::map>&); + bool isEmailDuplicate(const std::string&, const std::map>&); + bool isPhoneDuplicate(const std::string&, const std::map>&); + bool isPhoneDuplicate(const std::string&, const std::vector>&); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 2dd9eec..6c3c0d5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -1,7 +1,7 @@ #include #include "AdminMenu.h" -#include "InputHelper.h" -#include "OutputHelper.h" +#include"InputHelper.h" +#include"OutputHelper.h" #include "MenuHelper.h" void AdminMenu::run() @@ -13,7 +13,7 @@ void AdminMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - HR Management System\n1. Create HRManager\n2. Create Employee\n3. View Employee\n4. Deactivate Employee\n5. Logout\nEnter your Choice: "; + std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -32,26 +32,26 @@ bool AdminMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.createHRManager(); + case 1: + createEmployee(m_zenvyController); break; case 2: - m_zenvyController.createEmployee(); + viewEmployees(m_zenvyController); break; case 3: - m_zenvyController.viewEmployee(); + deactivateEmployee(m_zenvyController); break; case 4: - m_zenvyController.deactivateEmployee(); - break;*/ - case 5: searchEmployee(m_zenvyController); break; + case 5: + updateProfile(m_zenvyController); + break; case 6: return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } - diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index da93020..98be55b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -1,7 +1,8 @@ #include +#include #include "EmployeeMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" #include "MenuHelper.h" void EmployeeMenu::run() @@ -13,7 +14,7 @@ void EmployeeMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n14. Logout\nEnter your Choice: "; + std::cout << "Employee Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticket\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n14. Update Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -32,7 +33,8 @@ bool EmployeeMenu::handleOperation(int choice) { switch (choice) { - /*case 1: + /* + case 1: m_zenvyController.applyLeave(); break; case 2: @@ -49,33 +51,21 @@ bool EmployeeMenu::handleOperation(int choice) break; case 6: m_zenvyController.viewTicketHistory(); - break; - case 7: - m_zenvyController.viewEmployees(); break;*/ + case 7: + viewEmployees(m_zenvyController); + break; case 8: searchEmployee(m_zenvyController); 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: + updateProfile(m_zenvyController); + break; + case 15: return false; default: - std::cout << "Enter a valid choice!" << std::endl;*/ + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } - diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 058b339..3626596 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -1,7 +1,7 @@ #include #include "FinanceExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" #include "MenuHelper.h" void FinanceExecutiveMenu::run() @@ -13,7 +13,7 @@ void FinanceExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Generate Payslip\n10. Update Payroll\n11. Logout\nEnter your Choice: "; + std::cout << "Finance Executive Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Generate Payslip\n10. Update Payroll\n11. Update Profile\n12. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -28,44 +28,53 @@ void FinanceExecutiveMenu::run() } } +void FinanceExecutiveMenu::updatePayroll() +{ + std::string employeeId; + double basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution; + employeeId = selectEmployeeId(m_zenvyController->getEmployees()); + util::clear(); + if (employeeId != "") { + std::cout << "Enter the New Basic Salary: "; + util::read(basicSalary); + std::cout << "Enter the New House Rent Allowance: "; + util::read(houseRentAllowance); + std::cout << "Enter the New Food Allowance: "; + util::read(foodAllowance); + std::cout << "Enter the New EmployeePFContribution: "; + util::read(employeePFContribution); + std::cout << "Enter the New EmployerPFContribution: "; + util::read(employerPFContribution); + m_zenvyController->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); + std::cout << "Payroll Updated"; + util::pressEnter(); + } + else { + throw std::runtime_error("Unexpected error occured"); + } +} + bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; - case 2: - m_zenvyController.viewPayslip(); - break; - case 3: - m_zenvyController.viewPayslipHistory(); - break; case 4: - m_zenvyController.viewEmployees(); - break;*/ + viewEmployees(m_zenvyController); + break; case 5: searchEmployee(m_zenvyController); 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: - m_zenvyController.updatePayroll(); + updatePayroll(); break; case 11: + updateProfile(m_zenvyController); + break; + case 12: return false; default: - std::cout << "Enter a valid choice!" << std::endl;*/ + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 825322f..a5a2016 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -1,5 +1,8 @@ #pragma once #include +#include +#include +#include #include"ZenvyController.h" class FinanceExecutiveMenu @@ -10,5 +13,6 @@ public: FinanceExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void updatePayroll(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 35d99a3..bcf6ce8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -1,7 +1,7 @@ #include #include "HRManagerMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" #include "MenuHelper.h" void HRManagerMenu::run() @@ -13,7 +13,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. 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. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -32,43 +32,26 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; - case 2: - m_zenvyController.viewPayslip(); - break; - case 3: - m_zenvyController.viewPayslipHistory(); - break; case 4: - m_zenvyController.viewEmployees(); - break;*/ + viewEmployees(m_zenvyController); + break; case 5: searchEmployee(m_zenvyController); break; - /*case 6: - m_zenvyController.viewNotifications(); - break; - case 7: - m_zenvyController.viewAnnouncements(); - break; case 8: - m_zenvyController.createEmployee(); - break; - case 9: - m_zenvyController.regularizeAttenance(); - break; - case 10: - m_zenvyController.updateLeaveRequest(); - break; - case 11: - m_zenvyController.registercandidateAsEmployee(); + createEmployee(m_zenvyController); break; case 12: + updateProfile(m_zenvyController); + break; + case 13: + deactivateEmployee(m_zenvyController); + break; + case 14: return false; default: - std::cout << "Enter a valid choice!" << std::endl;*/ + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index 827ef33..f9aa3d3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -1,7 +1,7 @@ #include #include "ITExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" #include "MenuHelper.h" void ITExecutiveMenu::run() @@ -13,7 +13,7 @@ void ITExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Logout\nEnter your Choice: "; + std::cout << "IT Executive Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Update Profile\n10. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -32,34 +32,20 @@ bool ITExecutiveMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; - case 2: - m_zenvyController.viewPayslip(); - break; - case 3: - m_zenvyController.viewPayslipHistory(); - break; case 4: - m_zenvyController.viewEmployees(); - break;*/ + viewEmployees(m_zenvyController); + break; case 5: searchEmployee(m_zenvyController); break; - /*case 6: - m_zenvyController.viewNotifications(); - break; - case 7: - m_zenvyController.viewAnnouncements(); - break; - case 8: - m_zenvyController.resolveTicket(); - break; case 9: + updateProfile(m_zenvyController); + break; + case 10: return false; default: - std::cout << "Enter a valid choice!" << std::endl;*/ + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 5505d19..37da2d2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -1,3 +1,104 @@ +#include #include "MenuHelper.h" +static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) +{ + int choice; + util::clear(); + static const std::map> employeeTypeOptions = { + { Enums::EmployeeType::ADMIN, { + Enums::EmployeeType::HR, + Enums::EmployeeType::IT, + Enums::EmployeeType::TEAM, + Enums::EmployeeType::FINANCE, + Enums::EmployeeType::TALENT_ACQUISITION, + Enums::EmployeeType::GENERAL + }}, + { Enums::EmployeeType::HR, { + Enums::EmployeeType::IT, + Enums::EmployeeType::TEAM, + Enums::EmployeeType::FINANCE, + Enums::EmployeeType::TALENT_ACQUISITION, + Enums::EmployeeType::GENERAL + }} + }; + static const std::map labels = { + { Enums::EmployeeType::HR, "HR Employee" }, + { Enums::EmployeeType::IT, "IT Executive" }, + { Enums::EmployeeType::TEAM, "Team Executive" }, + { Enums::EmployeeType::FINANCE, "Finance Executive" }, + { Enums::EmployeeType::TALENT_ACQUISITION, "Talent Executive" }, + { Enums::EmployeeType::GENERAL, "General Employee" } + }; + auto it = employeeTypeOptions.find(employeeType); + if (it == employeeTypeOptions.end()) + { + throw std::runtime_error("You do not have the authority to create a new Employee!"); + } + const auto& options = it->second; + std::cout << "Select Employee Type\n"; + for (int index = 0; index < options.size(); ++index) + { + std::cout << index + 1 << ". " << labels.at(options[index]) << "\n"; + } + std::cout << "Enter Choice: "; + util::read(choice); + if (choice >= 1 && choice <= options.size()) + { + return options[choice - 1]; + } + return Enums::EmployeeType::INVALID; +} +static Enums::EmployeeDesignation getEmployeeDesignation() +{ + int choice; + util::clear(); + std::cout << "Select Employee Designation" + "\n1. SENIOR" + "\n2. JUNIOR" + "\nEnter Choice: "; + util::read(choice); + switch (choice) + { + case 1: + return Enums::EmployeeDesignation::SENIOR; + case 2: + return Enums::EmployeeDesignation::JUNIOR; + default: + return Enums::EmployeeDesignation::INVALID; + } +} + +void createEmployee(std::shared_ptr controller) +{ + auto currentEmployee = controller->getCurrentEmployee(); + Enums::EmployeeType employeeType = getEmployeeType(currentEmployee->getEmployeeType()); + Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; + std::string name, email, phone; + 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 Name: "; + util::read(name); + std::cout << "Enter Email: "; + util::read(email); + std::cout << "Enter Phone: "; + util::read(phone); + controller->createEmployee(employeeType, employeeDesignation, email, name, phone); + std::cout << "\nCreated Employee Successfully."; + util::pressEnter(); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 55eb6f0..2d6e595 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -1,15 +1,180 @@ #pragma once -#include -#include -#include +#include +#include #include +#include +#include #include #include "Enums.h" #include"InputHelper.h" #include"OutputHelper.h" #include "Employee.h" #include "ZenvyController.h" -#include "Payroll.h" +#include "MenuHelper.h" +#include "Validator.h" + +void createEmployee(std::shared_ptr controller); + +inline void updateProfile(std::shared_ptr m_zenvyController) +{ + int choice; + std::string name, phone; + name = m_zenvyController->getCurrentEmployee()->getEmployeeName(); + phone = m_zenvyController->getCurrentEmployee()->getEmployeePhone(); + while (true) + { + util::clear(); + std::cout << "Please choose the information you want to update:\n" + "1. Name\n" + "2. Phone Number\n" + "3. Exit\n" + "Enter your choice: "; + util::read(choice); + switch (choice) + { + case 1: + std::cout << "Enter your updated Name: "; + util::read(name); + m_zenvyController->updateProfile(name, phone); + std::cout << "Profile Updated Successfully\n"; + util::pressEnter(); + break; + case 2: + std::cout << "Enter your updated phone Number: "; + util::read(phone); + if (!util::isPhoneNumberValid(phone)) + { + std::cout << "Error: Invalid Phone Number"; + util::pressEnter(); + } + if (util::isPhoneDuplicate(phone, m_zenvyController->getEmployees())) + { + std::cout << "Error: Duplicate Phone Number!"; + util::pressEnter(); + return; + } + m_zenvyController->updateProfile(name, phone); + std::cout << "Profile Updated Successfully\n"; + util::pressEnter(); + break; + case 3: + return; + default: + std::cout << "Enter a valid choice!" << std::endl; + break; + } + } +} + +inline std::string selectEmployeeId(std::vector> allEmployees) +{ + int choice; + std::map> employeeList; + int index = 0; + util::clear(); + std::cout << "Select the Employee\n"; + for (auto& currentEmployee : allEmployees) + { + if (currentEmployee->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + continue; + } + employeeList[++index] = currentEmployee; + } + std::cout << std::left + << std::setw(10) << "Index" + << std::setw(15) << "Employee ID" + << std::setw(20) << "Name" + << std::setw(20) << "Employee Type" << 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; + } + std::cout << "Enter the Index: "; + util::read(choice); + auto employeeIterator = employeeList.find(choice); + if (employeeIterator != employeeList.end()) + { + return (employeeIterator->second->getId()); + } + else + { + throw std::runtime_error("Invalid Index"); + } +} + +inline void deactivateEmployee(const std::shared_ptr& controller) +{ + if(controller->deactivateEmployee(selectEmployeeId(controller->getEmployees()))) + { + std::cout << "Employee deactivated successfully\n"; + util::pressEnter(); + } + else + { + std::cout << "Employee not found\n"; + util::pressEnter(); + } +} + +inline void viewEmployees(std::shared_ptr m_zenvyController) +{ + util::clear(); + std::cout << "Employee List\n"; + auto employees = m_zenvyController->getEmployees(); + if (employees.empty()) + { + std::cout << "No employees found\n"; + util::pressEnter(); + return; + } + std::cout << std::left + << std::setw(15) << "Employee ID" + << std::setw(25) << "Name" + << std::setw(25) << "Role" + << std::setw(25) << "Email" + << std::setw(15) << "Phone" + << std::setw(10) << "TeamId" + << std::endl; + for (const auto& iterator : employees) + { + std::cout << std::left + << std::setw(15) << iterator->getId() + << std::setw(25) << iterator->getEmployeeName() + << std::setw(25) << Enums::getEmployeeTypeString(iterator->getEmployeeType()) + << std::setw(25) << iterator->getEmployeeEmail() + << std::setw(15) << iterator->getEmployeePhone() + << std::setw(10) << iterator->getEmployeeTeamId() + << std::endl; + } + util::pressEnter(); +} + +static void displayPayroll(std::shared_ptr payroll) +{ + std::cout << std::left + << std::setw(10) << payroll->getId() + << std::setw(10) << payroll->getBasicSalary() + << std::setw(10) << payroll->getEmployeePFContribution() + << std::setw(10) << payroll->getEmployerPFContribution() + << std::setw(10) << payroll->getFoodAllowance() + << std::setw(10) << payroll->getHouseRentAllowance() + << std::endl; +} + +static void filterSearchResults(Enums::EmployeeType type, std::shared_ptr employee) +{ + switch (type) + { + case Enums::EmployeeType::FINANCE: + displayPayroll(employee->getPayroll()); + break; + } +} inline void searchEmployee(std::shared_ptr& m_zenvyController) { @@ -26,22 +191,21 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) << std::setw(25) << "Email" << std::setw(15) << "Phone" << std::setw(15) << "Type" + << std::setw(15) << "Team Status" << std::setw(10) << "Team ID" - << std::setw(10) << "Team Status" << std::endl; - std::cout << std::string(95, '-') << std::endl; for (const auto& employee : searchResults.second) { if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) { - std::cout << std::left - << std::setw(10) << employee->getEmployeeId() - << std::setw(20) << employee->getEmployeeName() - << std::setw(25) << employee->getEmployeeEmail() - << std::setw(15) << employee->getEmployeePhone() - << std::setw(15) << Enums::getEmployeeType(employee->getEmployeeType()) - << std::setw(10) << employee->getEmployeeTeamId() - << std::setw(10) << Enums::getTeamStatus(employee->getEmployeeTeamStatus()); + 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(15) << Enums::getEmployeeTypeString(employee->getEmployeeType()) + << std::setw(15) << Enums::getTeamStatusString(employee->getEmployeeTeamStatus()) + << std::setw(10) << employee->getEmployeeTeamId(); filterSearchResults(searchResults.first, employee); } } @@ -50,24 +214,5 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) { std::cout << "No Employee found with this name" << std::endl; } -} -static void filterSearchResults(Enums::EmployeeType type, std::shared_ptr employee) -{ - switch (type) - { - case Enums::EmployeeType::FINANCE: - displayPayroll(employee->getPayroll()); - break; - } -} -void displayPayroll(std::shared_ptr payroll) -{ - std::cout << std::left - << std::setw(10) << payroll->getPayrollId() - << std::setw(10) << payroll->getBasicSalary() - << std::setw(10) << payroll->getEmployeePFContribution() - << std::setw(10) << payroll->getEmployerPFContribution() - << std::setw(10) << payroll->getFoodAllowance() - << std::setw(10) << payroll->getHouseRentAllowance() - << std::endl; + util::pressEnter(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 615a950..18afc15 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -1,7 +1,7 @@ #include #include "TalentExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" #include "MenuHelper.h" void TalentExecutiveMenu::run() @@ -13,7 +13,7 @@ void TalentExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create New Job\n9. View Job Opening\n10. Add Candidate\n11. UpdateCandidate Status\n12. View Shortlisted Candidate\n13. Logout\nEnter your Choice: "; + std::cout << "Talent Executive 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 New Job\n9. View Job Opening\n10. Add Candidate\n11. UpdateCandidate Status\n12. View Shortlisted Candidate\n13. Update Profile\n14. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -32,46 +32,20 @@ bool TalentExecutiveMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; - case 2: - m_zenvyController.viewPayslip(); - break; - case 3: - m_zenvyController.viewPayslipHistory(); - break; case 4: - m_zenvyController.viewEmployees(); - break;*/ + viewEmployees(m_zenvyController); + break; case 5: searchEmployee(m_zenvyController); 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: + updateProfile(m_zenvyController); + break; + case 14: return false; default: - std::cout << "Enter a valid choice!" << std::endl;*/ + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 10f817b..d0fd1f9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -1,7 +1,7 @@ #include #include "TeamExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" #include "MenuHelper.h" void TeamExecutiveMenu::run() @@ -13,7 +13,7 @@ void TeamExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Team\n9. Update Team\n10. Remove Team\n11. Assign Employee\n12. Unassign Employee\n13. View Teams\n14. Logout\nEnter your Choice: "; + std::cout << "Team Executive 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 Team\n9. Update Team\n10. Remove Team\n11. Assign Employee\n12. Unassign Employee\n13. View Teams\n14. Update Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -32,49 +32,20 @@ bool TeamExecutiveMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; - case 2: - m_zenvyController.viewPayslip(); - break; - case 3: - m_zenvyController.viewPayslipHistory(); - break; case 4: - m_zenvyController.viewEmployees(); - break;*/ + viewEmployees(m_zenvyController); + break; case 5: searchEmployee(m_zenvyController); 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: + updateProfile(m_zenvyController); + break; + case 15: return false; default: - std::cout << "Enter a valid choice!" << std::endl;*/ + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index f7b82fc..694b509 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -1,7 +1,7 @@ #include #include "TeamLeadMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" #include "MenuHelper.h" void TeamLeadMenu::run() @@ -13,7 +13,7 @@ void TeamLeadMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n4. Regularize Attendance\n15. Update Leave Request\n16. Logout\nEnter your Choice: "; + std::cout << "Team Lead Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n4. Regularize Attendance\n15. Update Leave Request\n16. Update Profile\n17. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -32,55 +32,20 @@ bool TeamLeadMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; - case 2: - m_zenvyController.viewPayslip(); - break; - case 3: - m_zenvyController.viewPayslipHistory(); - break; - case 4: - m_zenvyController.raiseTicket(); - break; - case 5: - m_zenvyController.viewTicket(); - break; - case 6: - m_zenvyController.viewTicketHistory(); - break; case 7: - m_zenvyController.viewEmployees(); - break;*/ + viewEmployees(m_zenvyController); + break; case 8: searchEmployee(m_zenvyController); 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: + updateProfile(m_zenvyController); + break; + case 17: return false; default: - std::cout << "Enter a valid choice!" << std::endl;*/ + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp index adea852..f420867 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp @@ -19,6 +19,15 @@ void UserInterface::run() { bool isMenuActive = true; + try + { + m_controller->loadStates(); + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + return; + } while (isMenuActive) { try @@ -38,6 +47,15 @@ void UserInterface::run() util::pressEnter(); } } + try + { + m_controller->persistStates(); + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + return; + } } bool UserInterface::handleOperation(int choice) @@ -94,7 +112,7 @@ void UserInterface::login() } else { - std::cout << "\nInvalid Password"; + std::cout << "Error: Invalid Password\n"; util::pressEnter(); return; } @@ -133,7 +151,7 @@ void UserInterface::login() menu.run(); break; } - case Enums::EmployeeType::TAG: + case Enums::EmployeeType::TALENT_ACQUISITION: { TalentExecutiveMenu menu; menu.run();