From 07bd979685ccf0ddcd19c194032b88660f62992e Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Tue, 7 Apr 2026 10:51:38 +0530 Subject: [PATCH 01/56] Set up employee management codebase SRS02 : Employee Management - Renamed EmployeeManagememtService to EmployeeManagementService - Added basic employee management service structure - Connected employee management into controller and datastore - Updated project config files - Added auto ID generation across models - Added payroll-related config constants Smitha Mohan --- .../Trenser.Zenvy/Trenser.Zenvy.vcxproj | 4 +-- .../Trenser.Zenvy.vcxproj.filters | 12 ++++---- .../controllers/ZenvyController.cpp | 19 ++++++++++++ .../controllers/ZenvyController.h | 12 ++++++-- .../Trenser.Zenvy/datastores/DataStore.cpp | 1 + Trenser.Zenvy/Trenser.Zenvy/models/Admin.h | 11 +++++++ .../Trenser.Zenvy/models/Announcement.cpp | 2 ++ .../Trenser.Zenvy/models/Announcement.h | 8 ++--- .../Trenser.Zenvy/models/Attendance.cpp | 2 ++ .../Trenser.Zenvy/models/Attendance.h | 8 ++--- .../Trenser.Zenvy/models/Booking.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Booking.h | 8 ++--- .../Trenser.Zenvy/models/Candidate.cpp | 2 ++ .../Trenser.Zenvy/models/Candidate.h | 8 ++--- .../Trenser.Zenvy/models/Employee.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Employee.h | 8 ++--- .../Trenser.Zenvy/models/FinanceExecutive.h | 12 ++++++++ .../Trenser.Zenvy/models/GeneralEmployee.h | 2 +- .../Trenser.Zenvy/models/HRManager.h | 11 +++++++ .../Trenser.Zenvy/models/ITExecutive.h | 11 +++++++ .../Trenser.Zenvy/models/JobListing.cpp | 2 ++ .../Trenser.Zenvy/models/JobListing.h | 8 ++--- Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Leave.h | 8 ++--- .../Trenser.Zenvy/models/Notification.cpp | 2 ++ .../Trenser.Zenvy/models/Notification.h | 8 ++--- .../Trenser.Zenvy/models/Payroll.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 8 ++--- .../Trenser.Zenvy/models/Payslip.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h | 5 ++-- Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Room.h | 5 ++-- .../Trenser.Zenvy/models/TalentExecutive.h | 11 +++++++ Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Team.h | 7 +++-- .../Trenser.Zenvy/models/TeamExecutive.h | 11 +++++++ Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp | 2 ++ Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h | 7 +++-- .../services/ApplicationConfig.h | 29 +++++++++++++++++++ .../services/EmployeeManagememtService.cpp | 1 - .../services/EmployeeManagememtService.h | 5 ---- .../services/EmployeeManagementService.cpp | 17 +++++++++++ .../services/EmployeeManagementService.h | 19 ++++++++++++ .../services/PayslipManagementService.h | 6 +++- 44 files changed, 251 insertions(+), 65 deletions(-) delete mode 100644 Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.cpp delete mode 100644 Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.h create mode 100644 Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp create mode 100644 Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index 4424458..7b35079 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -150,7 +150,7 @@ - + @@ -204,7 +204,7 @@ - + diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters index 8a20aa6..d9514f7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters @@ -39,9 +39,6 @@ Services - - Services - Services @@ -192,14 +189,14 @@ Services + + Services + Services - - Services - Services @@ -338,6 +335,9 @@ Services + + Services + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 3d97204..e7f4e30 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -15,3 +15,22 @@ void ZenvyController::changePassword(const std::string& password) { m_authenticationManagementService->changePassword(password); } + +//Employee Management +void ZenvyController::createEmployee(Enums::EmployeeType employeeType, const std::string& email, const std::string& password, const std::string& name, const std::string& phone) +{ + m_employeeManagementService->createEmployee(employeeType, email, password, name, phone); +} + +bool ZenvyController::deactivateEmployee(const std::string& id) +{ + return m_employeeManagementService->deactivateEmployee(id); +} + +Employees EmployeeManagementService::getEmployees() +{ +} + +std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) +{ +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 1a5c77b..89ba319 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -4,7 +4,7 @@ #include "AuthenticationManagementService.h" #include "AttendanceManagementService.h" #include "BookingManagementService.h" -#include "EmployeeManagememtService.h" +#include "EmployeeManagementService.h" #include "LeaveManagementService.h" #include "NotificationManagementService.h" #include "PayslipManagementService.h" @@ -19,7 +19,7 @@ private: std::shared_ptr m_authenticationManagementService; std::shared_ptr m_attendanceManagementService; std::shared_ptr m_bookingManagementService; - std::shared_ptr m_employeeManagememtService; + std::shared_ptr m_employeeManagementService; std::shared_ptr m_leaveManagementService; std::shared_ptr m_notificationManagementService; std::shared_ptr m_payslipManagementService; @@ -31,7 +31,7 @@ public: m_authenticationManagementService(std::make_shared()), m_attendanceManagementService(std::make_shared()), m_bookingManagementService(std::make_shared()), - m_employeeManagememtService(std::make_shared()), + m_employeeManagementService(std::make_shared()), m_leaveManagementService(std::make_shared()), m_notificationManagementService(std::make_shared()), m_payslipManagementService(std::make_shared()), @@ -43,4 +43,10 @@ public: AuthenticationDTO login(const std::string& email, const std::string& password); void logout(); void changePassword(const std::string&); + + //Employee Management + void createEmployee(Enums::EmployeeType, const std::string&, const std::string&, const std::string&, const std::string&); + bool deactivateEmployee(const std::string&); + Employees getEmployees(); + std::shared_ptr getEmployee(const std::string&); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index 16ddca1..e4f3c0c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -1,4 +1,5 @@ #include "DataStore.h" +#include "EmployeeManagementService.h" DataStore& DataStore::getInstance() { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h index 97f4f4e..5233d8d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h @@ -3,4 +3,15 @@ class Admin : public Employee { + Admin() = default; + Admin( + const std::string& password, + const std::string& name, + const std::string& phone, + const std::string& email, + const std::string& teamId, + std::shared_ptr payroll + ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { + }; + ~Admin() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp index 01cec1a..2b61e80 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.cpp @@ -1,5 +1,7 @@ #include "Announcement.h" +int Announcement::m_anid = 0; + const std::string& Announcement::getAnnouncementId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h b/Trenser.Zenvy/Trenser.Zenvy/models/Announcement.h index 23e333c..5d69bdb 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; std::string m_id; util::Timestamp m_timestamp; std::string m_message; public: - Announcement() : m_id(""), m_timestamp(), m_message("") {} - Announcement(const std::string& id, - const std::string& message) - : m_id(id), m_message(message) {} + Announcement() : m_id("AN" + std::to_string(++m_anid)), m_timestamp(), m_message("") {} + Announcement(const std::string& message) + : m_id("AN" + std::to_string(++m_anid)), 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 7565537..a6220dd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.cpp @@ -1,5 +1,7 @@ #include "Attendance.h" +int Attendance::m_aid = 0; + const std::string& Attendance::getAttendanceId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h b/Trenser.Zenvy/Trenser.Zenvy/models/Attendance.h index 3b10f5c..9f6d481 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; std::string m_id; util::Timestamp m_loginTime; util::Timestamp m_logoutTime; public: - Attendance() : m_id(""), m_loginTime(), m_logoutTime() {} - Attendance(const std::string& id, - const util::Timestamp& loginTime, + Attendance() : m_id("AD" + std::to_string(++m_aid)), m_loginTime(), m_logoutTime() {} + Attendance(const util::Timestamp& loginTime, const util::Timestamp& logoutTime) - : m_id(id), m_loginTime(loginTime), m_logoutTime(logoutTime) {} + : m_id("AD" + std::to_string(++m_aid)), 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 a40ed2b..4c0dcb0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.cpp @@ -1,5 +1,7 @@ #include "Booking.h" +int Booking::m_bid = 0; + const std::string& Booking::getBookingId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h b/Trenser.Zenvy/Trenser.Zenvy/models/Booking.h index 7e99b4a..c8bc55c 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; 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(""), m_startTime(), m_endTime(), m_employeeId(""), m_team(nullptr) {} - Booking(const std::string& id, - const util::Timestamp& startTime, + Booking() : m_id("BK" + std::to_string(++m_bid)), 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(id), m_startTime(startTime), m_endTime(endTime), m_employeeId(employeeId), m_team(team) {} + : m_id("BK" + std::to_string(++m_bid)), 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 e4831a4..c48c2a1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp @@ -1,5 +1,7 @@ #include "Candidate.h" +int Candidate::m_cid = 0; + const std::string& Candidate::getCandidateId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h index 257c54d..646a8ef 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; std::string m_id; std::string m_name; long int m_phone; std::string m_qualification; Enums::CandidateStatus m_status; public: - Candidate() : m_id(""), m_name(""), m_phone(0), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} - Candidate(const std::string& id, - const std::string& name, + Candidate() : m_id("CD" + std::to_string(++m_cid)), 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(id), m_name(name), m_phone(phone), m_qualification(qualification), m_status(status) {} + : m_id("CD" + std::to_string(++m_cid)), 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 4bd8c3b..57db7a9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -1,5 +1,7 @@ #include "Employee.h" +int Employee::m_uid = 0; + const std::string& Employee::getEmployeeId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index 3509db1..4b26cd0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -14,6 +14,7 @@ using leaveMap = std::map>; class Employee { private: + static int m_uid; std::string m_id; std::string m_password; std::string m_name; @@ -28,16 +29,15 @@ private: leaveMap m_leaves; Enums::EmployeeType m_employeeType; public: - Employee() : m_id(""), m_password(""), m_name(""), m_phone(""), m_email(""), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(Enums::EmployeeType::GENERAL) {} - Employee(const std::string& id, - const std::string& password, + Employee() : m_id("EMP" + std::to_string(++m_uid)), m_password(""), m_name(""), m_phone(""), m_email(""), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(Enums::EmployeeType::GENERAL) {} + Employee(const std::string& password, const std::string& name, const std::string& phone, const std::string& email, const std::string& teamId, Enums::EmployeeType employeeType, std::shared_ptr payroll) - : m_id(id), 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)), m_password(password), m_name(name), m_phone(phone), m_email(email), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(teamId), m_employeeType(employeeType), m_payroll(payroll) { } const std::string& getEmployeeId() const; const std::string& getEmployeePassword() const; const std::string& getEmployeeName() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h index 8aafc69..8956d13 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h @@ -1,7 +1,19 @@ #pragma once +#include #include "Employee.h" class FinanceExecutive : public Employee { +public: + FinanceExecutive() = default; + FinanceExecutive( + const std::string& password, + const std::string& name, + const std::string& phone, + const std::string& email, + const std::string& teamId, + std::shared_ptr payroll + ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) {}; + ~FinanceExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 6307e28..14b33a4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -15,7 +15,7 @@ public: const std::string& email, const std::string& teamId, std::shared_ptr payroll, - Enums::EmployeeDesignation designation) : Employee(id, password, name, phone, email, teamId,Enums::EmployeeType::GENERAL, payroll), m_designation(designation) {} + Enums::EmployeeDesignation designation) : Employee(password, name, phone, email, teamId,Enums::EmployeeType::GENERAL, payroll), m_designation(designation) {} Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); ~GeneralEmployee() = default; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h index 5e50a74..5ace8bc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h @@ -3,5 +3,16 @@ class HRManager : public Employee { + HRManager() = default; + HRManager( + const std::string& password, + const std::string& name, + const std::string& phone, + const std::string& email, + const std::string& teamId, + std::shared_ptr payroll + ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { + }; + ~HRManager() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h index 2a61ef8..c8b1c0f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h @@ -3,5 +3,16 @@ class ITExecutive : public Employee { + ITExecutive() = default; + ITExecutive( + const std::string& password, + const std::string& name, + const std::string& phone, + const std::string& email, + const std::string& teamId, + std::shared_ptr payroll + ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { + }; + ~ITExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp index ba1267c..5c2f704 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp @@ -1,5 +1,7 @@ #include "JobListing.h" +int JobListing::m_jid = 0; + const std::string& JobListing::getJobId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h index 3622743..7310897 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h @@ -9,6 +9,7 @@ using candidateMap = std::map>; class JobListing { private: + static int m_jid; std::string m_id; std::string m_name; std::string m_description; @@ -16,14 +17,13 @@ private: int m_numberOfVacancies; candidateMap m_candidates; public: - JobListing() : m_id(""), m_name(""), m_description(""), m_status(Enums::JobListingStatus::CLOSED), m_numberOfVacancies(0) {} - JobListing(const std::string& id, - const std::string& name, + JobListing() : m_id("JL" + std::to_string(++m_jid)), 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(id), m_name(name), m_description(description), m_status(status), m_numberOfVacancies(numberOfVacancies), m_candidates(candidates) {} + : m_id("JL" + std::to_string(++m_jid)), 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 1755bc7..1163bcb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp @@ -1,5 +1,7 @@ #include "Leave.h" +int Leave::m_lid = 0; + const std::string& Leave::getLeaveId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h index 0133f4a..b745dbf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h @@ -6,6 +6,7 @@ class Leave { private: + static int m_lid; std::string m_id; std::string m_employeeId; util::Timestamp m_timestamp; @@ -15,13 +16,12 @@ private: static int m_numberOfMedicalLeave; Enums::LeaveType m_leaveType; public: - Leave() : m_id(""), m_employeeId(""), m_timestamp(), m_reason(""), m_leaveType(Enums::LeaveType::GENERAL) {} - Leave(const std::string& id, - const std::string& employeeId, + Leave() : m_id("LV" + std::to_string(++m_lid)), 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(id), m_employeeId(employeeId), m_timestamp(timestamp), m_reason(reason), m_leaveType(leaveType) {} + : m_id("LV" + std::to_string(++m_lid)), 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 f91530a..dae35ee 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp @@ -1,5 +1,7 @@ #include "Notification.h" +int Notification::m_nid = 0; + const std::string& Notification::getNotificationId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h index 0cd723c..000f381 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; std::string m_id; std::string m_employeeId; std::string m_message; util::Timestamp m_timestamp; Enums::NotificationStatus m_notificationStatus; public: - Notification() : m_id(""), m_employeeId(""), m_message(""), m_timestamp(), m_notificationStatus(Enums::NotificationStatus::UNREAD) {} - Notification(const std::string& id, - const std::string& employeeId, + Notification() : m_id("NF" + std::to_string(++m_nid)), 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(id), m_employeeId(employeeId), m_message(message), m_notificationStatus(notificationStatus) {} + : m_id("NF" + std::to_string(++m_nid)), 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 eae13a1..71a3d5a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -1,5 +1,7 @@ #include "Payroll.h" +int Payroll::m_prid = 0; + const std::string& Payroll::getPayrollId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index 498eaf8..48215f5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -4,6 +4,7 @@ class Payroll { private: + static int m_prid; std::string m_id; double m_basicSalary; double m_houseRentAllowance; @@ -11,14 +12,13 @@ private: double m_employeePFContribution; double m_employerPFContribution; public: - Payroll() : m_id(""), m_basicSalary(0.0), m_houseRentAllowance(0.0), m_foodAllowance(0.0), m_employeePFContribution(0.0), m_employerPFContribution(0.0) {} - Payroll(const std::string& id, - double basicSalary, + 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(double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) - : m_id(id), m_basicSalary(basicSalary), m_houseRentAllowance(houseRentAllowance), m_foodAllowance(foodAllowance), m_employeePFContribution(employeePFContribution), m_employerPFContribution(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; double getBasicSalary() const; double getHouseRentAllowance() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp index 3daf4b9..fd40ee6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp @@ -1,5 +1,7 @@ #include "Payslip.h" +int Payslip::m_pid = 0; + const std::string& Payslip::getPayslipId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h index 3f48dd2..78e37b1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h @@ -4,11 +4,12 @@ class Payslip { private: + static int m_pid; std::string m_id; double m_salary; public: - Payslip() : m_id(""), m_salary(0.0) {} - Payslip(const std::string& id, double salary) : m_id(id), m_salary(salary) {} + 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) {} 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 9fcd521..8134102 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp @@ -1,5 +1,7 @@ #include "Room.h" +int Room::m_rid = 0; + const std::string& Room::getRoomId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h index 48a4ba1..e0084e9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h @@ -8,12 +8,13 @@ using bookingMap = std::map>; class Room { private: + static int m_rid; std::string m_id; std::string m_name; bookingMap m_bookings; public: - Room() : m_id(""), m_name("") {} - Room(const std::string& id, const std::string& name) : m_id(id), m_name(name) {} + 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) {} 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 fcbfbcd..88c5018 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h @@ -3,5 +3,16 @@ class TalentExecutive : public Employee { + TalentExecutive() = default; + TalentExecutive( + const std::string& password, + const std::string& name, + const std::string& phone, + const std::string& email, + const std::string& teamId, + std::shared_ptr payroll + ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { + }; + ~TalentExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp index a6848b3..fce9fd5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp @@ -1,5 +1,7 @@ #include "Team.h" +int Team::m_tmid = 0; + const std::string& Team::getTeamId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h index edb8f44..b4782cd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h @@ -8,18 +8,19 @@ using employeeMap = std::map>; class Team { private: + static int m_tmid; std::string m_id; std::string m_name; std::shared_ptr m_lead; employeeMap m_employees; int m_maximumNumberOfEmployees; public: - Team() : m_id(""), m_name(""), m_lead(nullptr), m_maximumNumberOfEmployees(0) {} - Team(const std::string& id, + Team() : m_id("TM" + std::to_string(++m_tmid)), m_name(""), m_lead(nullptr), m_maximumNumberOfEmployees(0) {} + Team( const std::string& name, std::shared_ptr lead, int maximumNumberOfEmployees) - : m_id(id), m_name(name), m_lead(lead), m_maximumNumberOfEmployees(maximumNumberOfEmployees) { + : m_id("TM" + std::to_string(++m_tmid)), m_name(name), m_lead(lead), m_maximumNumberOfEmployees(maximumNumberOfEmployees) { } const std::string& getTeamId() const; const std::string& getTeamName() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h index d7db4e9..e948a78 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h @@ -3,5 +3,16 @@ class TeamExecutive : public Employee { + TeamExecutive() = default; + TeamExecutive( + const std::string& password, + const std::string& name, + const std::string& phone, + const std::string& email, + const std::string& teamId, + std::shared_ptr payroll + ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { + }; + ~TeamExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp index 328421c..431093e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp @@ -1,5 +1,7 @@ #include "Ticket.h" +int Ticket::m_tid = 0; + const std::string& Ticket::getTicketId() const { return m_id; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h index 7d54a6f..1ab88aa 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h @@ -5,19 +5,20 @@ class Ticket { private: + static int m_tid; std::string m_id; Enums::TicketType m_type; std::string m_description; Enums::TicketStatus m_status; std::string m_employeeId; public: - Ticket() : m_id(""), m_type(Enums::TicketType::UNKNOWN), m_description(""), m_status(Enums::TicketStatus::OPEN), m_employeeId("") {} - Ticket(const std::string& id, + Ticket() : m_id("TKT" + std::to_string(++m_tid)), 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(id), m_type(type), m_description(description), m_status(status), m_employeeId(employeeId) {} + : m_id("TKT" + std::to_string(++m_tid)), 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 8e4705e..0f3ab3d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -6,4 +6,33 @@ namespace Config { constexpr const char* DEFAULT_PASSWORD = "password"; } + + namespace Payroll + { + constexpr double TEAM_LEAD_BASIC_SALARY = 0.0; + constexpr double TEAM_LEAD_HOUSE_RENT_ALLOWANCE = 0.0; + constexpr double TEAM_LEAD_FOOD_ALLOWANCE = 0.0; + constexpr double TEAM_LEAD_EMPLOYEE_PF_CONTRIBUTION = 0.0; + constexpr double TEAM_LEAD_EMPLOYER_PF_CONTRIBUTION = 0.0; + constexpr double SENIOR_BASIC_SALARY = 0.0; + constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 0.0; + constexpr double SENIOR_FOOD_ALLOWANCE = 0.0; + constexpr double SENIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; + constexpr double SENIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; + constexpr double JUNIOR_BASIC_SALARY = 0.0; + constexpr double JUNIOR_HOUSE_RENT_ALLOWANCE = 0.0; + constexpr double JUNIOR_FOOD_ALLOWANCE = 0.0; + constexpr double JUNIOR_EMPLOYEE_PF_CONTRIBUTION = 0.0; + constexpr double JUNIOR_EMPLOYER_PF_CONTRIBUTION = 0.0; + constexpr double HR_MANAGER_BASIC_SALARY = 0.0; + constexpr double HR_MANAGER_HOUSE_RENT_ALLOWANCE = 0.0; + constexpr double HR_MANAGER_FOOD_ALLOWANCE = 0.0; + constexpr double HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION = 0.0; + constexpr double HR_MANAGER_EMPLOYER_PF_CONTRIBUTION = 0.0; + constexpr double EXECUTIVE_BASIC_SALARY = 0.0; + constexpr double EXECUTIVE_HOUSE_RENT_ALLOWANCE = 0.0; + constexpr double EXECUTIVE_FOOD_ALLOWANCE = 0.0; + constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 0.0; + constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 0.0; + } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.cpp deleted file mode 100644 index bf8ad9d..0000000 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "EmployeeManagememtService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.h deleted file mode 100644 index 05e6ca7..0000000 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagememtService.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -class EmployeeManagememtService -{ -}; - diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp new file mode 100644 index 0000000..56e27b0 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -0,0 +1,17 @@ +#include "EmployeeManagementService.h" + +void EmployeeManagementService::createEmployee(Enums::EmployeeType, const std::string& email, const std::string& password, const std::string& name, const std::string& phone) +{ +} + +bool EmployeeManagementService::deactivateEmployee(const std::string& id) +{ +} + +Employees EmployeeManagementService::getEmployees() +{ +} + +std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) +{ +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h new file mode 100644 index 0000000..5ff7613 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include +#include "DataStore.h" +#include "Enums.h" + +using Employees = std::vector>; + +class EmployeeManagementService +{ +private: + DataStore& m_dataStore; +public: + EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; + void createEmployee(Enums::EmployeeType, const std::string&, const std::string&, const std::string&, const std::string&); + bool deactivateEmployee(const std::string&); + Employees getEmployees(); + std::shared_ptr getEmployee(const std::string&); +}; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 04c9805..510ffe3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -1,5 +1,9 @@ #pragma once + class PayslipManagementService { +private: + DataStore& m_dataStore; +public: + PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; }; - From ef5ac42a92a3db95e4b954721c3bc57675c4588b Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Tue, 7 Apr 2026 15:07:44 +0530 Subject: [PATCH 02/56] Implement employee creation EMP001 Create Employee - Updated employee creation flow to support different employee types and designations - Set a default initial password for new employees - Added basic authorization check utility - Cleaned up employee model constructors for better consistency Minor code cleanup and refactoring Smitha Mohan --- .../Trenser.Zenvy/Trenser.Zenvy.vcxproj | 2 + .../controllers/ZenvyController.cpp | 4 +- .../controllers/ZenvyController.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Admin.h | 6 +- Trenser.Zenvy/Trenser.Zenvy/models/Employee.h | 9 +- .../Trenser.Zenvy/models/FinanceExecutive.h | 4 +- .../Trenser.Zenvy/models/GeneralEmployee.h | 7 +- .../Trenser.Zenvy/models/HRManager.h | 6 +- .../Trenser.Zenvy/models/ITExecutive.h | 6 +- .../Trenser.Zenvy/models/TalentExecutive.h | 6 +- .../Trenser.Zenvy/models/TeamExecutive.h | 6 +- .../services/ApplicationConfig.h | 5 - .../services/EmployeeManagementService.cpp | 94 +++++++++++++++++- .../services/EmployeeManagementService.h | 2 +- .../services/PayslipManagementService.h | 1 + .../utilities/AuthorizationHelper.cpp | 1 + .../utilities/AuthorizationHelper.h | 31 ++++++ .../Trenser.Zenvy/views/AdminMenu.cpp | 98 +++++++++++++++++-- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 84 +++++++++++++++- 19 files changed, 318 insertions(+), 56 deletions(-) create mode 100644 Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.cpp create mode 100644 Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index 7b35079..a5591c2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -162,6 +162,7 @@ + @@ -212,6 +213,7 @@ + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index e7f4e30..73cbac4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -17,9 +17,9 @@ void ZenvyController::changePassword(const std::string& password) } //Employee Management -void ZenvyController::createEmployee(Enums::EmployeeType employeeType, const std::string& email, const std::string& password, const std::string& name, const std::string& phone) +void ZenvyController::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { - m_employeeManagementService->createEmployee(employeeType, email, password, name, phone); + m_employeeManagementService->createEmployee(employeeType, employeeDesignation, email, name, phone); } bool ZenvyController::deactivateEmployee(const std::string& id) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 89ba319..390976b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -45,7 +45,7 @@ public: void changePassword(const std::string&); //Employee Management - void createEmployee(Enums::EmployeeType, const std::string&, const std::string&, const std::string&, const std::string&); + void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h index 5233d8d..5b869b0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h @@ -3,15 +3,13 @@ class Admin : public Employee { +public: Admin() = default; Admin( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::GENERAL, payroll) {}; ~Admin() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index 4b26cd0..b690f7c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -7,6 +7,7 @@ #include "Leave.h" #include "Payroll.h" #include "Enums.h" +#include "ApplicationConfig.h" using payslipMap = std::map>; using attendanceMap = std::map>>; using leaveMap = std::map>; @@ -29,15 +30,13 @@ private: leaveMap m_leaves; Enums::EmployeeType m_employeeType; public: - Employee() : m_id("EMP" + std::to_string(++m_uid)), m_password(""), m_name(""), m_phone(""), m_email(""), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(Enums::EmployeeType::GENERAL) {} - Employee(const std::string& password, - const std::string& name, + Employee() : m_id("EMP" + std::to_string(++m_uid)), m_password(Config::Authentication::DEFAULT_PASSWORD), m_name(""), m_phone(""), m_email(""), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(Enums::EmployeeType::GENERAL) {} + Employee(const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, Enums::EmployeeType employeeType, std::shared_ptr payroll) - : m_id("EMP" + std::to_string(++m_uid)), m_password(password), m_name(name), m_phone(phone), m_email(email), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(teamId), m_employeeType(employeeType), m_payroll(payroll) { } + : m_id("EMP" + std::to_string(++m_uid)), m_password(Config::Authentication::DEFAULT_PASSWORD), m_name(name), m_phone(phone), m_email(email), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(employeeType), m_payroll(payroll) { } const std::string& getEmployeeId() const; const std::string& getEmployeePassword() const; const std::string& getEmployeeName() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h index 8956d13..6713881 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h @@ -7,13 +7,11 @@ class FinanceExecutive : public Employee public: FinanceExecutive() = default; FinanceExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) {}; + ) :Employee(name, phone, email, Enums::EmployeeType::FINANCE, payroll) {}; ~FinanceExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 14b33a4..c413eac 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -8,14 +8,11 @@ private: Enums::EmployeeDesignation m_designation; public: GeneralEmployee() : m_designation(Enums::EmployeeDesignation::JUNIOR) {} - GeneralEmployee(const std::string& id, - const std::string& password, - const std::string& name, + GeneralEmployee(const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll, - Enums::EmployeeDesignation designation) : Employee(password, name, phone, email, teamId,Enums::EmployeeType::GENERAL, payroll), m_designation(designation) {} + Enums::EmployeeDesignation designation) : Employee(name, phone, email, Enums::EmployeeType::GENERAL, payroll), m_designation(designation) {} Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); ~GeneralEmployee() = default; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h index 5ace8bc..1c9ae17 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h @@ -3,16 +3,14 @@ class HRManager : public Employee { +public: HRManager() = default; HRManager( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::HR, payroll) {}; ~HRManager() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h index c8b1c0f..7cecff3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h @@ -3,16 +3,14 @@ class ITExecutive : public Employee { +public: ITExecutive() = default; ITExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::GENERAL, payroll) {}; ~ITExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h index 88c5018..2352f7a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h @@ -3,16 +3,14 @@ class TalentExecutive : public Employee { +public: TalentExecutive() = default; TalentExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::TAG, payroll) {}; ~TalentExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h index e948a78..03f321b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h @@ -3,16 +3,14 @@ class TeamExecutive : public Employee { +public: TeamExecutive() = default; TeamExecutive( - const std::string& password, const std::string& name, const std::string& phone, const std::string& email, - const std::string& teamId, std::shared_ptr payroll - ) :Employee(password, name, phone, email, teamId, Enums::EmployeeType::GENERAL, payroll) { - }; + ) :Employee(name, phone, email, Enums::EmployeeType::TEAM, payroll) {}; ~TeamExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h index 0f3ab3d..15f54e6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -9,11 +9,6 @@ namespace Config namespace Payroll { - constexpr double TEAM_LEAD_BASIC_SALARY = 0.0; - constexpr double TEAM_LEAD_HOUSE_RENT_ALLOWANCE = 0.0; - constexpr double TEAM_LEAD_FOOD_ALLOWANCE = 0.0; - constexpr double TEAM_LEAD_EMPLOYEE_PF_CONTRIBUTION = 0.0; - constexpr double TEAM_LEAD_EMPLOYER_PF_CONTRIBUTION = 0.0; constexpr double SENIOR_BASIC_SALARY = 0.0; constexpr double SENIOR_HOUSE_RENT_ALLOWANCE = 0.0; constexpr double SENIOR_FOOD_ALLOWANCE = 0.0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 56e27b0..6b019ac 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -1,7 +1,99 @@ +#include #include "EmployeeManagementService.h" +#include "Factory.h" +#include "Validator.h" +#include "AuthorizationHelper.h" +#include "Enums.h" +#include "HRManager.h" +#include "ITExecutive.h" +#include "TalentExecutive.h" +#include "TeamExecutive.h" +#include "FinanceExecutive.h" +#include "GeneralEmployee.h" -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) { + std::shared_ptr authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); + if (!authenticatedEmployee) + { + throw std::runtime_error("No authenticated user"); + } + Enums::EmployeeType authenticatedEmployeeType = authenticatedEmployee->getEmployeeType(); + std::shared_ptr employee; + std::shared_ptr payroll; + if (!util::isEmailValid(email)) + { + throw std::runtime_error("Invalid Email"); + } + if (!util::isPhoneNumberValid(phone)) + { + throw std::runtime_error("Invalid Phone"); + } + switch (employeeType) + { + case Enums::EmployeeType::HR: + util::enforceAuthorization(authenticatedEmployeeType, Enums::EmployeeType::ADMIN); + payroll = Factory::getObject(Config::Payroll::HR_MANAGER_BASIC_SALARY, + Config::Payroll::HR_MANAGER_HOUSE_RENT_ALLOWANCE, + Config::Payroll::HR_MANAGER_FOOD_ALLOWANCE, + Config::Payroll::HR_MANAGER_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::HR_MANAGER_EMPLOYER_PF_CONTRIBUTION); + employee = Factory::getObject(name, phone, email, payroll); + break; + + case Enums::EmployeeType::IT: + case Enums::EmployeeType::FINANCE: + case Enums::EmployeeType::TEAM: + case Enums::EmployeeType::TAG: + util::enforceAuthorization(authenticatedEmployeeType, Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + payroll = Factory::getObject(Config::Payroll::EXECUTIVE_BASIC_SALARY, + Config::Payroll::EXECUTIVE_HOUSE_RENT_ALLOWANCE, + Config::Payroll::EXECUTIVE_FOOD_ALLOWANCE, + Config::Payroll::EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::EXECUTIVE_EMPLOYER_PF_CONTRIBUTION); + switch (employeeType) + { + case Enums::EmployeeType::IT: + employee = Factory::getObject(name, phone, email, payroll); + break; + case Enums::EmployeeType::FINANCE: + employee = Factory::getObject(name, phone, email, payroll); + break; + case Enums::EmployeeType::TEAM: + employee = Factory::getObject(name, phone, email, payroll); + break; + case Enums::EmployeeType::TAG: + employee = Factory::getObject (name, phone, email, payroll); + break; + } + break; + case Enums::EmployeeType::GENERAL: + util::enforceAuthorization(authenticatedEmployeeType, Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + switch (employeeDesignation) + { + case Enums::EmployeeDesignation::JUNIOR: + payroll = Factory::getObject(Config::Payroll::JUNIOR_BASIC_SALARY, + Config::Payroll::JUNIOR_HOUSE_RENT_ALLOWANCE, + Config::Payroll::JUNIOR_FOOD_ALLOWANCE, + Config::Payroll::JUNIOR_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::JUNIOR_EMPLOYER_PF_CONTRIBUTION); + break; + case Enums::EmployeeDesignation::SENIOR: + payroll = Factory::getObject(Config::Payroll::SENIOR_BASIC_SALARY, + Config::Payroll::SENIOR_HOUSE_RENT_ALLOWANCE, + Config::Payroll::SENIOR_FOOD_ALLOWANCE, + Config::Payroll::SENIOR_EMPLOYEE_PF_CONTRIBUTION, + Config::Payroll::SENIOR_EMPLOYER_PF_CONTRIBUTION); + break; + default: + throw std::runtime_error("Invalid General Employee Designation"); + } + employee = Factory::getObject(name, phone, email, payroll, employeeDesignation); + break; + default: + throw std::runtime_error("Invalid Employee Type"); + } + m_dataStore.getEmployees().emplace(std::make_pair(employee->getEmployeeId(), employee)); } bool EmployeeManagementService::deactivateEmployee(const std::string& id) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 5ff7613..b7ac0f1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -12,7 +12,7 @@ private: DataStore& m_dataStore; public: EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; - void createEmployee(Enums::EmployeeType, const std::string&, const std::string&, const std::string&, const std::string&); + void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 510ffe3..fb51a34 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -1,4 +1,5 @@ #pragma once +#include "DataStore.h" class PayslipManagementService { diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.cpp new file mode 100644 index 0000000..d021692 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.cpp @@ -0,0 +1 @@ +#include "AuthorizationHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h new file mode 100644 index 0000000..e9c4d4b --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h @@ -0,0 +1,31 @@ +#pragma once +#include +#include "Enums.h" + +namespace util +{ + inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first) + { + return current == first; + } + + template + inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first, + Rest... rest) + { + if (current == first) + { + return true; + } + return isAuthorized(current, rest...); + } + + template + inline void enforceAuthorization(Enums::EmployeeType current, Allowed... allowed) + { + if (!isAuthorized(current, allowed...)) + { + throw std::runtime_error("You are unauthorized to perform this operation!"); + } + } +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index ecad349..35dd209 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -3,6 +3,87 @@ #include"InputHelper.h" #include"OutputHelper.h" +static Enums::EmployeeType getEmployeeType() +{ + int choice; + util::clear(); + std::cout << "Select Employee Type" + "\n1. HR Employee" + "\n2. IT Executive" + "\n3. Team Executive" + "\n4. Finance Executive" + "\n5. Talent Executive" + "\n6. General Employee"; + util::read(choice); + switch (choice) + { + case 1: + return Enums::EmployeeType::HR; + case 2: + return Enums::EmployeeType::IT; + case 3: + return Enums::EmployeeType::TEAM; + case 4: + return Enums::EmployeeType::FINANCE; + case 5: + return Enums::EmployeeType::TAG; + case 6: + return Enums::EmployeeType::GENERAL; + default: + return Enums::EmployeeType::INVALID; + } +} + +static Enums::EmployeeDesignation getEmployeeDesignation() +{ + int choice; + util::clear(); + std::cout << "Select Employee Designation" + "\n1. SENIOR" + "\n2. JUNIOR"; + util::read(choice); + switch (choice) + { + case 1: + return Enums::EmployeeDesignation::SENIOR; + case 2: + return Enums::EmployeeDesignation::JUNIOR; + default: + return Enums::EmployeeDesignation::INVALID; + } +} + +static void createEmployee(std::shared_ptr controller) +{ + Enums::EmployeeType employeeType = 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, name, email, phone); + std::cout << "\nCreated Employee Successfully."; +} + void AdminMenu::run() { bool isMenuActive = true; @@ -12,7 +93,7 @@ void AdminMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - HR Management System\n1. Create HRManager\n2. Create Employee\n3. View Employee\n4. Deactivate Employee\n5. Logout\nEnter your Choice: "; + std::cout << "Admin Menu\n1. Create User\n2. View Employee\n3. Deactivate Employee\n4. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -31,22 +112,19 @@ bool AdminMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.createHRManager(); + case 1: + createEmployee(m_zenvyController); break; - case 2: - m_zenvyController.createEmployee(); - break; - case 3: + /*case 2: m_zenvyController.viewEmployee(); break; - case 4: + case 3: m_zenvyController.deactivateEmployee(); break;*/ - case 5: + case 4: return false; default: std::cout << "Enter a valid choice!" << std::endl; } return true; -} \ No newline at end of file +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 7bf812c..fa3ffbd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -3,6 +3,84 @@ #include"InputHelper.h" #include"OutputHelper.h" +static Enums::EmployeeType getEmployeeType() +{ + int choice; + util::clear(); + std::cout << "Select Employee Type" + "\n1. IT Executive" + "\n2. Team Executive" + "\n3. Finance Executive" + "\n4. Talent Executive" + "\n5. General Employee"; + util::read(choice); + switch (choice) + { + case 1: + return Enums::EmployeeType::IT; + case 2: + return Enums::EmployeeType::TEAM; + case 3: + return Enums::EmployeeType::FINANCE; + case 4: + return Enums::EmployeeType::TAG; + case 5: + return Enums::EmployeeType::GENERAL; + default: + return Enums::EmployeeType::INVALID; + } +} + +static Enums::EmployeeDesignation getEmployeeDesignation() +{ + int choice; + util::clear(); + std::cout << "Select Employee Designation" + "\n1. SENIOR" + "\n2. JUNIOR"; + util::read(choice); + switch (choice) + { + case 1: + return Enums::EmployeeDesignation::SENIOR; + case 2: + return Enums::EmployeeDesignation::JUNIOR; + default: + return Enums::EmployeeDesignation::INVALID; + } +} + +static void createEmployee(std::shared_ptr controller) +{ + Enums::EmployeeType employeeType = 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, name, email, phone); + std::cout << "\nCreated Employee Successfully."; +} + void HRManagerMenu::run() { bool isMenuActive = true; @@ -52,9 +130,9 @@ bool HRManagerMenu::handleOperation(int choice) //case 7: // m_zenvyController.viewAnnouncements(); // break; - //case 8: - // m_zenvyController.createEmployee(); - // break; + case 8: + createEmployee(m_zenvyController); + break; //case 9: // m_zenvyController.regularizeAttenance(); // break; From 1785660e9430352838304d8ce58bb11fa1010dda Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 7 Apr 2026 17:38:53 +0530 Subject: [PATCH 03/56] Add Employee Listing Feature EMP007 : View All Employees - Implemented getEmployees() in ZenvyController to return list of employees - Added working getEmployees() implementation in EmployeeManagementService - Fixed iterator usage to correctly extract map values into Employees vector - Added viewEmployees() UI flow in EmployeeMenu - Integrated employee listing into EmployeeMenu option flow - Added enumToString() helper for printing employee roles - Improved formatting and filtering of ACTIVE employees in employee listing - Performed minor code cleanup and consistency adjustments in controller and menu Smitha Mohan --- .../controllers/ZenvyController.cpp | 4 +- .../controllers/ZenvyController.h | 2 +- .../services/EmployeeManagementService.cpp | 15 +++++-- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 45 +++++++++++++++++-- .../Trenser.Zenvy/views/EmployeeMenu.h | 1 + 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index e7f4e30..ec1e7b1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -27,10 +27,12 @@ bool ZenvyController::deactivateEmployee(const std::string& id) return m_employeeManagementService->deactivateEmployee(id); } -Employees EmployeeManagementService::getEmployees() +Employees ZenvyController::getEmployee() { + return m_employeeManagementService->getEmployees(); } + std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) { } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 89ba319..29ce7d3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -47,6 +47,6 @@ public: //Employee Management void createEmployee(Enums::EmployeeType, const std::string&, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); - Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); + Employees getEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 56e27b0..cce72f7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -8,10 +8,17 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) { } -Employees EmployeeManagementService::getEmployees() -{ -} - std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) { } + +Employees EmployeeManagementService::getEmployees() +{ + Employees result; + auto& employee = m_dataStore.getEmployees(); + for (const auto& iterator : employee) + { + result.push_back(iterator.second); + } + return result; +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 99e3bc0..b3f6ec1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -48,11 +48,11 @@ bool EmployeeMenu::handleOperation(int choice) break; case 6: m_zenvyController.viewTicketHistory(); - break; + break;*/ case 7: - m_zenvyController.viewEmployees(); + viewEmployees(); break; - case 8: + /*case 8: m_zenvyController.searchEmployee(); break; case 9: @@ -76,4 +76,43 @@ bool EmployeeMenu::handleOperation(int choice) std::cout << "Enter a valid choice!" << std::endl; } return true; +} + +void EmployeeMenu::viewEmployees() +{ + std::cout << "EMPID\t\tName\t\tRole\t\tTeamId\t\tEmail\t\tPhone\t\t"; + auto employee = m_zenvyController->getEmployee(); + for (const auto& iterator : employee) + { + if (iterator->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + std::cout << iterator->getEmployeeId() << "\t" + << iterator->getEmployeeName() << "\t" + << enumToString(iterator->getEmployeeType()) << "\t" + << iterator->getEmployeeTeamId() << "\t" + << iterator->getEmployeeEmail() << "\t" + << iterator->getEmployeePhone() << std::endl; + } + } +} + +std::string enumToString(Enums::EmployeeType type) +{ + switch (type) + { + case Enums::EmployeeType::IT: + return "IT Executive"; + case Enums::EmployeeType::FINANCE: + return "Finance Executive"; + case Enums::EmployeeType::GENERAL: + return "General Employee"; + case Enums::EmployeeType::HR: + return "HR"; + case Enums::EmployeeType::TAG: + return "Talent Acquacition Executive"; + case Enums::EmployeeType::TEAM: + return "Team Executive"; + case Enums::EmployeeType::INVALID: + return "Invalid"; + } } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h index f082b66..3ed9b3a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h @@ -10,5 +10,6 @@ public: EmployeeMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void viewEmployees(); }; From 6256b9ea82ed7d0bdda0fb7d9e82361e2e940bdb Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 7 Apr 2026 19:19:08 +0530 Subject: [PATCH 04/56] Implement Review fixes EMP007 : View All Employees - Added check for empty employee map - Filtered only ACTIVE employees - Added formatted table using in EmplopyeeMenu::viewEmployee() - Added check for empty employee list Smitha Mohan --- .../services/EmployeeManagementService.cpp | 13 +++++-- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 36 ++++++++++++------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index cce72f7..29a7363 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -15,10 +15,17 @@ std::shared_ptr EmployeeManagementService::getEmployee(const std Employees EmployeeManagementService::getEmployees() { Employees result; - auto& employee = m_dataStore.getEmployees(); - for (const auto& iterator : employee) + auto& employees = m_dataStore.getEmployees(); + if (employees.size() <= 0) { - result.push_back(iterator.second); + return result; + } + for (const auto& iterator : employees) + { + if (iterator.second->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + result.push_back(iterator.second); + } } return result; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index b3f6ec1..02c903f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -1,4 +1,5 @@ #include +#include #include "EmployeeMenu.h" #include"InputHelper.h" #include"OutputHelper.h" @@ -80,19 +81,30 @@ bool EmployeeMenu::handleOperation(int choice) void EmployeeMenu::viewEmployees() { - std::cout << "EMPID\t\tName\t\tRole\t\tTeamId\t\tEmail\t\tPhone\t\t"; - auto employee = m_zenvyController->getEmployee(); - for (const auto& iterator : employee) + std::cout << std::left + << std::setw(10) << "EMPID" + << std::setw(20) << "Name" + << std::setw(15) << "Role" + << std::setw(10) << "TeamId" + << std::setw(25) << "Email" + << std::setw(15) << "Phone" + << std::endl; + auto employees = m_zenvyController->getEmployee(); + if (employees.empty()) { - if (iterator->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) - { - std::cout << iterator->getEmployeeId() << "\t" - << iterator->getEmployeeName() << "\t" - << enumToString(iterator->getEmployeeType()) << "\t" - << iterator->getEmployeeTeamId() << "\t" - << iterator->getEmployeeEmail() << "\t" - << iterator->getEmployeePhone() << std::endl; - } + std::cout << "No employees found\n"; + return; + } + for (const auto& iterator : employees) + { + std::cout << std::left + << std::setw(10) << iterator->getEmployeeId() + << std::setw(20) << iterator->getEmployeeName() + << std::setw(15) << enumToString(iterator->getEmployeeType()) + << std::setw(10) << iterator->getEmployeeTeamId() + << std::setw(25) << iterator->getEmployeeEmail() + << std::setw(15) << iterator->getEmployeePhone() + << std::endl; } } From 47a9065c3bec5758828fd834814171c4206147b6 Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Tue, 7 Apr 2026 20:11:20 +0530 Subject: [PATCH 05/56] Add Search Employee for All Users EMP006 : Search Employee - Added MenuHelper.cpp and MenuHelper.h helper files to project - Added searchEmployee method in ZenvyController returning employee type and list - Implemented search Employee logic in Employement Management Service - Connected searchEmployee to all the User Menu Smitha Mohan --- .../Trenser.Zenvy/Trenser.Zenvy.vcxproj | 2 + .../Trenser.Zenvy.vcxproj.filters | 6 + .../controllers/ZenvyController.cpp | 9 +- .../controllers/ZenvyController.h | 1 + .../services/EmployeeManagementService.cpp | 30 +++- .../services/EmployeeManagementService.h | 3 + Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 146 ++++++++++++++++++ .../Trenser.Zenvy/utilities/InputHelper.h | 1 - .../Trenser.Zenvy/views/AdminMenu.cpp | 16 +- Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h | 2 + .../Trenser.Zenvy/views/EmployeeMenu.cpp | 19 ++- .../Trenser.Zenvy/views/EmployeeMenu.h | 3 + .../views/FinanceExecutiveMenu.cpp | 18 ++- .../views/FinanceExecutiveMenu.h | 2 + .../Trenser.Zenvy/views/HRManagerMenu.cpp | 76 +++++---- .../Trenser.Zenvy/views/HRManagerMenu.h | 2 + .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 18 ++- .../Trenser.Zenvy/views/ITExecutiveMenu.h | 2 + .../Trenser.Zenvy/views/MenuHelper.cpp | 3 + .../Trenser.Zenvy/views/MenuHelper.h | 69 +++++++++ .../views/TalentExecutiveMenu.cpp | 82 +++++----- .../Trenser.Zenvy/views/TalentExecutiveMenu.h | 2 + .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 88 ++++++----- .../Trenser.Zenvy/views/TeamExecutiveMenu.h | 2 + .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 18 ++- .../Trenser.Zenvy/views/TeamLeadMenu.h | 2 + 26 files changed, 482 insertions(+), 140 deletions(-) create mode 100644 Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp create mode 100644 Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index 7b35079..3116d41 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -172,6 +172,7 @@ + @@ -222,6 +223,7 @@ + diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters index d9514f7..0def00c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters @@ -192,6 +192,9 @@ Services + + Views + @@ -338,6 +341,9 @@ Services + + Views + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index e7f4e30..f02f774 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -27,10 +27,15 @@ bool ZenvyController::deactivateEmployee(const std::string& id) return m_employeeManagementService->deactivateEmployee(id); } -Employees EmployeeManagementService::getEmployees() +std::pair>> ZenvyController::searchEmployee(const std::string& name) +{ + m_employeeManagementService->searchEmployee(name); +} + +Employees ZenvyController::getEmployees() { } -std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) +std::shared_ptr ZenvyController::getEmployee(const std::string& id) { } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 89ba319..2c8a260 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -49,4 +49,5 @@ public: bool deactivateEmployee(const std::string&); Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); + std::pair>> searchEmployee(const std::string&); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 56e27b0..a825956 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -3,15 +3,39 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType, const std::string& email, const std::string& password, const std::string& name, const std::string& phone) { } - bool EmployeeManagementService::deactivateEmployee(const std::string& id) { } - Employees EmployeeManagementService::getEmployees() { } - std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) { } +std::pair>> EmployeeManagementService::searchEmployee(const std::string& name) +{ + std::shared_ptr currentUser = m_dataStore.getAuthenticatedEmployee(); + Enums::EmployeeType employeeType = currentUser->getEmployeeType(); + employeeMap& employees = m_dataStore.getEmployees(); + std::vector> employeeList; + if (employees.empty()) + { + return std::make_pair(employeeType, employeeList); + } + for (const auto& entry : employees) { + const auto& employee = entry.second; + if (!employee) + { + continue; // skip if pointer is null + } + std::string employeeName = employee->getEmployeeName(); + std::transform(employeeName.begin(), employeeName.end(), employeeName.begin(), ::tolower); + std::string searchName = name; + std::transform(searchName.begin(), searchName.end(), searchName.begin(), ::tolower); + if (employeeName == searchName) + { + employeeList.push_back(employee); + } + } + return { employeeType, employeeList }; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 5ff7613..e355154 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -1,6 +1,8 @@ #pragma once #include #include +#include +#include #include "DataStore.h" #include "Enums.h" @@ -16,4 +18,5 @@ public: bool deactivateEmployee(const std::string&); Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); + std::pair>> searchEmployee(const std::string&); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index ace8792..bf70b93 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -1,4 +1,5 @@ #pragma once +#include namespace Enums { @@ -89,4 +90,149 @@ namespace Enums { USER_NOT_FOUND, INVALID_PASSWORD }; + + /*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"; + default: + return "Invalid"; + } + } + + std::string getTeamStatus(TeamStatus status) + { + + }*/ + + std::string getAccountStatus(AccountStatus status) { + switch (status) { + case AccountStatus::ACTIVE: return "Active"; + case AccountStatus::INACTIVE: return "Inactive"; + default: return "Unknown"; + } + } + + std::string getTeamStatus(TeamStatus status) { + switch (status) { + case TeamStatus::IN_TEAM: return "In Team"; + case TeamStatus::NOT_IN_TEAM: return "Not in Team"; + default: return "Unknown"; + } + } + + std::string getCandidateStatus(CandidateStatus status) { + switch (status) { + case CandidateStatus::PENDING: return "Pending"; + case CandidateStatus::SHORTLISTED: return "Shortlisted"; + case CandidateStatus::REJECTED: return "Rejected"; + default: return "Unknown"; + } + } + + std::string getNotificationStatus(NotificationStatus status) { + switch (status) { + case NotificationStatus::READ: return "Read"; + case NotificationStatus::UNREAD: return "Unread"; + default: return "Unknown"; + } + } + + std::string getLeaveStatus(LeaveStatus status) { + switch (status) { + case LeaveStatus::PENDING: return "Pending"; + case LeaveStatus::APPROVED: return "Approved"; + case LeaveStatus::REJECTED: return "Rejected"; + default: return "Unknown"; + } + } + + std::string getLeaveType(LeaveType type) { + switch (type) { + case LeaveType::GENERAL: return "General Leave"; + case LeaveType::MEDICAL: return "Medical Leave"; + case LeaveType::RESTRICTED: return "Restricted Leave"; + default: return "Unknown"; + } + } + + std::string getJobListingStatus(JobListingStatus status) { + switch (status) { + case JobListingStatus::OPEN: return "Open"; + case JobListingStatus::CLOSED: return "Closed"; + default: return "Unknown"; + } + } + + std::string getTicketStatus(TicketStatus status) { + switch (status) { + case TicketStatus::OPEN: return "Open"; + case TicketStatus::RESOLVED: return "Resolved"; + case TicketStatus::CLOSED: return "Closed"; + default: return "Unknown"; + } + } + + std::string getTicketType(TicketType type) { + switch (type) { + case TicketType::IT: return "IT"; + case TicketType::FINANCE: return "Finance"; + case TicketType::ATTENDANCE: return "Attendance"; + case TicketType::UNKNOWN: return "Unknown"; + default: return "Unknown"; + } + } + + std::string getEmployeeDesignation(EmployeeDesignation designation) { + switch (designation) { + case EmployeeDesignation::JUNIOR: return "Junior"; + case EmployeeDesignation::SENIOR: return "Senior"; + case EmployeeDesignation::TEAM_LEAD: return "Team Lead"; + case EmployeeDesignation::INVALID: return "Invalid"; + default: return "Unknown"; + } + } + + std::string getEmployeeType(EmployeeType type) { + switch (type) { + case EmployeeType::HR: return "HR Manager"; + case EmployeeType::TEAM: return "Team Executive"; + case EmployeeType::ADMIN: return "Admin"; + case EmployeeType::IT: return "IT Executive"; + case EmployeeType::FINANCE: return "Finance Executive"; + case EmployeeType::TAG: return "Talent Acquisition Executive"; + case EmployeeType::GENERAL: return "General Employee"; + case EmployeeType::INVALID: return "Invalid"; + default: return "Unknown"; + } + } + + std::string getLoginStatus(LoginStatus status) { + switch (status) { + case LoginStatus::SUCCESS: return "Login Success"; + case LoginStatus::FIRST_LOGIN: return "First Login"; + case LoginStatus::USER_NOT_FOUND: return "User Not Found"; + case LoginStatus::INVALID_PASSWORD: return "Invalid Password"; + default: return "Unknown"; + } + } +} + +namespace Enums { + + } diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h index 559acda..f7d3fbf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h @@ -1,5 +1,4 @@ #pragma once - #include #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index ecad349..9d902a8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -1,7 +1,8 @@ #include #include "AdminMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void AdminMenu::run() { @@ -44,9 +45,20 @@ bool AdminMenu::handleOperation(int choice) m_zenvyController.deactivateEmployee(); break;*/ case 5: + searchEmployee(); + break; + case 6: return false; default: std::cout << "Enter a valid choice!" << std::endl; } return true; +} + +void AdminMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h index dab23c5..89804bc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MenuHelper.h" #include"ZenvyController.h" class AdminMenu @@ -10,5 +11,6 @@ public: AdminMenu() :m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 99e3bc0..b6ddedd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -51,11 +51,11 @@ bool EmployeeMenu::handleOperation(int choice) break; case 7: m_zenvyController.viewEmployees(); - break; + break;*/ case 8: - m_zenvyController.searchEmployee(); + searchEmployee(); break; - case 9: + /*case 9: m_zenvyController.viewTeamMembers(); break; case 10: @@ -69,11 +69,18 @@ bool EmployeeMenu::handleOperation(int choice) break; case 13: m_zenvyController.viewAnnouncements(); - break;*/ + break; case 14: return false; default: - std::cout << "Enter a valid choice!" << std::endl; + std::cout << "Enter a valid choice!" << std::endl;*/ } return true; -} \ No newline at end of file +} +void EmployeeMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h index f082b66..331dd9d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h @@ -1,5 +1,7 @@ #pragma once #include +#include +#include "MenuHelper.h" #include"ZenvyController.h" class EmployeeMenu @@ -10,5 +12,6 @@ public: EmployeeMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 081d281..90b5a5c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -42,11 +42,11 @@ bool FinanceExecutiveMenu::handleOperation(int choice) break; case 4: m_zenvyController.viewEmployees(); - break; + break;*/ case 5: - m_zenvyController.searchEmployee(); + searchEmployee(); break; - case 6: + /*case 6: m_zenvyController.viewNotifications(); break; case 7: @@ -60,11 +60,19 @@ bool FinanceExecutiveMenu::handleOperation(int choice) break; case 10: m_zenvyController.updatePayroll(); - break;*/ + break; case 11: return false; default: - std::cout << "Enter a valid choice!" << std::endl; + std::cout << "Enter a valid choice!" << std::endl;*/ } return true; } + +void FinanceExecutiveMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 825322f..1da4e2f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MenuHelper.h" #include"ZenvyController.h" class FinanceExecutiveMenu @@ -10,5 +11,6 @@ public: FinanceExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 7bf812c..908b2b0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -31,43 +31,51 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { - //case 1: - // m_zenvyController.applyLeave(); - // break; - //case 2: - // m_zenvyController.viewPayslip(); - // break; - //case 3: - // m_zenvyController.viewPayslipHistory(); - // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; - //case 5: - // m_zenvyController.searchEmployee(); - // break; - //case 6: - // m_zenvyController.viewNotifications(); - // break; - //case 7: - // m_zenvyController.viewAnnouncements(); - // break; - //case 8: - // m_zenvyController.createEmployee(); - // break; - //case 9: - // m_zenvyController.regularizeAttenance(); - // break; - //case 10: - // m_zenvyController.updateLeaveRequest(); - // break; - //case 11: - // m_zenvyController.registercandidateAsEmployee(); - // break; + /*case 1: + m_zenvyController.applyLeave(); + break; + case 2: + m_zenvyController.viewPayslip(); + break; + case 3: + m_zenvyController.viewPayslipHistory(); + break; + case 4: + m_zenvyController.viewEmployees(); + break;*/ + case 5: + searchEmployee(); + break; + /*case 6: + m_zenvyController.viewNotifications(); + break; + case 7: + m_zenvyController.viewAnnouncements(); + break; + case 8: + m_zenvyController.createEmployee(); + break; + case 9: + m_zenvyController.regularizeAttenance(); + break; + case 10: + m_zenvyController.updateLeaveRequest(); + break; + case 11: + m_zenvyController.registercandidateAsEmployee(); + break; case 12: return false; default: - std::cout << "Enter a valid choice!" << std::endl; + std::cout << "Enter a valid choice!" << std::endl;*/ } return true; } + +void HRManagerMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h index 05e1f41..986137b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MenuHelper.h" #include"ZenvyController.h" class HRManagerMenu @@ -10,5 +11,6 @@ public: HRManagerMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index 836ca39..b231f2f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -42,11 +42,11 @@ bool ITExecutiveMenu::handleOperation(int choice) break; case 4: m_zenvyController.viewEmployees(); - break; + break;*/ case 5: - m_zenvyController.searchEmployee(); + searchEmployee(); break; - case 6: + /*case 6: m_zenvyController.viewNotifications(); break; case 7: @@ -54,11 +54,19 @@ bool ITExecutiveMenu::handleOperation(int choice) break; case 8: m_zenvyController.resolveTicket(); - break;*/ + break; case 9: return false; default: - std::cout << "Enter a valid choice!" << std::endl; + std::cout << "Enter a valid choice!" << std::endl;*/ } return true; } + +void ITExecutiveMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h index 1c5f060..fddfb8b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MenuHelper.h" #include"ZenvyController.h" class ITExecutiveMenu @@ -10,5 +11,6 @@ public: ITExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp new file mode 100644 index 0000000..5505d19 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -0,0 +1,3 @@ +#include "MenuHelper.h" + + diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h new file mode 100644 index 0000000..16f6958 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -0,0 +1,69 @@ +#pragma once +#include +#include +#include +#include +#include +#include "Enums.h" +#include"InputHelper.h" +#include"OutputHelper.h" +#include "Employee.h" +#include "ZenvyController.h" +#include "Payroll.h" + +inline void searchTheEmployee(const std::string& name, std::shared_ptr& m_zenvyController) +{ + std::pair>> searchResults = m_zenvyController->searchEmployee(name); + if (!(searchResults.second).empty()) + { + std::cout << std::left + << std::setw(10) << "ID" + << std::setw(20) << "Name" + << std::setw(25) << "Email" + << std::setw(15) << "Phone" + << std::setw(15) << "Type" + << std::setw(10) << "Team ID" + << std::setw(10) << "Team Status" + << std::endl; + std::cout << std::string(95, '-') << std::endl; + for (const auto& employee : searchResults.second) + { + if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + std::cout << std::left + << std::setw(10) << employee->getEmployeeId() + << std::setw(20) << employee->getEmployeeName() + << std::setw(25) << employee->getEmployeeEmail() + << std::setw(15) << employee->getEmployeePhone() + << std::setw(15) << Enums::getEmployeeType(employee->getEmployeeType()) + << std::setw(10) << employee->getEmployeeTeamId() + << std::setw(10) << Enums::getTeamStatus(employee->getEmployeeTeamStatus()); + filterSearchResults(searchResults.first, employee); + } + } + } + else + { + std::cout << "No Employee found with this name" << std::endl; + } +} +static void filterSearchResults(Enums::EmployeeType type, std::shared_ptr employee) +{ + switch (type) + { + case Enums::EmployeeType::FINANCE: + displayPayroll(employee->getPayroll()); + break; + } +} +void displayPayroll(std::shared_ptr payroll) +{ + std::cout << std::left + << std::setw(10) << payroll->getPayrollId() + << std::setw(10) << payroll->getBasicSalary() + << std::setw(10) << payroll->getEmployeePFContribution() + << std::setw(10) << payroll->getEmployerPFContribution() + << std::setw(10) << payroll->getFoodAllowance() + << std::setw(10) << payroll->getHouseRentAllowance() + << std::endl; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 45fbfba..6bfcba0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -31,46 +31,54 @@ bool TalentExecutiveMenu::handleOperation(int choice) { switch (choice) { - //case 1: - // m_zenvyController.applyLeave(); - // break; - //case 2: - // m_zenvyController.viewPayslip(); - // break; - //case 3: - // m_zenvyController.viewPayslipHistory(); - // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; - //case 5: - // m_zenvyController.searchEmployee(); - // 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 1: + m_zenvyController.applyLeave(); + break; + case 2: + m_zenvyController.viewPayslip(); + break; + case 3: + m_zenvyController.viewPayslipHistory(); + break; + case 4: + m_zenvyController.viewEmployees(); + break;*/ + case 5: + searchEmployee(); + 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: return false; default: - std::cout << "Enter a valid choice!" << std::endl; + std::cout << "Enter a valid choice!" << std::endl;*/ } return true; } + +void TalentExecutiveMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h index a258eaf..94dd86e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MenuHelper.h" #include"ZenvyController.h" class TalentExecutiveMenu @@ -10,5 +11,6 @@ public: TalentExecutiveMenu() : m_zenvyController(std::make_shared < ZenvyController>()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 12c300b..6b847a8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -31,49 +31,57 @@ bool TeamExecutiveMenu::handleOperation(int choice) { switch (choice) { - //case 1: - // m_zenvyController.applyLeave(); - // break; - //case 2: - // m_zenvyController.viewPayslip(); - // break; - //case 3: - // m_zenvyController.viewPayslipHistory(); - // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; - //case 5: - // m_zenvyController.searchEmployee(); - // 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 1: + m_zenvyController.applyLeave(); + break; + case 2: + m_zenvyController.viewPayslip(); + break; + case 3: + m_zenvyController.viewPayslipHistory(); + break; + case 4: + m_zenvyController.viewEmployees(); + break;*/ + case 5: + searchEmployee(); + 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: return false; default: - std::cout << "Enter a valid choice!" << std::endl; + std::cout << "Enter a valid choice!" << std::endl;*/ } return true; } + +void TalentExecutiveMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h index 4b5181d..a3d5382 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MenuHelper.h" #include"ZenvyController.h" class TeamExecutiveMenu @@ -10,5 +11,6 @@ public: TeamExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 4204fb7..99fe626 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -51,11 +51,11 @@ bool TeamLeadMenu::handleOperation(int choice) break; case 7: m_zenvyController.viewEmployees(); - break; + break;*/ case 8: - m_zenvyController.searchEmployee(); + searchEmployee(); break; - case 9: + /*case 9: m_zenvyController.viewTeamMembers(); break; case 10: @@ -75,11 +75,19 @@ bool TeamLeadMenu::handleOperation(int choice) break; case 15: m_zenvyController.updateLeaveRequest(); - break;*/ + break; case 16: return false; default: - std::cout << "Enter a valid choice!" << std::endl; + std::cout << "Enter a valid choice!" << std::endl;*/ } return true; } + +void TeamLeadMenu::searchEmployee() +{ + std::string name; + std::cout << "Enter Employee Name: "; + util::read(name); + searchTheEmployee(name, m_zenvyController); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h index e1bd45b..878d961 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MenuHelper.h" #include"ZenvyController.h" class TeamLeadMenu @@ -10,5 +11,6 @@ public: TeamLeadMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + void searchEmployee(); }; From b3b9299c70b4340f4802afbd1b6f1f2b85073594 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 7 Apr 2026 20:00:03 +0530 Subject: [PATCH 06/56] Added Profile Update Feature for all menu EMP004 : Update Personal Details - Added MenuHelper.cpp and MenuHelper.h and integrated them into project - Moved updateProfile() logic from individual menus into MenuHelper - Added inline updateProfile(shared_ptr) to MenuHelper - Updated AdminMenu, EmployeeMenu, HRManagerMenu, FinanceExecutiveMenu, ITExecutiveMenu, TalentExecutiveMenu, TeamExecutiveMenu, and TeamLeadMenu to use centralized updateProfile() - Added getCurrentEmployee() and updateProfile() to ZenvyController - Added corresponding implementations in EmployeeManagementService - Minor layout and option text improvements across all menus Smitha Mohan --- .../Trenser.Zenvy/Trenser.Zenvy.vcxproj | 2 + .../controllers/ZenvyController.cpp | 13 +++++- .../controllers/ZenvyController.h | 2 + .../services/EmployeeManagementService.cpp | 12 ++++++ .../services/EmployeeManagementService.h | 2 + .../Trenser.Zenvy/views/AdminMenu.cpp | 12 ++++-- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 25 +++++++---- .../views/FinanceExecutiveMenu.cpp | 10 +++-- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 10 +++-- .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 10 +++-- .../Trenser.Zenvy/views/MenuHelper.cpp | 1 + .../Trenser.Zenvy/views/MenuHelper.h | 42 +++++++++++++++++++ .../views/TalentExecutiveMenu.cpp | 10 +++-- .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 10 +++-- .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 10 +++-- 15 files changed, 138 insertions(+), 33 deletions(-) create mode 100644 Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp create mode 100644 Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index a5591c2..2792535 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -173,6 +173,7 @@ + @@ -224,6 +225,7 @@ + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 73cbac4..0e9ef77 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -27,10 +27,19 @@ bool ZenvyController::deactivateEmployee(const std::string& id) return m_employeeManagementService->deactivateEmployee(id); } -Employees EmployeeManagementService::getEmployees() +void ZenvyController::updateProfile(const std::string& name,const std::string& phone) { + m_employeeManagementService->updateProfile(name,phone); } -std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) +std::shared_ptr ZenvyController::getCurrentEmployee() +{ + return m_employeeManagementService->getCurrentEmployee(); +} + +std::shared_ptr ZenvyController::getEmployee(const std::string& id) +{ +} +Employees ZenvyController::getEmployees() { } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 390976b..d1404d5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -49,4 +49,6 @@ public: bool deactivateEmployee(const std::string&); Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); + std::shared_ptr getCurrentEmployee(); + void updateProfile(const std::string&,const std::string&); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 6b019ac..49a86cc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -107,3 +107,15 @@ Employees EmployeeManagementService::getEmployees() std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) { } + +std::shared_ptr EmployeeManagementService::getCurrentEmployee() +{ + return m_dataStore.getAuthenticatedEmployee(); +} + +void EmployeeManagementService::updateProfile(const std::string& name,const std::string& phone) +{ + std::shared_ptr employee = m_dataStore.getAuthenticatedEmployee(); + employee->setEmployeeName(name); + employee->setEmployeePhone(phone); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index b7ac0f1..14c8131 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -16,4 +16,6 @@ public: bool deactivateEmployee(const std::string&); Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); + void updateProfile(const std::string&,const std::string&); + std::shared_ptr getCurrentEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 35dd209..bf65e3f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -1,7 +1,8 @@ #include #include "AdminMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" static Enums::EmployeeType getEmployeeType() { @@ -93,7 +94,7 @@ void AdminMenu::run() { int choice; util::clear(); - std::cout << "Admin Menu\n1. Create User\n2. View Employee\n3. Deactivate Employee\n4. Logout\nEnter your Choice: "; + std::cout << "Admin Menu\n1. Create User\n2. View Employee\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -121,7 +122,10 @@ bool AdminMenu::handleOperation(int choice) case 3: m_zenvyController.deactivateEmployee(); break;*/ - case 4: + case 5: + updateProfile(m_zenvyController); + break; + case 6: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 99e3bc0..a4eb3ac 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -1,7 +1,8 @@ #include #include "EmployeeMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void EmployeeMenu::run() { @@ -12,7 +13,7 @@ void EmployeeMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n14. Logout\nEnter your Choice: "; + std::cout << "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. Update Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -48,11 +49,11 @@ bool EmployeeMenu::handleOperation(int choice) break; case 6: m_zenvyController.viewTicketHistory(); - break; - case 7: - m_zenvyController.viewEmployees(); - break; - case 8: + break;*/ + /*case 7: + viewEmployees(); + break;*/ + /*case 8: m_zenvyController.searchEmployee(); break; case 9: @@ -71,9 +72,15 @@ bool EmployeeMenu::handleOperation(int choice) m_zenvyController.viewAnnouncements(); break;*/ case 14: + updateProfile(m_zenvyController); + break; + case 15: return false; default: std::cout << "Enter a valid choice!" << std::endl; } return true; -} \ No newline at end of file +} + + + diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 081d281..7b3f248 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -1,7 +1,8 @@ #include #include "FinanceExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void FinanceExecutiveMenu::run() { @@ -12,7 +13,7 @@ void FinanceExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Generate Payslip\n10. Update Payroll\n11. Logout\nEnter your Choice: "; + std::cout << "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. Update Profile\n12. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -61,6 +62,9 @@ bool FinanceExecutiveMenu::handleOperation(int choice) case 10: m_zenvyController.updatePayroll(); break;*/ + case 10: + updateProfile(m_zenvyController); + break; case 11: return false; default: diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index fa3ffbd..5b635b6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -1,7 +1,8 @@ #include #include "HRManagerMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" static Enums::EmployeeType getEmployeeType() { @@ -90,7 +91,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Logout\nEnter your Choice: "; + std::cout << "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. Update Profile\n13. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -143,6 +144,9 @@ bool HRManagerMenu::handleOperation(int choice) // m_zenvyController.registercandidateAsEmployee(); // break; case 12: + updateProfile(m_zenvyController); + break; + case 13: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index 836ca39..962b372 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -1,7 +1,8 @@ #include #include "ITExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void ITExecutiveMenu::run() { @@ -12,7 +13,7 @@ void ITExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Logout\nEnter your Choice: "; + std::cout << "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. Update Profile\n10. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -56,6 +57,9 @@ bool ITExecutiveMenu::handleOperation(int choice) m_zenvyController.resolveTicket(); break;*/ case 9: + updateProfile(m_zenvyController); + break; + case 10: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp new file mode 100644 index 0000000..36b2e02 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -0,0 +1 @@ +#include "MenuHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h new file mode 100644 index 0000000..2f557d1 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -0,0 +1,42 @@ +#pragma once +#include"ZenvyController.h" +#include"InputHelper.h" +#include"OutputHelper.h" + +inline void updateProfile(std::shared_ptr m_zenvyController) +{ + int choice; + std::string name, phone; + name = m_zenvyController->getCurrentEmployee()->getEmployeeName(); + phone = m_zenvyController->getCurrentEmployee()->getEmployeePhone(); + while (true) + { + util::clear(); + std::cout << "Please choose the information you want to update:\n" + "1. Name\n" + "2. Phone Number\n" + "3. Exit\n" + "Enter your choice: "; + util::read(choice); + switch (choice) + { + case 1: + std::cout << "Enter your updated Name :"; + util::read(name); + m_zenvyController->updateProfile(name, phone); + std::cout << "Profile Updated Successfully\n"; + break; + case 2: + std::cout << "Enter your updated phone Number :"; + util::read(phone); + m_zenvyController->updateProfile(name, phone); + std::cout << "Profile Updated Successfully\n"; + break; + case 3: + return; + default: + std::cout << "Enter a valid choice!" << std::endl; + break; + } + } +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 45fbfba..70ca2d2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -1,7 +1,8 @@ #include #include "TalentExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void TalentExecutiveMenu::run() { @@ -12,7 +13,7 @@ void TalentExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create New Job\n9. View Job Opening\n10. Add Candidate\n11. UpdateCandidate Status\n12. View Shortlisted Candidate\n13. Logout\nEnter your Choice: "; + std::cout << "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. Update Profile\n14. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -68,6 +69,9 @@ bool TalentExecutiveMenu::handleOperation(int choice) // m_zenvyController.viewShortlistedCandidates(); // break; case 13: + updateProfile(m_zenvyController); + break; + case 14: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 12c300b..b085c52 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -1,7 +1,8 @@ #include #include "TeamExecutiveMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void TeamExecutiveMenu::run() { @@ -12,7 +13,7 @@ void TeamExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Team\n9. Update Team\n10. Remove Team\n11. Assign Employee\n12. Unassign Employee\n13. View Teams\n14. Logout\nEnter your Choice: "; + std::cout << "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. Update Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -71,6 +72,9 @@ bool TeamExecutiveMenu::handleOperation(int choice) // m_zenvyController.viewTeams(); // break; case 14: + updateProfile(m_zenvyController); + break; + case 15: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 4204fb7..d03c7f4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -1,7 +1,8 @@ #include #include "TeamLeadMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void TeamLeadMenu::run() { @@ -12,7 +13,7 @@ void TeamLeadMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n4. Regularize Attendance\n15. Update Leave Request\n16. Logout\nEnter your Choice: "; + std::cout << "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. Update Profile\n17. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -77,6 +78,9 @@ bool TeamLeadMenu::handleOperation(int choice) m_zenvyController.updateLeaveRequest(); break;*/ case 16: + updateProfile(m_zenvyController); + break; + case 17: return false; default: std::cout << "Enter a valid choice!" << std::endl; From c27ca5240a76428e1181265b1af6d364a4ad524a Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 7 Apr 2026 20:32:30 +0530 Subject: [PATCH 07/56] Added MenuHelper feature for ViewEmployee MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EMP007 : View Employees - Added MenuHelper.cpp and MenuHelper.h to project configuration - Moved viewEmployees() implementation from individual menu classes into MenuHelper - Added inline viewEmployees(shared_ptr) helper with formatted output - Added enumToString() to MenuHelper for employee role display - Updated AdminMenu, EmployeeMenu, FinanceExecutiveMenu, HRManagerMenu, ITExecutiveMenu, TalentExecutiveMenu, TeamExecutiveMenu, and TeamLeadMenu to use viewEmployees(m_zenvyController) instead of per‑menu implementations - Removed old viewEmployees() method from EmployeeMenu - Updated menu options to reflect new centralized viewEmployees() function Smitha Mohan --- .../Trenser.Zenvy/Trenser.Zenvy.vcxproj | 2 + .../Trenser.Zenvy/views/AdminMenu.cpp | 7 ++- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 56 ++----------------- .../Trenser.Zenvy/views/EmployeeMenu.h | 1 - .../views/FinanceExecutiveMenu.cpp | 7 ++- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 7 ++- .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 7 ++- .../Trenser.Zenvy/views/MenuHelper.cpp | 1 + .../Trenser.Zenvy/views/MenuHelper.h | 54 ++++++++++++++++++ .../views/TalentExecutiveMenu.cpp | 7 ++- .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 7 ++- .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 7 ++- 12 files changed, 89 insertions(+), 74 deletions(-) create mode 100644 Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp create mode 100644 Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index 7b35079..3116d41 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -172,6 +172,7 @@ + @@ -222,6 +223,7 @@ + diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index ecad349..d0c9d1f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -2,6 +2,7 @@ #include "AdminMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void AdminMenu::run() { @@ -36,11 +37,11 @@ bool AdminMenu::handleOperation(int choice) break; case 2: m_zenvyController.createEmployee(); - break; + break;*/ case 3: - m_zenvyController.viewEmployee(); + viewEmployees(m_zenvyController); break; - case 4: + /*case 4: m_zenvyController.deactivateEmployee(); break;*/ case 5: diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 02c903f..c80732b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -1,8 +1,9 @@ #include #include #include "EmployeeMenu.h" -#include"InputHelper.h" -#include"OutputHelper.h" +#include "InputHelper.h" +#include "OutputHelper.h" +#include "MenuHelper.h" void EmployeeMenu::run() { @@ -51,7 +52,7 @@ bool EmployeeMenu::handleOperation(int choice) m_zenvyController.viewTicketHistory(); break;*/ case 7: - viewEmployees(); + viewEmployees(m_zenvyController); break; /*case 8: m_zenvyController.searchEmployee(); @@ -79,52 +80,3 @@ bool EmployeeMenu::handleOperation(int choice) return true; } -void EmployeeMenu::viewEmployees() -{ - std::cout << std::left - << std::setw(10) << "EMPID" - << std::setw(20) << "Name" - << std::setw(15) << "Role" - << std::setw(10) << "TeamId" - << std::setw(25) << "Email" - << std::setw(15) << "Phone" - << std::endl; - auto employees = m_zenvyController->getEmployee(); - if (employees.empty()) - { - std::cout << "No employees found\n"; - return; - } - for (const auto& iterator : employees) - { - std::cout << std::left - << std::setw(10) << iterator->getEmployeeId() - << std::setw(20) << iterator->getEmployeeName() - << std::setw(15) << enumToString(iterator->getEmployeeType()) - << std::setw(10) << iterator->getEmployeeTeamId() - << std::setw(25) << iterator->getEmployeeEmail() - << std::setw(15) << iterator->getEmployeePhone() - << std::endl; - } -} - -std::string enumToString(Enums::EmployeeType type) -{ - switch (type) - { - case Enums::EmployeeType::IT: - return "IT Executive"; - case Enums::EmployeeType::FINANCE: - return "Finance Executive"; - case Enums::EmployeeType::GENERAL: - return "General Employee"; - case Enums::EmployeeType::HR: - return "HR"; - case Enums::EmployeeType::TAG: - return "Talent Acquacition Executive"; - case Enums::EmployeeType::TEAM: - return "Team Executive"; - case Enums::EmployeeType::INVALID: - return "Invalid"; - } -} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h index 3ed9b3a..f082b66 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h @@ -10,6 +10,5 @@ public: EmployeeMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void viewEmployees(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 081d281..edb0b4d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "FinanceExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include"MenuHelper.h" void FinanceExecutiveMenu::run() { @@ -39,11 +40,11 @@ bool FinanceExecutiveMenu::handleOperation(int choice) break; case 3: m_zenvyController.viewPayslipHistory(); - break; + break;*/ case 4: - m_zenvyController.viewEmployees(); + viewEmployees(m_zenvyController); break; - case 5: + /*case 5: m_zenvyController.searchEmployee(); break; case 6: diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 7bf812c..d1fe2b3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -2,6 +2,7 @@ #include "HRManagerMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include"MenuHelper.h" void HRManagerMenu::run() { @@ -40,9 +41,9 @@ bool HRManagerMenu::handleOperation(int choice) //case 3: // m_zenvyController.viewPayslipHistory(); // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; + case 4: + viewEmployees(m_zenvyController); + break; //case 5: // m_zenvyController.searchEmployee(); // break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index 836ca39..3823d53 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "ITExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include"MenuHelper.h" void ITExecutiveMenu::run() { @@ -39,11 +40,11 @@ bool ITExecutiveMenu::handleOperation(int choice) break; case 3: m_zenvyController.viewPayslipHistory(); - break; + break;*/ case 4: - m_zenvyController.viewEmployees(); + viewEmployees(m_zenvyController); break; - case 5: + /*case 5: m_zenvyController.searchEmployee(); break; case 6: diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp new file mode 100644 index 0000000..36b2e02 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -0,0 +1 @@ +#include "MenuHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h new file mode 100644 index 0000000..83c6d69 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -0,0 +1,54 @@ +#pragma once +#include +#include "InputHelper.h" +#include "OutputHelper.h" + +inline void viewEmployees(std::shared_ptr m_zenvyController) +{ + std::cout << std::left + << std::setw(10) << "EMPID" + << std::setw(20) << "Name" + << std::setw(15) << "Role" + << std::setw(10) << "TeamId" + << std::setw(25) << "Email" + << std::setw(15) << "Phone" + << std::endl; + auto employees = m_zenvyController->getEmployee(); + if (employees.empty()) + { + std::cout << "No employees found\n"; + return; + } + for (const auto& iterator : employees) + { + std::cout << std::left + << std::setw(10) << iterator->getEmployeeId() + << std::setw(20) << iterator->getEmployeeName() + << std::setw(15) << enumToString(iterator->getEmployeeType()) + << std::setw(10) << iterator->getEmployeeTeamId() + << std::setw(25) << iterator->getEmployeeEmail() + << std::setw(15) << iterator->getEmployeePhone() + << std::endl; + } +} + +std::string enumToString(Enums::EmployeeType type) +{ + switch (type) + { + case Enums::EmployeeType::IT: + return "IT Executive"; + case Enums::EmployeeType::FINANCE: + return "Finance Executive"; + case Enums::EmployeeType::GENERAL: + return "General Employee"; + case Enums::EmployeeType::HR: + return "HR"; + case Enums::EmployeeType::TAG: + return "Talent Acquacition Executive"; + case Enums::EmployeeType::TEAM: + return "Team Executive"; + case Enums::EmployeeType::INVALID: + return "Invalid"; + } +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 45fbfba..686c74c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "TalentExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include"MenuHelper.h" void TalentExecutiveMenu::run() { @@ -40,9 +41,9 @@ bool TalentExecutiveMenu::handleOperation(int choice) //case 3: // m_zenvyController.viewPayslipHistory(); // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; + case 4: + viewEmployees(m_zenvyController); + break; //case 5: // m_zenvyController.searchEmployee(); // break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 12c300b..a2c3232 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "TeamExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include"MenuHelper.h" void TeamExecutiveMenu::run() { @@ -40,9 +41,9 @@ bool TeamExecutiveMenu::handleOperation(int choice) //case 3: // m_zenvyController.viewPayslipHistory(); // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; + case 4: + viewEmployees(m_zenvyController); + break; //case 5: // m_zenvyController.searchEmployee(); // break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 4204fb7..3a581e6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -2,6 +2,7 @@ #include "TeamLeadMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include"MenuHelper.h" void TeamLeadMenu::run() { @@ -48,11 +49,11 @@ bool TeamLeadMenu::handleOperation(int choice) break; case 6: m_zenvyController.viewTicketHistory(); - break; + break;*/ case 7: - m_zenvyController.viewEmployees(); + viewEmployees(m_zenvyController); break; - case 8: + /*case 8: m_zenvyController.searchEmployee(); break; case 9: From 63627075efed2afff965a8be8df642072aa7b247 Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Tue, 7 Apr 2026 15:34:08 +0530 Subject: [PATCH 08/56] Implement Update Salary EMP08: Update Salary Details - Added `updateSalary` method in ZenvyController to connect payroll updates with PayslipManagementService - Implemented `PayslipManagementService::updateSalary` with employee existence and Finance-role authorization checks - Extended Payroll model with setter methods for salary components - Improved error handling with clear runtime exceptions for invalid index selection, unauthorized access, and missing employees Smitha Mohan --- .../controllers/ZenvyController.cpp | 9 +- .../controllers/ZenvyController.h | 3 + .../Trenser.Zenvy/datastores/DataStore.cpp | 4 - .../Trenser.Zenvy/datastores/DataStore.h | 1 - .../Trenser.Zenvy/models/Payroll.cpp | 4 +- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 10 +- .../AuthenticationManagementService.cpp | 4 +- .../services/EmployeeManagementService.cpp | 1 + .../services/EmployeeManagementService.h | 1 + .../services/PayslipManagementService.cpp | 23 ++++ .../services/PayslipManagementService.h | 5 +- .../views/FinanceExecutiveMenu.cpp | 115 +++++++++++++----- .../views/FinanceExecutiveMenu.h | 3 + 13 files changed, 136 insertions(+), 47 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 0e9ef77..9394a85 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -27,11 +27,16 @@ bool ZenvyController::deactivateEmployee(const std::string& id) return m_employeeManagementService->deactivateEmployee(id); } -void ZenvyController::updateProfile(const std::string& name,const std::string& phone) +void ZenvyController::updateProfile(const std::string& name, const std::string& phone) { m_employeeManagementService->updateProfile(name,phone); } +void ZenvyController::updateSalary(const std::string& employeeId, const double basicSalary, const double houseRentAllowance, const double foodAllowance, const double employeePFContribution, const double employerPFContribution) +{ + m_payslipManagementService->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); +} + std::shared_ptr ZenvyController::getCurrentEmployee() { return m_employeeManagementService->getCurrentEmployee(); @@ -40,6 +45,8 @@ std::shared_ptr ZenvyController::getCurrentEmployee() std::shared_ptr ZenvyController::getEmployee(const std::string& id) { } + Employees ZenvyController::getEmployees() { + return m_employeeManagementService->getEmployees(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index d1404d5..8a7fd35 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -51,4 +51,7 @@ public: std::shared_ptr getEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); void updateProfile(const std::string&,const std::string&); + + //payslip management + void updateSalary(const std::string&, const double, const double, const double, const double, const double); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index e4f3c0c..40b473f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -27,8 +27,4 @@ employeeMap& DataStore::getEmployees() return m_employees; } -std::shared_ptr& DataStore::getAuthenticatedUser() -{ - return m_authenticatedEmployee; -} diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index 5ecfb70..750d741 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -36,7 +36,6 @@ public: DataStore(DataStore&&) = delete; DataStore& operator=(DataStore&&) = delete; employeeMap& getEmployees(); - std::shared_ptr& getAuthenticatedUser(); logMap& getLogs(); std::shared_ptr& getAuthenticatedEmployee(); void setAuthenticatedEmployee(std::shared_ptr < Employee>); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index 71a3d5a..fe439d6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -32,9 +32,9 @@ double Payroll::getEmployerPFContribution() const return m_employerPFContribution; } -void Payroll::setPayrollID(const std::string& id) +void Payroll::setBasicSalary(double basicSalary) { - m_id = id; + m_basicSalary = basicSalary; } void Payroll::setHouseRentAllowance(double value) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index 48215f5..8aaae92 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -25,9 +25,9 @@ public: double getFoodAllowance() const; double getEmployeePFContribution() const; double getEmployerPFContribution() const; - void setPayrollID(const std::string& id); - void setHouseRentAllowance(double value); - void setFoodAllowance(double value); - void setEmployeePFContribution(double value); - void setEmployerPFContribution(double value); + void setBasicSalary(double); + void setHouseRentAllowance(double); + void setFoodAllowance(double); + void setEmployeePFContribution(double); + void setEmployerPFContribution(double); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp index 9d7fc4f..952b832 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp @@ -61,8 +61,8 @@ void AuthenticationManagementService::changePassword(const std::string& password } void AuthenticationManagementService::logout() { - if (m_dataStore.getAuthenticatedUser()) { - m_dataStore.getAuthenticatedUser() = nullptr; + if (m_dataStore.getAuthenticatedEmployee()) { + m_dataStore.getAuthenticatedEmployee() = nullptr; } else { throw std::runtime_error("No user currently logged In..."); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 49a86cc..21fd3df 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -102,6 +102,7 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) Employees EmployeeManagementService::getEmployees() { + } std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 14c8131..c7ab33f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -14,6 +14,7 @@ public: EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); + Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); void updateProfile(const std::string&,const std::string&); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 154cf1f..2402cb8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -1 +1,24 @@ #include "PayslipManagementService.h" + +void PayslipManagementService::updateSalary(const std::string& employeeId, const double basicSalary, const double houseRentAllowance, const double foodAllowance, const double employeePFContribution, const double employerPFContribution) +{ + if (m_dataStore.getAuthenticatedEmployee()->getEmployeeType() == Enums::EmployeeType::FINANCE) { + auto findedEmployee = m_dataStore.getEmployees().find(employeeId); + if (findedEmployee != m_dataStore.getEmployees().end()) + { + (findedEmployee->second)->getPayroll()->setBasicSalary(basicSalary); + (findedEmployee->second)->getPayroll()->setHouseRentAllowance(houseRentAllowance); + (findedEmployee->second)->getPayroll()->setFoodAllowance(foodAllowance); + (findedEmployee->second)->getPayroll()->setEmployeePFContribution(employeePFContribution); + (findedEmployee->second)->getPayroll()->setEmployerPFContribution(employerPFContribution); + } + else + { + throw std::runtime_error("Employee not found, unable to update the salary"); + } + } + else + { + throw std::runtime_error("Unauthorized access"); + } +} \ 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 fb51a34..57e31e5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -1,5 +1,7 @@ #pragma once -#include "DataStore.h" +#include +#include +#include"DataStore.h" class PayslipManagementService { @@ -7,4 +9,5 @@ private: DataStore& m_dataStore; public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; + void updateSalary(const std::string&, const double, const double, const double, const double, const double); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 7b3f248..5471a42 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -28,47 +28,100 @@ void FinanceExecutiveMenu::run() } } +std::string FinanceExecutiveMenu::getSelectedUserId() +{ + int choice; + std::map> currentEmployeeList; + int index = 0; + for (auto& currentEmployee : m_zenvyController->getEmployees()) + { + currentEmployeeList[++index] = currentEmployee; + } + for (auto& currentEmployee: currentEmployeeList) + { + std::cout << currentEmployee.first << ". Employee Id: " << currentEmployee.second->getEmployeeId() << "Name: " << currentEmployee.second->getEmployeeName() << std::endl; + } + std::cout << "Enter the Index: "; + util::read(choice); + if (currentEmployeeList.count(choice) == 0) + { + throw std::runtime_error("Enter a valid index"); + } + else + { + auto selectedEmployee = currentEmployeeList.find(choice); + return (selectedEmployee->second->getEmployeeId()); + } + +} + +void FinanceExecutiveMenu::updatePayroll() +{ + std::string employeeId; + double basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution; + employeeId = getSelectedUserId(); + 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 EmplyerPFContribution: "; + util::read(employerPFContribution); + m_zenvyController->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); + } + else { + throw std::runtime_error("Unexpected error occured"); + } +} + + bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) { - /*case 1: - m_zenvyController.applyLeave(); - break; - case 2: - m_zenvyController.viewPayslip(); - break; - case 3: - m_zenvyController.viewPayslipHistory(); - break; - case 4: - m_zenvyController.viewEmployees(); - break; - case 5: - m_zenvyController.searchEmployee(); - 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 1: + // m_zenvyController.applyLeave(); + // break; + //case 2: + // m_zenvyController.viewPayslip(); + // break; + //case 3: + // m_zenvyController.viewPayslipHistory(); + // break; + //case 4: + // m_zenvyController.viewEmployees(); + // break; + //case 5: + // m_zenvyController.searchEmployee(); + // break; + //case 6: + // m_zenvyController.viewNotifications(); + // break; + //case 7: + // m_zenvyController.viewAnnouncements(); + // break; + //case 8: + // m_zenvyController.resolveTicket(); + // break; + //case 9: + // m_zenvyController.generatePayslip(); + // break; case 10: - m_zenvyController.updatePayroll(); - break;*/ - case 10: - updateProfile(m_zenvyController); + updatePayroll(); break; case 11: + updateProfile(m_zenvyController); + break; + case 12: return false; default: std::cout << "Enter a valid choice!" << std::endl; } return true; } + + diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 825322f..26a0936 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include"ZenvyController.h" class FinanceExecutiveMenu @@ -10,5 +11,7 @@ public: FinanceExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); + std::string getSelectedUserId(); + void updatePayroll(); }; From 0290467528eb4e72db699e5c2908d59392f5849d Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Tue, 7 Apr 2026 20:19:27 +0530 Subject: [PATCH 09/56] Implement Review Suggestion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EMP008: Update Salary Details - Refactored salary update and employee selection: • Removed unnecessary const qualifiers from double parameters • Renamed variables • Replaced count() with find() for map lookups • Excluded ADMIN employees from salary updates and selection lists • Applied util::enforceAuthorization for access control - Improved readability and consistency: • Enhanced tabular output using setw() with left alignment Implement Update Salary Smitha Mohan --- .../controllers/ZenvyController.cpp | 6 +++- .../controllers/ZenvyController.h | 4 +-- .../services/EmployeeManagementService.h | 1 - .../services/PayslipManagementService.cpp | 33 ++++++++---------- .../services/PayslipManagementService.h | 2 +- .../views/FinanceExecutiveMenu.cpp | 34 ++++++++++++------- .../views/FinanceExecutiveMenu.h | 2 ++ 7 files changed, 47 insertions(+), 35 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 9394a85..144f6d4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -32,7 +32,7 @@ void ZenvyController::updateProfile(const std::string& name, const std::string& m_employeeManagementService->updateProfile(name,phone); } -void ZenvyController::updateSalary(const std::string& employeeId, const double basicSalary, const double houseRentAllowance, const double foodAllowance, const double employeePFContribution, const double employerPFContribution) +void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { m_payslipManagementService->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); } @@ -50,3 +50,7 @@ Employees ZenvyController::getEmployees() { return m_employeeManagementService->getEmployees(); } + +std::shared_ptr ZenvyController::getEmployee(const std::string&) { + +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 8a7fd35..cb355c6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -52,6 +52,6 @@ public: std::shared_ptr getCurrentEmployee(); void updateProfile(const std::string&,const std::string&); - //payslip management - void updateSalary(const std::string&, const double, const double, const double, const double, const double); + //Payslip management + void updateSalary(const std::string&, double, double, double, double, double); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index c7ab33f..14c8131 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -14,7 +14,6 @@ public: EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); - Employees getEmployees(); std::shared_ptr getEmployee(const std::string&); void updateProfile(const std::string&,const std::string&); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 2402cb8..6e4bc99 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -1,24 +1,21 @@ #include "PayslipManagementService.h" +#include "AuthorizationHelper.h" +#include "Enums.h" -void PayslipManagementService::updateSalary(const std::string& employeeId, const double basicSalary, const double houseRentAllowance, const double foodAllowance, const double employeePFContribution, const double employerPFContribution) +void PayslipManagementService::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { - if (m_dataStore.getAuthenticatedEmployee()->getEmployeeType() == Enums::EmployeeType::FINANCE) { - auto findedEmployee = m_dataStore.getEmployees().find(employeeId); - if (findedEmployee != m_dataStore.getEmployees().end()) - { - (findedEmployee->second)->getPayroll()->setBasicSalary(basicSalary); - (findedEmployee->second)->getPayroll()->setHouseRentAllowance(houseRentAllowance); - (findedEmployee->second)->getPayroll()->setFoodAllowance(foodAllowance); - (findedEmployee->second)->getPayroll()->setEmployeePFContribution(employeePFContribution); - (findedEmployee->second)->getPayroll()->setEmployerPFContribution(employerPFContribution); - } - else - { - throw std::runtime_error("Employee not found, unable to update the salary"); - } - } - else + 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) { - throw std::runtime_error("Unauthorized access"); + (employee->second)->getPayroll()->setBasicSalary(basicSalary); + (employee->second)->getPayroll()->setHouseRentAllowance(houseRentAllowance); + (employee->second)->getPayroll()->setFoodAllowance(foodAllowance); + (employee->second)->getPayroll()->setEmployeePFContribution(employeePFContribution); + (employee->second)->getPayroll()->setEmployerPFContribution(employerPFContribution); + } + else + { + throw std::runtime_error("Employee not found, unable to update the salary"); } } \ 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 57e31e5..768c2a3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -9,5 +9,5 @@ private: DataStore& m_dataStore; public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; - void updateSalary(const std::string&, const double, const double, const double, const double, const double); + void updateSalary(const std::string&, double, double, double, double, double); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 5471a42..285c3c3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -31,28 +31,39 @@ void FinanceExecutiveMenu::run() std::string FinanceExecutiveMenu::getSelectedUserId() { int choice; - std::map> currentEmployeeList; + std::map> employeeList; int index = 0; - for (auto& currentEmployee : m_zenvyController->getEmployees()) + auto allEmployees = m_zenvyController->getEmployees(); + for (auto& currentEmployee : allEmployees) { - currentEmployeeList[++index] = currentEmployee; + if (currentEmployee->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + continue; + } + employeeList[++index] = currentEmployee; } - for (auto& currentEmployee: currentEmployeeList) + std::cout << std::left + << std::setw(6) << "Index" + << std::setw(15) << "Employee Id" + << std::setw(25) << "Name" << std::endl; + for (const auto& employee : employeeList) { - std::cout << currentEmployee.first << ". Employee Id: " << currentEmployee.second->getEmployeeId() << "Name: " << currentEmployee.second->getEmployeeName() << std::endl; + std::cout << std::left << std::setw(6) << employee.first + << std::setw(15) << employee.second->getEmployeeId() + << std::setw(25) << employee.second->getEmployeeName() + << std::endl; } std::cout << "Enter the Index: "; util::read(choice); - if (currentEmployeeList.count(choice) == 0) + auto employeeIterator = employeeList.find(choice); + if (employeeIterator != employeeList.end()) { - throw std::runtime_error("Enter a valid index"); + return (employeeIterator->second->getEmployeeId()); } - else + else { - auto selectedEmployee = currentEmployeeList.find(choice); - return (selectedEmployee->second->getEmployeeId()); + throw std::runtime_error("Invalid Index"); } - } void FinanceExecutiveMenu::updatePayroll() @@ -78,7 +89,6 @@ void FinanceExecutiveMenu::updatePayroll() } } - bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 26a0936..1b3ad71 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -1,6 +1,8 @@ #pragma once #include +#include #include +#include #include"ZenvyController.h" class FinanceExecutiveMenu From a3e622ff8ef16659bdaa892d113cc73c63c08f35 Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Wed, 8 Apr 2026 10:19:21 +0530 Subject: [PATCH 10/56] Updated Menu Helper and all User Menu EMP006 : Search Employee - Updated MenuHelper.h helper file for input validation - Updated search employee logic in employee management service - Removed comments in Enums.h and EmployeeManagementService.h - Included MenuHelper.h in all User Menu files Smitha Mohan --- .../services/EmployeeManagementService.cpp | 4 +- Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 240 ++++++++++-------- .../Trenser.Zenvy/views/AdminMenu.cpp | 9 +- Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h | 2 - .../Trenser.Zenvy/views/EmployeeMenu.cpp | 11 +- .../Trenser.Zenvy/views/EmployeeMenu.h | 3 - .../views/FinanceExecutiveMenu.cpp | 11 +- .../views/FinanceExecutiveMenu.h | 2 - .../Trenser.Zenvy/views/HRManagerMenu.cpp | 11 +- .../Trenser.Zenvy/views/HRManagerMenu.h | 2 - .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 11 +- .../Trenser.Zenvy/views/ITExecutiveMenu.h | 2 - .../Trenser.Zenvy/views/MenuHelper.h | 6 +- .../views/TalentExecutiveMenu.cpp | 11 +- .../Trenser.Zenvy/views/TalentExecutiveMenu.h | 2 - .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 11 +- .../Trenser.Zenvy/views/TeamExecutiveMenu.h | 2 - .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 11 +- .../Trenser.Zenvy/views/TeamLeadMenu.h | 2 - 19 files changed, 162 insertions(+), 191 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index a825956..0a151c8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -26,13 +26,13 @@ std::pair>> Emp const auto& employee = entry.second; if (!employee) { - continue; // skip if pointer is null + continue; } std::string employeeName = employee->getEmployeeName(); std::transform(employeeName.begin(), employeeName.end(), employeeName.begin(), ::tolower); std::string searchName = name; std::transform(searchName.begin(), searchName.end(), searchName.begin(), ::tolower); - if (employeeName == searchName) + if (employeeName.find(searchName) != std::string::npos) { employeeList.push_back(employee); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index bf70b93..2f3fc5e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -91,52 +91,36 @@ namespace Enums { INVALID_PASSWORD }; - /*std::string getEmployeeType(EmployeeType type) + std::string getAccountStatus(AccountStatus status) { - switch (type) + switch (status) { - 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"; - default: - return "Invalid"; + case AccountStatus::ACTIVE: + return "Active"; + case AccountStatus::INACTIVE: + return "Inactive"; + default: + return "Unknown"; } } - std::string getTeamStatus(TeamStatus status) + std::string getTeamStatus(TeamStatus status) { - - }*/ - - std::string getAccountStatus(AccountStatus status) { - switch (status) { - case AccountStatus::ACTIVE: return "Active"; - case AccountStatus::INACTIVE: return "Inactive"; - default: return "Unknown"; + switch (status) + { + case TeamStatus::IN_TEAM: + return "In Team"; + case TeamStatus::NOT_IN_TEAM: + return "Not in Team"; + default: + return "Unknown"; } } - std::string getTeamStatus(TeamStatus status) { - switch (status) { - case TeamStatus::IN_TEAM: return "In Team"; - case TeamStatus::NOT_IN_TEAM: return "Not in Team"; - default: return "Unknown"; - } - } - - std::string getCandidateStatus(CandidateStatus status) { - switch (status) { + std::string getCandidateStatus(CandidateStatus status) + { + switch (status) + { case CandidateStatus::PENDING: return "Pending"; case CandidateStatus::SHORTLISTED: return "Shortlisted"; case CandidateStatus::REJECTED: return "Rejected"; @@ -145,94 +129,148 @@ namespace Enums { } std::string getNotificationStatus(NotificationStatus status) { - switch (status) { - case NotificationStatus::READ: return "Read"; - case NotificationStatus::UNREAD: return "Unread"; - default: return "Unknown"; + switch (status) + { + case NotificationStatus::READ: + return "Read"; + case NotificationStatus::UNREAD: + return "Unread"; + default: + return "Unknown"; } } - std::string getLeaveStatus(LeaveStatus status) { - switch (status) { - case LeaveStatus::PENDING: return "Pending"; - case LeaveStatus::APPROVED: return "Approved"; - case LeaveStatus::REJECTED: return "Rejected"; - default: return "Unknown"; + std::string getLeaveStatus(LeaveStatus status) + { + switch (status) + { + case LeaveStatus::PENDING: + return "Pending"; + case LeaveStatus::APPROVED: + return "Approved"; + case LeaveStatus::REJECTED: + return "Rejected"; + default: + return "Unknown"; } } - std::string getLeaveType(LeaveType type) { - switch (type) { - case LeaveType::GENERAL: return "General Leave"; - case LeaveType::MEDICAL: return "Medical Leave"; - case LeaveType::RESTRICTED: return "Restricted Leave"; - default: return "Unknown"; + std::string getLeaveType(LeaveType type) + { + switch (type) + { + case LeaveType::GENERAL: + return "General Leave"; + case LeaveType::MEDICAL: + return "Medical Leave"; + case LeaveType::RESTRICTED: + return "Restricted Leave"; + default: + return "Unknown"; } } - std::string getJobListingStatus(JobListingStatus status) { - switch (status) { - case JobListingStatus::OPEN: return "Open"; - case JobListingStatus::CLOSED: return "Closed"; - default: return "Unknown"; + std::string getJobListingStatus(JobListingStatus status) + { + switch (status) + { + case JobListingStatus::OPEN: + return "Open"; + case JobListingStatus::CLOSED: + return "Closed"; + default: + return "Unknown"; } } - std::string getTicketStatus(TicketStatus status) { - switch (status) { - case TicketStatus::OPEN: return "Open"; - case TicketStatus::RESOLVED: return "Resolved"; - case TicketStatus::CLOSED: return "Closed"; - default: return "Unknown"; + std::string getTicketStatus(TicketStatus status) + { + switch (status) + { + case TicketStatus::OPEN: + return "Open"; + case TicketStatus::RESOLVED: + return "Resolved"; + case TicketStatus::CLOSED: + return "Closed"; + default: + return "Unknown"; } } - std::string getTicketType(TicketType type) { - switch (type) { - case TicketType::IT: return "IT"; - case TicketType::FINANCE: return "Finance"; - case TicketType::ATTENDANCE: return "Attendance"; - case TicketType::UNKNOWN: return "Unknown"; - default: return "Unknown"; + std::string getTicketType(TicketType type) + { + switch (type) + { + case TicketType::IT: + return "IT"; + case TicketType::FINANCE: + return "Finance"; + case TicketType::ATTENDANCE: + return "Attendance"; + case TicketType::UNKNOWN: + return "Unknown"; + default: + return "Unknown"; } } - std::string getEmployeeDesignation(EmployeeDesignation designation) { - switch (designation) { - case EmployeeDesignation::JUNIOR: return "Junior"; - case EmployeeDesignation::SENIOR: return "Senior"; - case EmployeeDesignation::TEAM_LEAD: return "Team Lead"; - case EmployeeDesignation::INVALID: return "Invalid"; - default: return "Unknown"; + std::string 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 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"; + 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"; } } } - -namespace Enums { - - -} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 9d902a8..2dd9eec 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -45,7 +45,7 @@ bool AdminMenu::handleOperation(int choice) m_zenvyController.deactivateEmployee(); break;*/ case 5: - searchEmployee(); + searchEmployee(m_zenvyController); break; case 6: return false; @@ -55,10 +55,3 @@ bool AdminMenu::handleOperation(int choice) return true; } -void AdminMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); -} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h index 89804bc..dab23c5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h @@ -1,6 +1,5 @@ #pragma once #include -#include "MenuHelper.h" #include"ZenvyController.h" class AdminMenu @@ -11,6 +10,5 @@ public: AdminMenu() :m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index b6ddedd..da93020 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -2,6 +2,7 @@ #include "EmployeeMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void EmployeeMenu::run() { @@ -53,7 +54,7 @@ bool EmployeeMenu::handleOperation(int choice) m_zenvyController.viewEmployees(); break;*/ case 8: - searchEmployee(); + searchEmployee(m_zenvyController); break; /*case 9: m_zenvyController.viewTeamMembers(); @@ -77,10 +78,4 @@ bool EmployeeMenu::handleOperation(int choice) } return true; } -void EmployeeMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); -} + diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h index 331dd9d..f082b66 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h @@ -1,7 +1,5 @@ #pragma once #include -#include -#include "MenuHelper.h" #include"ZenvyController.h" class EmployeeMenu @@ -12,6 +10,5 @@ public: EmployeeMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 90b5a5c..058b339 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "FinanceExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void FinanceExecutiveMenu::run() { @@ -44,7 +45,7 @@ bool FinanceExecutiveMenu::handleOperation(int choice) m_zenvyController.viewEmployees(); break;*/ case 5: - searchEmployee(); + searchEmployee(m_zenvyController); break; /*case 6: m_zenvyController.viewNotifications(); @@ -68,11 +69,3 @@ bool FinanceExecutiveMenu::handleOperation(int choice) } return true; } - -void FinanceExecutiveMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); -} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 1da4e2f..825322f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -1,6 +1,5 @@ #pragma once #include -#include "MenuHelper.h" #include"ZenvyController.h" class FinanceExecutiveMenu @@ -11,6 +10,5 @@ public: FinanceExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 908b2b0..35d99a3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -2,6 +2,7 @@ #include "HRManagerMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void HRManagerMenu::run() { @@ -44,7 +45,7 @@ bool HRManagerMenu::handleOperation(int choice) m_zenvyController.viewEmployees(); break;*/ case 5: - searchEmployee(); + searchEmployee(m_zenvyController); break; /*case 6: m_zenvyController.viewNotifications(); @@ -71,11 +72,3 @@ bool HRManagerMenu::handleOperation(int choice) } return true; } - -void HRManagerMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); -} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h index 986137b..05e1f41 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h @@ -1,6 +1,5 @@ #pragma once #include -#include "MenuHelper.h" #include"ZenvyController.h" class HRManagerMenu @@ -11,6 +10,5 @@ public: HRManagerMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index b231f2f..827ef33 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "ITExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void ITExecutiveMenu::run() { @@ -44,7 +45,7 @@ bool ITExecutiveMenu::handleOperation(int choice) m_zenvyController.viewEmployees(); break;*/ case 5: - searchEmployee(); + searchEmployee(m_zenvyController); break; /*case 6: m_zenvyController.viewNotifications(); @@ -62,11 +63,3 @@ bool ITExecutiveMenu::handleOperation(int choice) } return true; } - -void ITExecutiveMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); -} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h index fddfb8b..1c5f060 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h @@ -1,6 +1,5 @@ #pragma once #include -#include "MenuHelper.h" #include"ZenvyController.h" class ITExecutiveMenu @@ -11,6 +10,5 @@ public: ITExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 16f6958..55eb6f0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -11,8 +11,12 @@ #include "ZenvyController.h" #include "Payroll.h" -inline void searchTheEmployee(const std::string& name, std::shared_ptr& m_zenvyController) +inline void searchEmployee(std::shared_ptr& m_zenvyController) { + std::string name; + util::clear(); + std::cout << "Enter Employee Name: "; + util::read(name); std::pair>> searchResults = m_zenvyController->searchEmployee(name); if (!(searchResults.second).empty()) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 6bfcba0..615a950 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "TalentExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void TalentExecutiveMenu::run() { @@ -44,7 +45,7 @@ bool TalentExecutiveMenu::handleOperation(int choice) m_zenvyController.viewEmployees(); break;*/ case 5: - searchEmployee(); + searchEmployee(m_zenvyController); break; /*case 6: m_zenvyController.viewNotifications(); @@ -73,12 +74,4 @@ bool TalentExecutiveMenu::handleOperation(int choice) std::cout << "Enter a valid choice!" << std::endl;*/ } return true; -} - -void TalentExecutiveMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h index 94dd86e..a258eaf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h @@ -1,6 +1,5 @@ #pragma once #include -#include "MenuHelper.h" #include"ZenvyController.h" class TalentExecutiveMenu @@ -11,6 +10,5 @@ public: TalentExecutiveMenu() : m_zenvyController(std::make_shared < ZenvyController>()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 6b847a8..10f817b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -2,6 +2,7 @@ #include "TeamExecutiveMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void TeamExecutiveMenu::run() { @@ -44,7 +45,7 @@ bool TeamExecutiveMenu::handleOperation(int choice) m_zenvyController.viewEmployees(); break;*/ case 5: - searchEmployee(); + searchEmployee(m_zenvyController); break; /*case 6: m_zenvyController.viewNotifications(); @@ -76,12 +77,4 @@ bool TeamExecutiveMenu::handleOperation(int choice) std::cout << "Enter a valid choice!" << std::endl;*/ } return true; -} - -void TalentExecutiveMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h index a3d5382..4b5181d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h @@ -1,6 +1,5 @@ #pragma once #include -#include "MenuHelper.h" #include"ZenvyController.h" class TeamExecutiveMenu @@ -11,6 +10,5 @@ public: TeamExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 99fe626..f7b82fc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -2,6 +2,7 @@ #include "TeamLeadMenu.h" #include"InputHelper.h" #include"OutputHelper.h" +#include "MenuHelper.h" void TeamLeadMenu::run() { @@ -53,7 +54,7 @@ bool TeamLeadMenu::handleOperation(int choice) m_zenvyController.viewEmployees(); break;*/ case 8: - searchEmployee(); + searchEmployee(m_zenvyController); break; /*case 9: m_zenvyController.viewTeamMembers(); @@ -82,12 +83,4 @@ bool TeamLeadMenu::handleOperation(int choice) std::cout << "Enter a valid choice!" << std::endl;*/ } return true; -} - -void TeamLeadMenu::searchEmployee() -{ - std::string name; - std::cout << "Enter Employee Name: "; - util::read(name); - searchTheEmployee(name, m_zenvyController); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h index 878d961..e1bd45b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h @@ -1,6 +1,5 @@ #pragma once #include -#include "MenuHelper.h" #include"ZenvyController.h" class TeamLeadMenu @@ -11,6 +10,5 @@ public: TeamLeadMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - void searchEmployee(); }; From e470dbc791df4f7f888b58a80fb7861149fb1507 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Wed, 8 Apr 2026 11:04:09 +0530 Subject: [PATCH 11/56] Updated MenuHelper.h EMP007 : View Employees - Updated logic in viewEmployees() method. Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 83c6d69..0adf3be 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -1,10 +1,17 @@ #pragma once #include +#include "ZenvyController.h" #include "InputHelper.h" #include "OutputHelper.h" inline void viewEmployees(std::shared_ptr m_zenvyController) { + auto employees = m_zenvyController->getEmployee(); + if (employees.empty()) + { + std::cout << "No employees found\n"; + return; + } std::cout << std::left << std::setw(10) << "EMPID" << std::setw(20) << "Name" @@ -13,12 +20,6 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) << std::setw(25) << "Email" << std::setw(15) << "Phone" << std::endl; - auto employees = m_zenvyController->getEmployee(); - if (employees.empty()) - { - std::cout << "No employees found\n"; - return; - } for (const auto& iterator : employees) { std::cout << std::left From f85614ecc545752e49bde3ced20d602ebcb86422 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Tue, 7 Apr 2026 19:35:20 +0530 Subject: [PATCH 12/56] Implement Deactive Employee functionality EMP002 : Deactivate Employee - Added deactivateEmployee logic to set employee status to INACTIVE - Enabled Deactivate Employee option in AdminMenu - Implemented listing of active employees for selection - Connected UI flow for employee deactivation - Fix minor syntax issues Smitha Mohan --- .../Trenser.Zenvy.vcxproj.filters | 6 ++ .../controllers/ZenvyController.cpp | 4 - .../AuthenticationManagementService.cpp | 2 +- .../services/EmployeeManagementService.cpp | 8 ++ .../Trenser.Zenvy/views/AdminMenu.cpp | 6 +- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 11 +-- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 5 +- .../Trenser.Zenvy/views/MenuHelper.h | 77 +++++++++++++++++-- 8 files changed, 98 insertions(+), 21 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters index d9514f7..0def00c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters @@ -192,6 +192,9 @@ Services + + Views + @@ -338,6 +341,9 @@ Services + + Views + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 144f6d4..6b5d67a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -50,7 +50,3 @@ Employees ZenvyController::getEmployees() { return m_employeeManagementService->getEmployees(); } - -std::shared_ptr ZenvyController::getEmployee(const std::string&) { - -} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp index 952b832..613cc90 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp @@ -49,7 +49,7 @@ AuthenticationDTO AuthenticationManagementService::login(const std::string& emai void AuthenticationManagementService::changePassword(const std::string& password) { - std::shared_ptr authenticatedUser = m_dataStore.getAuthenticatedUser(); + std::shared_ptr authenticatedUser = m_dataStore.getAuthenticatedEmployee(); if (authenticatedUser) { authenticatedUser->setEmployeePassword(password); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 21fd3df..022bf6e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -98,6 +98,14 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, bool EmployeeManagementService::deactivateEmployee(const std::string& id) { + auto& employee = m_dataStore.getEmployees(); + auto iterator = employee.find(id); + if (iterator == employee.end()) + { + return false; + } + iterator->second->setEmployeeAccountStatus(Enums::AccountStatus::INACTIVE); + return true; } Employees EmployeeManagementService::getEmployees() diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index bf65e3f..44388bf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -118,10 +118,10 @@ bool AdminMenu::handleOperation(int choice) break; /*case 2: m_zenvyController.viewEmployee(); - break; - case 3: - m_zenvyController.deactivateEmployee(); break;*/ + case 3: + deactivateEmployee(m_zenvyController); + break; case 5: updateProfile(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index a4eb3ac..5b82b20 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -32,7 +32,8 @@ bool EmployeeMenu::handleOperation(int choice) { switch (choice) { - /*case 1: + /* + case 1: m_zenvyController.applyLeave(); break; case 2: @@ -49,11 +50,11 @@ bool EmployeeMenu::handleOperation(int choice) break; case 6: m_zenvyController.viewTicketHistory(); - break;*/ - /*case 7: + break; + case 7: viewEmployees(); - break;*/ - /*case 8: + break; + case 8: m_zenvyController.searchEmployee(); break; case 9: diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 5b635b6..7fd76cc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -1,3 +1,4 @@ + #include #include "HRManagerMenu.h" #include "InputHelper.h" @@ -91,7 +92,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Logout\nEnter your Choice: "; + 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. Update Profile\n13. Deactivate Employee\n14. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -147,6 +148,8 @@ bool HRManagerMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 13: + deactivateEmployee(m_zenvyController); + case 14: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 2f557d1..502b9c2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -1,6 +1,13 @@ #pragma once -#include"ZenvyController.h" -#include"InputHelper.h" +#include +#include +#include +#include +#include +#include "Employee.h" +#include "ZenvyController.h" +#include "MenuHelper.h" +#include "InputHelper.h" #include"OutputHelper.h" inline void updateProfile(std::shared_ptr m_zenvyController) @@ -10,7 +17,7 @@ inline void updateProfile(std::shared_ptr m_zenvyController) 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" @@ -19,7 +26,7 @@ inline void updateProfile(std::shared_ptr m_zenvyController) "Enter your choice: "; util::read(choice); switch (choice) - { + { case 1: std::cout << "Enter your updated Name :"; util::read(name); @@ -33,10 +40,66 @@ inline void updateProfile(std::shared_ptr m_zenvyController) std::cout << "Profile Updated Successfully\n"; break; case 3: - return; + return; default: std::cout << "Enter a valid choice!" << std::endl; break; - } - } + } + } +} + + +inline std::map> listActiveEmployees(const std::shared_ptr& controller) +{ + auto employees = controller->getEmployees(); + std::map> employeeList; + int index = 1; + std::cout << "Active Employees:\n"; + for (auto& activeEmployees : employees) + { + std::cout << std::setw(3) << index << ". " + << std::setw(10) << "ID: " + << std::setw(10) << activeEmployees->getEmployeeId() + << " | " + << std::setw(10) << "Name: " + << std::setw(20) << activeEmployees->getEmployeeName() + << "\n"; + employeeList[index] = activeEmployees; + ++index; + } + if (employeeList.empty()) + { + std::cout << "No active employees available.\n"; + } + return employeeList; +} + +void deactivateEmployee(const std::shared_ptr& controller) +{ + auto employeeList = listActiveEmployees(controller); + if (employeeList.empty()) + { + return; + } + int choice; + std::cout << "\nEnter the index of the employee to deactivate: "; + util::read(choice); + auto iterator = employeeList.find(choice); + if (iterator != employeeList.end()) + { + std::string id = iterator->second->getEmployeeId(); + bool success = controller->deactivateEmployee(id); + if (success) + { + std::cout << "Employee deactivated successfully\n"; + } + else + { + std::cout << "Employee not found\n"; + } + } + else + { + std::cout << "Invalid selection.\n"; + } } From daf33e1aab82479bb72b2fd4d15f51eff0f6a4dc Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Wed, 8 Apr 2026 10:29:06 +0530 Subject: [PATCH 13/56] Implement Review Fixes EMP002 : Deactivate Employee - Updated employee listing to display in a tabular format with headers - Renamed helper function from listActiveEmployees to listEmployees - Updated error messages - Removed blank spaces Smitha Mohan --- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 65 +++++++++---------- .../Trenser.Zenvy/views/MenuHelper.h | 25 +++---- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 7fd76cc..8d51e73 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -1,4 +1,3 @@ - #include #include "HRManagerMenu.h" #include "InputHelper.h" @@ -111,39 +110,39 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { - //case 1: - // m_zenvyController.applyLeave(); - // break; - //case 2: - // m_zenvyController.viewPayslip(); - // break; - //case 3: - // m_zenvyController.viewPayslipHistory(); - // break; - //case 4: - // m_zenvyController.viewEmployees(); - // break; - //case 5: - // m_zenvyController.searchEmployee(); - // break; - //case 6: - // m_zenvyController.viewNotifications(); - // break; - //case 7: - // m_zenvyController.viewAnnouncements(); - // break; - case 8: - createEmployee(m_zenvyController); + /*case 1: + m_zenvyController.applyLeave(); break; - //case 9: - // m_zenvyController.regularizeAttenance(); - // break; - //case 10: - // m_zenvyController.updateLeaveRequest(); - // break; - //case 11: - // m_zenvyController.registercandidateAsEmployee(); - // break; + case 2: + m_zenvyController.viewPayslip(); + break; + case 3: + m_zenvyController.viewPayslipHistory(); + break; + case 4: + m_zenvyController.viewEmployees(); + break; + case 5: + m_zenvyController.searchEmployee(); + break; + case 6: + m_zenvyController.viewNotifications(); + break; + case 7: + m_zenvyController.viewAnnouncements(); + break; + case 8: + m_zenvyController.createEmployee(); + break; + case 9: + m_zenvyController.regularizeAttenance(); + break; + case 10: + m_zenvyController.updateLeaveRequest(); + break; + case 11: + m_zenvyController.registercandidateAsEmployee(); + break;*/ case 12: updateProfile(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 502b9c2..6df1fce 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -8,7 +8,7 @@ #include "ZenvyController.h" #include "MenuHelper.h" #include "InputHelper.h" -#include"OutputHelper.h" +#include "OutputHelper.h" inline void updateProfile(std::shared_ptr m_zenvyController) { @@ -49,20 +49,22 @@ inline void updateProfile(std::shared_ptr m_zenvyController) } -inline std::map> listActiveEmployees(const std::shared_ptr& controller) +inline std::map> listEmployees(const std::shared_ptr& controller) { auto employees = controller->getEmployees(); std::map> employeeList; + std::cout << std::left + << std::setw(5) << "Index" + << std::setw(15) << "ID" + << std::setw(25) << "Name" + << "\n"; int index = 1; - std::cout << "Active Employees:\n"; for (auto& activeEmployees : employees) { - std::cout << std::setw(3) << index << ". " - << std::setw(10) << "ID: " - << std::setw(10) << activeEmployees->getEmployeeId() - << " | " - << std::setw(10) << "Name: " - << std::setw(20) << activeEmployees->getEmployeeName() + std::cout << std::left + << std::setw(5) << index + << std::setw(15) << activeEmployees->getEmployeeId() + << std::setw(25) << activeEmployees->getEmployeeName() << "\n"; employeeList[index] = activeEmployees; ++index; @@ -76,12 +78,13 @@ inline std::map> listActiveEmployees(const void deactivateEmployee(const std::shared_ptr& controller) { - auto employeeList = listActiveEmployees(controller); + auto employeeList = listEmployees(controller); if (employeeList.empty()) { return; } int choice; + util::clear(); std::cout << "\nEnter the index of the employee to deactivate: "; util::read(choice); auto iterator = employeeList.find(choice); @@ -100,6 +103,6 @@ void deactivateEmployee(const std::shared_ptr& controller) } else { - std::cout << "Invalid selection.\n"; + std::cout << "Invalid index.\n"; } } From a955b64462af1b1335688d4d7395bdeaa3c62a54 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Wed, 8 Apr 2026 10:51:48 +0530 Subject: [PATCH 14/56] Ensure Role based access EMP002 : Deactivate Employee - Ensure Role based access Smitha Mohan --- .../Trenser.Zenvy/services/EmployeeManagementService.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 022bf6e..fdd0c0b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -98,6 +98,7 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, bool EmployeeManagementService::deactivateEmployee(const std::string& id) { + util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); auto& employee = m_dataStore.getEmployees(); auto iterator = employee.find(id); if (iterator == employee.end()) From 4d4974efd718bb2703d3de0e4b3e0c02d44cd929 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Wed, 8 Apr 2026 11:47:00 +0530 Subject: [PATCH 15/56] Protect Admin account from deactivation EMP002 : Deactivate Employee - Ensure admin account cannot be deactivated Smitha Mohan --- .../Trenser.Zenvy/services/EmployeeManagementService.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index fdd0c0b..29ef5b5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -98,13 +98,18 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, bool EmployeeManagementService::deactivateEmployee(const std::string& id) { - util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + 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; } From d29e38ef7529a66ee6a463faa3f262a587a37a8a Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Thu, 9 Apr 2026 20:32:48 +0530 Subject: [PATCH 16/56] Added FileManager DLL and cleanup code SRS02 : Employee Management - Created FileIO for reading and writing files - Created FileManager to use FileIO - Set up Trenser.FileManager as a DLL - Linked DLL with Trenser.Zenvy project - Fixed duplicate function issue by marking deactivateEmployee as inline - Cleaned up unused methods in controller and service Smitha Mohan --- .../Trenser.FileManager/FileIO.cpp | 28 +++++++++++++ .../Trenser.FileManager/FileIO.h | 18 ++++++++ .../Trenser.FileManager/FileManager.h | 41 +++++++++++++++++++ .../Trenser.FileManager.vcxproj | 3 ++ .../Trenser.FileManager.vcxproj.filters | 9 ++++ Trenser.FileManager/Trenser.FileManager/pch.h | 5 +++ .../Trenser.Zenvy/Trenser.Zenvy.vcxproj | 13 +++++- .../Trenser.Zenvy.vcxproj.filters | 6 +++ .../controllers/ZenvyController.cpp | 4 -- .../controllers/ZenvyController.h | 1 - .../services/EmployeeManagementService.cpp | 19 ++++++--- .../services/EmployeeManagementService.h | 1 - .../Trenser.Zenvy/views/MenuHelper.h | 2 +- 13 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 Trenser.FileManager/Trenser.FileManager/FileIO.cpp create mode 100644 Trenser.FileManager/Trenser.FileManager/FileIO.h create mode 100644 Trenser.FileManager/Trenser.FileManager/FileManager.h diff --git a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp new file mode 100644 index 0000000..321f449 --- /dev/null +++ b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp @@ -0,0 +1,28 @@ +#include "pch.h" +#include "FileIO.h" + +std::vector FileIO::readAllLines(const std::string& path) +{ + std::ifstream file(path); + if (!file.is_open()) + throw std::runtime_error("Failed to open file " + path); + + std::vector lines; + std::string line; + + while (std::getline(file, line)) + lines.push_back(line); + + return lines; +} + +void FileIO::writeAllLines(const std::string& path, + const std::vector& lines) +{ + std::ofstream file(path, std::ios::trunc); + if (!file.is_open()) + throw std::runtime_error("Failed to open file " + path); + + for (const auto& line : lines) + file << line << '\n'; +} \ No newline at end of file diff --git a/Trenser.FileManager/Trenser.FileManager/FileIO.h b/Trenser.FileManager/Trenser.FileManager/FileIO.h new file mode 100644 index 0000000..c628003 --- /dev/null +++ b/Trenser.FileManager/Trenser.FileManager/FileIO.h @@ -0,0 +1,18 @@ +#pragma once +#include +#include +#include +#include +#include + +#ifdef TRENSERFILEMANAGER_EXPORTS +#define TRENSERFILEMANAGER_API __declspec(dllexport) +#else +#define TRENSERFILEMANAGER_API __declspec(dllimport) +#endif + +class TRENSERFILEMANAGER_API FileIO { +public: + static std::vector readAllLines(const std::string& path); + static void writeAllLines(const std::string& path, const std::vector& lines); +}; diff --git a/Trenser.FileManager/Trenser.FileManager/FileManager.h b/Trenser.FileManager/Trenser.FileManager/FileManager.h new file mode 100644 index 0000000..2facd05 --- /dev/null +++ b/Trenser.FileManager/Trenser.FileManager/FileManager.h @@ -0,0 +1,41 @@ +#pragma once +#include "FileIO.h" + +template using objects = std::map>; + +template +class FileManager +{ +private: + std::string m_filePath; +public: + FileManager() : m_filePath("") {} + FileManager(const std::string& filePath) : m_filePath(filePath) {} + objects load(); + void save(const objects&); +}; + +template +objects FileManager::load() +{ + objects records; + auto lines = FileIO::readAllLines(m_filePath); + for (const auto& record : lines) + { + auto object = T::deserialize(record); + records[object->getId()] = object; + } + return records; +} + +template +void FileManager::save(const objects& records) +{ + std::vector lines; + + for (const auto& recordPair : records) + { + lines.push_back(recordPair.second->serialize()); + } + FileIO::writeAllLines(m_filePath, lines); +} diff --git a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj index c7c45c3..7511f8e 100644 --- a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj +++ b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj @@ -135,11 +135,14 @@ + + + Create Create diff --git a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters index 1e57c7b..8faaab1 100644 --- a/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters +++ b/Trenser.FileManager/Trenser.FileManager/Trenser.FileManager.vcxproj.filters @@ -21,6 +21,12 @@ Header Files + + Header Files + + + Header Files + @@ -29,5 +35,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/Trenser.FileManager/Trenser.FileManager/pch.h b/Trenser.FileManager/Trenser.FileManager/pch.h index 885d5d6..a4ee448 100644 --- a/Trenser.FileManager/Trenser.FileManager/pch.h +++ b/Trenser.FileManager/Trenser.FileManager/pch.h @@ -9,5 +9,10 @@ // add headers that you want to pre-compile here #include "framework.h" +#include +#include +#include +#include +#include #endif //PCH_H diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index 2792535..1e57272 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -102,12 +102,17 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - $(ProjectDir)models;$(ProjectDir)controllers;$(ProjectDir)services;$(ProjectDir)utilities;$(ProjectDir)factories;$(ProjectDir)datastores;$(ProjectDir)views;%(AdditionalIncludeDirectories) + $(ProjectDir)models;$(ProjectDir)controllers;$(ProjectDir)services;$(ProjectDir)utilities;$(ProjectDir)factories;$(ProjectDir)datastores;$(ProjectDir)views;%(AdditionalIncludeDirectories);..\..\Trenser.FileManager\Trenser.FileManager Console true + ..\..\Trenser.FileManager\$(IntDir);%(AdditionalLibraryDirectories) + Trenser.FileManager.lib;%(AdditionalDependencies) + + xcopy /y /d "..\..\Trenser.FileManager\$(IntDir)Trenser.FileManager.dll" "$(OutDir)" + @@ -117,11 +122,17 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + ;..\..\Trenser.FileManager\Trenser.FileManager Console true + ..\..\Trenser.FileManager\$(IntDir);%(AdditionalLibraryDirectories) + Trenser.FileManager.lib;%(AdditionalDependencies) + + xcopy /y /d "..\..\Trenser.FileManager\$(IntDir)Trenser.FileManager.dll" "$(OutDir)" + diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters index 0def00c..d03337b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters @@ -195,6 +195,9 @@ Views + + Services + @@ -344,6 +347,9 @@ Views + + Services + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 6b5d67a..9cc6be1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -42,10 +42,6 @@ std::shared_ptr ZenvyController::getCurrentEmployee() return m_employeeManagementService->getCurrentEmployee(); } -std::shared_ptr ZenvyController::getEmployee(const std::string& id) -{ -} - Employees ZenvyController::getEmployees() { return m_employeeManagementService->getEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index cb355c6..66ec402 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -48,7 +48,6 @@ public: void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); Employees getEmployees(); - std::shared_ptr getEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); void updateProfile(const std::string&,const std::string&); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 29ef5b5..eaca66a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -116,11 +116,20 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) Employees EmployeeManagementService::getEmployees() { - -} - -std::shared_ptr EmployeeManagementService::getEmployee(const std::string& id) -{ + Employees result; + auto& employees = m_dataStore.getEmployees(); + if (employees.size() <= 0) + { + return result; + } + for (const auto& iterator : employees) + { + if (iterator.second->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + result.push_back(iterator.second); + } + } + return result; } std::shared_ptr EmployeeManagementService::getCurrentEmployee() diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 14c8131..388c99c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -15,7 +15,6 @@ public: void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); Employees getEmployees(); - std::shared_ptr getEmployee(const std::string&); void updateProfile(const std::string&,const std::string&); std::shared_ptr getCurrentEmployee(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 6df1fce..32a923c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -76,7 +76,7 @@ inline std::map> listEmployees(const std::s return employeeList; } -void deactivateEmployee(const std::shared_ptr& controller) +inline void deactivateEmployee(const std::shared_ptr& controller) { auto employeeList = listEmployees(controller); if (employeeList.empty()) From 451ed4fec2cfbb7f614b82adee26c5159ddff36b Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Fri, 10 Apr 2026 13:17:50 +0530 Subject: [PATCH 17/56] Added employee persistence, serialization, and file loading support SRS02 : Employee Management MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implemented serialization and deserialization for Employee and GeneralEmployee models - Added FileManager integration to load employees from CSV files - Introduced ApplicationConfig entries for employee file paths - Updated Employee ID handling (getEmployeeId → getId) across project - Modified FileIO to auto-create file if not found instead of throwing exception - Added constructors for all employee types to support deserialization - Implemented loadEmployees in service and loadStates in controller - Ensured default admin creation if none exists during load - Added StringHelper utility for extracting numeric IDs - Extended Enums with string conversion and parsing utilities - Added initial CSV files for Employee and GeneralEmployee data - Improved login error message formatting and minor cleanup - Setup gitignore to not track csv files --- .gitignore | 3 + .../Trenser.FileManager/FileIO.cpp | 10 +- .../Trenser.FileManager/FileManager.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp | 1 + .../Trenser.Zenvy/Trenser.Zenvy.vcxproj | 2 + .../Trenser.Zenvy.vcxproj.filters | 6 + .../controllers/ZenvyController.cpp | 5 + .../controllers/ZenvyController.h | 3 + Trenser.Zenvy/Trenser.Zenvy/models/Admin.h | 19 ++- .../Trenser.Zenvy/models/Employee.cpp | 135 +++++++++++++++++- Trenser.Zenvy/Trenser.Zenvy/models/Employee.h | 37 ++++- .../Trenser.Zenvy/models/FinanceExecutive.h | 18 ++- .../Trenser.Zenvy/models/GeneralEmployee.cpp | 50 +++++++ .../Trenser.Zenvy/models/GeneralEmployee.h | 32 ++++- .../Trenser.Zenvy/models/HRManager.h | 17 +++ .../Trenser.Zenvy/models/ITExecutive.h | 19 ++- .../Trenser.Zenvy/models/TeamExecutive.h | 17 +++ .../services/ApplicationConfig.h | 6 + .../services/EmployeeManagementService.cpp | 31 +++- .../services/EmployeeManagementService.h | 1 + Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 117 +++++++++++++++ .../Trenser.Zenvy/utilities/StringHelper.cpp | 15 ++ .../Trenser.Zenvy/utilities/StringHelper.h | 7 + .../views/FinanceExecutiveMenu.cpp | 4 +- .../Trenser.Zenvy/views/MenuHelper.h | 4 +- .../Trenser.Zenvy/views/UserInterface.cpp | 11 +- 26 files changed, 549 insertions(+), 23 deletions(-) create mode 100644 Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp create mode 100644 Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h diff --git a/.gitignore b/.gitignore index 47a94ef..fe37065 100644 --- a/.gitignore +++ b/.gitignore @@ -426,3 +426,6 @@ FodyWeavers.xsd *.msix *.msm *.msp + +# CSV Files +*.csv diff --git a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp index 321f449..ac79d03 100644 --- a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp +++ b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp @@ -5,14 +5,14 @@ std::vector FileIO::readAllLines(const std::string& path) { std::ifstream file(path); if (!file.is_open()) - throw std::runtime_error("Failed to open file " + path); - - std::vector lines; + { + std::ofstream newFile(path); + newFile.close(); + file.open(path); + } std::vector lines; std::string line; - while (std::getline(file, line)) lines.push_back(line); - return lines; } diff --git a/Trenser.FileManager/Trenser.FileManager/FileManager.h b/Trenser.FileManager/Trenser.FileManager/FileManager.h index 2facd05..50a9fbf 100644 --- a/Trenser.FileManager/Trenser.FileManager/FileManager.h +++ b/Trenser.FileManager/Trenser.FileManager/FileManager.h @@ -1,7 +1,7 @@ #pragma once #include "FileIO.h" -template using objects = std::map>; +template using objects = std::map>; template class FileManager diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp index 4413069..9c953a9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.cpp @@ -1,4 +1,5 @@ #include "UserInterface.h" +#include "FileManager.h" int main() { UserInterface userInterFace; diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index 1e57272..f3f2e5f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -177,6 +177,7 @@ + @@ -229,6 +230,7 @@ + diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters index d03337b..1c6dff6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj.filters @@ -198,6 +198,9 @@ Services + + Utilities + @@ -350,6 +353,9 @@ Services + + Utilities + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 9cc6be1..7d587e6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -46,3 +46,8 @@ Employees ZenvyController::getEmployees() { return m_employeeManagementService->getEmployees(); } + +void ZenvyController::loadStates() +{ + m_employeeManagementService->loadEmployees(); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 66ec402..2f8c137 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -53,4 +53,7 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); + + //File Management + void loadStates(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h index 5b869b0..c483a61 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h @@ -10,6 +10,23 @@ public: const std::string& phone, const std::string& email, std::shared_ptr payroll - ) :Employee(name, phone, email, Enums::EmployeeType::GENERAL, payroll) {}; + ) :Employee(name, phone, email, Enums::EmployeeType::ADMIN, payroll) {}; + Admin(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::ADMIN, + accountStatus) {} ~Admin() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index 57db7a9..f673458 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -1,8 +1,45 @@ +#include #include "Employee.h" +#include "Factory.h" +#include "StringHelper.h" +#include "Admin.h" +#include "HRManager.h" +#include "ITExecutive.h" +#include "TalentExecutive.h" +#include "TeamExecutive.h" +#include "FinanceExecutive.h" +#include "GeneralEmployee.h" int Employee::m_uid = 0; -const std::string& Employee::getEmployeeId() const +Employee::Employee(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::EmployeeType employeeType, + Enums::AccountStatus accountStatus) + : m_id(id), + m_password(password), + m_name(name), + m_phone(phone), + m_email(email), + m_accountStatus(accountStatus), + m_teamStatus(teamStatus), + m_teamId(teamId), + m_employeeType(employeeType), + m_payroll() +{ + int idNumber = util::extractNumber(m_id); + if (idNumber > m_uid) + { + m_uid = idNumber; + } +} + +const std::string& Employee::getId() const { return m_id; } @@ -130,3 +167,99 @@ Enums::EmployeeType Employee::getEmployeeType() const { return m_employeeType; } + +std::string Employee::serialize() const +{ + std::ostringstream serializedEmployee; + serializedEmployee << m_id << ',' + << m_email << ',' + << m_name << ',' + << m_phone << ',' + << m_password << ',' + << m_teamId << ',' + << Enums::getTeamStatusString(m_teamStatus) << ',' + << Enums::getAccountStatusString(m_accountStatus) << ',' + << Enums::getEmployeeTypeString(m_employeeType); + return serializedEmployee.str(); +} + +std::shared_ptr Employee::deserialize(const std::string& record) +{ + std::string id, name, phone, password, email; + std::string teamId, teamStatusString, accountStatusString, employeeTypeString; + std::istringstream serializedEmployee(record); + getline(serializedEmployee, id, ','); + getline(serializedEmployee, email, ','); + getline(serializedEmployee, name, ','); + getline(serializedEmployee, phone, ','); + getline(serializedEmployee, password, ','); + getline(serializedEmployee, teamId, ','); + getline(serializedEmployee, teamStatusString, ','); + getline(serializedEmployee, accountStatusString, ','); + getline(serializedEmployee, employeeTypeString, ','); + Enums::TeamStatus teamStatus = Enums::getTeamStatus(teamStatusString); + Enums::AccountStatus accountStatus = Enums::getAccountStatus(accountStatusString); + Enums::EmployeeType employeeType = Enums::getEmployeeType(employeeTypeString); + switch (employeeType) + { + case Enums::EmployeeType::IT: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::FINANCE: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::HR: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::TEAM: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::ADMIN: + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + accountStatus + ); + case Enums::EmployeeType::GENERAL: + throw std::runtime_error("Cannot deserialize GeneralEmployee!"); + default: + return nullptr; + } +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index b690f7c..6900943 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -14,7 +14,7 @@ using leaveMap = std::map>; class Employee { -private: +protected: static int m_uid; std::string m_id; std::string m_password; @@ -30,14 +30,41 @@ private: leaveMap m_leaves; Enums::EmployeeType m_employeeType; public: - Employee() : m_id("EMP" + std::to_string(++m_uid)), m_password(Config::Authentication::DEFAULT_PASSWORD), m_name(""), m_phone(""), m_email(""), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(Enums::EmployeeType::GENERAL) {} + Employee() + : m_id("EMP" + std::to_string(++m_uid)), + m_password(Config::Authentication::DEFAULT_PASSWORD), + m_name(""), + m_phone(""), + m_email(""), + m_accountStatus(Enums::AccountStatus::ACTIVE), + m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), + m_teamId(""), + m_employeeType(Enums::EmployeeType::GENERAL) {} Employee(const std::string& name, const std::string& phone, const std::string& email, Enums::EmployeeType employeeType, std::shared_ptr payroll) - : m_id("EMP" + std::to_string(++m_uid)), m_password(Config::Authentication::DEFAULT_PASSWORD), m_name(name), m_phone(phone), m_email(email), m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), m_employeeType(employeeType), m_payroll(payroll) { } - const std::string& getEmployeeId() const; + : m_id("EMP" + std::to_string(++m_uid)), + m_password(Config::Authentication::DEFAULT_PASSWORD), + m_name(name), + m_phone(phone), + m_email(email), + m_accountStatus(Enums::AccountStatus::ACTIVE), + m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), + m_teamId(""), + m_employeeType(employeeType), + m_payroll(payroll) {} + Employee(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::EmployeeType employeeType, + Enums::AccountStatus accountStatus); + const std::string& getId() const; const std::string& getEmployeePassword() const; const std::string& getEmployeeName() const; const std::string& getEmployeePhone() const; @@ -61,5 +88,7 @@ public: void addAttendance(std::shared_ptr attendance); void addLeave(std::shared_ptr leave); Enums::EmployeeType getEmployeeType() const; + virtual std::string serialize() const; + static std::shared_ptr deserialize(const std::string&); virtual ~Employee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h index 6713881..e877627 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h @@ -1,5 +1,4 @@ #pragma once -#include #include "Employee.h" class FinanceExecutive : public Employee @@ -12,6 +11,23 @@ public: const std::string& email, std::shared_ptr payroll ) :Employee(name, phone, email, Enums::EmployeeType::FINANCE, payroll) {}; + FinanceExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::FINANCE, + accountStatus) {} ~FinanceExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 46f9e61..455665b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -1,4 +1,6 @@ +#include #include "GeneralEmployee.h" +#include "Factory.h" Enums::EmployeeDesignation GeneralEmployee::getDesignation() const { @@ -8,4 +10,52 @@ Enums::EmployeeDesignation GeneralEmployee::getDesignation() const void GeneralEmployee::setDesignation(Enums::EmployeeDesignation designation) { m_designation = designation; +} + +std::string GeneralEmployee::serialize() const +{ + std::ostringstream serializedEmployee; + serializedEmployee << m_id << ',' + << m_email << ',' + << m_name << ',' + << m_phone << ',' + << m_password << ',' + << m_teamId << ',' + << Enums::getTeamStatusString(m_teamStatus) << ',' + << Enums::getAccountStatusString(m_accountStatus) << ',' + << Enums::getEmployeeTypeString(m_employeeType) << ',' + << Enums::getEmployeeDesignationString(m_designation); + return serializedEmployee.str(); +} + +std::shared_ptr GeneralEmployee::deserialize(const std::string& record) +{ + std::string id, name, phone, password, email; + std::string teamId, teamStatusString, accountStatusString, employeeTypeString, employeeDesignationString; + std::istringstream serializedEmployee(record); + getline(serializedEmployee, id, ','); + getline(serializedEmployee, email, ','); + getline(serializedEmployee, name, ','); + getline(serializedEmployee, phone, ','); + getline(serializedEmployee, password, ','); + getline(serializedEmployee, teamId, ','); + getline(serializedEmployee, teamStatusString, ','); + getline(serializedEmployee, accountStatusString, ','); + getline(serializedEmployee, employeeTypeString, ','); + getline(serializedEmployee, employeeDesignationString, ','); + Enums::TeamStatus teamStatus = Enums::getTeamStatus(teamStatusString); + Enums::AccountStatus accountStatus = Enums::getAccountStatus(accountStatusString); + Enums::EmployeeType employeeType = Enums::getEmployeeType(employeeTypeString); + Enums::EmployeeDesignation employeeDesignation = Enums::getEmployeeDesignation(employeeDesignationString); + return Factory::getObject( + id, + name, + phone, + password, + email, + teamId, + teamStatus, + employeeDesignation, + accountStatus + ); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index c413eac..1277fff 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -7,13 +7,41 @@ class GeneralEmployee : public Employee private: Enums::EmployeeDesignation m_designation; public: - GeneralEmployee() : m_designation(Enums::EmployeeDesignation::JUNIOR) {} + GeneralEmployee() + : m_designation(Enums::EmployeeDesignation::JUNIOR) {} GeneralEmployee(const std::string& name, const std::string& phone, const std::string& email, std::shared_ptr payroll, - Enums::EmployeeDesignation designation) : Employee(name, phone, email, Enums::EmployeeType::GENERAL, payroll), m_designation(designation) {} + Enums::EmployeeDesignation designation) + : Employee(name, + phone, + email, + Enums::EmployeeType::GENERAL, + payroll), + m_designation(designation) {} + GeneralEmployee(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::EmployeeDesignation employeeDesignation, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::GENERAL, + accountStatus), + m_designation(employeeDesignation) {} Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); + std::string serialize() const override; + static std::shared_ptr deserialize(const std::string&); ~GeneralEmployee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h index 1c9ae17..43f572c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h @@ -11,6 +11,23 @@ public: const std::string& email, std::shared_ptr payroll ) :Employee(name, phone, email, Enums::EmployeeType::HR, payroll) {}; + HRManager(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::HR, + accountStatus) {} ~HRManager() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h index 7cecff3..a69f673 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h @@ -10,7 +10,24 @@ public: const std::string& phone, const std::string& email, std::shared_ptr payroll - ) :Employee(name, phone, email, Enums::EmployeeType::GENERAL, payroll) {}; + ) :Employee(name, phone, email, Enums::EmployeeType::IT, payroll) {}; + ITExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::IT, + accountStatus) {} ~ITExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h index 03f321b..3f79197 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h @@ -11,6 +11,23 @@ public: const std::string& email, std::shared_ptr payroll ) :Employee(name, phone, email, Enums::EmployeeType::TEAM, payroll) {}; + TeamExecutive(const std::string& id, + const std::string& name, + const std::string& phone, + const std::string& password, + const std::string& email, + const std::string& teamId, + Enums::TeamStatus teamStatus, + Enums::AccountStatus accountStatus) + : Employee(id, + name, + phone, + password, + email, + teamId, + teamStatus, + Enums::EmployeeType::TEAM, + accountStatus) {} ~TeamExecutive() = default; }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h index 15f54e6..c725431 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -30,4 +30,10 @@ namespace Config constexpr double EXECUTIVE_EMPLOYEE_PF_CONTRIBUTION = 0.0; constexpr double EXECUTIVE_EMPLOYER_PF_CONTRIBUTION = 0.0; } + + namespace File + { + constexpr const char* EMPLOYEES_FILE = "files/Employee.csv"; + constexpr const char* GENERAL_EMPLOYEES_FILE = "files/GeneralEmployee.csv"; + } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index eaca66a..1c9919d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -10,6 +10,8 @@ #include "TeamExecutive.h" #include "FinanceExecutive.h" #include "GeneralEmployee.h" +#include "FileManager.h" +#include "ApplicationConfig.h" void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { @@ -93,7 +95,7 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, default: throw std::runtime_error("Invalid Employee Type"); } - m_dataStore.getEmployees().emplace(std::make_pair(employee->getEmployeeId(), employee)); + m_dataStore.getEmployees().emplace(std::make_pair(employee->getId(), employee)); } bool EmployeeManagementService::deactivateEmployee(const std::string& id) @@ -142,4 +144,29 @@ void EmployeeManagementService::updateProfile(const std::string& name,const std: std::shared_ptr employee = m_dataStore.getAuthenticatedEmployee(); employee->setEmployeeName(name); employee->setEmployeePhone(phone); -} \ No newline at end of file +} + +void EmployeeManagementService::loadEmployees() +{ + FileManager employeeFileManager(Config::File::EMPLOYEES_FILE); + FileManager generalEmployeeFileManager(Config::File::GENERAL_EMPLOYEES_FILE); + bool isAdminFound = false; + auto& employees = m_dataStore.getEmployees(); + auto employeesMap = employeeFileManager.load(); + auto generalEmployeesMap = generalEmployeeFileManager.load(); + employees.insert(employeesMap.begin(), employeesMap.end()); + employees.insert(generalEmployeesMap.begin(), generalEmployeesMap.end()); + for (auto& employeePair : employees) + { + if (employeePair.second->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + isAdminFound = true; + break; + } + } + if (!isAdminFound) + { + auto admin = Factory::getObject("Admin", "", "admin@trenser.com", nullptr); + employees.emplace(std::make_pair(admin->getId(), admin)); + } +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 388c99c..cb2daf5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -17,4 +17,5 @@ public: Employees getEmployees(); void updateProfile(const std::string&,const std::string&); std::shared_ptr getCurrentEmployee(); + void loadEmployees(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index ace8792..5154ddd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -1,4 +1,5 @@ #pragma once +#include namespace Enums { @@ -89,4 +90,120 @@ namespace Enums { USER_NOT_FOUND, INVALID_PASSWORD }; + + inline std::string getAccountStatusString(AccountStatus status) + { + switch (status) + { + case AccountStatus::ACTIVE: + return "ACTIVE"; + case AccountStatus::INACTIVE: + return "INACTIVE"; + default: + return "UNKNOWN"; + } + } + + inline std::string getEmployeeTypeString(EmployeeType type) + { + switch (type) + { + case EmployeeType::GENERAL: + return "GENERAL"; + case EmployeeType::IT: + return "IT"; + case EmployeeType::FINANCE: + return "FINANCE"; + case EmployeeType::TAG: + return "TAG"; + case EmployeeType::HR: + return "HR"; + case EmployeeType::TEAM: + return "TEAM"; + case EmployeeType::ADMIN: + return "ADMIN"; + case EmployeeType::INVALID: + return "INVALID"; + default: + return "UNKNOWN"; + } + } + + 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 AccountStatus getAccountStatus(const std::string& input) + { + if (input == "ACTIVE") + return AccountStatus::ACTIVE; + if (input == "INACTIVE") + return AccountStatus::INACTIVE; + return AccountStatus::INACTIVE; + } + + inline EmployeeType getEmployeeType(const std::string& input) + { + if (input == "GENERAL") + return EmployeeType::GENERAL; + if (input == "IT") + return EmployeeType::IT; + if (input == "FINANCE") + return EmployeeType::FINANCE; + if (input == "TAG") + return EmployeeType::TAG; + if (input == "HR") + return EmployeeType::HR; + if (input == "TEAM") + return EmployeeType::TEAM; + if (input == "ADMIN") + return EmployeeType::ADMIN; + return EmployeeType::INVALID; + } + + inline TeamStatus getTeamStatus(const std::string& str) + { + if (str == "IN_TEAM") + return TeamStatus::IN_TEAM; + if (str == "NOT_IN_TEAM") + return TeamStatus::NOT_IN_TEAM; + return TeamStatus::NOT_IN_TEAM; + } + + inline EmployeeDesignation getEmployeeDesignation(const std::string& input) + { + if (input == "JUNIOR") + return EmployeeDesignation::JUNIOR; + if (input == "SENIOR") + return EmployeeDesignation::SENIOR; + if (input == "TEAM_LEAD") + return EmployeeDesignation::TEAM_LEAD; + return EmployeeDesignation::INVALID; + } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp new file mode 100644 index 0000000..00af011 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp @@ -0,0 +1,15 @@ +#include "StringHelper.h" +#include + +int util::extractNumber(const std::string& input) +{ + int result = 0; + for (char character : input) + { + if (std::isdigit(static_cast(character))) + { + result = result * 10 + (character - '0'); + } + } + return result; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h new file mode 100644 index 0000000..12df49a --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h @@ -0,0 +1,7 @@ +#pragma once +#include + +namespace util +{ + int extractNumber(const std::string&); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 285c3c3..65f0c94 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -49,7 +49,7 @@ std::string FinanceExecutiveMenu::getSelectedUserId() for (const auto& employee : employeeList) { std::cout << std::left << std::setw(6) << employee.first - << std::setw(15) << employee.second->getEmployeeId() + << std::setw(15) << employee.second->getId() << std::setw(25) << employee.second->getEmployeeName() << std::endl; } @@ -58,7 +58,7 @@ std::string FinanceExecutiveMenu::getSelectedUserId() auto employeeIterator = employeeList.find(choice); if (employeeIterator != employeeList.end()) { - return (employeeIterator->second->getEmployeeId()); + return (employeeIterator->second->getId()); } else { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 32a923c..4dd21c7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -63,7 +63,7 @@ inline std::map> listEmployees(const std::s { std::cout << std::left << std::setw(5) << index - << std::setw(15) << activeEmployees->getEmployeeId() + << std::setw(15) << activeEmployees->getId() << std::setw(25) << activeEmployees->getEmployeeName() << "\n"; employeeList[index] = activeEmployees; @@ -90,7 +90,7 @@ inline void deactivateEmployee(const std::shared_ptr& controlle auto iterator = employeeList.find(choice); if (iterator != employeeList.end()) { - std::string id = iterator->second->getEmployeeId(); + std::string id = iterator->second->getId(); bool success = controller->deactivateEmployee(id); if (success) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp index adea852..8c29245 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp @@ -19,6 +19,15 @@ void UserInterface::run() { bool isMenuActive = true; + try + { + m_controller->loadStates(); + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + return; + } while (isMenuActive) { try @@ -94,7 +103,7 @@ void UserInterface::login() } else { - std::cout << "\nInvalid Password"; + std::cout << "Error: Invalid Password\n"; util::pressEnter(); return; } From 03be8f81d2993711800859605598dbfd7b31785d Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Fri, 10 Apr 2026 13:33:41 +0530 Subject: [PATCH 18/56] Refactored employee creation menu and centralized helper logic SRS02 : Employee Management - Removed duplicate employee creation helper functions from AdminMenu and HRManagerMenu - Centralized employee creation flow into MenuHelper.cpp - Updated createEmployee to use current employee type for access control - Fixed parameter order bug in createEmployee (email, name, phone) - Improved menu titles for all roles (removed generic system header) - Added util::pressEnter() for better UX on invalid input across menus - Added newline before pause in InputHelper::pressEnter - Cleaned up minor formatting issues --- .../services/EmployeeManagementService.cpp | 2 +- .../Trenser.Zenvy/utilities/InputHelper.h | 1 + .../Trenser.Zenvy/views/AdminMenu.cpp | 82 +------------- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 3 +- .../views/FinanceExecutiveMenu.cpp | 3 +- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 87 +-------------- .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 3 +- .../Trenser.Zenvy/views/MenuHelper.cpp | 102 ++++++++++++++++++ .../Trenser.Zenvy/views/MenuHelper.h | 4 +- .../views/TalentExecutiveMenu.cpp | 3 +- .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 3 +- .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 3 +- 12 files changed, 125 insertions(+), 171 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 1c9919d..3de8fcd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -13,7 +13,7 @@ #include "FileManager.h" #include "ApplicationConfig.h" -void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, 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) { std::shared_ptr authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); if (!authenticatedEmployee) diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h index 559acda..26128c1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h @@ -25,6 +25,7 @@ namespace util inline void pressEnter() { + std::cout << std::endl; system("pause"); } } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 44388bf..2d7ffd9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -4,87 +4,6 @@ #include "OutputHelper.h" #include "MenuHelper.h" -static Enums::EmployeeType getEmployeeType() -{ - int choice; - util::clear(); - std::cout << "Select Employee Type" - "\n1. HR Employee" - "\n2. IT Executive" - "\n3. Team Executive" - "\n4. Finance Executive" - "\n5. Talent Executive" - "\n6. General Employee"; - util::read(choice); - switch (choice) - { - case 1: - return Enums::EmployeeType::HR; - case 2: - return Enums::EmployeeType::IT; - case 3: - return Enums::EmployeeType::TEAM; - case 4: - return Enums::EmployeeType::FINANCE; - case 5: - return Enums::EmployeeType::TAG; - case 6: - return Enums::EmployeeType::GENERAL; - default: - return Enums::EmployeeType::INVALID; - } -} - -static Enums::EmployeeDesignation getEmployeeDesignation() -{ - int choice; - util::clear(); - std::cout << "Select Employee Designation" - "\n1. SENIOR" - "\n2. JUNIOR"; - util::read(choice); - switch (choice) - { - case 1: - return Enums::EmployeeDesignation::SENIOR; - case 2: - return Enums::EmployeeDesignation::JUNIOR; - default: - return Enums::EmployeeDesignation::INVALID; - } -} - -static void createEmployee(std::shared_ptr controller) -{ - Enums::EmployeeType employeeType = 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, name, email, phone); - std::cout << "\nCreated Employee Successfully."; -} - void AdminMenu::run() { bool isMenuActive = true; @@ -129,6 +48,7 @@ bool AdminMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 5b82b20..e54b282 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -13,7 +13,7 @@ void EmployeeMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n14. Update Profile\n15. Logout\nEnter your Choice: "; + std::cout << "Employee 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\n14. Update Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -79,6 +79,7 @@ bool EmployeeMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 65f0c94..28c7f74 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -13,7 +13,7 @@ void FinanceExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Generate Payslip\n10. Update Payroll\n11. Update Profile\n12. Logout\nEnter your Choice: "; + std::cout << "Finance Executive Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Generate Payslip\n10. Update Payroll\n11. Update Profile\n12. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -130,6 +130,7 @@ bool FinanceExecutiveMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 8d51e73..654997c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -4,84 +4,6 @@ #include "OutputHelper.h" #include "MenuHelper.h" -static Enums::EmployeeType getEmployeeType() -{ - int choice; - util::clear(); - std::cout << "Select Employee Type" - "\n1. IT Executive" - "\n2. Team Executive" - "\n3. Finance Executive" - "\n4. Talent Executive" - "\n5. General Employee"; - util::read(choice); - switch (choice) - { - case 1: - return Enums::EmployeeType::IT; - case 2: - return Enums::EmployeeType::TEAM; - case 3: - return Enums::EmployeeType::FINANCE; - case 4: - return Enums::EmployeeType::TAG; - case 5: - return Enums::EmployeeType::GENERAL; - default: - return Enums::EmployeeType::INVALID; - } -} - -static Enums::EmployeeDesignation getEmployeeDesignation() -{ - int choice; - util::clear(); - std::cout << "Select Employee Designation" - "\n1. SENIOR" - "\n2. JUNIOR"; - util::read(choice); - switch (choice) - { - case 1: - return Enums::EmployeeDesignation::SENIOR; - case 2: - return Enums::EmployeeDesignation::JUNIOR; - default: - return Enums::EmployeeDesignation::INVALID; - } -} - -static void createEmployee(std::shared_ptr controller) -{ - Enums::EmployeeType employeeType = 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, name, email, phone); - std::cout << "\nCreated Employee Successfully."; -} - void HRManagerMenu::run() { bool isMenuActive = true; @@ -91,7 +13,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. Logout\nEnter your Choice: "; + std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -130,11 +52,11 @@ bool HRManagerMenu::handleOperation(int choice) break; case 7: m_zenvyController.viewAnnouncements(); - break; + break;*/ case 8: - m_zenvyController.createEmployee(); + createEmployee(m_zenvyController); break; - case 9: + /*case 9: m_zenvyController.regularizeAttenance(); break; case 10: @@ -152,6 +74,7 @@ bool HRManagerMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index 962b372..90ae17b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -13,7 +13,7 @@ void ITExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Update Profile\n10. Logout\nEnter your Choice: "; + std::cout << "IT Executive Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Resolve Ticket\n9. Update Profile\n10. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -63,6 +63,7 @@ bool ITExecutiveMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 36b2e02..6ec6f00 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -1 +1,103 @@ +#include #include "MenuHelper.h" + +static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) +{ + int choice; + util::clear(); + static const std::map> employeeTypeOptions = { + { Enums::EmployeeType::ADMIN, { + Enums::EmployeeType::HR, + Enums::EmployeeType::IT, + Enums::EmployeeType::TEAM, + Enums::EmployeeType::FINANCE, + Enums::EmployeeType::TAG, + Enums::EmployeeType::GENERAL + }}, + { Enums::EmployeeType::HR, { + Enums::EmployeeType::IT, + Enums::EmployeeType::TEAM, + Enums::EmployeeType::FINANCE, + Enums::EmployeeType::TAG, + Enums::EmployeeType::GENERAL + }} + }; + static const std::map labels = { + { Enums::EmployeeType::HR, "HR Employee" }, + { Enums::EmployeeType::IT, "IT Executive" }, + { Enums::EmployeeType::TEAM, "Team Executive" }, + { Enums::EmployeeType::FINANCE, "Finance Executive" }, + { Enums::EmployeeType::TAG, "Talent Executive" }, + { Enums::EmployeeType::GENERAL, "General Employee" } + }; + auto it = employeeTypeOptions.find(employeeType); + if (it == employeeTypeOptions.end()) + { + throw std::runtime_error("You do not have the authority to create a new Employee!"); + } + const auto& options = it->second; + std::cout << "Select Employee Type\n"; + for (int index = 0; index < options.size(); ++index) + { + std::cout << index + 1 << ". " << labels.at(options[index]) << "\n"; + } + std::cout << "Enter Choice: "; + util::read(choice); + if (choice >= 1 && choice <= options.size()) + { + return options[choice - 1]; + } + return Enums::EmployeeType::INVALID; +} + +static Enums::EmployeeDesignation getEmployeeDesignation() +{ + int choice; + util::clear(); + std::cout << "Select Employee Designation" + "\n1. SENIOR" + "\n2. JUNIOR" + "\nEnter Choice: "; + util::read(choice); + switch (choice) + { + case 1: + return Enums::EmployeeDesignation::SENIOR; + case 2: + return Enums::EmployeeDesignation::JUNIOR; + default: + return Enums::EmployeeDesignation::INVALID; + } +} + +void createEmployee(std::shared_ptr controller) +{ + auto currentEmployee = controller->getCurrentEmployee(); + Enums::EmployeeType employeeType = getEmployeeType(currentEmployee->getEmployeeType()); + Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; + std::string name, email, phone; + switch (employeeType) + { + case Enums::EmployeeType::INVALID: + std::cout << "Invalid Choice"; + util::pressEnter(); + return; + case Enums::EmployeeType::GENERAL: + employeeDesignation = getEmployeeDesignation(); + if (employeeDesignation == Enums::EmployeeDesignation::INVALID) + { + std::cout << "Invalid Choice"; + util::pressEnter(); + return; + } + break; + } + std::cout << "Enter Name: "; + util::read(name); + std::cout << "Enter Email: "; + util::read(email); + std::cout << "Enter Phone: "; + util::read(phone); + controller->createEmployee(employeeType, employeeDesignation, email, name, phone); + std::cout << "\nCreated Employee Successfully."; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 4dd21c7..b861d6a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -9,6 +9,9 @@ #include "MenuHelper.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "Enums.h" + +void createEmployee(std::shared_ptr controller); inline void updateProfile(std::shared_ptr m_zenvyController) { @@ -48,7 +51,6 @@ inline void updateProfile(std::shared_ptr m_zenvyController) } } - inline std::map> listEmployees(const std::shared_ptr& controller) { auto employees = controller->getEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 70ca2d2..055d4f1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -13,7 +13,7 @@ void TalentExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create New Job\n9. View Job Opening\n10. Add Candidate\n11. UpdateCandidate Status\n12. View Shortlisted Candidate\n13. Update Profile\n14. Logout\nEnter your Choice: "; + std::cout << "Talent Executive Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create New Job\n9. View Job Opening\n10. Add Candidate\n11. UpdateCandidate Status\n12. View Shortlisted Candidate\n13. Update Profile\n14. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -75,6 +75,7 @@ bool TalentExecutiveMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index b085c52..5b709b8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -13,7 +13,7 @@ void TeamExecutiveMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Team\n9. Update Team\n10. Remove Team\n11. Assign Employee\n12. Unassign Employee\n13. View Teams\n14. Update Profile\n15. Logout\nEnter your Choice: "; + std::cout << "Team Executive Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Team\n9. Update Team\n10. Remove Team\n11. Assign Employee\n12. Unassign Employee\n13. View Teams\n14. Update Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -78,6 +78,7 @@ bool TeamExecutiveMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index d03c7f4..e32c751 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -13,7 +13,7 @@ void TeamLeadMenu::run() { int choice; util::clear(); - std::cout << "Zenvy - The HR Management System\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n4. Regularize Attendance\n15. Update Leave Request\n16. Update Profile\n17. Logout\nEnter your Choice: "; + std::cout << "Team Lead Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticke\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n4. Regularize Attendance\n15. Update Leave Request\n16. Update Profile\n17. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -84,6 +84,7 @@ bool TeamLeadMenu::handleOperation(int choice) return false; default: std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); } return true; } From eac6fa72dffc54f40030c6d07e89422bc6028ee8 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Fri, 10 Apr 2026 16:43:28 +0530 Subject: [PATCH 19/56] Added validation checks for employee creation SRS02 : Employee Management - Added helper function to check for existing active employee of a given type - Enforced business rule to allow only one active employee per non-general type - Added duplicate email validation before employee creation - Added duplicate phone number validation before employee creation Smitha Mohan --- .../services/EmployeeManagementService.cpp | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 3de8fcd..97297ad 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -13,8 +13,48 @@ #include "FileManager.h" #include "ApplicationConfig.h" +static bool hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const employeeMap& employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeeType() == employeeType && employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + return true; + } + } + return false; +} + +static bool isEmailDuplicate(const std::string& email, const employeeMap& employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeeEmail() == email) + { + return true; + } + } + return false; +} + +static bool isPhoneDuplicate(const std::string& phone, const employeeMap& employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeePhone() == phone) + { + return true; + } + } + return false; +} + void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { + auto& employees = m_dataStore.getEmployees(); std::shared_ptr authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); if (!authenticatedEmployee) { @@ -23,6 +63,10 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeType authenticatedEmployeeType = authenticatedEmployee->getEmployeeType(); std::shared_ptr employee; std::shared_ptr payroll; + if (employeeType != Enums::EmployeeType::GENERAL && 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"); @@ -31,6 +75,14 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, { throw std::runtime_error("Invalid Phone"); } + if (isEmailDuplicate(email, employees)) + { + throw std::runtime_error("Duplicate Email"); + } + if (isPhoneDuplicate(phone, employees)) + { + throw std::runtime_error("Duplicate Phone Number!"); + } switch (employeeType) { case Enums::EmployeeType::HR: @@ -42,7 +94,6 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Config::Payroll::HR_MANAGER_EMPLOYER_PF_CONTRIBUTION); employee = Factory::getObject(name, phone, email, payroll); break; - case Enums::EmployeeType::IT: case Enums::EmployeeType::FINANCE: case Enums::EmployeeType::TEAM: From c50700e70c6f41a7dc0c031899f5ccc2111367b7 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Fri, 10 Apr 2026 19:41:08 +0530 Subject: [PATCH 20/56] Added CSV header support and persistence for employees SRS02 : Employee Management - Added header handling in FileManager load by skipping first line during deserialization - Added support for writing headers using T::getHeaders() in FileManager save - Implemented getHeaders() for Employee and GeneralEmployee models - Added saveEmployees functionality in EmployeeManagementService - Added persistStates method in ZenvyController - Added deserialization failure check with exception handling - Minor formatting cleanup in FileIO Smitha Mohan --- .../Trenser.FileManager/FileIO.cpp | 3 +-- .../Trenser.FileManager/FileManager.h | 13 ++++++++++- .../controllers/ZenvyController.cpp | 5 ++++ .../controllers/ZenvyController.h | 1 + .../Trenser.Zenvy/models/Employee.cpp | 5 ++++ Trenser.Zenvy/Trenser.Zenvy/models/Employee.h | 1 + .../Trenser.Zenvy/models/GeneralEmployee.cpp | 5 ++++ .../Trenser.Zenvy/models/GeneralEmployee.h | 1 + .../services/EmployeeManagementService.cpp | 23 +++++++++++++++++++ .../services/EmployeeManagementService.h | 1 + .../Trenser.Zenvy/views/UserInterface.cpp | 9 ++++++++ 11 files changed, 64 insertions(+), 3 deletions(-) diff --git a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp index ac79d03..8697eb3 100644 --- a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp +++ b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp @@ -22,7 +22,6 @@ void FileIO::writeAllLines(const std::string& path, 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'; -} \ No newline at end of file +} diff --git a/Trenser.FileManager/Trenser.FileManager/FileManager.h b/Trenser.FileManager/Trenser.FileManager/FileManager.h index 50a9fbf..1c9f3b2 100644 --- a/Trenser.FileManager/Trenser.FileManager/FileManager.h +++ b/Trenser.FileManager/Trenser.FileManager/FileManager.h @@ -1,4 +1,5 @@ #pragma once +#include #include "FileIO.h" template using objects = std::map>; @@ -20,9 +21,19 @@ objects FileManager::load() { objects records; auto lines = FileIO::readAllLines(m_filePath); + bool isHeader = true; for (const auto& record : lines) { + if (isHeader) + { + isHeader = false; + continue; + } auto object = T::deserialize(record); + if (!object) + { + throw std::runtime_error("Failed to deserialize record"); + } records[object->getId()] = object; } return records; @@ -32,7 +43,7 @@ template void FileManager::save(const objects& records) { std::vector lines; - + lines.push_back(T::getHeaders()); for (const auto& recordPair : records) { lines.push_back(recordPair.second->serialize()); diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 7d587e6..9d21818 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -51,3 +51,8 @@ void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); } + +void ZenvyController::persistStates() +{ + m_employeeManagementService->saveEmployees(); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 2f8c137..1ed7415 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -56,4 +56,5 @@ public: //File Management void loadStates(); + void persistStates(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index f673458..fb6e023 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -263,3 +263,8 @@ std::shared_ptr Employee::deserialize(const std::string& record) return nullptr; } } + +std::string Employee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType"; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index 6900943..46657c1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -90,5 +90,6 @@ public: Enums::EmployeeType getEmployeeType() const; virtual std::string serialize() const; static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); virtual ~Employee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 455665b..2392097 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -58,4 +58,9 @@ std::shared_ptr GeneralEmployee::deserialize(const std::string& employeeDesignation, accountStatus ); +} + +std::string GeneralEmployee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType,EmployeeDesignation"; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 1277fff..61b1a06 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -43,5 +43,6 @@ public: void setDesignation(Enums::EmployeeDesignation designation); std::string serialize() const override; static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); ~GeneralEmployee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 97297ad..6dd1b45 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -1,3 +1,4 @@ +#include #include #include "EmployeeManagementService.h" #include "Factory.h" @@ -221,3 +222,25 @@ void EmployeeManagementService::loadEmployees() employees.emplace(std::make_pair(admin->getId(), admin)); } } + +void EmployeeManagementService::saveEmployees() +{ + FileManager employeeFileManager(Config::File::EMPLOYEES_FILE); + FileManager generalEmployeeFileManager(Config::File::GENERAL_EMPLOYEES_FILE); + const auto& allEmployees = m_dataStore.getEmployees(); + employeeMap employees; + std::map> generalEmployees; + for (auto& employeePair : allEmployees) + { + if (employeePair.second->getEmployeeType() == Enums::EmployeeType::GENERAL) + { + generalEmployees.emplace(employeePair.first, std::static_pointer_cast(employeePair.second)); + } + else + { + employees.emplace(employeePair); + } + } + employeeFileManager.save(employees); + generalEmployeeFileManager.save(generalEmployees); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index cb2daf5..03f3848 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -18,4 +18,5 @@ public: void updateProfile(const std::string&,const std::string&); std::shared_ptr getCurrentEmployee(); void loadEmployees(); + void saveEmployees(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp index 8c29245..ae98311 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp @@ -47,6 +47,15 @@ void UserInterface::run() util::pressEnter(); } } + try + { + m_controller->persistStates(); + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + return; + } } bool UserInterface::handleOperation(int choice) From 1d94f1680cae5f19d55a5fc5679518454134a3c5 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Fri, 10 Apr 2026 20:29:55 +0530 Subject: [PATCH 21/56] Refactored validation logic and centralized employee validators SRS02 : Employee Management - Moved employee validation logic (active type check, email and phone duplication) to Validator utility - Updated service to use util::hasActiveEmployeeOfType, util::isEmailDuplicate, and util::isPhoneDuplicate - Integrated validator usage in MenuHelper for input validation - Cleaned up formatting and minor inconsistencies Smitha Mohan --- .../services/EmployeeManagementService.cpp | 45 +---------- .../Trenser.Zenvy/utilities/Validator.cpp | 53 ++++++++++++- .../Trenser.Zenvy/utilities/Validator.h | 10 +++ .../Trenser.Zenvy/views/MenuHelper.h | 78 +++++++++++-------- 4 files changed, 111 insertions(+), 75 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 6dd1b45..4fe4ddc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -14,45 +14,6 @@ #include "FileManager.h" #include "ApplicationConfig.h" -static bool hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const employeeMap& employees) -{ - for (const auto& employeePair : employees) - { - const auto& employee = employeePair.second; - if (employee->getEmployeeType() == employeeType && employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) - { - return true; - } - } - return false; -} - -static bool isEmailDuplicate(const std::string& email, const employeeMap& employees) -{ - for (const auto& employeePair : employees) - { - const auto& employee = employeePair.second; - if (employee->getEmployeeEmail() == email) - { - return true; - } - } - return false; -} - -static bool isPhoneDuplicate(const std::string& phone, const employeeMap& employees) -{ - for (const auto& employeePair : employees) - { - const auto& employee = employeePair.second; - if (employee->getEmployeePhone() == phone) - { - return true; - } - } - return false; -} - 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(); @@ -64,7 +25,7 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeType authenticatedEmployeeType = authenticatedEmployee->getEmployeeType(); std::shared_ptr employee; std::shared_ptr payroll; - if (employeeType != Enums::EmployeeType::GENERAL && hasActiveEmployeeOfType(employeeType, employees)) + if (employeeType != Enums::EmployeeType::GENERAL && util::hasActiveEmployeeOfType(employeeType, employees)) { throw std::runtime_error("Cannot create more than one employee of type " + Enums::getEmployeeTypeString(employeeType)); } @@ -76,11 +37,11 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, { throw std::runtime_error("Invalid Phone"); } - if (isEmailDuplicate(email, employees)) + if (util::isEmailDuplicate(email, employees)) { throw std::runtime_error("Duplicate Email"); } - if (isPhoneDuplicate(phone, employees)) + if (util::isPhoneDuplicate(phone, employees)) { throw std::runtime_error("Duplicate Phone Number!"); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp index 9d14b40..dd52e33 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp @@ -1,6 +1,6 @@ -#include #include #include "Validator.h" +#include "Employee.h" #include "ApplicationConfig.h" bool util::isPhoneNumberValid(const std::string& phoneNumber) { @@ -69,3 +69,54 @@ bool util::isPasswordValid(const std::string& password) } return hasUpper && hasLower && hasDigit && hasSpecial; } + +bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std::map> & employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeeType() == employeeType && employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { + return true; + } + } + return false; +} + +bool util::isEmailDuplicate(const std::string& email, const std::map>& employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeeEmail() == email) + { + return true; + } + } + return false; +} + +bool util::isPhoneDuplicate(const std::string& phone, const std::map>& employees) +{ + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeePhone() == phone) + { + return true; + } + } + return false; +} + +bool util::isPhoneDuplicate(const std::string& phone, const std::vector>& employees) +{ + for (const auto& employee : employees) + { + if (employee->getEmployeePhone() == phone) + { + return true; + } + } + return false; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h index fbdf962..588b820 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h @@ -1,11 +1,21 @@ #pragma once #include +#include +#include +#include #include #include +#include "Enums.h" + +class Employee; namespace util { bool isPhoneNumberValid(const std::string&); bool isEmailValid(const std::string&); bool isPasswordValid(const std::string&); + bool hasActiveEmployeeOfType(Enums::EmployeeType, const std::map>&); + bool isEmailDuplicate(const std::string&, const std::map>&); + bool isPhoneDuplicate(const std::string&, const std::map>&); + bool isPhoneDuplicate(const std::string&, const std::vector>&); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index b861d6a..aef9716 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -9,45 +9,59 @@ #include "MenuHelper.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "Validator.h" #include "Enums.h" void createEmployee(std::shared_ptr controller); inline void updateProfile(std::shared_ptr m_zenvyController) { - int choice; - std::string name, phone; - name = m_zenvyController->getCurrentEmployee()->getEmployeeName(); - phone = m_zenvyController->getCurrentEmployee()->getEmployeePhone(); - while (true) + 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"; - break; - case 2: - std::cout << "Enter your updated phone Number :"; - util::read(phone); - m_zenvyController->updateProfile(name, phone); - std::cout << "Profile Updated Successfully\n"; - break; - case 3: - return; - default: - std::cout << "Enter a valid choice!" << std::endl; - break; - } + 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; + } } } From 47b44ccaa02378bf9e9e6e0bdf9f3db6198666bc Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Sat, 11 Apr 2026 12:13:23 +0530 Subject: [PATCH 22/56] 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(); From 66c80fd055cfd665d93a42f047522adf7768e85d Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Sat, 11 Apr 2026 12:58:09 +0530 Subject: [PATCH 23/56] Fixed payroll ID handling and improved payroll update flow SRS02 : Employee Management - Fixed Payroll constructor to use given ID during deserialization - Cleaned up salary update logic in PayslipManagementService - Improved employee selection display in Finance menu - Added employee type column in selection list - Fixed typo in Employee menu (Ticket) - Added confirmation message after payroll update Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp | 2 +- .../services/PayslipManagementService.cpp | 11 ++++++----- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 2 +- .../views/FinanceExecutiveMenu.cpp | 17 ++++++++++++----- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index aacf36e..3291519 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -13,7 +13,7 @@ Payroll::Payroll(const std::string& id, double foodAllowance, double employeePFContribution, double employerPFContribution) - : m_id("PR" + std::to_string(++m_uid)), + : m_id(id), m_employeeId(employeeId), m_basicSalary(basicSalary), m_houseRentAllowance(houseRentAllowance), diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index dd6bc1c..ecc326d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -11,11 +11,12 @@ void PayslipManagementService::updateSalary(const std::string& employeeId, doubl auto employee = m_dataStore.getEmployees().find(employeeId); if (employee != m_dataStore.getEmployees().end() && employee->second->getEmployeeType() != Enums::EmployeeType::ADMIN) { - (employee->second)->getPayroll()->setBasicSalary(basicSalary); - (employee->second)->getPayroll()->setHouseRentAllowance(houseRentAllowance); - (employee->second)->getPayroll()->setFoodAllowance(foodAllowance); - (employee->second)->getPayroll()->setEmployeePFContribution(employeePFContribution); - (employee->second)->getPayroll()->setEmployerPFContribution(employerPFContribution); + auto payroll = employee->second->getPayroll(); + payroll->setBasicSalary(basicSalary); + payroll->setHouseRentAllowance(houseRentAllowance); + payroll->setFoodAllowance(foodAllowance); + payroll->setEmployeePFContribution(employeePFContribution); + payroll->setEmployerPFContribution(employerPFContribution); } else { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index e54b282..7673756 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -13,7 +13,7 @@ void EmployeeMenu::run() { int choice; util::clear(); - std::cout << "Employee 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\n14. Update Profile\n15. Logout\nEnter your Choice: "; + std::cout << "Employee Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. Raise Ticket\n5. View Ticket\n6. View Ticket History\n7. View Employees\n8. Search Employee\n9. View Team Members\n10. Book Meeting Room\n11. View Booking History\n12. View Notification\n13. View Announcements\n14. Update Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 28c7f74..428fce9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -34,6 +34,8 @@ std::string FinanceExecutiveMenu::getSelectedUserId() std::map> employeeList; int index = 0; auto allEmployees = m_zenvyController->getEmployees(); + util::clear(); + std::cout << "Select the Employee\n"; for (auto& currentEmployee : allEmployees) { if (currentEmployee->getEmployeeType() == Enums::EmployeeType::ADMIN) @@ -43,14 +45,16 @@ std::string FinanceExecutiveMenu::getSelectedUserId() employeeList[++index] = currentEmployee; } std::cout << std::left - << std::setw(6) << "Index" - << std::setw(15) << "Employee Id" - << std::setw(25) << "Name" << std::endl; + << 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(6) << employee.first + std::cout << std::left << std::setw(10) << employee.first << std::setw(15) << employee.second->getId() - << std::setw(25) << employee.second->getEmployeeName() + << std::setw(20) << employee.second->getEmployeeName() + << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()) << std::endl; } std::cout << "Enter the Index: "; @@ -71,6 +75,7 @@ void FinanceExecutiveMenu::updatePayroll() std::string employeeId; double basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution; employeeId = getSelectedUserId(); + util::clear(); if (employeeId != "") { std::cout << "Enter the New Basic Salary: "; util::read(basicSalary); @@ -83,6 +88,8 @@ void FinanceExecutiveMenu::updatePayroll() std::cout << "Enter the New EmplyerPFContribution: "; 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"); From aa21853a653315d69bde5fcca6ba62a05651e134 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Sat, 11 Apr 2026 14:59:41 +0530 Subject: [PATCH 24/56] Refactored employee selection and cleaned up menu logic SRS02 : Employee Management - Removed getSelectedUserId() from FinanceExecutiveMenu - Added reusable selectEmployeeId() in MenuHelper - Simplified deactivateEmployee() using common selection logic - Fixed missing break in HRManagerMenu Smitha Mohan --- .../views/FinanceExecutiveMenu.cpp | 44 +---------- .../views/FinanceExecutiveMenu.h | 1 - .../Trenser.Zenvy/views/HRManagerMenu.cpp | 1 + .../Trenser.Zenvy/views/MenuHelper.cpp | 1 + .../Trenser.Zenvy/views/MenuHelper.h | 73 +++++++++---------- 5 files changed, 38 insertions(+), 82 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 428fce9..9563f5e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -28,53 +28,11 @@ void FinanceExecutiveMenu::run() } } -std::string FinanceExecutiveMenu::getSelectedUserId() -{ - int choice; - std::map> employeeList; - int index = 0; - auto allEmployees = m_zenvyController->getEmployees(); - 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"); - } -} - void FinanceExecutiveMenu::updatePayroll() { std::string employeeId; double basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution; - employeeId = getSelectedUserId(); + employeeId = selectEmployeeId(m_zenvyController->getEmployees()); util::clear(); if (employeeId != "") { std::cout << "Enter the New Basic Salary: "; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 1b3ad71..a5a2016 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -13,7 +13,6 @@ public: FinanceExecutiveMenu() : m_zenvyController(std::make_shared()) {}; void run(); bool handleOperation(int); - std::string getSelectedUserId(); void updatePayroll(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 654997c..541527e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -70,6 +70,7 @@ bool HRManagerMenu::handleOperation(int choice) break; case 13: deactivateEmployee(m_zenvyController); + break; case 14: return false; default: diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index d183fdf..37da2d2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -100,4 +100,5 @@ void createEmployee(std::shared_ptr controller) util::read(phone); controller->createEmployee(employeeType, employeeDesignation, email, name, phone); std::cout << "\nCreated Employee Successfully."; + util::pressEnter(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index aef9716..a4c2fff 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -65,60 +65,57 @@ inline void updateProfile(std::shared_ptr m_zenvyController) } } -inline std::map> listEmployees(const std::shared_ptr& controller) +inline std::string selectEmployeeId(std::vector> allEmployees) { - auto employees = controller->getEmployees(); + int choice; std::map> employeeList; + int index = 0; + util::clear(); + std::cout << "Select the Employee\n"; + for (auto& currentEmployee : allEmployees) + { + if (currentEmployee->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + continue; + } + employeeList[++index] = currentEmployee; + } std::cout << std::left - << std::setw(5) << "Index" - << std::setw(15) << "ID" - << std::setw(25) << "Name" - << "\n"; - int index = 1; - for (auto& activeEmployees : employees) + << 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(5) << index - << std::setw(15) << activeEmployees->getId() - << std::setw(25) << activeEmployees->getEmployeeName() - << "\n"; - employeeList[index] = activeEmployees; - ++index; + 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; } - if (employeeList.empty()) + std::cout << "Enter the Index: "; + util::read(choice); + auto employeeIterator = employeeList.find(choice); + if (employeeIterator != employeeList.end()) { - std::cout << "No active employees available.\n"; + return (employeeIterator->second->getId()); + } + else + { + throw std::runtime_error("Invalid Index"); } - return employeeList; } inline void deactivateEmployee(const std::shared_ptr& controller) { - auto employeeList = listEmployees(controller); - if (employeeList.empty()) - { - return; - } - int choice; - util::clear(); - std::cout << "\nEnter the index of the employee to deactivate: "; - util::read(choice); - auto iterator = employeeList.find(choice); - if (iterator != employeeList.end()) - { - std::string id = iterator->second->getId(); - bool success = controller->deactivateEmployee(id); - if (success) + if(controller->deactivateEmployee(selectEmployeeId(controller->getEmployees()))) { std::cout << "Employee deactivated successfully\n"; + util::pressEnter(); } else { std::cout << "Employee not found\n"; + util::pressEnter(); } - } - else - { - std::cout << "Invalid index.\n"; - } } From 282ab721b5bd69843850306bec9af827d8c6fac5 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Sat, 11 Apr 2026 17:54:20 +0530 Subject: [PATCH 25/56] Improved employee view formatting and menu text SRS02 : Employee Management - Updated "View Employee" to "View Employees" in Admin Menu - Added clear screen and header for employee list display - Improved column spacing and alignment for better readability - Reordered fields for a cleaner layout - Added pressEnter prompt after viewing employees Smitha Mohan --- .../Trenser.Zenvy/views/AdminMenu.cpp | 2 +- .../Trenser.Zenvy/views/MenuHelper.h | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index df11eea..59bbadc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -13,7 +13,7 @@ void AdminMenu::run() { int choice; util::clear(); - std::cout << "Admin Menu\n1. Create User\n2. View Employee\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Logout\nEnter your Choice: "; + std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 2165868..ae51660 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -122,29 +122,33 @@ inline void deactivateEmployee(const std::shared_ptr& controlle inline void viewEmployees(std::shared_ptr m_zenvyController) { + util::clear(); + std::cout << "Employee List\n"; auto employees = m_zenvyController->getEmployees(); if (employees.empty()) { std::cout << "No employees found\n"; + util::pressEnter(); return; } std::cout << std::left - << std::setw(10) << "EMPID" - << std::setw(20) << "Name" - << std::setw(15) << "Role" - << std::setw(10) << "TeamId" + << 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(10) << iterator->getId() - << std::setw(20) << iterator->getEmployeeName() - << std::setw(15) << Enums::getEmployeeTypeString(iterator->getEmployeeType()) - << std::setw(10) << iterator->getEmployeeTeamId() + << 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(); } From ed1cf4e30668ea10e9d41bd21a4cbe517165b08e Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Mon, 13 Apr 2026 11:46:55 +0530 Subject: [PATCH 26/56] Minor fixes and formatting updates in payroll, enums, and menus SRS02 : Employee Management - Fixed variable naming issue in Payroll deserialization - Added braces for consistency in enum string-to-value helpers - Improved readability in validation logic - Corrected typo in Finance Executive payroll menu text Smitha Mohan --- .../Trenser.Zenvy/models/Payroll.cpp | 6 ++-- Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 28 +++++++++++++++++++ .../Trenser.Zenvy/utilities/Validator.cpp | 5 +++- .../views/FinanceExecutiveMenu.cpp | 2 +- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index 3291519..b145a4f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -109,11 +109,11 @@ std::string Payroll::serialize() const std::shared_ptr Payroll::deserialize(const std::string& record) { std::string id, employeeId; - std::string basicSalaryStr, houseRentAllowanceString, foodAllowanceString, employeePFString, employerPFString; + std::string basicSalaryString, houseRentAllowanceString, foodAllowanceString, employeePFString, employerPFString; std::istringstream serializedPayroll(record); std::getline(serializedPayroll, id, ','); std::getline(serializedPayroll, employeeId, ','); - std::getline(serializedPayroll, basicSalaryStr, ','); + std::getline(serializedPayroll, basicSalaryString, ','); std::getline(serializedPayroll, houseRentAllowanceString, ','); std::getline(serializedPayroll, foodAllowanceString, ','); std::getline(serializedPayroll, employeePFString, ','); @@ -121,7 +121,7 @@ std::shared_ptr Payroll::deserialize(const std::string& record) try { - double basicSalary = std::stod(basicSalaryStr); + double basicSalary = std::stod(basicSalaryString); double houseRentAllowance = std::stod(houseRentAllowanceString); double foodAllowance = std::stod(foodAllowanceString); double employeePFContribution = std::stod(employeePFString); diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 2021b68..d54cb0b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -162,48 +162,76 @@ namespace Enums { inline AccountStatus getAccountStatus(const std::string& input) { if (input == "ACTIVE") + { return AccountStatus::ACTIVE; + } if (input == "INACTIVE") + { return AccountStatus::INACTIVE; + } return AccountStatus::INACTIVE; } inline EmployeeType getEmployeeType(const std::string& input) { if (input == "GENERAL") + { return EmployeeType::GENERAL; + } if (input == "IT") + { return EmployeeType::IT; + } if (input == "FINANCE") + { return EmployeeType::FINANCE; + } if (input == "TALENT_ACQUISITION") + { return EmployeeType::TALENT_ACQUISITION; + } if (input == "HR") + { return EmployeeType::HR; + } if (input == "TEAM") + { return EmployeeType::TEAM; + } if (input == "ADMIN") + { return EmployeeType::ADMIN; + } return EmployeeType::INVALID; } inline TeamStatus getTeamStatus(const std::string& str) { if (str == "IN_TEAM") + { return TeamStatus::IN_TEAM; + } if (str == "NOT_IN_TEAM") + { return TeamStatus::NOT_IN_TEAM; + } return TeamStatus::NOT_IN_TEAM; } inline EmployeeDesignation getEmployeeDesignation(const std::string& input) { if (input == "JUNIOR") + { return EmployeeDesignation::JUNIOR; + } if (input == "SENIOR") + { return EmployeeDesignation::SENIOR; + } if (input == "TEAM_LEAD") + { return EmployeeDesignation::TEAM_LEAD; + } return EmployeeDesignation::INVALID; } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp index dd52e33..ee99e68 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp @@ -18,7 +18,10 @@ bool util::isPhoneNumberValid(const std::string& phoneNumber) { bool util::isEmailValid(const std::string& email) { size_t index = email.find('@'); - if (index == std::string::npos) return false; + if (index == std::string::npos) + { + return false; + } if (email.find('@', index + 1) != std::string::npos) { return false; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index bc8db4e..4702ff3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -43,7 +43,7 @@ void FinanceExecutiveMenu::updatePayroll() util::read(foodAllowance); std::cout << "Enter the New EmployeePFContribution: "; util::read(employeePFContribution); - std::cout << "Enter the New EmplyerPFContribution: "; + std::cout << "Enter the New EmployerPFContribution: "; util::read(employerPFContribution); m_zenvyController->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); std::cout << "Payroll Updated"; From 7ffaae37525b91076a8b54d1e1007cdf1919cc41 Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Mon, 13 Apr 2026 17:08:47 +0530 Subject: [PATCH 27/56] Updated Menu Helper EMP006 : Search Employee - Updated searchEmployee method logic in MenuHelper.h helper file. Smitha Mohan --- .../Trenser.Zenvy/views/MenuHelper.h | 79 +++++++++++-------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 2d6e595..4c84538 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -154,28 +154,6 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) util::pressEnter(); } -static void displayPayroll(std::shared_ptr payroll) -{ - std::cout << std::left - << std::setw(10) << payroll->getId() - << std::setw(10) << payroll->getBasicSalary() - << std::setw(10) << payroll->getEmployeePFContribution() - << std::setw(10) << payroll->getEmployerPFContribution() - << std::setw(10) << payroll->getFoodAllowance() - << std::setw(10) << payroll->getHouseRentAllowance() - << std::endl; -} - -static void filterSearchResults(Enums::EmployeeType type, std::shared_ptr employee) -{ - switch (type) - { - case Enums::EmployeeType::FINANCE: - displayPayroll(employee->getPayroll()); - break; - } -} - inline void searchEmployee(std::shared_ptr& m_zenvyController) { std::string name; @@ -185,15 +163,27 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) std::pair>> searchResults = m_zenvyController->searchEmployee(name); if (!(searchResults.second).empty()) { - std::cout << std::left - << std::setw(10) << "ID" - << std::setw(20) << "Name" - << std::setw(25) << "Email" - << std::setw(15) << "Phone" - << std::setw(15) << "Type" - << std::setw(15) << "Team Status" - << std::setw(10) << "Team ID" - << std::endl; + std::cout << std::left + << std::setw(10) << "ID" + << std::setw(20) << "Name" + << std::setw(25) << "Email" + << std::setw(15) << "Phone" + << std::setw(20) << "Type" + << std::setw(20) << "TeamStatus" + << std::setw(15) << "TeamID"; + if (searchResults.first == Enums::EmployeeType::FINANCE + || searchResults.first == Enums::EmployeeType::HR + || searchResults.first == Enums::EmployeeType::ADMIN) + { + std::cout << std::left + << std::setw(17) << "PayrollID" + << std::setw(20) << "BasicSalary" + << std::setw(15) << "EmployeePF" + << std::setw(15) << "EmployerPF" + << std::setw(15) << "FoodAllowance" + << std::setw(15) << "HouseRentAllowance"; + } + std::cout << std::endl; for (const auto& employee : searchResults.second) { if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) @@ -203,10 +193,29 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) << std::setw(20) << employee->getEmployeeName() << std::setw(25) << employee->getEmployeeEmail() << std::setw(15) << employee->getEmployeePhone() - << std::setw(15) << Enums::getEmployeeTypeString(employee->getEmployeeType()) - << std::setw(15) << Enums::getTeamStatusString(employee->getEmployeeTeamStatus()) - << std::setw(10) << employee->getEmployeeTeamId(); - filterSearchResults(searchResults.first, employee); + << std::setw(20) << Enums::getEmployeeTypeString(employee->getEmployeeType()) + << std::setw(20) << Enums::getTeamStatusString(employee->getEmployeeTeamStatus()); + if (employee->getEmployeeTeamId() == "") + { + std::cout << std::setw(15) << "NULL"; + } + else + { + std::cout << std::setw(15) << employee->getEmployeeTeamId(); + } + if (searchResults.first == Enums::EmployeeType::FINANCE + || searchResults.first == Enums::EmployeeType::HR + || searchResults.first == Enums::EmployeeType::ADMIN) + { + std::cout << std::left + << std::setw(17) << employee->getPayroll()->getId() + << std::setw(20) << employee->getPayroll()->getBasicSalary() + << std::setw(15) << employee->getPayroll()->getEmployeePFContribution() + << std::setw(15) << employee->getPayroll()->getEmployerPFContribution() + << std::setw(15) << employee->getPayroll()->getFoodAllowance() + << std::setw(15) << employee->getPayroll()->getHouseRentAllowance(); + } + std::cout << std::endl; } } } From 07f547dce78c1c07afc676197f8a869b49f46671 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Mon, 13 Apr 2026 18:28:22 +0530 Subject: [PATCH 28/56] Minor fixes in employee listing and menus SRS02 : Employee Management - Sorted active employees by ID when listing - Handled empty employee lists in menus - Stopped deactivation when no employee is selected - Showed "NULL" when team ID is missing - Removed unnecessary error throw in payroll menu Smitha Mohan --- .../services/EmployeeManagementService.cpp | 21 +++++++++--- .../views/FinanceExecutiveMenu.cpp | 3 -- .../Trenser.Zenvy/views/MenuHelper.h | 33 ++++++++++++------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 09906fd..b6376ab 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "EmployeeManagementService.h" #include "Factory.h" @@ -13,6 +14,7 @@ #include "GeneralEmployee.h" #include "FileManager.h" #include "ApplicationConfig.h" +#include "StringHelper.h" void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { @@ -132,20 +134,31 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) Employees EmployeeManagementService::getEmployees() { - Employees result; + Employees activeEmployees; auto& employees = m_dataStore.getEmployees(); if (employees.size() <= 0) { - return result; + return activeEmployees; } for (const auto& iterator : employees) { if (iterator.second->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) { - result.push_back(iterator.second); + activeEmployees.push_back(iterator.second); } } - return result; + std::sort( + activeEmployees.begin(), + activeEmployees.end(), + [](std::shared_ptr employeeOne, + std::shared_ptr employeeTwo) -> bool + { + int employeeOneId = util::extractNumber(employeeOne->getId()); + int employeeTwoId = util::extractNumber(employeeTwo->getId()); + return employeeOneId < employeeTwoId; + } + ); + return activeEmployees; } std::shared_ptr EmployeeManagementService::getCurrentEmployee() diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 3626596..396603f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -49,9 +49,6 @@ void FinanceExecutiveMenu::updatePayroll() std::cout << "Payroll Updated"; util::pressEnter(); } - else { - throw std::runtime_error("Unexpected error occured"); - } } bool FinanceExecutiveMenu::handleOperation(int choice) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 4c84538..1b7aac7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -72,6 +72,12 @@ inline std::string selectEmployeeId(std::vector> std::map> employeeList; int index = 0; util::clear(); + if (allEmployees.empty()) + { + std::cout << "No employees found!"; + util::pressEnter(); + return ""; + } std::cout << "Select the Employee\n"; for (auto& currentEmployee : allEmployees) { @@ -109,16 +115,21 @@ inline std::string selectEmployeeId(std::vector> inline void deactivateEmployee(const std::shared_ptr& controller) { - if(controller->deactivateEmployee(selectEmployeeId(controller->getEmployees()))) - { - std::cout << "Employee deactivated successfully\n"; - util::pressEnter(); - } - else - { - std::cout << "Employee not found\n"; - util::pressEnter(); - } + std::string selectedEmployeeId = selectEmployeeId(controller->getEmployees()); + if (selectedEmployeeId.empty()) + { + return; + } + if(controller->deactivateEmployee(selectedEmployeeId)) + { + std::cout << "Employee deactivated successfully\n"; + util::pressEnter(); + } + else + { + std::cout << "Employee not found\n"; + util::pressEnter(); + } } inline void viewEmployees(std::shared_ptr m_zenvyController) @@ -148,7 +159,7 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) << std::setw(25) << Enums::getEmployeeTypeString(iterator->getEmployeeType()) << std::setw(25) << iterator->getEmployeeEmail() << std::setw(15) << iterator->getEmployeePhone() - << std::setw(10) << iterator->getEmployeeTeamId() + << std::setw(10) << (iterator->getEmployeeTeamId().empty() ? "NULL" : iterator->getEmployeeTeamId()) << std::endl; } util::pressEnter(); From 8447935fe4897fc63adf3c4d7085c37c2bead814 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Mon, 13 Apr 2026 22:43:48 +0530 Subject: [PATCH 29/56] Refactor employee fetch with type filter and login check SRS02 : Employee Management - Removed old getEmployees() implementation - Added templated getEmployees(...) for filtering by employee type - Default now skips admin and returns only active employees - Blocked login for inactive employees with proper error Smitha Mohan --- .../controllers/ZenvyController.cpp | 5 --- .../controllers/ZenvyController.h | 7 +++- .../AuthenticationManagementService.cpp | 4 ++ .../services/EmployeeManagementService.cpp | 30 -------------- .../services/EmployeeManagementService.h | 39 ++++++++++++++++++- 5 files changed, 48 insertions(+), 37 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index bc34097..da75688 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -47,11 +47,6 @@ std::shared_ptr ZenvyController::getCurrentEmployee() return m_employeeManagementService->getCurrentEmployee(); } -Employees ZenvyController::getEmployees() -{ - return m_employeeManagementService->getEmployees(); -} - void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 424e386..c2bcc84 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -47,11 +47,16 @@ public: //Employee Management void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); - Employees getEmployees(); std::shared_ptr getCurrentEmployee(); void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); + template + Employees getEmployees(Types ...types) + { + return m_employeeManagementService->getEmployees(types...); + } + //Payslip management void updateSalary(const std::string&, double, double, double, double, double); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp index 613cc90..ccb90fb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp @@ -14,6 +14,10 @@ AuthenticationDTO AuthenticationManagementService::login(const std::string& emai { if (employee.second->getEmployeePassword() == password) { + if (employee.second->getEmployeeAccountStatus() == Enums::AccountStatus::INACTIVE) + { + throw std::runtime_error("Your account has been disabled! Please contact your Administrator."); + } if (password == Config::Authentication::DEFAULT_PASSWORD) { loginStatus = Enums::LoginStatus::FIRST_LOGIN; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index b6376ab..5f639da 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -14,7 +14,6 @@ #include "GeneralEmployee.h" #include "FileManager.h" #include "ApplicationConfig.h" -#include "StringHelper.h" void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { @@ -132,35 +131,6 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) return true; } -Employees EmployeeManagementService::getEmployees() -{ - Employees activeEmployees; - auto& employees = m_dataStore.getEmployees(); - if (employees.size() <= 0) - { - return activeEmployees; - } - for (const auto& iterator : employees) - { - if (iterator.second->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) - { - activeEmployees.push_back(iterator.second); - } - } - std::sort( - activeEmployees.begin(), - activeEmployees.end(), - [](std::shared_ptr employeeOne, - std::shared_ptr employeeTwo) -> bool - { - int employeeOneId = util::extractNumber(employeeOne->getId()); - int employeeTwoId = util::extractNumber(employeeTwo->getId()); - return employeeOneId < employeeTwoId; - } - ); - return activeEmployees; -} - std::shared_ptr EmployeeManagementService::getCurrentEmployee() { return m_dataStore.getAuthenticatedEmployee(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 8c24d2b..4551b6f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -5,6 +5,7 @@ #include #include "DataStore.h" #include "Enums.h" +#include "StringHelper.h" using Employees = std::vector>; @@ -16,10 +17,46 @@ public: EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); - Employees getEmployees(); void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); void loadEmployees(); void saveEmployees(); + + template + Employees getEmployees(Types... types) + { + Employees filteredEmployees; + const auto& employees = m_dataStore.getEmployees(); + std::vector filterTypes = { types... }; + for (const auto& employeePair : employees) + { + const auto& employee = employeePair.second; + if (employee->getEmployeeAccountStatus() != Enums::AccountStatus::ACTIVE) + continue; + auto employeeType = employee->getEmployeeType(); + if (filterTypes.empty()) + { + if (employeeType == Enums::EmployeeType::ADMIN) + continue; + } + else + { + if (std::find(filterTypes.begin(), filterTypes.end(), employeeType) == filterTypes.end()) + continue; + } + filteredEmployees.push_back(employee); + } + std::sort( + filteredEmployees.begin(), + filteredEmployees.end(), + [](const std::shared_ptr& employeeOne, + const std::shared_ptr& employeeTwo) + { + return util::extractNumber(employeeOne->getId()) < + util::extractNumber(employeeTwo->getId()); + } + ); + return filteredEmployees; + } }; From f5adcdea30f6173106278664333bc61caf0e0041 Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Tue, 14 Apr 2026 13:41:50 +0530 Subject: [PATCH 30/56] Implement View Employee Profile EMP003: View Employee Profile - Added `viewProfile` method in MenuHelper to display employee details including ID, name, role, email, phone, team, and payroll. - Integrated `viewProfile(m_zenvyController)` into all role-specific menus (Employee, Finance Executive, HR Manager, IT Executive, Talent Executive, Team Lead). - Implemented safe downcasting for `GeneralEmployee` to access designation details. - Enhanced output formatting with section headers and null checks for team ID and payroll. - Improved error handling with runtime exception when employee record is missing. Smitha Mohan --- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 5 ++- .../views/FinanceExecutiveMenu.cpp | 5 ++- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 5 ++- .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 5 ++- .../Trenser.Zenvy/views/MenuHelper.h | 43 +++++++++++++++++++ .../views/TalentExecutiveMenu.cpp | 5 ++- .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 5 ++- .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 5 ++- 8 files changed, 71 insertions(+), 7 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 98be55b..a2f2a56 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -14,7 +14,7 @@ void EmployeeMenu::run() { int choice; util::clear(); - 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: "; + 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. View Profile\n16. Exit\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -62,6 +62,9 @@ bool EmployeeMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 15: + viewProfile(m_zenvyController); + break; + case 16: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 396603f..70885aa 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -13,7 +13,7 @@ void FinanceExecutiveMenu::run() { int choice; util::clear(); - 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: "; + 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. View Profile \n13. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -68,6 +68,9 @@ bool FinanceExecutiveMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 12: + viewProfile(m_zenvyController); + break; + case 13: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index bcf6ce8..0709976 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -13,7 +13,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. 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. View Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -48,6 +48,9 @@ bool HRManagerMenu::handleOperation(int choice) deactivateEmployee(m_zenvyController); break; case 14: + viewProfile(m_zenvyController); + break; + case 15: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index f9aa3d3..d691228 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -13,7 +13,7 @@ void ITExecutiveMenu::run() { int choice; util::clear(); - 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: "; + 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. View Profile\n11. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -42,6 +42,9 @@ bool ITExecutiveMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 10: + viewProfile(m_zenvyController); + break; + case 11: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 1b7aac7..0d048cd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -15,6 +15,49 @@ void createEmployee(std::shared_ptr controller); +inline void viewProfile(std::shared_ptr controller) +{ + util::clear(); + std::shared_ptr currentEmployee = controller->getCurrentEmployee(); + if (currentEmployee) + { + std::cout << std::left + << "Employee ID: " << currentEmployee->getId() << std::endl + << "Name: " << currentEmployee->getEmployeeName() << std::endl + << "Role: " << Enums::getEmployeeTypeString(currentEmployee->getEmployeeType()) << std::endl + << "Email: " << currentEmployee->getEmployeeEmail() << std::endl + << "Phone: " << currentEmployee->getEmployeePhone() << std::endl; + if (currentEmployee->getEmployeeType() == Enums::EmployeeType::GENERAL) { + if (auto generalEmployee = std::dynamic_pointer_cast(currentEmployee)) + { + std::cout << "Designation: " << Enums::getEmployeeDesignationString(generalEmployee->getDesignation()) << std::endl; + } + } + std::cout << "Team ID: " << (currentEmployee->getEmployeeTeamId().empty() ? "NULL " : (currentEmployee->getEmployeeTeamId())) << std::endl + << "Team Status: " << Enums::getTeamStatusString(currentEmployee->getEmployeeTeamStatus()) << std::endl; + if (auto payroll = currentEmployee->getPayroll()) + { + std::cout << std::endl + << "Payroll Details" << std::endl + << "Payroll ID: " << payroll->getId() << std::endl + << "Basic Salary: " << payroll->getBasicSalary() << std::endl + << "Employee PF Contribution: " << payroll->getEmployeePFContribution() << std::endl + << "Employer PF Contribution: " << payroll->getEmployerPFContribution() << std::endl + << "Food Allowance: " << payroll->getFoodAllowance() << std::endl + << "House Rent Allowance: " << payroll->getHouseRentAllowance() << std::endl; + } + else + { + std::cout << "Unable to fetch the payroll details\n"; + } + util::pressEnter(); + } + else + { + throw std::runtime_error("Unexpected Error Occured"); + } +} + inline void updateProfile(std::shared_ptr m_zenvyController) { int choice; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 18afc15..1c28319 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -13,7 +13,7 @@ void TalentExecutiveMenu::run() { int choice; util::clear(); - 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: "; + 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. View Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -42,6 +42,9 @@ bool TalentExecutiveMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 14: + viewProfile(m_zenvyController); + break; + case 15: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index d0fd1f9..89ebf9d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -13,7 +13,7 @@ void TeamExecutiveMenu::run() { int choice; util::clear(); - 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: "; + 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. View Profile\n16. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -42,6 +42,9 @@ bool TeamExecutiveMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 15: + viewProfile(m_zenvyController); + break; + case 16: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 694b509..0084158 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -13,7 +13,7 @@ void TeamLeadMenu::run() { int choice; util::clear(); - 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: "; + 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. View Profile\n18. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -42,6 +42,9 @@ bool TeamLeadMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 17: + viewProfile(m_zenvyController); + break; + case 18: return false; default: std::cout << "Enter a valid choice!" << std::endl; From 06d3760663fff8ba7c4af0cf0c15db16d61e94d0 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Tue, 14 Apr 2026 17:09:29 +0530 Subject: [PATCH 31/56] Implement Review Fixes EMP003 : View Profile - Avoid unecessary copies. Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 0d048cd..09b084e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -35,7 +35,7 @@ inline void viewProfile(std::shared_ptr controller) } std::cout << "Team ID: " << (currentEmployee->getEmployeeTeamId().empty() ? "NULL " : (currentEmployee->getEmployeeTeamId())) << std::endl << "Team Status: " << Enums::getTeamStatusString(currentEmployee->getEmployeeTeamStatus()) << std::endl; - if (auto payroll = currentEmployee->getPayroll()) + if (const auto& payroll = currentEmployee->getPayroll()) { std::cout << std::endl << "Payroll Details" << std::endl From 454cd2d342f2b00133bbad49f8398d8c7f05f73b Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Tue, 14 Apr 2026 14:58:33 +0530 Subject: [PATCH 32/56] Implement Payslip Generation Feature EMP009 : Generate Payslips - Updated Payslip model to store employee, salary, and date details - Added payslip storage to DataStore and file load/save support - Added logic to generate payslips once per month per employee - Restricted payslip generation to finance role - Linked payslips to employees during load and creation - Added month, year, and day helpers to Timestamp - Added payslip generation option to Finance Executive menu Smitha Mohan --- .../controllers/ZenvyController.cpp | 12 ++- .../controllers/ZenvyController.h | 1 + .../Trenser.Zenvy/datastores/DataStore.cpp | 5 ++ .../Trenser.Zenvy/datastores/DataStore.h | 4 + .../Trenser.Zenvy/models/Employee.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 2 +- .../Trenser.Zenvy/models/Payslip.cpp | 75 ++++++++++++++++++- Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h | 19 ++++- .../services/ApplicationConfig.h | 1 + .../services/PayslipManagementService.cpp | 65 +++++++++++++++- .../services/PayslipManagementService.h | 3 + .../Trenser.Zenvy/utilities/Timestamp.cpp | 21 ++++++ .../Trenser.Zenvy/utilities/Timestamp.h | 3 + .../views/FinanceExecutiveMenu.cpp | 15 +++- .../views/FinanceExecutiveMenu.h | 1 + 15 files changed, 218 insertions(+), 11 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index da75688..aced692 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -37,24 +37,32 @@ std::pair>> Zen return m_employeeManagementService->searchEmployee(name); } +std::shared_ptr ZenvyController::getCurrentEmployee() +{ + return m_employeeManagementService->getCurrentEmployee(); +} + +//Payslip Management void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { m_payslipManagementService->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); } -std::shared_ptr ZenvyController::getCurrentEmployee() +void ZenvyController::generatePayslips() { - return m_employeeManagementService->getCurrentEmployee(); + m_payslipManagementService->generatePayslips(); } void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); m_payslipManagementService->loadPayrolls(); + m_payslipManagementService->loadPayslips(); } void ZenvyController::persistStates() { m_employeeManagementService->saveEmployees(); m_payslipManagementService->savePayrolls(); + m_payslipManagementService->savePayslips(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index c2bcc84..56140de 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -59,6 +59,7 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); + void generatePayslips(); //File Management void loadStates(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index dadcfdc..fe9dad4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -31,3 +31,8 @@ payrollMap& DataStore::getPayrolls() { return m_payrolls; } + +payslipMap& DataStore::getPayslips() +{ + return m_payslips; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index d05d5f4..9f79fc8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -19,9 +19,11 @@ #include "Announcement.h" #include "Faq.h" #include "Payroll.h" +#include "Payslip.h" using employeeMap = std::map>; using payrollMap = std::map>; +using payslipMap = std::map>; using logMap = std::map>; class DataStore @@ -30,6 +32,7 @@ private: std::shared_ptr m_authenticatedEmployee; employeeMap m_employees; payrollMap m_payrolls; + payslipMap m_payslips; logMap m_logs; DataStore() = default; public: @@ -40,6 +43,7 @@ public: DataStore& operator=(DataStore&&) = delete; employeeMap& getEmployees(); payrollMap& getPayrolls(); + payslipMap& getPayslips(); logMap& getLogs(); std::shared_ptr& getAuthenticatedEmployee(); void setAuthenticatedEmployee(std::shared_ptr < Employee>); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index 8b5aa80..9f7adf9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -143,7 +143,7 @@ void Employee::addPayslip(std::shared_ptr payslip) { if (payslip) { - m_payslips[payslip->getPayslipId()] = payslip; + m_payslips[payslip->getId()] = payslip; } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index 6b063c8..cd747ed 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -52,7 +52,7 @@ public: void setFoodAllowance(double); void setEmployeePFContribution(double); void setEmployerPFContribution(double); - virtual std::string serialize() const; + 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 614e525..91e0b38 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp @@ -1,8 +1,27 @@ +#include #include "Payslip.h" +#include "StringHelper.h" +#include "Factory.h" int Payslip::m_uid = 0; -const std::string& Payslip::getPayslipId() const +Payslip::Payslip(const std::string& id, + const std::string& employeeId, + double salary, + util::Timestamp timestamp) + : m_id(id), + m_employeeId(employeeId), + m_salary(salary), + m_timestamp(timestamp) +{ + int idNumber = util::extractNumber(m_id); + if (idNumber > m_uid) + { + m_uid = idNumber; + } +} + +const std::string& Payslip::getId() const { return m_id; } @@ -20,4 +39,56 @@ void Payslip::setPayslipId(const std::string& id) void Payslip::setSalary(double salary) { m_salary = salary; -} \ No newline at end of file +} + +const util::Timestamp& Payslip::getTimestamp() const +{ + return m_timestamp; +} + +const std::string& Payslip::getEmployeeId() const +{ + return m_employeeId; +} + +std::string Payslip::serialize() const +{ + std::ostringstream serializedPayslip; + serializedPayslip << m_id << ',' + << m_employeeId << ',' + << m_salary << ',' + << m_timestamp.toString(); + return serializedPayslip.str(); +} + +std::shared_ptr Payslip::deserialize(const std::string& record) +{ + std::string id, employeeId, timestampString; + std::string salaryString; + std::istringstream serializedPayslip(record); + std::getline(serializedPayslip, id, ','); + std::getline(serializedPayslip, employeeId, ','); + std::getline(serializedPayslip, salaryString, ','); + std::getline(serializedPayslip, timestampString, ','); + + try + { + double salary = std::stod(salaryString); + util::Timestamp timestamp = util::Timestamp::fromString(timestampString); + return Factory::getObject( + id, + employeeId, + salary, + timestamp + ); + } + catch (...) + { + throw std::runtime_error("Failed to deserialize Payslip object"); + } +} + +std::string Payslip::getHeaders() +{ + return "PayslipId,EmployeeId,Salary,Timestamp"; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h index 10dc3bf..b8b971d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h @@ -1,17 +1,30 @@ #pragma once +#include #include +#include "Timestamp.h" class Payslip { private: static int m_uid; std::string m_id; + std::string m_employeeId; double m_salary; + util::Timestamp m_timestamp; public: - 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; + Payslip() : m_id("PS" + std::to_string(++m_uid)), m_employeeId(""), m_salary(0.0) {} + Payslip(const double salary, const std::string& employeeId) : m_id("PS" + std::to_string(++m_uid)), m_employeeId(employeeId), m_salary(salary) {} + Payslip(const std::string& id, + const std::string& employeeId, + double salary, + util::Timestamp timestamp); + const std::string& getId() const; double getSalary() const; void setPayslipId(const std::string& id); void setSalary(double salary); + const util::Timestamp& getTimestamp() const; + const std::string& getEmployeeId() const; + 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/services/ApplicationConfig.h b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h index 25231c2..0fd3b49 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -36,5 +36,6 @@ namespace Config 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"; + constexpr const char* PAYSLIP_FILE = "files/Payslip.csv"; } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index ecc326d..0d43120 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -1,9 +1,11 @@ #include +#include #include "PayslipManagementService.h" #include "ApplicationConfig.h" #include "AuthorizationHelper.h" #include "Enums.h" #include "FileManager.h" +#include "Factory.h" void PayslipManagementService::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { @@ -24,6 +26,42 @@ void PayslipManagementService::updateSalary(const std::string& employeeId, doubl } } +void PayslipManagementService::generatePayslips() +{ + util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::FINANCE); + auto& employees = m_dataStore.getEmployees(); + auto& payslips = m_dataStore.getPayslips(); + util::Timestamp currentTimestamp; + int currentMonth = currentTimestamp.getMonth(); + int currentYear = currentTimestamp.getYear(); + for (const auto& employeePair : employees) + { + auto& employee = employeePair.second; + if (employee->getEmployeeType() == Enums::EmployeeType::ADMIN) + { + continue; + } + auto& employeePayslips = employee->getEmployeePayslips(); + auto payslipForTheMonth = std::find_if(employeePayslips.begin(), employeePayslips.end(), + [currentMonth, currentYear](const auto& payslipPair) + { + auto& payslip = payslipPair.second; + auto& timestamp = payslip->getTimestamp(); + return (timestamp.getMonth() == currentMonth && timestamp.getYear() == currentYear); + } + ); + if (payslipForTheMonth == employeePayslips.end()) + { + auto payroll = employee->getPayroll(); + double salary; + salary = payroll->getBasicSalary() + payroll->getFoodAllowance() + payroll->getHouseRentAllowance() - payroll->getEmployeePFContribution() - payroll->getEmployerPFContribution(); + std::shared_ptr payslip = Factory::getObject(salary, employee->getId()); + employee->addPayslip(payslip); + payslips.emplace(payslip->getId(), payslip); + } + } +} + void PayslipManagementService::loadPayrolls() { FileManager payrollFileManager(Config::File::PAYROLL_FILE); @@ -47,4 +85,29 @@ void PayslipManagementService::savePayrolls() FileManager payrollFileManager(Config::File::PAYROLL_FILE); auto& payrolls = m_dataStore.getPayrolls(); payrollFileManager.save(payrolls); -} \ No newline at end of file +} + +void PayslipManagementService::loadPayslips() +{ + FileManager payslipFileManager(Config::File::PAYSLIP_FILE); + auto& payslips = m_dataStore.getPayslips(); + auto& employees = m_dataStore.getEmployees(); + auto payslipObjects = payslipFileManager.load(); + for (const auto& payslipPair : payslipObjects) + { + auto employeeIterator = employees.find(payslipPair.second->getEmployeeId()); + if (employeeIterator == employees.end()) + { + throw std::runtime_error("Payslip Object not associated with an existing employee"); + } + employeeIterator->second->addPayslip(payslipPair.second); + } + payslips.insert(payslipObjects.begin(), payslipObjects.end()); +} + +void PayslipManagementService::savePayslips() +{ + FileManager payslipFileManager(Config::File::PAYSLIP_FILE); + auto& payslips = m_dataStore.getPayslips(); + payslipFileManager.save(payslips); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index fd91da1..298c248 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -10,6 +10,9 @@ private: public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; void updateSalary(const std::string&, double, double, double, double, double); + void generatePayslips(); void loadPayrolls(); void savePayrolls(); + void loadPayslips(); + void savePayslips(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp index 42d4758..1341da9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp @@ -50,6 +50,27 @@ int util::Timestamp::getDateAsInt() const return year * 10000 + month * 100 + day; } +int util::Timestamp::getMonth() const +{ + std::tm timeStruct{}; + localtime_s(&timeStruct, &m_time); + return timeStruct.tm_mon + 1; +} + +int util::Timestamp::getYear() const +{ + std::tm timeStruct{}; + localtime_s(&timeStruct, &m_time); + return timeStruct.tm_year + 1900; +} + +int util::Timestamp::getDay() const +{ + std::tm timeStruct{}; + localtime_s(&timeStruct, &m_time); + return timeStruct.tm_mday; +} + double util::Timestamp::getDurationInMinutes(const Timestamp& startTimestamp, const Timestamp& endTimestamp) { return getDurationInSeconds(startTimestamp, endTimestamp) / 60.0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h index abbc58f..8aedc35 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h @@ -17,6 +17,9 @@ namespace util static double getDurationInMinutes(const Timestamp&, const Timestamp&); static double getDurationInSeconds(const Timestamp&, const Timestamp&); int getDateAsInt() const; + int getMonth() const; + int getYear() const; + int getDay() const; bool operator>(const Timestamp&) const; bool operator<(const Timestamp&) const; bool operator>=(const Timestamp&) const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 70885aa..74aadbc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -3,6 +3,7 @@ #include "InputHelper.h" #include "OutputHelper.h" #include "MenuHelper.h" +#include "Timestamp.h" void FinanceExecutiveMenu::run() { @@ -13,7 +14,7 @@ void FinanceExecutiveMenu::run() { int choice; util::clear(); - 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. View Profile \n13. 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 Payslips\n10. Update Payroll\n11. Update Profile\n12. View Profile \n13. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -51,6 +52,15 @@ void FinanceExecutiveMenu::updatePayroll() } } +void FinanceExecutiveMenu::generatePayslips() +{ + util::Timestamp currentTimestamp; + util::clear(); + m_zenvyController->generatePayslips(); + std::cout << "Generated payslips for the month of " << currentTimestamp.getMonth() << "-" << currentTimestamp.getYear() << " successfully."; + util::pressEnter(); +} + bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) @@ -61,6 +71,9 @@ bool FinanceExecutiveMenu::handleOperation(int choice) case 5: searchEmployee(m_zenvyController); break; + case 9: + generatePayslips(); + break; case 10: updatePayroll(); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index a5a2016..d757a03 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -14,5 +14,6 @@ public: void run(); bool handleOperation(int); void updatePayroll(); + void generatePayslips(); }; From 5398f5a0eefb8bd3eade4f760d54c3d724d17afe Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 14 Apr 2026 15:09:46 +0530 Subject: [PATCH 33/56] Add Update Designation functionality for General Employees EMP005 : Update Designation - Added updateDesignation method in ZenvyController and EmployeeManagementService. - Implemented update designation logic with authorization checks. - Enabled Admin menu option to update employee designation - Display employee designation in employee selection list - Extended GeneralEmployee to expose and update designation - Integrated role selection flow in MenuHelper. Smitha Mohan --- .../controllers/ZenvyController.cpp | 5 ++ .../controllers/ZenvyController.h | 2 +- .../Trenser.Zenvy/models/GeneralEmployee.cpp | 2 +- .../Trenser.Zenvy/models/GeneralEmployee.h | 9 ++- .../services/EmployeeManagementService.cpp | 18 +++++ .../services/EmployeeManagementService.h | 1 + .../Trenser.Zenvy/views/AdminMenu.cpp | 5 +- .../Trenser.Zenvy/views/MenuHelper.cpp | 20 +++++ .../Trenser.Zenvy/views/MenuHelper.h | 73 ++++++++++++------- 9 files changed, 102 insertions(+), 33 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index aced692..87164e6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -42,6 +42,11 @@ std::shared_ptr ZenvyController::getCurrentEmployee() return m_employeeManagementService->getCurrentEmployee(); } +bool ZenvyController::updateDesignation(const std::string& id,Enums::EmployeeDesignation designation) +{ + return m_employeeManagementService->updateDesignation(id,designation); +} + //Payslip Management void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 56140de..8345148 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -50,7 +50,7 @@ public: std::shared_ptr getCurrentEmployee(); void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); - + bool updateDesignation(const std::string&,Enums::EmployeeDesignation); template Employees getEmployees(Types ...types) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 2392097..00a7085 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -2,7 +2,7 @@ #include "GeneralEmployee.h" #include "Factory.h" -Enums::EmployeeDesignation GeneralEmployee::getDesignation() const +Enums::EmployeeDesignation GeneralEmployee::getDesignation() const { return m_designation; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 61b1a06..b3f38dc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -8,7 +8,8 @@ private: Enums::EmployeeDesignation m_designation; public: GeneralEmployee() - : m_designation(Enums::EmployeeDesignation::JUNIOR) {} + : m_designation(Enums::EmployeeDesignation::JUNIOR) { + } GeneralEmployee(const std::string& name, const std::string& phone, const std::string& email, @@ -19,7 +20,8 @@ public: email, Enums::EmployeeType::GENERAL, payroll), - m_designation(designation) {} + m_designation(designation) { + } GeneralEmployee(const std::string& id, const std::string& name, const std::string& phone, @@ -38,7 +40,8 @@ public: teamStatus, Enums::EmployeeType::GENERAL, accountStatus), - m_designation(employeeDesignation) {} + m_designation(employeeDesignation) { + } Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); std::string serialize() const override; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 5f639da..bb5c259 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -131,6 +131,24 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) return true; } +bool EmployeeManagementService::updateDesignation(const std::string& id, Enums::EmployeeDesignation designation) +{ + auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); + util::enforceAuthorization(authenticatedEmployee->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); + std::map> employee = m_dataStore.getEmployees(); + auto iterator = employee.find(id); + if (iterator == employee.end()) + { + return false; + } + auto generalEmployee = std::dynamic_pointer_cast((*iterator).second); + if (generalEmployee) + { + generalEmployee->setDesignation(designation); + } + return true; +} + std::shared_ptr EmployeeManagementService::getCurrentEmployee() { return m_dataStore.getAuthenticatedEmployee(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 4551b6f..45f4526 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -17,6 +17,7 @@ public: EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); bool deactivateEmployee(const std::string&); + bool updateDesignation(const std::string&,Enums::EmployeeDesignation); void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 6c3c0d5..bbe895b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -13,7 +13,7 @@ void AdminMenu::run() { int choice; util::clear(); - std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Logout\nEnter your Choice: "; + std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Update Designation \n7. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -48,6 +48,9 @@ bool AdminMenu::handleOperation(int choice) updateProfile(m_zenvyController); break; case 6: + updateDesignation(m_zenvyController); + break; + case 7: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 37da2d2..9a657ae 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -102,3 +102,23 @@ void createEmployee(std::shared_ptr controller) std::cout << "\nCreated Employee Successfully."; util::pressEnter(); } + + void updateDesignation(std::shared_ptr m_zenvyController) +{ + std::string selectedEmployeeId = selectEmployeeId(m_zenvyController->getEmployees(Enums::EmployeeType::GENERAL)); + if (selectedEmployeeId.empty()) + { + return; + } + Enums::EmployeeDesignation designation = getEmployeeDesignation(); + if (m_zenvyController->updateDesignation(selectedEmployeeId, designation)) + { + std::cout << "Assign Employee Role successfull\n"; + util::pressEnter(); + } + else + { + std::cout << "Employee not found\n"; + util::pressEnter(); + } +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 09b084e..25e7a07 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -14,6 +14,7 @@ #include "Validator.h" void createEmployee(std::shared_ptr controller); +void updateDesignation(std::shared_ptr m_zenvyController); inline void viewProfile(std::shared_ptr controller) { @@ -134,14 +135,31 @@ inline std::string selectEmployeeId(std::vector> << std::setw(10) << "Index" << std::setw(15) << "Employee ID" << std::setw(20) << "Name" - << std::setw(20) << "Employee Type" << std::endl; + << std::setw(20) << "Employee Type" + << std::setw(20) << "Employee Designation" << std::endl; for (const auto& employee : employeeList) { - std::cout << std::left << std::setw(10) << employee.first - << std::setw(15) << employee.second->getId() - << std::setw(20) << employee.second->getEmployeeName() - << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()) - << std::endl; + auto generalEmployee = std::dynamic_pointer_cast(employee.second); + if (generalEmployee) + { + std::cout << std::left + << std::setw(10) << employee.first + << std::setw(15) << generalEmployee->getId() + << std::setw(20) << generalEmployee->getEmployeeName() + << std::setw(20) << Enums::getEmployeeTypeString(generalEmployee->getEmployeeType()) + << std::setw(20) << Enums::getEmployeeDesignationString(generalEmployee->getDesignation()) + << std::endl; + } + else + { + 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::setw(20) << "NULL" + << std::endl; + } } std::cout << "Enter the Index: "; util::read(choice); @@ -163,7 +181,7 @@ inline void deactivateEmployee(const std::shared_ptr& controlle { return; } - if(controller->deactivateEmployee(selectedEmployeeId)) + if (controller->deactivateEmployee(selectedEmployeeId)) { std::cout << "Employee deactivated successfully\n"; util::pressEnter(); @@ -210,13 +228,13 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) inline void searchEmployee(std::shared_ptr& m_zenvyController) { - std::string name; - util::clear(); - std::cout << "Enter Employee Name: "; - util::read(name); - std::pair>> searchResults = m_zenvyController->searchEmployee(name); - if (!(searchResults.second).empty()) - { + std::string name; + util::clear(); + std::cout << "Enter Employee Name: "; + util::read(name); + std::pair>> searchResults = m_zenvyController->searchEmployee(name); + if (!(searchResults.second).empty()) + { std::cout << std::left << std::setw(10) << "ID" << std::setw(20) << "Name" @@ -238,10 +256,10 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) << std::setw(15) << "HouseRentAllowance"; } std::cout << std::endl; - for (const auto& employee : searchResults.second) - { - if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) - { + for (const auto& employee : searchResults.second) + { + if (employee->getEmployeeAccountStatus() == Enums::AccountStatus::ACTIVE) + { std::cout << std::left << std::setw(10) << employee->getId() << std::setw(20) << employee->getEmployeeName() @@ -257,8 +275,8 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) { std::cout << std::setw(15) << employee->getEmployeeTeamId(); } - if (searchResults.first == Enums::EmployeeType::FINANCE - || searchResults.first == Enums::EmployeeType::HR + if (searchResults.first == Enums::EmployeeType::FINANCE + || searchResults.first == Enums::EmployeeType::HR || searchResults.first == Enums::EmployeeType::ADMIN) { std::cout << std::left @@ -270,12 +288,13 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) << std::setw(15) << employee->getPayroll()->getHouseRentAllowance(); } std::cout << std::endl; - } - } - } - else - { - std::cout << "No Employee found with this name" << std::endl; - } + } + } + } + else + { + std::cout << "No Employee found with this name" << std::endl; + } util::pressEnter(); } + From 55f94f4d45ce2ad0ad6a646cbfc381d942d3e800 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 14 Apr 2026 17:03:33 +0530 Subject: [PATCH 34/56] Update Update Designation functionality EMP005 : Update Designation - Enabled HR Manager menu option to update employee designation Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 0709976..d3723f7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -13,7 +13,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. View Profile\n15. Logout\nEnter your Choice: "; + std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. View Profile\n15. Update Designation\n16. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -51,6 +51,9 @@ bool HRManagerMenu::handleOperation(int choice) viewProfile(m_zenvyController); break; case 15: + updateDesignation(m_zenvyController); + break; + case 16: return false; default: std::cout << "Enter a valid choice!" << std::endl; From ce86b7f59e4a902cb8908e8b00b15b8f0a3357f8 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Tue, 14 Apr 2026 18:38:42 +0530 Subject: [PATCH 35/56] Update Update Designation functionality based on review EMP005 : Update Designation - Refactor GeneralEmployee constructors clean. - update Designation logic. - Improve menu display messages. Smitha Mohan --- .../Trenser.Zenvy/models/GeneralEmployee.h | 9 +++------ .../services/EmployeeManagementService.cpp | 8 ++++---- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h | 16 ++++++---------- 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index b3f38dc..61b1a06 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -8,8 +8,7 @@ private: Enums::EmployeeDesignation m_designation; public: GeneralEmployee() - : m_designation(Enums::EmployeeDesignation::JUNIOR) { - } + : m_designation(Enums::EmployeeDesignation::JUNIOR) {} GeneralEmployee(const std::string& name, const std::string& phone, const std::string& email, @@ -20,8 +19,7 @@ public: email, Enums::EmployeeType::GENERAL, payroll), - m_designation(designation) { - } + m_designation(designation) {} GeneralEmployee(const std::string& id, const std::string& name, const std::string& phone, @@ -40,8 +38,7 @@ public: teamStatus, Enums::EmployeeType::GENERAL, accountStatus), - m_designation(employeeDesignation) { - } + m_designation(employeeDesignation) {} Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); std::string serialize() const override; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index bb5c259..179b057 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -135,13 +135,13 @@ bool EmployeeManagementService::updateDesignation(const std::string& id, Enums:: { auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); util::enforceAuthorization(authenticatedEmployee->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); - std::map> employee = m_dataStore.getEmployees(); - auto iterator = employee.find(id); - if (iterator == employee.end()) + std::map> employees = m_dataStore.getEmployees(); + auto employeeIterator = employees.find(id); + if (employeeIterator == employees.end()) { return false; } - auto generalEmployee = std::dynamic_pointer_cast((*iterator).second); + auto generalEmployee = std::dynamic_pointer_cast((*employeeIterator).second); if (generalEmployee) { generalEmployee->setDesignation(designation); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 9a657ae..43b8faf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -113,7 +113,7 @@ void createEmployee(std::shared_ptr controller) Enums::EmployeeDesignation designation = getEmployeeDesignation(); if (m_zenvyController->updateDesignation(selectedEmployeeId, designation)) { - std::cout << "Assign Employee Role successfull\n"; + std::cout << "Assigned Employee Role Successfully\n"; util::pressEnter(); } else diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 25e7a07..940333c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -140,23 +140,20 @@ inline std::string selectEmployeeId(std::vector> for (const auto& employee : employeeList) { auto generalEmployee = std::dynamic_pointer_cast(employee.second); + std::cout << std::left + << std::setw(10) << employee.first + << std::setw(15) << employee.second->getId() + << std::setw(20) << employee.second->getEmployeeName() + << std::setw(20) << Enums::getEmployeeTypeString(employee.second->getEmployeeType()); if (generalEmployee) { std::cout << std::left - << std::setw(10) << employee.first - << std::setw(15) << generalEmployee->getId() - << std::setw(20) << generalEmployee->getEmployeeName() - << std::setw(20) << Enums::getEmployeeTypeString(generalEmployee->getEmployeeType()) << std::setw(20) << Enums::getEmployeeDesignationString(generalEmployee->getDesignation()) << std::endl; } else { 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::setw(20) << "NULL" << std::endl; } @@ -296,5 +293,4 @@ inline void searchEmployee(std::shared_ptr& m_zenvyController) std::cout << "No Employee found with this name" << std::endl; } util::pressEnter(); -} - +} \ No newline at end of file From 1836be1234369e40b02c14abcd4b8389394dad4a Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Tue, 14 Apr 2026 14:48:58 +0530 Subject: [PATCH 36/56] To Add Shortlisted Candidates As Employee EMP012 : Add Shorlisted Candidates As Employee - Added getShorlistedCandidates method in ZenvyController - Added candidateMap to store candidate data in DataStore.h - Added addShortlistedCandidatesAsEmployee method in EmployeeManagementService.h and implemented the logic. Smitha Mohan --- .../controllers/ZenvyController.cpp | 5 ++ .../controllers/ZenvyController.h | 2 + .../Trenser.Zenvy/datastores/DataStore.cpp | 5 ++ .../Trenser.Zenvy/datastores/DataStore.h | 3 + .../Trenser.Zenvy/models/Candidate.cpp | 4 +- .../Trenser.Zenvy/models/Candidate.h | 10 +-- .../services/EmployeeManagementService.cpp | 14 +++ .../services/EmployeeManagementService.h | 1 + Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 3 +- .../Trenser.Zenvy/views/AdminMenu.cpp | 5 +- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 5 +- .../Trenser.Zenvy/views/MenuHelper.cpp | 85 ++++++++++++++++++- .../Trenser.Zenvy/views/MenuHelper.h | 5 +- 13 files changed, 132 insertions(+), 15 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 87164e6..1f095ee 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -47,6 +47,11 @@ bool ZenvyController::updateDesignation(const std::string& id,Enums::EmployeeDes return m_employeeManagementService->updateDesignation(id,designation); } +std::vector>& ZenvyController::getShorlistedCandidates() +{ + return m_employeeManagementService->getShorlistedCandidates(); +} + //Payslip Management void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 8345148..78b3123 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -51,6 +51,8 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); bool updateDesignation(const std::string&,Enums::EmployeeDesignation); + std::vector>& getShorlistedCandidates(); + template Employees getEmployees(Types ...types) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index fe9dad4..be0897e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -12,6 +12,11 @@ logMap& DataStore::getLogs() return m_logs; } +candidateMap& DataStore::getCandidates() +{ + return m_candidates; +} + std::shared_ptr& DataStore::getAuthenticatedEmployee() { return m_authenticatedEmployee; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index 9f79fc8..972e580 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -25,6 +25,7 @@ using employeeMap = std::map>; using payrollMap = std::map>; using payslipMap = std::map>; using logMap = std::map>; +using candidateMap = std::map>; class DataStore { @@ -34,6 +35,7 @@ private: payrollMap m_payrolls; payslipMap m_payslips; logMap m_logs; + candidateMap m_candidates; DataStore() = default; public: static DataStore& getInstance(); @@ -45,6 +47,7 @@ public: payrollMap& getPayrolls(); payslipMap& getPayslips(); logMap& getLogs(); + candidateMap& getCandidates(); std::shared_ptr& getAuthenticatedEmployee(); void setAuthenticatedEmployee(std::shared_ptr < Employee>); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp index 779652f..254aff2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.cpp @@ -12,7 +12,7 @@ const std::string& Candidate::getCandidateName() const return m_name; } -long int Candidate::getCandidatePhone() const +const std::string& Candidate::getCandidatePhone() const { return m_phone; } @@ -37,7 +37,7 @@ void Candidate::setCandidateName(const std::string& name) m_name = name; } -void Candidate::setCandidatePhone(long int phone) +void Candidate::setCandidatePhone(const std::string& phone) { m_phone = phone; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h index db55250..59b9e9b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Candidate.h @@ -8,24 +8,24 @@ private: static int m_uid; std::string m_id; std::string m_name; - long int m_phone; + std::string m_phone; std::string m_qualification; Enums::CandidateStatus m_status; public: - Candidate() : m_id("CD" + std::to_string(++m_uid)), m_name(""), m_phone(0), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} + Candidate() : m_id("CD" + std::to_string(++m_uid)), m_name(""), m_phone(""), m_qualification(""), m_status(Enums::CandidateStatus::PENDING) {} Candidate(const std::string& name, - long int phone, + const std::string& phone, const std::string& qualification, Enums::CandidateStatus status) : m_id("CD" + std::to_string(++m_uid)), m_name(name), m_phone(phone), m_qualification(qualification), m_status(status) {} const std::string& getCandidateId() const; const std::string& getCandidateName() const; - long int getCandidatePhone() const; + const std::string& getCandidatePhone() const; const std::string& getCandidateQualification() const; Enums::CandidateStatus getCandidateStatus() const; void setCandidateId(const std::string& id); void setCandidateName(const std::string& name); - void setCandidatePhone(long int phone); + void setCandidatePhone(const std::string& phone); void setCandidateQualification(const std::string& qualification); void setCandidateStatus(Enums::CandidateStatus status); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 179b057..d9add47 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -235,3 +235,17 @@ void EmployeeManagementService::saveEmployees() employeeFileManager.save(employees); generalEmployeeFileManager.save(generalEmployees); } + +std::vector>& EmployeeManagementService::getShorlistedCandidates() +{ + candidateMap candidates = m_dataStore.getCandidates(); + std::vector> shortlistedCandidates; + for (auto& candidate : candidates) + { + if (candidate.second->getCandidateStatus() == Enums::CandidateStatus::SHORTLISTED) + { + shortlistedCandidates.push_back(candidate.second); + } + } + return shortlistedCandidates; +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 45f4526..4cd2da2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -21,6 +21,7 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); + std::vector>& getShorlistedCandidates(); void loadEmployees(); void saveEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 1539ee9..a9f29f5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -19,7 +19,8 @@ namespace Enums { { PENDING, SHORTLISTED, - REJECTED + REJECTED, + HIRED }; enum class NotificationStatus diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index bbe895b..df08e23 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -13,7 +13,7 @@ void AdminMenu::run() { int choice; util::clear(); - std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Update Designation \n7. Logout\nEnter your Choice: "; + std::cout << "Admin Menu\n1. Create User\n2. View Employees\n3. Deactivate Employee\n4. Search Employee\n5. Update Profile\n6. Update Designation \n7. Add Shortlisted Candidate As Employee\n8. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -51,6 +51,9 @@ bool AdminMenu::handleOperation(int choice) updateDesignation(m_zenvyController); break; case 7: + addShortlistedCandidateAsEmployee(m_zenvyController); + break; + case 8: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index d3723f7..580cf89 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -13,7 +13,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. View Profile\n15. Update Designation\n16. 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. View Profile\n15. Update Designation\n16. Add Shortlisted Candidate as Employee\n17. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -54,6 +54,9 @@ bool HRManagerMenu::handleOperation(int choice) updateDesignation(m_zenvyController); break; case 16: + addShortlistedCandidateAsEmployee(m_zenvyController); + break; + case 17: return false; default: std::cout << "Enter a valid choice!" << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index 43b8faf..a88989c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -30,12 +30,12 @@ static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) { Enums::EmployeeType::TALENT_ACQUISITION, "Talent Executive" }, { Enums::EmployeeType::GENERAL, "General Employee" } }; - auto it = employeeTypeOptions.find(employeeType); - if (it == employeeTypeOptions.end()) + auto employeeOptionsIterator = employeeTypeOptions.find(employeeType); + if (employeeOptionsIterator == employeeTypeOptions.end()) { throw std::runtime_error("You do not have the authority to create a new Employee!"); } - const auto& options = it->second; + const auto& options = employeeOptionsIterator->second; std::cout << "Select Employee Type\n"; for (int index = 0; index < options.size(); ++index) { @@ -121,4 +121,81 @@ void createEmployee(std::shared_ptr controller) std::cout << "Employee not found\n"; util::pressEnter(); } -} \ No newline at end of file +} + +void displayCandidateDetails(const std::vector>& shorlistedCandidates) +{ + std::cout << std::left + << std::setw(10) << "Index" + << std::setw(10) << "ID" + << std::setw(20) << "Name" + << std::setw(15) << "Phone" + << std::setw(15) << "Qualification" + << std::setw(10) << "Status" + << std::endl; + int index = 0; + for (auto& candidate : shorlistedCandidates) + { + std::cout << std::left + << std::setw(10) << ++index + << std::setw(10) << candidate->getCandidateId() + << std::setw(20) << candidate->getCandidateName() + << std::setw(15) << candidate->getCandidatePhone() + << std::setw(15) << candidate->getCandidateQualification() + << std::setw(10) << Enums::getCandidateStatusString(candidate->getCandidateStatus()) + << std::endl; + } +} + +void addShortlistedCandidateAsEmployee(const std::shared_ptr& controller) +{ + int index; + std::string name, email, phone; + util::clear(); + std::vector> shortlistedCandidates = controller->getShorlistedCandidates(); + if (shortlistedCandidates.empty()) + { + std::cout << "No candidates Found!"; + util::pressEnter(); + return; + } + displayCandidateDetails(shortlistedCandidates); + std::cout << "Enter the Index: "; + util::read(index); + auto currentEmployee = controller->getCurrentEmployee(); + Enums::EmployeeType employeeType; + Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; + if (index > 0 && index < shortlistedCandidates.size()) + { + employeeType = getEmployeeType(currentEmployee->getEmployeeType()); + std::shared_ptr candidate = shortlistedCandidates[index - 1]; + switch (employeeType) + { + case Enums::EmployeeType::INVALID: + std::cout << "Invalid Choice"; + util::pressEnter(); + return; + case Enums::EmployeeType::GENERAL: + employeeDesignation = getEmployeeDesignation(); + if (employeeDesignation == Enums::EmployeeDesignation::INVALID) + { + std::cout << "Invalid Choice"; + util::pressEnter(); + return; + } + break; + } + std::cout << "Enter email: "; + util::read(email); + name = candidate->getCandidateName(); + phone = candidate->getCandidatePhone(); + controller->createEmployee(employeeType, employeeDesignation, email, name, phone); + candidate->setCandidateStatus(Enums::CandidateStatus::HIRED); + std::cout << "\nCreated Employee Successfully."; + util::pressEnter(); + } + else + { + throw std::runtime_error("Enter a valid Index."); + } +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 940333c..61d96b7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -59,6 +59,9 @@ inline void viewProfile(std::shared_ptr controller) } } +void displayCandidateDetails(const std::vector>& shorlistedCandidates); +void addShortlistedCandidateAsEmployee(const std::shared_ptr& controller); + inline void updateProfile(std::shared_ptr m_zenvyController) { int choice; @@ -223,7 +226,7 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) util::pressEnter(); } -inline void searchEmployee(std::shared_ptr& m_zenvyController) +inline void searchEmployee(std::shared_ptr m_zenvyController) { std::string name; util::clear(); From f15d5b7f1df2913f3e03182ce8c18b92887bca9e Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Tue, 14 Apr 2026 18:32:02 +0530 Subject: [PATCH 37/56] Updates based on comments EMP012 : Add Shorlisted Candidates As Employee - Added clear method to clear console before displaying candidate details in MenuHelper.cpp - Removed spaces in MenuHelper.h Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index a88989c..d1d4ba3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -125,6 +125,7 @@ void createEmployee(std::shared_ptr controller) void displayCandidateDetails(const std::vector>& shorlistedCandidates) { + util::clear(); std::cout << std::left << std::setw(10) << "Index" << std::setw(10) << "ID" From 7351186baf7251c287353275885793a4668626dd Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Thu, 16 Apr 2026 10:05:19 +0530 Subject: [PATCH 38/56] Refactor shortlisted candidates access and fix index check EMP0012 : Employee Management - Changed getShorlistedCandidates() to return by value instead of reference - Updated controller and service method signatures accordingly - Fixed off-by-one error when selecting shortlisted candidate Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h | 2 +- .../Trenser.Zenvy/services/EmployeeManagementService.cpp | 2 +- .../Trenser.Zenvy/services/EmployeeManagementService.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 1f095ee..ee04e1c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -47,7 +47,7 @@ bool ZenvyController::updateDesignation(const std::string& id,Enums::EmployeeDes return m_employeeManagementService->updateDesignation(id,designation); } -std::vector>& ZenvyController::getShorlistedCandidates() +std::vector> ZenvyController::getShorlistedCandidates() { return m_employeeManagementService->getShorlistedCandidates(); } diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 78b3123..0fbe2b8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -51,7 +51,7 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); bool updateDesignation(const std::string&,Enums::EmployeeDesignation); - std::vector>& getShorlistedCandidates(); + std::vector> getShorlistedCandidates(); template Employees getEmployees(Types ...types) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index d9add47..855e445 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -236,7 +236,7 @@ void EmployeeManagementService::saveEmployees() generalEmployeeFileManager.save(generalEmployees); } -std::vector>& EmployeeManagementService::getShorlistedCandidates() +std::vector> EmployeeManagementService::getShorlistedCandidates() { candidateMap candidates = m_dataStore.getCandidates(); std::vector> shortlistedCandidates; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index 4cd2da2..a292c31 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -21,7 +21,7 @@ public: void updateProfile(const std::string&,const std::string&); std::pair>> searchEmployee(const std::string&); std::shared_ptr getCurrentEmployee(); - std::vector>& getShorlistedCandidates(); + std::vector> getShorlistedCandidates(); void loadEmployees(); void saveEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index d1d4ba3..bba68d0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -166,7 +166,7 @@ void addShortlistedCandidateAsEmployee(const std::shared_ptr& c auto currentEmployee = controller->getCurrentEmployee(); Enums::EmployeeType employeeType; Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; - if (index > 0 && index < shortlistedCandidates.size()) + if (index > 0 && index <= shortlistedCandidates.size()) { employeeType = getEmployeeType(currentEmployee->getEmployeeType()); std::shared_ptr candidate = shortlistedCandidates[index - 1]; From 72e7db04a501b10cde50fe2b7aad90e0b2ebab11 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Thu, 16 Apr 2026 10:26:54 +0530 Subject: [PATCH 39/56] Fix HR Manager menu option ordering and switch mapping EMP012 : Employee Management - Updated HR Manager menu text to remove obsolete options - Reordered menu items to match current functionality Smitha Mohan --- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 580cf89..28dec14 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -13,7 +13,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Register CandidateAsEmployee\n12. Update Profile\n13. Deactivate Employee\n14. View Profile\n15. Update Designation\n16. Add Shortlisted Candidate as Employee\n17. Logout\nEnter your Choice: "; + std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Update Profile\n12. Deactivate Employee\n13. View Profile\n14. Update Designation\n15. Add Shortlisted Candidate as Employee\n16. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -41,22 +41,22 @@ bool HRManagerMenu::handleOperation(int choice) case 8: createEmployee(m_zenvyController); break; - case 12: + case 11: updateProfile(m_zenvyController); break; - case 13: + case 12: deactivateEmployee(m_zenvyController); break; - case 14: + case 13: viewProfile(m_zenvyController); break; - case 15: + case 14: updateDesignation(m_zenvyController); break; - case 16: + case 15: addShortlistedCandidateAsEmployee(m_zenvyController); break; - case 17: + case 16: return false; default: std::cout << "Enter a valid choice!" << std::endl; From b9b83ad42938f8a3aa86966182af08942cf27f91 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Tue, 14 Apr 2026 18:11:29 +0530 Subject: [PATCH 40/56] Add View Payslip feature for employees EMP010 : View Payslip - Added Timestamp support to Payroll and Payslip models - Implemented getPayslipForMonth flow from Controller to Service - Enabled payslip retrieval based on year and month - Updated menus to allow payslip viewing - Enhanced MenuHelper with a unified viewPayslip helper - Added date-based filtering using Timestamp utilities Smitha Mohan --- .../controllers/ZenvyController.cpp | 8 ++++ .../controllers/ZenvyController.h | 2 + .../Trenser.Zenvy/models/Payroll.cpp | 5 +-- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 2 + .../services/PayslipManagementService.cpp | 24 +++++++++++ .../services/PayslipManagementService.h | 2 + .../Trenser.Zenvy/utilities/Timestamp.cpp | 15 +++++++ .../Trenser.Zenvy/utilities/Timestamp.h | 3 ++ .../Trenser.Zenvy/views/EmployeeMenu.cpp | 10 ++--- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 3 ++ .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 3 ++ .../Trenser.Zenvy/views/MenuHelper.h | 41 ++++++++++++++++++- .../views/TalentExecutiveMenu.cpp | 3 ++ .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 3 ++ .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 3 ++ 15 files changed, 118 insertions(+), 9 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index ee04e1c..bbf0272 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -76,3 +76,11 @@ void ZenvyController::persistStates() m_payslipManagementService->savePayrolls(); m_payslipManagementService->savePayslips(); } + +std::pair, std::shared_ptr> +ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) +{ + return m_payslipManagementService->getPayslipForMonth(employeeId, month, year); +} + + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 0fbe2b8..3d0190e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -62,6 +62,8 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); + std::pair, std::shared_ptr> + getPayslipForMonth(const std::string&, int, int); //File Management void loadStates(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index b145a4f..b85153b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -19,7 +19,7 @@ Payroll::Payroll(const std::string& id, m_houseRentAllowance(houseRentAllowance), m_foodAllowance(foodAllowance), m_employeePFContribution(employeePFContribution), - m_employerPFContribution(employerPFContribution) + m_employerPFContribution(employerPFContribution) { int idNumber = util::extractNumber(m_id); if (idNumber > m_uid) @@ -118,7 +118,6 @@ std::shared_ptr Payroll::deserialize(const std::string& record) std::getline(serializedPayroll, foodAllowanceString, ','); std::getline(serializedPayroll, employeePFString, ','); std::getline(serializedPayroll, employerPFString, ','); - try { double basicSalary = std::stod(basicSalaryString); @@ -145,4 +144,4 @@ std::shared_ptr Payroll::deserialize(const std::string& record) std::string Payroll::getHeaders() { return "PayrollId,EmployeeId,BasicSalary,HouseRentAllowance,FoodAllowance,EmployeePFContribution,EmployerPFContribution"; -} \ No newline at end of file +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index cd747ed..460c596 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include "Timestamp.h" class Payroll { @@ -13,6 +14,7 @@ private: double m_foodAllowance; double m_employeePFContribution; double m_employerPFContribution; + util::Timestamp m_timestamp; public: Payroll() : m_id("PR" + std::to_string(++m_uid)), diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 0d43120..c889143 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -87,6 +87,30 @@ void PayslipManagementService::savePayrolls() payrollFileManager.save(payrolls); } +std::pair, std::shared_ptr> +PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) +{ + auto& payrolls = m_dataStore.getPayrolls(); + auto& payslips = m_dataStore.getPayslips(); + for (const auto& payrollsPair : payrolls) + { + const auto& payroll = payrollsPair.second; + if (payroll->getEmployeeId() == employeeId) + { + auto iterator = payslips.find(payroll->getId()); + if (iterator != payslips.end()) + { + const auto& payslip = iterator->second; + if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) + { + return { payroll, payslip }; + } + } + } + } + return { nullptr, nullptr }; +} + void PayslipManagementService::loadPayslips() { FileManager payslipFileManager(Config::File::PAYSLIP_FILE); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 298c248..74ec3b4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -15,4 +15,6 @@ public: void savePayrolls(); void loadPayslips(); void savePayslips(); + std::pair, std::shared_ptr> + getPayslipForMonth(const std::string&, int, int); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp index 1341da9..fb9dab0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp @@ -40,6 +40,21 @@ double util::Timestamp::getDurationInSeconds(const Timestamp& startTimestamp, co return std::difftime(endTimestamp.m_time, startTimestamp.m_time); } +int util::Timestamp::getYear() const +{ + return 0; +} + +int util::Timestamp::getMonth() const +{ + return 0; +} + +int util::Timestamp::getDay() const +{ + return 0; +} + int util::Timestamp::getDateAsInt() const { std::tm timeStruct{}; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h index 8aedc35..4a130a3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h @@ -16,6 +16,9 @@ namespace util static double getDurationInHours(const Timestamp&, const Timestamp&); static double getDurationInMinutes(const Timestamp&, const Timestamp&); static double getDurationInSeconds(const Timestamp&, const Timestamp&); + int getYear() const; + int getMonth() const; + int getDay() const; int getDateAsInt() const; int getMonth() const; int getYear() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index a2f2a56..bbe9462 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -33,14 +33,14 @@ bool EmployeeMenu::handleOperation(int choice) { switch (choice) { - /* - case 1: + + /*case 1: m_zenvyController.applyLeave(); - break; + break;*/ case 2: - m_zenvyController.viewPayslip(); + viewPayslip(m_zenvyController); break; - case 3: + /*case 3: m_zenvyController.viewPayslipHistory(); break; case 4 : diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 28dec14..bcda466 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -32,6 +32,9 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index d691228..c73ceef 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool ITExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 61d96b7..0e0a129 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -296,4 +296,43 @@ inline void searchEmployee(std::shared_ptr m_zenvyController) std::cout << "No Employee found with this name" << std::endl; } util::pressEnter(); -} \ No newline at end of file +} + +inline void viewPayslip(std::shared_ptr controller) +{ + int year, month; + util::clear(); + std::cout << "Enter the year: "; + util::read(year); + std::cout << "\nEnter the month: "; + util::read(month); + auto employee = controller->getCurrentEmployee(); + if (!employee) + { + std::cout << "No authenticated employee.\n"; + util::pressEnter(); + return; + } + auto result = controller->getPayslipForMonth(employee->getId(), year, month); + auto payroll = result.first; + auto payslip = result.second; + if (payroll && payslip) + { + std::cout << "\nPayslip for " << employee->getEmployeeName() + << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; + + std::cout << "Basic Salary : " << payroll->getBasicSalary() << "\n"; + std::cout << "House Rent Allowance : " << payroll->getHouseRentAllowance() << "\n"; + std::cout << "Food Allowance : " << payroll->getFoodAllowance() << "\n"; + std::cout << "Employee PF Contribution : " << payroll->getEmployeePFContribution() << "\n"; + std::cout << "Employer PF Contribution : " << payroll->getEmployerPFContribution() << "\n"; + std::cout << "----------------------------------------\n"; + std::cout << "Net Salary (after deductions): " << payslip->getSalary() << "\n"; + std::cout << "Generated on: " << payslip->getTimestamp().toString() << "\n"; + } + else + { + std::cout << "Payslip not available for " << year << "-" << month << ".\n"; + } + util::pressEnter(); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 1c28319..967c986 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool TalentExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 89ebf9d..ea03f8d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool TeamExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 0084158..3f504f5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -32,6 +32,9 @@ bool TeamLeadMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); + break; case 7: viewEmployees(m_zenvyController); break; From a1c9edce31908a5627e62a3e070d16b6e6bf2bd7 Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Thu, 16 Apr 2026 12:36:13 +0530 Subject: [PATCH 41/56] Implement View Payslip History EMP011 : View Payslip History - Implemented Enums::Month enum and helper functions getMonth() and getMonthString() for month formatting. - Created viewPayslipHistory() helper in MenuHelper.h to display payslip history in aligned tabular format. - Integrated viewPayslipHistory() option into EmployeeMenu, FinanceExecutiveMenu, HRManagerMenu, ITExecutiveMenu, TalentExecutiveMenu, TeamExecutiveMenu, and TeamLeadMenu. Smitha Mohan --- .../controllers/ZenvyController.cpp | 5 ++ .../controllers/ZenvyController.h | 1 + .../services/PayslipManagementService.cpp | 4 ++ .../services/PayslipManagementService.h | 3 + Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 60 +++++++++++++++++++ .../Trenser.Zenvy/views/EmployeeMenu.cpp | 9 ++- .../views/FinanceExecutiveMenu.cpp | 3 + .../Trenser.Zenvy/views/HRManagerMenu.cpp | 3 + .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 3 + .../Trenser.Zenvy/views/MenuHelper.h | 29 +++++++++ .../views/TalentExecutiveMenu.cpp | 3 + .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 3 + .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 3 + 13 files changed, 124 insertions(+), 5 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index aced692..071a4c2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -53,6 +53,11 @@ void ZenvyController::generatePayslips() m_payslipManagementService->generatePayslips(); } +payslipMap& ZenvyController::getPayslips() +{ + return m_payslipManagementService->getPayslips(); +} + void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 56140de..09b61bf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -60,6 +60,7 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); + payslipMap& getPayslips(); //File Management void loadStates(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 0d43120..82519cf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -26,6 +26,10 @@ void PayslipManagementService::updateSalary(const std::string& employeeId, doubl } } +payslipMap& PayslipManagementService::getPayslips() { + return m_dataStore.getPayslips(); +} + void PayslipManagementService::generatePayslips() { util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::FINANCE); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 298c248..69bd7f7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -3,6 +3,8 @@ #include #include"DataStore.h" +using payslipMap = std::map>; + class PayslipManagementService { private: @@ -10,6 +12,7 @@ private: public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; void updateSalary(const std::string&, double, double, double, double, double); + payslipMap& getPayslips(); void generatePayslips(); void loadPayrolls(); void savePayrolls(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 1539ee9..89f78a7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -91,6 +91,23 @@ namespace Enums { INVALID_PASSWORD }; + enum class Month + { + JANUARY, + FEBRUARY, + MARCH, + APRIL, + MAY, + JUNE, + JULY, + AUGUST, + SEPTEMBER, + OCTOBER, + NOVEMBER, + DECEMBER, + INVALID + }; + inline std::string getAccountStatusString(AccountStatus status) { switch (status) @@ -170,6 +187,27 @@ namespace Enums { } } + inline std::string getMonthString(Month month) + { + switch (month) + { + case Month::JANUARY : return "January"; + case Month::FEBRUARY: return "February"; + case Month::MARCH: return "March"; + case Month::APRIL: return "April"; + case Month::MAY: return "May"; + case Month::JUNE: return "June"; + case Month::JULY: return "July"; + case Month::AUGUST: return "August"; + case Month::SEPTEMBER: return "September"; + case Month::OCTOBER: return "October"; + case Month::NOVEMBER: return "November"; + case Month::DECEMBER: return "December"; + case Month::INVALID: return "Invalid Month"; + default: return "Unknown"; + } + } + inline AccountStatus getAccountStatus(const std::string& input) { if (input == "ACTIVE") @@ -245,4 +283,26 @@ namespace Enums { } return EmployeeDesignation::INVALID; } + + inline Month getMonth(const int inputMonth) + { + switch (inputMonth) + { + case 1: return Month::JANUARY; + case 2: return Month::FEBRUARY; + case 3: return Month::MARCH; + case 4: return Month::APRIL; + case 5: return Month::MAY; + case 6: return Month::JUNE; + case 7: return Month::JULY; + case 8: return Month::AUGUST; + case 9: return Month::SEPTEMBER; + case 10: return Month::OCTOBER; + case 11: return Month::NOVEMBER; + case 12: return Month::DECEMBER; + default: return Month::INVALID; + } + } + } + diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index a2f2a56..9239fca 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -33,17 +33,16 @@ bool EmployeeMenu::handleOperation(int choice) { switch (choice) { - /* - case 1: + /*case 1: m_zenvyController.applyLeave(); break; case 2: m_zenvyController.viewPayslip(); - break; + break;*/ case 3: - m_zenvyController.viewPayslipHistory(); + viewPayslipHistory(m_zenvyController); break; - case 4 : + /*case 4 : m_zenvyController.raiseTicket(); break; case 5 : diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 74aadbc..5fbb32f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -65,6 +65,9 @@ bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 3: + viewPayslipHistory(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 0709976..0ae8a81 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -32,6 +32,9 @@ bool HRManagerMenu::handleOperation(int choice) { switch (choice) { + case 3: + viewPayslipHistory(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index d691228..161ec9d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool ITExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 3: + viewPayslipHistory(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 09b084e..0ceac6e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -2,7 +2,9 @@ #include #include #include +#include #include +#include #include #include #include "Enums.h" @@ -15,6 +17,33 @@ void createEmployee(std::shared_ptr controller); +inline void viewPayslipHistory(std::shared_ptr controller) +{ + auto employeePayslips = controller->getCurrentEmployee()->getEmployeePayslips(); + util::clear(); + std::cout << "Payslips\n" << std::endl; + std::cout << std::left + << std::setw(15) << "Date" + << std::setw(15) << "Payslip ID" + << std::setw(15) << "Employee ID" + << std::setw(12) << "Salary" + << std::setw(25) << "TimeStamp" + << std::endl; + for (const auto& payslip : employeePayslips) + { + std::ostringstream dateStream; + dateStream << payslip.second->getTimestamp().getYear() << " - " << Enums::getMonthString(Enums::getMonth(payslip.second->getTimestamp().getMonth())); + std::cout << std::left + << std::setw(15) << dateStream.str() + << std::setw(15) << payslip.first + << std::setw(15) << payslip.second->getEmployeeId() + << std::setw(12) << payslip.second->getSalary() + << std::setw(25) << payslip.second->getTimestamp().toString() + << std::endl; + } + util::pressEnter(); +} + inline void viewProfile(std::shared_ptr controller) { util::clear(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 1c28319..4e52414 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool TalentExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 3: + viewPayslipHistory(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 89ebf9d..8a67820 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -32,6 +32,9 @@ bool TeamExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 3: + viewPayslipHistory(m_zenvyController); + break; case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 0084158..7f5af31 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -32,6 +32,9 @@ bool TeamLeadMenu::handleOperation(int choice) { switch (choice) { + case 3: + viewPayslipHistory(m_zenvyController); + break; case 7: viewEmployees(m_zenvyController); break; From 47ca953eacc0a227d227342cef9d4a8bb0b0c636 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Thu, 16 Apr 2026 12:07:47 +0530 Subject: [PATCH 42/56] Implement Review Fixes --- .../Trenser.Zenvy/controllers/ZenvyController.cpp | 9 +++------ .../Trenser.Zenvy/controllers/ZenvyController.h | 3 +-- .../services/PayslipManagementService.cpp | 9 ++++----- .../services/PayslipManagementService.h | 5 ++--- .../Trenser.Zenvy/utilities/Timestamp.cpp | 15 --------------- Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h | 3 --- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h | 6 ++---- 7 files changed, 12 insertions(+), 38 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index bbf0272..9207108 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -77,10 +77,7 @@ void ZenvyController::persistStates() m_payslipManagementService->savePayslips(); } -std::pair, std::shared_ptr> -ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) +std::pair, std::shared_ptr> ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) { - return m_payslipManagementService->getPayslipForMonth(employeeId, month, year); -} - - + return m_payslipManagementService->getPayslipForMonth(employeeId, year, month); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 3d0190e..261cb67 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -62,8 +62,7 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); - std::pair, std::shared_ptr> - getPayslipForMonth(const std::string&, int, int); + std::pair, std::shared_ptr>getPayslipForMonth(const std::string&, int, int); //File Management void loadStates(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index c889143..e35937d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -87,8 +87,7 @@ void PayslipManagementService::savePayrolls() payrollFileManager.save(payrolls); } -std::pair, std::shared_ptr> -PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) +std::pair, std::shared_ptr> PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) { auto& payrolls = m_dataStore.getPayrolls(); auto& payslips = m_dataStore.getPayslips(); @@ -97,10 +96,10 @@ PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int const auto& payroll = payrollsPair.second; if (payroll->getEmployeeId() == employeeId) { - auto iterator = payslips.find(payroll->getId()); - if (iterator != payslips.end()) + auto payslipIterator = payslips.find(payroll->getId()); + if (payslipIterator != payslips.end()) { - const auto& payslip = iterator->second; + const auto& payslip = payslipIterator->second; if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) { return { payroll, payslip }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 74ec3b4..843371c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -11,10 +11,9 @@ public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); + std::pair, std::shared_ptr>getPayslipForMonth(const std::string&, int, int); void loadPayrolls(); void savePayrolls(); void loadPayslips(); void savePayslips(); - std::pair, std::shared_ptr> - getPayslipForMonth(const std::string&, int, int); -}; +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp index fb9dab0..1341da9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp @@ -40,21 +40,6 @@ double util::Timestamp::getDurationInSeconds(const Timestamp& startTimestamp, co return std::difftime(endTimestamp.m_time, startTimestamp.m_time); } -int util::Timestamp::getYear() const -{ - return 0; -} - -int util::Timestamp::getMonth() const -{ - return 0; -} - -int util::Timestamp::getDay() const -{ - return 0; -} - int util::Timestamp::getDateAsInt() const { std::tm timeStruct{}; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h index 4a130a3..8aedc35 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h @@ -16,9 +16,6 @@ namespace util static double getDurationInHours(const Timestamp&, const Timestamp&); static double getDurationInMinutes(const Timestamp&, const Timestamp&); static double getDurationInSeconds(const Timestamp&, const Timestamp&); - int getYear() const; - int getMonth() const; - int getDay() const; int getDateAsInt() const; int getMonth() const; int getYear() const; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 0e0a129..3261460 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -318,9 +318,7 @@ inline void viewPayslip(std::shared_ptr controller) auto payslip = result.second; if (payroll && payslip) { - std::cout << "\nPayslip for " << employee->getEmployeeName() - << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; - + std::cout << "\nPayslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; std::cout << "Basic Salary : " << payroll->getBasicSalary() << "\n"; std::cout << "House Rent Allowance : " << payroll->getHouseRentAllowance() << "\n"; std::cout << "Food Allowance : " << payroll->getFoodAllowance() << "\n"; @@ -335,4 +333,4 @@ inline void viewPayslip(std::shared_ptr controller) std::cout << "Payslip not available for " << year << "-" << month << ".\n"; } util::pressEnter(); -} +} \ No newline at end of file From 04ef7744f72d86d3452079aec878cce028b2350e Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Thu, 16 Apr 2026 14:09:28 +0530 Subject: [PATCH 43/56] Fix payslip lookup logic and enable view option for finance executive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EMP010 : View Payslip - Refactored getPayslipForMonth() to fetch payroll and payslips via employee data - Added validation for invalid employee ID - Simplified payslip search using employee-specific payslip records - Enabled “View Payslip” option in Finance Executive menu - Minor UI cleanup in payslip view (spacing and screen clear) Smitha Mohan --- .../services/PayslipManagementService.cpp | 24 +++++++++---------- .../views/FinanceExecutiveMenu.cpp | 2 ++ .../Trenser.Zenvy/views/MenuHelper.h | 5 ++-- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index e35937d..7c74f9a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -89,21 +89,21 @@ void PayslipManagementService::savePayrolls() std::pair, std::shared_ptr> PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) { - auto& payrolls = m_dataStore.getPayrolls(); - auto& payslips = m_dataStore.getPayslips(); - for (const auto& payrollsPair : payrolls) + auto& employees = m_dataStore.getEmployees(); + auto employeeIterator = employees.find(employeeId); + if (employeeIterator == employees.end()) { - const auto& payroll = payrollsPair.second; - if (payroll->getEmployeeId() == employeeId) + throw std::runtime_error("Employee not found!"); + } + auto payroll = employeeIterator->second->getPayroll(); + auto& payslips = employeeIterator->second->getEmployeePayslips(); + for (const auto& payslipPair : payslips) + { + const auto& payslip = payslipPair.second; { - auto payslipIterator = payslips.find(payroll->getId()); - if (payslipIterator != payslips.end()) + if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) { - const auto& payslip = payslipIterator->second; - if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month) - { - return { payroll, payslip }; - } + return { payroll, payslip }; } } } diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 74aadbc..2ee8c75 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -65,6 +65,8 @@ bool FinanceExecutiveMenu::handleOperation(int choice) { switch (choice) { + case 2: + viewPayslip(m_zenvyController); case 4: viewEmployees(m_zenvyController); break; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 3261460..ab35efa 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -304,7 +304,7 @@ inline void viewPayslip(std::shared_ptr controller) util::clear(); std::cout << "Enter the year: "; util::read(year); - std::cout << "\nEnter the month: "; + std::cout << "Enter the month: "; util::read(month); auto employee = controller->getCurrentEmployee(); if (!employee) @@ -318,7 +318,8 @@ inline void viewPayslip(std::shared_ptr controller) auto payslip = result.second; if (payroll && payslip) { - std::cout << "\nPayslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; + util::clear(); + std::cout << "Payslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; std::cout << "Basic Salary : " << payroll->getBasicSalary() << "\n"; std::cout << "House Rent Allowance : " << payroll->getHouseRentAllowance() << "\n"; std::cout << "Food Allowance : " << payroll->getFoodAllowance() << "\n"; From 0af64c140b037114338cd18fa7c40e074c4923b6 Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Thu, 16 Apr 2026 14:31:35 +0530 Subject: [PATCH 44/56] Implement Review Fixes EMP011 : View Payslip History - Removed getPayslips() method from ZenvyController and PayslipManagementService as part of review cleanup. - Reformatted Enums::getMonthString() and Enums::getMonth() functions for consistent indentation and readability. - Ensured switch-case blocks in Enums.h follow proper alignment and coding standards. Smitha Mohan --- .../controllers/ZenvyController.cpp | 5 -- .../controllers/ZenvyController.h | 1 - .../services/PayslipManagementService.cpp | 4 - .../services/PayslipManagementService.h | 1 - Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 81 ++++++++++++------- 5 files changed, 54 insertions(+), 38 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 071a4c2..aced692 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -53,11 +53,6 @@ void ZenvyController::generatePayslips() m_payslipManagementService->generatePayslips(); } -payslipMap& ZenvyController::getPayslips() -{ - return m_payslipManagementService->getPayslips(); -} - void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 09b61bf..56140de 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -60,7 +60,6 @@ public: //Payslip management void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); - payslipMap& getPayslips(); //File Management void loadStates(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 82519cf..0d43120 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -26,10 +26,6 @@ void PayslipManagementService::updateSalary(const std::string& employeeId, doubl } } -payslipMap& PayslipManagementService::getPayslips() { - return m_dataStore.getPayslips(); -} - void PayslipManagementService::generatePayslips() { util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::FINANCE); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 69bd7f7..9b8d372 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -12,7 +12,6 @@ private: public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; void updateSalary(const std::string&, double, double, double, double, double); - payslipMap& getPayslips(); void generatePayslips(); void loadPayrolls(); void savePayrolls(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 89f78a7..b4de6f3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -191,20 +191,34 @@ namespace Enums { { switch (month) { - case Month::JANUARY : return "January"; - case Month::FEBRUARY: return "February"; - case Month::MARCH: return "March"; - case Month::APRIL: return "April"; - case Month::MAY: return "May"; - case Month::JUNE: return "June"; - case Month::JULY: return "July"; - case Month::AUGUST: return "August"; - case Month::SEPTEMBER: return "September"; - case Month::OCTOBER: return "October"; - case Month::NOVEMBER: return "November"; - case Month::DECEMBER: return "December"; - case Month::INVALID: return "Invalid Month"; - default: return "Unknown"; + case Month::JANUARY : + return "January"; + case Month::FEBRUARY: + return "February"; + case Month::MARCH: + return "March"; + case Month::APRIL: + return "April"; + case Month::MAY: + return "May"; + case Month::JUNE: + return "June"; + case Month::JULY: + return "July"; + case Month::AUGUST: + return "August"; + case Month::SEPTEMBER: + return "September"; + case Month::OCTOBER: + return "October"; + case Month::NOVEMBER: + return "November"; + case Month::DECEMBER: + return "December"; + case Month::INVALID: + return "Invalid Month"; + default: + return "Unknown"; } } @@ -288,19 +302,32 @@ namespace Enums { { switch (inputMonth) { - case 1: return Month::JANUARY; - case 2: return Month::FEBRUARY; - case 3: return Month::MARCH; - case 4: return Month::APRIL; - case 5: return Month::MAY; - case 6: return Month::JUNE; - case 7: return Month::JULY; - case 8: return Month::AUGUST; - case 9: return Month::SEPTEMBER; - case 10: return Month::OCTOBER; - case 11: return Month::NOVEMBER; - case 12: return Month::DECEMBER; - default: return Month::INVALID; + case 1: + return Month::JANUARY; + case 2: + return Month::FEBRUARY; + case 3: + return Month::MARCH; + case 4: + return Month::APRIL; + case 5: + return Month::MAY; + case 6: + return Month::JUNE; + case 7: + return Month::JULY; + case 8: + return Month::AUGUST; + case 9: + return Month::SEPTEMBER; + case 10: + return Month::OCTOBER; + case 11: + return Month::NOVEMBER; + case 12: + return Month::DECEMBER; + default: + return Month::INVALID; } } From 92cec0521e1187c087d3fc0f923f8af399984b4a Mon Sep 17 00:00:00 2001 From: Joel Mathew Thomas Date: Thu, 16 Apr 2026 15:24:55 +0530 Subject: [PATCH 45/56] Fix payslip option call in employee menu SRS02 : Payroll and Payslip Management - Updated payslip option to use viewPayslip helper Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index f6bafd2..8749ad8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -34,7 +34,7 @@ bool EmployeeMenu::handleOperation(int choice) switch (choice) { case 2: - m_zenvyController.viewPayslip(); + viewPayslip(m_zenvyController); break; case 3: viewPayslipHistory(m_zenvyController); From b6ba8ef508e5daf796b85427ab56bc13be576901 Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Thu, 16 Apr 2026 15:39:36 +0530 Subject: [PATCH 46/56] Review Fix: Handle Empty Payslip History SRS02: Employee Management - Enhanced viewPayslipHistory() in MenuHelper.h to handle empty payslip scenarios. - Displayed "No Payslips Generated" message when no records exist. Smitha Mohan --- Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 35c7ddb..cd82082 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -22,6 +22,12 @@ inline void viewPayslipHistory(std::shared_ptr controller) { auto employeePayslips = controller->getCurrentEmployee()->getEmployeePayslips(); util::clear(); + if (employeePayslips.empty()) + { + std::cout << "No Payslips Generated"; + util::pressEnter(); + return; + } std::cout << "Payslips\n" << std::endl; std::cout << std::left << std::setw(15) << "Date" From 6a373b48dff5e4f6e29641347a6adeb4754f5fa9 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Thu, 16 Apr 2026 18:02:07 +0530 Subject: [PATCH 47/56] Change shared pointer to raw pointer in views --- .../Trenser.Zenvy/views/AdminMenu.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h | 1 - .../Trenser.Zenvy/views/EmployeeMenu.cpp | 1 - .../Trenser.Zenvy/views/EmployeeMenu.h | 3 +- .../views/FinanceExecutiveMenu.cpp | 10 ++++- .../views/FinanceExecutiveMenu.h | 1 - .../Trenser.Zenvy/views/HRManagerMenu.cpp | 1 - .../Trenser.Zenvy/views/HRManagerMenu.h | 1 - .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 1 - .../Trenser.Zenvy/views/ITExecutiveMenu.h | 1 - .../Trenser.Zenvy/views/MenuHelper.cpp | 20 ++++----- .../Trenser.Zenvy/views/MenuHelper.h | 45 +++++++++---------- .../views/TalentExecutiveMenu.cpp | 1 - .../Trenser.Zenvy/views/TalentExecutiveMenu.h | 1 - .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 1 - .../Trenser.Zenvy/views/TeamExecutiveMenu.h | 1 - .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 1 - .../Trenser.Zenvy/views/TeamLeadMenu.h | 1 - .../Trenser.Zenvy/views/UserInterface.cpp | 1 - .../Trenser.Zenvy/views/UserInterface.h | 1 - 20 files changed, 42 insertions(+), 52 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 0b6535a..8338cd9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include "AdminMenu.h" #include"InputHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h index 6144d4e..88ca794 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include"ZenvyController.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index a833dd4..33978b9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include #include "EmployeeMenu.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h index 907ab82..d29f301 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h @@ -4,14 +4,13 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include"ZenvyController.h" class EmployeeMenu { private: - ZenvyController m_zenvyController; + ZenvyController* m_zenvyController; public: EmployeeMenu() : m_zenvyController(new ZenvyController()) {}; void run(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index c19318f..68a5d26 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include "FinanceExecutiveMenu.h" #include "InputHelper.h" @@ -67,6 +66,15 @@ void FinanceExecutiveMenu::updatePayroll() } } +void FinanceExecutiveMenu::generatePayslips() +{ + util::Timestamp currentTimestamp; + util::clear(); + m_zenvyController->generatePayslips(); + std::cout << "Generated payslips for the month of " << currentTimestamp.getMonth() << "-" << currentTimestamp.getYear() << " successfully."; + util::pressEnter(); +} + /* * Function: FinanceExecutiveMenu::handleOperation * Description: Handles the finance executives menu choice and executes the corresponding action diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 664aa49..038658f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index ac108dd..3875de5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include "HRManagerMenu.h" #include "InputHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h index ed7c5fa..158deaf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include"ZenvyController.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index f491dd4..6ae71ea 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include "ITExecutiveMenu.h" #include "InputHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h index 5d32d37..e6cf86e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include"ZenvyController.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index bba68d0..cfcc4c4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -70,9 +70,9 @@ static Enums::EmployeeDesignation getEmployeeDesignation() } } -void createEmployee(std::shared_ptr controller) +void createEmployee(ZenvyController* m_zenvyController) { - auto currentEmployee = controller->getCurrentEmployee(); + auto currentEmployee = m_zenvyController->getCurrentEmployee(); Enums::EmployeeType employeeType = getEmployeeType(currentEmployee->getEmployeeType()); Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; std::string name, email, phone; @@ -98,12 +98,12 @@ void createEmployee(std::shared_ptr controller) util::read(email); std::cout << "Enter Phone: "; util::read(phone); - controller->createEmployee(employeeType, employeeDesignation, email, name, phone); + m_zenvyController->createEmployee(employeeType, employeeDesignation, email, name, phone); std::cout << "\nCreated Employee Successfully."; util::pressEnter(); } - void updateDesignation(std::shared_ptr m_zenvyController) + void updateDesignation(ZenvyController* m_zenvyController) { std::string selectedEmployeeId = selectEmployeeId(m_zenvyController->getEmployees(Enums::EmployeeType::GENERAL)); if (selectedEmployeeId.empty()) @@ -123,7 +123,7 @@ void createEmployee(std::shared_ptr controller) } } -void displayCandidateDetails(const std::vector>& shorlistedCandidates) +void displayCandidateDetails(const std::vector shorlistedCandidates) { util::clear(); std::cout << std::left @@ -148,12 +148,12 @@ void displayCandidateDetails(const std::vector>& shor } } -void addShortlistedCandidateAsEmployee(const std::shared_ptr& controller) +void addShortlistedCandidateAsEmployee(const ZenvyController* m_zenvyController) { int index; std::string name, email, phone; util::clear(); - std::vector> shortlistedCandidates = controller->getShorlistedCandidates(); + std::vector shortlistedCandidates = m_zenvyController->getShorlistedCandidates(); if (shortlistedCandidates.empty()) { std::cout << "No candidates Found!"; @@ -163,13 +163,13 @@ void addShortlistedCandidateAsEmployee(const std::shared_ptr& c displayCandidateDetails(shortlistedCandidates); std::cout << "Enter the Index: "; util::read(index); - auto currentEmployee = controller->getCurrentEmployee(); + auto currentEmployee = m_zenvyController->getCurrentEmployee(); Enums::EmployeeType employeeType; Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; if (index > 0 && index <= shortlistedCandidates.size()) { employeeType = getEmployeeType(currentEmployee->getEmployeeType()); - std::shared_ptr candidate = shortlistedCandidates[index - 1]; + Candidate* candidate = shortlistedCandidates[index - 1]; switch (employeeType) { case Enums::EmployeeType::INVALID: @@ -190,7 +190,7 @@ void addShortlistedCandidateAsEmployee(const std::shared_ptr& c util::read(email); name = candidate->getCandidateName(); phone = candidate->getCandidatePhone(); - controller->createEmployee(employeeType, employeeDesignation, email, name, phone); + m_zenvyController->createEmployee(employeeType, employeeDesignation, email, name, phone); candidate->setCandidateStatus(Enums::CandidateStatus::HIRED); std::cout << "\nCreated Employee Successfully."; util::pressEnter(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index cd82082..7cee5cb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -15,12 +15,14 @@ #include "MenuHelper.h" #include "Validator.h" -void createEmployee(std::shared_ptr controller); -void updateDesignation(std::shared_ptr m_zenvyController); +void createEmployee(ZenvyController* m_zenvyController); +void updateDesignation(ZenvyController* m_zenvyController); +void displayCandidateDetails(const std::vector shorlistedCandidates); +void addShortlistedCandidateAsEmployee(const ZenvyController* m_zenvyController); -inline void viewPayslipHistory(std::shared_ptr controller) +inline void viewPayslipHistory(ZenvyController* m_zenvyController) { - auto employeePayslips = controller->getCurrentEmployee()->getEmployeePayslips(); + auto employeePayslips = m_zenvyController->getCurrentEmployee()->getEmployeePayslips(); util::clear(); if (employeePayslips.empty()) { @@ -51,10 +53,10 @@ inline void viewPayslipHistory(std::shared_ptr controller) util::pressEnter(); } -inline void viewProfile(std::shared_ptr controller) +inline void viewProfile(ZenvyController* m_zenvyController) { util::clear(); - std::shared_ptr currentEmployee = controller->getCurrentEmployee(); + const Employee* currentEmployee = m_zenvyController->getCurrentEmployee(); if (currentEmployee) { std::cout << std::left @@ -64,7 +66,7 @@ inline void viewProfile(std::shared_ptr controller) << "Email: " << currentEmployee->getEmployeeEmail() << std::endl << "Phone: " << currentEmployee->getEmployeePhone() << std::endl; if (currentEmployee->getEmployeeType() == Enums::EmployeeType::GENERAL) { - if (auto generalEmployee = std::dynamic_pointer_cast(currentEmployee)) + if (auto generalEmployee = dynamic_cast(currentEmployee)) { std::cout << "Designation: " << Enums::getEmployeeDesignationString(generalEmployee->getDesignation()) << std::endl; } @@ -94,10 +96,7 @@ inline void viewProfile(std::shared_ptr controller) } } -void displayCandidateDetails(const std::vector>& shorlistedCandidates); -void addShortlistedCandidateAsEmployee(const std::shared_ptr& controller); - -inline void updateProfile(std::shared_ptr m_zenvyController) +inline void updateProfile(ZenvyController* m_zenvyController) { int choice; std::string name, phone; @@ -148,10 +147,10 @@ inline void updateProfile(std::shared_ptr m_zenvyController) } } -inline std::string selectEmployeeId(std::vector> allEmployees) +inline std::string selectEmployeeId(std::vector& allEmployees) { int choice; - std::map> employeeList; + std::map employeeList; int index = 0; util::clear(); if (allEmployees.empty()) @@ -177,7 +176,7 @@ inline std::string selectEmployeeId(std::vector> << std::setw(20) << "Employee Designation" << std::endl; for (const auto& employee : employeeList) { - auto generalEmployee = std::dynamic_pointer_cast(employee.second); + auto generalEmployee = dynamic_cast(employee.second); std::cout << std::left << std::setw(10) << employee.first << std::setw(15) << employee.second->getId() @@ -209,14 +208,14 @@ inline std::string selectEmployeeId(std::vector> } } -inline void deactivateEmployee(const std::shared_ptr& controller) +inline void deactivateEmployee(const ZenvyController* m_zenvyController) { - std::string selectedEmployeeId = selectEmployeeId(controller->getEmployees()); + std::string selectedEmployeeId = selectEmployeeId(m_zenvyController->getEmployees()); if (selectedEmployeeId.empty()) { return; } - if (controller->deactivateEmployee(selectedEmployeeId)) + if (m_zenvyController->deactivateEmployee(selectedEmployeeId)) { std::cout << "Employee deactivated successfully\n"; util::pressEnter(); @@ -228,7 +227,7 @@ inline void deactivateEmployee(const std::shared_ptr& controlle } } -inline void viewEmployees(std::shared_ptr m_zenvyController) +inline void viewEmployees(ZenvyController* m_zenvyController) { util::clear(); std::cout << "Employee List\n"; @@ -261,13 +260,13 @@ inline void viewEmployees(std::shared_ptr m_zenvyController) util::pressEnter(); } -inline void searchEmployee(std::shared_ptr m_zenvyController) +inline void searchEmployee(ZenvyController* m_zenvyController) { std::string name; util::clear(); std::cout << "Enter Employee Name: "; util::read(name); - std::pair>> searchResults = m_zenvyController->searchEmployee(name); + std::pair> searchResults = m_zenvyController->searchEmployee(name); if (!(searchResults.second).empty()) { std::cout << std::left @@ -333,7 +332,7 @@ inline void searchEmployee(std::shared_ptr m_zenvyController) util::pressEnter(); } -inline void viewPayslip(std::shared_ptr controller) +inline void viewPayslip(ZenvyController* m_zenvyController) { int year, month; util::clear(); @@ -341,14 +340,14 @@ inline void viewPayslip(std::shared_ptr controller) util::read(year); std::cout << "Enter the month: "; util::read(month); - auto employee = controller->getCurrentEmployee(); + auto employee = m_zenvyController->getCurrentEmployee(); if (!employee) { std::cout << "No authenticated employee.\n"; util::pressEnter(); return; } - auto result = controller->getPayslipForMonth(employee->getId(), year, month); + auto result = m_zenvyController->getPayslipForMonth(employee->getId(), year, month); auto payroll = result.first; auto payslip = result.second; if (payroll && payslip) diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index c16f65a..69e6cbd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include "TalentExecutiveMenu.h" #include "InputHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h index 93946ae..92e5a23 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include"ZenvyController.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index ed22416..9cfacf6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include "TeamExecutiveMenu.h" #include "InputHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h index 747b5d4..307d26e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include"ZenvyController.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index bb44739..6ead718 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include "TeamLeadMenu.h" #include "InputHelper.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h index 159f485..e34eee3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include"ZenvyController.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp index 2e619c4..50acbe5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #include #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h index e400ba6..6952830 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 02-Apr-2026 */ - #pragma once #include #include "AdminMenu.h" From 138901b8e9a517517cabf1a3fc3fbaa8d3722c86 Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Thu, 16 Apr 2026 18:05:11 +0530 Subject: [PATCH 48/56] Changed Shared Pointers to raw pointers in the service classes --- .../services/ApplicationConfig.cpp | 1 - .../services/ApplicationConfig.h | 1 - .../services/AttendanceManagementService.cpp | 1 - .../services/AttendanceManagementService.h | 1 - .../AuthenticationManagementService.cpp | 3 +- .../AuthenticationManagementService.h | 1 - .../services/BookingManagementService.cpp | 1 - .../services/BookingManagementService.h | 1 - .../services/EmployeeManagementService.cpp | 28 +++++++++---------- .../services/LeaveManagementService.cpp | 1 - .../services/LeaveManagementService.h | 1 - .../Trenser.Zenvy/services/LogService.cpp | 1 - .../Trenser.Zenvy/services/LogService.h | 1 - .../NotificationManagementService.cpp | 1 - .../services/NotificationManagementService.h | 1 - .../services/PayslipManagementService.cpp | 1 - .../services/PayslipManagementService.h | 1 - .../TalentAcquisitionManagementService.cpp | 1 - .../TalentAcquisitionManagementService.h | 1 - .../services/TeamManagementService.cpp | 1 - .../services/TeamManagementService.h | 1 - .../services/TicketManagementService.cpp | 1 - .../services/TicketManagementService.h | 1 - 23 files changed, 15 insertions(+), 37 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.cpp index e5a0d0e..e612cbc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 06-Apr-2026 */ - #include "ApplicationConfig.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h index 63b2dec..2658b8e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 06-Apr-2026 */ - #pragma once namespace Config diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.cpp index 2ab575a..35ae237 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 30-Apr-2026 */ - #include "AttendanceManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.h index 5f12270..a97103e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AttendanceManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Apr-2026 */ - #pragma once class AttendanceManagementService { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp index 4d4766c..4abd1ea 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include #include "AuthenticationManagementService.h" #include "ApplicationConfig.h" @@ -81,7 +80,7 @@ AuthenticationDTO AuthenticationManagementService::login(const std::string& emai */ void AuthenticationManagementService::changePassword(const std::string& password) { - Employee* authenticatedUser = m_dataStore.getAuthenticatedUser(); + Employee* authenticatedUser = m_dataStore.getAuthenticatedEmployee(); if (authenticatedUser) { authenticatedUser->setEmployeePassword(password); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h index 392065b..b7a5768 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.cpp index cb032c3..2545535 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include "BookingManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.h index 7f343a4..258ad18 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/BookingManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once class BookingManagementService { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 855e445..ecd60d9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -18,14 +18,14 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) { auto& employees = m_dataStore.getEmployees(); - std::shared_ptr authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); + Employee* authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); if (!authenticatedEmployee) { throw std::runtime_error("No authenticated user"); } Enums::EmployeeType authenticatedEmployeeType = authenticatedEmployee->getEmployeeType(); - std::shared_ptr employee; - std::shared_ptr payroll; + Employee* employee; + 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)); @@ -135,13 +135,13 @@ bool EmployeeManagementService::updateDesignation(const std::string& id, Enums:: { auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); util::enforceAuthorization(authenticatedEmployee->getEmployeeType(), Enums::EmployeeType::ADMIN, Enums::EmployeeType::HR); - std::map> employees = m_dataStore.getEmployees(); + std::map employees = m_dataStore.getEmployees(); auto employeeIterator = employees.find(id); if (employeeIterator == employees.end()) { return false; } - auto generalEmployee = std::dynamic_pointer_cast((*employeeIterator).second); + auto generalEmployee = dynamic_cast((*employeeIterator).second); if (generalEmployee) { generalEmployee->setDesignation(designation); @@ -149,24 +149,24 @@ bool EmployeeManagementService::updateDesignation(const std::string& id, Enums:: return true; } -std::shared_ptr EmployeeManagementService::getCurrentEmployee() +const Employee* EmployeeManagementService::getCurrentEmployee() { return m_dataStore.getAuthenticatedEmployee(); } void EmployeeManagementService::updateProfile(const std::string& name,const std::string& phone) { - std::shared_ptr employee = m_dataStore.getAuthenticatedEmployee(); + Employee* employee = m_dataStore.getAuthenticatedEmployee(); employee->setEmployeeName(name); employee->setEmployeePhone(phone); } -std::pair>> EmployeeManagementService::searchEmployee(const std::string& name) +std::pair> EmployeeManagementService::searchEmployee(const std::string& name) { - std::shared_ptr currentUser = m_dataStore.getAuthenticatedEmployee(); + Employee* currentUser = m_dataStore.getAuthenticatedEmployee(); Enums::EmployeeType employeeType = currentUser->getEmployeeType(); employeeMap& employees = m_dataStore.getEmployees(); - std::vector> employeeList; + std::vector employeeList; if (employees.empty()) { return std::make_pair(employeeType, employeeList); @@ -220,12 +220,12 @@ void EmployeeManagementService::saveEmployees() FileManager generalEmployeeFileManager(Config::File::GENERAL_EMPLOYEES_FILE); const auto& allEmployees = m_dataStore.getEmployees(); employeeMap employees; - std::map> generalEmployees; + std::map generalEmployees; for (auto& employeePair : allEmployees) { if (employeePair.second->getEmployeeType() == Enums::EmployeeType::GENERAL) { - generalEmployees.emplace(employeePair.first, std::static_pointer_cast(employeePair.second)); + generalEmployees.emplace(employeePair.first, static_cast(employeePair.second)); } else { @@ -236,10 +236,10 @@ void EmployeeManagementService::saveEmployees() generalEmployeeFileManager.save(generalEmployees); } -std::vector> EmployeeManagementService::getShorlistedCandidates() +std::vector EmployeeManagementService::getShorlistedCandidates() { candidateMap candidates = m_dataStore.getCandidates(); - std::vector> shortlistedCandidates; + std::vector shortlistedCandidates; for (auto& candidate : candidates) { if (candidate.second->getCandidateStatus() == Enums::CandidateStatus::SHORTLISTED) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.cpp index 733f9eb..647154e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include "LeaveManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.h index 1010ec4..40b2c4b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/LeaveManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once class LeaveManagementService { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp index 6917cda..535fb0b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 01-Apr-2026 */ - #include "LogService.h" #include "Log.h" #include "Factory.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h index c1cf644..93ff404 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 01-Apr-2026 */ - #pragma once #include "Log.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.cpp index 7eaa377..f7f94a7 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include "NotificationManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.h index 6b4aba1..cef9bfc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/NotificationManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once class NotificationManagementService { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 6029d08..d6d18ed 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include #include #include "PayslipManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index fc71191..5a79ec8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.cpp index 9e0ef96..3fb9113 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include "TalentAcquisitionManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.h index ed0dd32..c120c72 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/TalentAcquisitionManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once class TalentAcquisitionManagementService { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.cpp index 8b13b81..5db2995 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include "TeamManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.h index 21275da..eabb859 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/TeamManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once class TeamManagementService { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.cpp index bc995f9..0325609 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.cpp @@ -4,5 +4,4 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #include "TicketManagementService.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.h index 8a38d98..caa6338 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/TicketManagementService.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 30-Mar-2026 */ - #pragma once class TicketManagementService { From c7b9d7bcd5a8b630015ebacbdabc7494448380ce Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Thu, 16 Apr 2026 18:05:18 +0530 Subject: [PATCH 49/56] Changed shared pointers to raw pointers in PayslipManagementService.h and PayslipManagementService.cpp --- Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h | 8 ++++---- .../Trenser.Zenvy/services/PayslipManagementService.cpp | 4 ++-- .../Trenser.Zenvy/services/PayslipManagementService.h | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index 8ab60b7..957ea04 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -27,11 +27,11 @@ #include "Payroll.h" #include "Payslip.h" -using employeeMap = std::map; -using payrollMap = std::map>; -using payslipMap = std::map>; +using employeeMap = std::map; +using payrollMap = std::map; +using payslipMap = std::map; using logMap = std::map; -using candidateMap = std::map>; +using candidateMap = std::map; class DataStore { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index d6d18ed..313a35d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -61,7 +61,7 @@ void PayslipManagementService::generatePayslips() auto payroll = employee->getPayroll(); double salary; salary = payroll->getBasicSalary() + payroll->getFoodAllowance() + payroll->getHouseRentAllowance() - payroll->getEmployeePFContribution() - payroll->getEmployerPFContribution(); - std::shared_ptr payslip = Factory::getObject(salary, employee->getId()); + Payslip* payslip = Factory::getObject(salary, employee->getId()); employee->addPayslip(payslip); payslips.emplace(payslip->getId(), payslip); } @@ -93,7 +93,7 @@ void PayslipManagementService::savePayrolls() payrollFileManager.save(payrolls); } -std::pair, std::shared_ptr> PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) +std::pair PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) { auto& employees = m_dataStore.getEmployees(); auto employeeIterator = employees.find(employeeId); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h index 5a79ec8..6d1e5cc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.h @@ -9,7 +9,7 @@ #include #include"DataStore.h" -using payslipMap = std::map>; +using payslipMap = std::map; class PayslipManagementService { @@ -19,7 +19,7 @@ public: PayslipManagementService() : m_dataStore(DataStore::getInstance()) {}; void updateSalary(const std::string&, double, double, double, double, double); void generatePayslips(); - std::pair, std::shared_ptr>getPayslipForMonth(const std::string&, int, int); + std::pairgetPayslipForMonth(const std::string&, int, int); void loadPayrolls(); void savePayrolls(); void loadPayslips(); From 703cea447eef439fe9497d6cf26c8059a92cb245 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Thu, 16 Apr 2026 18:08:56 +0530 Subject: [PATCH 50/56] Change shared pointers to raw pointers in model classes --- Trenser.Zenvy/Trenser.Zenvy/models/Admin.h | 5 ++--- Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Employee.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Leave.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Log.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Notification.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp | 3 +-- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 3 +-- Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp | 3 +-- Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h | 3 +-- Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Room.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h | 3 +-- Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Team.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h | 3 +-- Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h | 1 - 30 files changed, 15 insertions(+), 38 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h index b729750..fdd5daa 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Admin.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 31-Mar-2026 */ - #pragma once #include "Employee.h" @@ -16,7 +15,7 @@ public: const std::string& name, const std::string& phone, const std::string& email, - std::shared_ptr payroll + Payroll* payroll ) :Employee(name, phone, email, Enums::EmployeeType::ADMIN, payroll) {}; Admin(const std::string& id, const std::string& name, @@ -36,4 +35,4 @@ public: Enums::EmployeeType::ADMIN, accountStatus) {} ~Admin() = default; -}; +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index 45b9d79..f34534f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -189,7 +189,7 @@ std::string Employee::serialize() const return serializedEmployee.str(); } -std::shared_ptr Employee::deserialize(const std::string& record) +Employee* Employee::deserialize(const std::string& record) { std::string id, name, phone, password, email; std::string teamId, teamStatusString, accountStatusString, employeeTypeString; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index b10f86e..640a9be 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -94,7 +94,7 @@ public: void addLeave(Leave* leave); Enums::EmployeeType getEmployeeType() const; virtual std::string serialize() const; - static std::shared_ptr deserialize(const std::string&); + static Employee* deserialize(const std::string&); static std::string getHeaders(); virtual ~Employee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h index fa69c08..3a899d9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h @@ -15,7 +15,7 @@ public: const std::string& name, const std::string& phone, const std::string& email, - std::shared_ptr payroll + Payroll* payroll ) :Employee(name, phone, email, Enums::EmployeeType::FINANCE, payroll) {}; FinanceExecutive(const std::string& id, const std::string& name, diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 5005753..8ce81ba 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -34,7 +34,7 @@ std::string GeneralEmployee::serialize() const return serializedEmployee.str(); } -std::shared_ptr GeneralEmployee::deserialize(const std::string& record) +GeneralEmployee* GeneralEmployee::deserialize(const std::string& record) { std::string id, name, phone, password, email; std::string teamId, teamStatusString, accountStatusString, employeeTypeString, employeeDesignationString; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 3947f12..885349c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -48,7 +48,7 @@ public: Enums::EmployeeDesignation getDesignation() const; void setDesignation(Enums::EmployeeDesignation designation); std::string serialize() const override; - static std::shared_ptr deserialize(const std::string&); + static GeneralEmployee* deserialize(const std::string&); static std::string getHeaders(); ~GeneralEmployee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h index a912b3f..41fa740 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h @@ -15,7 +15,7 @@ public: const std::string& name, const std::string& phone, const std::string& email, - std::shared_ptr payroll + Payroll* payroll ) :Employee(name, phone, email, Enums::EmployeeType::HR, payroll) {}; HRManager(const std::string& id, const std::string& name, diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h index 4a48b5e..9d02cd1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h @@ -15,7 +15,7 @@ public: const std::string& name, const std::string& phone, const std::string& email, - std::shared_ptr payroll + Payroll* payroll ) :Employee(name, phone, email, Enums::EmployeeType::IT, payroll) {}; ITExecutive(const std::string& id, const std::string& name, diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp index 33c85e0..ecb91d4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.cpp @@ -4,7 +4,6 @@ File: JobListing.cpp * Author : Trenser * Created : 01-Apr-2026 */ - #include "JobListing.h" int JobListing::m_uid = 0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h index 48f3ee7..3332b08 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h @@ -4,7 +4,6 @@ File: JobListing.h * Author : Trenser * Created : 01-Apr-2026 */ - #pragma once #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp index e7d4577..3519d1e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp @@ -4,7 +4,6 @@ File: Leave.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "Leave.h" int Leave::m_uid = 0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h index a7cad19..1da66ca 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h @@ -4,7 +4,6 @@ File: Leave.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include #include "Enums.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp index af1e9e2..15ff4ce 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp @@ -4,7 +4,6 @@ File: Log.cpp * Author : Trenser * Created : 01-Apr-2026 */ - #include "Log.h" //Getters and setters diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Log.h b/Trenser.Zenvy/Trenser.Zenvy/models/Log.h index f258643..cfb830d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Log.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Log.h @@ -4,7 +4,6 @@ File: Log.h * Author : Trenser * Created : 01-Apr-2026 */ - #pragma once #include #include "Timestamp.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp index 4527e2e..3da5d9b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.cpp @@ -4,7 +4,6 @@ File: Notification.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "Notification.h" int Notification::m_uid = 0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h index fa3e5a0..196078a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Notification.h @@ -4,7 +4,6 @@ File: Notification.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include #include "Enums.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index 99a0e90..7ed278b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -4,7 +4,6 @@ File: Payroll.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "Payroll.h" #include "StringHelper.h" #include "Factory.h" @@ -111,7 +110,7 @@ std::string Payroll::serialize() const return serializedPayroll.str(); } -std::shared_ptr Payroll::deserialize(const std::string& record) +Payroll* Payroll::deserialize(const std::string& record) { std::string id, employeeId; std::string basicSalaryString, houseRentAllowanceString, foodAllowanceString, employeePFString, employerPFString; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index fbb360d..cb5e74b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -4,7 +4,6 @@ File: Payroll.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include #include @@ -62,6 +61,6 @@ public: void setEmployeePFContribution(double); void setEmployerPFContribution(double); std::string serialize() const; - static std::shared_ptr deserialize(const std::string&); + static Payroll* 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 1c20103..e0198f2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp @@ -4,7 +4,6 @@ File: Payslip.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include #include "Payslip.h" #include "StringHelper.h" @@ -68,7 +67,7 @@ std::string Payslip::serialize() const return serializedPayslip.str(); } -std::shared_ptr Payslip::deserialize(const std::string& record) +Payslip* Payslip::deserialize(const std::string& record) { std::string id, employeeId, timestampString; std::string salaryString; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h index 1b27587..7144570 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h @@ -4,7 +4,6 @@ File: Payslip.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include #include @@ -32,6 +31,6 @@ public: const util::Timestamp& getTimestamp() const; const std::string& getEmployeeId() const; std::string serialize() const; - static std::shared_ptr deserialize(const std::string&); + static Payslip* deserialize(const std::string&); static std::string getHeaders(); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp index 364bd69..b760a32 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp @@ -4,7 +4,6 @@ File: Room.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "Room.h" int Room::m_uid = 0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h index 23e3f95..3eb6934 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h @@ -4,7 +4,6 @@ File: Room.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.cpp index 5c44816..7023cd6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.cpp @@ -4,5 +4,4 @@ File: TalentExecutive.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "TalentExecutive.h" \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h index 6f7c9ca..06b31a4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h @@ -4,7 +4,6 @@ File: TalentExecutive.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include "Employee.h" @@ -16,7 +15,7 @@ public: const std::string& name, const std::string& phone, const std::string& email, - std::shared_ptr payroll + Payroll* payroll ) :Employee(name, phone, email, Enums::EmployeeType::TALENT_ACQUISITION, payroll) {}; TalentExecutive(const std::string& id, const std::string& name, diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp index 7aa1c97..5168acb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.cpp @@ -4,7 +4,6 @@ File: Team.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "Team.h" int Team::m_uid = 0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h index 25937a5..9296243 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h @@ -4,7 +4,6 @@ File: Team.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.cpp index c780ad7..91d1691 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.cpp @@ -4,5 +4,4 @@ File: TeamExecutive.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "TeamExecutive.h" \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h index 2fc41f1..84e1b3f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h @@ -4,7 +4,6 @@ File: TeamExecutive.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include "Employee.h" @@ -16,7 +15,7 @@ public: const std::string& name, const std::string& phone, const std::string& email, - std::shared_ptr payroll + Payroll* payroll ) :Employee(name, phone, email, Enums::EmployeeType::TEAM, payroll) {}; TeamExecutive(const std::string& id, const std::string& name, diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp index 58fc5b7..a07174e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.cpp @@ -4,7 +4,6 @@ File: Ticket.cpp * Author : Trenser * Created : 31-Mar-2026 */ - #include "Ticket.h" int Ticket::m_uid = 0; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h index a4ec474..ba5f25e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Ticket.h @@ -4,7 +4,6 @@ File: Ticket.h * Author : Trenser * Created : 31-Mar-2026 */ - #pragma once #include #include "Enums.h" From 133785dd3f7264630c939f26342d22e27375d8d3 Mon Sep 17 00:00:00 2001 From: Joel Mathew Thomas Date: Fri, 17 Apr 2026 09:33:37 +0530 Subject: [PATCH 51/56] refactor: change memory management and fix related code - Switched shared_ptr to raw pointers - Added cleanup logic in DataStore - Fixed Factory object creation - Updated function signatures to match changes - Small refactors and formatting fixes --- .../Trenser.FileManager/FileManager.h | 2 +- .../controllers/ZenvyController.cpp | 57 ++++++----- .../controllers/ZenvyController.h | 95 ++++++++++--------- .../Trenser.Zenvy/datastores/DataStore.cpp | 62 +++++++----- .../Trenser.Zenvy/datastores/DataStore.h | 2 +- .../Trenser.Zenvy/factories/Factory.h | 15 ++- Trenser.Zenvy/Trenser.Zenvy/models/Employee.h | 1 + .../Trenser.Zenvy/models/JobListing.h | 1 - .../Trenser.Zenvy/models/Payroll.cpp | 1 + Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Room.h | 1 - Trenser.Zenvy/Trenser.Zenvy/models/Team.h | 1 - .../services/EmployeeManagementService.cpp | 4 +- .../services/EmployeeManagementService.h | 30 +++--- .../Trenser.Zenvy/utilities/Validator.cpp | 8 +- .../Trenser.Zenvy/utilities/Validator.h | 9 +- .../Trenser.Zenvy/views/MenuHelper.h | 7 +- 18 files changed, 154 insertions(+), 144 deletions(-) diff --git a/Trenser.FileManager/Trenser.FileManager/FileManager.h b/Trenser.FileManager/Trenser.FileManager/FileManager.h index 1c9f3b2..198934d 100644 --- a/Trenser.FileManager/Trenser.FileManager/FileManager.h +++ b/Trenser.FileManager/Trenser.FileManager/FileManager.h @@ -2,7 +2,7 @@ #include #include "FileIO.h" -template using objects = std::map>; +template using objects = std::map; template class FileManager diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 9584cce..e4d91bb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -15,14 +15,13 @@ * password - password of the employee * Returns: * Tuple - login status, employee type, employee designation - * login status - success or failed + * login status - success or failed * employee type - type of the employee logged in * employee designation - designation if employee type is GENERAL. */ - AuthenticationDTO ZenvyController::login(const std::string& email, const std::string& password) { - return m_authenticationManagementService->login(email, password); + return m_authenticationManagementService->login(email, password); } /* @@ -36,7 +35,7 @@ AuthenticationDTO ZenvyController::login(const std::string& email, const std::st void ZenvyController::logout() { - m_authenticationManagementService->logout(); + m_authenticationManagementService->logout(); } /* @@ -50,73 +49,73 @@ void ZenvyController::logout() void ZenvyController::changePassword(const std::string& password) { - m_authenticationManagementService->changePassword(password); + m_authenticationManagementService->changePassword(password); } //Employee Management -void ZenvyController::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, 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) const { - m_employeeManagementService->createEmployee(employeeType, employeeDesignation, email, name, phone); + m_employeeManagementService->createEmployee(employeeType, employeeDesignation, email, name, phone); } -bool ZenvyController::deactivateEmployee(const std::string& id) +bool ZenvyController::deactivateEmployee(const std::string& id) const { - 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); + m_employeeManagementService->updateProfile(name, phone); } -std::pair>> ZenvyController::searchEmployee(const std::string& name) +std::pair> ZenvyController::searchEmployee(const std::string& name) { - return m_employeeManagementService->searchEmployee(name); + return m_employeeManagementService->searchEmployee(name); } -std::shared_ptr ZenvyController::getCurrentEmployee() +const Employee* ZenvyController::getCurrentEmployee() const { - return m_employeeManagementService->getCurrentEmployee(); + return m_employeeManagementService->getCurrentEmployee(); } -bool ZenvyController::updateDesignation(const std::string& id,Enums::EmployeeDesignation designation) +bool ZenvyController::updateDesignation(const std::string& id, Enums::EmployeeDesignation designation) { - return m_employeeManagementService->updateDesignation(id,designation); + return m_employeeManagementService->updateDesignation(id, designation); } -std::vector> ZenvyController::getShorlistedCandidates() +std::vector ZenvyController::getShorlistedCandidates() const { - return m_employeeManagementService->getShorlistedCandidates(); + return m_employeeManagementService->getShorlistedCandidates(); } //Payslip Management void ZenvyController::updateSalary(const std::string& employeeId, double basicSalary, double houseRentAllowance, double foodAllowance, double employeePFContribution, double employerPFContribution) { - m_payslipManagementService->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); + m_payslipManagementService->updateSalary(employeeId, basicSalary, houseRentAllowance, foodAllowance, employeePFContribution, employerPFContribution); } void ZenvyController::generatePayslips() { - m_payslipManagementService->generatePayslips(); + m_payslipManagementService->generatePayslips(); } void ZenvyController::loadStates() { - m_employeeManagementService->loadEmployees(); - m_payslipManagementService->loadPayrolls(); - m_payslipManagementService->loadPayslips(); + m_employeeManagementService->loadEmployees(); + m_payslipManagementService->loadPayrolls(); + m_payslipManagementService->loadPayslips(); } void ZenvyController::persistStates() { - m_employeeManagementService->saveEmployees(); - m_payslipManagementService->savePayrolls(); - m_payslipManagementService->savePayslips(); + m_employeeManagementService->saveEmployees(); + m_payslipManagementService->savePayrolls(); + m_payslipManagementService->savePayslips(); } -std::pair, std::shared_ptr> ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) +std::pair ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) { - return m_payslipManagementService->getPayslipForMonth(employeeId, year, month); + return m_payslipManagementService->getPayslipForMonth(employeeId, year, month); } ZenvyController::~ZenvyController() @@ -131,4 +130,4 @@ ZenvyController::~ZenvyController() delete m_talentAcquisitionManagementService; delete m_teamManagementService; delete m_ticketManagementService; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index c6151eb..3f503d4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -22,55 +22,56 @@ class ZenvyController { private: - AuthenticationManagementService* m_authenticationManagementService; - AttendanceManagementService* m_attendanceManagementService; - BookingManagementService* m_bookingManagementService; - EmployeeManagementService* m_employeeManagementService; - LeaveManagementService* m_leaveManagementService; - NotificationManagementService* m_notificationManagementService; - PayslipManagementService* m_payslipManagementService; - TalentAcquisitionManagementService* m_talentAcquisitionManagementService; - TeamManagementService* m_teamManagementService; - TicketManagementService* m_ticketManagementService; + AuthenticationManagementService* m_authenticationManagementService; + AttendanceManagementService* m_attendanceManagementService; + BookingManagementService* m_bookingManagementService; + EmployeeManagementService* m_employeeManagementService; + LeaveManagementService* m_leaveManagementService; + NotificationManagementService* m_notificationManagementService; + PayslipManagementService* m_payslipManagementService; + TalentAcquisitionManagementService* m_talentAcquisitionManagementService; + TeamManagementService* m_teamManagementService; + TicketManagementService* m_ticketManagementService; public: - ZenvyController() : - m_authenticationManagementService(new AuthenticationManagementService()), - m_attendanceManagementService(new AttendanceManagementService()), - m_bookingManagementService(new BookingManagementService()), - m_employeeManagementService(new EmployeeManagementService()), - m_leaveManagementService(new LeaveManagementService()), - m_notificationManagementService(new NotificationManagementService()), - m_payslipManagementService(new PayslipManagementService()), - m_talentAcquisitionManagementService(new TalentAcquisitionManagementService()), - m_teamManagementService(new TeamManagementService()), - m_ticketManagementService(new TicketManagementService()) {}; - - //Authentication - AuthenticationDTO login(const std::string& email, const std::string& password); - void logout(); - void changePassword(const std::string&); + ZenvyController() : + m_authenticationManagementService(new AuthenticationManagementService()), + m_attendanceManagementService(new AttendanceManagementService()), + m_bookingManagementService(new BookingManagementService()), + m_employeeManagementService(new EmployeeManagementService()), + m_leaveManagementService(new LeaveManagementService()), + m_notificationManagementService(new NotificationManagementService()), + m_payslipManagementService(new PayslipManagementService()), + m_talentAcquisitionManagementService(new TalentAcquisitionManagementService()), + m_teamManagementService(new TeamManagementService()), + m_ticketManagementService(new TicketManagementService()) {}; + ~ZenvyController(); - //Employee Management - void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); - bool deactivateEmployee(const std::string&); - std::shared_ptr getCurrentEmployee(); - void updateProfile(const std::string&,const std::string&); - std::pair>> searchEmployee(const std::string&); - bool updateDesignation(const std::string&,Enums::EmployeeDesignation); - std::vector> getShorlistedCandidates(); + //Authentication + AuthenticationDTO login(const std::string& email, const std::string& password); + void logout(); + void changePassword(const std::string&); - template - Employees getEmployees(Types ...types) - { - return m_employeeManagementService->getEmployees(types...); - } + //Employee Management + void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&) const; + bool deactivateEmployee(const std::string&) const; + const Employee* getCurrentEmployee() const; + void updateProfile(const std::string&, const std::string&); + std::pair> searchEmployee(const std::string&); + bool updateDesignation(const std::string&, Enums::EmployeeDesignation); + std::vector getShorlistedCandidates() const; - //Payslip management - void updateSalary(const std::string&, double, double, double, double, double); - void generatePayslips(); - std::pair, std::shared_ptr>getPayslipForMonth(const std::string&, int, int); + template + Employees getEmployees(Types ...types) const + { + return m_employeeManagementService->getEmployees(types...); + } - //File Management - void loadStates(); - void persistStates(); -}; + //Payslip management + void updateSalary(const std::string&, double, double, double, double, double); + void generatePayslips(); + std::pairgetPayslipForMonth(const std::string&, int, int); + + //File Management + void loadStates(); + void persistStates(); +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index a8a23a7..4495e9d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -8,19 +8,19 @@ #include "DataStore.h" #include "EmployeeManagementService.h" -/* - * Function: getInstance - * Description: provides a singleton instance of the DataStore. - * Parameters: - * None - * Returns: - * DataStore& - reference to the single DataStore object. - */ + /* + * Function: getInstance + * Description: provides a singleton instance of the DataStore. + * Parameters: + * None + * Returns: + * DataStore& - reference to the single DataStore object. + */ DataStore& DataStore::getInstance() { - static DataStore dataStore; - return dataStore; + static DataStore dataStore; + return dataStore; } /* @@ -34,7 +34,7 @@ DataStore& DataStore::getInstance() logMap& DataStore::getLogs() { - return m_logs; + return m_logs; } /* @@ -48,7 +48,7 @@ logMap& DataStore::getLogs() Employee*& DataStore::getAuthenticatedEmployee() { - return m_authenticatedEmployee; + return m_authenticatedEmployee; } /* @@ -62,7 +62,7 @@ Employee*& DataStore::getAuthenticatedEmployee() void DataStore::setAuthenticatedEmployee(Employee* authenticatedEmployee) { - m_authenticatedEmployee = authenticatedEmployee; + m_authenticatedEmployee = authenticatedEmployee; } /* @@ -76,12 +76,22 @@ void DataStore::setAuthenticatedEmployee(Employee* authenticatedEmployee) employeeMap& DataStore::getEmployees() { - return m_employees; + return m_employees; } payrollMap& DataStore::getPayrolls() { - return m_payrolls; + return m_payrolls; +} + +payslipMap& DataStore::getPayslips() +{ + return m_payslips; +} + +candidateMap& DataStore::getCandidates() +{ + return m_candidates; } DataStore::~DataStore() @@ -91,19 +101,25 @@ DataStore::~DataStore() delete pair.second; } m_employees.clear(); + for (auto& pair : m_payrolls) + { + delete pair.second; + } + m_payrolls.clear(); + for (auto& pair : m_payslips) + { + delete pair.second; + } + m_payslips.clear(); for (auto& pair : m_logs) { delete pair.second; } m_logs.clear(); - if (m_authenticatedEmployee) + for (auto& pair : m_candidates) { - delete m_authenticatedEmployee; - m_authenticatedEmployee = nullptr; + delete pair.second; } -} - -payslipMap& DataStore::getPayslips() -{ - return m_payslips; + m_candidates.clear(); + m_authenticatedEmployee = nullptr; } diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index 957ea04..3fe7ed6 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -49,7 +49,7 @@ public: DataStore& operator=(const DataStore&) = delete; DataStore(DataStore&&) = delete; DataStore& operator=(DataStore&&) = delete; - employeeMap& getEmployees(); + employeeMap& getEmployees(); payrollMap& getPayrolls(); payslipMap& getPayslips(); logMap& getLogs(); diff --git a/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h b/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h index 216a823..15b829d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h +++ b/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h @@ -20,11 +20,10 @@ public: * Args - constructor arguments forwarded to T's constructor * Returns: * std::shared_ptr - a shared pointer managing the newly created object - */ - - template - static T* getObject(Args&&... args) - { - return T*(std::forward(args)...); - } -}; + */; + template + static T* getObject(Args&&... args) + { + return new T(std::forward(args)...); + } +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index 640a9be..214e89c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -44,6 +44,7 @@ public: m_accountStatus(Enums::AccountStatus::ACTIVE), m_teamStatus(Enums::TeamStatus::NOT_IN_TEAM), m_teamId(""), + m_payroll(nullptr), m_employeeType(Enums::EmployeeType::GENERAL) {} Employee(const std::string& name, const std::string& phone, diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h index 3332b08..ddbf58d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/JobListing.h @@ -7,7 +7,6 @@ File: JobListing.h #pragma once #include #include -#include #include "Candidate.h" #include "Enums.h" using candidateMap = std::map; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index 7ed278b..d5afbdb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -4,6 +4,7 @@ File: Payroll.cpp * Author : Trenser * Created : 31-Mar-2026 */ +#include #include "Payroll.h" #include "StringHelper.h" #include "Factory.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h index cb5e74b..ebf13ed 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -6,7 +6,6 @@ File: Payroll.h */ #pragma once #include -#include #include "Timestamp.h" class Payroll diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h index 7144570..e5e617f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h @@ -5,7 +5,6 @@ File: Payslip.h * Created : 31-Mar-2026 */ #pragma once -#include #include #include "Timestamp.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h index 3eb6934..63a52a8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.h @@ -7,7 +7,6 @@ File: Room.h #pragma once #include #include -#include #include "Booking.h" using bookingMap = std::map; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h index 9296243..7afcaae 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Team.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Team.h @@ -7,7 +7,6 @@ File: Team.h #pragma once #include #include -#include #include "Employee.h" using employeeMap = std::map; diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index ecd60d9..f0c9045 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -24,8 +24,8 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, throw std::runtime_error("No authenticated user"); } Enums::EmployeeType authenticatedEmployeeType = authenticatedEmployee->getEmployeeType(); - Employee* employee; - Payroll* payroll; + Employee* employee = nullptr; + Payroll* payroll = nullptr; if (employeeType != Enums::EmployeeType::GENERAL && util::hasActiveEmployeeOfType(employeeType, employees)) { throw std::runtime_error("Cannot create more than one employee of type " + Enums::getEmployeeTypeString(employeeType)); diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index a292c31..d8ea1bc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -7,23 +7,23 @@ #include "Enums.h" #include "StringHelper.h" -using Employees = std::vector>; +using Employees = std::vector; class EmployeeManagementService { private: - DataStore& m_dataStore; + DataStore& m_dataStore; public: - EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; - void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); - bool deactivateEmployee(const std::string&); - bool updateDesignation(const std::string&,Enums::EmployeeDesignation); - void updateProfile(const std::string&,const std::string&); - std::pair>> searchEmployee(const std::string&); - std::shared_ptr getCurrentEmployee(); - std::vector> getShorlistedCandidates(); - void loadEmployees(); - void saveEmployees(); + EmployeeManagementService() : m_dataStore(DataStore::getInstance()) {}; + void createEmployee(Enums::EmployeeType, Enums::EmployeeDesignation, const std::string&, const std::string&, const std::string&); + bool deactivateEmployee(const std::string&); + bool updateDesignation(const std::string&, Enums::EmployeeDesignation); + void updateProfile(const std::string&, const std::string&); + std::pair> searchEmployee(const std::string&); + const Employee* getCurrentEmployee(); + std::vector getShorlistedCandidates(); + void loadEmployees(); + void saveEmployees(); template Employees getEmployees(Types... types) @@ -52,8 +52,8 @@ public: std::sort( filteredEmployees.begin(), filteredEmployees.end(), - [](const std::shared_ptr& employeeOne, - const std::shared_ptr& employeeTwo) + [](const Employee* employeeOne, + const Employee* employeeTwo) { return util::extractNumber(employeeOne->getId()) < util::extractNumber(employeeTwo->getId()); @@ -61,4 +61,4 @@ public: ); return filteredEmployees; } -}; +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp index 2996d71..f06a860 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp @@ -112,7 +112,7 @@ bool util::isPasswordValid(const std::string& password) return hasUpper && hasLower && hasDigit && hasSpecial; } -bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std::map> & employees) +bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std::map & employees) { for (const auto& employeePair : employees) { @@ -125,7 +125,7 @@ bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std:: return false; } -bool util::isEmailDuplicate(const std::string& email, const std::map>& employees) +bool util::isEmailDuplicate(const std::string& email, const std::map& employees) { for (const auto& employeePair : employees) { @@ -138,7 +138,7 @@ bool util::isEmailDuplicate(const std::string& email, const std::map>& employees) +bool util::isPhoneDuplicate(const std::string& phone, const std::map& employees) { for (const auto& employeePair : employees) { @@ -151,7 +151,7 @@ bool util::isPhoneDuplicate(const std::string& phone, const std::map>& employees) +bool util::isPhoneDuplicate(const std::string& phone, const std::vector& employees) { for (const auto& employee : employees) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h index c7d2b60..eaef165 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 01-Apr-2026 */ - #pragma once #include #include @@ -21,8 +20,8 @@ namespace util bool isPhoneNumberValid(const std::string&); bool isEmailValid(const std::string&); bool isPasswordValid(const std::string&); - bool hasActiveEmployeeOfType(Enums::EmployeeType, const std::map>&); - bool isEmailDuplicate(const std::string&, const std::map>&); - bool isPhoneDuplicate(const std::string&, const std::map>&); - bool isPhoneDuplicate(const std::string&, const std::vector>&); + bool hasActiveEmployeeOfType(Enums::EmployeeType, const std::map&); + bool isEmailDuplicate(const std::string&, const std::map&); + bool isPhoneDuplicate(const std::string&, const std::map&); + bool isPhoneDuplicate(const std::string&, const std::vector&); } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index 7cee5cb..d7517f1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -1,6 +1,5 @@ #pragma once #include -#include #include #include #include @@ -22,7 +21,7 @@ void addShortlistedCandidateAsEmployee(const ZenvyController* m_zenvyController) inline void viewPayslipHistory(ZenvyController* m_zenvyController) { - auto employeePayslips = m_zenvyController->getCurrentEmployee()->getEmployeePayslips(); + auto& employeePayslips = m_zenvyController->getCurrentEmployee()->getEmployeePayslips(); util::clear(); if (employeePayslips.empty()) { @@ -147,7 +146,7 @@ inline void updateProfile(ZenvyController* m_zenvyController) } } -inline std::string selectEmployeeId(std::vector& allEmployees) +inline std::string selectEmployeeId(const std::vector& allEmployees) { int choice; std::map employeeList; @@ -353,7 +352,7 @@ inline void viewPayslip(ZenvyController* m_zenvyController) if (payroll && payslip) { util::clear(); - std::cout << "Payslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << std::setfill('0') << month << ")\n\n"; + std::cout << "Payslip for " << employee->getEmployeeName() << " (" << year << "-" << std::setw(2) << month << ")\n\n"; std::cout << "Basic Salary : " << payroll->getBasicSalary() << "\n"; std::cout << "House Rent Allowance : " << payroll->getHouseRentAllowance() << "\n"; std::cout << "Food Allowance : " << payroll->getFoodAllowance() << "\n"; From a0c499d78fdf34fb844ddc9a3a30b15c6400d051 Mon Sep 17 00:00:00 2001 From: Tinu Johnson Date: Fri, 17 Apr 2026 10:26:33 +0530 Subject: [PATCH 52/56] Add function headers in models --- .../Trenser.Zenvy/models/Employee.cpp | 62 +++++++++++++++---- Trenser.Zenvy/Trenser.Zenvy/models/FAQ.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/FAQ.h | 3 +- .../Trenser.Zenvy/models/FinanceExecutive.h | 3 +- .../Trenser.Zenvy/models/GeneralEmployee.cpp | 26 ++++++-- .../Trenser.Zenvy/models/HRManager.cpp | 2 +- .../Trenser.Zenvy/models/HRManager.h | 3 +- .../Trenser.Zenvy/models/ITExecutive.h | 3 +- Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp | 8 +-- 9 files changed, 79 insertions(+), 33 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index f34534f..7795d56 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -105,6 +105,16 @@ const leaveMap& Employee::getEmployeeLeaves() const return m_leaves; } +Enums::EmployeeType Employee::getEmployeeType() const +{ + return m_employeeType; +} + +std::string Employee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType"; +} + void Employee::setEmployeeId(const std::string& id) { m_id = id; @@ -145,6 +155,14 @@ void Employee::setEmployeePayroll(Payroll* payroll) m_payroll = payroll; } +/* +* Function: addPayslip +* Description : Adds a payslip to the employee's payslip records +* Parameters : + payslip - Pointer to the Payslip object to be added +* Returns : + void + */ void Employee::addPayslip(Payslip* payslip) { if (payslip) @@ -153,6 +171,14 @@ void Employee::addPayslip(Payslip* payslip) } } +/* + * Function: addAttendance + * Description: Adds an attendance record to the employee's attendance history + * Parameters: + * attendance - Pointer to the Attendance object containing login information + * Returns: + * void + */ void Employee::addAttendance(Attendance* attendance) { if (attendance) @@ -161,6 +187,14 @@ void Employee::addAttendance(Attendance* attendance) } } +/* + * Function: addLeave + * Description: Adds a leave record to the employee's leave history + * Parameters: + * leave - Pointer to the Leave object to be added + * Returns: + * void + */ void Employee::addLeave(Leave* leave) { if (leave) @@ -169,11 +203,14 @@ void Employee::addLeave(Leave* leave) } } -Enums::EmployeeType Employee::getEmployeeType() const -{ - return m_employeeType; -} - +/* + * Function: serialize + * Description: Serializes the employee object's core details into a comma-separated string + * Parameters: + None + * Returns: + A string containing serialized employee data in CSV format + */ std::string Employee::serialize() const { std::ostringstream serializedEmployee; @@ -189,6 +226,14 @@ std::string Employee::serialize() const return serializedEmployee.str(); } +/* + * Function: deserialize + * Description: Creates and returns an Employee object from a serialized comma-separated record string + * Parameters: + record - A string containing serialized employee data in CSV format + * Returns: + Pointer to a newly created Employee object based on the employee type + */ Employee* Employee::deserialize(const std::string& record) { std::string id, name, phone, password, email; @@ -279,9 +324,4 @@ Employee* Employee::deserialize(const std::string& record) default: return nullptr; } -} - -std::string Employee::getHeaders() -{ - return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType"; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.cpp index a5e7b41..4badf93 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.cpp @@ -4,4 +4,4 @@ * Author: Trenser * Created: 02-Apr-2026 */ -#include "Faq.h" +#include "Faq.h" \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.h b/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.h index 3788612..a2ba8bf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FAQ.h @@ -8,5 +8,4 @@ class Faq { -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h index 3a899d9..1a58dfe 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/FinanceExecutive.h @@ -35,5 +35,4 @@ public: Enums::EmployeeType::FINANCE, accountStatus) {} ~FinanceExecutive() = default; -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 8ce81ba..fcf784c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -13,11 +13,24 @@ Enums::EmployeeDesignation GeneralEmployee::getDesignation() const return m_designation; } +std::string GeneralEmployee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType,EmployeeDesignation"; +} + void GeneralEmployee::setDesignation(Enums::EmployeeDesignation designation) { m_designation = designation; } +/* + * Function: serialize + * Description: Serializes the general employee's details, including designation, into a comma-separated string + * Parameters: + None + * Returns: + A string containing serialized general employee data in CSV format + */ std::string GeneralEmployee::serialize() const { std::ostringstream serializedEmployee; @@ -34,6 +47,14 @@ std::string GeneralEmployee::serialize() const return serializedEmployee.str(); } +/* + * Function: deserialize + * Description: Creates and returns a GeneralEmployee object from a serialized comma-separated record string + * Parameters: + record - A string containing serialized general employee data in CSV format + * Returns: + Pointer to a newly created GeneralEmployee object + */ GeneralEmployee* GeneralEmployee::deserialize(const std::string& record) { std::string id, name, phone, password, email; @@ -64,9 +85,4 @@ GeneralEmployee* GeneralEmployee::deserialize(const std::string& record) employeeDesignation, accountStatus ); -} - -std::string GeneralEmployee::getHeaders() -{ - return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType,EmployeeDesignation"; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.cpp index 8f9615f..3a3733b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.cpp @@ -4,4 +4,4 @@ * Author: Trenser * Created: 31-Mar-2026 */ -#include "HRManager.h" +#include "HRManager.h" \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h index 41fa740..6a08f03 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/HRManager.h @@ -35,5 +35,4 @@ public: Enums::EmployeeType::HR, accountStatus) {} ~HRManager() = default; -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h index 9d02cd1..ab807e8 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/ITExecutive.h @@ -35,5 +35,4 @@ public: Enums::EmployeeType::IT, accountStatus) {} ~ITExecutive() = default; -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp index 3519d1e..e33e319 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp @@ -86,10 +86,4 @@ void Leave::setNumberOfMedicalLeave(int value) void Leave::setLeaveType(Enums::LeaveType type) { m_leaveType = type; -} - -int Leave::m_numberOfGeneralLeave = 12; - -int Leave::m_numberOfRestrictedLeave = 2; - -int Leave::m_numberOfMedicalLeave = 6; \ No newline at end of file +} \ No newline at end of file From a8d50c29f8d29a4fdb2eec28959d674fbd9ce82f Mon Sep 17 00:00:00 2001 From: Joel Mathew Thomas Date: Fri, 17 Apr 2026 10:27:27 +0530 Subject: [PATCH 53/56] Add function headers in Controller, DataStore, and Utilities --- .../controllers/ZenvyController.cpp | 130 ++++++++++++++- .../Trenser.Zenvy/datastores/DataStore.cpp | 47 ++++-- .../Trenser.Zenvy/factories/Factory.h | 22 +-- Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h | 157 ++++++++++++++---- .../Trenser.Zenvy/utilities/InputHelper.h | 4 - .../Trenser.Zenvy/utilities/OutputHelper.cpp | 2 - .../Trenser.Zenvy/utilities/OutputHelper.h | 1 - .../Trenser.Zenvy/utilities/StringHelper.cpp | 16 +- .../Trenser.Zenvy/utilities/StringHelper.h | 6 + .../Trenser.Zenvy/utilities/Timestamp.cpp | 56 ++++--- .../Trenser.Zenvy/utilities/Timestamp.h | 1 - .../Trenser.Zenvy/utilities/Validator.cpp | 57 +++++-- 12 files changed, 390 insertions(+), 109 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index e4d91bb..26e3df4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created : 01-Apr-2026 */ - #include "ZenvyController.h" /* @@ -25,14 +24,13 @@ AuthenticationDTO ZenvyController::login(const std::string& email, const std::st } /* - * Function: changePassword - * Description: updates the password of the currently authenticated employee. + * Function: logout + * Description: logs out the currently authenticated employee * Parameters: - * password - the new password to be set for the employee + * None * Returns: * void - no return value */ - void ZenvyController::logout() { m_authenticationManagementService->logout(); @@ -40,65 +38,153 @@ void ZenvyController::logout() /* * Function: changePassword - * Description: updates the password of the currently authenticated employee. + * Description: updates the password of the currently authenticated employee * Parameters: * password - the new password to be set for the employee * Returns: * void - no return value */ - void ZenvyController::changePassword(const std::string& password) { m_authenticationManagementService->changePassword(password); } -//Employee Management +/* + * Function: createEmployee + * Description: creates a new employee with the given details + * Parameters: + * employeeType - type of employee to be created + * employeeDesignation - designation of the employee + * email - email address of the employee + * name - name of the employee + * phone - phone number of the employee + * Returns: + * void - no return value + */ void ZenvyController::createEmployee(Enums::EmployeeType employeeType, Enums::EmployeeDesignation employeeDesignation, const std::string& email, const std::string& name, const std::string& phone) const { m_employeeManagementService->createEmployee(employeeType, employeeDesignation, email, name, phone); } +/* + * Function: deactivateEmployee + * Description: deactivates an employee based on employee ID + * Parameters: + * id - unique employee ID + * Returns: + * bool - true if deactivated successfully, false otherwise + */ bool ZenvyController::deactivateEmployee(const std::string& id) const { return m_employeeManagementService->deactivateEmployee(id); } +/* + * Function: updateProfile + * Description: updates the profile of the currently authenticated employee + * Parameters: + * name - updated name of the employee + * phone - updated phone number + * Returns: + * void - no return value + */ void ZenvyController::updateProfile(const std::string& name, const std::string& phone) { m_employeeManagementService->updateProfile(name, phone); } +/* + * Function: searchEmployee + * Description: searches employees based on name + * Parameters: + * name - name or partial name of the employee + * Returns: + * Pair of employee type and list of matching employees + */ std::pair> ZenvyController::searchEmployee(const std::string& name) { return m_employeeManagementService->searchEmployee(name); } +/* + * Function: getCurrentEmployee + * Description: retrieves the currently authenticated employee + * Parameters: + * None + * Returns: + * Pointer to the authenticated employee + */ const Employee* ZenvyController::getCurrentEmployee() const { return m_employeeManagementService->getCurrentEmployee(); } +/* + * Function: updateDesignation + * Description: updates the designation of an employee + * Parameters: + * id - unique employee ID + * designation - new designation to be assigned + * Returns: + * bool - true if update is successful, false otherwise + */ bool ZenvyController::updateDesignation(const std::string& id, Enums::EmployeeDesignation designation) { return m_employeeManagementService->updateDesignation(id, designation); } +/* + * Function: getShorlistedCandidates + * Description: retrieves the list of shortlisted candidates + * Parameters: + * None + * Returns: + * Vector of shortlisted candidate pointers + */ std::vector ZenvyController::getShorlistedCandidates() const { return m_employeeManagementService->getShorlistedCandidates(); } -//Payslip Management +/* + * Function: updateSalary + * Description: updates salary details of an employee + * Parameters: + * employeeId - unique employee ID + * basicSalary - basic salary amount + * houseRentAllowance - HRA amount + * foodAllowance - food allowance amount + * employeePFContribution - employee PF contribution + * employerPFContribution - employer PF contribution + * Returns: + * void - no return value + */ 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); } +/* + * Function: generatePayslips + * Description: generates payslips for all eligible employees + * Parameters: + * None + * Returns: + * void - no return value + */ void ZenvyController::generatePayslips() { m_payslipManagementService->generatePayslips(); } +/* + * Function: loadStates + * Description: loads persisted application data into memory + * Parameters: + * None + * Returns: + * void - no return value + */ void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); @@ -106,6 +192,14 @@ void ZenvyController::loadStates() m_payslipManagementService->loadPayslips(); } +/* + * Function: persistStates + * Description: saves current application data to storage + * Parameters: + * None + * Returns: + * void - no return value + */ void ZenvyController::persistStates() { m_employeeManagementService->saveEmployees(); @@ -113,11 +207,29 @@ void ZenvyController::persistStates() m_payslipManagementService->savePayslips(); } +/* + * Function: getPayslipForMonth + * Description: retrieves payroll and payslip details for a specific month + * Parameters: + * employeeId - unique employee ID + * year - year of the payslip + * month - month of the payslip + * Returns: + * Pair of payroll and payslip pointers + */ std::pair ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month) { return m_payslipManagementService->getPayslipForMonth(employeeId, year, month); } +/* + * Function: ~ZenvyController + * Description: cleans up dynamically allocated service objects + * Parameters: + * None + * Returns: + * void - no return value + */ ZenvyController::~ZenvyController() { delete m_authenticationManagementService; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index 4495e9d..fa5610d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -16,7 +16,6 @@ * Returns: * DataStore& - reference to the single DataStore object. */ - DataStore& DataStore::getInstance() { static DataStore dataStore; @@ -31,7 +30,6 @@ DataStore& DataStore::getInstance() * Returns: * logMap& - reference to the log map. */ - logMap& DataStore::getLogs() { return m_logs; @@ -39,13 +37,12 @@ logMap& DataStore::getLogs() /* * Function: getAuthenticatedEmployee - * Description: returns the currently authenticated employee. + * Description: retrieves the currently authenticated employee. * Parameters: * None * Returns: - * std::shared_ptr& - reference to the authenticated employee object. + * Employee*& - reference to the authenticated employee pointer. */ - Employee*& DataStore::getAuthenticatedEmployee() { return m_authenticatedEmployee; @@ -55,11 +52,10 @@ Employee*& DataStore::getAuthenticatedEmployee() * Function: setAuthenticatedEmployee * Description: sets the currently authenticated employee. * Parameters: - * authenticatedEmployee - shared pointer to the employee object to be set as authenticated. + * authenticatedEmployee - pointer to the employee to be set as authenticated. * Returns: * void - no return value. */ - void DataStore::setAuthenticatedEmployee(Employee* authenticatedEmployee) { m_authenticatedEmployee = authenticatedEmployee; @@ -67,33 +63,64 @@ void DataStore::setAuthenticatedEmployee(Employee* authenticatedEmployee) /* * Function: getEmployees - * Description: retrieves the employee map containing all employees. + * Description: retrieves the map containing all employees. * Parameters: * None * Returns: * employeeMap& - reference to the employee map. */ - employeeMap& DataStore::getEmployees() { return m_employees; } +/* + * Function: getPayrolls + * Description: retrieves the map containing all payroll records. + * Parameters: + * None + * Returns: + * payrollMap& - reference to the payroll map. + */ payrollMap& DataStore::getPayrolls() { return m_payrolls; } +/* + * Function: getPayslips + * Description: retrieves the map containing all payslip records. + * Parameters: + * None + * Returns: + * payslipMap& - reference to the payslip map. + */ payslipMap& DataStore::getPayslips() { return m_payslips; } +/* + * Function: getCandidates + * Description: retrieves the map containing all shortlisted candidates. + * Parameters: + * None + * Returns: + * candidateMap& - reference to the candidate map. + */ candidateMap& DataStore::getCandidates() { return m_candidates; } +/* + * Function: ~DataStore + * Description: releases all dynamically allocated objects stored in the DataStore. + * Parameters: + * None + * Returns: + * void - no return value. + */ DataStore::~DataStore() { for (auto& pair : m_employees) @@ -122,4 +149,4 @@ DataStore::~DataStore() } m_candidates.clear(); m_authenticatedEmployee = nullptr; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h b/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h index 15b829d..40eaf40 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h +++ b/Trenser.Zenvy/Trenser.Zenvy/factories/Factory.h @@ -1,7 +1,7 @@ /* * File: Factory.h - * Description: Provides a generic factory utility to create shared_ptr instances of objects. - * Author: Ajmal J S + * Description: Provides a generic factory utility to create objects. + * Author: Trenser * Created: 01-Apr-2026 */ @@ -13,17 +13,17 @@ class Factory public: /* - * Function: getObject - * Description: Creates and returns a shared_ptr to an object of type T. - * Parameters: - * T - the type of object to be created - * Args - constructor arguments forwarded to T's constructor - * Returns: - * std::shared_ptr - a shared pointer managing the newly created object - */; + * Function: getObject + * Description: Creates and returns a dynamically allocated object of type T. + * Parameters: + * T - the type of object to be created + * Args - constructor arguments forwarded to T's constructor + * Returns: + * T* - pointer to the newly created object + */ template static T* getObject(Args&&... args) { return new T(std::forward(args)...); } -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 6f939e4..1bef70f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -10,19 +10,19 @@ namespace Enums { - enum class AccountStatus + enum class AccountStatus { ACTIVE, INACTIVE }; - enum class TeamStatus + enum class TeamStatus { IN_TEAM, NOT_IN_TEAM }; - enum class CandidateStatus + enum class CandidateStatus { PENDING, SHORTLISTED, @@ -116,6 +116,14 @@ namespace Enums { INVALID }; + /* + * Function: getAccountStatusString + * Description: Converts AccountStatus enum value to string. + * Parameters: + * status - account status enum + * Returns: + * std::string - string representation of status + */ inline std::string getAccountStatusString(AccountStatus status) { switch (status) @@ -129,6 +137,14 @@ namespace Enums { } } + /* + * Function: getEmployeeTypeString + * Description: Converts EmployeeType enum value to string. + * Parameters: + * type - employee type enum + * Returns: + * std::string - string representation of employee type + */ inline std::string getEmployeeTypeString(EmployeeType type) { switch (type) @@ -154,6 +170,14 @@ namespace Enums { } } + /* + * Function: getTeamStatusString + * Description: Converts TeamStatus enum value to string. + * Parameters: + * status - team status enum + * Returns: + * std::string - string representation of team status + */ inline std::string getTeamStatusString(TeamStatus status) { switch (status) @@ -167,6 +191,14 @@ namespace Enums { } } + /* + * Function: getEmployeeDesignationString + * Description: Converts EmployeeDesignation enum value to string. + * Parameters: + * designation - employee designation enum + * Returns: + * std::string - string representation of designation + */ inline std::string getEmployeeDesignationString(EmployeeDesignation designation) { switch (designation) @@ -184,9 +216,17 @@ namespace Enums { } } - inline std::string getCandidateStatusString(CandidateStatus status) + /* + * Function: getCandidateStatusString + * Description: Converts CandidateStatus enum value to string. + * Parameters: + * status - candidate status enum + * Returns: + * std::string - string representation of candidate status + */ + inline std::string getCandidateStatusString(CandidateStatus status) { - switch (status) + switch (status) { case CandidateStatus::PENDING: return "Pending"; case CandidateStatus::SHORTLISTED: return "Shortlisted"; @@ -195,41 +235,57 @@ namespace Enums { } } + /* + * Function: getMonthString + * Description: Converts Month enum value to month name. + * Parameters: + * month - month enum + * Returns: + * std::string - month name + */ inline std::string getMonthString(Month month) { switch (month) { - case Month::JANUARY : + case Month::JANUARY: return "January"; - case Month::FEBRUARY: + case Month::FEBRUARY: return "February"; - case Month::MARCH: + case Month::MARCH: return "March"; - case Month::APRIL: + case Month::APRIL: return "April"; - case Month::MAY: + case Month::MAY: return "May"; - case Month::JUNE: + case Month::JUNE: return "June"; - case Month::JULY: + case Month::JULY: return "July"; - case Month::AUGUST: + case Month::AUGUST: return "August"; - case Month::SEPTEMBER: + case Month::SEPTEMBER: return "September"; - case Month::OCTOBER: + case Month::OCTOBER: return "October"; - case Month::NOVEMBER: + case Month::NOVEMBER: return "November"; - case Month::DECEMBER: + case Month::DECEMBER: return "December"; - case Month::INVALID: + case Month::INVALID: return "Invalid Month"; - default: + default: return "Unknown"; } } + /* + * Function: getAccountStatus + * Description: Converts string to AccountStatus enum. + * Parameters: + * input - string representation of account status + * Returns: + * AccountStatus - enum value + */ inline AccountStatus getAccountStatus(const std::string& input) { if (input == "ACTIVE") @@ -243,6 +299,14 @@ namespace Enums { return AccountStatus::INACTIVE; } + /* + * Function: getEmployeeType + * Description: Converts string to EmployeeType enum. + * Parameters: + * input - string representation of employee type + * Returns: + * EmployeeType - enum value + */ inline EmployeeType getEmployeeType(const std::string& input) { if (input == "GENERAL") @@ -276,6 +340,14 @@ namespace Enums { return EmployeeType::INVALID; } + /* + * Function: getTeamStatus + * Description: Converts string to TeamStatus enum. + * Parameters: + * str - string representation of team status + * Returns: + * TeamStatus - enum value + */ inline TeamStatus getTeamStatus(const std::string& str) { if (str == "IN_TEAM") @@ -289,6 +361,14 @@ namespace Enums { return TeamStatus::NOT_IN_TEAM; } + /* + * Function: getEmployeeDesignation + * Description: Converts string to EmployeeDesignation enum. + * Parameters: + * input - string representation of designation + * Returns: + * EmployeeDesignation - enum value + */ inline EmployeeDesignation getEmployeeDesignation(const std::string& input) { if (input == "JUNIOR") @@ -305,39 +385,46 @@ namespace Enums { } return EmployeeDesignation::INVALID; } - + + /* + * Function: getMonth + * Description: Converts integer to Month enum. + * Parameters: + * inputMonth - month number (112) + * Returns: + * Month - enum value + */ inline Month getMonth(const int inputMonth) { switch (inputMonth) { - case 1: + case 1: return Month::JANUARY; - case 2: + case 2: return Month::FEBRUARY; - case 3: + case 3: return Month::MARCH; - case 4: + case 4: return Month::APRIL; - case 5: + case 5: return Month::MAY; - case 6: + case 6: return Month::JUNE; - case 7: + case 7: return Month::JULY; - case 8: + case 8: return Month::AUGUST; - case 9: + case 9: return Month::SEPTEMBER; - case 10: + case 10: return Month::OCTOBER; - case 11: + case 11: return Month::NOVEMBER; - case 12: + case 12: return Month::DECEMBER; - default: + default: return Month::INVALID; } } -} - +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h index 245ea34..eb23b24 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/InputHelper.h @@ -4,7 +4,6 @@ * Author: Smitha * Created: 08-Apr-2026 */ - #pragma once #include #include @@ -21,7 +20,6 @@ namespace util * Returns: * void - throws runtime_error if input is invalid */ - template inline void read(T& value) { @@ -41,7 +39,6 @@ namespace util * Returns: * void - no return value */ - inline void read(std::string& value) { std::getline(std::cin >> std::ws, value); @@ -53,7 +50,6 @@ namespace util * Parameters: None * Returns: void - no return value */ - inline void pressEnter() { std::cout << std::endl; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.cpp index ce37ac4..e113f4f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.cpp @@ -4,7 +4,6 @@ * Author: Trenser * Created: 01-04-2026 */ - #include "outputHelper.h" /* @@ -14,7 +13,6 @@ * Returns: * void - no return value */ - void util::clear() { std::cout << "\x1B[2J\x1B[H" << std::flush; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.h index 08a5b5f..0c17c57 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/OutputHelper.h @@ -4,7 +4,6 @@ * Author: Trenser * Created: 01-04-2026 */ - #pragma once #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp index 00af011..2f32a39 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.cpp @@ -1,6 +1,20 @@ +/* + * File: StringHelper.cpp + * Description: Provides functions to help with string manipulation. + * Author: Trenser + * Created: 10-04-2026 +*/ #include "StringHelper.h" #include +/* + * Function: extractNumber + * Description: Extracts and returns the numeric value formed by digits in the input string. + * Parameters: + * input - string containing numeric and non-numeric characters + * Returns: + * int - number extracted from the input string + */ int util::extractNumber(const std::string& input) { int result = 0; @@ -12,4 +26,4 @@ int util::extractNumber(const std::string& input) } } return result; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h index 12df49a..cc6e74a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/StringHelper.h @@ -1,3 +1,9 @@ +/* + * File: StringHelper.h + * Description: Provides functions to help with string manipulation. + * Author: Trenser + * Created: 10-04-2026 +*/ #pragma once #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp index 6172503..ba581db 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.cpp @@ -6,21 +6,19 @@ * Author: Trenser * Created: 01-Apr-2026 */ - #include #include #include #include "Timestamp.h" -/* -* Function: Timestamp -* Description: Default constructor that initializes the timestamp to the current system time. -* Parameters: -* None -* Returns: -* Timestamp object -*/ - + /* + * Function: Timestamp + * Description: Default constructor that initializes the timestamp to the current system time. + * Parameters: + * None + * Returns: + * Timestamp object + */ util::Timestamp::Timestamp() { m_time = std::time(nullptr); @@ -34,7 +32,6 @@ util::Timestamp::Timestamp() * Returns: * Timestamp object */ - util::Timestamp::Timestamp(std::time_t timeValue) { m_time = timeValue; @@ -50,7 +47,6 @@ util::Timestamp::Timestamp(std::time_t timeValue) * Throws: * runtime_error if the string format is invalid */ - util::Timestamp util::Timestamp::fromString(const std::string& timeString) { std::tm timeStruct = {}; @@ -72,7 +68,6 @@ util::Timestamp util::Timestamp::fromString(const std::string& timeString) * Returns: * string - formatted as "YYYY-MM-DD HH:MM:SS" */ - std::string util::Timestamp::toString() const { std::tm timeStruct = {}; @@ -91,7 +86,6 @@ std::string util::Timestamp::toString() const * Returns: * double - duration in seconds */ - double util::Timestamp::getDurationInSeconds(const Timestamp& startTimestamp, const Timestamp& endTimestamp) { return std::difftime(endTimestamp.m_time, startTimestamp.m_time); @@ -105,7 +99,6 @@ double util::Timestamp::getDurationInSeconds(const Timestamp& startTimestamp, co * Returns: * int - date as YYYYMMDD */ - int util::Timestamp::getDateAsInt() const { std::tm timeStruct{}; @@ -116,6 +109,14 @@ int util::Timestamp::getDateAsInt() const return year * 10000 + month * 100 + day; } +/* +* Function: getMonth +* Description: Extracts the month value from the timestamp. +* Parameters: +* None +* Returns: +* int - month value (1 to 12) +*/ int util::Timestamp::getMonth() const { std::tm timeStruct{}; @@ -123,6 +124,14 @@ int util::Timestamp::getMonth() const return timeStruct.tm_mon + 1; } +/* +* Function: getYear +* Description: Extracts the year value from the timestamp. +* Parameters: +* None +* Returns: +* int - year value +*/ int util::Timestamp::getYear() const { std::tm timeStruct{}; @@ -130,6 +139,14 @@ int util::Timestamp::getYear() const return timeStruct.tm_year + 1900; } +/* +* Function: getDay +* Description: Extracts the day value from the timestamp. +* Parameters: +* None +* Returns: +* int - day of the month +*/ int util::Timestamp::getDay() const { std::tm timeStruct{}; @@ -146,7 +163,6 @@ int util::Timestamp::getDay() const * Returns: * double - duration in minutes */ - double util::Timestamp::getDurationInMinutes(const Timestamp& startTimestamp, const Timestamp& endTimestamp) { return getDurationInSeconds(startTimestamp, endTimestamp) / 60.0; @@ -161,7 +177,6 @@ double util::Timestamp::getDurationInMinutes(const Timestamp& startTimestamp, co * Returns: * double - duration in hours */ - double util::Timestamp::getDurationInHours(const Timestamp& startTimestamp, const Timestamp& endTimestamp) { return getDurationInSeconds(startTimestamp, endTimestamp) / 3600.0; @@ -175,7 +190,6 @@ double util::Timestamp::getDurationInHours(const Timestamp& startTimestamp, cons * Returns: * bool - true if current timestamp is earlier */ - bool util::Timestamp::operator<(const Timestamp& other) const { return m_time < other.m_time; @@ -189,7 +203,6 @@ bool util::Timestamp::operator<(const Timestamp& other) const * Returns: * bool - true if current timestamp is later */ - bool util::Timestamp::operator>(const Timestamp& other) const { return m_time > other.m_time; @@ -203,7 +216,6 @@ bool util::Timestamp::operator>(const Timestamp& other) const * Returns: * bool - true if current timestamp is earlier or equal */ - bool util::Timestamp::operator<=(const Timestamp& other) const { return m_time <= other.m_time; @@ -217,7 +229,6 @@ bool util::Timestamp::operator<=(const Timestamp& other) const * Returns: * bool - true if current timestamp is later or equal */ - bool util::Timestamp::operator>=(const Timestamp& other) const { return m_time >= other.m_time; @@ -231,8 +242,7 @@ bool util::Timestamp::operator>=(const Timestamp& other) const * Returns: * bool - true if both timestamps are equal */ - bool util::Timestamp::operator==(const Timestamp& other) const { return m_time == other.m_time; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h index b55b7a8..56a6a0b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Timestamp.h @@ -6,7 +6,6 @@ * Author: Trenser * Created: 01-Apr-2026 */ - #pragma once #include #include diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp index f06a860..5b1631c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Validator.cpp @@ -11,15 +11,14 @@ #include "Employee.h" #include "ApplicationConfig.h" - /* - * Function: isPhoneNumberValid - * Description: Validates whether the given string is a valid phone number. - * Parameters: - * phoneNumber - string containing the phone number to validate - * Returns: - * bool - true if the phone number is valid (10 digits, all numeric), false otherwise - */ - +/* + * Function: isPhoneNumberValid + * Description: Validates whether the given string is a valid phone number. + * Parameters: + * phoneNumber - string containing the phone number to validate + * Returns: + * bool - true if the phone number is valid (10 digits, all numeric), false otherwise + */ bool util::isPhoneNumberValid(const std::string& phoneNumber) { if (phoneNumber.size() != 10) { @@ -41,7 +40,6 @@ bool util::isPhoneNumberValid(const std::string& phoneNumber) { * Returns: * bool - true if the email contains exactly one '@' character and is not at the start or end, false otherwise */ - bool util::isEmailValid(const std::string& email) { size_t index = email.find('@'); if (index == std::string::npos) @@ -72,7 +70,6 @@ bool util::isEmailValid(const std::string& email) { * - Must contain at least one uppercase letter, one lowercase letter, one digit, and one special character * - Must not contain whitespace */ - bool util::isPasswordValid(const std::string& password) { if (password == Config::Authentication::DEFAULT_PASSWORD) @@ -112,7 +109,16 @@ bool util::isPasswordValid(const std::string& password) return hasUpper && hasLower && hasDigit && hasSpecial; } -bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std::map & employees) +/* + * Function: hasActiveEmployeeOfType + * Description: Checks whether there is any active employee of the given employee type. + * Parameters: + * employeeType - the type of employee to check against + * employees - map of employee ID to Employee* objects + * Returns: + * bool - true if an active employee of the given type exists, otherwise false + */ +bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std::map& employees) { for (const auto& employeePair : employees) { @@ -125,6 +131,15 @@ bool util::hasActiveEmployeeOfType(Enums::EmployeeType employeeType, const std:: return false; } +/* + * Function: isEmailDuplicate + * Description: Checks if an email already exists among the given employees. + * Parameters: + * email - the email address to check + * employees - map of employee ID to Employee* objects + * Returns: + * bool - true if a duplicate email is found, otherwise false + */ bool util::isEmailDuplicate(const std::string& email, const std::map& employees) { for (const auto& employeePair : employees) @@ -138,6 +153,15 @@ bool util::isEmailDuplicate(const std::string& email, const std::map& employees) { for (const auto& employeePair : employees) @@ -151,6 +175,15 @@ bool util::isPhoneDuplicate(const std::string& phone, const std::map& employees) { for (const auto& employee : employees) From 6496fcbc857c4a6ee678057c536bc7a0aef74dde Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Fri, 17 Apr 2026 10:32:12 +0530 Subject: [PATCH 54/56] Add function headers to models --- Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp | 1 - .../Trenser.Zenvy/models/Payroll.cpp | 28 +++++++++++++++---- Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h | 2 +- .../Trenser.Zenvy/models/Payslip.cpp | 28 +++++++++++++++---- Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h | 2 +- Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp | 8 ++++++ .../Trenser.Zenvy/models/TalentExecutive.h | 3 +- .../Trenser.Zenvy/models/TeamExecutive.h | 3 +- 8 files changed, 56 insertions(+), 19 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp index 15ff4ce..579b908 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Log.cpp @@ -6,7 +6,6 @@ File: Log.cpp */ #include "Log.h" -//Getters and setters const util::Timestamp& Log::getTimestamp() const { return m_timestamp; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp index d5afbdb..ba958ce 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.cpp @@ -73,6 +73,11 @@ double Payroll::getEmployerPFContribution() const return m_employerPFContribution; } +std::string Payroll::getHeaders() +{ + return "PayrollId,EmployeeId,BasicSalary,HouseRentAllowance,FoodAllowance,EmployeePFContribution,EmployerPFContribution"; +} + void Payroll::setBasicSalary(double basicSalary) { m_basicSalary = basicSalary; @@ -98,6 +103,14 @@ void Payroll::setEmployerPFContribution(double value) m_employerPFContribution = value; } +/* +Function: serialize +Description: Converts the payroll object into a comma-separated string. +Parameters: + None +Returns: + A serialized string representation of the payroll. +*/ std::string Payroll::serialize() const { std::ostringstream serializedPayroll; @@ -111,6 +124,14 @@ std::string Payroll::serialize() const return serializedPayroll.str(); } +/* +Function: deserialize +Description: Creates a Payroll object from a serialized comma-separated string. +Parameters: + record - Serialized payroll data. +Returns: + Pointer to a Payroll object. +*/ Payroll* Payroll::deserialize(const std::string& record) { std::string id, employeeId; @@ -144,9 +165,4 @@ Payroll* Payroll::deserialize(const std::string& record) { 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 ebf13ed..7b4699b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payroll.h @@ -54,6 +54,7 @@ public: double getFoodAllowance() const; double getEmployeePFContribution() const; double getEmployerPFContribution() const; + static std::string getHeaders(); void setBasicSalary(double); void setHouseRentAllowance(double); void setFoodAllowance(double); @@ -61,5 +62,4 @@ public: void setEmployerPFContribution(double); std::string serialize() const; static Payroll* 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 e0198f2..1f4f705 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.cpp @@ -57,6 +57,19 @@ const std::string& Payslip::getEmployeeId() const return m_employeeId; } +std::string Payslip::getHeaders() +{ + return "PayslipId,EmployeeId,Salary,Timestamp"; +} + +/* +Function: serialize +Description: Converts the payslip object into a comma-separated string. +Parameters: + None +Returns: + A serialized string representation of the payslip. +*/ std::string Payslip::serialize() const { std::ostringstream serializedPayslip; @@ -67,6 +80,14 @@ std::string Payslip::serialize() const return serializedPayslip.str(); } +/* +Function: deserialize +Description: Creates a Payslip object from a serialized comma-separated string. +Parameters: + record - Serialized payslip data. +Returns: + Pointer to a Payslip object. +*/ Payslip* Payslip::deserialize(const std::string& record) { std::string id, employeeId, timestampString; @@ -92,9 +113,4 @@ Payslip* Payslip::deserialize(const std::string& record) { throw std::runtime_error("Failed to deserialize Payslip object"); } -} - -std::string Payslip::getHeaders() -{ - return "PayslipId,EmployeeId,Salary,Timestamp"; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h index e5e617f..108b9c5 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Payslip.h @@ -25,11 +25,11 @@ public: util::Timestamp timestamp); const std::string& getId() const; double getSalary() const; + static std::string getHeaders(); void setPayslipId(const std::string& id); void setSalary(double salary); const util::Timestamp& getTimestamp() const; const std::string& getEmployeeId() const; std::string serialize() const; static Payslip* deserialize(const std::string&); - static std::string getHeaders(); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp index b760a32..6c1df34 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Room.cpp @@ -33,6 +33,14 @@ void Room::setRoomName(const std::string& name) m_name = name; } +/* +Function: addBooking +Description: Adds a valid booking to the rooms booking list using the booking ID as the key. +Parameters: + booking - A pointer to a Booking object to be added to the room. +Returns: + void +*/ void Room::addBooking(Booking* booking) { if (booking) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h index 06b31a4..9ddde43 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TalentExecutive.h @@ -36,5 +36,4 @@ public: accountStatus) { } ~TalentExecutive() = default; -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h index 84e1b3f..b550be3 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/TeamExecutive.h @@ -35,5 +35,4 @@ public: Enums::EmployeeType::TEAM, accountStatus) {} ~TeamExecutive() = default; -}; - +}; \ No newline at end of file From 7d75f978323a860cf513149722e2f135ddc48830 Mon Sep 17 00:00:00 2001 From: Ajmal Jalaludeen Date: Fri, 17 Apr 2026 12:00:35 +0530 Subject: [PATCH 55/56] Add function headers to Service Layers --- .../AuthenticationManagementService.h | 2 +- .../services/EmployeeManagementService.cpp | 118 +++++++++++++++--- .../services/EmployeeManagementService.h | 17 +++ .../Trenser.Zenvy/services/LogService.cpp | 11 +- .../Trenser.Zenvy/services/LogService.h | 2 +- .../services/PayslipManagementService.cpp | 69 +++++++++- .../utilities/AuthorizationHelper.h | 38 +++++- 7 files changed, 238 insertions(+), 19 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h index b7a5768..b4669d4 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h @@ -24,4 +24,4 @@ public: AuthenticationDTO login(const std::string& username, const std::string& password); void logout(); void changePassword(const std::string&); -}; +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index f0c9045..c5751bf 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -1,3 +1,11 @@ +/* + * File: EmployeeManagementService.h + * Description: Provides services for managing employees, including creation, deactivation, + * designation updates, profile modifications, searching, and retrieval of + * shortlisted candidates. + * Author: Trenser + * Created: 07-Apr-2026 + */ #include #include #include @@ -15,6 +23,19 @@ #include "FileManager.h" #include "ApplicationConfig.h" + /* + * Function: createEmployee + * Description: Creates a new employee of the specified type and designation, validates + * email and phone, enforces authorization, and associates payroll. + * Parameters: + * employeeType - type of employee (HR, IT, Finance, Team, Talent Acquisition, General) + * employeeDesignation - designation for general employees (Junior, Senior) + * email - employee email address + * name - employee name + * phone - employee phone number + * Returns: + * None + */ 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(); @@ -113,6 +134,16 @@ void EmployeeManagementService::createEmployee(Enums::EmployeeType employeeType, m_dataStore.getPayrolls().emplace(std::make_pair(payroll->getId(), payroll)); m_dataStore.getEmployees().emplace(std::make_pair(employee->getId(), employee)); } + +/* + * Function: deactivateEmployee + * Description: Deactivates an employee account by setting its status to INACTIVE. + * Prevents deactivation of Admin accounts. + * Parameters: + * id - unique identifier of the employee + * Returns: + * bool - true if deactivation succeeded, false otherwise + */ bool EmployeeManagementService::deactivateEmployee(const std::string& id) { auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); @@ -131,6 +162,15 @@ bool EmployeeManagementService::deactivateEmployee(const std::string& id) return true; } + /* + * Function: updateDesignation + * Description: Updates the designation of a general employee. + * Parameters: + * id - unique identifier of the employee + * designation - new designation to assign + * Returns: + * bool - true if update succeeded, false otherwise + */ bool EmployeeManagementService::updateDesignation(const std::string& id, Enums::EmployeeDesignation designation) { auto& authenticatedEmployee = m_dataStore.getAuthenticatedEmployee(); @@ -149,11 +189,28 @@ bool EmployeeManagementService::updateDesignation(const std::string& id, Enums:: return true; } +/* + * Function: getCurrentEmployee + * Description: Retrieves the currently authenticated employee from the DataStore. + * Parameters: + * None + * Returns: + * const Employee* - pointer to the current employee + */ const Employee* EmployeeManagementService::getCurrentEmployee() { return m_dataStore.getAuthenticatedEmployee(); } +/* + * Function: updateProfile + * Description: Updates the name and phone number of the currently authenticated employee. + * Parameters: + * name - new employee name + * phone - new employee phone number + * Returns: + * None + */ void EmployeeManagementService::updateProfile(const std::string& name,const std::string& phone) { Employee* employee = m_dataStore.getAuthenticatedEmployee(); @@ -161,6 +218,15 @@ void EmployeeManagementService::updateProfile(const std::string& name,const std: employee->setEmployeePhone(phone); } +/* + * Function: searchEmployee + * Description: Searches employees by name and returns matches along + * with the type of the current authenticated employee. + * Parameters: + * name - search string for employee name + * Returns: + * pair> - current user type and matching employees + */ std::pair> EmployeeManagementService::searchEmployee(const std::string& name) { Employee* currentUser = m_dataStore.getAuthenticatedEmployee(); @@ -189,6 +255,36 @@ std::pair> EmployeeManagementS return { employeeType, employeeList }; } +/* + * Function: getShorlistedCandidates + * Description: Retrieves candidates with status SHORTLISTED from the DataStore. + * Parameters: + * None + * Returns: + * vector - list of shortlisted candidates + */ +std::vector EmployeeManagementService::getShorlistedCandidates() +{ + candidateMap candidates = m_dataStore.getCandidates(); + std::vector shortlistedCandidates; + for (auto& candidate : candidates) + { + if (candidate.second->getCandidateStatus() == Enums::CandidateStatus::SHORTLISTED) + { + shortlistedCandidates.push_back(candidate.second); + } + } + return shortlistedCandidates; +} + +/* + * Function: loadEmployees + * Description: Loads employees and general employees from FileManager into the DataStore. + * Parameters: + * None + * Returns: + * None + */ void EmployeeManagementService::loadEmployees() { FileManager employeeFileManager(Config::File::EMPLOYEES_FILE); @@ -214,6 +310,14 @@ void EmployeeManagementService::loadEmployees() } } +/* + * Function: saveEmployees + * Description: Saves employees and general employees from the DataStore into FileManager. + * Parameters: + * None + * Returns: + * None + */ void EmployeeManagementService::saveEmployees() { FileManager employeeFileManager(Config::File::EMPLOYEES_FILE); @@ -234,18 +338,4 @@ void EmployeeManagementService::saveEmployees() } employeeFileManager.save(employees); generalEmployeeFileManager.save(generalEmployees); -} - -std::vector EmployeeManagementService::getShorlistedCandidates() -{ - candidateMap candidates = m_dataStore.getCandidates(); - std::vector shortlistedCandidates; - for (auto& candidate : candidates) - { - if (candidate.second->getCandidateStatus() == Enums::CandidateStatus::SHORTLISTED) - { - shortlistedCandidates.push_back(candidate.second); - } - } - return shortlistedCandidates; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index d8ea1bc..b819a8b 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -1,3 +1,11 @@ +/* + * File: EmployeeManagementService.h + * Description: Provides services for managing employees, including creation, deactivation, + * designation updates, profile modifications, searching, and retrieval of + * shortlisted candidates. + * Author: Trenser + * Created: 07-Apr-2026 + */ #pragma once #include #include @@ -25,6 +33,15 @@ public: void loadEmployees(); void saveEmployees(); + /* + * Function: getEmployees (template) + * Description: Retrieves active employees filtered by specified types. Excludes admin employees + * if no filter is provided. + * Parameters: + * types... - variadic list of employee types + * Returns: + * Employees - vector of pointers to filtered employees + */ template Employees getEmployees(Types... types) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp index 535fb0b..1f68ffe 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.cpp @@ -9,10 +9,19 @@ #include "Factory.h" #include "DataStore.h" + /* + * Function: log + * Description: Creates a new log entry with the given message, assigns a timestamp, + * and stores it in the DataStore. + * Parameters: + * message - string containing the log message to be recorded + * Returns: + * void - no return value + */ void LogService::log(const std::string& message) { DataStore& dataStore = DataStore::getInstance(); logMap& logs = dataStore.getLogs(); Log* log = Factory::getObject(message); logs.emplace(std::make_pair(log->getTimestamp(), log)); -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h index 93ff404..416d4ba 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/LogService.h @@ -11,4 +11,4 @@ class LogService { public: static void log(const std::string&); -}; +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp index 313a35d..685d487 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/PayslipManagementService.cpp @@ -13,6 +13,20 @@ #include "FileManager.h" #include "Factory.h" + /* + * Function: updateSalary + * Description: Updates the payroll details of a given employee, including salary components + * and PF contributions. + * Parameters: + * employeeId - unique identifier of the employee + * basicSalary - basic salary of the employee + * houseRentAllowance - HRA component + * foodAllowance - food allowance component + * employeePFContribution - employee PF contribution + * employerPFContribution - employer PF contribution + * Returns: + * void - throws runtime_error if employee not found or unauthorized + */ 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); @@ -32,6 +46,14 @@ void PayslipManagementService::updateSalary(const std::string& employeeId, doubl } } + /* + * Function: generatePayslips + * Description: Generates payslips for all employees for the current month and year. + * Parameters: + * None + * Returns: + * void - creates and stores payslips in DataStore + */ void PayslipManagementService::generatePayslips() { util::enforceAuthorization(m_dataStore.getAuthenticatedEmployee()->getEmployeeType(), Enums::EmployeeType::FINANCE); @@ -68,6 +90,15 @@ void PayslipManagementService::generatePayslips() } } + /* + * Function: loadPayrolls + * Description: Loads payroll objects from persistent storage and associates them + * with existing employees. + * Parameters: + * None + * Returns: + * void - updates DataStore with loaded payrolls + */ void PayslipManagementService::loadPayrolls() { FileManager payrollFileManager(Config::File::PAYROLL_FILE); @@ -86,6 +117,14 @@ void PayslipManagementService::loadPayrolls() payrolls.insert(payrollObjects.begin(), payrollObjects.end()); } + /* + * Function: savePayrolls + * Description: Saves all payroll objects from DataStore into persistent storage. + * Parameters: + * None + * Returns: + * None + */ void PayslipManagementService::savePayrolls() { FileManager payrollFileManager(Config::File::PAYROLL_FILE); @@ -93,6 +132,17 @@ void PayslipManagementService::savePayrolls() payrollFileManager.save(payrolls); } + /* + * Function: getPayslipForMonth + * Description: Retrieves the payroll and payslip of a given employee for a specific + * month and year. + * Parameters: + * employeeId - unique identifier of the employee + * year - year of the payslip + * month - month of the payslip + * Returns: + * pair - payroll and payslip for the given month. + */ std::pair PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month) { auto& employees = m_dataStore.getEmployees(); @@ -116,6 +166,15 @@ std::pair PayslipManagementService::getPayslipForMonth(const return { nullptr, nullptr }; } + /* + * Function: loadPayslips + * Description: Loads payslip objects from FileManager and associates them + * with existing employees. + * Parameters: + * None + * Returns: + * void - updates DataStore with loaded payslips + */ void PayslipManagementService::loadPayslips() { FileManager payslipFileManager(Config::File::PAYSLIP_FILE); @@ -134,9 +193,17 @@ void PayslipManagementService::loadPayslips() payslips.insert(payslipObjects.begin(), payslipObjects.end()); } + /* + * Function: savePayslips + * Description: Saves all payslip objects from DataStore into FileManager. + * Parameters: + * None + * Returns: + * void + */ void PayslipManagementService::savePayslips() { FileManager payslipFileManager(Config::File::PAYSLIP_FILE); auto& payslips = m_dataStore.getPayslips(); payslipFileManager.save(payslips); -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h index e9c4d4b..9f5690f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/AuthorizationHelper.h @@ -1,14 +1,40 @@ +/* + * File: AuthorizationHelper.h + * Description : Provides utility functions to check and enforce authorization + * based on allowed employee types. + * Author : Trenser + * Created : 07-Apr-2026 + */ #pragma once #include #include "Enums.h" namespace util { + /* + * Function: isAuthorized + * Description: Checks if the current employee type matches the specified allowed type. + * Parameters: + * current - the employee type of the current user + * first - the allowed employee type to compare against + * Returns: + * bool - true if current matches the allowed type, false otherwise + */ inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first) { return current == first; } + /* + * Function: isAuthorized + * Description: Checks if the current employee type matches any of the specified allowed types. + * Parameters: + * current - the employee type of the current user + * first - the first allowed employee type + * rest - additional allowed employee types + * Returns: + * bool - true if current matches any of the allowed types, false otherwise + */ template inline bool isAuthorized(Enums::EmployeeType current, Enums::EmployeeType first, Rest... rest) @@ -20,6 +46,16 @@ namespace util return isAuthorized(current, rest...); } + /* + * Function: enforceAuthorization + * Description: Enforces authorization by checking if the current employee type + * is among the allowed types. + * Parameters: + * current - the employee type of the current user + * alloweds - one or more allowed employee types + * Returns: + * void - throws runtime_error if current is not authorized + */ template inline void enforceAuthorization(Enums::EmployeeType current, Allowed... allowed) { @@ -28,4 +64,4 @@ namespace util throw std::runtime_error("You are unauthorized to perform this operation!"); } } -} +} \ No newline at end of file From 8fd0366a3505f9f08c1ba50c9878478da3c7b2b9 Mon Sep 17 00:00:00 2001 From: Jissin Sam Mathew Date: Fri, 17 Apr 2026 12:19:24 +0530 Subject: [PATCH 56/56] Add headers to the views and remove Leave static members --- Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp | 30 --------- Trenser.Zenvy/Trenser.Zenvy/models/Leave.h | 9 --- .../Trenser.Zenvy/views/AdminMenu.cpp | 2 +- Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h | 3 +- .../Trenser.Zenvy/views/EmployeeMenu.cpp | 4 +- .../Trenser.Zenvy/views/EmployeeMenu.h | 3 +- .../views/FinanceExecutiveMenu.cpp | 4 +- .../views/FinanceExecutiveMenu.h | 3 +- .../Trenser.Zenvy/views/HRManagerMenu.cpp | 4 +- .../Trenser.Zenvy/views/HRManagerMenu.h | 3 +- .../Trenser.Zenvy/views/ITExecutiveMenu.cpp | 4 +- .../Trenser.Zenvy/views/ITExecutiveMenu.h | 3 +- .../Trenser.Zenvy/views/MenuHelper.cpp | 53 ++++++++++++++- .../Trenser.Zenvy/views/MenuHelper.h | 65 +++++++++++++++++++ .../views/TalentExecutiveMenu.cpp | 2 +- .../Trenser.Zenvy/views/TalentExecutiveMenu.h | 3 +- .../Trenser.Zenvy/views/TeamExecutiveMenu.cpp | 2 +- .../Trenser.Zenvy/views/TeamExecutiveMenu.h | 3 +- .../Trenser.Zenvy/views/TeamLeadMenu.cpp | 2 +- .../Trenser.Zenvy/views/TeamLeadMenu.h | 3 +- 20 files changed, 137 insertions(+), 68 deletions(-) diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp index e33e319..c3f8a2d 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.cpp @@ -28,21 +28,6 @@ const std::string& Leave::getLeaveReason() const return m_reason; } -int Leave::getNumberOfGeneralLeave() -{ - return m_numberOfGeneralLeave; -} - -int Leave::getNumberOfRestrictedLeave() -{ - return m_numberOfRestrictedLeave; -} - -int Leave::getNumberOfMedicalLeave() -{ - return m_numberOfMedicalLeave; -} - Enums::LeaveType Leave::getLeaveType() const { return m_leaveType; @@ -68,21 +53,6 @@ void Leave::setLeaveReason(const std::string& reason) m_reason = reason; } -void Leave::setNumberOfGeneralLeave(int value) -{ - m_numberOfGeneralLeave = value; -} - -void Leave::setNumberOfRestrictedLeave(int value) -{ - m_numberOfRestrictedLeave = value; -} - -void Leave::setNumberOfMedicalLeave(int value) -{ - m_numberOfMedicalLeave = value; -} - void Leave::setLeaveType(Enums::LeaveType type) { m_leaveType = type; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h index 1da66ca..3bd731f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Leave.h @@ -17,9 +17,6 @@ private: std::string m_employeeId; util::Timestamp m_timestamp; std::string m_reason; - static int m_numberOfGeneralLeave; - static int m_numberOfRestrictedLeave; - static int m_numberOfMedicalLeave; Enums::LeaveType m_leaveType; public: Leave() : m_id("LV" + std::to_string(++m_uid)), m_employeeId(""), m_timestamp(), m_reason(""), m_leaveType(Enums::LeaveType::GENERAL) {} @@ -32,16 +29,10 @@ public: const std::string& getEmployeeId() const; const util::Timestamp& getTimestamp() const; const std::string& getLeaveReason() const; - static int getNumberOfGeneralLeave(); - static int getNumberOfRestrictedLeave(); - static int getNumberOfMedicalLeave(); Enums::LeaveType getLeaveType() const; void setLeaveId(const std::string& id); void setEmployeeId(const std::string& employeeId); void setTimestamp(const util::Timestamp& timestamp); void setLeaveReason(const std::string& reason); - void setNumberOfGeneralLeave(int value); - void setNumberOfRestrictedLeave(int value); - void setNumberOfMedicalLeave(int value); void setLeaveType(Enums::LeaveType type); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp index 8338cd9..c8b0019 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.cpp @@ -84,4 +84,4 @@ bool AdminMenu::handleOperation(int choice) util::pressEnter(); } return true; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h index 88ca794..39fda7c 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/AdminMenu.h @@ -15,5 +15,4 @@ public: AdminMenu() :m_zenvyController(new ZenvyController()) {}; void run(); bool handleOperation(int); -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp index 33978b9..2a81bfc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.cpp @@ -28,7 +28,7 @@ void EmployeeMenu::run() { int choice; util::clear(); - 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. View Profile\n16. Exit\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 Notifications\n13. View Announcements\n14. Update Profile\n15. View Profile\n16. Exit\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -81,4 +81,4 @@ bool EmployeeMenu::handleOperation(int choice) util::pressEnter(); } return true; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h index d29f301..579903e 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/EmployeeMenu.h @@ -15,5 +15,4 @@ public: EmployeeMenu() : m_zenvyController(new ZenvyController()) {}; void run(); bool handleOperation(int); -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp index 68a5d26..b301167 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.cpp @@ -28,7 +28,7 @@ void FinanceExecutiveMenu::run() { int choice; util::clear(); - 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 Payslips\n10. Update Payroll\n11. Update Profile\n12. View Profile \n13. 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 Notifications\n7. View Announcements\n8. Resolve Ticket\n9. Generate Payslips\n10. Update Payroll\n11. Update Profile\n12. View Profile \n13. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -119,4 +119,4 @@ bool FinanceExecutiveMenu::handleOperation(int choice) util::pressEnter(); } return true; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h index 038658f..69097da 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/FinanceExecutiveMenu.h @@ -21,5 +21,4 @@ public: bool handleOperation(int); void updatePayroll(); void generatePayslips(); -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp index 3875de5..d72e29f 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.cpp @@ -27,7 +27,7 @@ void HRManagerMenu::run() { int choice; util::clear(); - std::cout << "HR Manager Menu\n1. Apply Leave\n2. View Payslip\n3. View Payslip History\n4. View Employees\n5. Search Employee\n6. View Notification\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Update Profile\n12. Deactivate Employee\n13. View Profile\n14. Update Designation\n15. Add Shortlisted Candidate as Employee\n16. 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 Notifications\n7. View Announcements\n8. Create Employee\n9. Regularize Attendance\n10. Update Leave Request\n11. Update Profile\n12. Deactivate Employee\n13. View Profile\n14. Update Designation\n15. Add Shortlisted Candidate as Employee\n16. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -92,4 +92,4 @@ bool HRManagerMenu::handleOperation(int choice) util::pressEnter(); } return true; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h index 158deaf..b455bc9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/HRManagerMenu.h @@ -15,5 +15,4 @@ public: HRManagerMenu() : m_zenvyController(new ZenvyController()) {}; void run(); bool handleOperation(int); -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp index 6ae71ea..ec94afd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.cpp @@ -27,7 +27,7 @@ void ITExecutiveMenu::run() { int choice; util::clear(); - 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. View Profile\n11. 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 Notifications\n7. View Announcements\n8. Resolve Ticket\n9. Update Profile\n10. View Profile\n11. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { @@ -80,4 +80,4 @@ bool ITExecutiveMenu::handleOperation(int choice) util::pressEnter(); } return true; -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h index e6cf86e..a1817cd 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/ITExecutiveMenu.h @@ -15,5 +15,4 @@ public: ITExecutiveMenu() : m_zenvyController(new ZenvyController()) {}; void run(); bool handleOperation(int); -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp index cfcc4c4..95d10d9 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.cpp @@ -1,6 +1,22 @@ +/* + * File: MenuHelper.cpp + * Description: Inline functions and utilities for employee management, + * including profile handling, payslip viewing, search, + * and employee activation/deactivation. + * Author: Trenser + * Created: 08-Apr-2026 + */ #include #include "MenuHelper.h" +/* + * Function: getEmployeeType + * Description: Retrieves a valid employee type based on the authority of the current user + * Parameters: + * employeeType - the type of the employee requesting to create another employee + * Returns: + * Enums::EmployeeType - selected employee type or INVALID if choice is invalid + */ static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) { int choice; @@ -50,6 +66,13 @@ static Enums::EmployeeType getEmployeeType(Enums::EmployeeType employeeType) return Enums::EmployeeType::INVALID; } +/* + * Function: getEmployeeDesignation + * Description: Retrieves the designation (Senior or Junior) for a new employee + * Parameters: None + * Returns: + * Enums::EmployeeDesignation - selected designation or INVALID if choice is invalid + */ static Enums::EmployeeDesignation getEmployeeDesignation() { int choice; @@ -70,6 +93,13 @@ static Enums::EmployeeDesignation getEmployeeDesignation() } } +/* + * Function: createEmployee + * Description: Creates a new employee record and adds it to the system + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ void createEmployee(ZenvyController* m_zenvyController) { auto currentEmployee = m_zenvyController->getCurrentEmployee(); @@ -103,6 +133,13 @@ void createEmployee(ZenvyController* m_zenvyController) util::pressEnter(); } +/* + * Function: updateDesignation + * Description: Updates the designation of an existing employee + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ void updateDesignation(ZenvyController* m_zenvyController) { std::string selectedEmployeeId = selectEmployeeId(m_zenvyController->getEmployees(Enums::EmployeeType::GENERAL)); @@ -123,6 +160,13 @@ void createEmployee(ZenvyController* m_zenvyController) } } + /* + * Function: displayCandidateDetails + * Description: Displays details of shortlisted candidates + * Parameters: + * shorlistedCandidates - vector of candidate pointers to display + * Returns: void + */ void displayCandidateDetails(const std::vector shorlistedCandidates) { util::clear(); @@ -148,6 +192,13 @@ void displayCandidateDetails(const std::vector shorlistedCandidates) } } +/* + * Function: addShortlistedCandidateAsEmployee + * Description: Converts a shortlisted candidate into an employee record + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ void addShortlistedCandidateAsEmployee(const ZenvyController* m_zenvyController) { int index; @@ -199,4 +250,4 @@ void addShortlistedCandidateAsEmployee(const ZenvyController* m_zenvyController) { throw std::runtime_error("Enter a valid Index."); } -} +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h index d7517f1..1f892fb 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/MenuHelper.h @@ -1,3 +1,11 @@ +/* + * File: MenuHelper.h + * Description: Inline functions and utilities for employee management, + * including profile handling, payslip viewing, search, + * and employee activation/deactivation. + * Author: Trenser + * Created: 08-Apr-2026 + */ #pragma once #include #include @@ -19,6 +27,13 @@ void updateDesignation(ZenvyController* m_zenvyController); void displayCandidateDetails(const std::vector shorlistedCandidates); void addShortlistedCandidateAsEmployee(const ZenvyController* m_zenvyController); +/* + * Function: viewPayslipHistory + * Description: Displays the payslip history of the current employee + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ inline void viewPayslipHistory(ZenvyController* m_zenvyController) { auto& employeePayslips = m_zenvyController->getCurrentEmployee()->getEmployeePayslips(); @@ -52,6 +67,13 @@ inline void viewPayslipHistory(ZenvyController* m_zenvyController) util::pressEnter(); } +/* + * Function: viewProfile + * Description: Displays the profile details of the current employee + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ inline void viewProfile(ZenvyController* m_zenvyController) { util::clear(); @@ -95,6 +117,13 @@ inline void viewProfile(ZenvyController* m_zenvyController) } } +/* + * Function: updateProfile + * Description: Allows the current employee to update their profile information + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ inline void updateProfile(ZenvyController* m_zenvyController) { int choice; @@ -146,6 +175,14 @@ inline void updateProfile(ZenvyController* m_zenvyController) } } +/* + * Function: selectEmployeeId + * Description: Displays a list of employees and allows selection by index + * Parameters: + * allEmployees - vector of employee pointers to choose from + * Returns: + * string - selected employee ID + */ inline std::string selectEmployeeId(const std::vector& allEmployees) { int choice; @@ -207,6 +244,13 @@ inline std::string selectEmployeeId(const std::vector& allEmplo } } +/* + * Function: deactivateEmployee + * Description: Deactivates an employee based on selection + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ inline void deactivateEmployee(const ZenvyController* m_zenvyController) { std::string selectedEmployeeId = selectEmployeeId(m_zenvyController->getEmployees()); @@ -226,6 +270,13 @@ inline void deactivateEmployee(const ZenvyController* m_zenvyController) } } +/* + * Function: viewEmployees + * Description: Displays a list of all employees in the system + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ inline void viewEmployees(ZenvyController* m_zenvyController) { util::clear(); @@ -259,6 +310,13 @@ inline void viewEmployees(ZenvyController* m_zenvyController) util::pressEnter(); } +/* + * Function: searchEmployee + * Description: Searches for employees by name and displays matching results + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ inline void searchEmployee(ZenvyController* m_zenvyController) { std::string name; @@ -331,6 +389,13 @@ inline void searchEmployee(ZenvyController* m_zenvyController) util::pressEnter(); } +/* + * Function: viewPayslip + * Description: Displays the payslip of the current employee for a given month and year + * Parameters: + * m_zenvyController - pointer to the ZenvyController managing employees + * Returns: void + */ inline void viewPayslip(ZenvyController* m_zenvyController) { int year, month; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp index 69e6cbd..a4897f0 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.cpp @@ -27,7 +27,7 @@ void TalentExecutiveMenu::run() { int choice; util::clear(); - 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. View Profile\n15. 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 Notifications\n7. View Announcements\n8. Create New Job\n9. View Job Opening\n10. Add Candidate\n11. Update Candidate Status\n12. View Shortlisted Candidate\n13. Update Profile\n14. View Profile\n15. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h index 92e5a23..e6847bc 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TalentExecutiveMenu.h @@ -15,5 +15,4 @@ public: TalentExecutiveMenu() : m_zenvyController(new ZenvyController()) {}; void run(); bool handleOperation(int); -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp index 9cfacf6..3110402 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.cpp @@ -27,7 +27,7 @@ void TeamExecutiveMenu::run() { int choice; util::clear(); - 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. View Profile\n16. 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 Notifications\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. View Profile\n16. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h index 307d26e..21fd70a 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamExecutiveMenu.h @@ -15,5 +15,4 @@ public: TeamExecutiveMenu() : m_zenvyController(new ZenvyController()) {}; void run(); bool handleOperation(int); -}; - +}; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp index 6ead718..40ca7c2 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.cpp @@ -27,7 +27,7 @@ void TeamLeadMenu::run() { int choice; util::clear(); - 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. View Profile\n18. Logout\nEnter your Choice: "; + std::cout << "Team Lead 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 Notifications\n13. View Announcements\n14. Regularize Attendance\n15. Update Leave Request\n16. Update Profile\n17. View Profile\n18. Logout\nEnter your Choice: "; util::read(choice); if (!handleOperation(choice)) { diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h index e34eee3..2eabf24 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/TeamLeadMenu.h @@ -15,5 +15,4 @@ public: TeamLeadMenu() : m_zenvyController(new ZenvyController()) {}; void run(); bool handleOperation(int); -}; - +}; \ No newline at end of file