From 73e66a9458ab5689476806501e527c7352057cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Mon, 10 Aug 2026 10:48:39 +0200 Subject: [PATCH] feat: hide inactive teamers from list view, overridable in filter addresses #869dv987y --- config/services.yaml | 3 +++ src/Form/TeamerFilterType.php | 4 ++++ src/Model/TeamerFilterDto.php | 13 +++++++++++++ src/Repository/TeamerRepository.php | 13 +++++++++++-- src/Service/Common/TeamerFilterHandler.php | 5 +++++ templates/common/modal_teamer_filter.html.twig | 1 + 6 files changed, 37 insertions(+), 2 deletions(-) diff --git a/config/services.yaml b/config/services.yaml index ba4dc97..7122263 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -7,6 +7,8 @@ parameters: default_email_from: '%env(APP_DEFAULT_EMAIL_FROM)%' default_email_to: '%env(APP_DEFAULT_EMAIL_TO)%' + teamer_inactive_period: '-2 years' + destinations: - Schwendi - Waldschlössli @@ -38,6 +40,7 @@ services: $destinations: '%destinations%' $xmlExport: '@xml_export.storage' $xmlDump: '@xml_dump.storage' + $teamerInactivePeriod: '%teamer_inactive_period%' App\: resource: '../src/' diff --git a/src/Form/TeamerFilterType.php b/src/Form/TeamerFilterType.php index 3844db9..02ee4bf 100644 --- a/src/Form/TeamerFilterType.php +++ b/src/Form/TeamerFilterType.php @@ -55,6 +55,10 @@ class TeamerFilterType extends AbstractType 'label' => 'an keinen Fortbildungen teilgenommen', 'required' => false, ]) + ->add('includeInactive', CheckboxType::class, [ + 'label' => 'inaktive Teamer:innen anzeigen', + 'required' => false, + ]) ->add('apply', SubmitType::class, [ 'label' => 'filtern', ]) diff --git a/src/Model/TeamerFilterDto.php b/src/Model/TeamerFilterDto.php index 3368c32..dea48c5 100644 --- a/src/Model/TeamerFilterDto.php +++ b/src/Model/TeamerFilterDto.php @@ -12,6 +12,7 @@ class TeamerFilterDto extends AbstractFilterDto protected bool $snowboardLicense = false; protected bool $driverLicenseVerified = false; protected bool $noTrainings = false; + protected bool $includeInactive = false; public function getName(): ?string { @@ -106,4 +107,16 @@ class TeamerFilterDto extends AbstractFilterDto { $this->noTrainings = $noTrainings; } + + public function isIncludeInactive(): bool + { + return $this->includeInactive; + } + + public function setIncludeInactive(bool $includeInactive): static + { + $this->includeInactive = $includeInactive; + + return $this; + } } diff --git a/src/Repository/TeamerRepository.php b/src/Repository/TeamerRepository.php index 366dd85..a942335 100644 --- a/src/Repository/TeamerRepository.php +++ b/src/Repository/TeamerRepository.php @@ -22,8 +22,10 @@ class TeamerRepository extends ServiceEntityRepository { use QueryHelperTrait; - public function __construct(ManagerRegistry $registry) - { + public function __construct( + ManagerRegistry $registry, + private readonly string $teamerInactivePeriod, + ) { parent::__construct($registry, Teamer::class); } @@ -104,6 +106,13 @@ class TeamerRepository extends ServiceEntityRepository ; } + if (false === $filterDto->isIncludeInactive()) { + $qb + ->andWhere($qb->expr()->gte('user.lastLoginAt', ':lastLoginThreshold')) + ->setParameter('lastLoginThreshold', new \DateTimeImmutable($this->teamerInactivePeriod)) + ; + } + return $qb->getQuery(); } diff --git a/src/Service/Common/TeamerFilterHandler.php b/src/Service/Common/TeamerFilterHandler.php index e156550..c3b10f5 100644 --- a/src/Service/Common/TeamerFilterHandler.php +++ b/src/Service/Common/TeamerFilterHandler.php @@ -29,6 +29,10 @@ class TeamerFilterHandler extends AbstractFilterHandler ->setNoTrainings($data['no_trainings']) ; + if (isset($data['include_inactive'])) { + $filterDto->setIncludeInactive((bool) $data['include_inactive']); + } + if (0 < count($data['job_profiles'])) { $jobProfiles = $this ->entityManager @@ -52,6 +56,7 @@ class TeamerFilterHandler extends AbstractFilterHandler 'snowboard_license' => $filterDto->hasSnowboardLicense(), 'driver_license_verified' => $filterDto->hasDriverLicenseVerified(), 'no_trainings' => $filterDto->hasNoTrainings(), + 'include_inactive' => $filterDto->isIncludeInactive(), 'job_profiles' => array_map(function (JobProfile $jobProfile) { return $jobProfile->getId(); }, $filterDto->getJobProfiles()), diff --git a/templates/common/modal_teamer_filter.html.twig b/templates/common/modal_teamer_filter.html.twig index fdc4ca9..95dd9f2 100644 --- a/templates/common/modal_teamer_filter.html.twig +++ b/templates/common/modal_teamer_filter.html.twig @@ -13,6 +13,7 @@ {{ form_row(filterForm.snowboardLicense) }} {{ form_row(filterForm.driverLicenseVerified) }} {{ form_row(filterForm.noTrainings) }} + {{ form_row(filterForm.includeInactive) }}
{{ form_widget(filterForm.apply, { 'attr': { 'class': 'btn' } }) }}