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);
 }