From 217996d535f7de572021dfa6b67bb01667614de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 14 Mar 2024 12:18:08 +0100 Subject: [PATCH] feat: complete confirmed dispositions after assignment has ended --- src/Command/CronCommand.php | 7 ++- src/Repository/DispositionRepository.php | 29 ++++++++++++ src/Security/Voter/DispositionVoter.php | 6 +-- src/Service/Cron/DispositionStatusService.php | 44 +++++++++++++++++++ 4 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 src/Service/Cron/DispositionStatusService.php diff --git a/src/Command/CronCommand.php b/src/Command/CronCommand.php index fac1525..3674ea3 100644 --- a/src/Command/CronCommand.php +++ b/src/Command/CronCommand.php @@ -2,6 +2,7 @@ namespace App\Command; +use App\Service\Cron\DispositionStatusService; use App\Service\Cron\FeedbackReminderService; use App\Service\Cron\FlushLogsService; use App\Service\Cron\UploadReminderService; @@ -20,7 +21,8 @@ class CronCommand extends Command public function __construct( private readonly FlushLogsService $flushLogsService, private readonly UploadReminderService $uploadReminderService, - private readonly FeedbackReminderService $feedbackReminderService + private readonly FeedbackReminderService $feedbackReminderService, + private readonly DispositionStatusService $dispositionStatusService ) { parent::__construct(); } @@ -45,6 +47,9 @@ class CronCommand extends Command $message = $this->feedbackReminderService->sendFeedbackReminders(); $io->info($message); + $message = $this->dispositionStatusService->setEndedStatus(); + $io->info($message); + return Command::SUCCESS; } } diff --git a/src/Repository/DispositionRepository.php b/src/Repository/DispositionRepository.php index b287fcf..483e575 100644 --- a/src/Repository/DispositionRepository.php +++ b/src/Repository/DispositionRepository.php @@ -208,4 +208,33 @@ class DispositionRepository extends ServiceEntityRepository ->getResult() ; } + + /** + * @return Disposition[]|array + */ + public function findEndedDispositions(): array + { + $qb = $this->createQueryBuilder('disposition'); + + return $qb + ->innerJoin('disposition.assignment', 'assignment') + ->innerJoin('assignment.destination', 'destination') + ->where($qb->expr()->andX( + $qb->expr()->neq('disposition.status', ':status'), + $qb->expr()->orX( + $qb->expr()->andX( + $qb->expr()->isNotNull('assignment.dateTo'), + $qb->expr()->lte('assignment.dateTo', ':dateTo') + ), + $qb->expr()->lte('destination.dateTo', ':dateTo') + ) + )) + ->setParameters([ + 'status' => Disposition::STATUS_COMPLETED, + 'dateTo' => new \DateTimeImmutable(), + ]) + ->getQuery() + ->getResult() + ; + } } diff --git a/src/Security/Voter/DispositionVoter.php b/src/Security/Voter/DispositionVoter.php index 947b8e8..bf269f8 100644 --- a/src/Security/Voter/DispositionVoter.php +++ b/src/Security/Voter/DispositionVoter.php @@ -46,7 +46,7 @@ class DispositionVoter extends Voter $disposition = $subject; return match ($attribute) { - static::VIEW, static::EDIT, static::CONTRACT, static::INVOICE => $this->assertAdministrativeAccess() || $this->assertTeamerAccess($token, $disposition), + static::VIEW, static::EDIT, static::CONTRACT, static::INVOICE => $this->assertAdministrativeAccess() || $this->assertTeamerAccess($disposition), static::DELETE => $this->assertAdminAccess(), static::FEEDBACK => $this->assertHouseManagerAccess($token, $disposition), default => false, @@ -85,12 +85,12 @@ class DispositionVoter extends Voter && $destination->getDateTo() < new \DateTimeImmutable(); } - private function assertTeamerAccess(TokenInterface $token, Disposition $disposition): bool + private function assertTeamerAccess(Disposition $disposition): bool { if (false === $this->security->isGranted('ROLE_TEAMER')) { return false; } - return $token->getUser()->getTeamer() === $disposition->getTeamer(); + return $this->security->getUser()->getTeamer() === $disposition->getTeamer(); } } \ No newline at end of file diff --git a/src/Service/Cron/DispositionStatusService.php b/src/Service/Cron/DispositionStatusService.php new file mode 100644 index 0000000..6979e6e --- /dev/null +++ b/src/Service/Cron/DispositionStatusService.php @@ -0,0 +1,44 @@ +entityManager + ->getRepository(Disposition::class)->findEndedDispositions() + ; + + if (0 === $count = count($endedDispositions)) { + return 'No ended dispositions to update'; + } + + foreach ($endedDispositions as $disposition) { + if ($this->dispositionStateMachine->can($disposition, 'complete')) { + $this->dispositionStateMachine->apply($disposition, 'complete'); + } + } + + $this->entityManager->flush(); + + $message = 'Ended '.$count.' dispositions'; + + $this->logger->info($message); + + return $message; + } +} \ No newline at end of file