From 369f8f07df5d9af7037f4af00aabb78e6281dca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Tue, 3 Mar 2026 08:09:10 +0100 Subject: [PATCH] fix: exclude teamers registered after due date from forced data check --- .../PersonalDataVerificationRequiredCheck.php | 53 +++++++++++++++--- ...sonalDataVerificationRequiredCheckTest.php | 56 +++++++++++++++++-- 2 files changed, 97 insertions(+), 12 deletions(-) diff --git a/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php b/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php index 0809ede..be84981 100644 --- a/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php +++ b/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php @@ -2,6 +2,7 @@ namespace App\RequiredTeamerCheck; +use App\Entity\Teamer; use App\Entity\User; use Carbon\CarbonImmutable; @@ -30,7 +31,7 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf return false; } - return false === $this->isVerificationRequired($teamer->getDataVerifiedAt()); + return false === $this->isVerificationRequired($teamer); } public function getRouteName(): string @@ -38,14 +39,21 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf return 'app_teamer_profile_index'; } - private function isVerificationRequired(?\DateTimeImmutable $dataVerifiedAt): bool + private function isVerificationRequired(Teamer $teamer): bool { - $deadline = $this->getCurrentDeadline(CarbonImmutable::now()->startOfDay()); + $now = CarbonImmutable::now()->startOfDay(); + $deadline = $this->getCurrentDeadline($now); if (null === $deadline) { return false; } + if (true === $this->isRegisteredAfterAnyCurrentYearDeadline($teamer, $now)) { + return false; + } + + $dataVerifiedAt = $teamer->getDataVerifiedAt(); + if (null === $dataVerifiedAt) { return true; } @@ -53,20 +61,49 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf return CarbonImmutable::instance($dataVerifiedAt) < $deadline; } - private function getCurrentDeadline(CarbonImmutable $now): ?CarbonImmutable + private function isRegisteredAfterAnyCurrentYearDeadline(Teamer $teamer, CarbonImmutable $now): bool { - $deadlines = array_filter(array_map('trim', $this->dataVerificationDeadlines)); - rsort($deadlines); + try { + $registeredAt = CarbonImmutable::instance($teamer->getCreatedAt())->startOfDay(); + } catch (\TypeError) { + return false; + } - foreach ($deadlines as $date) { + foreach ($this->getDeadlinesForYear($now) as $deadline) { + if ($registeredAt > $deadline) { + return true; + } + } + + return false; + } + + /** + * @return CarbonImmutable[] + */ + private function getDeadlinesForYear(CarbonImmutable $now): array + { + $deadlines = []; + + foreach (array_filter(array_map('trim', $this->dataVerificationDeadlines)) as $date) { $deadline = CarbonImmutable::createFromFormat('Y-m-d', sprintf('%s-%s', $now->format('Y'), $date)); if (false === $deadline instanceof CarbonImmutable) { continue; } - $deadline = $deadline->startOfDay(); + $deadlines[] = $deadline->startOfDay(); + } + return $deadlines; + } + + private function getCurrentDeadline(CarbonImmutable $now): ?CarbonImmutable + { + $deadlines = $this->getDeadlinesForYear($now); + rsort($deadlines); + + foreach ($deadlines as $deadline) { if ($deadline <= $now) { return $deadline; } diff --git a/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php b/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php index e782647..18fa139 100644 --- a/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php +++ b/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php @@ -43,7 +43,7 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase CarbonImmutable::setTestNow('2026-01-10 12:00:00'); $check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); - $teamer = new Teamer(); + $teamer = (new Teamer())->setCreatedAt(new \DateTimeImmutable('2025-11-05 12:00:00')); $user = (new User()) ->setRoles(['ROLE_TEAMER']) ->setTeamer($teamer) @@ -57,7 +57,7 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase CarbonImmutable::setTestNow('2026-01-20 12:00:00'); $check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); - $teamer = new Teamer(); + $teamer = (new Teamer())->setCreatedAt(new \DateTimeImmutable('2025-11-05 12:00:00')); $user = (new User()) ->setRoles(['ROLE_TEAMER']) ->setTeamer($teamer) @@ -71,7 +71,10 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase CarbonImmutable::setTestNow('2026-05-20 12:00:00'); $check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); - $teamer = (new Teamer())->setDataVerifiedAt(new \DateTimeImmutable('2026-01-16 10:00:00')); + $teamer = (new Teamer()) + ->setCreatedAt(new \DateTimeImmutable('2025-11-05 12:00:00')) + ->setDataVerifiedAt(new \DateTimeImmutable('2026-01-16 10:00:00')) + ; $user = (new User()) ->setRoles(['ROLE_TEAMER']) ->setTeamer($teamer) @@ -85,7 +88,52 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase CarbonImmutable::setTestNow('2026-07-20 12:00:00'); $check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); - $teamer = (new Teamer())->setDataVerifiedAt(new \DateTimeImmutable('2026-02-01 10:00:00')); + $teamer = (new Teamer()) + ->setCreatedAt(new \DateTimeImmutable('2025-11-05 12:00:00')) + ->setDataVerifiedAt(new \DateTimeImmutable('2026-02-01 10:00:00')) + ; + $user = (new User()) + ->setRoles(['ROLE_TEAMER']) + ->setTeamer($teamer) + ; + + $this->assertFalse($check->isSatisfied($user)); + } + + public function testIsSatisfiedAfterFirstDeadlineWhenRegisteredAfterThatDeadline(): void + { + CarbonImmutable::setTestNow('2026-05-20 12:00:00'); + $check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); + + $teamer = (new Teamer())->setCreatedAt(new \DateTimeImmutable('2026-03-01 10:00:00')); + $user = (new User()) + ->setRoles(['ROLE_TEAMER']) + ->setTeamer($teamer) + ; + + $this->assertTrue($check->isSatisfied($user)); + } + + public function testIsSatisfiedAfterSecondDeadlineWhenRegisteredAfterThatDeadline(): void + { + CarbonImmutable::setTestNow('2026-11-20 12:00:00'); + $check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); + + $teamer = (new Teamer())->setCreatedAt(new \DateTimeImmutable('2026-10-01 10:00:00')); + $user = (new User()) + ->setRoles(['ROLE_TEAMER']) + ->setTeamer($teamer) + ; + + $this->assertTrue($check->isSatisfied($user)); + } + + public function testIsNotSatisfiedAfterSecondDeadlineWhenRegisteredBeforeCurrentYearDeadlines(): void + { + CarbonImmutable::setTestNow('2026-11-20 12:00:00'); + $check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); + + $teamer = (new Teamer())->setCreatedAt(new \DateTimeImmutable('2025-10-01 10:00:00')); $user = (new User()) ->setRoles(['ROLE_TEAMER']) ->setTeamer($teamer)