to(base_url('/login'));
}
// Internally used functions
private function computeEmployeePayroll($emppaytransid, $save = false, $instanceOfEmpPayTransModel = null, $instanceOfEmpPayTransInDedModel = null)
{
if ($instanceOfEmpPayTransModel == null)
$empPayTransModel = new EmployeePayTransactionModel();
else
$empPayTransModel = $instanceOfEmpPayTransModel;
if ($instanceOfEmpPayTransInDedModel == null)
$empPayTransInDedModel = new EmpPayTransIncomeDeductionModel();
else
$empPayTransInDedModel = $instanceOfEmpPayTransInDedModel;
$empPayTrans = $empPayTransModel->find($emppaytransid);
// Compute basic pay first
// DAILY, SEMIMONTHLY, MONTHLY reference is in PayrollComputation
switch ($empPayTrans->basic_sal_computation) {
case 'DAILY':
$empPayTrans->basic_pay = $empPayTrans->actual_work_days * $empPayTrans->basic_daily_pay;
break;
case 'SEMIMONTHLY':
$empPayTrans->basic_pay = $empPayTrans->basic_semi_monthly_pay;
break;
case 'MONTHLY':
$empPayTrans->basic_pay = $empPayTrans->basic_monthly_pay;
break;
}
$empPayTrans->taxable_income = $empPayTransInDedModel->getTotalIncomeDeduction($emppaytransid, 1, 1) + $empPayTrans->basic_pay;
$empPayTrans->nontaxable_income = $empPayTransInDedModel->getTotalIncomeDeduction($emppaytransid, 1, 0);
$empPayTrans->taxable_deduction = $empPayTransInDedModel->getTotalIncomeDeduction($emppaytransid, 0, 1);
$empPayTrans->nontaxable_deduction = $empPayTransInDedModel->getTotalIncomeDeduction($emppaytransid, 0, 0);
// Compute gross first before getting taxable income to avoid misscalculation of net income
$empPayTrans->gross_income = $empPayTrans->taxable_income + $empPayTrans->nontaxable_income;
// Deduct SSS, Philhealth, Pagibig and Union Dues
$empPayTrans->taxable_income -= $empPayTrans->nontaxable_deduction;
// Compute Income Tax after getting taxable income
$payCompute = new PayrollComputation();
$empPayTrans->income_tax = $payCompute->computeIncomeTax($empPayTrans->taxable_income);
// Deduction and net pay
$empPayTrans->total_deduction = $empPayTrans->taxable_deduction + $empPayTrans->nontaxable_deduction + $empPayTrans->income_tax;
$empPayTrans->net_pay = $empPayTrans->gross_income - $empPayTrans->total_deduction;
if ($save)
$empPayTransModel->save($empPayTrans);
}
private function printRaw($label, $data)
{
echo $label . ": ";
print_r($data);
echo "
";
}
// --end-- Internally used functions
public function payrollGroup()
{
$payGroups = (new PayrollGroupModel())->findAll();
$payGroupHTMLTable = new \CodeIgniter\View\Table();
$payGroupHTMLTable->setTemplate(MiscLib::adminLTETableTemplate());
if ($payGroups == null)
$data['tblPayGroup'] = '
No groups found.
'; else { $payGroupHTMLTable->setHeading('ID', 'Group Code', 'Group Name', 'Action'); foreach ($payGroups as $group) { $iconView = ''; $payGroupHTMLTable->addRow($group->pay_group_id, $group->pay_group_code, $group->pay_group_name, "$iconView"); } $data['tblPayGroup'] = $payGroupHTMLTable->generate(); } return view('payroll/paygroupview', $data); } public function addPayrollGroup() { $payrollGroup = new PayrollGroup(); $payrollGroupModel = new PayrollGroupModel(); $rawData = $this->request->getPost(); $payrollGroup->fill($rawData); $payrollGroupModel->save($payrollGroup); if ($payrollGroupModel->getInsertID() == 0) return redirect()->back()->withInput()->with('error', 'Failed to add payroll group'); else return redirect()->to('/payroll/paygroup')->with('message', 'Payroll Group Added'); } public function incomeDeduction() { $incomeDeductions = (new IncomeDeductionModel())->findAll(); $inDedHTMLTable = new \CodeIgniter\View\Table(); $inDedHTMLTable->setTemplate(MiscLib::adminLTETableTemplate()); if ($incomeDeductions == null) $data['tblIncomeDeduction'] = 'No income and deduction found.
'; else { $inDedHTMLTable->setHeading('ID', 'Payslip Display', 'Deduction Name', 'Income', 'Taxable', 'Include in Gross', 'Action'); foreach ($incomeDeductions as $incomeDeduction) { $indedHTMLData = 'data-inded_id="' . $incomeDeduction->inded_id . '" data-payslip_display="' . $incomeDeduction->payslip_display . '" data-inded_name="' . $incomeDeduction->inded_name . '" data-coa_code="' . $incomeDeduction->coa_code . '" data-is_income="' . $incomeDeduction->is_income . '" data-is_taxable="' . $incomeDeduction->is_taxable . '" data-include_in_gross="' . $incomeDeduction->include_in_gross . '"'; $iconView = ''; $iconEdit = ''; $iconDelete = ''; $inDedHTMLTable->addRow($incomeDeduction->inded_id, $incomeDeduction->payslip_display, $incomeDeduction->inded_name, ($incomeDeduction->is_income) ? 'Yes' : 'No', ($incomeDeduction->is_taxable) ? 'Yes' : 'No', ($incomeDeduction->include_in_gross) ? 'Yes' : 'No', $iconView . ' ' . $iconEdit . ' ' . $iconDelete); } $data['tblIncomeDeduction'] = $inDedHTMLTable->generate(); } return view('payroll/incomedeductionview', $data); } public function saveIncomeDeduction() { $incomeDeduction = new IncomeDeduction(); $incomeDeductionModel = new IncomeDeductionModel(); $rawData = $this->request->getPost(); // Handle checkbox inputs $rawData['is_income'] = isset($rawData['is_income']) ? 1 : 0; // Set to 1 if checked, 0 if not $rawData['is_taxable'] = isset($rawData['is_taxable']) ? 1 : 0; // Same for taxable $rawData['include_in_gross'] = isset($rawData['include_in_gross']) ? 1 : 0; // Same for include in gross $incomeDeduction->fill($rawData); if ($incomeDeductionModel->save($incomeDeduction)) { if (isset($rawData['inded_id'])) return redirect()->to('/payroll/inded')->with('message', 'Income or Deduction Successfully Updated'); else return redirect()->to('/payroll/inded')->with('message', 'Income or Deduction Added'); } else return redirect()->back()->withInput()->with('error', 'Failed to add income or deduction'); } public function incomeDeductionTransUpdate($indedid) { $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); $data['incomeDeduction'] = (new IncomeDeductionModel())->find($indedid); $data['empPayTransInDedCount'] = $empPayTransInDedModel->getEmpPayTransInDedCountxEmPayTransPayTransByInDedId($indedid); return view('payroll/incomedeductiontransupdateview', $data); } public function incomeDeductionTransApplyUpdate($indedid, $paytransid) { $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); $incomeDeduction = (new IncomeDeductionModel())->find($indedid); $empPayTransInDeds = $empPayTransInDedModel->getEmpPayTransInDedxEmPayTransByPayTransIdInDedId($paytransid, $indedid); $empPayTransIncomeDeduction = new EmpPayTransIncomeDeduction(); $updateCount = 0; foreach($empPayTransInDeds as $empPayTransInDed) { $empPayTransIncomeDeduction->fill([ 'emppaytransinded_id' => $empPayTransInDed->emppaytransinded_id, 'emppaytrans_id' => $empPayTransInDed->emppaytrans_id, 'inded_id' => $empPayTransInDed->inded_id, 'payslip_display' => $empPayTransInDed->payslip_display, 'inded_name' => $empPayTransInDed->inded_name, 'coa_code' => $incomeDeduction->coa_code, 'is_income' => $incomeDeduction->is_income, 'is_taxable' => $incomeDeduction->is_taxable, 'include_in_gross' => $incomeDeduction->include_in_gross, 'is_fixed_amt' => $empPayTransInDed->is_fixed_amt, 'is_percent_amt' => $empPayTransInDed->is_percent_amt, 'worked_days_based' => $empPayTransInDed->worked_days_based, 'amount' => $empPayTransInDed->amount, 'base_amount' => $empPayTransInDed->base_amount, 'is_override' => $empPayTransInDed->is_override ]); if($empPayTransInDedModel->save($empPayTransInDed)) $updateCount++; } return redirect()->back()->with('message', $updateCount . ' items in Income or Deduction was Successfully Updated'); } public function payrollType() { $payrollTypes = (new PayrollTypeModel())->findAll(); $payTypeHTMLTable = new \CodeIgniter\View\Table(); $payTypeHTMLTable->setTemplate(MiscLib::adminLTETableTemplate()); if ($payrollTypes == null) $data['tblPayrollType'] = 'No payroll type found.
'; else { $payTypeHTMLTable->setHeading('ID', 'Code', 'Name', 'Monthly', 'Semi-Monthly', 'Daily', 'Hourly', 'Action'); foreach ($payrollTypes as $payrollType) { $iconView = ''; $payTypeHTMLTable->addRow($payrollType->paytype_id, $payrollType->paytype_code, $payrollType->paytype_name, ($payrollType->is_monthly) ? 'Yes' : 'No', ($payrollType->is_semi_monthly) ? 'Yes' : 'No', ($payrollType->is_daily) ? 'Yes' : 'No', ($payrollType->is_hourly) ? 'Yes' : 'No', $iconView); } $data['tblPayrollType'] = $payTypeHTMLTable->generate(); } return view('payroll/paytypeview', $data); } public function addPayrollType() { $payrollType = new PayrollType(); $payrollTypeModel = new PayrollTypeModel(); $rawData = $this->request->getPost(); // Initialize all payroll type fields to 0 $rawData['is_monthly'] = 0; $rawData['is_semi_monthly'] = 0; $rawData['is_daily'] = 0; $rawData['is_hourly'] = 0; // Handle radio button input if (isset($rawData['paytype_sched'])) { switch ($rawData['paytype_sched']) { case 'monthly': $rawData['is_monthly'] = 1; break; case 'semi_monthly': $rawData['is_semi_monthly'] = 1; break; case 'daily': $rawData['is_daily'] = 1; break; case 'hourly': $rawData['is_hourly'] = 1; break; } } $payrollType->fill($rawData); $payrollTypeModel->save($payrollType); if ($payrollTypeModel->getInsertID() == 0) return redirect()->back()->withInput()->with('error', 'Failed to add payroll type'); else return redirect()->to('/payroll/paytype')->with('message', 'Payroll Type Added'); } public function employeePayrollInfo() { $payCompute = new PayrollComputation(); $empPayInfoModel = new EmployeePayrollInfoModel(); $empPayInfos = $empPayInfoModel->getAllEmpPayInfoXEmpPayType(); $data['employees'] = (new EmployeeModel())->findAll(); $data['paytypes'] = (new PayrollTypeModel())->findAll(); $data['workdaystype'] = $payCompute->workdays_type; $data['salarycomputations'] = $payCompute->basic_salary_computations; $empPayInfoHTMLTable = new \CodeIgniter\View\Table(); $empPayInfoHTMLTable->setTemplate(MiscLib::adminLTEDataTable1Template("tblEmployeeInfo")); if ($empPayInfos == null) $data['tblEmpPayInfo'] = 'No employee payroll type found.
'; else { $empPayInfoHTMLTable->setHeading('ID', 'Payroll Type', 'Employee ID', 'Employee Name', 'Monthly', 'Semi-Monthly', 'Daily', 'Hourly', 'Action'); foreach ($empPayInfos as $empPayInfo) { $empayHTMLData = 'data-emppay_id="' . $empPayInfo->emppay_id . '" data-employee_id="' . $empPayInfo->employee_id . '" data-paytype_id="' . $empPayInfo->paytype_id . '" data-is_atm="' . $empPayInfo->is_ATM . '" data-savings_account="' . $empPayInfo->savings_account . '" data-work_days="' . $empPayInfo->work_days . '" data-basic_sal_computation="' . $empPayInfo->basic_sal_computation . '" data-basic_monthly_pay="' . $empPayInfo->basic_monthly_pay . '" data-basic_semi_monthly_pay="' . $empPayInfo->basic_semi_monthly_pay . '" data-basic_daily_pay="' . $empPayInfo->basic_daily_pay . '" data-basic_hourly_pay="' . $empPayInfo->basic_hourly_pay . '" data-has_cola="' . $empPayInfo->has_cola . '" data-has_philhealth="' . $empPayInfo->has_philhealth . '" data-has_hdmf="' . $empPayInfo->has_hdmf . '" data-has_sss="' . $empPayInfo->has_sss . '" data-has_gsis="' . $empPayInfo->has_gsis . '" data-company_issued_id="' . $empPayInfo->company_issued_id . '" data-last_name="' . $empPayInfo->last_name . '" data-first_name="' . $empPayInfo->first_name . '"'; $iconView = ''; $iconEdit = ''; $iconDelete = ''; $empPayInfoHTMLTable->addRow($empPayInfo->emppay_id, $empPayInfo->paytype_name, $empPayInfo->company_issued_id, $empPayInfo->last_name . ', ' . $empPayInfo->first_name, $empPayInfo->basic_monthly_pay, $empPayInfo->basic_semi_monthly_pay, $empPayInfo->basic_daily_pay, $empPayInfo->basic_hourly_pay, $iconView . " " . $iconEdit . " " . $iconDelete); } $data['tblEmpPayInfo'] = $empPayInfoHTMLTable->generate(); } return view('payroll/empinfoview', $data); } public function saveEmployeePayrollInfo() { $empPayInfo = new EmployeePayrollInfo(); $empPayInfoModel = new EmployeePayrollInfoModel(); $rawData = $this->request->getPost(); $rawData['is_ATM'] = isset($rawData['is_ATM']) ? 1 : 0; $rawData['has_cola'] = isset($rawData['has_cola']) ? 1 : 0; $rawData['has_philhealth'] = isset($rawData['has_philhealth']) ? 1 : 0; $rawData['has_hdmf'] = isset($rawData['has_hdmf']) ? 1 : 0; $rawData['has_sss'] = isset($rawData['has_sss']) ? 1 : 0; $rawData['has_gsis'] = isset($rawData['has_gsis']) ? 1 : 0; $empPayInfo->fill($rawData); if ($empPayInfoModel->save($empPayInfo)) { if (isset($rawData['emppay_id'])) return redirect()->to('/payroll/emppayinfo')->with('message', 'Employee Payroll Successfully Updated'); else return redirect()->to('/payroll/emppayinfo')->with('message', 'Employee Payroll Type Added'); } else return redirect()->back()->withInput()->with('error', 'Failed to add employee payroll type'); } public function deleteEmployeePayrollInfo($emppayid) { $empPayInfoModel = new EmployeePayrollInfoModel(); if ($empPayInfoModel->delete($emppayid)) return redirect()->back()->with('message', 'Employee Deleted on Payroll'); else return redirect()->back()->with('error', 'Failed to delete employee on payroll'); } public function employeeCompensationBenefits() { $empPayInfoModel = new EmployeePayrollInfoModel(); $incomeDeductionModel = new IncomeDeductionModel(); $empPayInDedModel = new EmpPayIncomeDeductionModel(); $data['paySchedules'] = (new PayrollScheduleModel())->findAll(); $data['incomeList'] = $incomeDeductionModel->where("is_income", 1)->findAll(); $data['deductionList'] = $incomeDeductionModel->where("is_income", 0)->findAll(); $data['empPayInfos'] = $empPayInfoModel->getAllEmpPayInfoXEmpPayType(); $data['empLoaded'] = false; if ($this->request->getGet('empid') != null) { $settingsModel = new SettingsModel(); $iconView = ''; $iconEdit = ''; $iconDelete = ''; $data['empLoaded'] = true; $data['selectedEmployee'] = $empPayInfoModel->getEmpPayInfoXEmpPayTypeByEmpID($this->request->getGet('empid')); $data['empPayIncomeList'] = $empPayInDedModel->getEmpPayInDedByEmpPayIdSchedIdIsIncome($data['selectedEmployee']->emppay_id, $this->request->getGet('payschedid'), true); $data['empPayDeductionList'] = $empPayInDedModel->getEmpPayInDedByEmpPayIdSchedIdIsIncome($data['selectedEmployee']->emppay_id, $this->request->getGet('payschedid'), false); } return view('payroll/compensationbenefitsview', $data); } public function saveEmployeeCompensationBenefits() { $empPayInDed = new EmpPayIncomeDeduction(); $empPayInDedModel = new EmpPayIncomeDeductionModel(); $rawData = $this->request->getPost(); // Initialize all payroll type fields to 0 $rawData['is_fixed_amt'] = 0; $rawData['is_percent_amt'] = 0; $rawData['worked_days_based'] = 0; // Handle radio button input if (isset($rawData['amount_type'])) { switch ($rawData['amount_type']) { case 'fixed': $rawData['is_fixed_amt'] = 1; break; case 'perc': $rawData['is_percent_amt'] = 1; break; case 'daysbased': $rawData['worked_days_based'] = 1; break; } } $rawData['is_override'] = isset($rawData['is_override']) ? 1 : 0; $empPayInDed->fill($rawData); if ($empPayInDedModel->save($empPayInDed)) { if (isset($rawData['emppayinded_id'])) return redirect()->to('/payroll/compben?payschedid=' . $this->request->getPost('payschedule_id') . '&empid=' . $this->request->getPost('emp_id'))->with('message', 'Employee Compensation Benefits edited'); else return redirect()->to('/payroll/compben?payschedid=' . $this->request->getPost('payschedule_id') . '&empid=' . $this->request->getPost('emp_id'))->with('message', 'Employee Compensation Benefits Added'); } else return redirect()->back()->withInput()->with('error', 'Failed to add employee compensation benefits'); } public function deleteEmployeeCompensationBenefits() { $empPayInDedModel = new EmpPayIncomeDeductionModel(); if ($empPayInDedModel->delete($this->request->getPost('emppayinded_id'))) return redirect()->to('/payroll/compben?payschedid=' . $this->request->getPost('payschedule_id') . '&empid=' . $this->request->getPost('emp_id'))->with('message', 'Employee Compensation Benefits deleted'); else return redirect()->back()->with('error', 'Failed to delete employee compensation benefits'); } public function payrollSettings() { $incomeDeductionModel = new IncomeDeductionModel(); $settingsModel = new SettingsModel(); $settings = new Settings(); if ($this->request->is('post')) { $settings->fill($this->request->getPost()); $settingsModel->save($settings); } $data['indedList'] = $incomeDeductionModel->findAll(); $data['basicSalVal'] = $settingsModel->where('key', 'BasicSalary')->first(); $data['COLAVal'] = $settingsModel->where('key', 'COLA')->first(); $data['PhilhealthVal'] = $settingsModel->where('key', 'Philhealth')->first(); $data['HDMFVal'] = $settingsModel->where('key', 'HDMF')->first(); $data['SSSVal'] = $settingsModel->where('key', 'SSS')->first(); $data['GSISVal'] = $settingsModel->where('key', 'GSIS')->first(); return view('payroll/paysettingsview', $data); } public function payrollTransactions() { $data['paytypes'] = (new PayrollTypeModel())->findAll(); $data['paySchedules'] = (new PayrollScheduleModel())->findAll(); $payTrans = (new PayrollTransactionModel())->orderBy('created_at', 'DESC')->findAll(); $payTransHTMLTable = new \CodeIgniter\View\Table(); $payTransHTMLTable->setTemplate(MiscLib::adminLTETableTemplate()); if ($payTrans == null) $data['tblPayTrans'] = 'No transactions found.
'; else { $payTransHTMLTable->setHeading('ID', 'From', 'To', 'No. of Days', 'Status', 'Remarks', 'Action'); foreach ($payTrans as $trans) { $iconView = ''; $iconEdit = ''; $payTransHTMLTable->addRow($trans->paytrans_id, $trans->payroll_from, $trans->payroll_to, $trans->no_of_days, $trans->is_open ? 'Open' : ' Closed', $trans->remarks, $iconView . ' ' . $iconEdit); } $data['tblPayTrans'] = $payTransHTMLTable->generate(); } return view('payroll/paytransactionview', $data); } public function addPayrollTransactions() { $payTransModel = new PayrollTransactionModel(); $payTrans = new PayrollTransaction(); $rawData = $this->request->getPost(); $payTrans->fill($rawData); if ($payTransModel->save($payTrans)) return redirect()->to('/payroll/paytrans')->with('message', 'Payroll Transaction Added'); else return redirect()->back()->withInput()->with('error', 'Failed to add payroll transaction'); } public function employeePayrollTransactions($paytransid) { $incomeDeductionModel = new IncomeDeductionModel(); $data['paygroupid'] = $this->request->getGet('grpid'); // INIT, OPEN, CLOSED $data['transactionStatus'] = 'INIT'; //$payTrans = (new PayrollTransactionModel())->where('paytrans_id', $paytransid)->first(); $data['payTrans'] = (new PayrollTransactionModel())->find($paytransid); $data['paygroups'] = (new PayrollGroupModel())->findAll(); $data['incomeList'] = $incomeDeductionModel->where("is_income", 1)->findAll(); $data['deductionList'] = $incomeDeductionModel->where("is_income", 0)->findAll(); $empPayTrans = (new EmployeePayTransactionModel())->getEmpPayTransByPayTransIdGroupId($paytransid, $data['paygroupid']); $empPayTransHTMLTable = new \CodeIgniter\View\Table(); $empPayTransHTMLTable->setTemplate(MiscLib::adminLTETableTemplate()); if ($empPayTrans == null) { $empPayTrans = (new EmployeePayrollInfoModel())->getEmpPayInfoXEmpPayTypeByPayGrpId($data['paygroupid'], $data['payTrans']->paytype_id); $attSummary = (new AttendanceSummaryModel())->where('paytrans_id', $paytransid)->findAll(); $empPayTransHTMLTable->setHeading('ID', 'Company ID', 'Name', 'Branch', 'Daily Basic', 'Work Days'); if ($empPayTrans != null) { $data['transactionStatus'] = 'INIT'; foreach ($empPayTrans as $trans) { $empAttSum = MiscLib::searchFromAsocArray('employee_id', $trans->employee_id, $attSummary); $empPayTransHTMLTable->addRow($trans->employee_id, $trans->company_issued_id, $trans->last_name . ', ' . $trans->first_name, $trans->branch_code, $trans->basic_monthly_pay, ($empAttSum === null) ? 0 : $empAttSum->att_work_days); } $data['tblEmpPayTrans'] = $empPayTransHTMLTable->generate(); } else $data['tblEmpPayTrans'] = 'No Employee Found on this Payroll Group
'; } else { $data['transactionStatus'] = 'OPEN'; $empPayTransHTMLTable->setHeading('ID', 'Name', 'Branch', 'Basic Salary', 'Days Work', 'Gross', 'Deduction', 'Net', 'Action'); foreach ($empPayTrans as $trans) { //$iconView = ''; $iconCopy = ''; $iconEdit = ''; $empPayTransHTMLTable->addRow($trans->employee_id, $trans->last_name . ', ' . $trans->first_name, $trans->branch_code, $trans->basic_pay, $trans->actual_work_days, $trans->gross_income, $trans->total_deduction, $trans->net_pay, $iconCopy . ' ' . $iconEdit); // Get Emp Trans In Ded $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); $data['emppaytrans'][] = [ "empPayTrans" => $trans, "empPayTransInDedIncome" => $empPayTransInDedModel->where(["emppaytrans_id"=>$trans->emppaytrans_id, "is_income"=>true])->findAll(), "empPayTransInDedDeduction" => $empPayTransInDedModel->where(["emppaytrans_id"=>$trans->emppaytrans_id, "is_income"=>false])->findAll() ]; } $data['tblEmpPayTrans'] = $empPayTransHTMLTable->generate(); } return view('payroll/emppaytransactionview', $data); } public function employeePayrollTransactionsViewEmpForInit($paytransid, $paygroupid) { $incomeDeductionModel = new IncomeDeductionModel(); $data['payGroup'] = (new PayrollGroupModel())->find($paygroupid); $data['payTrans'] = (new PayrollTransactionModel())->find($paytransid); // INIT, OPEN, CLOSED $data['transactionStatus'] = 'INIT'; $empPayTrans = (new EmployeePayTransactionModel())->getEmpPayTransByPayTransIdGroupId($paytransid, $paygroupid); $empPayInfos = (new EmployeePayrollInfoModel())->getEmpPayInfoXEmpPayTypeByPayGrpId($paygroupid, $data['payTrans']->paytype_id); $empPayTransHTMLTable = new \CodeIgniter\View\Table(); $empPayTransHTMLTable->setTemplate(MiscLib::adminLTETableTemplate()); $attSummary = (new AttendanceSummaryModel())->where('paytrans_id', $paytransid)->findAll(); $empPayTransHTMLTable->setHeading('ID', 'Company ID', 'Name', 'Branch', 'Daily Basic', 'Work Days', 'Action'); foreach ($empPayInfos as $empPayInfo) { $empAttSum = MiscLib::searchFromAsocArray('employee_id', $empPayInfo->employee_id, $attSummary); $empIsInEmpPayTrans = (MiscLib::searchFromAsocArray('employee_id', $empPayInfo->employee_id, $empPayTrans) == null) ? false : true; $empPayTransHTMLTable->addRow($empPayInfo->employee_id, $empPayInfo->company_issued_id, $empPayInfo->last_name . ', ' . $empPayInfo->first_name, $empPayInfo->branch_code, $empPayInfo->basic_monthly_pay, ($empAttSum === null) ? 0 : $empAttSum->att_work_days, ($empIsInEmpPayTrans) ? '' : 'Initialize'); } $data['tblEmpPayTrans'] = $empPayTransHTMLTable->generate(); return view('payroll/emppaytransinitempview', $data); } public function empPayTransFillArrayFromEmpPayInfo($paytransid, $empPayInfo, $empAttSum) { return [ 'paytrans_id' => $paytransid, 'company_id' => $empPayInfo->company_id, 'branch_code' => $empPayInfo->branch_code, 'dept_id' => $empPayInfo->dept_id, 'job_title_id' => $empPayInfo->job_title_id, 'pay_group_id' => $empPayInfo->pay_group_id, 'emp_status_id' => $empPayInfo->emp_status_id, 'employee_id' => $empPayInfo->employee_id, 'company_issued_id' => $empPayInfo->company_issued_id, 'last_name' => $empPayInfo->last_name, 'first_name' => $empPayInfo->first_name, 'middle_name' => $empPayInfo->middle_name, 'suffix' => $empPayInfo->suffix, 'email_address' => $empPayInfo->email_address, 'is_ATM' => $empPayInfo->is_ATM, 'savings_account' => $empPayInfo->savings_account, 'basic_sal_computation' => $empPayInfo->basic_sal_computation, 'basic_monthly_pay' => $empPayInfo->basic_monthly_pay, 'basic_semi_monthly_pay' => $empPayInfo->basic_semi_monthly_pay, 'basic_daily_pay' => $empPayInfo->basic_daily_pay, 'basic_hourly_pay' => $empPayInfo->basic_hourly_pay, 'has_cola' => $empPayInfo->has_cola, 'has_philhealth' => $empPayInfo->has_philhealth, 'has_hdmf' => $empPayInfo->has_hdmf, 'has_sss' => $empPayInfo->has_sss, 'has_gsis' => $empPayInfo->has_gsis, 'actual_work_days' => ($empAttSum === null) ? 0 : $empAttSum->att_work_days, 'basic_pay' => 0, 'gross_income' => 0, 'taxable_income' => 0, 'nontaxable_income' => 0, 'income_tax' => 0, 'total_deduction' => 0, 'taxable_deduction' => 0, 'nontaxable_deduction' => 0, 'net_pay' => 0 ]; } public function empPayTransInDedFillArrayFromEmpPayInDed($emppaytransid, $empPayInDed, $amount) { return [ 'emppaytrans_id' => $emppaytransid, 'inded_id' => $empPayInDed->inded_id, 'payslip_display' => $empPayInDed->payslip_display, 'inded_name' => $empPayInDed->inded_name, 'coa_code' => $empPayInDed->coa_code, 'is_income' => $empPayInDed->is_income, 'is_taxable' => $empPayInDed->is_taxable, 'include_in_gross' => $empPayInDed->include_in_gross, 'is_fixed_amt' => $empPayInDed->is_fixed_amt, 'is_percent_amt' => $empPayInDed->is_percent_amt, 'worked_days_based' => $empPayInDed->worked_days_based, 'amount' => $amount, 'base_amount' => $empPayInDed->amount, 'is_override' => $empPayInDed->is_override ]; } public function empPayTransInitializePayroll($paytransid, $paygroupid, $transtypid) { $empPayInfos = (new EmployeePayrollInfoModel())->getEmpPayInfoXEmpPayTypeByPayGrpId($paygroupid, $transtypid); $attSummary = (new AttendanceSummaryModel())->where('paytrans_id', $paytransid)->findAll(); $payTrans = (new PayrollTransactionModel())->find($paytransid); $empPayTransactionModel = new EmployeePayTransactionModel(); foreach ($empPayInfos as $empPayInfo) { $empPayTransaction = new EmployeePayTransaction(); $empAttSum = MiscLib::searchFromAsocArray('employee_id', $empPayInfo->employee_id, $attSummary); $empPayTransaction->fill($this->empPayTransFillArrayFromEmpPayInfo($paytransid, $empPayInfo, $empAttSum)); $empPayTransactionModel->save($empPayTransaction); $empPayTransaction = $empPayTransactionModel->find($empPayTransactionModel->getInsertID()); $empPayInDeds = (new EmpPayIncomeDeductionModel())->getEmpPayInDedByEmpPayIdSchedId($empPayInfo->emppay_id, $payTrans->payschedule_id); foreach ($empPayInDeds as $empPayInDed) { $empPayTransInDed = new EmpPayTransIncomeDeduction(); $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); $payCompute = new PayrollComputation(); $rawData = [ 'amount' => $empPayInDed->amount, 'is_fixed_amt' => $empPayInDed->is_fixed_amt, 'is_percent_amt' => $empPayInDed->is_percent_amt, 'worked_days_based' => $empPayInDed->worked_days_based ]; $amount = $payCompute->computeIncomeDeductionByComputationType($rawData, $empPayTransaction); $empPayTransInDed->fill($this->empPayTransInDedFillArrayFromEmpPayInDed($empPayTransaction->emppaytrans_id, $empPayInDed, $amount)); $empPayTransInDedModel->save($empPayTransInDed); } $this->computeEmployeePayroll($empPayTransaction->emppaytrans_id, true); } return redirect()->back()->withInput()->with('message', 'Payroll processed. Please verify the entries.'); } public function empPayTransInitializeEmpPayroll($paytransid, $emppayid) { $empPayTransactionModel = new EmployeePayTransactionModel(); $empPayInfo = (new EmployeePayrollInfoModel())->getEmpPayInfoXEmpPayTypeByEmpPayId($emppayid); $payTrans = (new PayrollTransactionModel())->find($paytransid); $attSummary = (new AttendanceSummaryModel())->where('paytrans_id', $paytransid)->findAll(); $empAttSum = MiscLib::searchFromAsocArray('employee_id', $empPayInfo->employee_id, $attSummary); $empPayTransaction = new EmployeePayTransaction(); $empPayTransaction->fill($this->empPayTransFillArrayFromEmpPayInfo($paytransid, $empPayInfo, $empAttSum)); $empPayTransactionModel->save($empPayTransaction); $empPayTransaction = $empPayTransactionModel->find($empPayTransactionModel->getInsertID()); $empPayInDeds = (new EmpPayIncomeDeductionModel())->getEmpPayInDedByEmpPayIdSchedId($empPayInfo->emppay_id, $payTrans->payschedule_id); foreach ($empPayInDeds as $empPayInDed) { $empPayTransInDed = new EmpPayTransIncomeDeduction(); $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); $payCompute = new PayrollComputation(); $rawData = [ 'amount' => $empPayInDed->amount, 'is_fixed_amt' => $empPayInDed->is_fixed_amt, 'is_percent_amt' => $empPayInDed->is_percent_amt, 'worked_days_based' => $empPayInDed->worked_days_based ]; $amount = $payCompute->computeIncomeDeductionByComputationType($rawData, $empPayTransaction); $empPayTransInDed->fill($this->empPayTransInDedFillArrayFromEmpPayInDed($empPayTransaction->emppaytrans_id, $empPayInDed, $amount)); $empPayTransInDedModel->save($empPayTransInDed); } $this->computeEmployeePayroll($empPayTransaction->emppaytrans_id, true); return redirect()->back()->withInput()->with('message', 'Payroll processed. Please verify the entries.'); } public function empPayTransReInitEmpPayroll($emppaytransid, $employeeid, $paytypeid) { $empPayTransactionModel = new EmployeePayTransactionModel(); $currentEmpPayTransaction = $empPayTransactionModel->find($emppaytransid); $empPayInfo = (new EmployeePayrollInfoModel())->where(['employee_id' => $employeeid, 'paytype_id' => $paytypeid])->first(); if ($empPayInfo == null) return redirect()->back()->withInput()->with('error', 'Employee Payroll Information not found. Please check payroll information.'); $attSummary = (new AttendanceSummaryModel())->where('paytrans_id', $currentEmpPayTransaction->paytrans_id)->findAll(); $empAttSum = MiscLib::searchFromAsocArray('employee_id', $empPayInfo->employee_id, $attSummary); $empPayTransaction = new EmployeePayTransaction(); $empPayTransaction->fill($this->empPayTransFillArrayFromEmpPayInfo($currentEmpPayTransaction->paytrans_id, $empPayInfo, $empAttSum)); $empPayTransaction->emppaytrans_id = $emppaytransid; if ($empPayTransactionModel->save($empPayTransaction)) { $this->computeEmployeePayroll($emppaytransid, true); return redirect()->back()->withInput()->with('message', 'Payroll re-initialize. Please verify the entries.'); } else return redirect()->back()->withInput()->with('error', 'Failed to re-initialize payroll.'); } public function employeePayrollTransactionsEditDaysWorked() { $empPayTransModel = new EmployeePayTransactionModel(); $rawData = $this->request->getPost(); $empPayTransModel->changeActualDaysWorked($rawData['emppaytrans_id'], $rawData['actual_work_days']); $this->computeEmployeePayroll($rawData['emppaytrans_id'], true, $empPayTransModel); return redirect()->back()->withInput()->with('message', 'Days worked updated.'); } public function employeePayrollTransactionsRecompute($emppaytransid) { $this->computeEmployeePayroll($emppaytransid, true); return redirect()->back()->with('message', 'Employee Payroll Recomputed'); } public function saveEmpPayTransIncomeDeduction() { $empPayTransInDed = new EmpPayTransIncomeDeduction(); $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); $empPayTransactionModel = new EmployeePayTransactionModel(); $incomeDeductionModel = new IncomeDeductionModel(); $rawData = $this->request->getPost(); // Initialize all payroll type fields to 0 $rawData['is_fixed_amt'] = 0; $rawData['is_percent_amt'] = 0; $rawData['worked_days_based'] = 0; // Handle radio button input if (isset($rawData['amount_type'])) { switch ($rawData['amount_type']) { case 'fixed': $rawData['is_fixed_amt'] = 1; break; case 'perc': $rawData['is_percent_amt'] = 1; break; case 'daysbased': $rawData['worked_days_based'] = 1; break; } } $rawData['is_override'] = isset($rawData['is_override']) ? 1 : 0; $empPayTrans = $empPayTransactionModel->find($rawData['emppaytrans_id']); $incomeDeduction = $incomeDeductionModel->find($rawData['inded_id']); //$amount = $rawData['is_fixed_amt'] ? $rawData['amount'] : ($rawData['amount'] / 100) * $empPayTrans->basic_pay; $payCompute = new PayrollComputation(); $amount = $payCompute->computeIncomeDeductionByComputationType($rawData, $empPayTrans); $empPayTransInDed->fill([ 'emppaytransinded_id' => (isset($rawData['emppaytransinded_id'])) ? $rawData['emppaytransinded_id'] : null, 'emppaytrans_id' => $rawData['emppaytrans_id'], 'inded_id' => $rawData['inded_id'], 'payslip_display' => $incomeDeduction->payslip_display, 'inded_name' => $incomeDeduction->inded_name, 'coa_code' => $incomeDeduction->coa_code, 'is_income' => $incomeDeduction->is_income, 'is_taxable' => $incomeDeduction->is_taxable, 'include_in_gross' => $incomeDeduction->include_in_gross, 'is_fixed_amt' => $rawData['is_fixed_amt'], 'is_percent_amt' => $rawData['is_percent_amt'], 'worked_days_based' => $rawData['worked_days_based'], 'amount' => $amount, 'base_amount' => $rawData['amount'], 'is_override' => $rawData['is_override'] ]); if ($empPayTransInDedModel->save($empPayTransInDed)) { $this->computeEmployeePayroll($rawData['emppaytrans_id'], true, $empPayTransactionModel, $empPayTransInDedModel); if (isset($rawData['emppaytransinded_id'])) return redirect()->back()->with('message', 'Income or Deduction Updated'); else return redirect()->back()->with('message', 'Income or Deduction Added'); } else return redirect()->back()->withInput()->with('error', 'Failed to add income or deduction'); } public function deleteEmpPayTransIncomeDeduction($emppaytransindedid, $emppaytransid) { $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); if ($empPayTransInDedModel->delete($emppaytransindedid)) { $this->computeEmployeePayroll($emppaytransid, true, null, $empPayTransInDedModel); return redirect()->back()->with('message', 'Income or Deduction Deleted'); } else return redirect()->back()->with('error', 'Failed to delete income or deduction'); } public function empPayransReport($paytransid, $paygroupid) { $data['payTrans'] = (new PayrollTransactionModel())->find($paytransid); $data['payGroup'] = (new PayrollGroupModel())->find($paygroupid); $employeePayTransactionModel = new EmployeePayTransactionModel(); $empPayTransInDeds = $employeePayTransactionModel->getEmpPayTransInDedByPayTransIdGroupId($paytransid, $paygroupid); $empPayTransactions = $employeePayTransactionModel->getEmpPayTransByPayTransIdGroupId($paytransid, $paygroupid); $empPayTransHTMLTable = new \CodeIgniter\View\Table(); $empPayTransHTMLTable->setTemplate(MiscLib::adminLTEDataTableTemplate('tblEmpPayTransInDed')); //return view('payroll/emppaytransreportview', $data); $inDedList = []; foreach($empPayTransInDeds as $empPayTransInDed) { if(!in_array("[".$empPayTransInDed->inded_id."]".$empPayTransInDed->payslip_display, $inDedList)) $inDedList[] = "[".$empPayTransInDed->inded_id."]".$empPayTransInDed->payslip_display; } $empInDedList = []; foreach($empPayTransInDeds as $empPayTransInDed) { if(isset($empInDedList[$empPayTransInDed->employee_id.':'.$empPayTransInDed->inded_id])) $empInDedList[$empPayTransInDed->employee_id.':'.$empPayTransInDed->inded_id] += $empPayTransInDed->amount; else $empInDedList[$empPayTransInDed->employee_id.':'.$empPayTransInDed->inded_id] = $empPayTransInDed->amount; } $HTMLColumns = [ 'ID', 'Name', 'Branch', 'Daily Basic', 'Work Days', 'Income Tax', 'Gross Amt', 'Deduction Amt', 'Net Amt' ]; $HTMLColumns = array_merge($HTMLColumns, $inDedList); $empPayTransHTMLTable->setHeading($HTMLColumns); foreach($empPayTransactions as $empPayTrans) { $HTMLColValues = [ $empPayTrans->employee_id, $empPayTrans->last_name . ', ' . $empPayTrans->first_name, $empPayTrans->branch_code, $empPayTrans->basic_pay, $empPayTrans->actual_work_days, $empPayTrans->income_tax, $empPayTrans->gross_income, $empPayTrans->total_deduction, $empPayTrans->net_pay ]; foreach($inDedList as $inDedId) { preg_match_all('/\[(.*?)\]/', $inDedId, $matches); if(isset($empInDedList[$empPayTrans->employee_id.':'.$matches[1][0]])) $HTMLColValues = array_merge($HTMLColValues, [$empInDedList[$empPayTrans->employee_id.':'.$matches[1][0]]]); else $HTMLColValues = array_merge($HTMLColValues, ['0.00']); } $empPayTransHTMLTable->addRow($HTMLColValues); } $data['tblEmpPayTransInDed'] = $empPayTransHTMLTable->generate(); return view('payroll/emppaytransreportview', $data); } public function payrollTransactionsReview($paytransid) { $data['paytransid'] = $paytransid; $payTransModel = new PayrollTransactionModel(); $data['payTrans'] = $payTransModel->getPayTransXPayTypeXPaySchedByPayTransId($paytransid); $data['totalEmp'] = 0; $data['totalGross'] = 0; $data['totalDeduction'] = 0; $data['totalNet'] = 0; $data['totalSSSContri'] = 0; $data['totalPhilhealthContri'] = 0; $data['totalPagibigContri'] = 0; $data['totalTax'] = 0; return view('payroll/paytransactionreview', $data); } }