Example #1
0
 /**
  * Renueva el alquiler.
  *
  * @param Rental $rental
  *
  * @return Rental
  */
 public function renewRental(Rental $rental)
 {
     if ($rental->getReturnAt()) {
         throw new FinishedRentalException();
     }
     if ($rental->getUser()->getIsPenalized()) {
         throw new PenalizedUserException();
     }
     if ($rental->getUser()->getFaculty()->getIsEnabled() === false) {
         throw new PenalizedFacultyException();
     }
     if (!$rental->getIsRenewable()) {
         throw new NotRenewableRentalException();
     }
     if ($rental->getIsExpired()) {
         throw new ExpiredRentalException();
     }
     if ($rental->getDaysLeft() > $this->days_before_renovation) {
         throw new TooEarlyRenovationException();
     }
     $left = $rental->getDaysLeft() + $this->days_length_rental;
     $rental->setEndAt(new \DateTime($left . ' days midnight'));
     $this->manager->persist($rental);
     $this->manager->flush();
     $event = new RentalEvent($rental);
     $this->dispatcher->dispatch(RentalEvents::LOCKER_RENEWED, $event);
     return $rental;
 }
Example #2
0
 private function canRent(Rental $rental, User $user)
 {
     if ($rental->getUser() != $user) {
         return false;
     }
     if ($rental->getReturnAt()) {
         return false;
     }
     if ($user->getIsPenalized()) {
         return false;
     }
     if ($user->getFaculty()->getIsEnabled() === false) {
         return false;
     }
     if (!$rental->getIsRenewable()) {
         return false;
     }
     if ($rental->getIsExpired()) {
         return false;
     }
     if ($rental->getDaysLeft() > $this->days_before_renovation) {
         return false;
     }
     return true;
 }
 public function let(ContainerInterface $container, Config $config, Locker $locker, Rental $rental, RentalRepository $rentalRepository, TimePenaltyRepository $timePenaltyRepository, User $user)
 {
     $container->get('craue_config')->willReturn($config);
     $container->get('seta.repository.time_penalty')->willReturn($timePenaltyRepository);
     $container->get('seta.repository.rental')->willReturn($rentalRepository);
     $rental->getUser()->willReturn($user);
     $rental->getLocker()->willReturn($locker);
     $rental->getIsRenewable()->willReturn(true);
     $locker->getCode()->willReturn('100');
     $user->getEmail()->willReturn('*****@*****.**');
     $user->getUsername()->willReturn('*****@*****.**');
 }
 public function it_can_return_a_locker_after_due_date(Locker $locker, Rental $rental, EntityManager $manager, EventDispatcherInterface $dispatcher, TimePenaltyService $penaltyService)
 {
     $rental->getDaysLate()->shouldBeCalled()->willReturn(1);
     $rental->setReturnAt(Argument::type(\DateTime::class))->shouldBeCalled();
     $penaltyService->penalizeRental($rental)->shouldBeCalled();
     $locker->setOwner(null)->shouldBeCalled();
     $locker->setStatus(Locker::AVAILABLE)->shouldBeCalled();
     $manager->persist($rental)->shouldBeCalled();
     $manager->persist($locker)->shouldBeCalled();
     $manager->flush()->shouldBeCalled();
     $dispatcher->dispatch(RentalEvents::LOCKER_RETURNED, Argument::type(RentalEvent::class))->shouldBeCalled();
     $this->returnRental($rental);
 }
 /**
  * @param Rental $rental
  */
 public function penalizeRental(Rental $rental)
 {
     $comment = 'Penalización automática por retraso al entregar la taquilla ' . $rental->getLocker()->getCode();
     /** @var FinancialPenalty $penalty */
     $penalty = $this->penaltyRepository->createNew();
     $penalty->setUser($rental->getUser());
     $penalty->setAmount($this->amount);
     $penalty->setComment($comment);
     $penalty->setRental($rental);
     $this->manager->persist($penalty);
     $this->manager->flush();
     $event = new PenaltyEvent($penalty);
     $this->dispatcher->dispatch(PenaltyEvents::PENALTY_CREATED, $event);
 }
 /**
  * Calcula la fecha de finalización de la sanción.
  *
  * @param Rental $rental
  *
  * @return \DateTime
  */
 public function calculatePenalty(Rental $rental)
 {
     $late = $rental->getDaysLate();
     if ($late === 0) {
         throw new NotExpiredRentalException();
     }
     if ($late >= $this->days_before_suspension) {
         $end = TimePenalty::getEndSeasonPenalty();
     } else {
         $time = $late * 7;
         $end = new \DateTime($time . ' days midnight');
     }
     return $end;
 }
 public function it_can_add_a_penalty_from_a_rent(EventDispatcherInterface $dispatcher, ObjectManager $manager, Locker $locker, FinancialPenalty $penalty, FinancialPenaltyRepository $penaltyRepository, Rental $rental, User $user)
 {
     $rental->getLocker()->shouldBeCalled();
     $locker->getCode()->shouldBeCalled();
     $comment = 'Penalización automática por retraso al entregar la taquilla 100';
     $rental->getUser()->shouldBeCalled();
     $penaltyRepository->createNew()->shouldBeCalled()->willReturn($penalty);
     $penalty->setUser($user)->shouldBeCalled();
     $penalty->setAmount($this->amount)->shouldBeCalled();
     $penalty->setComment($comment)->shouldBeCalled();
     $penalty->setRental($rental)->shouldBeCalled();
     $manager->persist($penalty)->shouldBeCalled();
     $manager->flush()->shouldBeCalled();
     $dispatcher->dispatch(PenaltyEvents::PENALTY_CREATED, Argument::type(PenaltyEvent::class))->shouldBeCalled();
     $this->penalizeRental($rental);
 }
Example #8
0
 /**
  * Return a Rental.
  *
  * @param Rental $rental
  */
 public function returnRental(Rental $rental)
 {
     if ($rental->getReturnAt()) {
         throw new FinishedRentalException();
     }
     if ($rental->getDaysLate() > 0) {
         $this->penaltyService->penalizeRental($rental);
     }
     $now = new \DateTime('now');
     $rental->setReturnAt($now);
     $locker = $rental->getLocker();
     $locker->setOwner(null);
     $locker->setStatus(Locker::AVAILABLE);
     $this->manager->persist($rental);
     $this->manager->persist($locker);
     $this->manager->flush();
     $event = new RentalEvent($rental);
     $this->dispatcher->dispatch(RentalEvents::LOCKER_RETURNED, $event);
 }
 public function it_can_calculate_penalty(Rental $rental)
 {
     $rental->getDaysLate()->shouldBeCalled();
     $this->calculatePenalty($rental)->shouldBeLike(new \DateTime('14 days midnight'));
 }
 public function it_cannot_renew_expired_rental(Rental $rental)
 {
     $rental->getIsExpired()->shouldBeCalled()->willReturn(true);
     $this->shouldThrow(ExpiredRentalException::class)->duringRenewRental($rental);
 }