public function handleLeaveCancel($leave) { $result = false; $current = array(); $change = array(); $entitlementArray = $this->getLeaveEntitlementService()->getEntitlementUsageForLeave($leave->id); if (count($entitlementArray) > 0) { $minDate = null; $maxDate = null; // reduce entitlement usage for this leave foreach ($entitlementArray as $entitlementItem) { $entitlementItem['days_used'] -= $entitlementItem['length_days']; if ($entitlementItem['days_used'] < 0) { $entitlementItem['days_used'] = 0; } if (is_null($minDate)) { $minDate = $entitlementItem['from_date']; $maxDate = $entitlementItem['to_date']; } else { if (strtotime($minDate) > strtotime($entitlementItem['from_date'])) { $minDate = strtotime($entitlementItem['from_date']); } if (strtotime($maxDate) < strtotime($entitlementItem['to_date'])) { $maxDate = strtotime($entitlementItem['to_date']); } } } // Get leave without entitlements between from_date and to_date $leaveList = $this->getLeaveEntitlementService()->getLeaveWithoutEntitlements($leave->getEmpNumber(), $leave->getLeaveTypeId(), $minDate, $maxDate); // remove current leave from list $leaveDates = array(); foreach ($leaveList as $leaveDateTemp) { if ($leaveDateTemp['id'] != $leave->getId()) { $leaveDates[] = $leaveDateTemp; } } $entitlements = array(); foreach ($entitlementArray as $entitlementItem) { $entitlement = new LeaveEntitlement(); $entitlement->setId($entitlementItem['id']); $entitlement->setNoOfDays($entitlementItem['no_of_days']); $newDaysUsed = $entitlementItem['days_used'] - $entitlementItem['length_days']; if ($newDaysUsed < 0) { $newDaysUsed = 0; } $entitlement->setDaysUsed($newDaysUsed); $entitlement->setFromDate($entitlementItem['from_date']); $entitlement->setToDate($entitlementItem['to_date']); $entitlements[] = $entitlement; } reset($leaveDates); $getNextDate = true; $entitlementsOk = false; $leaveDate = null; $leaveLength = 0; $leaveWithoutEntitlement = array(); $entitlement = array_shift($entitlements); if (!is_null($entitlement)) { $availableDays = $entitlement->getAvailableDays(); } while (!is_null($entitlement)) { if ($availableDays > 0) { if ($getNextDate) { $leaveDate = array_shift($leaveDates); if (is_null($leaveDate)) { $entitlementsOk = empty($leaveWithoutEntitlement); $leaveLength = 0; break; } else { $leaveLength = $leaveDate['length_days']; $getNextDate = false; } } if ($leaveLength <= 0) { $getNextDate = true; } else { if (!$entitlement->withinPeriod($leaveDate['date'])) { if (strtotime($leaveDate['date']) < strtotime($entitlement->getFromDate())) { $getNextDate = true; $leaveWithoutEntitlement[] = $leaveDate; } else { if (strtotime($leaveDate['date']) > strtotime($entitlement->getToDate())) { $availableDays = 0; } } } else { if ($leaveLength <= $availableDays) { $entitlement->days_used += $leaveLength; $availableDays -= $leaveLength; $leaveId = $leaveDate['id']; if (empty($leaveId)) { if (!isset($current[$leaveDate['date']])) { $current[$leaveDate['date']] = array(); } $current[$leaveDate['date']][$entitlement->id] = $leaveLength; } else { if (!isset($change[$leaveId])) { $change[$leaveId] = array(); } $change[$leaveId][$entitlement->id] = $leaveLength; } $getNextDate = true; } else { $entitlement->days_used = $entitlement->no_of_days; $leaveLength -= $availableDays; $leaveId = $leaveDate['id']; if (empty($leaveId)) { if (!isset($current[$leaveDate['date']])) { $current[$leaveDate['date']] = array(); } $current[$leaveDate['date']][$entitlement->id] = $availableDays; } else { if (!isset($change[$leaveId])) { $change[$leaveId] = array(); } $change[$leaveId][$entitlement->id] = $availableDays; } $availableDays = 0; $getNextDate = false; } } } } else { $entitlement = array_shift($entitlements); if (is_null($entitlement)) { if (empty($leaveDates) && empty($leaveWithoutEntitlement) && $getNextDate) { $entitlementsOk = true; } } else { $availableDays = $entitlement->getAvailableDays(); } } } } $result = array('current' => $current, 'change' => $change); return $result; }
protected function linkLeaveToUnusedLeaveEntitlement(LeaveEntitlement $leaveEntitlement) { $balance = $leaveEntitlement->getNoOfDays() - $leaveEntitlement->getDaysUsed(); $entitlementId = $leaveEntitlement->getId(); if ($balance > 0) { $leaveList = $this->getLeaveWithoutEntitlements($leaveEntitlement->getEmpNumber(), $leaveEntitlement->getLeaveTypeId(), $leaveEntitlement->getFromDate(), $leaveEntitlement->getToDate()); $query = Doctrine_Query::create()->from('LeaveLeaveEntitlement l')->where('l.leave_id = ?')->andWhere('l.entitlement_id = ?'); foreach ($leaveList as $leave) { $daysLeft = $leave['days_left']; $leaveId = $leave['id']; $daysToAssign = $daysLeft > $balance ? $balance : $daysLeft; $leaveEntitlement->setDaysUsed($leaveEntitlement->getDaysUsed() - $daysToAssign); $balance -= $daysToAssign; // assign to leave $entitlementAssignment = $query->fetchOne(array($leaveId, $entitlementId)); if ($entitlementAssignment === false) { $entitlementAssignment = new LeaveLeaveEntitlement(); $entitlementAssignment->setLeaveId($leaveId); $entitlementAssignment->setEntitlementId($entitlementId); $entitlementAssignment->setLengthDays($daysToAssign); } else { $entitlementAssignment->setLengthDays($entitlementAssignment->getLengthDays() + $daysToAssign); } $entitlementAssignment->save(); $entitlementAssignment->free(); if ($balance <= 0) { break; } } } return $leaveEntitlement; }
/** * One entitlement with enough days but not enough available */ public function testGetAvailableEntitlementsOne211() { $empNumber = 1; $leaveType = 2; $leave1 = new Leave(); $leave1->fromArray(array('id' => NULL, 'date' => '2012-09-13', 'length_days' => 1)); $leave2 = new Leave(); $leave2->fromArray(array('id' => NULL, 'date' => '2012-09-14', 'length_days' => 1)); $leave3 = new Leave(); $leave3->fromArray(array('id' => NULL, 'date' => '2012-09-15', 'length_days' => 1)); $leave4 = new Leave(); $leave4->fromArray(array('id' => NULL, 'date' => '2012-09-16', 'length_days' => 1)); $leaveDates = array($leave1, $leave2, $leave3, $leave4); $entitlement1 = new LeaveEntitlement(); $entitlement1->setId(2); $entitlement1->setEmpNumber($empNumber); $entitlement1->setNoOfDays(5); $entitlement1->setDaysUsed(2); $entitlement1->setLeaveTypeId($leaveType); $entitlement1->setFromDate('2012-09-01'); $entitlement1->setToDate('2012-09-19'); $entitlement1->setCreditedDate('2012-05-01'); $entitlement1->setNote('Created by Unit test'); $entitlement1->setEntitlementType(LeaveEntitlement::ENTITLEMENT_TYPE_ADD); $entitlement1->setDeleted(0); $entitlements = array($entitlement1); $mockService = $this->getMock('LeaveEntitlementService', array('getValidLeaveEntitlements')); $mockService->expects($this->any())->method('getValidLeaveEntitlements')->with($empNumber, $leaveType, '2012-09-13', '2012-09-16', 'to_date', 'ASC')->will($this->returnValue(array_values($entitlements))); $this->strategy->setLeaveEntitlementService($mockService); $results = $this->strategy->getAvailableEntitlements($empNumber, $leaveType, $leaveDates); $this->assertTrue($results == false); }