getCurrentDeadline($now); if (null === $deadline) { return false; } if (true === $this->isRegisteredAfterAnyDeadline($registeredAt, $now)) { return false; } if (null === $confirmedAt) { return true; } return CarbonImmutable::instance($confirmedAt) < $deadline; } /** * The most recent deadline that has already passed, or null when none has. */ public function getCurrentDeadline(CarbonImmutable $now): ?CarbonImmutable { $deadlines = $this->getDeadlinesForYear($now); rsort($deadlines); foreach ($deadlines as $deadline) { if ($deadline <= $now) { return $deadline; } } return null; } /** * Someone who registered after a deadline has effectively confirmed their data * by registering, so they are exempt until the next one. */ private function isRegisteredAfterAnyDeadline(?\DateTimeInterface $registeredAt, CarbonImmutable $now): bool { if (null === $registeredAt) { return false; } $registeredAt = CarbonImmutable::instance($registeredAt)->startOfDay(); 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->deadlines)) as $date) { $deadline = CarbonImmutable::createFromFormat('Y-m-d', sprintf('%s-%s', $now->format('Y'), $date)); if (false === $deadline instanceof CarbonImmutable) { continue; } $deadlines[] = $deadline->startOfDay(); } return $deadlines; } }