Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 51 |
CRAP | |
0.00% |
0 / 2062 |
| StaffLeaveService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 51 |
175142.00 | |
0.00% |
0 / 2062 |
| __construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
|||
| __clone | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 1 |
|||
| getInstance | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 5 |
|||
| getStaffLeaveReportForAGivenDateRange | |
0.00% |
0 / 1 |
272.00 | |
0.00% |
0 / 50 |
|||
| getRecomendedOrApprovelStaffsByDesignationIDAndSectionID | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 20 |
|||
| getShiftChangeRequestDetailsByID | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 10 |
|||
| getAllStaffLeaveTypes | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 24 |
|||
| checkGrace | |
0.00% |
0 / 1 |
5550.00 | |
0.00% |
0 / 324 |
|||
| returnApproveLeavesTakenByStaff | |
0.00% |
0 / 1 |
306.00 | |
0.00% |
0 / 75 |
|||
| heOrShePresent | |
0.00% |
0 / 1 |
4830.00 | |
0.00% |
0 / 358 |
|||
| getStaffDayDetails | |
0.00% |
0 / 1 |
3540.00 | |
0.00% |
0 / 219 |
|||
| graceCalculator1 | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 6 |
|||
| graceCalculator2 | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 6 |
|||
| getPunchTimeDifferenceInMinutes | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 11 |
|||
| getActualPunchTimeDifferenceInMinutes | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 11 |
|||
| validateLeaveRespectingLeaveDuration | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 18 |
|||
| validateLeave | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 20 |
|||
| payRollCalculation | |
0.00% |
0 / 1 |
210.00 | |
0.00% |
0 / 97 |
|||
| showStaffAttendanceDetails | |
0.00% |
0 / 1 |
342.00 | |
0.00% |
0 / 72 |
|||
| getLeaveDetails | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 12 |
|||
| getStaffPayrollDetailsWithPayrollId | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 16 |
|||
| updatePayrollDetails | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 15 |
|||
| insertPayrollDetails | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 15 |
|||
| getStaffPayrollPeriods | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 18 |
|||
| updatePayrollPeriod | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 11 |
|||
| getStaffLeaveDetails | |
0.00% |
0 / 1 |
90.00 | |
0.00% |
0 / 54 |
|||
| staffLeaveCertificationCount | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 11 |
|||
| getHrSectionDetailBySectionID | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 19 |
|||
| getStaffNumberOfLeaveApplicationLimit | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 12 |
|||
| getReportRulesOfLeaveTypes | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 11 |
|||
| getStaffLeaveApplicationByGroupID | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
| getApplicationSanctionDetailsByApplicationID | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
| getHrApplicationSanctionCertificatesByGroupID | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
| deleteNewLeaveApplicationAndInsertOld | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 24 |
|||
| whyAbsent | |
0.00% |
0 / 1 |
210.00 | |
0.00% |
0 / 45 |
|||
| getAllStaffWithInaSection | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 19 |
|||
| getPayRollPeriodByStartDateAndEndDate | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 10 |
|||
| getStaffUpdatePunchTimeRequestByPayRollPeriodID | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 11 |
|||
| getLeaveDetailsByLeaveCode | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
| getDayDetailsByDayCode | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
| updateleaveViaScript | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 99 |
|||
| getEscalationDetailsOfStaff | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 17 |
|||
| getCurrentDateLeaves | |
0.00% |
0 / 1 |
72.00 | |
0.00% |
0 / 68 |
|||
| updateLeaveEscalation | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 46 |
|||
| checkForEscalationStatus | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 45 |
|||
| getstaffLeaveDetailsByApplicationID | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 22 |
|||
| getPayrollPeriodByDate | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
| getPayrollProcessedStatus | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 17 |
|||
| updateLeaveByApplicationID | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 35 |
|||
| getSessionTimeFromLeaveApplicationID | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
| checkForExistingLeave | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 17 |
|||
| <?php | |
| namespace com\linways\core\ams\professional\service\hr; | |
| use com\linways\common\core\service\CommonService as ServiceCommonService; | |
| use com\linways\core\ams\professional\constant\SettingsConstants; | |
| use com\linways\core\ams\professional\dto\SettingsConstents; | |
| use com\linways\core\ams\professional\service\BaseService; | |
| use com\linways\core\ams\professional\mapper\StaffLeaveServiceMapper; | |
| use com\linways\core\ams\professional\exception\ProfessionalException; | |
| use com\linways\core\ams\professional\request\hr\ConsolidatedStaffLeaveReport; | |
| use com\linways\core\ams\professional\service\CalendarService; | |
| use com\linways\core\ams\professional\service\CommonService; | |
| use com\linways\core\ams\professional\util\CommonUtil; | |
| use DateTime; | |
| use stdClass; | |
| class StaffLeaveService extends BaseService | |
| { | |
| // /Condition 1 - Presence of a static member variable | |
| private static $_instance = null; | |
| // /Condition 2 - Locked down the constructor | |
| private function __construct() | |
| { | |
| $this->mapper = StaffLeaveServiceMapper::getInstance()->getMapper(); | |
| } | |
| // Prevent any oustide instantiation of this class | |
| // /Condition 3 - Prevent any object or instance of that class to be cloned | |
| private function __clone() | |
| {} | |
| // Prevent any copy of this object | |
| // /Condition 4 - Have a single globally accessible static method | |
| public static function getInstance() | |
| { | |
| if (! is_object(self::$_instance)) // or if( is_null(self::$_instance) ) or if( self::$_instance == null ) | |
| self::$_instance = new self(); | |
| return self::$_instance; | |
| } | |
| /** | |
| * This function returns a list of staffs with details of their attendance for | |
| * a date and applied leaves for an attendance date if any. | |
| * | |
| * @return void | |
| */ | |
| public function getStaffLeaveReportForAGivenDateRange($request){ | |
| $sql = ""; | |
| $request = $this->realEscapeObject($request); | |
| if(in_array('all', $request->staffIds)){ | |
| $request->staffIds = []; | |
| } | |
| if(!empty($request->staffIds)){ | |
| $request->staffIds = implode(',', $request->staffIds); | |
| } | |
| if(in_array('ALL', $request->deptIds)){ | |
| $request->deptIds = []; | |
| } | |
| if(!empty($request->deptIds)){ | |
| $request->deptIds = implode(',', $request->deptIds); | |
| } | |
| $sectionIds = in_array("",$request->sectionID)?false:implode(",",$request->sectionID); | |
| $sectionCondition = $sectionIds?" AND hrla.sectionID IN (".$sectionIds.")":""; | |
| $sql = "SELECT | |
| sta.staffID, sta.staffAccount, sta.staffName, sta.deptID, dept.deptName, dept.departmentDesc, satt.punchDate, satt.punchIn, satt.punchOut, satt.actualpunchIn, satt.actualpunchOut, hlt.leaveID as leaveTypeId, hlt.leaveName as leaveTypeName, hlt.leaveDesc as leaveTypeDescription, hrla.applicationID, hrla.startDate, hrla.endDate, hrla.appliedDate, sta.dateOfJoining, | |
| CASE | |
| WHEN hrla.rejected = 1 THEN 'REJECTED' | |
| WHEN hrla.approved = 1 THEN 'APPROVED' | |
| WHEN hrla.confirmed = 1 THEN 'CONFIRMED' | |
| ELSE 'PENDING' | |
| END AS leaveStatus, | |
| hld.daytypeID, hld.daytypeName, hld.daytypeDesc, hld.noofleaves,hld.dayspan,hld.duration_of_leave_in_minutes | |
| FROM | |
| staffaccounts sta | |
| INNER JOIN department dept on dept.deptID = sta.deptID | |
| LEFT JOIN staff_attendance satt ON satt.staffAccount = sta.staffAccount | |
| LEFT JOIN hr_leave_applications hrla ON sta.staffID = hrla.staffID AND satt.punchDate BETWEEN hrla.startDate AND hrla.endDate | |
| LEFT JOIN hr_leavetypes hlt ON hlt.leaveID = hrla.leaveID | |
| LEFT JOIN hr_leave_daytype hld ON hld.daytypeID = hrla.daytypeID | |
| LEFT JOIN hr_sections sec ON sec.sectionID = hrla.sectionID $sectionCondition | |
| WHERE 1=1"; | |
| $sql .= (!empty($request->staffIds))?" AND sta.staffID IN ($request->staffIds)":""; | |
| $sql .= (!empty($request->staffID))&& empty($request->staffIds)?" AND sta.staffID = $request->staffID ":""; | |
| $sql .= (!empty($request->startDate))?" AND satt.punchDate >= '$request->startDate'":""; | |
| $sql .= (!empty($request->endDate))?" AND satt.punchDate <= '$request->endDate'":""; | |
| $sql .= (!empty($request->deptIds))?" AND sta.deptID IN ($request->deptIds) ":""; | |
| $sql .= (!$request->resignedStaffs)?" AND sta.isResigned = 0 ":""; | |
| $sql .= (!empty($request->sortBy))?" order by $request->sortBy $request->sortOrder":""; | |
| try | |
| { | |
| $staffList = $this->executeQueryForList($sql, $this->mapper[StaffLeaveServiceMapper::GET__STAFF_LEAVE_REPORT_FOR_A_GIVEN_DATE_RANGE]); | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $staffList; | |
| } | |
| /** | |
| * get All Recommendation staffs by designationID and sectionID | |
| * if there is no Recommendation staffs then it will return staffs those who can approve the leave | |
| * | |
| * @param $designationID | |
| * @param $sectionID | |
| * | |
| * @return $staffList | |
| */ | |
| public function getRecomendedOrApprovelStaffsByDesignationIDAndSectionID($designationID,$sectionID,$getRecommendedStaffs) | |
| { | |
| $designationID = $this->realEscapeString($designationID); | |
| $sectionID = $this->realEscapeString($sectionID); | |
| $sql = "select lv.staffID, lv.confirm, lv.approve, sa.staffName, sa.staffEmail, sa.staffPhone from hr_leave_confirm_approve lv INNER JOIN staffaccounts sa ON sa.staffID = lv.staffID where lv.designationID=\"$designationID\" and lv.sectionID=\"$sectionID\" "; | |
| try { | |
| if($getRecommendedStaffs) | |
| { | |
| $condition = " AND lv.confirm = 1"; | |
| $staffList = $this->executeQueryForList($sql.$condition); | |
| } | |
| if(!$staffList) | |
| { | |
| $condition = " AND lv.approve = 1"; | |
| $staffList = $this->executeQueryForList($sql.$condition); | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $staffList; | |
| } | |
| /** | |
| * get shift change request by shiftchange request ID | |
| * | |
| * @param [type] $shiftChangeRequestId | |
| * @return $shiftChangeDetails | |
| */ | |
| public function getShiftChangeRequestDetailsByID($shiftChangeRequestId) | |
| { | |
| $shiftChangeRequestId = $this->realEscapeString($shiftChangeRequestId); | |
| $sql = "select id, staffID, punchDate, punchIn, punchOut, actualpunchIn, actualpunchOut, punchtime_shiftchange, appliedDate, confirmed, conf_rejected, approved, rejected from staffpunchtime_shiftchange_updaterequest where id = '$shiftChangeRequestId';"; | |
| try { | |
| $shiftChangeDetails = $this->executeQueryForObject($sql); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $shiftChangeDetails; | |
| } | |
| public function getAllStaffLeaveTypes($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| if(in_array('all', $request->staffIds)){ | |
| $request->staffIds = []; | |
| } | |
| if(!empty($request->staffIds)){ | |
| $request->staffIds = implode(',', $request->staffIds); | |
| } | |
| $sql = "select distinct hr.leaveID, hrlt.leaveName, hrlt.leaveDesc from hr_leave_applications hr inner join hr_leavetypes hrlt on hrlt.leaveID = hr.leaveID"; | |
| if(!empty($request->staffIds)){ | |
| $sql .= " AND hr.staffID IN ($request->staffIds)"; | |
| } | |
| if(!empty($request->startDate)){ | |
| $sql .= " AND hr.startDate >= '$request->startDate'"; | |
| } | |
| if(!empty($request->endDate)){ | |
| $sql .= " AND hr.endDate <= '$request->endDate'"; | |
| } | |
| try { | |
| return $this->executeQueryForList($sql); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Used in staff leave report | |
| * for calculating staffs late time | |
| */ | |
| public function checkGrace($attendance, $settings, $staffProperty) | |
| { | |
| global $graceTime; | |
| $grace = 0; | |
| $lateComeInMinutes = 0; | |
| $earlyGoingInMinutes = 0; | |
| foreach ($attendance->appliedLeave as $appliedLeave) | |
| { | |
| $case = $appliedLeave->dayType->dayspan; | |
| if (in_array($appliedLeave->leaveStatus, $settings->leaveTypesToBeConsidered)) | |
| { | |
| $staffProperty->isleave = true; | |
| $staffProperty->numberOfLeave += $appliedLeave->dayType->numberOfLeaves < .5 ? 0 : $appliedLeave->dayType->numberOfLeaves; | |
| switch ($case) | |
| { | |
| case "1": | |
| if($appliedLeave->dayType->numberOfLeaves < .5) | |
| { | |
| //$staffProperty->LeaveArray[]=$appliedLeave->dayType->name; | |
| $staffProperty->isLatecome = true; | |
| //$lateComeInMinutes += $appliedLeave->dayType->timeSpan; | |
| $isLateCome = new stdClass; | |
| $isLateCome->LeaveArray[] = $appliedLeave->dayType->name; | |
| $isLateCome->smallLeaveCount += $appliedLeave->dayType->numberOfLeaves; | |
| $isLateCome->lateComeInMinutes += $appliedLeave->dayType->timeSpan; | |
| $isLateCome->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| $isLateComeArray[] = $isLateCome; | |
| //$isLateCome->smallLeaveCount += $appliedLeave->dayType->numberOfLeaves; | |
| } | |
| else | |
| { | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| $staffProperty->LeaveArray[]= $appliedLeave->leaveType->name . " " . $appliedLeave->dayType->name; | |
| $staffProperty->fornoonLeave = true; | |
| } | |
| break; | |
| case "2": | |
| if($appliedLeave->dayType->numberOfLeaves < .5) | |
| { | |
| //$staffProperty->LeaveArray[]=$appliedLeave->dayType->name; | |
| $staffProperty->isEarlyGoing = true; | |
| //$staffProperty->smallLeaveCount += $appliedLeave->dayType->numberOfLeaves; | |
| $isEarlyGoing = new stdClass; | |
| $isEarlyGoing->earlyGoingInMinutes = $appliedLeave->dayType->timeSpan; | |
| $isEarlyGoing->LeaveArray[] = $appliedLeave->dayType->name; | |
| $isEarlyGoing->smallLeaveCount += $appliedLeave->dayType->numberOfLeaves; | |
| $isEarlyGoing->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| $isEarlyGoingArray[] = $isEarlyGoing; | |
| } | |
| else | |
| { | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| $staffProperty->LeaveArray[]= $appliedLeave->leaveType->name . " " . $appliedLeave->dayType->name; | |
| $staffProperty->afternoonLeave = true; | |
| } | |
| break; | |
| case "3": | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| $staffProperty->LeaveArray[]= $appliedLeave->leaveType->name . " " . $appliedLeave->dayType->name; | |
| $staffProperty->isFulldayLeave = true; | |
| break; | |
| } | |
| } | |
| } | |
| if($staffProperty->isFulldayLeave) | |
| { | |
| $staffProperty->graceNow = 0; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| return $staffProperty; | |
| } | |
| $punchInTime = date_format(new DateTime($attendance->inTime), 'H:i:s'); | |
| $punchOutTime = date_format(new DateTime($attendance->outTime), 'H:i:s'); | |
| if($settings->ActualHalfTime) | |
| { | |
| $ActualHalfTime = date_format(new DateTime($settings->ActualHalfTime), 'H:i:s'); | |
| } | |
| else | |
| { | |
| $actualWorkingHalfTimeInMinutes = ((strtotime($attendance->actualPunchOut) - strtotime($attendance->actualPunchIn))/60)/2; | |
| $ActualHalfTime = date('H:i:s',strtotime('+'.$actualWorkingHalfTimeInMinutes.' minutes',strtotime($attendance->actualPunchIn))); | |
| } | |
| $startDuration = date_format(new DateTime($attendance->actualPunchIn), 'H:i:s'); | |
| $stopDuration = date_format(new DateTime($attendance->actualPunchOut), 'H:i:s'); | |
| if($staffProperty->isleave) | |
| { | |
| if ($staffProperty->fornoonLeave) | |
| { | |
| $startDuration = $ActualHalfTime; | |
| if ($settings->graceTimeInMinutes && $staffProperty->isEarlyGoing) | |
| { | |
| $startDuration = date("H:i:s",strtotime("+".$settings->graceTimeInMinutes." minute ", strtotime($startDuration))); | |
| if(strtotime($startDuration) < strtotime($punchInTime)) | |
| { | |
| $staffProperty->exceedDailyGraceTime = true; | |
| } | |
| } | |
| } | |
| if ($staffProperty->afternoonLeave) | |
| { | |
| $stopDuration = $ActualHalfTime; | |
| if ($settings->graceTimeInMinutes && $staffProperty->isLatecome) | |
| { | |
| $stopDuration = date("H:i:s",strtotime("-".$settings->graceTimeInMinutes." minute ", strtotime($stopDuration))); | |
| if(strtotime($stopDuration) > strtotime($punchOutTime)) | |
| { | |
| $staffProperty->exceedDailyGraceTime = true; | |
| } | |
| } | |
| } | |
| if($staffProperty->holiday && !$settings->considerHolidayAsFirstPriority) | |
| { | |
| if($staffProperty->fullDayHoliday) | |
| { | |
| $punchInTime = $startDuration; | |
| $punchOutTime = $stopDuration; | |
| } | |
| else | |
| { | |
| if($staffProperty->fornoonHoliday) | |
| { | |
| $startDuration = $ActualHalfTime; | |
| } | |
| elseif($staffProperty->afternoonHoliday) | |
| { | |
| $stopDuration = $ActualHalfTime; | |
| } | |
| } | |
| } | |
| if ($staffProperty->isLatecome) | |
| { | |
| if($settings->considerLeaveApplyDuration) | |
| { | |
| $checkLatecome = false; | |
| foreach($isLateComeArray as $LateComeLeave) | |
| { | |
| //get diffrence between actual punch in and punch in | |
| $validLeave = $this->validateLeave($startDuration,$punchInTime,$settings,1,0); | |
| if($validLeave) | |
| { | |
| $checkLatecome = true; | |
| foreach($LateComeLeave->LeaveArray as $leaveArray) | |
| { | |
| $staffProperty->LeaveArray[]= $leaveArray; | |
| } | |
| $validLeave = false; | |
| $lateComeInMinutes = $LateComeLeave->lateComeInMinutes; | |
| $startDuration = date("H:i", strtotime('+' . $lateComeInMinutes . ' minutes', strtotime($startDuration))); | |
| foreach($LateComeLeave->singleDayLeaveAndLeaveTypes as $key=>$singleDayLeaveAndLeaveTypes) | |
| { | |
| $staffProperty->smallLeaveCount +=$singleDayLeaveAndLeaveTypes; | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$key] = $staffProperty->singleDayLeaveAndLeaveTypes[$key]?$staffProperty->singleDayLeaveAndLeaveTypes[$key]+$singleDayLeaveAndLeaveTypes:$singleDayLeaveAndLeaveTypes; | |
| } | |
| } | |
| else | |
| { | |
| $startDuration = date("H:i", strtotime('+' . $LateComeLeave->lateComeInMinutes . ' minutes', strtotime($startDuration))); | |
| } | |
| } | |
| } | |
| else | |
| { | |
| $checkLatecome = true; | |
| foreach($LateComeLeave->LeaveArray as $leaveArray) | |
| { | |
| $staffProperty->LeaveArray[]= $leaveArray; | |
| } | |
| $validLeave = false; | |
| $lateComeInMinutes = $LateComeLeave->lateComeInMinutes; | |
| $startDuration = date("H:i", strtotime('+' . $lateComeInMinutes . ' minutes', strtotime($startDuration))); | |
| foreach($LateComeLeave->singleDayLeaveAndLeaveTypes as $key=>$singleDayLeaveAndLeaveTypes) | |
| { | |
| $staffProperty->smallLeaveCount +=$singleDayLeaveAndLeaveTypes; | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$key] = $staffProperty->singleDayLeaveAndLeaveTypes[$key]?$staffProperty->singleDayLeaveAndLeaveTypes[$key]+$singleDayLeaveAndLeaveTypes:$singleDayLeaveAndLeaveTypes; | |
| } | |
| } | |
| $staffProperty->isLatecome = $checkLatecome?true:false; | |
| } | |
| if ($staffProperty->isEarlyGoing) | |
| { | |
| if($settings->considerLeaveApplyDuration) | |
| { | |
| $checkLatecome = false; | |
| foreach($isEarlyGoingArray as $isEarlyGoing) | |
| { | |
| $validLeave = $this->validateLeave($stopDuration,$punchOutTime,$settings,0,1); | |
| if($validLeave) | |
| { | |
| $checkLatecome = true; | |
| foreach($isEarlyGoing->LeaveArray as $leaveArray) | |
| { | |
| $staffProperty->LeaveArray[]= $leaveArray; | |
| } | |
| $validLeave = true; | |
| $earlyGoingInMinutes = $isEarlyGoing->earlyGoingInMinutes; | |
| $stopDuration = date("H:i", strtotime('-' . $earlyGoingInMinutes . ' minutes', strtotime($stopDuration))); | |
| foreach($isEarlyGoing->singleDayLeaveAndLeaveTypes as $key=>$singleDayLeaveAndLeaveTypes) | |
| { | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$key] = $staffProperty->singleDayLeaveAndLeaveTypes[$key]?$staffProperty->singleDayLeaveAndLeaveTypes[$key]+$singleDayLeaveAndLeaveTypes:$singleDayLeaveAndLeaveTypes; | |
| $staffProperty->smallLeaveCount +=$singleDayLeaveAndLeaveTypes; | |
| } | |
| } | |
| else | |
| { | |
| $stopDuration = date("H:i", strtotime('-' . $isEarlyGoing->earlyGoingInMinutes . ' minutes', strtotime($stopDuration))); | |
| } | |
| } | |
| } | |
| else | |
| { | |
| $checkLatecome = true; | |
| foreach($isEarlyGoing->LeaveArray as $leaveArray) | |
| { | |
| $staffProperty->LeaveArray[]= $leaveArray; | |
| } | |
| $validLeave = true; | |
| $earlyGoingInMinutes = $isEarlyGoing->earlyGoingInMinutes; | |
| $stopDuration = date("H:i", strtotime('-' . $earlyGoingInMinutes . ' minutes', strtotime($stopDuration))); | |
| foreach($isEarlyGoing->singleDayLeaveAndLeaveTypes as $key=>$singleDayLeaveAndLeaveTypes) | |
| { | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$key] = $staffProperty->singleDayLeaveAndLeaveTypes[$key]?$staffProperty->singleDayLeaveAndLeaveTypes[$key]+$singleDayLeaveAndLeaveTypes:$singleDayLeaveAndLeaveTypes; | |
| $staffProperty->smallLeaveCount +=$singleDayLeaveAndLeaveTypes; | |
| } | |
| } | |
| $staffProperty->isEarlyGoing = $checkLatecome?true:false; | |
| } | |
| if($staffProperty->fornoonLeave || $staffProperty->isEarlyGoing || $staffProperty->isLatecome || $staffProperty->afternoonLeave || $staffProperty->isFulldayLeave ) | |
| { | |
| $staffProperty->isleave = true; | |
| } | |
| else | |
| { | |
| $staffProperty->isleave = false; | |
| } | |
| if ($punchInTime <= $startDuration && $punchOutTime >= $stopDuration) | |
| { | |
| // he is in time | |
| $staffProperty->graceNow = 0; | |
| $staffProperty->ispresent =true; | |
| $staffProperty->inTime = true; | |
| if($staffProperty->numberOfLeave >= .5 && $staffProperty->numberOfLeave < 1) | |
| { | |
| //to do | |
| $staffProperty->isHalfdayLeave = true; | |
| } | |
| elseif($staffProperty->numberOfLeave >= 1) | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| $staffProperty->notInTime = true; | |
| if($staffProperty->exceedDailyGraceTime) | |
| { | |
| $staffProperty->graceNow = 0; | |
| } | |
| else | |
| { | |
| $grace += $this->graceCalculator1($punchInTime, $startDuration); | |
| $grace += $this->graceCalculator2($punchOutTime, $stopDuration); | |
| $staffProperty->graceNow = $grace; | |
| } | |
| if($staffProperty->notInTime && $staffProperty->numberOfLeave > 0) | |
| { | |
| $grace = 0; | |
| } | |
| $totalGraceTime = empty($graceTime[$attendance->staffId]) ? $grace : ($graceTime[$attendance->staffId] + $grace); | |
| $graceTime[$attendance->staffId] = $totalGraceTime; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| if ($graceTime[$attendance->staffId] > $settings->graceTimePerMonthInMin) | |
| { | |
| //he is not in time | |
| if($settings->useLOPThresholdTime) | |
| { | |
| if($grace > $settings->LOPThersholdTime) | |
| { | |
| $staffProperty->exceedThersholdTime = true; | |
| } | |
| } | |
| $staffProperty->isHalfdayAbsent = true; | |
| $staffProperty->graceTimeExeeded = true; | |
| $staffProperty->ispresent = true; | |
| if($staffProperty->numberOfLeave >= .5 && $staffProperty->numberOfLeave < 1) | |
| { | |
| $staffProperty->isHalfdayLeave = true; | |
| } | |
| elseif($staffProperty->numberOfLeave >= 1) | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| } | |
| else | |
| { | |
| //he is in time | |
| if($staffProperty->numberOfLeave >= .5 && $staffProperty->numberOfLeave < 1) | |
| { | |
| $staffProperty->isHalfdayLeave = true; | |
| } | |
| elseif($staffProperty->numberOfLeave >= 1) | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| } | |
| } | |
| } | |
| else | |
| { | |
| $staffProperty->notInTime = true; | |
| $totalGraceTime = empty($graceTime[$attendance->staffId]) ? $grace : ($graceTime[$attendance->staffId] + $grace); | |
| $graceTime[$attendance->staffId] = $totalGraceTime; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| if ($graceTime[$attendance->staffId] > $settings->graceTimePerMonthInMin) | |
| { | |
| //grace time exeeded | |
| $staffProperty->graceTimeExeeded = true; | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| if($settings->useLOPThresholdTime) | |
| { | |
| $exeedTime = $this->getPunchTimeDifferenceInMinutes($attendance); | |
| if($exeedTime > $settings->LOPThersholdTime) | |
| { | |
| $staffProperty->exceedThersholdTime = true; | |
| } | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| // he is not in time but grace time not exeeded | |
| $staffProperty->ispresent = true; | |
| return $staffProperty; | |
| } | |
| } | |
| return $staffProperty; | |
| } | |
| public function returnApproveLeavesTakenByStaff($attendance, $settings, $staffProperty) | |
| { | |
| foreach ($attendance->appliedLeave as $appliedLeave) { | |
| if (in_array($appliedLeave->leaveStatus, $settings->leaveTypesToBeConsidered)) | |
| { | |
| $staffProperty->isleave = true; | |
| if($appliedLeave->dayType->numberOfLeaves < .5) | |
| { | |
| $haveLeave = false; | |
| if($settings->considerLeaveApplyDuration) | |
| { | |
| if($appliedLeave->dayType->dayspan == 1) | |
| { | |
| if($attendance->inTime != "00:00:00") | |
| $haveLeave = $this->validateLeave ($attendance->actualPunchIn,$attendance->inTime,$settings,1,0); | |
| } | |
| else | |
| { | |
| if($attendance->outTime != "00:00:00") | |
| $haveLeave = $this->validateLeave ($attendance->actualPunchOut,$attendance->outTime,$settings,0,1); | |
| } | |
| } | |
| else | |
| { | |
| $haveLeave = true; | |
| } | |
| if($haveLeave) | |
| { | |
| $haveLeave = false; | |
| $staffProperty->LeaveArray[]=$appliedLeave->dayType->name; | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| if($appliedLeave->dayType->dayspan == 1) | |
| { | |
| $staffProperty->isLatecome = true; | |
| } | |
| else | |
| { | |
| $staffProperty->isEarlyGoing = true; | |
| } | |
| $staffProperty->smallLeaveCount += $appliedLeave->dayType->numberOfLeaves; | |
| } | |
| } | |
| elseif($appliedLeave->dayType->numberOfLeaves >= .5 && $appliedLeave->dayType->numberOfLeaves < 1) | |
| { | |
| if($appliedLeave->dayType->dayspan == 1) | |
| { | |
| $staffProperty->fornoonLeave = true; | |
| } | |
| else | |
| { | |
| $staffProperty->afternoonLeave = true; | |
| } | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| $staffProperty->numberOfLeave += $appliedLeave->dayType->numberOfLeaves; | |
| $staffProperty->LeaveArray[]=$appliedLeave->leaveType->name . " " . $appliedLeave->dayType->name; | |
| } | |
| elseif($appliedLeave->dayType->numberOfLeaves >= 1) | |
| { | |
| $staffProperty->singleDayLeaveAndLeaveTypes[$appliedLeave->leaveType->name] = $appliedLeave->dayType->numberOfLeaves; | |
| $staffProperty->isFulldayLeave = true; | |
| $staffProperty->LeaveArray[]=$appliedLeave->leaveType->name . " " . $appliedLeave->dayType->name; | |
| $staffProperty->isFulldayLeave = true; | |
| $staffProperty->numberOfLeave += $appliedLeave->dayType->numberOfLeaves; | |
| } | |
| } | |
| } | |
| if($staffProperty->numberOfLeave >= 1) | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| if(!$staffProperty->isleave && !$staffProperty->ispresent) | |
| { | |
| $staffProperty->isAbsent = true; | |
| } | |
| return $staffProperty; | |
| } | |
| public function heOrShePresent($attendance, $settings, $staffProperty, $holiday) | |
| { | |
| global $graceTime; | |
| //$staffId = $attendance->staffId; | |
| //no punch in & no punch out | |
| if (trim($attendance->inTime) == "00:00:00" && trim($attendance->outTime) == "00:00:00") | |
| { | |
| if($holiday && $attendance->actualPunchOut == "00:00:00" && $attendance->actualPunchIn == "00:00:00" ) | |
| { | |
| return $staffProperty; | |
| } | |
| $staffProperty->isAbsent = true; | |
| if($attendance->appliedLeave) | |
| { | |
| $staffProperty = $this->returnApproveLeavesTakenByStaff($attendance, $settings, $staffProperty); | |
| if((float)$staffProperty->numberOfLeave >= .5) | |
| { | |
| if((float)$staffProperty->numberOfLeave >= .50 && (float)$staffProperty->numberOfLeave < 1 ) | |
| { | |
| $staffProperty->isHalfdayAbsent = true; | |
| if($staffProperty->fornoonLeave) | |
| $staffProperty->isAfternoonAbsent = true; | |
| else | |
| $staffProperty->isFornoonAbsent = true; | |
| } | |
| else | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| } | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| $staffProperty->ispresent = true; | |
| $punchInTime = date_format(new DateTime($attendance->inTime), 'H:i:s'); | |
| $actualPunchInTime = date_format(new DateTime($attendance->actualPunchIn), 'H:i:s'); | |
| $punchOutTime = date_format(new DateTime($attendance->outTime), 'H:i:s'); | |
| $actualPunchOutTime = date_format(new DateTime($attendance->actualPunchOut), 'H:i:s'); | |
| $staffProperty->punchOutDone = trim($attendance->outTime) == "00:00:00" || $attendance->outTime == null ? false : true ; | |
| $staffProperty->punchInDone = trim($attendance->inTime) == "00:00:00" || $attendance->inTime == null ? false : true ; | |
| //$ActualHalfTime = date_format(new DateTime($settings->ActualHalfTime), 'H:i:s'); | |
| $grace = 0; | |
| // $userGraceTime = $graceTime ? $graceTime [$attendance->staffId]:""; | |
| // $lateCome = strtotime($attendance->inTime) - strtotime($attendance->actualPunchIn) > 0 ? strtotime($attendance->inTime) - strtotime($attendance->actualPunchIn) : 0; | |
| // $earlyGoing = strtotime($attendance->actualPunchOut) - strtotime($attendance->outTime) > 0 ? strtotime($attendance->actualPunchOut) - strtotime($attendance->outTime) : 0; | |
| // //to_minutes | |
| // $lateCome = $lateCome ? $lateCome/60 : 0; | |
| // $earlyGoing =$earlyGoing ? $earlyGoing/60 : 0; | |
| // $lateMinutes = $lateCome + $earlyGoing; | |
| if ( !$staffProperty->punchOutDone || !$staffProperty->punchInDone ) | |
| { | |
| // case punchouttime or punchintime | |
| $staffProperty->missPunch = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| $staffProperty->punchOut = $punchOutTime; | |
| $staffProperty->punchIn = $punchInTime; | |
| $staffProperty = $this->returnApproveLeavesTakenByStaff($attendance, $settings, $staffProperty); | |
| $numberOfLeaves = (float)$staffProperty->numberOfLeave; | |
| if($numberOfLeaves >= .5) | |
| { | |
| if($numberOfLeaves >= .5 && $numberOfLeaves < 1 ) | |
| { | |
| $staffProperty->isHalfdayLeave = true; | |
| } | |
| else | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| } | |
| if ($staffProperty->punchOutDone) | |
| { | |
| $staffProperty->graceNow += 0; | |
| } | |
| elseif($staffProperty->punchInDone) | |
| { | |
| $staffProperty->graceNow += 0; | |
| } | |
| $totalGraceTime = empty($graceTime[$attendance->staffId]) ? $staffProperty->graceNow : ($graceTime[$attendance->staffId] + $staffProperty->graceNow); | |
| $graceTime[$attendance->staffId] = $totalGraceTime; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| if($staffProperty->graceNow && $graceTime[$attendance->staffId] > $settings->graceTimePerMonthInMin) | |
| { | |
| $staffProperty->graceTimeExeeded = true; | |
| } | |
| return $staffProperty; | |
| } | |
| // have punchin and punchout | |
| // Checking garce time | |
| $staffProperty->punchOutDone = true; | |
| $staffProperty->punchInDone = true; | |
| $staffProperty->punchOut = $punchOutTime; | |
| $staffProperty->punchIn = $punchInTime; | |
| if($staffProperty->holiday && !$settings->considerHolidayAsFirstPriority) | |
| { | |
| if($staffProperty->fullDayHoliday) | |
| { | |
| $punchInTime = $actualPunchInTime; | |
| $punchOutTime = $actualPunchOutTime; | |
| } | |
| else | |
| { | |
| $actualWorkingHalfTimeInMinutes = ((strtotime($attendance->actualPunchOut) - strtotime($attendance->actualPunchIn))/60)/2; | |
| $ActualHalfTime = date('H:i:s',strtotime('+'.$actualWorkingHalfTimeInMinutes.' minutes',strtotime($attendance->actualPunchIn))); | |
| if ($staffProperty->fornoonHoliday) | |
| { | |
| $actualPunchInTime = $ActualHalfTime; | |
| } | |
| else | |
| { | |
| $actualPunchOutTime = $ActualHalfTime; | |
| } | |
| } | |
| } | |
| $grace += $this->graceCalculator1($punchInTime, $actualPunchInTime); | |
| $grace += $this->graceCalculator2($punchOutTime, $actualPunchOutTime); | |
| $staffProperty->ispresent = true; | |
| if($punchInTime <= $actualPunchInTime && $punchOutTime >= $actualPunchOutTime) | |
| { | |
| //he is in time | |
| $staffProperty->inTime = true; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| if(!$attendance->appliedLeave) | |
| { | |
| //did't have any leaves | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| $staffProperty = $this->returnApproveLeavesTakenByStaff($attendance, $settings, $staffProperty); | |
| if ($staffProperty->isleave) | |
| { | |
| $numberOfLeaves = (float)$staffProperty->numberOfLeave; | |
| if($numberOfLeaves >= .5) | |
| { | |
| if($numberOfLeaves >= .5 && $numberOfLeaves < 1 ) | |
| { | |
| $staffProperty->isHalfdayLeave = true; | |
| } | |
| else | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| } | |
| } | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| //not in time | |
| $staffProperty->notInTime = true; | |
| if (!$attendance->appliedLeave) | |
| { | |
| $maxGraceLimit = (int)$settings->graceTimePerMonthInMin; | |
| $perdayGrace = $grace; | |
| if($perdayGrace < $maxGraceLimit) | |
| { | |
| $staffProperty->graceNow = $grace; | |
| $totalGraceTime = empty($graceTime[$attendance->staffId]) ? $grace : ($graceTime[$attendance->staffId] + $grace); | |
| if ($totalGraceTime > $maxGraceLimit) | |
| { | |
| //grace time exeeded | |
| $staffProperty->graceTimeExeeded = true; | |
| //custom rule while grace time exceeding case is written here | |
| $customRule = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT, SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT)); | |
| if($customRule->customLOP) | |
| { | |
| if($customRule->lopType == "FULLDAY") | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| else if($customRule->lopType == "HALFDAY"){ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| } | |
| else{ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| if($settings->useLOPThresholdTime) | |
| { | |
| $exeedTime = $this->getPunchTimeDifferenceInMinutes($attendance); | |
| if($exeedTime < $settings->LOPThersholdTime) | |
| { | |
| $staffProperty->exceedThersholdTime = true; | |
| } | |
| else | |
| { | |
| $graceTime[$attendance->staffId] = $totalGraceTime; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| } | |
| else | |
| { | |
| //global grace time updated only if its lesser than the threshold | |
| if($totalGraceTime <= $maxGraceLimit) | |
| { | |
| $graceTime[$attendance->staffId] = $totalGraceTime; | |
| } | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| // he is not in time but grace time not exeeded | |
| $staffProperty->ispresent = true; | |
| $graceTime[$attendance->staffId] += $grace; | |
| return $staffProperty; | |
| } | |
| }else | |
| { | |
| if($maxGraceLimit > $grace) | |
| { | |
| $staffProperty->graceNow = $grace; | |
| } | |
| $totalGraceTime = $grace; | |
| if ($totalGraceTime > $maxGraceLimit) | |
| { | |
| //grace time exeeded | |
| $staffProperty->graceTimeExeeded = true; | |
| //custom rule while grace time exceeding case is written here | |
| $customRule = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT, SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT)); | |
| if($customRule->customLOP) | |
| { | |
| if($customRule->lopType == "FULLDAY") | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| else if($customRule->lopType == "HALFDAY"){ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| } | |
| else{ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| if($settings->useLOPThresholdTime) | |
| { | |
| $exeedTime = $this->getPunchTimeDifferenceInMinutes($attendance); | |
| if($exeedTime < $settings->LOPThersholdTime) | |
| { | |
| $staffProperty->exceedThersholdTime = true; | |
| } | |
| else | |
| { | |
| $graceTime[$attendance->staffId] += 0; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| } | |
| else | |
| { | |
| $graceTime[$attendance->staffId] += 0; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| // he is not in time but grace time not exeeded | |
| $staffProperty->ispresent = true; | |
| $graceTime[$attendance->staffId] += $grace; | |
| return $staffProperty; | |
| } | |
| } | |
| } | |
| elseif($attendance->appliedLeave[0]->leaveStatus != "APPROVED") | |
| { | |
| $maxGraceLimit = (int)$settings->graceTimePerMonthInMin; | |
| $perdayGrace = $grace; | |
| if($perdayGrace < $maxGraceLimit) | |
| { | |
| $staffProperty->graceNow = $grace; | |
| $totalGraceTime = empty($graceTime[$attendance->staffId]) ? $grace : ($graceTime[$attendance->staffId] + $grace); | |
| if ($totalGraceTime > $maxGraceLimit) | |
| { | |
| //grace time exeeded | |
| $staffProperty->graceTimeExeeded = true; | |
| //custom rule while grace time exceeding case is written here | |
| $customRule = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT, SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT)); | |
| if($customRule->customLOP) | |
| { | |
| if($customRule->lopType == "FULLDAY") | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| else if($customRule->lopType == "HALFDAY"){ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| } | |
| else{ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| if($settings->useLOPThresholdTime) | |
| { | |
| $exeedTime = $this->getPunchTimeDifferenceInMinutes($attendance); | |
| if($exeedTime < $settings->LOPThersholdTime) | |
| { | |
| $staffProperty->exceedThersholdTime = true; | |
| } | |
| else | |
| { | |
| $graceTime[$attendance->staffId] = $totalGraceTime; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| } | |
| else | |
| { | |
| $graceTime[$attendance->staffId] = $totalGraceTime; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| // he is not in time but grace time not exeeded | |
| $staffProperty->ispresent = true; | |
| $graceTime[$attendance->staffId] += $grace; | |
| return $staffProperty; | |
| } | |
| }else | |
| { | |
| $staffProperty->graceNow = $grace > $maxGraceLimit ? 0 : $grace; | |
| $totalGraceTime = $grace; | |
| if ($totalGraceTime > $maxGraceLimit) | |
| { | |
| //grace time exeeded | |
| $staffProperty->graceTimeExeeded = true; | |
| //custom rule while grace time exceeding case is written here | |
| $customRule = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT, SettingsConstants::GRACE_TIME_EXCEEDING_MANAGEMENT)); | |
| if($customRule->customLOP) | |
| { | |
| if($customRule->lopType == "FULLDAY") | |
| { | |
| $staffProperty->isFulldayLeave = true; | |
| } | |
| else if($customRule->lopType == "HALFDAY"){ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| } | |
| else{ | |
| $staffProperty->isHalfDayPresent = true; | |
| $staffProperty->isHalfdayAbsent = true; | |
| } | |
| if($settings->useLOPThresholdTime) | |
| { | |
| $exeedTime = $this->getPunchTimeDifferenceInMinutes($attendance); | |
| if($exeedTime < $settings->LOPThersholdTime) | |
| { | |
| $staffProperty->exceedThersholdTime = true; | |
| } | |
| else | |
| { | |
| $graceTime[$attendance->staffId] += 0; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| } | |
| else | |
| { | |
| $graceTime[$attendance->staffId] += 0; | |
| $staffProperty->totalGrace = $graceTime[$attendance->staffId]; | |
| } | |
| return $staffProperty; | |
| } | |
| else | |
| { | |
| // he is not in time but grace time not exeeded | |
| $staffProperty->ispresent = true; | |
| $graceTime[$attendance->staffId] += $grace; | |
| return $staffProperty; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| $staffProperty = StaffLeaveService::getInstance()->checkGrace($attendance, $settings, $staffProperty); | |
| return $staffProperty; | |
| } | |
| } | |
| } | |
| } | |
| public function getStaffDayDetails($attendance,$settings,$staffProperty, $holiday = false) | |
| { | |
| global $graceTime; | |
| $staffProperty = $this->heOrShePresent($attendance, $settings, $staffProperty, $holiday); | |
| $checkHoliday = implode(" + ",$staffProperty->LeaveArray); | |
| //if($holiday && $checkHoliday == SettingsConstents::HOLIDAY && $attendance->actualPunchIn == '00:00:00' && $attendance->actualPunchOut == '00:00:00') | |
| if($holiday && $checkHoliday == SettingsConstents::HOLIDAY && !$staffProperty->ispresent) | |
| { | |
| return $staffProperty; | |
| } | |
| elseif ($staffProperty->isAbsent && !$staffProperty->ispresent) | |
| { | |
| $isAbsent = false; | |
| if($staffProperty->isHalfdayAbsent) | |
| { | |
| if($staffProperty->holiday && !$settings->considerHolidayAsFirstPriority) | |
| { | |
| if(!$staffProperty->fullDayHoliday) | |
| { | |
| if($staffProperty->fornoonHoliday && $staffProperty->isAfternoonAbsent) | |
| { | |
| $isAbsent = true; | |
| } | |
| elseif($staffProperty->afternoonHoliday && $staffProperty->isFornoonAbsent) | |
| { | |
| $isAbsent = true; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| $isAbsent = true; | |
| } | |
| if($isAbsent) | |
| { | |
| //is absent but he have half day leave | |
| if($staffProperty->isAfternoonAbsent) | |
| { | |
| $staffProperty->LeaveArray[]="1/2".SettingsConstents::ABSENT.SettingsConstents::AN; | |
| } | |
| else{ | |
| $staffProperty->LeaveArray[]="1/2".SettingsConstents::ABSENT.SettingsConstents::FN; | |
| } | |
| //if he have approved late come or early going leaves then we add it to leaveCount | |
| $staffProperty->leaveCount = (float)$staffProperty->numberOfLeave + (float)$staffProperty->smallLeaveCount; | |
| $staffProperty->absentCount = .5; | |
| } | |
| } | |
| elseif($staffProperty->isFulldayLeave) | |
| { | |
| //is absent, and he have approved full day leave | |
| $staffProperty->leaveCount = 1 + (float)$staffProperty->smallLeaveCount; | |
| } | |
| else | |
| { | |
| //is absent, and he also did't have any approved leave or may be he have approved late come or early going leaves | |
| $staffProperty->LeaveArray[]=SettingsConstents::ABSENT; | |
| //if he have approved late come or early going leaves then we add it to leaveCount | |
| $staffProperty->leaveCount = (float)$staffProperty->smallLeaveCount; | |
| $staffProperty->absentCount = 1 - $staffProperty->leaveCount; | |
| } | |
| return $staffProperty; | |
| } | |
| elseif ($staffProperty->missPunch && $staffProperty->ispresent) | |
| { | |
| //miss punching | |
| if($staffProperty->isleave && $staffProperty->isHalfdayLeave) | |
| { | |
| //and he have leave | |
| $staffProperty->leaveCount = (float)$staffProperty->numberOfLeave; | |
| $staffProperty->absentCount = .5; | |
| if($staffProperty->punchOutDone && !$staffProperty->punchInDone) | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_IN_MISS.")"; | |
| } | |
| elseif(!$staffProperty->punchOutDone && $staffProperty->punchInDone) | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_OUT_MISS.")"; | |
| } | |
| //if he have approved late come or early going leaves then we add it to leaveCount | |
| $staffProperty->leaveCount = (float)$staffProperty->numberOfLeave + (float)$staffProperty->smallLeaveCount; | |
| $staffProperty->presentCount = .5 - (float)$staffProperty->leaveCount; | |
| } | |
| elseif($staffProperty->isleave && $staffProperty->isFulldayLeave) | |
| { | |
| $staffProperty->leaveCount = 1 + (float)$staffProperty->smallLeaveCount; | |
| } | |
| else | |
| { | |
| if($staffProperty->punchOutDone && !$staffProperty->punchInDone) | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_IN_MISS.")"; | |
| } | |
| elseif(!$staffProperty->punchOutDone && $staffProperty->punchInDone) | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_OUT_MISS.")"; | |
| } | |
| //Grace time exeeded | |
| if($staffProperty->graceTimeExeeded) | |
| { | |
| $staffProperty->LeaveArray[]="1/2".SettingsConstents::ABSENT; | |
| $staffProperty->absentCount += .5; | |
| } | |
| else | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::PRESENT; | |
| $staffProperty->presentCount = .5 - (float)$staffProperty->leaveCount; | |
| } | |
| $staffProperty->absentCount += .5; | |
| //if he have approved late come or early going leaves then we add it to leaveCount | |
| $staffProperty->leaveCount = (float)$staffProperty->smallLeaveCount; | |
| } | |
| return $staffProperty; | |
| } | |
| elseif(!$staffProperty->missPunch && !$staffProperty->isAbsent && $staffProperty->ispresent) | |
| { | |
| if($staffProperty->inTime) | |
| { | |
| //he is in time | |
| if($staffProperty->isleave && $staffProperty->isHalfdayLeave) | |
| { | |
| if($staffProperty->exceedDailyGraceTime) | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::PRESENT; | |
| $staffProperty->absentCount = 1-(float)$staffProperty->leaveCount; | |
| } | |
| else | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::PRESENT; | |
| $staffProperty->presentCount = 1-(float)$staffProperty->leaveCount; | |
| } | |
| //if he have approved late come or early going leaves then we add it to leaveCount | |
| $staffProperty->leaveCount = (float)$staffProperty->numberOfLeave + (float)$staffProperty->smallLeaveCount; | |
| } | |
| elseif($staffProperty->isleave && $staffProperty->isFulldayLeave) | |
| { | |
| //if he have approved late come or early going leaves then we add it to leaveCount | |
| $staffProperty->leaveCount = 1 + (float)$staffProperty->smallLeaveCount; | |
| } | |
| else | |
| { | |
| $staffProperty->LeaveArray[] = SettingsConstents::PRESENT; | |
| //if he have approved late come or early going leaves then we add it to leaveCount | |
| $staffProperty->leaveCount = (float)$staffProperty->smallLeaveCount; | |
| $staffProperty->presentCount = 1 - (float)$staffProperty->leaveCount; | |
| } | |
| } | |
| elseif($staffProperty->notInTime) | |
| { | |
| //he is not in time | |
| //if threshold time is enabled and staff absent time exeed threshold time then he will be absent | |
| if($settings->useLOPThresholdTime && $staffProperty->exceedThersholdTime) | |
| { | |
| $staffProperty->LeaveArray[]=SettingsConstents::THRESHOLD_TIME_EXEED."(".SettingsConstents::ABSENT.")"; | |
| $staffProperty->absentCount = 1; | |
| } | |
| elseif($staffProperty->graceTimeExeeded) | |
| { | |
| //his late time exeeded | |
| if($staffProperty->isleave && $staffProperty->isHalfdayLeave) | |
| { | |
| $staffProperty->absentCount = .5; | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::CUTTING."(".SettingsConstents::TIME_EXEEDED.")"; | |
| $staffProperty->leaveCount = (float)$staffProperty->numberOfLeave + (float)$staffProperty->smallLeaveCount; | |
| $staffProperty->presentCount = .5 - (float)$staffProperty->leaveCount; | |
| } | |
| elseif($staffProperty->isleave && $staffProperty->isFulldayLeave) | |
| { | |
| $staffProperty->leaveCount = 1 + (float)$staffProperty->smallLeaveCount; | |
| } | |
| else | |
| { | |
| if( strtotime($attendance->inTime) <= strtotime($attendance->actualPunchIn)) | |
| { | |
| $perfectInPunch = true; | |
| } | |
| else{ | |
| $perfectInPunch = false; | |
| } | |
| if( strtotime($attendance->outTime) >= strtotime($attendance->actualPunchOut)) | |
| { | |
| $perfectOutPunch = true; | |
| } | |
| else{ | |
| $perfectOutPunch = false; | |
| } | |
| if(!$perfectInPunch) | |
| { | |
| $cuttingConstant = SettingsConstents::LATE_COMING; | |
| } | |
| if(!$perfectOutPunch) | |
| { | |
| if(!$perfectInPunch) | |
| { | |
| $cuttingConstant = SettingsConstents::FD; | |
| } | |
| else{ | |
| $cuttingConstant = SettingsConstents::EARLY_GOING; | |
| } | |
| } | |
| $staffProperty->absentCount = .5; | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::PRESENT; | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::CUTTING."(".$cuttingConstant.")"; | |
| $staffProperty->leaveCount = (float)$staffProperty->smallLeaveCount; | |
| $staffProperty->presentCount = .5 - $staffProperty->leaveCount; | |
| } | |
| } | |
| else | |
| { | |
| //late time not exeeded | |
| if($staffProperty->isleave && $staffProperty->isHalfdayLeave) | |
| { | |
| if($staffProperty->exceedDailyGraceTime) | |
| { | |
| $staffProperty->LeaveArray[]="1/2".SettingsConstents::ABSENT; | |
| $staffProperty->absentCount += .5; | |
| } | |
| else | |
| { | |
| $staffProperty->LeaveArray[] = "1/2".SettingsConstents::PRESENT; | |
| $staffProperty->presentCount = 1 - (float)$staffProperty->leaveCount; | |
| } | |
| $staffProperty->leaveCount = (float)$staffProperty->numberOfLeave + (float)$staffProperty->smallLeaveCount; | |
| } | |
| elseif($staffProperty->isleave && $staffProperty->isFulldayLeave) | |
| { | |
| $staffProperty->leaveCount = 1 + (float)$staffProperty->smallLeaveCount; | |
| } | |
| else | |
| { | |
| $staffProperty->LeaveArray[] = SettingsConstents::PRESENT; | |
| $staffProperty->leaveCount = (float)$staffProperty->smallLeaveCount; | |
| $staffProperty->presentCount = 1 - $staffProperty->leaveCount; | |
| } | |
| } | |
| } | |
| return $staffProperty; | |
| } | |
| } | |
| public function graceCalculator1($time1,$time2) | |
| { | |
| $grace = 0; | |
| if($time1 >= $time2) | |
| $grace = ((strtotime($time1) - strtotime($time2)) / 60) + $grace; | |
| return $grace; | |
| } | |
| public function graceCalculator2($time1,$time2) | |
| { | |
| $grace = 0; | |
| if($time1 <= $time2) | |
| $grace = ((strtotime($time2) - strtotime($time1)) / 60) + $grace; | |
| return $grace; | |
| } | |
| public function getPunchTimeDifferenceInMinutes($attendance) | |
| { | |
| if(trim($attendance->inTime) == "00:00:00" || trim($attendance->outTime) == "00:00:00"){ | |
| return 0; | |
| } | |
| $punchInTime = $attendance->punchDate." ".$attendance->inTime; | |
| $punchInTime = new DateTime($punchInTime); | |
| $punchOutTime = $attendance->punchDate." ".$attendance->outTime; | |
| $punchTimeDifference = $punchInTime->diff(new DateTime($punchOutTime)); | |
| $punchTimeDifferenceInMinutes = $punchTimeDifference->format('%h')*60 + $punchTimeDifference->format('%i'); | |
| return $punchTimeDifferenceInMinutes; | |
| } | |
| public function getActualPunchTimeDifferenceInMinutes($attendance) | |
| { | |
| if(trim($attendance->actualPunchIn) == "00:00:00" || trim($attendance->actualPunchOut) == "00:00:00"){ | |
| return 0; | |
| } | |
| $actualPunchInTime = $attendance->punchDate." ".$attendance->actualPunchIn; | |
| $actualPunchInTime = new DateTime($actualPunchInTime); | |
| $actualPunchOutTime = $attendance->punchDate." ".$attendance->actualPunchOut; | |
| $actualPunchTimeDifference = $actualPunchInTime->diff(new DateTime($actualPunchOutTime)); | |
| $actualPunchTimeDifferenceInMinutes = $actualPunchTimeDifference->format('%h')*60 + $actualPunchTimeDifference->format('%i'); | |
| return $actualPunchTimeDifferenceInMinutes; | |
| } | |
| public function validateLeaveRespectingLeaveDuration($appliedLeave,$settings,$attendance) | |
| { | |
| $currentDate = date_format(new DateTime($attendance->date), 'Y-m-d'); | |
| $leaveDate = date_format(new DateTime($appliedLeave->appliedDate), 'Y-m-d' ); | |
| if(strtotime($currentDate) == strtotime($leaveDate)) | |
| { | |
| $leaveTime = date_format(new DateTime($appliedLeave->appliedDate), 'H:i:s' ); | |
| $staffMustApplyBefor = strtotime('-'.$settings->leaveApplyDuration.' minutes',strtotime(date_format(new DateTime($attendance->actualPunchOut), 'H:i:s'))); | |
| //apply within an hour and before that may not be reflected in consolidated Leave report | |
| if($staffMustApplyBefor > strtotime($leaveTime)) | |
| { | |
| $haveLeave = true; | |
| } | |
| } | |
| elseif(strtotime($currentDate) > strtotime($leaveDate)) | |
| { | |
| $haveLeave = true; | |
| } | |
| return $haveLeave; | |
| } | |
| public function validateLeave ($time1,$time2,$settings,$dayStart,$dayEnd) | |
| { | |
| if($settings->considerLeaveApplyDuration) | |
| { | |
| $time1 = date_format(new DateTime($time1), 'H:i:s'); | |
| $time2 = date_format(new DateTime($time2), 'H:i:s'); | |
| // if($dayStart) | |
| // { | |
| // $anstime = $time1 > $time2 ? 0 : (strtotime($time2) - strtotime($time1))/60; | |
| // } | |
| // else if($dayEnd) | |
| // { | |
| // $anstime = $time1 > $time2 ? (strtotime($time1) - strtotime($time2))/60 : 0 ; | |
| // } | |
| $anstime = $time1 > $time2 ? (strtotime($time1) - strtotime($time2))/60 : (strtotime($time2) - strtotime($time1))/60 ; | |
| if($settings->leaveApplyDuration >= $anstime) | |
| { | |
| return true; | |
| } | |
| else | |
| { | |
| return false; | |
| } | |
| } | |
| else | |
| { | |
| return true; | |
| } | |
| } | |
| public function payRollCalculation($request) | |
| { | |
| $period = CommonUtil::getDatePeriodIterator($request->startDate, CommonUtil::addOneDay($request->endDate)); | |
| $hrHolidayList = CalendarService::getInstance()->getAllHolidaysWithGivenDateRange($request->startDate, $request->endDate); | |
| //$hrHolidays = CalendarService::getInstance()->getAllHolidaysWithGivenDateRange($request->startDate, $request->endDate); | |
| //$deptHolidays = CalendarService::getInstance()->getAllDepartmentHolidayBetweenDateRange ( $request->startDate, $request->endDate, 1 ); | |
| $staffList = $this::getInstance()->getStaffLeaveReportForAGivenDateRange($request); | |
| $settings = CommonService::getInstance()->getSettings(SettingsConstents::STAFF_ATTENDANCE, SettingsConstents::CONSOLIDATED_LEAVE_REPORT_SETTINGS); | |
| $settings = json_decode($settings); | |
| if (empty($staffList)) | |
| { | |
| $returnObject = new stdClass; | |
| $returnObject->success = false; | |
| $returnObject->errorMessage[] = "No staffs Found"; | |
| //$returnObject->partialSuccess = false; | |
| } | |
| else | |
| { | |
| $staffPayroll = new stdClass; | |
| $staffPayRollList = $this::getInstance()->getStaffPayrollDetailsWithPayrollId($request); | |
| $slNo = 0; | |
| foreach ($staffList as $staff) | |
| { | |
| //helping hand for debugging | |
| // if($staff->staffId == "202") | |
| // { | |
| // $test = "hi"; | |
| // } | |
| $slNo++; | |
| $staffPayroll->presentDays = 0; | |
| $staffPayroll->absentDays = 0; | |
| $staffPayroll->leaveDays = 0; | |
| $staffPayroll->holidays =0; | |
| $staffPayroll->undefinedDays = 0; | |
| $staffDayLeave = new stdClass(); | |
| foreach ($period as $dt) | |
| { | |
| if($settings->graceTimePerMonthInMin) | |
| { | |
| $staffProperty = new ConsolidatedStaffLeaveReport(); | |
| //grace time calculations are done here | |
| $returnValue = $this::getInstance()->showStaffAttendanceDetails($staff, $dt, $hrHolidayList, $settings, $staffProperty); | |
| $staffPayroll->presentDays += $staffProperty->presentCount; | |
| $staffPayroll->absentDays += $staffProperty->absentCount; | |
| $staffPayroll->leaveDays += $staffProperty->leaveCount; | |
| $staffPayroll->holidays += $staffProperty->holidayCounter; | |
| if($staffProperty->absentCount) | |
| { | |
| $staffDayAbsentCount = new stdClass(); | |
| $staffDayAbsentCount->absentCount = $staffProperty->absentCount; | |
| $staffDayAbsentCount->date = $dt->format('Y-m-d'); | |
| if($staffProperty->isFornoonAbsent) | |
| { | |
| $staffDayAbsentCount->session = "FN"; | |
| } | |
| else if($staffProperty->isAfternoonAbsent) | |
| { | |
| $staffDayAbsentCount->session = "AN"; | |
| } | |
| else | |
| { | |
| $staffDayAbsentCount->session = "FD"; | |
| } | |
| $staffDayAbsentCount->whyabsent = $this::getInstance()->whyAbsent($staffProperty); | |
| $staffDayLeave->staffDayAbsentCount[] = $staffDayAbsentCount; | |
| } | |
| if($staffProperty->undefinedDays) | |
| { | |
| $staffPayroll->undefinedDays ++; | |
| } | |
| foreach ($staffProperty->singleDayLeaveAndLeaveTypes as $dayLeaveTypes=>$inDayLeaves) | |
| { | |
| //leaves taken by staff | |
| $staffDayLeave->totalMonthlyLeaves[$dayLeaveTypes]+=$inDayLeaves; | |
| if($staffProperty->isleave) | |
| { | |
| $staffDayLeaveCount = new stdClass(); | |
| $staffDayLeaveCount->leaveCount = $staffProperty->leaveCount; | |
| $staffDayLeaveCount->leaveType = $dayLeaveTypes; | |
| $staffDayLeaveCount->date = $dt->format('Y-m-d'); | |
| $staffDayLeave->staffDayLeaveCount[]=$staffDayLeaveCount; | |
| } | |
| } | |
| } | |
| } | |
| $staffPayroll->staffDayLeave = $staffDayLeave; | |
| $recordExist = false; | |
| foreach($staffPayRollList as $staffDetails) | |
| { | |
| if($staffDetails->staff_id == $staff->staffId) | |
| { | |
| $recordExist = true; | |
| break; | |
| } | |
| } | |
| if($recordExist) | |
| { | |
| $returnObject = $this::getInstance()->updatePayrollDetails($staffPayroll,$request,$staffDetails,$returnObject); | |
| } | |
| else | |
| { | |
| $returnObject = $this::getInstance()->insertPayrollDetails($staffPayroll,$request,$returnObject,$staff); | |
| } | |
| } | |
| } | |
| $this::getInstance()->updatePayrollPeriod($request); | |
| return $returnObject; | |
| } | |
| public function showStaffAttendanceDetails($staff, $date, $hrHolidayList, $settings, $staffProperty) | |
| { | |
| $dateMatched = false; | |
| foreach ($staff->attendance as $attendance) | |
| { | |
| if ($date->format('Y-m-d') == $attendance->date) | |
| { | |
| $dateMatched = true; | |
| if ($hrHolidayList[$date->format('Y-m-d')] && (in_array($staff->deptId,$hrHolidayList[$date->format('Y-m-d')]->dept) || in_array("0",$hrHolidayList[$date->format('Y-m-d')]->dept))) | |
| { | |
| if($hrHolidayList[$date->format('Y-m-d')]->session == 'FD' || empty( $hrHolidayList[$date->format('Y-m-d')]->session ) ) | |
| { | |
| $staffProperty->holidayCounter = 1; | |
| $staffProperty->fullDayHoliday = true; | |
| } | |
| else | |
| { | |
| $staffProperty->holidayCounter = .5; | |
| if($hrHolidayList[$date->format('Y-m-d')]->session == 'FN') | |
| { | |
| $staffProperty->fornoonHoliday = true; | |
| } | |
| else | |
| { | |
| $staffProperty->afternoonHoliday = true; | |
| } | |
| } | |
| $staffProperty->LeaveArray[] =SettingsConstents::HOLIDAY; | |
| $staffProperty->holiday = true; | |
| if(!$settings->considerHolidayAsFirstPriority) | |
| { | |
| $holiday = true; | |
| } | |
| return $staffProperty; | |
| } | |
| $staffProperty->holiday = false; | |
| return $this::getInstance()->getLeaveDetails($attendance, $settings, $staffProperty); | |
| } | |
| } | |
| if (! $dateMatched) | |
| { | |
| if ($hrHolidayList[$date->format('Y-m-d')] && (in_array($staff->deptId,$hrHolidayList[$date->format('Y-m-d')]->dept) || in_array("0",$hrHolidayList[$date->format('Y-m-d')]->dept))) | |
| { | |
| $staffProperty->LeaveArray[] =SettingsConstents::HOLIDAY; | |
| $staffProperty->holiday = true; | |
| if($hrHolidayList[$date->format('Y-m-d')]->session == 'FD' || empty( $hrHolidayList[$date->format('Y-m-d')]->session ) ) | |
| { | |
| $staffProperty->holidayCounter = 1; | |
| $staffProperty->fullDayHoliday = true; | |
| } | |
| else | |
| { | |
| $staffProperty->holidayCounter = .5; | |
| if($hrHolidayList[$date->format('Y-m-d')]->session == 'FN') | |
| { | |
| $staffProperty->fornoonHoliday = true; | |
| } | |
| else | |
| { | |
| $staffProperty->afternoonHoliday = true; | |
| } | |
| } | |
| if(!$settings->considerHolidayAsFirstPriority) | |
| { | |
| $holiday = true; | |
| $this::getInstance()->getLeaveDetails($attendance, $settings, $staffProperty,$holiday); | |
| } | |
| return $staffProperty; | |
| } | |
| } | |
| $staffProperty->undefinedDays=true; | |
| return $staffProperty; | |
| } | |
| public function getLeaveDetails($attendance, $settings, $staffProperty,$holiday = false) | |
| { | |
| if ($settings->graceTimePerMonthInMin) | |
| { | |
| if($attendance->actualPunchIn == "00:00:00" || empty($attendance->actualPunchIn) || $attendance->actualPunchOut == "00:00:00" || empty($attendance->actualPunchOut) ) | |
| { | |
| $staffProperty->noActualPunch = true; | |
| $staffProperty->undefinedDays=true; | |
| return $staffProperty; | |
| } | |
| $staffProperty = StaffLeaveService::getInstance()->getStaffDayDetails($attendance,$settings,$staffProperty,$holiday); | |
| } | |
| } | |
| public function getStaffPayrollDetailsWithPayrollId($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| if($request && $request->payrollPeriodId) | |
| { | |
| //get pay roll with date and id in the request | |
| $sql = "SELECT pay.id,pay.form_date,pay.to_date,pay.name,pay.description,pay.type,payl.staff_id,payl.absent_count,payl.leave_count,payl.present_count,payl.leave_details | |
| FROM hr_pay_roll_period pay | |
| INNER JOIN hr_staff_payroll_leave_details payl ON payl.pay_roll_id = pay.id | |
| WHERE pay.id=$request->payrollPeriodId;"; | |
| try { | |
| $staffList = $this->executeQueryForList($sql); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $staffList; | |
| } | |
| } | |
| public function updatePayrollDetails($staffPayroll,$request,$staffDetails,$returnObject) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| $leaves = json_encode($staffPayroll->staffDayLeave); | |
| $sql = "UPDATE hr_staff_payroll_leave_details SET absent_count=$staffPayroll->absentDays, leave_count=$staffPayroll->leaveDays, present_count=$staffPayroll->presentDays, leave_details='$leaves',updated_by='$request->currentStaff', updated_date=utc_timestamp() WHERE pay_roll_id='$request->payrollPeriodId' and staff_id = $staffDetails->staff_id;"; | |
| try { | |
| $this->executeQuery($sql); | |
| $returnObject->success = true; | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException ($e->getCode(), $e->getMessage()); | |
| $returnObject->success = false; | |
| $returnObject->errorMessage[] = "Couldn't update $staffDetails->staffName details"; | |
| } | |
| return $returnObject; | |
| } | |
| public function insertPayrollDetails($staffPayroll,$request,$returnObject,$staff) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| $leaves = json_encode($staffPayroll->staffDayLeave); | |
| $sql = "INSERT INTO hr_staff_payroll_leave_details (staff_id, pay_roll_id, absent_count, leave_count, present_count, leave_details, created_by, created_date, updated_by, updated_date) VALUES ('$staff->staffId', '$request->payrollPeriodId', '$staffPayroll->absentDays', '$staffPayroll->leaveDays', '$staffPayroll->presentDays', '$leaves', $request->currentStaff, utc_timestamp(), $request->currentStaff, utc_timestamp());"; | |
| try { | |
| $this->executeQuery($sql); | |
| $returnObject->success = true; | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException ($e->getCode(), $e->getMessage()); | |
| $returnObject->success = false; | |
| $returnObject->errorMessage[] = "Couldn't create $staff->staffName details"; | |
| } | |
| return $returnObject; | |
| } | |
| public function getStaffPayrollPeriods($id = null) | |
| { | |
| $id = $this->realEscapeString($id); | |
| $condition .= $id?" and id = $id ":""; | |
| $sql = "SELECT | |
| hrpay.id, hrpay.form_date, hrpay.to_date, hrpay.name, hrpay.description, hrpay.type, istaff.staffName AS createdStaff ,DATE_FORMAT(CONVERT_TZ(hrpay.created_date , '+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s') as created_date, ustaff.staffName AS updatedStaff, DATE_FORMAT(CONVERT_TZ(hrpay.updated_date , '+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s') as updated_date | |
| FROM hr_pay_roll_period hrpay | |
| LEFT JOIN staffaccounts istaff ON istaff.staffID = hrpay.created_by | |
| LEFT JOIN staffaccounts ustaff ON ustaff.staffID = hrpay.updated_by | |
| WHERE 1=1 $condition;"; | |
| try | |
| { | |
| $staffList = $this->executeQueryForList($sql); | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $staffList; | |
| } | |
| public function updatePayrollPeriod($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| $sql = "UPDATE hr_pay_roll_period SET updated_by='$request->currentStaff', updated_date= utc_timestamp() WHERE id='$request->payrollPeriodId';"; | |
| try | |
| { | |
| $this->executeQuery($sql); | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getStaffLeaveDetails($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| $sectionID = $request->sectionID; | |
| if($request->endDate != $request->startDate) | |
| { | |
| if (!empty($request->startDate)) { | |
| $criteria .= " AND (la.startDate >= '$request->startDate' OR | |
| ('$request->startDate' BETWEEN la.startDate and la.endDate) ) "; | |
| } | |
| //endDate | |
| if (!empty($request->endDate)) { | |
| $criteria .= " AND (la.endDate <= '$request->endDate' OR | |
| ('$request->endDate' BETWEEN la.startDate and la.endDate) ) "; | |
| } | |
| } | |
| else | |
| { | |
| if (!empty($request->startDate)) { | |
| $criteria .= " AND (la.startDate = '$request->startDate' OR | |
| ('$request->startDate' BETWEEN la.startDate and la.endDate) ) "; | |
| } | |
| } | |
| $criteria .= $request->staffID?" and st.staffID = '$request->staffID'":""; | |
| $criteria .= $request->leaveID?" and la.leaveID = '$request->leaveID'":""; | |
| if(in_array("",$sectionID)) | |
| { | |
| $criteria .= ""; | |
| } | |
| else{ | |
| $criteria .= " and la.sectionID in (".implode(",",$sectionID).")"; | |
| } | |
| $sql = "SELECT | |
| la.applicationID, la.startDate, la.endDate, st.staffName, lt.leaveName, ld.daytypeName, sec.sectionName, la.noofDays, la.noofleaves, la.sectionID, la.designationID, la.leaveDesc, st.staffAccount, la.leaveSub, lt.leaveDesc as leaveTypeDesc, la.leaveID, st.staffID ,pay.id,pay.present_count,pay.absent_count,pay.leave_details,pay.leave_count, | |
| lt.required_leavecrtfct, lt.leaveperiod_start, lt.leaveperiod_end, | |
| la.hr_group_lvapplnids_id, | |
| hrc.filepath, hrc.filename, | |
| lt.leaveperiod_end,lt.leaveperiod_start,st.staffID,la.leaveID,la.hr_group_lvapplnids_id, | |
| st.deptID | |
| FROM staffaccounts st | |
| LEFT JOIN hr_staff_payroll_leave_details pay on pay.staff_id = st.staffID and pay.pay_roll_id = $request->payrollPeriodId | |
| LEFT JOIN hr_leave_applications la ON st.staffID = la.staffID AND la.approved = 1 $criteria | |
| LEFT JOIN hr_leavetypes lt ON lt.leaveID = la.leaveID | |
| LEFT JOIN hr_leave_daytype ld ON ld.daytypeID = la.daytypeID | |
| LEFT JOIN hr_sections sec ON sec.sectionID = la.sectionID | |
| LEFT JOIN hr_leaveapplication_certificates hrc on hrc.hr_group_lvapplnids_id = la.hr_group_lvapplnids_id | |
| WHERE st.isResigned = 0 ORDER BY la.startDate,st.staffAccount DESC"; | |
| try | |
| { | |
| $leaveDetails = $this->executeQueryForList($sql); | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $leaveDetails; | |
| } | |
| public function staffLeaveCertificationCount($staffLeaveDetail) | |
| { | |
| $sql = "select count(hr_group_lvapplnids_id) as count from hr_leave_applications where startDate >= '$staffLeaveDetail->leaveperiod_start' and endDate <='$staffLeaveDetail->leaveperiod_end' and staffID='$staffLeaveDetail->staffID' and leaveID='$staffLeaveDetail->leaveID' and hr_group_lvapplnids_id < '$staffLeaveDetail->hr_group_lvapplnids_id' and hr_group_lvapplnids_id not in(select hr_group_lvapplnids_id from hr_leaveapplication_certificates)"; | |
| try | |
| { | |
| $leaveDetails = $this->executeQueryForList($sql); | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $leaveDetails->count ; | |
| } | |
| public function getHrSectionDetailBySectionID($sectionID = false) | |
| { | |
| $sectionID = $this->realEscapeArray($sectionID); | |
| $sectionIds = $sectionID?implode(",",$sectionID):""; | |
| $condition = $sectionIds?" WHERE sectionID IN (".$sectionIds .")":""; | |
| $sql = "SELECT sectionID, sectionName, sectionDesc from hr_sections $condition order by sectionName asc"; | |
| try | |
| { | |
| $hrSections= $this->executeQueryForList($sql); | |
| $sectionsArray=[]; | |
| foreach($hrSections as $hr) | |
| { | |
| $sectionsArray[]= $hr->sectionName; | |
| } | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return implode(",",$sectionsArray); | |
| } | |
| public function getStaffNumberOfLeaveApplicationLimit($leaveID,$staffID) | |
| { | |
| $sql = "SELECT IF(hrlt.noofleaveappliaction < COUNT(hrl.applicationID) + 1,'false','true') as confirm FROM hr_leavetypes hrlt | |
| INNER JOIN hr_leave_applications hrl ON hrlt.leaveperiod_start < hrl.startDate AND hrlt.leaveperiod_end > hrl.endDate AND hrlt.leaveID = hrl.leaveID | |
| WHERE hrl.staffID = $staffID AND hrlt.leaveID = $leaveID;"; | |
| try | |
| { | |
| return CommonUtil::stringToBoolean($this->executeQueryForObject($sql)->confirm); | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getReportRulesOfLeaveTypes($id = null) | |
| { | |
| $condition = $id?"WHERE leaveID = ".$id:""; | |
| $sql = "SELECT leaveID,leaveName,report_rules FROM hr_leavetypes $condition;"; | |
| try | |
| { | |
| return $this->executeQueryForList($sql); | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getStaffLeaveApplicationByGroupID($grpID) | |
| { | |
| $sql = "select applicationID,staffID, designationID, sectionID, leaveID, leaveSub, leaveDesc, startDate, endDate, daytypeID, noofDays, noofleaves, fromgained, compensation_leaveID, compensation_startdate, compensation_enddate, timeStart, timeEnd from hr_leave_applications where hr_group_lvapplnids_id=$grpID"; | |
| try { | |
| $applications = $this->executeQueryForList($sql); | |
| return $applications; | |
| } catch (\Exception $e) { | |
| return false; | |
| } | |
| } | |
| public function getApplicationSanctionDetailsByApplicationID($id) | |
| { | |
| $sql = "select applicationID, staffID, confirmed, approved, rejected, confapprvDate, conf_rejected from hr_leave_sanctioned_person where applicationID=".$id; | |
| try { | |
| $sanctionDetails = $this->executeQueryForObject($sql); | |
| return $sanctionDetails; | |
| } catch (\Exception $e) { | |
| return false; | |
| } | |
| } | |
| public function getHrApplicationSanctionCertificatesByGroupID($id) | |
| { | |
| $sql = "select applicationID, staffID, confirmed, approved, rejected, confapprvDate, conf_rejected from hr_leave_sanctioned_person where applicationID=".$id; | |
| try { | |
| $sanctionDetails = $this->executeQueryForObject($sql); | |
| return $sanctionDetails; | |
| } catch (\Exception $e) { | |
| return false; | |
| } | |
| } | |
| /** | |
| * While editting a leave application we have to delete old leave | |
| * This function is used while there is an error in newly created leaves then we delete new application and insert old leave; | |
| */ | |
| public function deleteNewLeaveApplicationAndInsertOld($array_applnID,$oldLeaveApplications) | |
| { | |
| if(!empty($array_applnID)) | |
| { | |
| $sql = "delete from hr_leave_applications where applicationID in (".implode(',',$array_applnID).")"; | |
| $this->executeQuery($sql); | |
| } | |
| try{ | |
| foreach($oldLeaveApplications->applications as $application) | |
| { | |
| if($application->leavecount_leaveID) | |
| { | |
| $sql = "INSERT INTO hr_leave_applications (staffID, designationID, sectionID, leaveID, leaveSub, leaveDesc, startDate, endDate, daytypeID, noofDays, noofleaves, fromgained, compensation_leaveID, compensation_startdate, compensation_enddate, timeStart, timeEnd) VALUES ('$application->staffID', '$application->designationID', '$application->sectionID', '$application->leaveID', '$application->leaveSub', '$application->leaveDesc', '$application->startDate', '$application->endDate', '$application->daytypeID', '$application->noofDays', '$application->noofleaves', '$application->fromgained', '$application->leavecount_leaveID', '$application->compnstfromday', '$application->compnsttoday', '$application->startTime', '$application->endTime')"; | |
| } | |
| else | |
| { | |
| $sql = "INSERT INTO hr_leave_applications (staffID, designationID, sectionID, leaveID, leaveSub, leaveDesc, startDate, endDate, daytypeID, noofDays, noofleaves, fromgained, timeStart, timeEnd) VALUES ('$application->staffID', '$application->designationID', '$application->sectionID', '$application->leaveID', '$application->leaveSub', '$application->leaveDesc', '$application->startDate', '$application->endDate', '$application->daytypeID', '$application->noofDays', '$application->noofleaves', '$application->fromgained', '$application->startTime', '$application->endTime')"; | |
| } | |
| $applicationIDs[] = $this->executeQueryForObject($sql.$values, true); | |
| } | |
| return $applicationIDs; | |
| }catch (\Exception $e) { | |
| return false; | |
| } | |
| } | |
| function whyAbsent($staffProperty) | |
| { | |
| $responseHTML =""; | |
| foreach($staffProperty->LeaveArray as $data) | |
| { | |
| switch ($data) | |
| { | |
| case "1/2".SettingsConstents::ABSENT: | |
| $responseHTML .="1/2".SettingsConstents::ABSENT; | |
| break; | |
| case "1/2".SettingsConstents::ABSENT.SettingsConstents::FN: | |
| $responseHTML .="1/2".SettingsConstents::ABSENT.SettingsConstents::FN; | |
| break; | |
| case "1/2".SettingsConstents::ABSENT.SettingsConstents::AN: | |
| $responseHTML .="1/2".SettingsConstents::ABSENT.SettingsConstents::AN; | |
| break; | |
| case "1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_IN_MISS.")": | |
| $responseHTML .="1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_IN_MISS.")"; | |
| break; | |
| case "1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_OUT_MISS.")": | |
| $responseHTML .="1/2".SettingsConstents::CUTTING."(".SettingsConstents::PUNCH_OUT_MISS.")"; | |
| break; | |
| case SettingsConstents::THRESHOLD_TIME_EXEED."(".SettingsConstents::ABSENT.")": | |
| $responseHTML .=SettingsConstents::THRESHOLD_TIME_EXEED."(".SettingsConstents::ABSENT.")"; | |
| break; | |
| case "1/2".SettingsConstents::CUTTING."(".SettingsConstents::TIME_EXEEDED.")": | |
| $responseHTML .= "1/2".SettingsConstents::CUTTING."(".SettingsConstents::TIME_EXEEDED.")"; | |
| break; | |
| case SettingsConstents::ABSENT: | |
| $responseHTML .=SettingsConstents::ABSENT; | |
| break; | |
| case "1/2".SettingsConstents::CUTTING."(".SettingsConstents::LATE_COMING.")"; | |
| $responseHTML .= "1/2".SettingsConstents::CUTTING."(".SettingsConstents::LATE_COMING.")"; | |
| break; | |
| case "1/2".SettingsConstents::CUTTING."(".SettingsConstents::EARLY_GOING.")"; | |
| $responseHTML .= "1/2".SettingsConstents::EARLY_GOING."(".SettingsConstents::EARLY_GOING.")"; | |
| break; | |
| case "1/2".SettingsConstents::CUTTING."(".SettingsConstents::EARLY_GOING.")"; | |
| $responseHTML .= "1/2".SettingsConstents::EARLY_GOING."(".SettingsConstents::FD.")"; | |
| break; | |
| } | |
| $responseHTML = $responseHTML?$responseHTML." + ":""; | |
| } | |
| $responseHTML = rtrim($responseHTML,' + '); | |
| return $responseHTML; | |
| } | |
| public function getAllStaffWithInaSection($sectionID) | |
| { | |
| if(in_array("",$sectionID)) | |
| { | |
| $sectionID = $this->realEscapeArray($sectionID); | |
| $sql = "select staffID,staffName,sectionID from staffaccounts"; | |
| } | |
| else{ | |
| $sectionID = $this->realEscapeArray($sectionID); | |
| $condString = implode(",",$sectionID); | |
| $condition = "WHERE sectionID in (".$condString.")"; | |
| $sql = "select staffID,staffName,sectionID from staffaccounts $condition"; | |
| } | |
| try { | |
| $staffDetails = $this->executeQueryForList($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $staffDetails; | |
| } | |
| public function getPayRollPeriodByStartDateAndEndDate($startDate = null,$endDate = null) | |
| { | |
| if($startDate) | |
| $sql = "select * from hr_pay_roll_period where '".$startDate."' between form_date and to_date;"; | |
| try { | |
| $payrollPeriod = $this->executeQueryForList($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $payrollPeriod; | |
| } | |
| public function getStaffUpdatePunchTimeRequestByPayRollPeriodID($payRollId,$staffId) | |
| { | |
| $sql = "select su.id, su.punchDate, su.punchIn, su.punchOut, su.actualpunchIn, su.actualpunchOut, su.punchtime_shiftchange, su.appliedDate, su.confirmed, su.conf_rejected, su.approved, su.rejected from staffpunchtime_shiftchange_updaterequest su | |
| inner join hr_pay_roll_period pp on su.punchDate between pp.form_date and pp.to_date | |
| where punchtime_shiftchange = 0 and staffID = $staffId and pp.id = $payRollId and su.rejected <> 1;"; | |
| try { | |
| $punchTimeRequest = $this->executeQueryForList($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $punchTimeRequest; | |
| } | |
| public function getLeaveDetailsByLeaveCode($code) | |
| { | |
| try { | |
| $code = $this->realEscapeString($code); | |
| $sql = "SELECT leaveID,leaveName,leaveDesc FROM hr_leavetypes hl WHERE leaveName = '$code' "; | |
| return $this->executeQueryForObject($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getDayDetailsByDayCode($code) | |
| { | |
| try { | |
| $code = $this->realEscapeString($code); | |
| $sql = "SELECT daytypeID ,daytypeName ,daytypeDesc,noofleaves from hr_leave_daytype hld WHERE daytypeName = '$code' "; | |
| return $this->executeQueryForObject($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function updateleaveViaScript($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| try{ | |
| $sql = "INSERT | |
| IGNORE | |
| INTO | |
| hr_leave_applications (staffID, | |
| designationID, | |
| sectionID, | |
| leaveID, | |
| leaveSub, | |
| leaveDesc, | |
| startDate, | |
| endDate, | |
| appliedDate, | |
| confirmed, | |
| approved, | |
| rejected, | |
| daytypeID, | |
| noofDays, | |
| noofleaves, | |
| previous_leave, | |
| conf_rejected, | |
| fromgained, | |
| compensation_leaveID, | |
| compensation_startdate, | |
| compensation_enddate, | |
| timeStart, | |
| timeEnd, | |
| hr_group_lvapplnids_id) | |
| VALUES($request->staffID, | |
| $request->designationID, | |
| $request->sectionID, | |
| $request->leaveID, | |
| '$request->leaveSubject', | |
| '$request->leaveDesc', | |
| '$request->startDate', | |
| '$request->endDate', | |
| NOW(), | |
| 0, | |
| 1, | |
| 0, | |
| $request->daytypeID, | |
| $request->noofDays, | |
| $request->noofleaves, | |
| 0, | |
| 0, | |
| $request->fromgained, | |
| NULL, | |
| NULL, | |
| NULL, | |
| NULL, | |
| NULL, | |
| NULL); | |
| "; | |
| $applicationID = $this->executeQueryForObject($sql, true); | |
| if(!$applicationID) | |
| { | |
| $updateSelect = "SELECT applicationID | |
| from hr_leave_applications | |
| WHERE | |
| staffID ='$request->staffID' | |
| and designationID = '$request->designationID' | |
| and sectionID = '$request->sectionID' | |
| and startDate = '$request->startDate' | |
| and endDate = '$request->endDate' and approved = 0 "; | |
| $exists = $this->executeQueryForObject($updateSelect); | |
| if($exists) | |
| { | |
| $sqlUpdateQuery = "UPDATE hr_leave_applications SET approved = 1 where applicationID = '$exists->applicationID'"; | |
| $applicationID = $exists->applicationID; | |
| $this->executeQuery($sqlUpdateQuery); | |
| } | |
| else{ | |
| return false; | |
| } | |
| } | |
| $sql2 = "INSERT INTO hr_leave_sanctioned_person (applicationID, | |
| staffID, | |
| confirmed, | |
| approved, | |
| rejected, | |
| confapprvDate, | |
| conf_rejected) | |
| VALUES($applicationID, | |
| $request->sanctioningPerson, | |
| 0, | |
| 1, | |
| 0, | |
| NOW(), | |
| 0); | |
| "; | |
| $this->executeQuery($sql2); | |
| return true; | |
| }catch (\Exception $e) { | |
| return false; | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getEscalationDetailsOfStaff($staffID) | |
| { | |
| try{ | |
| $staffID = $this->realEscapeString($staffID); | |
| $sql = "SELECT | |
| id, | |
| time_of_escalation_in_minutes as escalationTime, | |
| updated_date | |
| from | |
| leaveEscalation | |
| WHERE | |
| staffID = '$staffID'"; | |
| return $this->executeQueryForObject($sql); | |
| }catch (\Exception $e) { | |
| return false; | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getCurrentDateLeaves() | |
| { | |
| try{ | |
| $result = []; | |
| $dateFrom = date('Y-m-d')." 00:00:00"; | |
| $dateTo = date('Y-m-d')." 11:59:59"; | |
| $sql = "SELECT | |
| hla.applicationID , | |
| hla.staffID , | |
| s.staffName, | |
| hla.leaveID , | |
| hl.leaveName , | |
| hla.designationID , | |
| hla.sectionID , | |
| hla.leaveSub , | |
| hla.leaveDesc , | |
| hla.appliedDate , | |
| hla.confirmed , | |
| hla.approved , | |
| hla.rejected , | |
| hlca.sectionID , | |
| hlca.designationID , | |
| hlca.approvalTime , | |
| hla.startDate, | |
| hla.endDate, | |
| hlca.approvalTimeAfternoon, | |
| hld.fromTime, | |
| hld.toTime | |
| from | |
| hr_leave_applications hla | |
| inner join hr_leave_confirm_approve hlca on hlca.designationID = hla.designationID and hlca.sectionID = hla.sectionID | |
| inner join staffaccounts s on s.staffID = hla.staffID | |
| inner join hr_leavetypes hl ON hl.leaveID = hla.leaveID | |
| inner join hr_leave_daytype hld ON hld.daytypeID = hla.daytypeID | |
| WHERE | |
| startDate BETWEEN '$dateFrom' and '$dateTo' | |
| GROUP BY hla.applicationID | |
| ORDER BY hla.applicationID"; | |
| $leaves = $this->executeQueryForList($sql); | |
| foreach ($leaves as $leave) { | |
| if($leave->fromTime) | |
| { | |
| $dateTime = new DateTime($leave->fromTime); | |
| $amOrpm = $dateTime->format('A'); | |
| if($amOrpm == "AM") | |
| { | |
| if(strtotime($leave->approvalTime) < time()) | |
| { | |
| $result[] = $leave; | |
| } | |
| } | |
| elseif ($amOrpm == "PM") { | |
| if(strtotime($leave->approvalTimeAfternoon) < time()) | |
| { | |
| $result[] = $leave; | |
| } | |
| } | |
| } | |
| else{ | |
| $result[] = $leave; | |
| } | |
| $sqlLeavePolicy = ""; | |
| } | |
| return $result; | |
| }catch (\Exception $e) { | |
| return false; | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function updateLeaveEscalation($applicationID,$approve,$reject) | |
| { | |
| try{ | |
| $applicationID = $this->realEscapeString($applicationID); | |
| $confirm = $this->realEscapeString($confirm); | |
| $approve = $this->realEscapeString($approve); | |
| $sql = "SELECT applicationID from hr_leave_applications hla WHERE applicationID = '$applicationID' "; | |
| $exists = $this->executeQueryForObject($sql); | |
| $reponse = new stdClass(); | |
| $reponse->msg = ""; | |
| $reponse->data = ""; | |
| if($exists->applicationID) | |
| { | |
| $sqlUpdate = "UPDATE hr_leave_applications SET approved = '$approve',rejected = '$reject' WHERE applicationID = '$applicationID' "; | |
| $this->executeQuery($sqlUpdate); | |
| $sanctionCheck = "SELECT applicationID from hr_leave_sanctioned_person WHERE applicationID = '$exists->applicationID' "; | |
| $sanctioned = $this->executeQueryForObject($sanctionCheck); | |
| if($sanctioned->applicationID) | |
| { | |
| $sql = "UPDATE hr_leave_sanctioned_person SET approved = '$approve',rejected = '$reject' WHERE applicationID = '$sanctioned->applicationID' "; | |
| } | |
| else{ | |
| $staffID = $_SESSION['staffID']; | |
| $sql="INSERT INTO hr_leave_sanctioned_person (applicationID, | |
| staffID, | |
| confirmed, | |
| approved, | |
| rejected, | |
| confapprvDate, | |
| conf_rejected) | |
| VALUES('$applicationID', $staffID, 0, $approve, $reject, NOW(), 0); | |
| "; | |
| } | |
| $this->executeQuery($sql); | |
| $reponse->data = true; | |
| } | |
| else{ | |
| $reponse->msg = "Application ID Not Found "; | |
| } | |
| }catch (\Exception $e) { | |
| $reponse->data = false; | |
| $reponse->msg = $e->getMessage(); | |
| return $reponse; | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $reponse; | |
| } | |
| public function checkForEscalationStatus($designationID,$sectionID, $time, $applicationID) | |
| { | |
| try { | |
| $response = new stdClass(); | |
| $response->msg = ""; | |
| $response->data = ""; | |
| $designationID = $this->realEscapeString($designationID); | |
| $sectionID = $this->realEscapeString($sectionID); | |
| $applicationID = $this->realEscapeString($applicationID); | |
| $time = $this->realEscapeString($time); | |
| $sessionTime = $this->getSessionTimeFromLeaveApplicationID($applicationID)->fromTime; | |
| $dateTime = new DateTime($sessionTime); | |
| $amOrpm = $dateTime->format('A'); // 'A' ret | |
| $sql = "SELECT hlca.approvalTime,hlca.approvalTimeAfternoon from hr_leave_confirm_approve hlca WHERE sectionID = '$sectionID' AND designationID= '$designationID' and approve =1 order by approvalTime DESC"; | |
| $result = $this->executeQueryForObject($sql); | |
| if($result->approvalTime) | |
| { | |
| if($amOrpm == "AM") | |
| { | |
| $approvalTime = $result->approvalTime; | |
| } | |
| else{ | |
| $approvalTime = $result->approvalTimeAfternoon; | |
| } | |
| $dateTime = new DateTime($approvalTime); | |
| $dateTime->modify("+$time minutes"); | |
| $newTime = $dateTime->format('H:i:s'); | |
| $currentDateTime = new DateTime(); | |
| if ($dateTime < $currentDateTime) { | |
| $response->data = false; | |
| $response->msg = "Time Exceeded For Approval"; | |
| } else { | |
| $response->data = true; | |
| } | |
| } | |
| else{ | |
| $response->data = true; | |
| $response->msg = "Some data like Designation/Section/Approval time not set"; | |
| } | |
| }catch (\Exception $e) { | |
| $response->data = false; | |
| $response->msg = $e->getMessage(); | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $response; | |
| } | |
| public function getstaffLeaveDetailsByApplicationID($applicationID) | |
| { | |
| try{ | |
| $applicationID = $this->realEscapeString($applicationID); | |
| $sql = "SELECT applicationID , | |
| staffID , | |
| designationID , | |
| sectionID , | |
| leaveID , | |
| leaveSub , | |
| leaveDesc , | |
| startDate , | |
| endDate , | |
| noofleaves, | |
| noofDays * noofleaves as totalLeave , | |
| noofDays | |
| from hr_leave_applications | |
| WHERE applicationID = $applicationID"; | |
| return $this->executeQueryForObject($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getPayrollPeriodByDate($date) | |
| { | |
| try{ | |
| $date = $this->realEscapeString($date); | |
| $sql = "SELECT id,name,form_date,to_date from hr_pay_roll_period WHERE '$date' >= form_date and '$date' <= to_date "; | |
| return $this->executeQueryForObject($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getPayrollProcessedStatus($staffID, $payRollId) | |
| { | |
| try{ | |
| $staffID = $this->realEscapeString($staffID); | |
| $payRollId = $this->realEscapeString($payRollId); | |
| $sql = "SELECT id FROM hr_staff_payroll_leave_details WHERE staff_id = $staffID and pay_roll_id = $payRollId"; | |
| $status = $this->executeQueryForObject($sql); | |
| if($status) | |
| { | |
| //payroll already processed | |
| return true; | |
| } | |
| else{ | |
| //payroll not processed | |
| return false; | |
| } | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function updateLeaveByApplicationID($appID, $fromDate, $toDate) | |
| { | |
| try{ | |
| $appID = $this->realEscapeString($appID); | |
| $fromDate = $this->realEscapeString($fromDate); | |
| $toDate = $this->realEscapeString($toDate); | |
| $staffID = $_SESSION['staffID']; | |
| // $diff = abs(strtotime($fromDate) - strtotime($toDate)); | |
| // $days = floor($diff / (60 * 60 * 24)); | |
| $date1 = new DateTime($fromDate); | |
| $date2 = new DateTime($toDate); | |
| $diff = $date1->diff($date2); | |
| $days = $diff->days + 1; | |
| $sqlUpdate = "UPDATE hr_leave_applications SET startDate = '$fromDate', endDate='$toDate', noofDays=$days WHERE applicationID = $appID"; | |
| $this->executeQuery($sqlUpdate); | |
| $sqlgetLog = "SELECT log from hr_leave_sanctioned_person WHERE applicationID = $appID"; | |
| $log = $this->executeQueryForObject($sqlgetLog); | |
| if(!$log) | |
| { | |
| $log = []; | |
| } | |
| else{ | |
| $log = json_decode($log); | |
| } | |
| $logEntry = new \stdClass(); | |
| $logEntry->staffID = $staffID; | |
| $logEntry->time = date('Y-m-d H:i:s'); | |
| $logEntry->from = $fromDate; | |
| $logEntry->to = $toDate; | |
| $log [] = $logEntry; | |
| $jsonLog = json_encode($log); | |
| $sqlSanctionUpdate = "UPDATE hr_leave_sanctioned_person SET isEdited = 1, log = '$jsonLog' WHERE applicationID = $appID"; | |
| $this->executeQuery($sqlSanctionUpdate); | |
| return true; | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function getSessionTimeFromLeaveApplicationID($appID) | |
| { | |
| try{ | |
| $appID = $this->realEscapeString($appID); | |
| $sql = "SELECT hld.fromTime,hld.toTime from hr_leave_applications hla inner join hr_leave_daytype hld on hla.daytypeID = hld.daytypeID WHERE applicationID = $appID"; | |
| return $this->executeQueryForObject($sql); | |
| }catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| public function checkForExistingLeave($date, $appID) | |
| { | |
| try{ | |
| $date = $this->realEscapeString($date); | |
| $appID = $this->realEscapeString($appID); | |
| $staffSql = "SELECT staffID from hr_leave_applications WHERE applicationID = $appID"; | |
| $staffID = $this->executeQueryForObject($staffSql)->staffID; | |
| if($staffID) | |
| { | |
| $sql = "SELECT applicationID from hr_leave_applications hla WHERE '$date' BETWEEN startDate and endDate and applicationID != '$appID' and staffID = '$staffID' "; | |
| $exists = $this->executeQueryForObject($sql) ? true : false; | |
| } | |
| return $exists; | |
| } | |
| catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| } |