feat: exclusion groups for additional services

This commit is contained in:
Björn Fromme
2026-08-04 10:24:29 +02:00
parent c31d086356
commit 331c88c38e
11 changed files with 457 additions and 17 deletions
+20 -1
View File
@@ -4,7 +4,9 @@ declare(strict_types=1);
namespace App\Form;
use App\Entity\Groups\AdditionalService;
use App\Form\Model\AccommodationBookingDto;
use App\Service\AdditionalServiceExclusionResolver;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
@@ -18,6 +20,11 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
*/
class AccommodationStep2Type extends AbstractType
{
public function __construct(
private readonly AdditionalServiceExclusionResolver $exclusionResolver,
) {
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
@@ -51,7 +58,9 @@ class AccommodationStep2Type extends AbstractType
])
;
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event): void {
$availableServices = $options['additional_services'];
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($availableServices): void {
$data = $event->getData();
if (!is_array($data)) {
@@ -64,6 +73,14 @@ class AccommodationStep2Type extends AbstractType
}
}
$dto = $event->getForm()->getData();
$data['selectedAdditionalServiceIds'] = $this->exclusionResolver->resolve(
$availableServices,
array_map('intval', (array) ($data['selectedAdditionalServiceIds'] ?? [])),
$dto instanceof AccommodationBookingDto ? $dto->selectedAdditionalServiceIds : [],
);
$event->setData($data);
});
}
@@ -75,8 +92,10 @@ class AccommodationStep2Type extends AbstractType
'validation_groups' => ['step_2'],
'board_service_choices' => [],
'additional_service_choices' => [],
'additional_services' => [],
'max_adolescent_age' => 0,
]);
$resolver->setAllowedTypes('max_adolescent_age', 'int');
$resolver->setAllowedTypes('additional_services', AdditionalService::class . '[]');
}
}
@@ -7,6 +7,7 @@ namespace App\Form\Admin\Groups;
use App\Entity\Groups\AdditionalService;
use App\Enum\Groups\AdditionalServiceType as AdditionalServiceTypeEnum;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
@@ -46,6 +47,15 @@ class AdditionalServiceType extends AbstractType
'required' => false,
'disabled' => true,
])
->add('exclusionGroup', TextType::class, [
'label' => 'Ausschlussgruppe',
'required' => false,
'help' => 'Leistungen mit derselben Ausschlussgruppe können sich gegenseitig abwählen.',
])
->add('isExclusive', CheckboxType::class, [
'label' => 'Schließt andere Leistungen dieser Gruppe aus',
'required' => false,
])
->add('dateFrom', DateType::class, [
'label' => 'Datum von',
'html5' => true,