feat: body dimensions optional

This commit is contained in:
Björn Fromme
2026-03-16 12:00:55 +01:00
parent a6d2661562
commit cc747f0690
5 changed files with 10 additions and 65 deletions
+4
View File
@@ -60,6 +60,10 @@ class BodyDimensionsType extends AbstractType
'height_required' => false,
'weight_required' => false,
'shoeSize_required' => false,
'help' => 'Du kannst die Daten auch später nachreichen',
'help_attr' => [
'class' => 'lg:col-span-3 text-sm -mt-2 px-2',
],
]);
$resolver->setAllowedTypes('height_required', 'bool');
@@ -298,6 +298,9 @@ class ParticipantFieldOptionsProvider extends AbstractFieldOptionsProvider
'maxlength' => 20,
],
'help' => 'Bitte gib das Kennzeichen deines Fahrzeugs an. Du kannst es aber auch später nachreichen.',
'help_attr' => [
'class' => 'text-sm px-2 mt-2',
],
'sanitize_html' => true,
];
@@ -13,26 +13,9 @@ class ParticipantValidator extends ConstraintValidator
/** @var ParticipantDto $participant */
$participant = $value;
$this->assertBodyMeasurementsValid($participant);
$this->assertPickupSelected($participant);
}
public function assertBodyMeasurementsValid(ParticipantDto $participant): void
{
if (0 === count($participant->rentals)) {
return;
}
foreach (['height', 'shoeSize', 'weight'] as $property) {
if (empty($participant->{$property})) {
$this->context->buildViolation('Bitte angeben wegen Leihmaterial')
->atPath($property)
->addViolation()
;
}
}
}
public function assertPickupSelected(ParticipantDto $participant): void
{
// Check if either outbound or inbound transportation is bus
@@ -334,6 +334,7 @@
{{ form_row(form.bodyDimensions.height) }}
{{ form_row(form.bodyDimensions.shoeSize) }}
{{ form_row(form.bodyDimensions.weight) }}
{{ form_help(form.bodyDimensions) }}
</div>
{% endif %}
@@ -17,20 +17,7 @@ class ParticipantValidatorTest extends ConstraintValidatorTestCase
return new ParticipantValidator();
}
public function testParticipantWithoutRentalsPassesBodyMeasurementValidation(): void
{
$participant = $this->createValidParticipant();
$participant->rentals = []; // No rentals, so body measurements not required
$participant->height = null;
$participant->weight = null;
$participant->shoeSize = null;
$this->validator->validate($participant, new Participant());
$this->assertNoViolation();
}
public function testParticipantWithRentalsButNoBodyMeasurementsFailsValidation(): void
public function testParticipantWithRentalsButNoBodyMeasurementsPassesValidation(): void
{
$participant = $this->createValidParticipant();
$participant->rentals = [$this->createMockService()];
@@ -40,40 +27,7 @@ class ParticipantValidatorTest extends ConstraintValidatorTestCase
$this->validator->validate($participant, new Participant());
$this->buildViolation('Bitte angeben wegen Leihmaterial')
->atPath('property.path.height')
->buildNextViolation('Bitte angeben wegen Leihmaterial')
->atPath('property.path.shoeSize')
->buildNextViolation('Bitte angeben wegen Leihmaterial')
->atPath('property.path.weight')
->assertRaised();
}
public function testParticipantWithRentalsAndPartialBodyMeasurementsFailsValidation(): void
{
$participant = $this->createValidParticipant();
$participant->rentals = [$this->createMockService()];
$participant->height = '175';
$participant->weight = null; // Missing
$participant->shoeSize = '42';
$this->validator->validate($participant, new Participant());
$this->buildViolation('Bitte angeben wegen Leihmaterial')
->atPath('property.path.weight')
->assertRaised();
}
public function testParticipantWithRentalsAndCompleteBodyMeasurementsPassesValidation(): void
{
$participant = $this->createValidParticipant();
$participant->rentals = [$this->createMockService()];
$participant->height = '175';
$participant->weight = '70';
$participant->shoeSize = '42';
$this->validator->validate($participant, new Participant());
// Body measurements are optional and can be provided later
$this->assertNoViolation();
}