Merge branch 'feature-employee-management' into feature-employee-management-emp006

This commit is contained in:
2026-04-13 15:45:13 +05:30
74 changed files with 1692 additions and 557 deletions
+3
View File
@@ -426,3 +426,6 @@ FodyWeavers.xsd
*.msix *.msix
*.msm *.msm
*.msp *.msp
# CSV Files
*.csv
@@ -0,0 +1,27 @@
#include "pch.h"
#include "FileIO.h"
std::vector<std::string> 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<std::string> 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<std::string>& 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';
}
@@ -0,0 +1,18 @@
#pragma once
#include<memory>
#include<vector>
#include<fstream>
#include<string>
#include<stdexcept>
#ifdef TRENSERFILEMANAGER_EXPORTS
#define TRENSERFILEMANAGER_API __declspec(dllexport)
#else
#define TRENSERFILEMANAGER_API __declspec(dllimport)
#endif
class TRENSERFILEMANAGER_API FileIO {
public:
static std::vector<std::string> readAllLines(const std::string& path);
static void writeAllLines(const std::string& path, const std::vector<std::string>& lines);
};
@@ -0,0 +1,52 @@
#pragma once
#include <stdexcept>
#include "FileIO.h"
template <typename T> using objects = std::map<std::string, std::shared_ptr<T>>;
template <typename T>
class FileManager
{
private:
std::string m_filePath;
public:
FileManager() : m_filePath("") {}
FileManager(const std::string& filePath) : m_filePath(filePath) {}
objects<T> load();
void save(const objects<T>&);
};
template <typename T>
objects<T> FileManager<T>::load()
{
objects<T> 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 <typename T>
void FileManager<T>::save(const objects<T>& records)
{
std::vector<std::string> lines;
lines.push_back(T::getHeaders());
for (const auto& recordPair : records)
{
lines.push_back(recordPair.second->serialize());
}
FileIO::writeAllLines(m_filePath, lines);
}
@@ -135,11 +135,14 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="FileIO.h" />
<ClInclude Include="FileManager.h" />
<ClInclude Include="framework.h" /> <ClInclude Include="framework.h" />
<ClInclude Include="pch.h" /> <ClInclude Include="pch.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dllmain.cpp" /> <ClCompile Include="dllmain.cpp" />
<ClCompile Include="FileIO.cpp" />
<ClCompile Include="pch.cpp"> <ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
@@ -21,6 +21,12 @@
<ClInclude Include="pch.h"> <ClInclude Include="pch.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="FileManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="FileIO.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dllmain.cpp"> <ClCompile Include="dllmain.cpp">
@@ -29,5 +35,8 @@
<ClCompile Include="pch.cpp"> <ClCompile Include="pch.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="FileIO.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>
@@ -9,5 +9,10 @@
// add headers that you want to pre-compile here // add headers that you want to pre-compile here
#include "framework.h" #include "framework.h"
#include<memory>
#include<vector>
#include<fstream>
#include<string>
#include<stdexcept>
#endif //PCH_H #endif //PCH_H
@@ -1,4 +1,5 @@
#include "UserInterface.h" #include "UserInterface.h"
#include "FileManager.h"
int main() int main()
{ {
UserInterface userInterFace; UserInterface userInterFace;
@@ -102,12 +102,17 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(ProjectDir)models;$(ProjectDir)controllers;$(ProjectDir)services;$(ProjectDir)utilities;$(ProjectDir)factories;$(ProjectDir)datastores;$(ProjectDir)views;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(ProjectDir)models;$(ProjectDir)controllers;$(ProjectDir)services;$(ProjectDir)utilities;$(ProjectDir)factories;$(ProjectDir)datastores;$(ProjectDir)views;%(AdditionalIncludeDirectories);..\..\Trenser.FileManager\Trenser.FileManager</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>..\..\Trenser.FileManager\$(IntDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Trenser.FileManager.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<PostBuildEvent>
<Command>xcopy /y /d "..\..\Trenser.FileManager\$(IntDir)Trenser.FileManager.dll" "$(OutDir)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
@@ -117,11 +122,17 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>;..\..\Trenser.FileManager\Trenser.FileManager</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>..\..\Trenser.FileManager\$(IntDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Trenser.FileManager.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<PostBuildEvent>
<Command>xcopy /y /d "..\..\Trenser.FileManager\$(IntDir)Trenser.FileManager.dll" "$(OutDir)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="controllers\ZenvyController.cpp" /> <ClCompile Include="controllers\ZenvyController.cpp" />
@@ -162,9 +173,11 @@
<ClCompile Include="models\Employee.cpp" /> <ClCompile Include="models\Employee.cpp" />
<ClCompile Include="models\HRManager.cpp" /> <ClCompile Include="models\HRManager.cpp" />
<ClCompile Include="Trenser.Zenvy.cpp" /> <ClCompile Include="Trenser.Zenvy.cpp" />
<ClCompile Include="utilities\AuthorizationHelper.cpp" />
<ClCompile Include="utilities\Enums.cpp" /> <ClCompile Include="utilities\Enums.cpp" />
<ClCompile Include="utilities\InputHelper.cpp" /> <ClCompile Include="utilities\InputHelper.cpp" />
<ClCompile Include="utilities\OutputHelper.cpp" /> <ClCompile Include="utilities\OutputHelper.cpp" />
<ClCompile Include="utilities\StringHelper.cpp" />
<ClCompile Include="utilities\Timestamp.cpp" /> <ClCompile Include="utilities\Timestamp.cpp" />
<ClCompile Include="utilities\Validator.cpp" /> <ClCompile Include="utilities\Validator.cpp" />
<ClCompile Include="views\AdminMenu.cpp" /> <ClCompile Include="views\AdminMenu.cpp" />
@@ -213,9 +226,11 @@
<ClInclude Include="services\TalentAcquisitionManagementService.h" /> <ClInclude Include="services\TalentAcquisitionManagementService.h" />
<ClInclude Include="services\TeamManagementService.h" /> <ClInclude Include="services\TeamManagementService.h" />
<ClInclude Include="services\TicketManagementService.h" /> <ClInclude Include="services\TicketManagementService.h" />
<ClInclude Include="utilities\AuthorizationHelper.h" />
<ClInclude Include="utilities\Enums.h" /> <ClInclude Include="utilities\Enums.h" />
<ClInclude Include="utilities\InputHelper.h" /> <ClInclude Include="utilities\InputHelper.h" />
<ClInclude Include="utilities\OutputHelper.h" /> <ClInclude Include="utilities\OutputHelper.h" />
<ClInclude Include="utilities\StringHelper.h" />
<ClInclude Include="utilities\Timestamp.h" /> <ClInclude Include="utilities\Timestamp.h" />
<ClInclude Include="utilities\Validator.h" /> <ClInclude Include="utilities\Validator.h" />
<ClInclude Include="views\AdminMenu.h" /> <ClInclude Include="views\AdminMenu.h" />
@@ -195,6 +195,12 @@
<ClCompile Include="views\MenuHelper.cpp"> <ClCompile Include="views\MenuHelper.cpp">
<Filter>Views</Filter> <Filter>Views</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="utilities\AuthorizationHelper.cpp">
<Filter>Services</Filter>
</ClCompile>
<ClCompile Include="utilities\StringHelper.cpp">
<Filter>Utilities</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="services\AuthenticationManagementService.h"> <ClInclude Include="services\AuthenticationManagementService.h">
@@ -344,6 +350,12 @@
<ClInclude Include="views\MenuHelper.h"> <ClInclude Include="views\MenuHelper.h">
<Filter>Views</Filter> <Filter>Views</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="utilities\AuthorizationHelper.h">
<Filter>Services</Filter>
</ClInclude>
<ClInclude Include="utilities\StringHelper.h">
<Filter>Utilities</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="models\Employee.h"> <ClInclude Include="models\Employee.h">
@@ -17,9 +17,9 @@ void ZenvyController::changePassword(const std::string& password)
} }
//Employee Management //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) bool ZenvyController::deactivateEmployee(const std::string& id)
@@ -27,15 +27,39 @@ bool ZenvyController::deactivateEmployee(const std::string& id)
return m_employeeManagementService->deactivateEmployee(id); return m_employeeManagementService->deactivateEmployee(id);
} }
void ZenvyController::updateProfile(const std::string& name, const std::string& phone)
{
m_employeeManagementService->updateProfile(name,phone);
}
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> ZenvyController::searchEmployee(const std::string& name) std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> 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<const Employee> ZenvyController::getCurrentEmployee()
{
return m_employeeManagementService->getCurrentEmployee();
} }
Employees ZenvyController::getEmployees() Employees ZenvyController::getEmployees()
{ {
return m_employeeManagementService->getEmployees();
} }
std::shared_ptr<const Employee> ZenvyController::getEmployee(const std::string& id) void ZenvyController::loadStates()
{ {
m_employeeManagementService->loadEmployees();
m_payslipManagementService->loadPayrolls();
}
void ZenvyController::persistStates()
{
m_employeeManagementService->saveEmployees();
m_payslipManagementService->savePayrolls();
} }
@@ -45,9 +45,17 @@ public:
void changePassword(const std::string&); void changePassword(const std::string&);
//Employee Management //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&); bool deactivateEmployee(const std::string&);
Employees getEmployees(); Employees getEmployees();
std::shared_ptr<const Employee> getEmployee(const std::string&); std::shared_ptr<const Employee> getCurrentEmployee();
void updateProfile(const std::string&,const std::string&);
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> searchEmployee(const std::string&); std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> searchEmployee(const std::string&);
//Payslip management
void updateSalary(const std::string&, double, double, double, double, double);
//File Management
void loadStates();
void persistStates();
}; };
@@ -27,8 +27,7 @@ employeeMap& DataStore::getEmployees()
return m_employees; return m_employees;
} }
std::shared_ptr<Employee>& DataStore::getAuthenticatedUser() payrollMap& DataStore::getPayrolls()
{ {
return m_authenticatedEmployee; return m_payrolls;
} }
@@ -18,8 +18,10 @@
#include "Notification.h" #include "Notification.h"
#include "Announcement.h" #include "Announcement.h"
#include "Faq.h" #include "Faq.h"
#include "Payroll.h"
using employeeMap = std::map<std::string, std::shared_ptr<Employee>>; using employeeMap = std::map<std::string, std::shared_ptr<Employee>>;
using payrollMap = std::map<std::string, std::shared_ptr<Payroll>>;
using logMap = std::map<util::Timestamp, std::shared_ptr<Log>>; using logMap = std::map<util::Timestamp, std::shared_ptr<Log>>;
class DataStore class DataStore
@@ -27,6 +29,7 @@ class DataStore
private: private:
std::shared_ptr<Employee> m_authenticatedEmployee; std::shared_ptr<Employee> m_authenticatedEmployee;
employeeMap m_employees; employeeMap m_employees;
payrollMap m_payrolls;
logMap m_logs; logMap m_logs;
DataStore() = default; DataStore() = default;
public: public:
@@ -36,7 +39,7 @@ public:
DataStore(DataStore&&) = delete; DataStore(DataStore&&) = delete;
DataStore& operator=(DataStore&&) = delete; DataStore& operator=(DataStore&&) = delete;
employeeMap& getEmployees(); employeeMap& getEmployees();
std::shared_ptr<Employee>& getAuthenticatedUser(); payrollMap& getPayrolls();
logMap& getLogs(); logMap& getLogs();
std::shared_ptr<Employee>& getAuthenticatedEmployee(); std::shared_ptr<Employee>& getAuthenticatedEmployee();
void setAuthenticatedEmployee(std::shared_ptr < Employee>); void setAuthenticatedEmployee(std::shared_ptr < Employee>);
+19 -4
View File
@@ -3,15 +3,30 @@
class Admin : public Employee class Admin : public Employee
{ {
public:
Admin() = default; Admin() = default;
Admin( Admin(
const std::string& password,
const std::string& name, const std::string& name,
const std::string& phone, const std::string& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
std::shared_ptr<Payroll> payroll std::shared_ptr<Payroll> 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; ~Admin() = default;
}; };
@@ -1,6 +1,6 @@
#include "Announcement.h" #include "Announcement.h"
int Announcement::m_anid = 0; int Announcement::m_uid = 0;
const std::string& Announcement::getAnnouncementId() const const std::string& Announcement::getAnnouncementId() const
{ {
@@ -5,14 +5,14 @@
class Announcement class Announcement
{ {
private: private:
static int m_anid; static int m_uid;
std::string m_id; std::string m_id;
util::Timestamp m_timestamp; util::Timestamp m_timestamp;
std::string m_message; std::string m_message;
public: 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) 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 std::string& getAnnouncementId() const;
const util::Timestamp& getAnnouncementTimestamp() const; const util::Timestamp& getAnnouncementTimestamp() const;
const std::string& getAnnouncementMessage() const; const std::string& getAnnouncementMessage() const;
@@ -1,6 +1,6 @@
#include "Attendance.h" #include "Attendance.h"
int Attendance::m_aid = 0; int Attendance::m_uid = 0;
const std::string& Attendance::getAttendanceId() const const std::string& Attendance::getAttendanceId() const
{ {
@@ -5,15 +5,15 @@
class Attendance class Attendance
{ {
private: private:
static int m_aid; static int m_uid;
std::string m_id; std::string m_id;
util::Timestamp m_loginTime; util::Timestamp m_loginTime;
util::Timestamp m_logoutTime; util::Timestamp m_logoutTime;
public: 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, Attendance(const util::Timestamp& loginTime,
const util::Timestamp& logoutTime) 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 std::string& getAttendanceId() const;
const util::Timestamp& getLoginTime() const; const util::Timestamp& getLoginTime() const;
const util::Timestamp& getLogoutTime() const; const util::Timestamp& getLogoutTime() const;
@@ -1,6 +1,6 @@
#include "Booking.h" #include "Booking.h"
int Booking::m_bid = 0; int Booking::m_uid = 0;
const std::string& Booking::getBookingId() const const std::string& Booking::getBookingId() const
{ {
+3 -3
View File
@@ -7,19 +7,19 @@
class Booking class Booking
{ {
private: private:
static int m_bid; static int m_uid;
std::string m_id; std::string m_id;
util::Timestamp m_startTime; util::Timestamp m_startTime;
util::Timestamp m_endTime; util::Timestamp m_endTime;
std::string m_employeeId; std::string m_employeeId;
std::shared_ptr<Team> m_team; std::shared_ptr<Team> m_team;
public: 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, Booking(const util::Timestamp& startTime,
const util::Timestamp& endTime, const util::Timestamp& endTime,
const std::string& employeeId, const std::string& employeeId,
std::shared_ptr<Team> team) std::shared_ptr<Team> 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 std::string& getBookingId() const;
const util::Timestamp& getStartTime() const; const util::Timestamp& getStartTime() const;
const util::Timestamp& getEndTime() const; const util::Timestamp& getEndTime() const;
@@ -1,6 +1,6 @@
#include "Candidate.h" #include "Candidate.h"
int Candidate::m_cid = 0; int Candidate::m_uid = 0;
const std::string& Candidate::getCandidateId() const const std::string& Candidate::getCandidateId() const
{ {
@@ -5,19 +5,19 @@
class Candidate class Candidate
{ {
private: private:
static int m_cid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_name; std::string m_name;
long int m_phone; long int m_phone;
std::string m_qualification; std::string m_qualification;
Enums::CandidateStatus m_status; Enums::CandidateStatus m_status;
public: 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, Candidate(const std::string& name,
long int phone, long int phone,
const std::string& qualification, const std::string& qualification,
Enums::CandidateStatus status) 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& getCandidateId() const;
const std::string& getCandidateName() const; const std::string& getCandidateName() const;
long int getCandidatePhone() const; long int getCandidatePhone() const;
+150 -1
View File
@@ -1,8 +1,45 @@
#include <sstream>
#include "Employee.h" #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; 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; return m_id;
} }
@@ -130,3 +167,115 @@ Enums::EmployeeType Employee::getEmployeeType() const
{ {
return m_employeeType; 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> 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<ITExecutive>(
id,
name,
phone,
password,
email,
teamId,
teamStatus,
accountStatus
);
case Enums::EmployeeType::FINANCE:
return Factory::getObject<FinanceExecutive>(
id,
name,
phone,
password,
email,
teamId,
teamStatus,
accountStatus
);
case Enums::EmployeeType::HR:
return Factory::getObject<HRManager>(
id,
name,
phone,
password,
email,
teamId,
teamStatus,
accountStatus
);
case Enums::EmployeeType::TEAM:
return Factory::getObject<TeamExecutive>(
id,
name,
phone,
password,
email,
teamId,
teamStatus,
accountStatus
);
case Enums::EmployeeType::TALENT_ACQUISITION:
return Factory::getObject<TalentExecutive>(
id,
name,
phone,
password,
email,
teamId,
teamStatus,
accountStatus
);
case Enums::EmployeeType::ADMIN:
return Factory::getObject<Admin>(
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";
}
+36 -7
View File
@@ -7,13 +7,14 @@
#include "Leave.h" #include "Leave.h"
#include "Payroll.h" #include "Payroll.h"
#include "Enums.h" #include "Enums.h"
#include "ApplicationConfig.h"
using payslipMap = std::map<std::string, std::shared_ptr<Payslip>>; using payslipMap = std::map<std::string, std::shared_ptr<Payslip>>;
using attendanceMap = std::map<int, std::map<std::string, std::shared_ptr<Attendance>>>; using attendanceMap = std::map<int, std::map<std::string, std::shared_ptr<Attendance>>>;
using leaveMap = std::map<std::string, std::shared_ptr<Leave>>; using leaveMap = std::map<std::string, std::shared_ptr<Leave>>;
class Employee class Employee
{ {
private: protected:
static int m_uid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_password; std::string m_password;
@@ -29,16 +30,41 @@ private:
leaveMap m_leaves; leaveMap m_leaves;
Enums::EmployeeType m_employeeType; Enums::EmployeeType m_employeeType;
public: 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()
Employee(const std::string& password, : m_id("EMP" + std::to_string(++m_uid)),
const std::string& name, 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& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
Enums::EmployeeType employeeType, Enums::EmployeeType employeeType,
std::shared_ptr<Payroll> payroll) std::shared_ptr<Payroll> 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) { } : m_id("EMP" + std::to_string(++m_uid)),
const std::string& getEmployeeId() const; 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& getEmployeePassword() const;
const std::string& getEmployeeName() const; const std::string& getEmployeeName() const;
const std::string& getEmployeePhone() const; const std::string& getEmployeePhone() const;
@@ -62,5 +88,8 @@ public:
void addAttendance(std::shared_ptr<Attendance> attendance); void addAttendance(std::shared_ptr<Attendance> attendance);
void addLeave(std::shared_ptr<Leave> leave); void addLeave(std::shared_ptr<Leave> leave);
Enums::EmployeeType getEmployeeType() const; Enums::EmployeeType getEmployeeType() const;
virtual std::string serialize() const;
static std::shared_ptr<Employee> deserialize(const std::string&);
static std::string getHeaders();
virtual ~Employee() = default; virtual ~Employee() = default;
}; };
@@ -1,5 +1,4 @@
#pragma once #pragma once
#include<string>
#include "Employee.h" #include "Employee.h"
class FinanceExecutive : public Employee class FinanceExecutive : public Employee
@@ -7,13 +6,28 @@ class FinanceExecutive : public Employee
public: public:
FinanceExecutive() = default; FinanceExecutive() = default;
FinanceExecutive( FinanceExecutive(
const std::string& password,
const std::string& name, const std::string& name,
const std::string& phone, const std::string& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
std::shared_ptr<Payroll> payroll std::shared_ptr<Payroll> 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; ~FinanceExecutive() = default;
}; };
@@ -1,4 +1,6 @@
#include <sstream>
#include "GeneralEmployee.h" #include "GeneralEmployee.h"
#include "Factory.h"
Enums::EmployeeDesignation GeneralEmployee::getDesignation() const Enums::EmployeeDesignation GeneralEmployee::getDesignation() const
{ {
@@ -8,4 +10,57 @@ Enums::EmployeeDesignation GeneralEmployee::getDesignation() const
void GeneralEmployee::setDesignation(Enums::EmployeeDesignation designation) void GeneralEmployee::setDesignation(Enums::EmployeeDesignation designation)
{ {
m_designation = 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> 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<GeneralEmployee>(
id,
name,
phone,
password,
email,
teamId,
teamStatus,
employeeDesignation,
accountStatus
);
}
std::string GeneralEmployee::getHeaders()
{
return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType,EmployeeDesignation";
} }
@@ -7,16 +7,42 @@ class GeneralEmployee : public Employee
private: private:
Enums::EmployeeDesignation m_designation; Enums::EmployeeDesignation m_designation;
public: public:
GeneralEmployee() : m_designation(Enums::EmployeeDesignation::JUNIOR) {} GeneralEmployee()
GeneralEmployee(const std::string& id, : m_designation(Enums::EmployeeDesignation::JUNIOR) {}
const std::string& password, GeneralEmployee(const std::string& name,
const std::string& name,
const std::string& phone, const std::string& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
std::shared_ptr<Payroll> payroll, std::shared_ptr<Payroll> 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; Enums::EmployeeDesignation getDesignation() const;
void setDesignation(Enums::EmployeeDesignation designation); void setDesignation(Enums::EmployeeDesignation designation);
std::string serialize() const override;
static std::shared_ptr<GeneralEmployee> deserialize(const std::string&);
static std::string getHeaders();
~GeneralEmployee() = default; ~GeneralEmployee() = default;
}; };
+19 -4
View File
@@ -3,16 +3,31 @@
class HRManager : public Employee class HRManager : public Employee
{ {
public:
HRManager() = default; HRManager() = default;
HRManager( HRManager(
const std::string& password,
const std::string& name, const std::string& name,
const std::string& phone, const std::string& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
std::shared_ptr<Payroll> payroll std::shared_ptr<Payroll> 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; ~HRManager() = default;
}; };
@@ -3,16 +3,31 @@
class ITExecutive : public Employee class ITExecutive : public Employee
{ {
public:
ITExecutive() = default; ITExecutive() = default;
ITExecutive( ITExecutive(
const std::string& password,
const std::string& name, const std::string& name,
const std::string& phone, const std::string& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
std::shared_ptr<Payroll> payroll std::shared_ptr<Payroll> 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; ~ITExecutive() = default;
}; };
@@ -1,6 +1,6 @@
#include "JobListing.h" #include "JobListing.h"
int JobListing::m_jid = 0; int JobListing::m_uid = 0;
const std::string& JobListing::getJobId() const const std::string& JobListing::getJobId() const
{ {
@@ -9,7 +9,7 @@ using candidateMap = std::map<std::string, std::shared_ptr<Candidate>>;
class JobListing class JobListing
{ {
private: private:
static int m_jid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_name; std::string m_name;
std::string m_description; std::string m_description;
@@ -17,13 +17,13 @@ private:
int m_numberOfVacancies; int m_numberOfVacancies;
candidateMap m_candidates; candidateMap m_candidates;
public: 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, JobListing(const std::string& name,
const std::string& description, const std::string& description,
Enums::JobListingStatus status, Enums::JobListingStatus status,
int numberOfVacancies, int numberOfVacancies,
const candidateMap& candidates) 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& getJobId() const;
const std::string& getJobName() const; const std::string& getJobName() const;
const std::string& getJobDescription() const; const std::string& getJobDescription() const;
+1 -1
View File
@@ -1,6 +1,6 @@
#include "Leave.h" #include "Leave.h"
int Leave::m_lid = 0; int Leave::m_uid = 0;
const std::string& Leave::getLeaveId() const const std::string& Leave::getLeaveId() const
{ {
+3 -3
View File
@@ -6,7 +6,7 @@
class Leave class Leave
{ {
private: private:
static int m_lid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_employeeId; std::string m_employeeId;
util::Timestamp m_timestamp; util::Timestamp m_timestamp;
@@ -16,12 +16,12 @@ private:
static int m_numberOfMedicalLeave; static int m_numberOfMedicalLeave;
Enums::LeaveType m_leaveType; Enums::LeaveType m_leaveType;
public: 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, Leave(const std::string& employeeId,
const util::Timestamp& timestamp, const util::Timestamp& timestamp,
const std::string& reason, const std::string& reason,
Enums::LeaveType leaveType) 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& getLeaveId() const;
const std::string& getEmployeeId() const; const std::string& getEmployeeId() const;
const util::Timestamp& getTimestamp() const; const util::Timestamp& getTimestamp() const;
@@ -1,6 +1,6 @@
#include "Notification.h" #include "Notification.h"
int Notification::m_nid = 0; int Notification::m_uid = 0;
const std::string& Notification::getNotificationId() const const std::string& Notification::getNotificationId() const
{ {
@@ -6,18 +6,18 @@
class Notification class Notification
{ {
private: private:
static int m_nid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_employeeId; std::string m_employeeId;
std::string m_message; std::string m_message;
util::Timestamp m_timestamp; util::Timestamp m_timestamp;
Enums::NotificationStatus m_notificationStatus; Enums::NotificationStatus m_notificationStatus;
public: 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, Notification(const std::string& employeeId,
const std::string& message, const std::string& message,
Enums::NotificationStatus notificationStatus) 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& getNotificationId() const;
const std::string& getEmployeeId() const; const std::string& getEmployeeId() const;
const std::string& getNotificationMessage() const; const std::string& getNotificationMessage() const;
+94 -4
View File
@@ -1,12 +1,48 @@
#include <sstream>
#include <stdexcept>
#include "Payroll.h" #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; 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 double Payroll::getBasicSalary() const
{ {
return m_basicSalary; return m_basicSalary;
@@ -32,9 +68,9 @@ double Payroll::getEmployerPFContribution() const
return m_employerPFContribution; 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) void Payroll::setHouseRentAllowance(double value)
@@ -55,4 +91,58 @@ void Payroll::setEmployeePFContribution(double value)
void Payroll::setEmployerPFContribution(double value) void Payroll::setEmployerPFContribution(double value)
{ {
m_employerPFContribution = 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> 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<Payroll>(
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";
} }
+34 -9
View File
@@ -1,33 +1,58 @@
#pragma once #pragma once
#include <string> #include <string>
#include <memory>
class Payroll class Payroll
{ {
private: private:
static int m_prid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_employeeId;
double m_basicSalary; double m_basicSalary;
double m_houseRentAllowance; double m_houseRentAllowance;
double m_foodAllowance; double m_foodAllowance;
double m_employeePFContribution; double m_employeePFContribution;
double m_employerPFContribution; double m_employerPFContribution;
public: 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, Payroll(double basicSalary,
double houseRentAllowance, double houseRentAllowance,
double foodAllowance, double foodAllowance,
double employeePFContribution, double employeePFContribution,
double employerPFContribution) 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) {} : m_id("PR" + std::to_string(++m_uid)),
const std::string& getPayrollId() const; 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 getBasicSalary() const;
double getHouseRentAllowance() const; double getHouseRentAllowance() const;
double getFoodAllowance() const; double getFoodAllowance() const;
double getEmployeePFContribution() const; double getEmployeePFContribution() const;
double getEmployerPFContribution() const; double getEmployerPFContribution() const;
void setPayrollID(const std::string& id); void setBasicSalary(double);
void setHouseRentAllowance(double value); void setHouseRentAllowance(double);
void setFoodAllowance(double value); void setFoodAllowance(double);
void setEmployeePFContribution(double value); void setEmployeePFContribution(double);
void setEmployerPFContribution(double value); void setEmployerPFContribution(double);
virtual std::string serialize() const;
static std::shared_ptr<Payroll> deserialize(const std::string&);
static std::string getHeaders();
}; };
@@ -1,6 +1,6 @@
#include "Payslip.h" #include "Payslip.h"
int Payslip::m_pid = 0; int Payslip::m_uid = 0;
const std::string& Payslip::getPayslipId() const const std::string& Payslip::getPayslipId() const
{ {
+3 -3
View File
@@ -4,12 +4,12 @@
class Payslip class Payslip
{ {
private: private:
static int m_pid; static int m_uid;
std::string m_id; std::string m_id;
double m_salary; double m_salary;
public: public:
Payslip() : m_id("PS" + std::to_string(++m_pid)), m_salary(0.0) {} Payslip() : m_id("PS" + std::to_string(++m_uid)), m_salary(0.0) {}
Payslip(const double salary) : m_id("PS" + std::to_string(++m_pid)), m_salary(salary) {} Payslip(const double salary) : m_id("PS" + std::to_string(++m_uid)), m_salary(salary) {}
const std::string& getPayslipId() const; const std::string& getPayslipId() const;
double getSalary() const; double getSalary() const;
void setPayslipId(const std::string& id); void setPayslipId(const std::string& id);
+1 -1
View File
@@ -1,6 +1,6 @@
#include "Room.h" #include "Room.h"
int Room::m_rid = 0; int Room::m_uid = 0;
const std::string& Room::getRoomId() const const std::string& Room::getRoomId() const
{ {
+3 -3
View File
@@ -8,13 +8,13 @@ using bookingMap = std::map<std::string, std::shared_ptr<Booking>>;
class Room class Room
{ {
private: private:
static int m_rid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_name; std::string m_name;
bookingMap m_bookings; bookingMap m_bookings;
public: public:
Room() : m_id("RM" + std::to_string(++m_rid)), m_name("") {} Room() : m_id("RM" + std::to_string(++m_uid)), m_name("") {}
Room(const std::string& name) : m_id("RM" + std::to_string(++m_rid)), m_name(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& getRoomId() const;
const std::string& getRoomName() const; const std::string& getRoomName() const;
const bookingMap& getBookings() const; const bookingMap& getBookings() const;
@@ -3,16 +3,32 @@
class TalentExecutive : public Employee class TalentExecutive : public Employee
{ {
public:
TalentExecutive() = default; TalentExecutive() = default;
TalentExecutive( TalentExecutive(
const std::string& password,
const std::string& name, const std::string& name,
const std::string& phone, const std::string& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
std::shared_ptr<Payroll> payroll std::shared_ptr<Payroll> 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; ~TalentExecutive() = default;
}; };
+1 -1
View File
@@ -1,6 +1,6 @@
#include "Team.h" #include "Team.h"
int Team::m_tmid = 0; int Team::m_uid = 0;
const std::string& Team::getTeamId() const const std::string& Team::getTeamId() const
{ {
+3 -3
View File
@@ -8,19 +8,19 @@ using employeeMap = std::map<std::string, std::shared_ptr<Employee>>;
class Team class Team
{ {
private: private:
static int m_tmid; static int m_uid;
std::string m_id; std::string m_id;
std::string m_name; std::string m_name;
std::shared_ptr<Employee> m_lead; std::shared_ptr<Employee> m_lead;
employeeMap m_employees; employeeMap m_employees;
int m_maximumNumberOfEmployees; int m_maximumNumberOfEmployees;
public: 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( Team(
const std::string& name, const std::string& name,
std::shared_ptr<Employee> lead, std::shared_ptr<Employee> lead,
int maximumNumberOfEmployees) 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& getTeamId() const;
const std::string& getTeamName() const; const std::string& getTeamName() const;
@@ -3,16 +3,31 @@
class TeamExecutive : public Employee class TeamExecutive : public Employee
{ {
public:
TeamExecutive() = default; TeamExecutive() = default;
TeamExecutive( TeamExecutive(
const std::string& password,
const std::string& name, const std::string& name,
const std::string& phone, const std::string& phone,
const std::string& email, const std::string& email,
const std::string& teamId,
std::shared_ptr<Payroll> payroll std::shared_ptr<Payroll> 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; ~TeamExecutive() = default;
}; };
@@ -1,6 +1,6 @@
#include "Ticket.h" #include "Ticket.h"
int Ticket::m_tid = 0; int Ticket::m_uid = 0;
const std::string& Ticket::getTicketId() const const std::string& Ticket::getTicketId() const
{ {
+3 -3
View File
@@ -5,20 +5,20 @@
class Ticket class Ticket
{ {
private: private:
static int m_tid; static int m_uid;
std::string m_id; std::string m_id;
Enums::TicketType m_type; Enums::TicketType m_type;
std::string m_description; std::string m_description;
Enums::TicketStatus m_status; Enums::TicketStatus m_status;
std::string m_employeeId; std::string m_employeeId;
public: 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( Ticket(
Enums::TicketType type, Enums::TicketType type,
const std::string& description, const std::string& description,
const std::string& employeeId, const std::string& employeeId,
Enums::TicketStatus status) 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; const std::string& getTicketId() const;
Enums::TicketType getTicketType() const; Enums::TicketType getTicketType() const;
const std::string& getDescription() const; const std::string& getDescription() const;
@@ -9,30 +9,32 @@ namespace Config
namespace Payroll namespace Payroll
{ {
constexpr double TEAM_LEAD_BASIC_SALARY = 0.0; constexpr double SENIOR_BASIC_SALARY = 80000.0;
constexpr double TEAM_LEAD_HOUSE_RENT_ALLOWANCE = 0.0; constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 32000.0;
constexpr double TEAM_LEAD_FOOD_ALLOWANCE = 0.0; constexpr double SENIOR_FOOD_ALLOWANCE = 3000.0;
constexpr double TEAM_LEAD_EMPLOYEE_PF_CONTRIBUTION = 0.0; constexpr double SENIOR_EMPLOYEE_PF_CONTRIBUTION = 9600.0;
constexpr double TEAM_LEAD_EMPLOYER_PF_CONTRIBUTION = 0.0; constexpr double SENIOR_EMPLOYER_PF_CONTRIBUTION = 9600.0;
constexpr double SENIOR_BASIC_SALARY = 0.0; constexpr double JUNIOR_BASIC_SALARY = 25000.0;
constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 0.0; constexpr double JUNIOR_HOUSE_RENT_ALLOWANCE = 10000.0;
constexpr double SENIOR_FOOD_ALLOWANCE = 0.0; constexpr double JUNIOR_FOOD_ALLOWANCE = 1500.0;
constexpr double SENIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; constexpr double JUNIOR_EMPLOYEE_PF_CONTRIBUTION = 3000.0;
constexpr double SENIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; constexpr double JUNIOR_EMPLOYER_PF_CONTRIBUTION = 3000.0;
constexpr double JUNIOR_BASIC_SALARY = 0.0; constexpr double HR_MANAGER_BASIC_SALARY = 60000.0;
constexpr double JUNIOR_HOUSE_RENT_ALLOWANCE = 0.0; constexpr double HR_MANAGER_HOUSE_RENT_ALLOWANCE = 24000.0;
constexpr double JUNIOR_FOOD_ALLOWANCE = 0.0; constexpr double HR_MANAGER_FOOD_ALLOWANCE = 2500.0;
constexpr double JUNIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; constexpr double HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION = 7200.0;
constexpr double JUNIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; constexpr double HR_MANAGER_EMPLOYER_PF_CONTRIBUTION = 7200.0;
constexpr double HR_MANAGER_BASIC_SALARY = 0.0; constexpr double EXECUTIVE_BASIC_SALARY = 45000.0;
constexpr double HR_MANAGER_HOUSE_RENT_ALLOWANCE = 0.0; constexpr double EXECUTIVE_HOUSE_RENT_ALLOWANCE = 18000.0;
constexpr double HR_MANAGER_FOOD_ALLOWANCE = 0.0; constexpr double EXECUTIVE_FOOD_ALLOWANCE = 2000.0;
constexpr double HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION = 0.0; constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 5400.0;
constexpr double HR_MANAGER_EMPLOYER_PF_CONTRIBUTION = 0.0; constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 5400.0;
constexpr double EXECUTIVE_BASIC_SALARY = 0.0; }
constexpr double EXECUTIVE_HOUSE_RENT_ALLOWANCE = 0.0;
constexpr double EXECUTIVE_FOOD_ALLOWANCE = 0.0; namespace File
constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 0.0; {
constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 0.0; 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";
} }
} }
@@ -49,7 +49,7 @@ AuthenticationDTO AuthenticationManagementService::login(const std::string& emai
void AuthenticationManagementService::changePassword(const std::string& password) void AuthenticationManagementService::changePassword(const std::string& password)
{ {
std::shared_ptr<Employee> authenticatedUser = m_dataStore.getAuthenticatedUser(); std::shared_ptr<Employee> authenticatedUser = m_dataStore.getAuthenticatedEmployee();
if (authenticatedUser) if (authenticatedUser)
{ {
authenticatedUser->setEmployeePassword(password); authenticatedUser->setEmployeePassword(password);
@@ -61,8 +61,8 @@ void AuthenticationManagementService::changePassword(const std::string& password
} }
void AuthenticationManagementService::logout() { void AuthenticationManagementService::logout() {
if (m_dataStore.getAuthenticatedUser()) { if (m_dataStore.getAuthenticatedEmployee()) {
m_dataStore.getAuthenticatedUser() = nullptr; m_dataStore.getAuthenticatedEmployee() = nullptr;
} }
else { else {
throw std::runtime_error("No user currently logged In..."); throw std::runtime_error("No user currently logged In...");
@@ -1,17 +1,165 @@
#include <map>
#include <stdexcept>
#include "EmployeeManagementService.h" #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<Employee> authenticatedEmployee = m_dataStore.getAuthenticatedEmployee();
if (!authenticatedEmployee)
{
throw std::runtime_error("No authenticated user");
}
Enums::EmployeeType authenticatedEmployeeType = authenticatedEmployee->getEmployeeType();
std::shared_ptr<Employee> employee;
std::shared_ptr<Payroll> 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<Payroll>(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<HRManager>(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<Payroll>(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<ITExecutive>(name, phone, email, payroll);
break;
case Enums::EmployeeType::FINANCE:
employee = Factory::getObject<FinanceExecutive>(name, phone, email, payroll);
break;
case Enums::EmployeeType::TEAM:
employee = Factory::getObject<TeamExecutive>(name, phone, email, payroll);
break;
case Enums::EmployeeType::TALENT_ACQUISITION:
employee = Factory::getObject <TalentExecutive> (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<Payroll>(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<Payroll>(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<GeneralEmployee>(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) 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 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<const Employee> EmployeeManagementService::getEmployee(const std::string& id)
std::shared_ptr<const Employee> EmployeeManagementService::getCurrentEmployee()
{ {
return m_dataStore.getAuthenticatedEmployee();
} }
void EmployeeManagementService::updateProfile(const std::string& name,const std::string& phone)
{
std::shared_ptr<Employee> employee = m_dataStore.getAuthenticatedEmployee();
employee->setEmployeeName(name);
employee->setEmployeePhone(phone);
}
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> EmployeeManagementService::searchEmployee(const std::string& name) std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> EmployeeManagementService::searchEmployee(const std::string& name)
{ {
std::shared_ptr<Employee> currentUser = m_dataStore.getAuthenticatedEmployee(); std::shared_ptr<Employee> currentUser = m_dataStore.getAuthenticatedEmployee();
@@ -22,8 +170,8 @@ std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> Emp
{ {
return std::make_pair(employeeType, employeeList); return std::make_pair(employeeType, employeeList);
} }
for (const auto& entry : employees) { for (const auto& employeePair : employees) {
const auto& employee = entry.second; const auto& employee = employeePair.second;
if (!employee) if (!employee)
{ {
continue; continue;
@@ -39,3 +187,50 @@ std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> Emp
} }
return { employeeType, employeeList }; return { employeeType, employeeList };
} }
void EmployeeManagementService::loadEmployees()
{
FileManager<Employee> employeeFileManager(Config::File::EMPLOYEES_FILE);
FileManager<GeneralEmployee> 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", "", "admin@trenser.com", nullptr);
employees.emplace(std::make_pair(admin->getId(), admin));
}
}
void EmployeeManagementService::saveEmployees()
{
FileManager<Employee> employeeFileManager(Config::File::EMPLOYEES_FILE);
FileManager<GeneralEmployee> generalEmployeeFileManager(Config::File::GENERAL_EMPLOYEES_FILE);
const auto& allEmployees = m_dataStore.getEmployees();
employeeMap employees;
std::map<std::string, std::shared_ptr<GeneralEmployee>> generalEmployees;
for (auto& employeePair : allEmployees)
{
if (employeePair.second->getEmployeeType() == Enums::EmployeeType::GENERAL)
{
generalEmployees.emplace(employeePair.first, std::static_pointer_cast<GeneralEmployee>(employeePair.second));
}
else
{
employees.emplace(employeePair);
}
}
employeeFileManager.save(employees);
generalEmployeeFileManager.save(generalEmployees);
}
@@ -14,9 +14,12 @@ private:
DataStore& m_dataStore; DataStore& m_dataStore;
public: public:
EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; 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&); bool deactivateEmployee(const std::string&);
Employees getEmployees(); Employees getEmployees();
std::shared_ptr<const Employee> getEmployee(const std::string&); void updateProfile(const std::string&,const std::string&);
std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> searchEmployee(const std::string&); std::pair<Enums::EmployeeType, std::vector<std::shared_ptr<const Employee>>> searchEmployee(const std::string&);
std::shared_ptr<const Employee> getCurrentEmployee();
void loadEmployees();
void saveEmployees();
}; };
@@ -1 +1,50 @@
#include <stdexcept>
#include "PayslipManagementService.h" #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<Payroll> 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<Payroll> payrollFileManager(Config::File::PAYROLL_FILE);
auto& payrolls = m_dataStore.getPayrolls();
payrollFileManager.save(payrolls);
}
@@ -1,4 +1,7 @@
#pragma once #pragma once
#include <string>
#include<stdexcept>
#include"DataStore.h"
class PayslipManagementService class PayslipManagementService
{ {
@@ -6,4 +9,7 @@ private:
DataStore& m_dataStore; DataStore& m_dataStore;
public: public:
PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; PayslipManagementService() : m_dataStore(DataStore::getInstance()) {};
void updateSalary(const std::string&, double, double, double, double, double);
void loadPayrolls();
void savePayrolls();
}; };
@@ -0,0 +1 @@
#include "AuthorizationHelper.h"
@@ -0,0 +1,31 @@
#pragma once
#include <stdexcept>
#include "Enums.h"
namespace util
{
inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first)
{
return current == first;
}
template <typename... Rest>
inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first,
Rest... rest)
{
if (current == first)
{
return true;
}
return isAuthorized(current, rest...);
}
template <typename... Allowed>
inline void enforceAuthorization(Enums::EmployeeType current, Allowed... allowed)
{
if (!isAuthorized(current, allowed...))
{
throw std::runtime_error("You are unauthorized to perform this operation!");
}
}
}
+113 -141
View File
@@ -76,7 +76,7 @@ namespace Enums {
GENERAL, GENERAL,
IT, IT,
FINANCE, FINANCE,
TAG, TALENT_ACQUISITION,
HR, HR,
TEAM, TEAM,
ADMIN, ADMIN,
@@ -91,33 +91,75 @@ namespace Enums {
INVALID_PASSWORD INVALID_PASSWORD
}; };
std::string getAccountStatus(AccountStatus status) inline std::string getAccountStatusString(AccountStatus status)
{ {
switch (status) switch (status)
{ {
case AccountStatus::ACTIVE: case AccountStatus::ACTIVE:
return "Active"; return "ACTIVE";
case AccountStatus::INACTIVE: case AccountStatus::INACTIVE:
return "Inactive"; return "INACTIVE";
default: default:
return "Unknown"; return "UNKNOWN";
} }
} }
std::string getTeamStatus(TeamStatus status) inline std::string getEmployeeTypeString(EmployeeType type)
{ {
switch (status) switch (type)
{ {
case TeamStatus::IN_TEAM: case EmployeeType::GENERAL:
return "In Team"; return "GENERAL";
case TeamStatus::NOT_IN_TEAM: case EmployeeType::IT:
return "Not in Team"; return "IT";
default: case EmployeeType::FINANCE:
return "Unknown"; 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) switch (status)
{ {
@@ -128,149 +170,79 @@ namespace Enums {
} }
} }
std::string getNotificationStatus(NotificationStatus status) { inline AccountStatus getAccountStatus(const std::string& input)
switch (status) {
if (input == "ACTIVE")
{ {
case NotificationStatus::READ: return AccountStatus::ACTIVE;
return "Read";
case NotificationStatus::UNREAD:
return "Unread";
default:
return "Unknown";
} }
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 EmployeeType::GENERAL;
return "Pending";
case LeaveStatus::APPROVED:
return "Approved";
case LeaveStatus::REJECTED:
return "Rejected";
default:
return "Unknown";
} }
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 TeamStatus::IN_TEAM;
return "General Leave";
case LeaveType::MEDICAL:
return "Medical Leave";
case LeaveType::RESTRICTED:
return "Restricted Leave";
default:
return "Unknown";
} }
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 EmployeeDesignation::JUNIOR;
return "Open";
case JobListingStatus::CLOSED:
return "Closed";
default:
return "Unknown";
} }
} if (input == "SENIOR")
std::string getTicketStatus(TicketStatus status)
{
switch (status)
{ {
case TicketStatus::OPEN: return EmployeeDesignation::SENIOR;
return "Open";
case TicketStatus::RESOLVED:
return "Resolved";
case TicketStatus::CLOSED:
return "Closed";
default:
return "Unknown";
} }
} if (input == "TEAM_LEAD")
std::string getTicketType(TicketType type)
{
switch (type)
{ {
case TicketType::IT: return EmployeeDesignation::TEAM_LEAD;
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::INVALID;
} }
} }
@@ -24,6 +24,7 @@ namespace util
inline void pressEnter() inline void pressEnter()
{ {
std::cout << std::endl;
system("pause"); system("pause");
} }
} }
@@ -0,0 +1,15 @@
#include "StringHelper.h"
#include <cctype>
int util::extractNumber(const std::string& input)
{
int result = 0;
for (char character : input)
{
if (std::isdigit(static_cast<unsigned char>(character)))
{
result = result * 10 + (character - '0');
}
}
return result;
}
@@ -0,0 +1,7 @@
#pragma once
#include <string>
namespace util
{
int extractNumber(const std::string&);
}
@@ -1,6 +1,6 @@
#include <string>
#include <cctype> #include <cctype>
#include "Validator.h" #include "Validator.h"
#include "Employee.h"
#include "ApplicationConfig.h" #include "ApplicationConfig.h"
bool util::isPhoneNumberValid(const std::string& phoneNumber) { 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) { bool util::isEmailValid(const std::string& email) {
size_t index = email.find('@'); 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) if (email.find('@', index + 1) != std::string::npos)
{ {
return false; return false;
@@ -69,3 +72,54 @@ bool util::isPasswordValid(const std::string& password)
} }
return hasUpper && hasLower && hasDigit && hasSpecial; return hasUpper && hasLower && hasDigit && hasSpecial;
} }
bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std::map<std::string, std::shared_ptr<Employee>> & 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<std::string, std::shared_ptr<Employee>>& 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<std::string, std::shared_ptr<Employee>>& 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<std::shared_ptr<const Employee>>& employees)
{
for (const auto& employee : employees)
{
if (employee->getEmployeePhone() == phone)
{
return true;
}
}
return false;
}
@@ -1,11 +1,21 @@
#pragma once #pragma once
#include<string> #include<string>
#include<map>
#include<memory>
#include<vector>
#include<algorithm> #include<algorithm>
#include<cctype> #include<cctype>
#include "Enums.h"
class Employee;
namespace util namespace util
{ {
bool isPhoneNumberValid(const std::string&); bool isPhoneNumberValid(const std::string&);
bool isEmailValid(const std::string&); bool isEmailValid(const std::string&);
bool isPasswordValid(const std::string&); bool isPasswordValid(const std::string&);
bool hasActiveEmployeeOfType(Enums::EmployeeType, const std::map<std::string, std::shared_ptr<Employee>>&);
bool isEmailDuplicate(const std::string&, const std::map<std::string, std::shared_ptr<Employee>>&);
bool isPhoneDuplicate(const std::string&, const std::map<std::string, std::shared_ptr<Employee>>&);
bool isPhoneDuplicate(const std::string&, const std::vector<std::shared_ptr<const Employee>>&);
} }
+11 -11
View File
@@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include "AdminMenu.h" #include "AdminMenu.h"
#include "InputHelper.h" #include"InputHelper.h"
#include "OutputHelper.h" #include"OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void AdminMenu::run() void AdminMenu::run()
@@ -13,7 +13,7 @@ void AdminMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(choice)) if (!handleOperation(choice))
{ {
@@ -32,26 +32,26 @@ bool AdminMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1: case 1:
m_zenvyController.createHRManager(); createEmployee(m_zenvyController);
break; break;
case 2: case 2:
m_zenvyController.createEmployee(); viewEmployees(m_zenvyController);
break; break;
case 3: case 3:
m_zenvyController.viewEmployee(); deactivateEmployee(m_zenvyController);
break; break;
case 4: case 4:
m_zenvyController.deactivateEmployee();
break;*/
case 5:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
case 5:
updateProfile(m_zenvyController);
break;
case 6: case 6:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl; std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -1,7 +1,8 @@
#include <iostream> #include <iostream>
#include<iomanip>
#include "EmployeeMenu.h" #include "EmployeeMenu.h"
#include"InputHelper.h" #include "InputHelper.h"
#include"OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void EmployeeMenu::run() void EmployeeMenu::run()
@@ -13,7 +14,7 @@ void EmployeeMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(choice)) if (!handleOperation(choice))
{ {
@@ -32,7 +33,8 @@ bool EmployeeMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1: /*
case 1:
m_zenvyController.applyLeave(); m_zenvyController.applyLeave();
break; break;
case 2: case 2:
@@ -49,33 +51,21 @@ bool EmployeeMenu::handleOperation(int choice)
break; break;
case 6: case 6:
m_zenvyController.viewTicketHistory(); m_zenvyController.viewTicketHistory();
break;
case 7:
m_zenvyController.viewEmployees();
break;*/ break;*/
case 7:
viewEmployees(m_zenvyController);
break;
case 8: case 8:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
/*case 9:
m_zenvyController.viewTeamMembers();
break;
case 10:
m_zenvyController.bookMeetingRoom();
break;
case 11:
m_zenvyController.viewBookingHistory();
break;
case 12:
m_zenvyController.viewNotifications();
break;
case 13:
m_zenvyController.viewAnnouncements();
break;
case 14: case 14:
updateProfile(m_zenvyController);
break;
case 15:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl;*/ std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include "FinanceExecutiveMenu.h" #include "FinanceExecutiveMenu.h"
#include"InputHelper.h" #include "InputHelper.h"
#include"OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void FinanceExecutiveMenu::run() void FinanceExecutiveMenu::run()
@@ -13,7 +13,7 @@ void FinanceExecutiveMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(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) bool FinanceExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1:
m_zenvyController.applyLeave();
break;
case 2:
m_zenvyController.viewPayslip();
break;
case 3:
m_zenvyController.viewPayslipHistory();
break;
case 4: case 4:
m_zenvyController.viewEmployees(); viewEmployees(m_zenvyController);
break;*/ break;
case 5: case 5:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
/*case 6:
m_zenvyController.viewNotifications();
break;
case 7:
m_zenvyController.viewAnnouncements();
break;
case 8:
m_zenvyController.resolveTicket();
break;
case 9:
m_zenvyController.generatePayslip();
break;
case 10: case 10:
m_zenvyController.updatePayroll(); updatePayroll();
break; break;
case 11: case 11:
updateProfile(m_zenvyController);
break;
case 12:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl;*/ std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -1,5 +1,8 @@
#pragma once #pragma once
#include<memory> #include<memory>
#include<iostream>
#include<stdexcept>
#include <iomanip>
#include"ZenvyController.h" #include"ZenvyController.h"
class FinanceExecutiveMenu class FinanceExecutiveMenu
@@ -10,5 +13,6 @@ public:
FinanceExecutiveMenu() : m_zenvyController(std::make_shared<ZenvyController>()) {}; FinanceExecutiveMenu() : m_zenvyController(std::make_shared<ZenvyController>()) {};
void run(); void run();
bool handleOperation(int); bool handleOperation(int);
void updatePayroll();
}; };
@@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include "HRManagerMenu.h" #include "HRManagerMenu.h"
#include"InputHelper.h" #include "InputHelper.h"
#include"OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void HRManagerMenu::run() void HRManagerMenu::run()
@@ -13,7 +13,7 @@ void HRManagerMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(choice)) if (!handleOperation(choice))
{ {
@@ -32,43 +32,26 @@ bool HRManagerMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1:
m_zenvyController.applyLeave();
break;
case 2:
m_zenvyController.viewPayslip();
break;
case 3:
m_zenvyController.viewPayslipHistory();
break;
case 4: case 4:
m_zenvyController.viewEmployees(); viewEmployees(m_zenvyController);
break;*/ break;
case 5: case 5:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
/*case 6:
m_zenvyController.viewNotifications();
break;
case 7:
m_zenvyController.viewAnnouncements();
break;
case 8: case 8:
m_zenvyController.createEmployee(); createEmployee(m_zenvyController);
break;
case 9:
m_zenvyController.regularizeAttenance();
break;
case 10:
m_zenvyController.updateLeaveRequest();
break;
case 11:
m_zenvyController.registercandidateAsEmployee();
break; break;
case 12: case 12:
updateProfile(m_zenvyController);
break;
case 13:
deactivateEmployee(m_zenvyController);
break;
case 14:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl;*/ std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include "ITExecutiveMenu.h" #include "ITExecutiveMenu.h"
#include"InputHelper.h" #include "InputHelper.h"
#include"OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void ITExecutiveMenu::run() void ITExecutiveMenu::run()
@@ -13,7 +13,7 @@ void ITExecutiveMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(choice)) if (!handleOperation(choice))
{ {
@@ -32,34 +32,20 @@ bool ITExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1:
m_zenvyController.applyLeave();
break;
case 2:
m_zenvyController.viewPayslip();
break;
case 3:
m_zenvyController.viewPayslipHistory();
break;
case 4: case 4:
m_zenvyController.viewEmployees(); viewEmployees(m_zenvyController);
break;*/ break;
case 5: case 5:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
/*case 6:
m_zenvyController.viewNotifications();
break;
case 7:
m_zenvyController.viewAnnouncements();
break;
case 8:
m_zenvyController.resolveTicket();
break;
case 9: case 9:
updateProfile(m_zenvyController);
break;
case 10:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl;*/ std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -1,3 +1,104 @@
#include <stdexcept>
#include "MenuHelper.h" #include "MenuHelper.h"
static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType)
{
int choice;
util::clear();
static const std::map<Enums::EmployeeType, std::vector<Enums::EmployeeType>> 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<Enums::EmployeeType, std::string> 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<ZenvyController> 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();
}
+179 -34
View File
@@ -1,15 +1,180 @@
#pragma once #pragma once
#include <algorithm> #include <map>
#include <iomanip> #include <memory>
#include<memory>
#include <vector> #include <vector>
#include <iostream>
#include <iomanip>
#include <utility> #include <utility>
#include "Enums.h" #include "Enums.h"
#include"InputHelper.h" #include"InputHelper.h"
#include"OutputHelper.h" #include"OutputHelper.h"
#include "Employee.h" #include "Employee.h"
#include "ZenvyController.h" #include "ZenvyController.h"
#include "Payroll.h" #include "MenuHelper.h"
#include "Validator.h"
void createEmployee(std::shared_ptr<ZenvyController> controller);
inline void updateProfile(std::shared_ptr<ZenvyController> 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<std::shared_ptr<const Employee>> allEmployees)
{
int choice;
std::map<int, std::shared_ptr<const Employee>> 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<ZenvyController>& 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<ZenvyController> 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> 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<const Employee> employee)
{
switch (type)
{
case Enums::EmployeeType::FINANCE:
displayPayroll(employee->getPayroll());
break;
}
}
inline void searchEmployee(std::shared_ptr<ZenvyController>& m_zenvyController) inline void searchEmployee(std::shared_ptr<ZenvyController>& m_zenvyController)
{ {
@@ -26,22 +191,21 @@ inline void searchEmployee(std::shared_ptr<ZenvyController>& m_zenvyController)
<< std::setw(25) << "Email" << std::setw(25) << "Email"
<< std::setw(15) << "Phone" << std::setw(15) << "Phone"
<< std::setw(15) << "Type" << std::setw(15) << "Type"
<< std::setw(15) << "Team Status"
<< std::setw(10) << "Team ID" << std::setw(10) << "Team ID"
<< std::setw(10) << "Team Status"
<< std::endl; << std::endl;
std::cout << std::string(95, '-') << std::endl;
for (const auto& employee : searchResults.second) for (const auto& employee : searchResults.second)
{ {
if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE)
{ {
std::cout << std::left std::cout << std::left
<< std::setw(10) << employee->getEmployeeId() << std::setw(10) << employee->getId()
<< std::setw(20) << employee->getEmployeeName() << std::setw(20) << employee->getEmployeeName()
<< std::setw(25) << employee->getEmployeeEmail() << std::setw(25) << employee->getEmployeeEmail()
<< std::setw(15) << employee->getEmployeePhone() << std::setw(15) << employee->getEmployeePhone()
<< std::setw(15) << Enums::getEmployeeType(employee->getEmployeeType()) << std::setw(15) << Enums::getEmployeeTypeString(employee->getEmployeeType())
<< std::setw(10) << employee->getEmployeeTeamId() << std::setw(15) << Enums::getTeamStatusString(employee->getEmployeeTeamStatus())
<< std::setw(10) << Enums::getTeamStatus(employee->getEmployeeTeamStatus()); << std::setw(10) << employee->getEmployeeTeamId();
filterSearchResults(searchResults.first, employee); filterSearchResults(searchResults.first, employee);
} }
} }
@@ -50,24 +214,5 @@ inline void searchEmployee(std::shared_ptr<ZenvyController>& m_zenvyController)
{ {
std::cout << "No Employee found with this name" << std::endl; std::cout << "No Employee found with this name" << std::endl;
} }
} util::pressEnter();
static void filterSearchResults(Enums::EmployeeType type, std::shared_ptr<const Employee> employee)
{
switch (type)
{
case Enums::EmployeeType::FINANCE:
displayPayroll(employee->getPayroll());
break;
}
}
void displayPayroll(std::shared_ptr<Payroll> 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;
} }
@@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include "TalentExecutiveMenu.h" #include "TalentExecutiveMenu.h"
#include"InputHelper.h" #include "InputHelper.h"
#include"OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void TalentExecutiveMenu::run() void TalentExecutiveMenu::run()
@@ -13,7 +13,7 @@ void TalentExecutiveMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(choice)) if (!handleOperation(choice))
{ {
@@ -32,46 +32,20 @@ bool TalentExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1:
m_zenvyController.applyLeave();
break;
case 2:
m_zenvyController.viewPayslip();
break;
case 3:
m_zenvyController.viewPayslipHistory();
break;
case 4: case 4:
m_zenvyController.viewEmployees(); viewEmployees(m_zenvyController);
break;*/ break;
case 5: case 5:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
/*case 6:
m_zenvyController.viewNotifications();
break;
case 7:
m_zenvyController.viewAnnouncements();
break;
case 8:
m_zenvyController.createNewJob();
break;
case 9:
m_zenvyController.viewJobOpenings();
break;
case 10:
m_zenvyController.addCandidate();
break;
case 11:
m_zenvyController.updateCandidateStatus();
break;
case 12:
m_zenvyController.viewShortlistedCandidates();
break;
case 13: case 13:
updateProfile(m_zenvyController);
break;
case 14:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl;*/ std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include "TeamExecutiveMenu.h" #include "TeamExecutiveMenu.h"
#include"InputHelper.h" #include "InputHelper.h"
#include"OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void TeamExecutiveMenu::run() void TeamExecutiveMenu::run()
@@ -13,7 +13,7 @@ void TeamExecutiveMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(choice)) if (!handleOperation(choice))
{ {
@@ -32,49 +32,20 @@ bool TeamExecutiveMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1:
m_zenvyController.applyLeave();
break;
case 2:
m_zenvyController.viewPayslip();
break;
case 3:
m_zenvyController.viewPayslipHistory();
break;
case 4: case 4:
m_zenvyController.viewEmployees(); viewEmployees(m_zenvyController);
break;*/ break;
case 5: case 5:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
/*case 6:
m_zenvyController.viewNotifications();
break;
case 7:
m_zenvyController.viewAnnouncements();
break;
case 8:
m_zenvyController.createTeam();
break;
case 9:
m_zenvyController.updateTeam();
break;
case 10:
m_zenvyController.removeTeam();
break;
case 11:
m_zenvyController.assignEmployee();
break;
case 12:
m_zenvyController.unassignEmployee();
break;
case 13:
m_zenvyController.viewTeams();
break;
case 14: case 14:
updateProfile(m_zenvyController);
break;
case 15:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl;*/ std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include "TeamLeadMenu.h" #include "TeamLeadMenu.h"
#include"InputHelper.h" #include "InputHelper.h"
#include"OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h" #include "MenuHelper.h"
void TeamLeadMenu::run() void TeamLeadMenu::run()
@@ -13,7 +13,7 @@ void TeamLeadMenu::run()
{ {
int choice; int choice;
util::clear(); 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); util::read(choice);
if (!handleOperation(choice)) if (!handleOperation(choice))
{ {
@@ -32,55 +32,20 @@ bool TeamLeadMenu::handleOperation(int choice)
{ {
switch (choice) switch (choice)
{ {
/*case 1:
m_zenvyController.applyLeave();
break;
case 2:
m_zenvyController.viewPayslip();
break;
case 3:
m_zenvyController.viewPayslipHistory();
break;
case 4:
m_zenvyController.raiseTicket();
break;
case 5:
m_zenvyController.viewTicket();
break;
case 6:
m_zenvyController.viewTicketHistory();
break;
case 7: case 7:
m_zenvyController.viewEmployees(); viewEmployees(m_zenvyController);
break;*/ break;
case 8: case 8:
searchEmployee(m_zenvyController); searchEmployee(m_zenvyController);
break; break;
/*case 9:
m_zenvyController.viewTeamMembers();
break;
case 10:
m_zenvyController.bookMeetingRoom();
break;
case 11:
m_zenvyController.viewBookingHistory();
break;
case 12:
m_zenvyController.viewNotifications();
break;
case 13:
m_zenvyController.viewAnnouncements();
break;
case 14:
m_zenvyController.regularizeAttendance();
break;
case 15:
m_zenvyController.updateLeaveRequest();
break;
case 16: case 16:
updateProfile(m_zenvyController);
break;
case 17:
return false; return false;
default: default:
std::cout << "Enter a valid choice!" << std::endl;*/ std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
} }
return true; return true;
} }
@@ -19,6 +19,15 @@
void UserInterface::run() void UserInterface::run()
{ {
bool isMenuActive = true; bool isMenuActive = true;
try
{
m_controller->loadStates();
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
return;
}
while (isMenuActive) while (isMenuActive)
{ {
try try
@@ -38,6 +47,15 @@ void UserInterface::run()
util::pressEnter(); util::pressEnter();
} }
} }
try
{
m_controller->persistStates();
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
return;
}
} }
bool UserInterface::handleOperation(int choice) bool UserInterface::handleOperation(int choice)
@@ -94,7 +112,7 @@ void UserInterface::login()
} }
else else
{ {
std::cout << "\nInvalid Password"; std::cout << "Error: Invalid Password\n";
util::pressEnter(); util::pressEnter();
return; return;
} }
@@ -133,7 +151,7 @@ void UserInterface::login()
menu.run(); menu.run();
break; break;
} }
case Enums::EmployeeType::TAG: case Enums::EmployeeType::TALENT_ACQUISITION:
{ {
TalentExecutiveMenu menu; TalentExecutiveMenu menu;
menu.run(); menu.run();