From 47b44ccaa02378bf9e9e6e0bdf9f3db6198666bc Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Sat, 11 Apr 2026 12:13:23 +0530 Subject: [PATCH] Added payroll persistance and updated Talent Acquisition role SRS02 : Employee Management - Added Payroll getHeaders, serialize and deserialize functions - Stored payrolls in DataStore - Loaded and saved payrolls along with employees - Linked payroll to employees during creation and load - Added employeeId to Payroll - Renamed TAG role to TALENT_ACQUISITION across the project - Added missing TalentExecutive case in Employee deserialization - Added constructor to TalentExecutive for FileManager integration - Renamed ID counters to m_uid for consistency - Updated salary values in ApplicationConfig Smitha Mohan --- .../controllers/ZenvyController.cpp | 2 + .../Trenser.Zenvy/datastores/DataStore.cpp | 5 +- .../Trenser.Zenvy/datastores/DataStore.h | 4 + .../Trenser.Zenvy/models/Announcement.cpp | 2 +- .../Trenser.Zenvy/models/Announcement.h | 6 +- .../Trenser.Zenvy/models/Attendance.cpp | 2 +- .../Trenser.Zenvy/models/Attendance.h | 6 +- .../Trenser.Zenvy/models/Booking.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Booking.h | 6 +- .../Trenser.Zenvy/models/Candidate.cpp | 2 +- .../Trenser.Zenvy/models/Candidate.h | 6 +- .../Trenser.Zenvy/models/Employee.cpp | 11 +++ .../Trenser.Zenvy/models/JobListing.cpp | 2 +- .../Trenser.Zenvy/models/JobListing.h | 6 +- Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Leave.h | 6 +- .../Trenser.Zenvy/models/Notification.cpp | 2 +- .../Trenser.Zenvy/models/Notification.h | 6 +- .../Trenser.Zenvy/models/Payroll.cpp | 94 ++++++++++++++++++- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 33 ++++++- .../Trenser.Zenvy/models/Payslip.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h | 6 +- Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Room.h | 6 +- .../Trenser.Zenvy/models/TalentExecutive.h | 20 +++- Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Team.h | 6 +- Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h | 6 +- .../services/ApplicationConfig.h | 41 ++++---- .../services/EmployeeManagementService.cpp | 6 +- .../services/PayslipManagementService.cpp | 28 ++++++ .../services/PayslipManagementService.h | 2 + Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 10 +- .../Trenser.Zenvy/views/MenuHelper.cpp | 6 +- .../Trenser.Zenvy/views/UserInterface.cpp | 2 +- 36 files changed, 269 insertions(+), 83 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 9d21818..d3d8a51 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -50,9 +50,11 @@ Employees ZenvyController::getEmployees() void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); + m_payslipManagementService->loadPayrolls(); } void ZenvyController::persistStates() { m_employeeManagementService->saveEmployees(); + m_payslipManagementService->savePayrolls(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index 40b473f..dadcfdc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -27,4 +27,7 @@ employeeMap& DataStore::getEmployees() return m_employees; } - +payrollMap& DataStore::getPayrolls() +{ + return m_payrolls; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index 750d741..d05d5f4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -18,8 +18,10 @@ #include "Notification.h" #include "Announcement.h" #include "Faq.h" +#include "Payroll.h" using employeeMap = std::map>; +using payrollMap = std::map>; using logMap = std::map>; class DataStore @@ -27,6 +29,7 @@ class DataStore private: std::shared_ptr m_authenticatedEmployee; employeeMap m_employees; + payrollMap m_payrolls; logMap m_logs; DataStore() = default; public: @@ -36,6 +39,7 @@ public: DataStore(DataStore&&) = delete; DataStore& operator=(DataStore&&) = delete; employeeMap& getEmployees(); + payrollMap& getPayrolls(); logMap& getLogs(); std::shared_ptr& getAuthenticatedEmployee(); void setAuthenticatedEmployee(std::shared_ptr < Employee>); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp index 2b61e80..403222b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp @@ -1,6 +1,6 @@ #include "Announcement.h" -int Announcement::m_anid = 0; +int Announcement::m_uid = 0; const std::string& Announcement::getAnnouncementId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h index 5d69bdb..5c46514 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h @@ -5,14 +5,14 @@ class Announcement { private: - static int m_anid; + static int m_uid; std::string m_id; util::Timestamp m_timestamp; std::string m_message; public: - Announcement() : m_id("AN" + std::to_string(++m_anid)), m_timestamp(), m_message("") {} + Announcement() : m_id("AN" + std::to_string(++m_uid)), m_timestamp(), m_message("") {} Announcement(const std::string& message) - : m_id("AN" + std::to_string(++m_anid)), m_message(message) {} + : m_id("AN" + std::to_string(++m_uid)), m_message(message) {} const std::string& getAnnouncementId() const; const util::Timestamp& getAnnouncementTimestamp() const; const std::string& getAnnouncementMessage() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp index a6220dd..b4a51ef 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp @@ -1,6 +1,6 @@ #include "Attendance.h" -int Attendance::m_aid = 0; +int Attendance::m_uid = 0; const std::string& Attendance::getAttendanceId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h index 9f6d481..013fb0b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h @@ -5,15 +5,15 @@ class Attendance { private: - static int m_aid; + static int m_uid; std::string m_id; util::Timestamp m_loginTime; util::Timestamp m_logoutTime; public: - Attendance() : m_id("AD" + std::to_string(++m_aid)), m_loginTime(), m_logoutTime() {} + Attendance() : m_id("AD" + std::to_string(++m_uid)), m_loginTime(), m_logoutTime() {} Attendance(const util::Timestamp& loginTime, const util::Timestamp& logoutTime) - : m_id("AD" + std::to_string(++m_aid)), m_loginTime(loginTime), m_logoutTime(logoutTime) {} + : m_id("AD" + std::to_string(++m_uid)), m_loginTime(loginTime), m_logoutTime(logoutTime) {} const std::string& getAttendanceId() const; const util::Timestamp& getLoginTime() const; const util::Timestamp& getLogoutTime() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp index 4c0dcb0..1b0f141 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp @@ -1,6 +1,6 @@ #include "Booking.h" -int Booking::m_bid = 0; +int Booking::m_uid = 0; const std::string& Booking::getBookingId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h index c8bc55c..2100841 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h @@ -7,19 +7,19 @@ class Booking { private: - static int m_bid; + static int m_uid; std::string m_id; util::Timestamp m_startTime; util::Timestamp m_endTime; std::string m_employeeId; std::shared_ptr m_team; public: - Booking() : m_id("BK" + std::to_string(++m_bid)), m_startTime(), m_endTime(), m_employeeId(""), m_team(nullptr) {} + Booking() : m_id("BK" + std::to_string(++m_uid)), m_startTime(), m_endTime(), m_employeeId(""), m_team(nullptr) {} Booking(const util::Timestamp& startTime, const util::Timestamp& endTime, const std::string& employeeId, std::shared_ptr team) - : m_id("BK" + std::to_string(++m_bid)), m_startTime(startTime), m_endTime(endTime), m_employeeId(employeeId), m_team(team) {} + : m_id("BK" + std::to_string(++m_uid)), m_startTime(startTime), m_endTime(endTime), m_employeeId(employeeId), m_team(team) {} const std::string& getBookingId() const; const util::Timestamp& getStartTime() const; const util::Timestamp& getEndTime() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp index c48c2a1..779652f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp @@ -1,6 +1,6 @@ #include "Candidate.h" -int Candidate::m_cid = 0; +int Candidate::m_uid = 0; const std::string& Candidate::getCandidateId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h index 646a8ef..db55250 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h @@ -5,19 +5,19 @@ class Candidate { private: - static int m_cid; + static int m_uid; std::string m_id; std::string m_name; long int m_phone; std::string m_qualification; Enums::CandidateStatus m_status; public: - Candidate() : m_id("CD" + std::to_string(++m_cid)), m_name(""), m_phone(0), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} + Candidate() : m_id("CD" + std::to_string(++m_uid)), m_name(""), m_phone(0), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} Candidate(const std::string& name, long int phone, const std::string& qualification, Enums::CandidateStatus status) - : m_id("CD" + std::to_string(++m_cid)), m_name(name), m_phone(phone), m_qualification(qualification), m_status(status) {} + : m_id("CD" + std::to_string(++m_uid)), m_name(name), m_phone(phone), m_qualification(qualification), m_status(status) {} const std::string& getCandidateId() const; const std::string& getCandidateName() const; long int getCandidatePhone() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index fb6e023..8b5aa80 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -246,6 +246,17 @@ std::shared_ptr Employee::deserialize(const std::string& record) teamStatus, accountStatus ); + case Enums::EmployeeType::TALENT_ACQUISITION: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); case Enums::EmployeeType::ADMIN: return Factory::getObject( id, diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp index 5c2f704..c2152cb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp @@ -1,6 +1,6 @@ #include "JobListing.h" -int JobListing::m_jid = 0; +int JobListing::m_uid = 0; const std::string& JobListing::getJobId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h index 7310897..61af21d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h @@ -9,7 +9,7 @@ using candidateMap = std::map>; class JobListing { private: - static int m_jid; + static int m_uid; std::string m_id; std::string m_name; std::string m_description; @@ -17,13 +17,13 @@ private: int m_numberOfVacancies; candidateMap m_candidates; public: - JobListing() : m_id("JL" + std::to_string(++m_jid)), m_name(""), m_description(""), m_status(Enums::JobListingStatus::CLOSED), m_numberOfVacancies(0) {} + JobListing() : m_id("JL" + std::to_string(++m_uid)), m_name(""), m_description(""), m_status(Enums::JobListingStatus::CLOSED), m_numberOfVacancies(0) {} JobListing(const std::string& name, const std::string& description, Enums::JobListingStatus status, int numberOfVacancies, const candidateMap& candidates) - : m_id("JL" + std::to_string(++m_jid)), m_name(name), m_description(description), m_status(status), m_numberOfVacancies(numberOfVacancies), m_candidates(candidates) {} + : m_id("JL" + std::to_string(++m_uid)), m_name(name), m_description(description), m_status(status), m_numberOfVacancies(numberOfVacancies), m_candidates(candidates) {} const std::string& getJobId() const; const std::string& getJobName() const; const std::string& getJobDescription() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp index 1163bcb..bbb0ff2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp @@ -1,6 +1,6 @@ #include "Leave.h" -int Leave::m_lid = 0; +int Leave::m_uid = 0; const std::string& Leave::getLeaveId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h index b745dbf..4c50bf1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h @@ -6,7 +6,7 @@ class Leave { private: - static int m_lid; + static int m_uid; std::string m_id; std::string m_employeeId; util::Timestamp m_timestamp; @@ -16,12 +16,12 @@ private: static int m_numberOfMedicalLeave; Enums::LeaveType m_leaveType; public: - Leave() : m_id("LV" + std::to_string(++m_lid)), m_employeeId(""), m_timestamp(), m_reason(""), m_leaveType(Enums::LeaveType::GENERAL) {} + Leave() : m_id("LV" + std::to_string(++m_uid)), m_employeeId(""), m_timestamp(), m_reason(""), m_leaveType(Enums::LeaveType::GENERAL) {} Leave(const std::string& employeeId, const util::Timestamp& timestamp, const std::string& reason, Enums::LeaveType leaveType) - : m_id("LV" + std::to_string(++m_lid)), m_employeeId(employeeId), m_timestamp(timestamp), m_reason(reason), m_leaveType(leaveType) {} + : m_id("LV" + std::to_string(++m_uid)), m_employeeId(employeeId), m_timestamp(timestamp), m_reason(reason), m_leaveType(leaveType) {} const std::string& getLeaveId() const; const std::string& getEmployeeId() const; const util::Timestamp& getTimestamp() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp index dae35ee..2f63026 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp @@ -1,6 +1,6 @@ #include "Notification.h" -int Notification::m_nid = 0; +int Notification::m_uid = 0; const std::string& Notification::getNotificationId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h index 000f381..194183d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h @@ -6,18 +6,18 @@ class Notification { private: - static int m_nid; + static int m_uid; std::string m_id; std::string m_employeeId; std::string m_message; util::Timestamp m_timestamp; Enums::NotificationStatus m_notificationStatus; public: - Notification() : m_id("NF" + std::to_string(++m_nid)), m_employeeId(""), m_message(""), m_timestamp(), m_notificationStatus(Enums::NotificationStatus::UNREAD) {} + Notification() : m_id("NF" + std::to_string(++m_uid)), m_employeeId(""), m_message(""), m_timestamp(), m_notificationStatus(Enums::NotificationStatus::UNREAD) {} Notification(const std::string& employeeId, const std::string& message, Enums::NotificationStatus notificationStatus) - : m_id("NF" + std::to_string(++m_nid)), m_employeeId(employeeId), m_message(message), m_notificationStatus(notificationStatus) {} + : m_id("NF" + std::to_string(++m_uid)), m_employeeId(employeeId), m_message(message), m_notificationStatus(notificationStatus) {} const std::string& getNotificationId() const; const std::string& getEmployeeId() const; const std::string& getNotificationMessage() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index fe439d6..aacf36e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -1,12 +1,48 @@ +#include +#include #include "Payroll.h" +#include "StringHelper.h" +#include "Factory.h" -int Payroll::m_prid = 0; +int Payroll::m_uid = 0; -const std::string& Payroll::getPayrollId() const +Payroll::Payroll(const std::string& id, + const std::string& employeeId, + double basicSalary, + double houseRentAllowance, + double foodAllowance, + double employeePFContribution, + double employerPFContribution) + : m_id("PR" + std::to_string(++m_uid)), + m_employeeId(employeeId), + m_basicSalary(basicSalary), + m_houseRentAllowance(houseRentAllowance), + m_foodAllowance(foodAllowance), + m_employeePFContribution(employeePFContribution), + m_employerPFContribution(employerPFContribution) +{ + int idNumber = util::extractNumber(m_id); + if (idNumber > m_uid) + { + m_uid = idNumber; + } +} + +const std::string& Payroll::getId() const { return m_id; } +const std::string& Payroll::getEmployeeId() const +{ + return m_employeeId; +} + +void Payroll::setEmployeeId(const std::string& employeeId) +{ + m_employeeId = employeeId; +} + double Payroll::getBasicSalary() const { return m_basicSalary; @@ -55,4 +91,58 @@ void Payroll::setEmployeePFContribution(double value) void Payroll::setEmployerPFContribution(double value) { m_employerPFContribution = value; +} + +std::string Payroll::serialize() const +{ + std::ostringstream serializedPayroll; + serializedPayroll << m_id << ',' + << m_employeeId << ',' + << m_basicSalary << ',' + << m_houseRentAllowance << ',' + << m_foodAllowance << ',' + << m_employeePFContribution << ',' + << m_employerPFContribution; + return serializedPayroll.str(); +} + +std::shared_ptr Payroll::deserialize(const std::string& record) +{ + std::string id, employeeId; + std::string basicSalaryStr, houseRentAllowanceString, foodAllowanceString, employeePFString, employerPFString; + std::istringstream serializedPayroll(record); + std::getline(serializedPayroll, id, ','); + std::getline(serializedPayroll, employeeId, ','); + std::getline(serializedPayroll, basicSalaryStr, ','); + std::getline(serializedPayroll, houseRentAllowanceString, ','); + std::getline(serializedPayroll, foodAllowanceString, ','); + std::getline(serializedPayroll, employeePFString, ','); + std::getline(serializedPayroll, employerPFString, ','); + + try + { + double basicSalary = std::stod(basicSalaryStr); + double houseRentAllowance = std::stod(houseRentAllowanceString); + double foodAllowance = std::stod(foodAllowanceString); + double employeePFContribution = std::stod(employeePFString); + double employerPFContribution = std::stod(employerPFString); + return Factory::getObject( + id, + employeeId, + basicSalary, + houseRentAllowance, + foodAllowance, + employeePFContribution, + employerPFContribution + ); + } + catch (...) + { + throw std::runtime_error("Failed to deserialize Payroll object"); + } +} + +std::string Payroll::getHeaders() +{ + return "PayrollId,EmployeeId,BasicSalary,HouseRentAllowance,FoodAllowance,EmployeePFContribution,EmployerPFContribution"; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index 8aaae92..6b063c8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -1,25 +1,47 @@ #pragma once #include +#include class Payroll { private: - static int m_prid; + static int m_uid; std::string m_id; + std::string m_employeeId; double m_basicSalary; double m_houseRentAllowance; double m_foodAllowance; double m_employeePFContribution; double m_employerPFContribution; public: - Payroll() : m_id("PR" + std::to_string(++m_prid)), m_basicSalary(0.0), m_houseRentAllowance(0.0), m_foodAllowance(0.0), m_employeePFContribution(0.0), m_employerPFContribution(0.0) {} + Payroll() + : m_id("PR" + std::to_string(++m_uid)), + m_basicSalary(0.0), + m_houseRentAllowance(0.0), + m_foodAllowance(0.0), + m_employeePFContribution(0.0), + m_employerPFContribution(0.0) {} Payroll(double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) - : m_id("PR" + std::to_string(++m_prid)), m_basicSalary(basicSalary), m_houseRentAllowance(houseRentAllowance), m_foodAllowance(foodAllowance), m_employeePFContribution(employeePFContribution), m_employerPFContribution(employerPFContribution) {} - const std::string& getPayrollId() const; + : m_id("PR" + std::to_string(++m_uid)), + m_basicSalary(basicSalary), + m_houseRentAllowance(houseRentAllowance), + m_foodAllowance(foodAllowance), + m_employeePFContribution(employeePFContribution), + m_employerPFContribution(employerPFContribution) {} + Payroll(const std::string& id, + const std::string& employeeId, + double basicSalary, + double houseRentAllowance, + double foodAllowance, + double employeePFContribution, + double employerPFContribution); + const std::string& getId() const; + const std::string& getEmployeeId() const; + void setEmployeeId(const std::string&); double getBasicSalary() const; double getHouseRentAllowance() const; double getFoodAllowance() const; @@ -30,4 +52,7 @@ public: void setFoodAllowance(double); void setEmployeePFContribution(double); void setEmployerPFContribution(double); + virtual std::string serialize() const; + static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp index fd40ee6..614e525 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp @@ -1,6 +1,6 @@ #include "Payslip.h" -int Payslip::m_pid = 0; +int Payslip::m_uid = 0; const std::string& Payslip::getPayslipId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h index 78e37b1..10dc3bf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h @@ -4,12 +4,12 @@ class Payslip { private: - static int m_pid; + static int m_uid; std::string m_id; double m_salary; public: - Payslip() : m_id("PS" + std::to_string(++m_pid)), m_salary(0.0) {} - Payslip(const double salary) : m_id("PS" + std::to_string(++m_pid)), m_salary(salary) {} + Payslip() : m_id("PS" + std::to_string(++m_uid)), m_salary(0.0) {} + Payslip(const double salary) : m_id("PS" + std::to_string(++m_uid)), m_salary(salary) {} const std::string& getPayslipId() const; double getSalary() const; void setPayslipId(const std::string& id); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp index 8134102..b5c4d50 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp @@ -1,6 +1,6 @@ #include "Room.h" -int Room::m_rid = 0; +int Room::m_uid = 0; const std::string& Room::getRoomId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h index e0084e9..1dfe66a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h @@ -8,13 +8,13 @@ using bookingMap = std::map>; class Room { private: - static int m_rid; + static int m_uid; std::string m_id; std::string m_name; bookingMap m_bookings; public: - Room() : m_id("RM" + std::to_string(++m_rid)), m_name("") {} - Room(const std::string& name) : m_id("RM" + std::to_string(++m_rid)), m_name(name) {} + Room() : m_id("RM" + std::to_string(++m_uid)), m_name("") {} + Room(const std::string& name) : m_id("RM" + std::to_string(++m_uid)), m_name(name) {} const std::string& getRoomId() const; const std::string& getRoomName() const; const bookingMap& getBookings() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h index 2352f7a..90bc664 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h @@ -10,7 +10,25 @@ public: const std::string& phone, const std::string& email, std::shared_ptr payroll - ) :Employee(name, phone, email, Enums::EmployeeType::TAG, payroll) {}; + ) :Employee(name, phone, email, Enums::EmployeeType::TALENT_ACQUISITION, payroll) {}; + TalentExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::TALENT_ACQUISITION, + accountStatus) { + } ~TalentExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp index fce9fd5..abf8a23 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp @@ -1,6 +1,6 @@ #include "Team.h" -int Team::m_tmid = 0; +int Team::m_uid = 0; const std::string& Team::getTeamId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h index b4782cd..fca1698 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h @@ -8,19 +8,19 @@ using employeeMap = std::map>; class Team { private: - static int m_tmid; + static int m_uid; std::string m_id; std::string m_name; std::shared_ptr m_lead; employeeMap m_employees; int m_maximumNumberOfEmployees; public: - Team() : m_id("TM" + std::to_string(++m_tmid)), m_name(""), m_lead(nullptr), m_maximumNumberOfEmployees(0) {} + Team() : m_id("TM" + std::to_string(++m_uid)), m_name(""), m_lead(nullptr), m_maximumNumberOfEmployees(0) {} Team( const std::string& name, std::shared_ptr lead, int maximumNumberOfEmployees) - : m_id("TM" + std::to_string(++m_tmid)), m_name(name), m_lead(lead), m_maximumNumberOfEmployees(maximumNumberOfEmployees) { + : m_id("TM" + std::to_string(++m_uid)), m_name(name), m_lead(lead), m_maximumNumberOfEmployees(maximumNumberOfEmployees) { } const std::string& getTeamId() const; const std::string& getTeamName() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp index 431093e..84fd042 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp @@ -1,6 +1,6 @@ #include "Ticket.h" -int Ticket::m_tid = 0; +int Ticket::m_uid = 0; const std::string& Ticket::getTicketId() const { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h index 1ab88aa..56d39af 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h @@ -5,20 +5,20 @@ class Ticket { private: - static int m_tid; + static int m_uid; std::string m_id; Enums::TicketType m_type; std::string m_description; Enums::TicketStatus m_status; std::string m_employeeId; public: - Ticket() : m_id("TKT" + std::to_string(++m_tid)), m_type(Enums::TicketType::UNKNOWN), m_description(""), m_status(Enums::TicketStatus::OPEN), m_employeeId("") {} + Ticket() : m_id("TKT" + std::to_string(++m_uid)), m_type(Enums::TicketType::UNKNOWN), m_description(""), m_status(Enums::TicketStatus::OPEN), m_employeeId("") {} Ticket( Enums::TicketType type, const std::string& description, const std::string& employeeId, Enums::TicketStatus status) - : m_id("TKT" + std::to_string(++m_tid)), m_type(type), m_description(description), m_status(status), m_employeeId(employeeId) {} + : m_id("TKT" + std::to_string(++m_uid)), m_type(type), m_description(description), m_status(status), m_employeeId(employeeId) {} const std::string& getTicketId() const; Enums::TicketType getTicketType() const; const std::string& getDescription() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h index c725431..25231c2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -9,31 +9,32 @@ namespace Config namespace Payroll { - constexpr double SENIOR_BASIC_SALARY = 0.0; - constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double SENIOR_FOOD_ALLOWANCE = 0.0; - constexpr double SENIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double SENIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; - constexpr double JUNIOR_BASIC_SALARY = 0.0; - constexpr double JUNIOR_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double JUNIOR_FOOD_ALLOWANCE = 0.0; - constexpr double JUNIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double JUNIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; - constexpr double HR_MANAGER_BASIC_SALARY = 0.0; - constexpr double HR_MANAGER_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double HR_MANAGER_FOOD_ALLOWANCE = 0.0; - constexpr double HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double HR_MANAGER_EMPLOYER_PF_CONTRIBUTION = 0.0; - constexpr double EXECUTIVE_BASIC_SALARY = 0.0; - constexpr double EXECUTIVE_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double EXECUTIVE_FOOD_ALLOWANCE = 0.0; - constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 0.0; + constexpr double SENIOR_BASIC_SALARY = 80000.0; + constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 32000.0; + constexpr double SENIOR_FOOD_ALLOWANCE = 3000.0; + constexpr double SENIOR_EMPLOYEE_PF_CONTRIBUTION = 9600.0; + constexpr double SENIOR_EMPLOYER_PF_CONTRIBUTION = 9600.0; + constexpr double JUNIOR_BASIC_SALARY = 25000.0; + constexpr double JUNIOR_HOUSE_RENT_ALLOWANCE = 10000.0; + constexpr double JUNIOR_FOOD_ALLOWANCE = 1500.0; + constexpr double JUNIOR_EMPLOYEE_PF_CONTRIBUTION = 3000.0; + constexpr double JUNIOR_EMPLOYER_PF_CONTRIBUTION = 3000.0; + constexpr double HR_MANAGER_BASIC_SALARY = 60000.0; + constexpr double HR_MANAGER_HOUSE_RENT_ALLOWANCE = 24000.0; + constexpr double HR_MANAGER_FOOD_ALLOWANCE = 2500.0; + constexpr double HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION = 7200.0; + constexpr double HR_MANAGER_EMPLOYER_PF_CONTRIBUTION = 7200.0; + constexpr double EXECUTIVE_BASIC_SALARY = 45000.0; + constexpr double EXECUTIVE_HOUSE_RENT_ALLOWANCE = 18000.0; + constexpr double EXECUTIVE_FOOD_ALLOWANCE = 2000.0; + constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 5400.0; + constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 5400.0; } namespace File { constexpr const char* EMPLOYEES_FILE = "files/Employee.csv"; constexpr const char* GENERAL_EMPLOYEES_FILE = "files/GeneralEmployee.csv"; + constexpr const char* PAYROLL_FILE = "files/Payroll.csv"; } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 4fe4ddc..ae453c7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -59,7 +59,7 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, case Enums::EmployeeType::IT: case Enums::EmployeeType::FINANCE: case Enums::EmployeeType::TEAM: - case Enums::EmployeeType::TAG: + case Enums::EmployeeType::TALENT_ACQUISITION: util::enforceAuthorization(authenticatedEmployeeType, Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); payroll = Factory::getObject(Config::Payroll::EXECUTIVE_BASIC_SALARY, Config::Payroll::EXECUTIVE_HOUSE_RENT_ALLOWANCE, @@ -77,7 +77,7 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, case Enums::EmployeeType::TEAM: employee = Factory::getObject(name, phone, email, payroll); break; - case Enums::EmployeeType::TAG: + case Enums::EmployeeType::TALENT_ACQUISITION: employee = Factory::getObject (name, phone, email, payroll); break; } @@ -108,6 +108,8 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, 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)); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 6e4bc99..dd6bc1c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -1,6 +1,9 @@ +#include #include "PayslipManagementService.h" +#include "ApplicationConfig.h" #include "AuthorizationHelper.h" #include "Enums.h" +#include "FileManager.h" void PayslipManagementService::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { @@ -18,4 +21,29 @@ void PayslipManagementService::updateSalary(const std::string& employeeId, doubl { throw std::runtime_error("Employee not found, unable to update the salary"); } +} + +void PayslipManagementService::loadPayrolls() +{ + FileManager payrollFileManager(Config::File::PAYROLL_FILE); + auto& payrolls = m_dataStore.getPayrolls(); + auto& employees = m_dataStore.getEmployees(); + auto payrollObjects = payrollFileManager.load(); + for (const auto& payrollPair : payrollObjects) + { + auto employeeIterator = employees.find(payrollPair.second->getEmployeeId()); + if (employeeIterator == employees.end()) + { + throw std::runtime_error("Payroll Object not associated with an existing employee"); + } + employeeIterator->second->setEmployeePayroll(payrollPair.second); + } + payrolls.insert(payrollObjects.begin(), payrollObjects.end()); +} + +void PayslipManagementService::savePayrolls() +{ + FileManager payrollFileManager(Config::File::PAYROLL_FILE); + auto& payrolls = m_dataStore.getPayrolls(); + payrollFileManager.save(payrolls); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 768c2a3..fd91da1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -10,4 +10,6 @@ private: public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; void updateSalary(const std::string&, double, double, double, double, double); + void loadPayrolls(); + void savePayrolls(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 5154ddd..2021b68 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -76,7 +76,7 @@ namespace Enums { GENERAL, IT, FINANCE, - TAG, + TALENT_ACQUISITION, HR, TEAM, ADMIN, @@ -114,8 +114,8 @@ namespace Enums { return "IT"; case EmployeeType::FINANCE: return "FINANCE"; - case EmployeeType::TAG: - return "TAG"; + case EmployeeType::TALENT_ACQUISITION: + return "TALENT_ACQUISITION"; case EmployeeType::HR: return "HR"; case EmployeeType::TEAM: @@ -176,8 +176,8 @@ namespace Enums { return EmployeeType::IT; if (input == "FINANCE") return EmployeeType::FINANCE; - if (input == "TAG") - return EmployeeType::TAG; + if (input == "TALENT_ACQUISITION") + return EmployeeType::TALENT_ACQUISITION; if (input == "HR") return EmployeeType::HR; if (input == "TEAM") diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 6ec6f00..d183fdf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -11,14 +11,14 @@ static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) Enums::EmployeeType::IT, Enums::EmployeeType::TEAM, Enums::EmployeeType::FINANCE, - Enums::EmployeeType::TAG, + Enums::EmployeeType::TALENT_ACQUISITION, Enums::EmployeeType::GENERAL }}, { Enums::EmployeeType::HR, { Enums::EmployeeType::IT, Enums::EmployeeType::TEAM, Enums::EmployeeType::FINANCE, - Enums::EmployeeType::TAG, + Enums::EmployeeType::TALENT_ACQUISITION, Enums::EmployeeType::GENERAL }} }; @@ -27,7 +27,7 @@ static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) { Enums::EmployeeType::IT, "IT Executive" }, { Enums::EmployeeType::TEAM, "Team Executive" }, { Enums::EmployeeType::FINANCE, "Finance Executive" }, - { Enums::EmployeeType::TAG, "Talent Executive" }, + { Enums::EmployeeType::TALENT_ACQUISITION, "Talent Executive" }, { Enums::EmployeeType::GENERAL, "General Employee" } }; auto it = employeeTypeOptions.find(employeeType); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp index ae98311..f420867 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp @@ -151,7 +151,7 @@ void UserInterface::login() menu.run(); break; } - case Enums::EmployeeType::TAG: + case Enums::EmployeeType::TALENT_ACQUISITION: { TalentExecutiveMenu menu; menu.run();