/** * {@inheritDoc} */ public function doLoad(ObjectManager $manager) { // Test for required leaveRequestss references first if (!$this->hasReference('admin') || !$this->hasReference('user') || !$this->hasReference('generalManager')) { throw new \RuntimeException('Mass leave request fixtures require user fixtures.'); } $service = $this->container->get('opit.model.leave_request'); $admin = $this->getReference('admin'); // Create Datetimes. $startDate = new \DateTime(date('Y-12-24')); $endDate = new \DateTime(date('Y-01-01')); $endDate->modify('+1 year'); // Notice: The service is based on LeaveDatesFixtures, ensure current year's public holidays are present. $days = $service->countLeaveDays($startDate, $endDate); // Create leave $leave = new Leave(); $leave->setDescription('Christmas vacation'); $leave->setStartDate($startDate); $leave->setEndDate($endDate); $leave->setNumberOfDays($days); $leave->setCategory($this->getReference('leave-category-full-day')); // Create leave request group. $leaveRequestGroup = new LeaveRequestGroup(); $manager->persist($leaveRequestGroup); // Create First LeaveRequest. $leaveRequest1 = new LeaveRequest(); $leaveRequest1->setEmployee($admin->getEmployee()); $leaveRequest1->setCreatedUser($this->getReference('generalManager')); $leaveRequest1->setGeneralManager($this->getReference('generalManager')); $leaveRequest1->setIsMassLeaveRequest(false); $leaveRequest1->setLeaveRequestGroup($leaveRequestGroup); $leaveRequest1->addLeaf($leave); // Create mass leave request, persist first. $massLeaveRequest = clone $leaveRequest1; $massLeaveRequest->setEmployee($this->getReference('generalManager')->getEmployee()); $massLeaveRequest->setCreatedUser($this->getReference('generalManager')); $massLeaveRequest->setIsMassLeaveRequest(true); $massLeaveRequest->setLeaveRequestGroup($leaveRequestGroup); $massLeaveRequest->addLeaf(clone $leave); $manager->persist($massLeaveRequest); // Add leave request states $leaveRequest1Status = new StatesLeaveRequests($this->getReference('approved')); $leaveRequest1Status->setCreated(new \DateTime()); $leaveRequest1Status->setCreatedUser($this->getReference('generalManager')); $leaveRequest1->addState($leaveRequest1Status); $manager->persist($leaveRequest1); // Create Second leave request. $leaveRequest2 = clone $leaveRequest1; $leaveRequest2->setEmployee($this->getReference('user')->getEmployee()); $leaveRequest2->setCreatedUser($this->getReference('generalManager')); $leaveRequest2->setIsMassLeaveRequest(false); $leaveRequest2->setLeaveRequestGroup($leaveRequestGroup); $leaveRequest2->addLeaf(clone $leave); $leaveRequest2->addState(clone $leaveRequest1Status); $manager->persist($leaveRequest2); $manager->flush(); }
public function postPersist(LifecycleEventArgs $args) { $entity = $args->getEntity(); $entityManager = $args->getEntityManager(); if ($entity instanceof LeaveRequest) { $leaveRequestId = str_replace(array('{year}', '{id}'), array(date('y'), sprintf('%05d', $entity->getId())), LeaveRequest::getIDPattern()); $entity->setLeaveRequestId($leaveRequestId); $entityManager->persist($entity); $entityManager->flush(); } }
/** * * @param \Opit\OpitHrm\LeaveBundle\Entity\LeaveRequest $resource * @param boolean $toGeneralManager * @param \Opit\OpitHrm\StatusBundle\Entity\Status $status */ public function addNewLeaveNotification(LeaveRequest $resource, $toGeneralManager, Status $status) { // get last status name from resource $resourceStatus = strtolower($status->getName()); $message = $resource->getLeaveRequestId(); if (strpos('approved', $resourceStatus) !== false || strpos('rejected', $resourceStatus) !== false) { $message .= ' has been ' . $resourceStatus; $message = ucfirst($message); } else { $message .= ' changed to ' . $resourceStatus; } $message .= ' for ' . $resource->getEmployee()->getEmployeeName() . '.'; $receiver = false === $toGeneralManager ? $this->entityManager->getRepository('OpitOpitHrmUserBundle:User')->findOneByEmployee($resource->getEmployee()) : $resource->getGeneralManager(); $notification = new LRNotification(); $notification->setLeaveRequest($resource); $notification->setMessage($message); $notification->setReceiver($receiver); $notification->setDateTime(new \DateTime('now')); $this->setNotificationStatus($notification); $this->entityManager->persist($notification); // Send notifications to additional recipients if status is set to approved if ($status->getId() === Status::APPROVED) { if ($teamManager = $resource->getTeamManager()) { $notificationsTM = clone $notification; $notificationsTM->setReceiver($teamManager); $this->entityManager->persist($notificationsTM); } $ccRecipients = $this->entityManager->getRepository('OpitOpitHrmUserBundle:Employee')->findNotificationRecipients($receiver); $notifications = array(); foreach ($ccRecipients as $i => $employee) { $notifications[$i] = clone $notification; $notifications[$i]->setReceiver($employee->getUser()); $this->entityManager->persist($notifications[$i]); } } $this->entityManager->flush(); }
/** * Method to check if the status of a leave request can be changed * * @param \Symfony\Component\Security\Core\User\UserInterface $user * @param \Opit\OpitHrm\LeaveBundle\Entity\LeaveRequest $leaveRequest * @param type $isAdmin * @param type $isGeneralManager * @param type $leaveRequestStatusId * @return type */ protected function isLRStatusChangeable(UserInterface $user, $leaveRequest, $isAdmin, $isGeneralManager, $leaveRequestStatusId) { if (null === $leaveRequest->getId()) { return VoterInterface::ACCESS_DENIED; } if (in_array($leaveRequestStatusId, array(Status::APPROVED, Status::REJECTED))) { return VoterInterface::ACCESS_DENIED; } // If user is admin and status of lr is not approved allow status change if ($isAdmin) { return VoterInterface::ACCESS_GRANTED; } elseif ($isGeneralManager) { // Check if general manager is owner of leave request if ($user->getEmployee() === $leaveRequest->getEmployee()) { return VoterInterface::ACCESS_GRANTED; } else { // If user is gm only allow status change when lr status is for approval if (Status::FOR_APPROVAL === $leaveRequestStatusId) { return VoterInterface::ACCESS_GRANTED; } } } elseif ($user->getEmployee() === $leaveRequest->getEmployee()) { // If user is assigned employee and status is created or revice allow status change if (in_array($leaveRequestStatusId, array(Status::CREATED, Status::REVISE))) { return VoterInterface::ACCESS_GRANTED; } } return VoterInterface::ACCESS_DENIED; }
/** * Removes related leave request leave instances. * * @param \Opit\OpitHrm\LeaveBundle\Entity\LeaveRequest $leaveRequest * @param ArrayCollection $children */ public function removeChildNodes(LeaveRequest $leaveRequest, $children) { foreach ($children as $child) { if (false === $leaveRequest->getLeaves()->contains($child)) { $child->setLeaveRequest(); $this->entityManager->remove($child); } } }
/** * {@inheritDoc} */ public function doLoad(ObjectManager $manager) { // Test for required user/status references first if (!$this->hasReference('admin') || !$this->hasReference('created')) { throw new \RuntimeException('Leave request fixtures require user/status bundle fixtures.'); } $service = $this->container->get('opit.model.leave_request'); // First leave request $admin = $this->getReference('admin'); $leaveRequest1 = new LeaveRequest(); $leaveRequest1->setEmployee($admin->getEmployee()); $leaveRequest1->setGeneralManager($this->getReference('generalManager')); $leaveRequest1->setCreatedUser($admin); // Add Leaves $startDate = new \DateTime(date('Y-01-01')); $startDate->modify('next monday'); $endDate = clone $startDate; $endDate->add(new \DateInterval('P4D')); // Notice: The service is based on LeaveDatesFixtures, ensure current year's public holidays are present. $days = $service->countLeaveDays($startDate, $endDate); $leave1 = new Leave(); $leave1->setDescription('Winter vacation'); $leave1->setStartDate($startDate); $leave1->setEndDate($endDate); $leave1->setNumberOfDays($days); $leave1->setCategory($this->getReference('leave-category-full-day')); $leaveRequest1->addLeaf($leave1); // Fake the state times $createdDateTime = new \DateTime(); $createdDateTime->modify('last year dec last weekday'); $createdDateTime->setTime('09', '45', '00'); $forApprovalDateTime = clone $createdDateTime; $forApprovalDateTime->add(new \DateInterval('PT1H')); $approvedDateTime = clone $forApprovalDateTime; $approvedDateTime->modify('next weekday 16:13:00'); // Add leave request states $leaveRequest1Status = new StatesLeaveRequests($this->getReference('created')); $leaveRequest1Status->setCreated($createdDateTime); $leaveRequest1Status->setCreatedUser($admin); $leaveRequest1->addState($leaveRequest1Status); $leaveRequest2Status = new StatesLeaveRequests($this->getReference('forApproval')); $leaveRequest2Status->setCreated($forApprovalDateTime); $leaveRequest2Status->setCreatedUser($admin); $leaveRequest1->addState($leaveRequest2Status); $leaveRequest3Status = new StatesLeaveRequests($this->getReference('approved')); $leaveRequest3Status->setCreated($approvedDateTime); $leaveRequest3Status->setCreatedUser($this->getReference('generalManager')); $leaveRequest1->addState($leaveRequest3Status); $manager->persist($leaveRequest1); // Second leave request $user = $this->getReference('user'); $leaveRequest2 = new LeaveRequest(); $leaveRequest2->setEmployee($user->getEmployee()); $leaveRequest2->setGeneralManager($this->getReference('generalManager')); $leaveRequest2->setCreatedUser($user); // Add Leaves $startDate = new \DateTime(); $startDate->modify('next month monday'); $endDate = clone $startDate; $endDate->add(new \DateInterval('P4D')); $days = $service->countLeaveDays($startDate, $endDate); $leave2 = new Leave(); $leave2->setDescription('Family event'); $leave2->setStartDate($startDate); $leave2->setEndDate($endDate); $leave2->setNumberOfDays($days); $leave2->setCategory($this->getReference('leave-category-full-day')); $leaveRequest2->addLeaf($leave2); // Fake the state times $createdDateTime = new \DateTime(); $forApprovalDateTime = clone $createdDateTime; $forApprovalDateTime->add(new \DateInterval('PT15M')); // Add leave request states $leaveRequest4Status = new StatesLeaveRequests($this->getReference('created')); $leaveRequest4Status->setCreated($createdDateTime); $leaveRequest4Status->setCreatedUser($user); $leaveRequest2->addState($leaveRequest4Status); $leaveRequest5Status = new StatesLeaveRequests($this->getReference('forApproval')); $leaveRequest5Status->setCreated($forApprovalDateTime); $leaveRequest5Status->setCreatedUser($user); $leaveRequest2->addState($leaveRequest5Status); $manager->persist($leaveRequest2); // Third leave request, same user $leaveRequest3 = new LeaveRequest(); $leaveRequest3->setEmployee($user->getEmployee()); $leaveRequest3->setGeneralManager($this->getReference('generalManager')); $leaveRequest3->setCreatedUser($user); $startDate = new \DateTime(); $startDate->modify('last week monday'); $endDate = clone $startDate; $endDate->add(new \DateInterval('P2D')); $days = $service->countLeaveDays($startDate, $endDate); $leave3 = new Leave(); $leave3->setDescription('Cold'); $leave3->setStartDate($startDate); $leave3->setEndDate($endDate); $leave3->setNumberOfDays($days); $leave3->setCategory($this->getReference('leave-category-sick-leave')); $leaveRequest3->addLeaf($leave3); // Fake the state times $createdDateTime = clone $endDate; $createdDateTime->modify('next weekday'); // Add leave request states $leaveRequest6Status = new StatesLeaveRequests($this->getReference('created')); $leaveRequest6Status->setCreated($createdDateTime); $leaveRequest6Status->setCreatedUser($user); $leaveRequest3->addState($leaveRequest6Status); $manager->persist($leaveRequest3); $manager->flush(); }
/** * Check if leave category can be selected using the left to availed days, * add error message to leave category if days left to avail were exceeded. * * @param \Opit\OpitHrm\UserBundle\Entity\Employee $employee * @param \Opit\OpitHrm\LeaveBundle\Entity\LeaveRequest $leaveRequest * @param \Opit\OpitHrm\LeaveBundle\Model\LeaveRequestService $leaveRequestService * @param \Doctrine\ORM\EntityManagerInterface $entityManager * @param type $form */ protected function validateLeaveDatesCategory(LeaveRequest $leaveRequest, LeaveRequestService $leaveRequestService, EntityManagerInterface $entityManager, $form) { $leaveCalculationService = $this->get('opit_opithrm_leave.leave_calculation_service'); $employee = $leaveRequest->getEmployee(); // Leave entitlements of an employee. $leaveEntitlement = $leaveCalculationService->leaveDaysCalculationByEmployee($employee); // Availed leave days of an employee. $employeeAvailedLeaveDays = $entityManager->getRepository('OpitOpitHrmLeaveBundle:LeaveRequest')->totalCountedLeaveDays($employee->getId()); // Left to avail days of an employee. $leftToAvail = $leaveEntitlement - $employeeAvailedLeaveDays; $countLeaveDays = 0; $leaves = $leaveRequest->getLeaves(); $message = 'Entitlement exceeded - kindly change category'; // Loop through all leaves employee has posted. foreach ($leaves as $index => $leave) { if (LeaveCategory::UNPAID !== $leave->getCategory()->getName()) { $countLeaveDays += $leaveRequestService->countLeaveDays($leave->getStartDate(), $leave->getEndDate()); // Check if count of leave days are more than days left to avail. if ($countLeaveDays > $leftToAvail) { // If there are days left to avail if ($leftToAvail > 0) { // Add error to leave category $form->get('leaves')->get($index)->get('category')->addError(new FormError($message . ' or dates.')); $leftToAvail = 0; } // Add error to leave category $form->get('leaves')->get($index)->get('category')->addError(new FormError($message . '.')); } } } }
/** * Add leaveRequests * * @param \Opit\OpitHrm\LeaveBundle\Entity\LeaveRequest $leaveRequests * @return Employee */ public function addLeaveRequest(\Opit\OpitHrm\LeaveBundle\Entity\LeaveRequest $leaveRequests) { $this->leaveRequests[] = $leaveRequests; $leaveRequests->setEmployee($this); // synchronously updating inverse side return $this; }