public function testBulkAssignLeaveEntitlements()
 {
     $this->fixture = sfConfig::get('sf_plugins_dir') . '/orangehrmLeavePlugin/test/fixtures/LeaveEntitlement.yml';
     TestDataService::populate($this->fixture);
     $dao = new LeaveEntitlementDao();
     $limit = 5000;
     $empList = array();
     $employeeService = new EmployeeService();
     $employeeService->setEmployeeDao(new EmployeeDao());
     for ($i = 0; $i < $limit; $i++) {
         $employee = new Employee();
         $employee->setFirstName($i);
         $employee = $employeeService->saveEmployee($employee);
         array_push($empList, $employee->getEmpNumber());
     }
     $start_time = microtime(true);
     $leaveEntitlement = new LeaveEntitlement();
     $leaveEntitlement->setLeaveTypeId(1);
     $leaveEntitlement->setCreditedDate(date('Y-m-d'));
     $leaveEntitlement->setEntitlementType(LeaveEntitlement::ENTITLEMENT_TYPE_ADD);
     $leaveEntitlement->setDeleted(0);
     $leaveEntitlement->setNoOfDays(2);
     $leaveEntitlement->setFromDate('2012-01-01');
     $leaveEntitlement->setToDate('2012-08-01');
     $result = $dao->bulkAssignLeaveEntitlements($empList, $leaveEntitlement);
     $deference = microtime(true) - $start_time;
     $this->assertEquals(count($empList), $result, "Time Deference - " . $deference);
     echo "Add Entitlement 5000 Time " . $deference;
 }
 public function testDeleteLeaveEntitlements()
 {
     $ids = array(2, 33, 12);
     $leaveEntitlement1 = new LeaveEntitlement();
     $leaveEntitlement1->fromArray(array('id' => 2, 'emp_number' => 1, 'no_of_days' => 3, 'days_used' => 0));
     $leaveEntitlement2 = new LeaveEntitlement();
     $leaveEntitlement2->fromArray(array('id' => 33, 'emp_number' => 1, 'no_of_days' => 3, 'days_used' => 0));
     $leaveEntitlement3 = new LeaveEntitlement();
     $leaveEntitlement3->fromArray(array('id' => 12, 'emp_number' => 1, 'no_of_days' => 3, 'days_used' => 0));
     $leaveEntitlements = array($leaveEntitlement1, $leaveEntitlement2, $leaveEntitlement3);
     $mockDao = $this->getMock('LeaveEntitlementDao', array('deleteLeaveEntitlements', 'searchLeaveEntitlements'));
     $mockDao->expects($this->once())->method('deleteLeaveEntitlements')->with($ids)->will($this->returnValue(count($ids)));
     $mockDao->expects($this->once())->method('searchLeaveEntitlements')->will($this->returnValue($leaveEntitlements));
     $this->service->setLeaveEntitlementDao($mockDao);
     $result = $this->service->deleteLeaveEntitlements($ids);
     $this->assertEquals(count($ids), $result);
 }
 public function bulkAssignLeaveEntitlements($employeeNumbers, LeaveEntitlement $leaveEntitlement)
 {
     $conn = Doctrine_Manager::connection();
     $conn->beginTransaction();
     $pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
     try {
         $allEntitlements = array();
         $updateEmpList = array();
         $updateEntitlementIdList = array();
         $savedCount = 0;
         $leaveTypeId = $leaveEntitlement->getLeaveTypeId();
         $fromDate = $leaveEntitlement->getFromDate();
         $toDate = $leaveEntitlement->getToDate();
         $leaveEntitlementSearchParameterHolder = new LeaveEntitlementSearchParameterHolder();
         $leaveEntitlementSearchParameterHolder->setFromDate($fromDate);
         $leaveEntitlementSearchParameterHolder->setLeaveTypeId($leaveTypeId);
         $leaveEntitlementSearchParameterHolder->setToDate($toDate);
         $leaveEntitlementSearchParameterHolder->setEmpIdList($employeeNumbers);
         $leaveEntitlementSearchParameterHolder->setHydrationMode(Doctrine::HYDRATE_ARRAY);
         $entitlementList = $this->searchLeaveEntitlements($leaveEntitlementSearchParameterHolder);
         if (count($entitlementList) > 0) {
             foreach ($entitlementList as $updateEntitlement) {
                 $empNumber = $updateEntitlement['emp_number'];
                 if (!isset($allEntitlements[$empNumber])) {
                     $entitlement = new LeaveEntitlement();
                     $noOfDays = $leaveEntitlement->getNoOfDays();
                     $entitlement->setEmpNumber($empNumber);
                     $entitlement->setLeaveTypeId($leaveTypeId);
                     $entitlement->setCreditedDate($leaveEntitlement->getCreditedDate());
                     $entitlement->setCreatedById($leaveEntitlement->getCreatedById());
                     $entitlement->setCreatedByName($leaveEntitlement->getCreatedByName());
                     $entitlement->setEntitlementType($leaveEntitlement->getEntitlementType());
                     $entitlement->setDeleted(0);
                     $entitlement->setNoOfDays($leaveEntitlement->getNoOfDays());
                     $entitlement->setFromDate($fromDate);
                     $entitlement->setToDate($toDate);
                     $entitlement->setId($updateEntitlement['id']);
                     $allEntitlements[$empNumber] = $entitlement;
                     $updateEmpList[] = $updateEntitlement['emp_number'];
                     $updateEntitlementIdList[] = $updateEntitlement['id'];
                     $savedCount++;
                 }
             }
             $updateQuery = sprintf(" UPDATE ohrm_leave_entitlement SET no_of_days=no_of_days+ %d WHERE id IN (%s)", $leaveEntitlement->getNoOfDays(), implode(',', $updateEntitlementIdList));
             $updateStmt = $pdo->prepare($updateQuery);
             $updateStmt->execute();
         }
         $newEmployeeList = array_diff($employeeNumbers, $updateEmpList);
         if (count($newEmployeeList) > 0) {
             $query = " INSERT INTO ohrm_leave_entitlement(`emp_number`,`leave_type_id`,`from_date`,`to_date`,`no_of_days`,`entitlement_type`) VALUES " . "(?, ?, ?, ?, ?, ?)";
             $stmt = $pdo->prepare($query);
             foreach ($newEmployeeList as $empNumber) {
                 if (!isset($allEntitlements[$empNumber])) {
                     $entitlement = new LeaveEntitlement();
                     $noOfDays = $leaveEntitlement->getNoOfDays();
                     $entitlement->setEmpNumber($empNumber);
                     $entitlement->setLeaveTypeId($leaveEntitlement->getLeaveTypeId());
                     $entitlement->setCreditedDate($leaveEntitlement->getCreditedDate());
                     $entitlement->setCreatedById($leaveEntitlement->getCreatedById());
                     $entitlement->setCreatedByName($leaveEntitlement->getCreatedByName());
                     $entitlement->setEntitlementType($leaveEntitlement->getEntitlementType());
                     $entitlement->setDeleted(0);
                     $entitlement->setNoOfDays($noOfDays);
                     $entitlement->setFromDate($fromDate);
                     $entitlement->setToDate($toDate);
                     $params = array($empNumber, $leaveEntitlement->getLeaveTypeId(), $fromDate, $toDate, $noOfDays, LeaveEntitlement::ENTITLEMENT_TYPE_ADD);
                     $stmt->execute($params);
                     $entitlement->setId($pdo->lastInsertId());
                     $allEntitlements[$empNumber] = $entitlement;
                     $savedCount++;
                 }
             }
         }
         // If leave period is forced, we can bulk assign at once, because from and to date of
         // all leave entitlements will be the same
         $leavePeriodStatus = LeavePeriodService::getLeavePeriodStatus();
         if ($leavePeriodStatus == LeavePeriodService::LEAVE_PERIOD_STATUS_FORCED) {
             $this->bulkLinkLeaveToUnusedLeaveEntitlements($allEntitlements, $leaveTypeId, $fromDate, $toDate);
         } else {
             foreach ($allEntitlements as $leaveEntitlement) {
                 $this->linkLeaveToUnusedLeaveEntitlement($leaveEntitlement);
             }
         }
         $conn->commit();
         return $savedCount;
     } catch (Exception $e) {
         $conn->rollback();
         throw new DaoException($e->getMessage(), 0, $e);
     }
 }
 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 getLeaveEntitlement($values)
 {
     if (isset($values['filters']['bulk_assign'])) {
         $leaveEntitlement = new LeaveEntitlement();
         $leaveEntitlement->setNoOfDays($values['entitlement']);
     } else {
         if (isset($values['id'])) {
             $id = $values['id'];
             $leaveEntitlement = $this->getLeaveEntitlementService()->getLeaveEntitlement($id);
             $leaveEntitlement->setNoOfDays($values['entitlement']);
         } else {
             if (LeavePeriodService::getLeavePeriodStatus() == LeavePeriodService::LEAVE_PERIOD_STATUS_FORCED) {
                 $empNumber = $values['employee']['empId'];
                 $fromDate = $values['date']['from'];
                 $toDate = $values['date']['to'];
                 $leaveTypeId = $values['leave_type'];
                 $entitlementList = $this->getLeaveEntitlementService()->getMatchingEntitlements($empNumber, $leaveTypeId, $fromDate, $toDate);
                 if (count($entitlementList) > 0) {
                     $leaveEntitlement = $entitlementList->getFirst();
                     $newValue = $leaveEntitlement->getNoOfDays() + $values['entitlement'];
                     $leaveEntitlement->setNoOfDays($newValue);
                 } else {
                     $leaveEntitlement = new LeaveEntitlement();
                     $leaveEntitlement->setNoOfDays($values['entitlement']);
                 }
             } else {
                 $leaveEntitlement = new LeaveEntitlement();
                 $leaveEntitlement->setNoOfDays($values['entitlement']);
             }
         }
     }
     if (isset($values['employee']['empId'])) {
         $leaveEntitlement->setEmpNumber($values['employee']['empId']);
     }
     if (isset($values['leave_type'])) {
         $leaveEntitlement->setLeaveTypeId($values['leave_type']);
     }
     $user = $this->getUser();
     $userId = $user->getAttribute('auth.userId');
     $createdBy = $this->getUser()->getAttribute('auth.firstName');
     $leaveEntitlement->setCreditedDate(date('Y-m-d'));
     $leaveEntitlement->setCreatedById($userId);
     $leaveEntitlement->setCreatedByName($createdBy);
     $leaveEntitlement->setEntitlementType(LeaveEntitlement::ENTITLEMENT_TYPE_ADD);
     $leaveEntitlement->setDeleted(0);
     $leaveEntitlement->setNoOfDays(round($leaveEntitlement->getNoOfDays(), 2));
     $leaveEntitlement->setFromDate($values['date']['from']);
     $leaveEntitlement->setToDate($values['date']['to']);
     return $leaveEntitlement;
 }
 public function testBulkAssignLeaveEntitlementsLinkingOfUnlinkedLeave()
 {
     $empList = array(7);
     $leaveEntitlement = new LeaveEntitlement();
     $leaveEntitlement->setLeaveTypeId(1);
     $leaveEntitlement->setCreditedDate(date('Y-m-d'));
     $leaveEntitlement->setEntitlementType(LeaveEntitlement::ENTITLEMENT_TYPE_ADD);
     $leaveEntitlement->setDeleted(0);
     $leaveEntitlement->setNoOfDays(3);
     $leaveEntitlement->setFromDate('2014-01-01');
     $leaveEntitlement->setToDate('2014-12-31');
     $result = $this->dao->bulkAssignLeaveEntitlements($empList, $leaveEntitlement);
     $this->assertEquals(count($empList), $result);
     // verify unlinked leave is now linked
     $conn = Doctrine_Manager::connection()->getDbh();
     $statement = $conn->prepare('SELECT * FROM ohrm_leave_leave_entitlement e WHERE e.leave_id = ?');
     $leaveIds = array(11, 12);
     foreach ($leaveIds as $leaveId) {
         $this->assertTrue($statement->execute(array($leaveId)));
         $results = $statement->fetchAll();
         $this->assertEquals(1, count($results));
         $this->assertEquals($leaveId, $results[0]['leave_id']);
         $this->assertEquals(1, $results[0]['length_days']);
     }
 }
 public function testHandleLeaveStatusChangeOneEntitlementExtra()
 {
     $empNumber = 1;
     $leaveType = 2;
     $leave1 = new Leave();
     $leave1->fromArray(array('id' => NULL, 'date' => '2012-09-11', 'length_days' => 1));
     $leave2 = new Leave();
     $leave2->fromArray(array('id' => NULL, 'date' => '2012-09-12', 'length_days' => 1));
     $leaveDates = array($leave1, $leave2);
     $entitlement1 = new LeaveEntitlement();
     $entitlement1->fromArray(array('id' => 6, 'emp_number' => 1, 'no_of_days' => 4, 'days_used' => 1, 'leave_type_id' => 2, 'from_date' => '2012-09-10', 'to_date' => '2012-09-14', 'credited_date' => '2012-05-01', 'note' => 'Created by Unit test', 'entitlement_type' => LeaveEntitlement::ENTITLEMENT_TYPE_ADD, 'deleted' => 0));
     $entitlements = array($entitlement1);
     $mockService = $this->getMock('LeaveEntitlementService', array('getValidLeaveEntitlements'));
     $mockService->expects($this->once())->method('getValidLeaveEntitlements')->with($empNumber, $leaveType, '2012-09-11', '2012-09-12', 'from_date', 'ASC')->will($this->returnValue($entitlements));
     $this->strategy->setLeaveEntitlementService($mockService);
     // Apply, $allowNoEntitlements = false
     $results = $this->strategy->handleLeaveCreate($empNumber, $leaveType, $leaveDates);
     $expected = array('current' => array('2012-09-11' => array(6 => 1), '2012-09-12' => array(6 => 1)), 'change' => array());
     $this->assertEquals($expected, $results);
 }