Files
icehrm/src/Payroll/Common/Model/PayrollCalculations.php
2017-09-24 19:23:30 +02:00

123 lines
3.5 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 4:17 PM
*/
namespace Payroll\Common\Model;
use Attendance\Common\Model\Attendance;
use Model\BaseModel;
use Salary\Common\Model\EmployeeSalary;
use TimeSheets\Common\Model\EmployeeTimeSheet;
class PayrollCalculations extends BaseModel
{
public function getRegularPayAmount($edata, $employeeId, $payroll)
{
$hours = empty($edata['hours'])?"0":floatval($edata['hours']);
$ot = empty($edata['overtime_pay'])?"0":floatval($edata['overtime_pay']);
if (!empty($edata['pay_rate']) && floatval($edata['pay_rate']) > 0) {
$amount = floatval($edata['pay_rate']) * ($hours + $ot * 1.5);
$amount = round($amount, 2);
} else {
//Find all pay period salary
$employeeSalary = new EmployeeSalary();
$list = $employeeSalary->Find(
"employee = ? and pay_frequency = ?",
array($employeeId, $payroll->pay_period)
);
$amount = 0;
foreach ($list as $sal) {
$amount += floatval($sal->amount);
}
}
return $amount;
}
public function findWorkHours($edata, $employeeId, $payroll)
{
return $this->getWorkingTime(
$employeeId,
date('Y-m-d', strtotime($payroll->date_start)),
date('Y-m-d', strtotime($payroll->date_end))
);
}
public function isTimesheetApproved($attendance)
{
$start = date("Y-m-d", strtotime($attendance->in_time));
$end = date("Y-m-d", strtotime($attendance->out_time));
$timesheet = new EmployeeTimeSheet();
$timesheet->Load(
"date_start <= ? and date_end >= ? and employee = ?",
array($start, $end, $attendance->employee)
);
if (!empty($timesheet->id)) {
if ($timesheet->status == "Approved") {
return true;
}
}
return false;
}
private function getWorkingTime($employee, $start, $end)
{
$start = $start . " 00:00:00";
$startTime = strtotime($start);
$end = $end . " 23:59:59";
$endTime = strtotime($end);
$attendance = new Attendance();
$list = $attendance->Find(
"employee = ? and ((in_time >= ? and in_time <= ?) or (out_time >= ? and out_time <= ?))",
array($employee, $start, $end, $start, $end)
);
$seconds = 0;
$unapprovedSeconds = 0;
foreach ($list as $entry) {
if (strtotime($entry->in_time) >= strtotime($entry->out_time)) {
continue;
}
$tStart = strtotime($entry->in_time);
$tEnd = strtotime($entry->out_time);
$secondsTemp = ($tEnd - $tStart);
if ($secondsTemp < 0) {
$secondsTemp = 0;
}
$seconds += $secondsTemp;
if (!$this->isTimesheetApproved($entry)) {
$unapprovedSeconds += $secondsTemp;
}
}
$totMinutes = round($seconds / 60);
$minutes = $totMinutes % 60;
$hours = ($totMinutes - $minutes) / 60;
$hoursPartial = $hours + ($minutes/60);
$totMinutes = round($unapprovedSeconds / 60);
$minutes = $totMinutes % 60;
$hours = ($totMinutes - $minutes) / 60;
$hoursPartialUnapproved = $hours + ($minutes/60);
return round($hoursPartial, 2) . "(".round($hoursPartialUnapproved, 2).")";
}
}