feat: answer received form submissions by mail

This commit is contained in:
fromme committed 2026-09-24 16:35:31 +02:00
1 parent 19364df2db
commit aa728ddc99
22 files changed
+974 -9

No files matched your search

+2
View File
@@ -12,6 +12,8 @@ enum EmailTextKey: string
{
case APPLICATION_ACCEPTED = 'application_accepted';
case APPLICATION_ACCEPTED_NO_CONTRACT = 'application_accepted_no_contract';
case APPLICATION_FORM_FOLLOW_UP = 'application_form_follow_up';
case APPLICATION_FORM_RECEIVED = 'application_form_received';
case APPLICATION_REJECTED = 'application_rejected';
case ASSIGNMENT_CALLED_OFF = 'assignment_called_off';
case DISPOSITION_CALLED_OFF = 'disposition_called_off';
+29
View File
@@ -56,6 +56,35 @@ final class SeasonCalendar
return $day >= $start && $day <= $end ? $year : null;
}
/**
* The season a mail written now would call "die kommende Saison": the one currently running,
* or - between two seasons - the next one to start. Never null, unlike seasonYearFor(): a
* recruiting mail sent in September is outside every season window but is unmistakably about
* the winter ahead.
*/
public function currentOrUpcomingSeasonYear(\DateTimeInterface $date): int
{
if (null !== $seasonYear = $this->seasonYearFor($date)) {
return $seasonYear;
}
$day = CarbonImmutable::instance($date)->startOfDay();
$year = (int) $day->format('Y');
// Outside any window, so the next start is this year's unless it has already passed,
// which for a wrapping window can only mean the season already began - handled above.
return $day <= $this->boundaryFor($this->seasonStart, $year) ? $year : $year + 1;
}
/**
* 2026 -> "26/27". The short form the mails to applicants use, where "Saison 2026/27" would
* read like a heading in the middle of a sentence.
*/
public function shortLabel(int $seasonYear): string
{
return sprintf('%02d/%02d', $seasonYear % 100, ($seasonYear + 1) % 100);
}
/**
* null -> "außerhalb der Saison"; 2024 -> "Saison 2024/25".
*/