diff --git a/src/Controller/Administrative/Disposition/DocumentUploadController.php b/src/Controller/Administrative/Disposition/DocumentUploadController.php index e090c1a..ee4ed11 100644 --- a/src/Controller/Administrative/Disposition/DocumentUploadController.php +++ b/src/Controller/Administrative/Disposition/DocumentUploadController.php @@ -10,12 +10,10 @@ use App\Service\Upload\UploadHandler; use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\DependencyInjection\Attribute\Target; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Security\Http\Attribute\IsGranted; -use Symfony\Component\Workflow\WorkflowInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; class DocumentUploadController extends AbstractController @@ -23,8 +21,6 @@ class DocumentUploadController extends AbstractController public function __construct( private readonly UploadHandler $uploadHandler, private readonly EntityManagerInterface $entityManager, - #[Target('disposition')] - private readonly WorkflowInterface $workflow, private readonly EventDispatcherInterface $eventDispatcher, private readonly LoggerInterface $logger, ) { @@ -34,48 +30,35 @@ class DocumentUploadController extends AbstractController path: '/administrative/disposition/document-upload/{uuid}', name: 'app_administrative_disposition_document_upload' )] - #[IsGranted('ROLE_ADMINISTRATIVE')] + #[IsGranted('CONTRACT_SUPPLEMENTARY', subject: 'disposition')] public function index(Disposition $disposition, Request $request): Response { - if (true === $this->workflow->can($disposition, 'upload_contract')) { - $uploadType = Upload::TYPE_CONTRACT; - $uploadTypeLabel = 'Honorarvertrag'; - $uploaderRoute = '_uploader_upload_contract'; - } elseif (true === $this->workflow->can($disposition, 'upload_invoice')) { - $uploadType = Upload::TYPE_INVOICE; - $uploadTypeLabel = 'Honoranote'; - $uploaderRoute = '_uploader_upload_invoice'; - } else { - $this->addFlash('error', 'Kein Upload möglich beim aktuellen Status der Einteilung'); - - return $this->getRedirectResponse($disposition); - } - $teamer = $disposition->getTeamer(); - $modalTitle = sprintf('%s für %s hochladen', $uploadTypeLabel, $teamer); + $modalTitle = sprintf('Honorarvertrag für %s hochladen', $teamer); $form = $this->createFormBuilder()->getForm(); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $this->processUpload($disposition, $uploadType); + $this->processUpload($disposition); - $this->addFlash('success', sprintf('%s wurde hochgeladen', $uploadTypeLabel)); + $this->addFlash('success', 'Der Honorarvertrag wurde hochgeladen'); - return $this->getRedirectResponse($disposition); + return new HxRedirectResponse($this->generateUrl('app_administrative_assignment_detail', [ + 'uuid' => $disposition->getAssignment()->getUuid(), + ])); } return $this->render('administrative/disposition/modal_document_upload.html.twig', [ 'disposition' => $disposition, 'modalTitle' => $modalTitle, - 'uploaderRoute' => $uploaderRoute, 'form' => $form->createView(), ]); } - private function processUpload(Disposition $disposition, string $uploadType): void + private function processUpload(Disposition $disposition): void { - if (null !== $existingUpload = $disposition->getDocumentByType($uploadType)) { + if (null !== $existingUpload = $disposition->getDocumentByType(Upload::TYPE_CONTRACT)) { $this->entityManager->remove($existingUpload); } @@ -84,17 +67,14 @@ class DocumentUploadController extends AbstractController $uploadSession = $this->uploadHandler->getUploadSession(); - $upload = Upload::fromUploadDto($uploadSession->getUploads()->first(), $user, $uploadType); - $upload->setStatus(Upload::STATUS_NEW); + $upload = Upload::fromUploadDto($uploadSession->getUploads()->first(), $user, Upload::TYPE_CONTRACT); + $upload->setStatus(Upload::STATUS_CHECKED); $disposition->addDocument($upload); - $transitionName = sprintf('upload_%s', $uploadType); - $this->workflow->apply($disposition, $transitionName); - $this->entityManager->flush(); - $this->uploadHandler->moveUploadSessionFilesFromOrphanage($uploadType, $uploadSession); + $this->uploadHandler->moveUploadSessionFilesFromOrphanage(Upload::TYPE_CONTRACT, $uploadSession); $this->uploadHandler->destroyUploadSession(); $this->eventDispatcher->dispatch(new DocumentUploadedEvent($upload), DocumentUploadedEvent::NAME); @@ -104,14 +84,7 @@ class DocumentUploadController extends AbstractController 'teamer_name' => $teamer->getFullName(), 'disposition_id' => $disposition->getId(), 'document_id' => $upload->getId(), - 'upload_type' => $uploadType, + 'upload_type' => Upload::TYPE_CONTRACT, ]); } - - private function getRedirectResponse(Disposition $disposition): HxRedirectResponse - { - return new HxRedirectResponse($this->generateUrl('app_administrative_assignment_detail', [ - 'uuid' => $disposition->getAssignment()->getUuid(), - ])); - } } diff --git a/src/EventListener/DispositionWorkflowGuardSubscriber.php b/src/EventListener/DispositionWorkflowGuardSubscriber.php index fbc5859..65fe97d 100644 --- a/src/EventListener/DispositionWorkflowGuardSubscriber.php +++ b/src/EventListener/DispositionWorkflowGuardSubscriber.php @@ -4,14 +4,13 @@ namespace App\EventListener; use App\Entity\Disposition; use App\Entity\Upload; -use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Workflow\Event\GuardEvent; use Symfony\Contracts\Translation\TranslatorInterface; class DispositionWorkflowGuardSubscriber implements EventSubscriberInterface { - public function __construct(private readonly TranslatorInterface $translator, private readonly Security $security) + public function __construct(private readonly TranslatorInterface $translator) {} public static function getSubscribedEvents(): array @@ -41,11 +40,6 @@ class DispositionWorkflowGuardSubscriber implements EventSubscriberInterface public function guardUploadContract(GuardEvent $event): void { - // no checks for administrative users - if ($this->security->isGranted('ROLE_ADMINISTRATIVE')) { - return; - } - /** @var Disposition $disposition */ $disposition = $event->getSubject(); $assignment = $disposition->getAssignment(); @@ -85,11 +79,6 @@ class DispositionWorkflowGuardSubscriber implements EventSubscriberInterface $event->setBlocked(true, $message); } - // no further checks for administrative users - if ($this->security->isGranted('ROLE_ADMINISTRATIVE')) { - return; - } - $earliestDate = $destination->getDateTo(); if ($earliestDate > $today) { diff --git a/templates/administrative/assignment/detail.html.twig b/templates/administrative/assignment/detail.html.twig index aece30e..abe5b72 100644 --- a/templates/administrative/assignment/detail.html.twig +++ b/templates/administrative/assignment/detail.html.twig @@ -179,7 +179,7 @@
- {% if workflow_can(disposition, 'upload_contract') or workflow_can(disposition, 'upload_invoice') %} + {% if is_granted('CONTRACT_SUPPLEMENTARY', disposition) %}