@ -34,6 +34,7 @@ use App\Entities\EmpPayTransIncomeDeduction;
// Class Library
// Class Library
use App\ClassLib\MiscLib;
use App\ClassLib\MiscLib;
use App\ClassLib\PayrollComputation;
class PayrollController extends BaseController
class PayrollController extends BaseController
{
{
@ -42,6 +43,57 @@ class PayrollController extends BaseController
return redirect()->to(base_url('/login'));
return redirect()->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
$empPayTrans->basic_pay = $empPayTrans->actual_work_days * $empPayTrans->basic_daily_pay;
$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($empPayTrans->net_pay);
echo "< br > < br > ";
}
// --end-- Internally used functions
public function payrollGroup()
public function payrollGroup()
{
{
@ -54,7 +106,7 @@ class PayrollController extends BaseController
$data['tblPayGroup'] = '< p > No groups found.< / p > ';
$data['tblPayGroup'] = '< p > No groups found.< / p > ';
else
else
{
{
$payGroupHTMLTable->setHeading('ID', 'Group Name', 'Action');
$payGroupHTMLTable->setHeading('ID', 'Group Code', 'Group Name', 'Action');
foreach($payGroups as $group)
foreach($payGroups as $group)
{
{
@ -397,7 +449,6 @@ class PayrollController extends BaseController
public function employeePayrollTransactions($paytransid)
public function employeePayrollTransactions($paytransid)
{
{
$data['paygroupid'] = $this->request->getGet('grpid');
$data['paygroupid'] = $this->request->getGet('grpid');
$data['showInitBtn'] = false;
$data['showInitBtn'] = false;
@ -429,13 +480,54 @@ class PayrollController extends BaseController
}
}
else
else
{
{
$empPayTransHTMLTable->setHeading('ID', 'Name', 'Branch', 'Monthly Basic', 'Action');
$empPayTransHTMLTable->setHeading('ID', 'Name', 'Branch', 'Basic Salary', 'Days Work', 'Gross', 'Deduction', 'Net', 'Action');
/* `emppaytrans_id`, `paytrans_id`, `company_id`, `branch_code`, `dept_id`, `job_title_id`,
`pay_group_id`, `emp_status_id`, `employee_id`, `company_issued_id`, `last_name`, `first_name`,
`middle_name`, `suffix`, `email_address`, `is_ATM`, `savings_account`, `basic_monthly_pay`, `basic_daily_pay`,
`basic_hourly_pay`, `has_cola`, `has_philhealth`, `has_hdmf`, `has_sss`, `has_gsis`, `actual_work_days`, `basic_pay`,
`gross_income`, `taxable_income`, `nontaxable_income`, `income_tax`, `total_deduction`, `taxable_deduction`, `nontaxable_deduction`,
`net_pay`, `created_at`, `created_by`, `updated_at`, `updated_by`, `deleted_at`, `paytrans_id`, `paytype_id`, `payschedule_id`, `payroll_from`,
`payroll_to`, `no_of_days`, `total_emp`, `total_gross`, `remarks`, `is_open`, `created_at`, `created_by`, `updated_at`,
`updated_by`, `deleted_at`, `branch_code`, `company_id`, `branch_name`, `address`, `contact_number`, `email_address`,
`created_at`, `created_by`, `updated_at`, `updated_by`, `deleted_at`, `dept_id`, `company_id`, `parent_dept_id`,
`department_code`, `department_name`, `created_at`, `created_by`, `updated_at`, `updated_by`, `deleted_at`, `job_title_id`,
`job_title_name`, `created_at`, `created_by`, `updated_at`, `updated_by`, `deleted_at`, `pay_group_id`, `pay_group_code`,
`pay_group_name`, `created_at`, `created_by`, `updated_at`, `updated_by`, `deleted_at`, `emp_status_id`, `status_name`,
`created_at`, `created_by`, `updated_at`, `updated_by`, `deleted_at`, `employee_id`, `company_id`, `branch_code`, `dept_id`,
`job_title_id`, `emp_status_id`, `pay_group_id`, `company_issued_id`, `last_name`, `first_name`, `middle_name`, `suffix`, `email_address`,
`contact_number`, `created_at`, `created_by`, `updated_at`, `updated_by`, `deleted_at`
[emppaytrans_id] => 30 [paytrans_id] => 1 [company_id] => 1 [branch_code] => KWSMB [dept_id] => 1 [job_title_id] => 1 [pay_group_id] => 1
[emp_status_id] => 1 [employee_id] => 1 [company_issued_id] => 1900 [last_name] => bel [first_name] => paul [middle_name] => b [suffix] =>
[email_address] => user1@yahoo.com [is_ATM] => 1 [savings_account] => 0000 [basic_monthly_pay] => 20000.0000 [basic_daily_pay] => 766.7732
[basic_hourly_pay] => 95.8466 [has_cola] => 0 [has_philhealth] => 1 [has_hdmf] => 1 [has_sss] => 1 [has_gsis] => 0 [actual_work_days] => 8.0000
[basic_pay] => 6134.1856 [gross_income] => 12268.3712 [taxable_income] => 12268.3712 [nontaxable_income] => 0.0000 [income_tax] => 370.2742
[total_deduction] => 400.0000 [taxable_deduction] => 0.0000 [nontaxable_deduction] => 400.0000 [net_pay] => 0.0000
[created_at] => 2024-09-06 06:36:22 [created_by] => 11-E128-70 [updated_at] => 2024-10-05 04:21:57 [updated_by] => 11-E128-70 [deleted_at] =>
[paytype_id] => 1 [payschedule_id] => 1 [payroll_from] => 2024-10-03 [payroll_to] => 2024-10-10 [no_of_days] => 8 [total_emp] => 0 [total_gross] => 0.0000
[remarks] => [is_open] => 1 [branch_name] => Karat World SM City Bacolod [address] => Bacolod City [contact_number] => 000 [parent_dept_id] => 0
[department_code] => HR [department_name] => Human Resources [job_title_name] => HR Personnel [pay_group_code] => VIS [pay_group_name] => Visayas Group
[status_name] => AWOL
[emppaytransinded_id] => 16 [emppaytrans_id] => 30 [inded_id] => 1 [payslip_display] => SSS Contribution [inded_name] => SSS
[coa_code] => [is_income] => 0 [is_taxable] => 0 [include_in_gross] => 0 [is_fixed_amt] => 1 [is_percent_amt] => 0
[amount] => 300.0000 [base_amount] => 300.0000 [is_override] => 0 [created_at] => 2024-09-13 09:34:54 [created_by] => 11-E128-70
[updated_at] => [updated_by] => [deleted_at] => */
foreach($empPayTrans as $trans)
foreach($empPayTrans as $trans)
{
{
$iconView = '< a href = "#" class = "ml-3" data-toggle = "tooltip" title = "View Information" > < i class = "fas fa-eye " > < / i > < / a > ';
//$iconView = '< a href = "#" class = "ml-3" data-toggle = "tooltip" title = "View Information" onclick = "showEmpPayTransDetails('.$trans->emppaytrans_id.')" > < i class = "fas fa-eye " > < / i > < / a > ';
$iconEdit = '< a href = "#" class = "ml-3" data-toggle = "tooltip" title = "Edit Information" onclick = "showEmpPayTransDetails('.$trans->emppaytrans_id.')" > < i class = "fas fa-edit " > < / i > < / a > ';
$empPayTransHTMLTable->addRow($trans->employee_id, $trans->last_name . ', ' . $trans->first_name, $trans->branch_code, $trans->basic_monthly_pay, $iconView);
$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, $iconEdit);
// Get Emp Trans In Ded
$empPayTransInDedModel = new EmpPayTransIncomeDeductionModel();
$data['emppaytrans'][] = ["empPayTrans"=>$trans,
"empPayTransInDed"=>$empPayTransInDedModel->getEmpPayTransInDedxInDedByEmpTransId($trans->emppaytrans_id)];
}
}
$data['tblEmpPayTrans'] = $empPayTransHTMLTable->generate();
$data['tblEmpPayTrans'] = $empPayTransHTMLTable->generate();
@ -448,11 +540,12 @@ class PayrollController extends BaseController
{
{
$empPayInfos = (new EmployeePayrollInfoModel())->getEmpPayInfoXEmpPayTypeByPayGrpId($paygroupid, $transtypid);
$empPayInfos = (new EmployeePayrollInfoModel())->getEmpPayInfoXEmpPayTypeByPayGrpId($paygroupid, $transtypid);
$payTrans = (new PayrollTransactionModel())->where('paytrans_id', $paytransid)->first();
$payTrans = (new PayrollTransactionModel())->where('paytrans_id', $paytransid)->first();
$empPayTransactionModel = new EmployeePayTransactionModel();
foreach($empPayInfos as $empPayInfo)
foreach($empPayInfos as $empPayInfo)
{
{
$empPayTransaction = new EmployeePayTransaction();
$empPayTransaction = new EmployeePayTransaction();
$empPayTransactionModel = new EmployeePayTransactionModel();
$empPayTransaction->fill(
$empPayTransaction->fill(
['paytrans_id' => $paytransid,
['paytrans_id' => $paytransid,
'company_id' => $empPayInfo->company_id,
'company_id' => $empPayInfo->company_id,
@ -485,11 +578,13 @@ class PayrollController extends BaseController
'nontaxable_income' => 0,
'nontaxable_income' => 0,
'income_tax' => 0,
'income_tax' => 0,
'total_deduction' => 0,
'total_deduction' => 0,
'taxable_deduction' => 0,
'nontaxable_deduction' => 0,
'net_pay' => 0]
'net_pay' => 0]
);
);
$empPayTransactionModel->save($empPayTransaction);
$empPayTransactionModel->save($empPayTransaction);
$empPayTransId = $empPayTransactionModel->getInsertID( );
$empPayTransaction = $empPayTransactionModel->find($empPayTransactionModel->getInsertID() );
$empPayInDeds = (new EmpPayIncomeDeductionModel())->getEmpPayInDedByEmpPayIdSchedId($empPayInfo->emppay_id, $payTrans->payschedule_id);
$empPayInDeds = (new EmpPayIncomeDeductionModel())->getEmpPayInDedByEmpPayIdSchedId($empPayInfo->emppay_id, $payTrans->payschedule_id);
@ -498,8 +593,10 @@ class PayrollController extends BaseController
$empPayTransInDed = new EmpPayTransIncomeDeduction();
$empPayTransInDed = new EmpPayTransIncomeDeduction();
$empPayTransInDedModel = new EmpPayTransIncomeDeductionModel();
$empPayTransInDedModel = new EmpPayTransIncomeDeductionModel();
$amount = $empPayInDed->is_fixed_amt ? $empPayInDed->amount : ($empPayInDed->amount / 100) * $empPayTransaction->basic_pay;
$empPayTransInDed->fill(
$empPayTransInDed->fill(
['emppaytrans_id' => $empPayTransId,
['emppaytrans_id' => $empPayTransaction->emppaytrans_i d,
'inded_id' => $empPayInDed->inded_id,
'inded_id' => $empPayInDed->inded_id,
'payslip_display' => $empPayInDed->payslip_display,
'payslip_display' => $empPayInDed->payslip_display,
'inded_name' => $empPayInDed->inded_name,
'inded_name' => $empPayInDed->inded_name,
@ -509,15 +606,54 @@ class PayrollController extends BaseController
'include_in_gross' => $empPayInDed->include_in_gross,
'include_in_gross' => $empPayInDed->include_in_gross,
'is_fixed_amt' => $empPayInDed->is_fixed_amt,
'is_fixed_amt' => $empPayInDed->is_fixed_amt,
'is_percent_amt' => $empPayInDed->is_percent_amt,
'is_percent_amt' => $empPayInDed->is_percent_amt,
'amount' => $empPayInDed->is_fixed_amt ? $empPayInDed-> amount : ($empPayInDed->amount / 100) * ($payTrans->no_of_days * $empPayInfo->basic_daily_pay) ,
'amount' => $amount,
'base_amount' => $empPayInDed->amount,
'base_amount' => $empPayInDed->amount,
'is_override' => $empPayInDed->is_override]
'is_override' => $empPayInDed->is_override]
);
);
$empPayTransInDedModel->save($empPayTransInDed);
$empPayTransInDedModel->save($empPayTransInDed);
// Updating EmpPayTransaction
if($empPayInDed->is_income)
{
$empPayTransaction->gross_income += $amount;
$empPayTransaction->{$empPayInDed->is_taxable ? 'taxable_income' : 'nontaxable_income'} += $amount;
}
else
{
$empPayTransaction->total_deduction += $amount;
$empPayTransaction->{$empPayInDed->is_taxable ? 'taxable_deduction' : 'nontaxable_deduction'} += $amount;
}
// Less nontaxable deduction to taxable income
$empPayTransaction->taxable_income -= $empPayTransaction->nontaxable_income;
// Compute Income Tax
$payCompute = new PayrollComputation();
$empPayTransaction->income_tax = $payCompute->computeIncomeTax($empPayTransaction->taxable_income);
}
}
$empPayTransaction->gross_income += $empPayTransaction->basic_pay;
$empPayTransaction->taxable_income += $empPayTransaction->basic_pay;
$empPayTransaction->total_deduction += $empPayTransaction->income_tax;
$empPayTransaction->net_pay = $empPayTransaction->gross_income - $empPayTransaction->total_deduction;
$empPayTransactionModel->save($empPayTransaction);
}
}
return redirect()->back()->withInput()->with('message', 'Payroll processed. Please verify the entries.');
return redirect()->back()->withInput()->with('message', 'Payroll processed. Please verify the entries.');
}
}
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.');
}
}
}