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 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']); } }
/** * Two entitlements, first one not enough. Verify assigned first to earlier expiring entitlement and the rest to the * next entitlement */ public function testGetAvailableEntitlementsTwo1() { $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(6); $entitlement1->setEmpNumber(1); $entitlement1->setNoOfDays(2); $entitlement1->setLeaveTypeId(2); $entitlement1->setFromDate('2012-09-11'); $entitlement1->setToDate('2012-09-15'); $entitlement1->setCreditedDate('2012-05-01'); $entitlement1->setNote('Created by Unit test'); $entitlement1->setEntitlementType(LeaveEntitlement::ENTITLEMENT_TYPE_ADD); $entitlement1->setDeleted(0); $entitlement2 = new LeaveEntitlement(); $entitlement2->setId(2); $entitlement2->setEmpNumber(1); $entitlement2->setNoOfDays(4); $entitlement2->setLeaveTypeId(2); $entitlement2->setFromDate('2012-09-12'); $entitlement2->setToDate('2012-09-18'); $entitlement2->setCreditedDate('2012-05-01'); $entitlement2->setNote('Created by Unit test'); $entitlement2->setEntitlementType(LeaveEntitlement::ENTITLEMENT_TYPE_ADD); $entitlement2->setDeleted(0); $entitlements = array($entitlement1, $entitlement2); $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($entitlements)); $this->strategy->setLeaveEntitlementService($mockService); $results = $this->strategy->getAvailableEntitlements($empNumber, $leaveType, $leaveDates); $this->assertTrue($results !== false); $current = array_combine(array('2012-09-13', '2012-09-14', '2012-09-15', '2012-09-16'), array(array(6 => 1), array(6 => 1), array(2 => 1), array(2 => 1))); $changes = array(); $this->verifyEntitlements($results, $current, $changes); }