Merge branch 'master' into feature/multiple-hotelcodes
This commit is contained in:
@@ -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(),
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
</td>
|
||||
<td>
|
||||
<div class="flex items-center justify-end space-x-2">
|
||||
{% if workflow_can(disposition, 'upload_contract') or workflow_can(disposition, 'upload_invoice') %}
|
||||
{% if is_granted('CONTRACT_SUPPLEMENTARY', disposition) %}
|
||||
<button type="button"
|
||||
title="Dokumentenupload"
|
||||
hx-get="{{ path('app_administrative_disposition_document_upload', { 'uuid': disposition.uuid }) }}"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
{{ form_start(form, { 'attr': { 'hx-post': app.request.uri, 'hx-target': '#htmx-modal', 'hx-swap': 'outerHTML' }}) }}
|
||||
<div class="pb-4">
|
||||
{% include '_partials/_upload_collection_form.html.twig' with {
|
||||
'endpoint_upload': path(uploaderRoute),
|
||||
'endpoint_upload': path('_uploader_upload_contract'),
|
||||
'max_filesize': 5,
|
||||
'max_files': 1,
|
||||
'accepted_files': 'image/jpg,image/jpeg,application/pdf',
|
||||
|
||||
Reference in New Issue
Block a user