diff --git a/app/ClassLib/PayrollComputation.php b/app/ClassLib/PayrollComputation.php new file mode 100644 index 0000000..cebb71d --- /dev/null +++ b/app/ClassLib/PayrollComputation.php @@ -0,0 +1,41 @@ +post('payroll/addpaytrans', 'PayrollController::addPayrollTransactions' $routes->get('payroll/emppaytrans/(:num)', 'PayrollController::employeePayrollTransactions/$1'); $routes->get('payroll/emppaytransinit/(:num)/(:num)/(:num)', 'PayrollController::empPayTransInitializePayroll/$1/$2/$3'); +$routes->post('payroll/emppaytransupdateworkdays', 'PayrollController::employeePayrollTransactionsEditDaysWorked'); + + +//$routes->get('t/(:num)/(:num)', 'PayrollController::computeEmployeePayroll/$1/$2'); + // Administrator Routes $routes->get('adminuser', 'AdministratorController::index'); diff --git a/app/Controllers/PayrollController.php b/app/Controllers/PayrollController.php index fffe5ff..185334e 100644 --- a/app/Controllers/PayrollController.php +++ b/app/Controllers/PayrollController.php @@ -34,6 +34,7 @@ use App\Entities\EmpPayTransIncomeDeduction; // Class Library use App\ClassLib\MiscLib; +use App\ClassLib\PayrollComputation; class PayrollController extends BaseController { @@ -42,6 +43,57 @@ class PayrollController extends BaseController 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 "

"; + } + + + // --end-- Internally used functions + public function payrollGroup() { @@ -54,7 +106,7 @@ class PayrollController extends BaseController $data['tblPayGroup'] = '

No groups found.

'; else { - $payGroupHTMLTable->setHeading('ID', 'Group Name', 'Action'); + $payGroupHTMLTable->setHeading('ID', 'Group Code', 'Group Name', 'Action'); foreach($payGroups as $group) { @@ -397,7 +449,6 @@ class PayrollController extends BaseController public function employeePayrollTransactions($paytransid) { - $data['paygroupid'] = $this->request->getGet('grpid'); $data['showInitBtn'] = false; @@ -429,13 +480,54 @@ class PayrollController extends BaseController } 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) { - $iconView = ''; + //$iconView = ''; + $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, $iconEdit); - $empPayTransHTMLTable->addRow($trans->employee_id, $trans->last_name . ', ' . $trans->first_name, $trans->branch_code, $trans->basic_monthly_pay, $iconView); + // Get Emp Trans In Ded + $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); + $data['emppaytrans'][] = ["empPayTrans"=>$trans, + "empPayTransInDed"=>$empPayTransInDedModel->getEmpPayTransInDedxInDedByEmpTransId($trans->emppaytrans_id)]; } $data['tblEmpPayTrans'] = $empPayTransHTMLTable->generate(); @@ -448,11 +540,12 @@ class PayrollController extends BaseController { $empPayInfos = (new EmployeePayrollInfoModel())->getEmpPayInfoXEmpPayTypeByPayGrpId($paygroupid, $transtypid); $payTrans = (new PayrollTransactionModel())->where('paytrans_id', $paytransid)->first(); + $empPayTransactionModel = new EmployeePayTransactionModel(); foreach($empPayInfos as $empPayInfo) { $empPayTransaction = new EmployeePayTransaction(); - $empPayTransactionModel = new EmployeePayTransactionModel(); + $empPayTransaction->fill( ['paytrans_id' => $paytransid, 'company_id' => $empPayInfo->company_id, @@ -485,11 +578,13 @@ class PayrollController extends BaseController 'nontaxable_income' => 0, 'income_tax' => 0, 'total_deduction' => 0, + 'taxable_deduction' => 0, + 'nontaxable_deduction' => 0, 'net_pay' => 0] ); $empPayTransactionModel->save($empPayTransaction); - $empPayTransId = $empPayTransactionModel->getInsertID(); + $empPayTransaction = $empPayTransactionModel->find($empPayTransactionModel->getInsertID()); $empPayInDeds = (new EmpPayIncomeDeductionModel())->getEmpPayInDedByEmpPayIdSchedId($empPayInfo->emppay_id, $payTrans->payschedule_id); @@ -498,8 +593,10 @@ class PayrollController extends BaseController $empPayTransInDed = new EmpPayTransIncomeDeduction(); $empPayTransInDedModel = new EmpPayTransIncomeDeductionModel(); + $amount = $empPayInDed->is_fixed_amt ? $empPayInDed->amount : ($empPayInDed->amount / 100) * $empPayTransaction->basic_pay; + $empPayTransInDed->fill( - ['emppaytrans_id' => $empPayTransId, + ['emppaytrans_id' => $empPayTransaction->emppaytrans_id, 'inded_id' => $empPayInDed->inded_id, 'payslip_display' => $empPayInDed->payslip_display, 'inded_name' => $empPayInDed->inded_name, @@ -509,15 +606,54 @@ class PayrollController extends BaseController 'include_in_gross' => $empPayInDed->include_in_gross, 'is_fixed_amt' => $empPayInDed->is_fixed_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, 'is_override' => $empPayInDed->is_override] ); - + $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.'); } + + 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.'); + } } diff --git a/app/Database/Migrations/2024-10-08-104033_AddTaxNonTaxDeductionOnEmpPayTrans.php b/app/Database/Migrations/2024-10-08-104033_AddTaxNonTaxDeductionOnEmpPayTrans.php new file mode 100644 index 0000000..cab1196 --- /dev/null +++ b/app/Database/Migrations/2024-10-08-104033_AddTaxNonTaxDeductionOnEmpPayTrans.php @@ -0,0 +1,37 @@ + [ + 'type' => 'DECIMAL', + 'constraint' => '12,4', + 'null' => false, + 'after' => 'total_deduction', + ], + 'nontaxable_deduction' => [ + 'type' => 'DECIMAL', + 'constraint' => '12,4', + 'null' => false, + 'after' => 'taxable_deduction', + ], + ]; + $this->forge->addColumn('emp_pay_trans', $fields); + } + + public function down() + { + $fields = [ + 'taxable_deduction', + 'nontaxable_deduction', + ]; + + $this->forge->dropColumn('emp_pay_trans', $fields); + } +} diff --git a/app/Entities/EmployeePayTransaction.php b/app/Entities/EmployeePayTransaction.php index c4902f1..abfdcb7 100644 --- a/app/Entities/EmployeePayTransaction.php +++ b/app/Entities/EmployeePayTransaction.php @@ -39,6 +39,8 @@ class EmployeePayTransaction extends Entity 'nontaxable_income' => null, 'income_tax' => null, 'total_deduction' => null, + 'taxable_deduction' => null, + 'nontaxable_deduction' => null, 'net_pay' => null, ]; protected $datamap = []; diff --git a/app/Models/EmpPayTransIncomeDeductionModel.php b/app/Models/EmpPayTransIncomeDeductionModel.php index 5898c24..f95c3b6 100644 --- a/app/Models/EmpPayTransIncomeDeductionModel.php +++ b/app/Models/EmpPayTransIncomeDeductionModel.php @@ -57,4 +57,26 @@ class EmpPayTransIncomeDeductionModel extends Model $data['data']['updated_by'] = auth()->user()->employee_id; return $data; } + + public function getEmpPayTransInDedxInDedByEmpTransId($emptransid) + { + $builder = $this->db->table('emp_pay_trans_inded'); + $builder->select('*'); + $builder->join('pay_income_deduction', 'pay_income_deduction.inded_id = emp_pay_trans_inded.inded_id'); + $builder->where('emp_pay_trans_inded.emppaytrans_id', $emptransid); + return $builder->get()->getResult(); + } + + public function getTotalIncomeDeduction($emppaytransid, $isincome, $istaxable) + { + $builder = $this->db->table('emp_pay_trans_inded'); + $builder->selectSum('amount'); + $builder->where(['emppaytrans_id'=>$emppaytransid, + 'is_income'=>$isincome, + 'is_taxable'=>$istaxable]); + $result = $builder->get()->getRow(); + + if($result->amount == null) return 0; + else return $result->amount; + } } diff --git a/app/Models/EmployeePayTransactionModel.php b/app/Models/EmployeePayTransactionModel.php index 6701f3d..dbe2ab9 100644 --- a/app/Models/EmployeePayTransactionModel.php +++ b/app/Models/EmployeePayTransactionModel.php @@ -43,6 +43,8 @@ class EmployeePayTransactionModel extends Model 'nontaxable_income', 'income_tax', 'total_deduction', + 'taxable_deduction', + 'nontaxable_deduction', 'net_pay']; protected bool $allowEmptyInserts = false; @@ -97,4 +99,12 @@ class EmployeePayTransactionModel extends Model $builder->where('emp_pay_trans.pay_group_id', $paygroupid); return $builder->get()->getResult(); } + + public function changeActualDaysWorked($emppaytransid, $actualworkdays) + { + $builder = $this->db->table('emp_pay_trans'); + $builder->set('actual_work_days', $actualworkdays); + $builder->where('emppaytrans_id', $emppaytransid); + return $builder->update(); + } } diff --git a/app/Views/payroll/emppaytransactionview.php b/app/Views/payroll/emppaytransactionview.php index 4f4914b..334cd41 100644 --- a/app/Views/payroll/emppaytransactionview.php +++ b/app/Views/payroll/emppaytransactionview.php @@ -122,6 +122,178 @@ + +
+
+ + + +
+
+ + +
@@ -136,7 +308,7 @@

You may change the working days for this payroll cutoff. Deduct days off or absences on working days field.

-

Adjust entry of each employee by clicking on Adjust button

+

Adjust entry of each employee by clicking on Edit icon

@@ -175,6 +347,12 @@ $(document).ready(function() { }); +function showEmpPayTransDetails(emptransid) +{ + $("div[id^='payrollTabInfo']" ).hide(); + $("#payrollTabInfo"+emptransid).toggle(); +} + endSection() ?>