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;