verlangeAnmeldung(); $budget = $this->gewaehltesBudget(); if ($budget === null) { $this->render('planung/budget-leer.php', ['titel' => 'Budgetplaner']); return; } $this->render('planung/budgetplaner.php', [ 'titel' => 'Budgetplaner', 'budget' => $budget, 'budgets' => Budget::alle(), 'tabelle' => Budgetplaner::tabelle($budget), 'ansicht' => self::ansicht($this->query('ansicht')), 'laufenderMonat' => Budgetplaner::laufenderMonat((int)$budget['jahr']), 'nurGeplante' => $this->query('nur_geplante') === '1', ]); } /** * Speichert die eingegebenen Monatswerte. Ein leeres Feld löscht die * Position („nicht geplant“), 0 bleibt eine ausdrückliche Null. * * @param array $params */ public function positionenSpeichern(array $params): void { $this->verlangeAnmeldung(); $id = (int)$params['id']; $budget = Budget::find($id); if ($budget === null) { View::redirect('/planung/budget', 'Das Budget gibt es nicht.', 'fehler'); return; } $werte = $_POST['betrag'] ?? []; $geaendert = 0; if (is_array($werte)) { foreach ($werte as $kategorieId => $monate) { if (!is_array($monate)) { continue; } foreach ($monate as $monat => $eingabe) { $betrag = self::betrag((string)$eingabe); Budget::positionSetzen($id, (int)$kategorieId, (int)$monat, $betrag); $geaendert++; } } } View::redirect( $this->zurueckZumPlaner($id), $geaendert > 0 ? 'Budget gespeichert.' : 'Nichts zu speichern.' ); } public function verwaltung(): void { $this->verlangeAnmeldung(); $this->render('planung/budget-verwaltung.php', [ 'titel' => 'Budgets', 'budgets' => Budget::alle(), 'jahr' => (int)date('Y'), ]); } public function anlegen(): void { $this->verlangeAnmeldung(); try { $id = Budget::anlegen( $this->post('name'), (int)$this->post('jahr', date('Y')), $this->post('beschreibung') ); } catch (\Throwable $e) { View::redirect('/planung/budget/verwaltung', $e->getMessage(), 'fehler'); return; } View::redirect('/planung/budget?budget=' . $id, 'Budget angelegt.'); } /** @param array $params */ public function bearbeiten(array $params): void { $this->verlangeAnmeldung(); $budget = Budget::find((int)$params['id']); if ($budget === null) { View::redirect('/planung/budget/verwaltung', 'Das Budget gibt es nicht.', 'fehler'); return; } $this->render('planung/budget-formular.php', [ 'titel' => 'Budget bearbeiten', 'budget' => $budget, ]); } /** @param array $params */ public function speichern(array $params): void { $this->verlangeAnmeldung(); try { Budget::speichern( (int)$params['id'], $this->post('name'), (int)$this->post('jahr', date('Y')), $this->post('beschreibung') ); } catch (\Throwable $e) { View::redirect('/planung/budget/verwaltung', $e->getMessage(), 'fehler'); return; } View::redirect('/planung/budget/verwaltung', 'Budget gespeichert.'); } public function kopieren(): void { $this->verlangeAnmeldung(); try { $neu = Budget::kopieren( (int)$this->post('vorlage'), $this->post('name'), (int)$this->post('jahr', date('Y')) ); } catch (\Throwable $e) { View::redirect('/planung/budget/verwaltung', $e->getMessage(), 'fehler'); return; } View::redirect('/planung/budget?budget=' . $neu, 'Budget kopiert – die Werte stehen im neuen Jahr.'); } /** @param array $params */ public function aktivieren(array $params): void { $this->verlangeAnmeldung(); Budget::aktivieren((int)$params['id']); View::redirect('/planung/budget/verwaltung', 'Budget ist jetzt das aktive.'); } /** @param array $params */ public function loeschen(array $params): void { $this->verlangeAnmeldung(); Budget::loeschen((int)$params['id']); View::redirect('/planung/budget/verwaltung', 'Budget gelöscht.'); } /** * Eingabe aus dem Planer: leeres Feld heißt „nicht geplant“ (null), sonst * derselbe Zahlenparser wie in der Kontenmaske. */ public static function betrag(string $eingabe): ?float { return trim($eingabe) === '' ? null : KontenController::zahl($eingabe); } /** * Die drei Ansichten des Planers: alle drei Wertspalten je Monat, nur die * Budgetspalte oder nur die Ist-Spalte. Unbekanntes fällt auf „alles“ * zurück, damit eine alte Lesezeichen-URL nicht ins Leere zeigt. */ public static function ansicht(string $gewaehlt): string { return in_array($gewaehlt, ['budget', 'ist'], true) ? $gewaehlt : 'alles'; } /** @return array|null */ private function gewaehltesBudget(): ?array { $gewaehlt = (int)$this->query('budget'); if ($gewaehlt > 0) { $budget = Budget::find($gewaehlt); if ($budget !== null) { return $budget; } } return Budget::aktives(); } /** Nach dem Speichern zurück in dieselbe Ansicht, nicht auf das aktive Budget. */ private function zurueckZumPlaner(int $id): string { $pfad = '/planung/budget?budget=' . $id . '&ansicht=' . self::ansicht($this->post('ansicht')); if ($this->post('nur_geplante') === '1') { $pfad .= '&nur_geplante=1'; } return $pfad; } }