fix: exclude teamers registered after due date from forced data check

This commit is contained in:
Björn Fromme
2026-03-15 12:42:28 +01:00
parent ffa5ad82fd
commit 369f8f07df
2 changed files with 97 additions and 12 deletions
@@ -2,6 +2,7 @@
namespace App\RequiredTeamerCheck; namespace App\RequiredTeamerCheck;
use App\Entity\Teamer;
use App\Entity\User; use App\Entity\User;
use Carbon\CarbonImmutable; use Carbon\CarbonImmutable;
@@ -30,7 +31,7 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf
return false; return false;
} }
return false === $this->isVerificationRequired($teamer->getDataVerifiedAt()); return false === $this->isVerificationRequired($teamer);
} }
public function getRouteName(): string public function getRouteName(): string
@@ -38,14 +39,21 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf
return 'app_teamer_profile_index'; 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) { if (null === $deadline) {
return false; return false;
} }
if (true === $this->isRegisteredAfterAnyCurrentYearDeadline($teamer, $now)) {
return false;
}
$dataVerifiedAt = $teamer->getDataVerifiedAt();
if (null === $dataVerifiedAt) { if (null === $dataVerifiedAt) {
return true; return true;
} }
@@ -53,20 +61,49 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf
return CarbonImmutable::instance($dataVerifiedAt) < $deadline; 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)); try {
rsort($deadlines); $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)); $deadline = CarbonImmutable::createFromFormat('Y-m-d', sprintf('%s-%s', $now->format('Y'), $date));
if (false === $deadline instanceof CarbonImmutable) { if (false === $deadline instanceof CarbonImmutable) {
continue; 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) { if ($deadline <= $now) {
return $deadline; return $deadline;
} }
@@ -43,7 +43,7 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase
CarbonImmutable::setTestNow('2026-01-10 12:00:00'); CarbonImmutable::setTestNow('2026-01-10 12:00:00');
$check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); $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()) $user = (new User())
->setRoles(['ROLE_TEAMER']) ->setRoles(['ROLE_TEAMER'])
->setTeamer($teamer) ->setTeamer($teamer)
@@ -57,7 +57,7 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase
CarbonImmutable::setTestNow('2026-01-20 12:00:00'); CarbonImmutable::setTestNow('2026-01-20 12:00:00');
$check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); $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()) $user = (new User())
->setRoles(['ROLE_TEAMER']) ->setRoles(['ROLE_TEAMER'])
->setTeamer($teamer) ->setTeamer($teamer)
@@ -71,7 +71,10 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase
CarbonImmutable::setTestNow('2026-05-20 12:00:00'); CarbonImmutable::setTestNow('2026-05-20 12:00:00');
$check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); $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()) $user = (new User())
->setRoles(['ROLE_TEAMER']) ->setRoles(['ROLE_TEAMER'])
->setTeamer($teamer) ->setTeamer($teamer)
@@ -85,7 +88,52 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase
CarbonImmutable::setTestNow('2026-07-20 12:00:00'); CarbonImmutable::setTestNow('2026-07-20 12:00:00');
$check = new PersonalDataVerificationRequiredCheck(['01-15', '07-15']); $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()) $user = (new User())
->setRoles(['ROLE_TEAMER']) ->setRoles(['ROLE_TEAMER'])
->setTeamer($teamer) ->setTeamer($teamer)