public function changeLeaveStatus(Leave $leave, $entitlementChanges, $removeLinkedEntitlements = false) { $conn = Doctrine_Manager::connection(); $conn->beginTransaction(); try { if ($removeLinkedEntitlements) { $leaveId = $leave->getId(); $stmt = $conn->prepare("UPDATE ohrm_leave_leave_entitlement le LEFT JOIN ohrm_leave_entitlement e " . "on e.id = le.entitlement_id " . "SET e.days_used = IF(e.days_used<le.length_days,0,e.days_used - le.length_days) " . "WHERE le.leave_id = ?"); $stmt->execute(array($leaveId)); Doctrine_Query::create()->delete()->from('LeaveLeaveEntitlement l')->where('l.leave_id = ?', $leaveId)->execute(); } $leave->save(); if (isset($entitlementChanges['change'])) { // TODO: Need to update days_used here // Also need to check if we need to delete all entitlements or only have changes $changes = $entitlementChanges['change']; foreach ($changes as $leaveId => $change) { $updateSql = ''; $idList = ''; $separator = ''; foreach ($change as $entitlementId => $length) { $idList .= $separator . $entitlementId; $updateSql .= sprintf(' WHEN e.id = %d THEN e.days_used + %f', $entitlementId, $length); $separator = ','; $entitlementAssignment = Doctrine_Query::create()->from('LeaveLeaveEntitlement l')->where('l.leave_id = ?', $leaveId)->andWhere('l.entitlement_id = ?', $entitlementId)->fetchOne(); if ($entitlementAssignment === false) { $entitlementAssignment = new LeaveLeaveEntitlement(); $entitlementAssignment->setLeaveId($leaveId); $entitlementAssignment->setEntitlementId($entitlementId); $entitlementAssignment->setLengthDays($length); } else { $entitlementAssignment->setLengthDays($entitlementAssignment->getLengthDays() + $length); } $entitlementAssignment->save(); } if ($updateSql != '') { $query = "UPDATE ohrm_leave_entitlement e " . "SET e.days_used = CASE " . $updateSql . " END " . sprintf(" WHERE e.id IN (%s)", $idList); $conn->execute($query); } } } $conn->commit(); return true; } catch (DaoException $e) { $conn->rollback(); throw new DaoException($e->getMessage(), 0, $e); } }
protected function compareLeave(Leave $expected, Leave $result) { $this->assertTrue($result instanceof Leave); $expectedId = $expected->getId(); if (!empty($expectedId)) { $this->assertEquals($expectedId, $result->getId()); } else { $leaveId = $result->getId(); $this->assertTrue(!empty($leaveId)); } $this->assertEquals($expected->getLeaveTypeId(), $result->getLeaveTypeId()); $this->assertEquals($expected->getDate(), $result->getDate()); $this->assertEquals($expected->getEmpNumber(), $result->getEmpNumber()); $this->assertEquals($expected->getComments(), $result->getComments()); $this->assertEquals($expected->getLengthHours(), $result->getLengthHours()); $this->assertEquals($expected->getLengthDays(), $result->getLengthDays()); $this->assertEquals($expected->getStatus(), $result->getStatus()); $this->assertEquals($expected->getLeaveRequestId(), $result->getLeaveRequestId()); }