'Regelmäßige Buchung', 'erinnerung' => 'Erinnerung', 'vertrag' => 'Kündigungsfrist', 'ueberweisung' => 'Terminüberweisung', ]; /** * Alle Termine bis `$tage` in der Zukunft, chronologisch. Überfällige * stehen vorn – sie sind das, was zuerst Aufmerksamkeit braucht. * * @return list */ public static function termine(int $tage = 30, ?string $heute = null): array { $heute = $heute ?? date('Y-m-d'); $bis = (new \DateTimeImmutable($heute))->modify('+' . max(1, $tage) . ' days')->format('Y-m-d'); $termine = []; foreach (RegelmaessigeBuchung::alle(true) as $reihe) { foreach (RegelmaessigeBuchung::kommendeTermine($reihe, $bis) as $datum) { $termine[] = [ 'id' => (int)$reihe['id'], 'datum' => $datum, 'art' => 'buchung', 'titel' => (string)$reihe['name'], 'betrag' => (float)$reihe['betrag'], 'pfad' => '/termine', 'ueberfaellig' => $datum < $heute, ]; } } foreach (Erinnerung::alle(true) as $erinnerung) { $datum = (string)$erinnerung['faellig_am']; if ($datum > $bis) { continue; } $termine[] = [ 'id' => (int)$erinnerung['id'], 'datum' => $datum, 'art' => 'erinnerung', 'titel' => (string)$erinnerung['text'], 'betrag' => null, 'pfad' => '/termine/erinnerungen', 'ueberfaellig' => $datum < $heute, ]; } foreach (Vertrag::fristenLaufenAb($tage, $heute) as $vertrag) { $termine[] = [ 'id' => (int)$vertrag['id'], 'datum' => (string)$vertrag['kuendigen_bis'], 'art' => 'vertrag', 'titel' => 'Kündigungsfrist: ' . $vertrag['name'], 'betrag' => (float)$vertrag['betrag'], 'pfad' => '/vertraege', 'ueberfaellig' => false, ]; } foreach (Zahlungsauftrag::alle('entwurf') as $auftrag) { $datum = (string)($auftrag['ausfuehrung_am'] ?? ''); if ($datum === '' || $datum > $bis) { continue; } $termine[] = [ 'id' => (int)$auftrag['id'], 'datum' => $datum, 'art' => 'ueberweisung', 'titel' => 'Überweisung an ' . $auftrag['empfaenger'], 'betrag' => -abs((float)$auftrag['betrag']), 'pfad' => '/zahlungsverkehr', 'ueberfaellig' => $datum < $heute, ]; } usort($termine, static fn(array $a, array $b): int => strcmp($a['datum'], $b['datum'])); return $termine; } /** * Dieselben Termine, nach Monaten gebündelt – so liest sich der Kalender * wie ein Kalender und nicht wie eine Liste. * * @return list>}> */ public static function nachMonat(int $tage = 60, ?string $heute = null): array { $monate = []; foreach (self::termine($tage, $heute) as $termin) { $schluessel = substr($termin['datum'], 0, 7); if (!isset($monate[$schluessel])) { $monate[$schluessel] = [ 'monat' => $schluessel, 'titel' => View::monat((int)substr($schluessel, 5, 2)) . ' ' . substr($schluessel, 0, 4), 'termine' => [], ]; } $monate[$schluessel]['termine'][] = $termin; } return array_values($monate); } }