From b9b83ad42938f8a3aa86966182af08942cf27f91 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Tue, 14 Apr 2026 18:11:29 +0530 Subject: [PATCH 1/3] 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 47ca953eacc0a227d227342cef9d4a8bb0b0c636 Mon Sep 17 00:00:00 2001 From: Princy Jerin Date: Thu, 16 Apr 2026 12:07:47 +0530 Subject: [PATCH 2/3] 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 3/3] 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";