fix: exclude teamers registered after due date from forced data check
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user