feat: ensure teamer accepts terms when confirming driver's license

This commit is contained in:
Björn Fromme
2026-03-15 12:42:28 +01:00
parent 3b6ebdaddc
commit 3d71dcfc14
3 changed files with 52 additions and 14 deletions
+13 -7
View File
@@ -6,6 +6,7 @@ use App\Model\DriverLicenseDeclarationDto;
use App\Model\UploadSessionDto; use App\Model\UploadSessionDto;
use App\Service\Upload\UploadHandler; use App\Service\Upload\UploadHandler;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
@@ -16,13 +17,18 @@ class DriverLicenseDeclarationType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('hasDriverLicense', ChoiceType::class, [ $builder
'label' => 'Besitzt du einen gültigen Führerschein?', ->add('hasDriverLicense', ChoiceType::class, [
'choices' => [ 'label' => 'Besitzt du einen gültigen Führerschein?',
'Ja' => true, 'choices' => [
'Nein' => false, 'Ja' => true,
], 'Nein' => false,
]); ],
])
->add('confirmTermsOfUse', CheckboxType::class, [
'label' => 'Ich bestätige, die KfZ-Nutzungsbedingungen gelesen zu haben und stimme ihnen zu.',
])
;
} }
public function buildView(FormView $view, FormInterface $form, array $options): void public function buildView(FormView $view, FormInterface $form, array $options): void
+29 -1
View File
@@ -3,11 +3,26 @@
namespace App\Model; namespace App\Model;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class DriverLicenseDeclarationDto class DriverLicenseDeclarationDto
{ {
#[Assert\NotNull(message: 'Bitte gib an, ob du einen Führerschein hast.')] #[Assert\NotNull(message: 'Bitte gib an, ob du einen Führerschein hast.')]
private ?bool $hasDriverLicense = null; private ?bool $hasDriverLicense;
private ?bool $confirmTermsOfUse = false;
#[Assert\Callback]
public function validateTermsOfUse(ExecutionContextInterface $executionContext): void
{
if (true === $this->hasDriverLicense() && true !== $this->getConfirmTermsOfUse()) {
$executionContext
->buildViolation('Bitte bestätige die KfZ-Nutzungsbedingungen.')
->atPath('confirmTermsOfUse')
->addViolation()
;
}
}
public function __construct(?bool $hasDriverLicense = null) public function __construct(?bool $hasDriverLicense = null)
{ {
@@ -25,4 +40,17 @@ class DriverLicenseDeclarationDto
return $this; return $this;
} }
public function getConfirmTermsOfUse(): ?bool
{
return $this->confirmTermsOfUse;
}
public function setConfirmTermsOfUse(?bool $confirmTermsOfUse): static
{
$this->confirmTermsOfUse = $confirmTermsOfUse;
return $this;
}
} }
@@ -15,12 +15,6 @@
Führerscheins hoch. Führerscheins hoch.
</p> </p>
{% if not form.vars.valid %}
<div class="border border-red-500 rounded-md p-4 text-red-500 mb-6">
{% include '_partials/_form_errors.html.twig' with { 'form': form } %}
</div>
{% endif %}
{% if teamer.driverLicenseStatus == constant('App\\Entity\\Teamer::DRIVER_LICENSE_STATUS_DENIED') %} {% if teamer.driverLicenseStatus == constant('App\\Entity\\Teamer::DRIVER_LICENSE_STATUS_DENIED') %}
{% embed '_partials/_alert.html.twig' with { 'type': 'warning' } %} {% embed '_partials/_alert.html.twig' with { 'type': 'warning' } %}
{% block message %} {% block message %}
@@ -33,6 +27,14 @@
{% endembed %} {% endembed %}
{% endif %} {% endif %}
{% if not form.vars.valid %}
{% embed '_partials/_alert.html.twig' with { 'type': 'warning' } %}
{% block message %}
{% include '_partials/_form_errors.html.twig' with { 'form': form } %}
{% endblock %}
{% endembed %}
{% endif %}
<div class="flex flex-col space-y-4 pb-6"> <div class="flex flex-col space-y-4 pb-6">
{{ form_row(form.hasDriverLicense) }} {{ form_row(form.hasDriverLicense) }}
@@ -55,6 +57,8 @@
'accepted_files': 'image/jpg,image/jpeg,image/png,application/pdf', 'accepted_files': 'image/jpg,image/jpeg,image/png,application/pdf',
} %} } %}
</div> </div>
{{ form_row(form.confirmTermsOfUse) }}
</div> </div>
<button type="submit" class="btn" {{ stimulus_target('form-upload-guard', 'submit') }}> <button type="submit" class="btn" {{ stimulus_target('form-upload-guard', 'submit') }}>