Gruppen in Anzeige-Reihenfolge (dringlichste zuerst) */ public const GROUP_ORDER = [ self::GROUP_OVERDUE, self::GROUP_DUE_1_MONTH, self::GROUP_DUE_2_MONTHS, self::GROUP_DUE_3_MONTHS, ]; public function __construct(private BackofficeDashboardService $dashboardService) {} /** * Liefert die Teampartner mit (bald) fälliger Jahresgebühr, gruppiert nach * Dringlichkeit und innerhalb jeder Gruppe nach Fälligkeitsdatum aufsteigend. * * @return array> */ public function dueGroups(int $rootUserId, ?Carbon $reference = null): array { $now = ($reference ?? now())->copy(); $groups = array_fill_keys(self::GROUP_ORDER, []); foreach ($this->dashboardService->lineBuckets($rootUserId) as $line => $users) { foreach ($users as $user) { if (! $user->payment_account) { continue; } $dueDate = Carbon::parse($user->payment_account); $groupKey = $this->groupKeyFor($dueDate, $now); if ($groupKey === null) { continue; } $groups[$groupKey][] = $this->buildRow($user, (int) $line, $dueDate); } } foreach ($groups as $groupKey => $rows) { usort($rows, fn (array $a, array $b): int => $a['due_date'] <=> $b['due_date']); $groups[$groupKey] = $rows; } return $groups; } private function groupKeyFor(Carbon $dueDate, Carbon $now): ?string { return match (true) { $dueDate->lte($now) => self::GROUP_OVERDUE, $dueDate->lte($now->copy()->addMonth()) => self::GROUP_DUE_1_MONTH, $dueDate->lte($now->copy()->addMonths(2)) => self::GROUP_DUE_2_MONTHS, $dueDate->lte($now->copy()->addMonths(3)) => self::GROUP_DUE_3_MONTHS, default => null, }; } /** * @return array{ * user_id: int, * first_name: string, * last_name: string, * email: string, * phone: string, * mobil: string, * line: int, * level_name: string, * due_date: Carbon * } */ private function buildRow(User $user, int $line, Carbon $dueDate): array { return [ 'user_id' => (int) $user->id, 'first_name' => (string) ($user->account->first_name ?? ''), 'last_name' => (string) ($user->account->last_name ?? ''), 'email' => (string) $user->email, 'phone' => (string) ($user->account->phone ?? ''), 'mobil' => (string) ($user->account->mobil ?? ''), 'line' => $line, 'level_name' => (string) ($user->user_level?->getLang('name') ?? ''), 'due_date' => $dueDate, ]; } }