/** * 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; }
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); }
/** * 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); }