@@ -76,3 +76,8 @@ void ZenvyController::persistStates()
|
|||||||
m_payslipManagementService->savePayrolls();
|
m_payslipManagementService->savePayrolls();
|
||||||
m_payslipManagementService->savePayslips();
|
m_payslipManagementService->savePayslips();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<std::shared_ptr<Payroll>, std::shared_ptr<Payslip>> ZenvyController::getPayslipForMonth(const std::string& employeeId, int year, int month)
|
||||||
|
{
|
||||||
|
return m_payslipManagementService->getPayslipForMonth(employeeId, year, month);
|
||||||
|
}
|
||||||
@@ -62,6 +62,7 @@ public:
|
|||||||
//Payslip management
|
//Payslip management
|
||||||
void updateSalary(const std::string&, double, double, double, double, double);
|
void updateSalary(const std::string&, double, double, double, double, double);
|
||||||
void generatePayslips();
|
void generatePayslips();
|
||||||
|
std::pair<std::shared_ptr<Payroll>, std::shared_ptr<Payslip>>getPayslipForMonth(const std::string&, int, int);
|
||||||
|
|
||||||
//File Management
|
//File Management
|
||||||
void loadStates();
|
void loadStates();
|
||||||
|
|||||||
@@ -118,7 +118,6 @@ std::shared_ptr<Payroll> Payroll::deserialize(const std::string& record)
|
|||||||
std::getline(serializedPayroll, foodAllowanceString, ',');
|
std::getline(serializedPayroll, foodAllowanceString, ',');
|
||||||
std::getline(serializedPayroll, employeePFString, ',');
|
std::getline(serializedPayroll, employeePFString, ',');
|
||||||
std::getline(serializedPayroll, employerPFString, ',');
|
std::getline(serializedPayroll, employerPFString, ',');
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
double basicSalary = std::stod(basicSalaryString);
|
double basicSalary = std::stod(basicSalaryString);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include "Timestamp.h"
|
||||||
|
|
||||||
class Payroll
|
class Payroll
|
||||||
{
|
{
|
||||||
@@ -13,6 +14,7 @@ private:
|
|||||||
double m_foodAllowance;
|
double m_foodAllowance;
|
||||||
double m_employeePFContribution;
|
double m_employeePFContribution;
|
||||||
double m_employerPFContribution;
|
double m_employerPFContribution;
|
||||||
|
util::Timestamp m_timestamp;
|
||||||
public:
|
public:
|
||||||
Payroll()
|
Payroll()
|
||||||
: m_id("PR" + std::to_string(++m_uid)),
|
: m_id("PR" + std::to_string(++m_uid)),
|
||||||
|
|||||||
@@ -87,6 +87,29 @@ void PayslipManagementService::savePayrolls()
|
|||||||
payrollFileManager.save(payrolls);
|
payrollFileManager.save(payrolls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<std::shared_ptr<Payroll>, std::shared_ptr<Payslip>> PayslipManagementService::getPayslipForMonth(const std::string& employeeId, int year, int month)
|
||||||
|
{
|
||||||
|
auto& employees = m_dataStore.getEmployees();
|
||||||
|
auto employeeIterator = employees.find(employeeId);
|
||||||
|
if (employeeIterator == employees.end())
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
{
|
||||||
|
if (payslip->getTimestamp().getYear() == year && payslip->getTimestamp().getMonth() == month)
|
||||||
|
{
|
||||||
|
return { payroll, payslip };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { nullptr, nullptr };
|
||||||
|
}
|
||||||
|
|
||||||
void PayslipManagementService::loadPayslips()
|
void PayslipManagementService::loadPayslips()
|
||||||
{
|
{
|
||||||
FileManager<Payslip> payslipFileManager(Config::File::PAYSLIP_FILE);
|
FileManager<Payslip> payslipFileManager(Config::File::PAYSLIP_FILE);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ public:
|
|||||||
PayslipManagementService() : m_dataStore(DataStore::getInstance()) {};
|
PayslipManagementService() : m_dataStore(DataStore::getInstance()) {};
|
||||||
void updateSalary(const std::string&, double, double, double, double, double);
|
void updateSalary(const std::string&, double, double, double, double, double);
|
||||||
void generatePayslips();
|
void generatePayslips();
|
||||||
|
std::pair<std::shared_ptr<Payroll>, std::shared_ptr<Payslip>>getPayslipForMonth(const std::string&, int, int);
|
||||||
void loadPayrolls();
|
void loadPayrolls();
|
||||||
void savePayrolls();
|
void savePayrolls();
|
||||||
void loadPayslips();
|
void loadPayslips();
|
||||||
|
|||||||
@@ -33,14 +33,14 @@ bool EmployeeMenu::handleOperation(int choice)
|
|||||||
{
|
{
|
||||||
switch (choice)
|
switch (choice)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
case 1:
|
/*case 1:
|
||||||
m_zenvyController.applyLeave();
|
m_zenvyController.applyLeave();
|
||||||
break;
|
break;*/
|
||||||
case 2:
|
case 2:
|
||||||
m_zenvyController.viewPayslip();
|
viewPayslip(m_zenvyController);
|
||||||
break;
|
break;
|
||||||
case 3:
|
/*case 3:
|
||||||
m_zenvyController.viewPayslipHistory();
|
m_zenvyController.viewPayslipHistory();
|
||||||
break;
|
break;
|
||||||
case 4 :
|
case 4 :
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ bool FinanceExecutiveMenu::handleOperation(int choice)
|
|||||||
{
|
{
|
||||||
switch (choice)
|
switch (choice)
|
||||||
{
|
{
|
||||||
|
case 2:
|
||||||
|
viewPayslip(m_zenvyController);
|
||||||
case 4:
|
case 4:
|
||||||
viewEmployees(m_zenvyController);
|
viewEmployees(m_zenvyController);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ bool HRManagerMenu::handleOperation(int choice)
|
|||||||
{
|
{
|
||||||
switch (choice)
|
switch (choice)
|
||||||
{
|
{
|
||||||
|
case 2:
|
||||||
|
viewPayslip(m_zenvyController);
|
||||||
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
viewEmployees(m_zenvyController);
|
viewEmployees(m_zenvyController);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ bool ITExecutiveMenu::handleOperation(int choice)
|
|||||||
{
|
{
|
||||||
switch (choice)
|
switch (choice)
|
||||||
{
|
{
|
||||||
|
case 2:
|
||||||
|
viewPayslip(m_zenvyController);
|
||||||
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
viewEmployees(m_zenvyController);
|
viewEmployees(m_zenvyController);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -297,3 +297,41 @@ inline void searchEmployee(std::shared_ptr<ZenvyController> m_zenvyController)
|
|||||||
}
|
}
|
||||||
util::pressEnter();
|
util::pressEnter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void viewPayslip(std::shared_ptr<ZenvyController> controller)
|
||||||
|
{
|
||||||
|
int year, month;
|
||||||
|
util::clear();
|
||||||
|
std::cout << "Enter the year: ";
|
||||||
|
util::read(year);
|
||||||
|
std::cout << "Enter 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)
|
||||||
|
{
|
||||||
|
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";
|
||||||
|
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();
|
||||||
|
}
|
||||||
@@ -32,6 +32,9 @@ bool TalentExecutiveMenu::handleOperation(int choice)
|
|||||||
{
|
{
|
||||||
switch (choice)
|
switch (choice)
|
||||||
{
|
{
|
||||||
|
case 2:
|
||||||
|
viewPayslip(m_zenvyController);
|
||||||
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
viewEmployees(m_zenvyController);
|
viewEmployees(m_zenvyController);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ bool TeamExecutiveMenu::handleOperation(int choice)
|
|||||||
{
|
{
|
||||||
switch (choice)
|
switch (choice)
|
||||||
{
|
{
|
||||||
|
case 2:
|
||||||
|
viewPayslip(m_zenvyController);
|
||||||
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
viewEmployees(m_zenvyController);
|
viewEmployees(m_zenvyController);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ bool TeamLeadMenu::handleOperation(int choice)
|
|||||||
{
|
{
|
||||||
switch (choice)
|
switch (choice)
|
||||||
{
|
{
|
||||||
|
case 2:
|
||||||
|
viewPayslip(m_zenvyController);
|
||||||
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
viewEmployees(m_zenvyController);
|
viewEmployees(m_zenvyController);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user