feat: driver license check for teamers

closes #869bup9vf
This commit is contained in:
Björn Fromme committed 2026-03-15 12:42:28 +01:00
1 parent ebbefa0129
commit 20da6a0afc
32 files changed
+1095 -6

No files matched your search

@@ -0,0 +1,107 @@
<?php
namespace App\Controller\Administrative\Teamer\DriverLicense;
use App\Entity\Teamer;
use App\Entity\Upload;
use App\Entity\User;
use App\Form\DriverLicenseCheckType;
use App\Htmx\HxRedirectResponse;
use App\Model\DriverLicenseCheckDto;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class CheckController extends AbstractController
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly LoggerInterface $logger,
) {
}
#[Route('/administrative/teamer/driver-license/check/{uuid}', name: 'app_administrative_teamer_driver_license_check')]
#[IsGranted('ROLE_ADMINISTRATIVE')]
#[IsGranted('CHECK', subject: 'document')]
public function index(Upload $document, Request $request): Response
{
if (Upload::TYPE_DRIVER_LICENSE !== $document->getType()) {
throw $this->createAccessDeniedException();
}
$teamer = $document->getOwner()?->getTeamer();
if (false === $teamer instanceof Teamer) {
throw $this->createNotFoundException('Teamer not found for upload');
}
$formData = new DriverLicenseCheckDto($document);
$form = $this->createForm(DriverLicenseCheckType::class, $formData);
$form->handleRequest($request);
if (true === $form->isSubmitted() && true === $form->isValid()) {
$status = $formData->getStatus();
if (null === $status) {
throw $this->createNotFoundException('Status missing');
}
/** @var User $user */
$user = $this->getUser();
$document
->setStatus($status)
->setComment($formData->getComment())
->setApprovedAt(Upload::STATUS_CHECKED === $status ? new \DateTimeImmutable() : null)
->setApprovedBy(Upload::STATUS_CHECKED === $status ? $user->getInitials() : null)
;
$teamer
->setDriverLicenseDeclaration(true)
->setDriverLicenseReviewComment($formData->getComment())
->setDriverLicenseReviewedAt(new \DateTimeImmutable())
->setDriverLicenseReviewedBy($user->getInitials())
;
if (Upload::STATUS_CHECKED === $status) {
$teamer
->setDriverLicenseVerified(true)
->setDriverLicenseStatus(Teamer::DRIVER_LICENSE_STATUS_APPROVED)
->setDriverLicenseUpload(null)
;
$this->entityManager->remove($document);
$this->addFlash('success', 'Der Führerschein wurde bestätigt');
} elseif (Upload::STATUS_REJECTED === $status) {
$teamer
->setDriverLicenseVerified(false)
->setDriverLicenseStatus(Teamer::DRIVER_LICENSE_STATUS_DENIED)
;
$this->addFlash('success', 'Der Führerschein wurde abgelehnt');
} else {
$teamer
->setDriverLicenseVerified(false)
->setDriverLicenseStatus(Teamer::DRIVER_LICENSE_STATUS_PENDING_REVIEW)
;
$this->addFlash('success', 'Der Führerscheinstatus wurde aktualisiert');
}
$this->entityManager->flush();
$this->logger->info('Update driver license check', [
'teamer_id' => $teamer->getId(),
'teamer_name' => (string) $teamer,
'status' => $status,
]);
return new HxRedirectResponse($this->generateUrl('app_admin_index'));
}
return $this->render('administrative/teamer/driver_license/modal_check.html.twig', [
'document' => $document,
'teamer' => $teamer,
'form' => $form->createView(),
]);
}
}