verlangeAnmeldung(); $bereich = $this->query('bereich', 'allgemein'); if (!array_key_exists($bereich, Einstellung::BEREICHE)) { $bereich = 'allgemein'; } $this->render('einstellungen/index.php', [ 'titel' => 'Einstellungen', 'bereich' => $bereich, 'werte' => Einstellung::alle(), 'logDateien' => $this->logDateien(), 'kacheln' => Cockpit::sichtbar(), 'kategorien' => Kategorie::baumFlach(), ]); } public function speichern(): void { $this->verlangeAnmeldung(); $bereich = $this->post('bereich', 'allgemein'); if (!array_key_exists($bereich, Einstellung::BEREICHE)) { View::redirect('/einstellungen', 'Unbekannter Bereich.', 'fehler'); } // Nur Felder des angezeigten Reiters übernehmen – so überschreibt ein // Speichern nicht die Werte der anderen Reiter mit Leerstrings. foreach ($this->felderFuer($bereich) as $schluessel => $typ) { $wert = match ($typ) { 'bool' => isset($_POST[$schluessel]) ? '1' : '0', default => $this->post($schluessel), }; Einstellung::set($schluessel, $wert, $bereich); } // Die Kachelauswahl ist eine Mehrfachauswahl und passt nicht in das // Schlüssel-Wert-Raster von felderFuer(): Sie kommt als Liste an und // wird als Liste gespeichert. if ($bereich === 'darstellung') { $gewaehlt = $_POST[Cockpit::EINSTELLUNG] ?? []; Cockpit::setzeSichtbar( is_array($gewaehlt) ? array_map('strval', array_filter($gewaehlt, 'is_scalar')) : [] ); } if ($bereich === 'diagnose') { DebugLog::setAktiv(Einstellung::getBool('debug_log_aktiv')); } View::redirect('/einstellungen?bereich=' . urlencode($bereich), 'Einstellungen gespeichert.'); } public function logLeeren(): void { $this->verlangeAnmeldung(); $entfernt = 0; foreach ($this->logDateien() as $datei) { if (@unlink($datei['pfad'])) { $entfernt++; } } View::redirect( '/einstellungen?bereich=diagnose', $entfernt === 0 ? 'Es gab nichts zu löschen.' : "{$entfernt} Logdatei(en) gelöscht." ); } /** * Welche Felder zu welchem Reiter gehören, inklusive Typ. * Bereiche ohne Einträge sind Platzhalter für spätere Phasen. */ private function felderFuer(string $bereich): array { return match ($bereich) { 'allgemein' => ['mandant_name' => 'text', 'waehrung' => 'text'], 'darstellung' => ['darstellung_thema' => 'text', 'zeilen_pro_seite' => 'text'], 'buchhaltung' => ['erster_monat' => 'text'], 'banking' => [ 'banking_automatisch_buchen' => 'bool', 'banking_regeln_beim_abruf' => 'bool', 'banking_abgleich_tage' => 'text', 'banking_produkt_id' => 'text', ], 'import' => [ 'import_qif_verzeichnis' => 'text', 'import_stichtag' => 'text', 'housekeeping_tage' => 'text', ], 'wertpapiere' => [ 'wertpapiere_kursdienst' => 'text', 'wertpapiere_api_key' => 'text', 'wertpapiere_kursabruf_aktiv' => 'bool', ] + $this->kostenfelder(), 'diagnose' => ['debug_log_aktiv' => 'bool'], default => [], }; } /** * Je Kostenart eines Wertpapiergeschäfts ein Feld. Sie stehen nicht in * felderFuer(), weil sie aus Wertpapierkosten::arten() kommen – eine neue * Art soll nicht an zwei Stellen nachgetragen werden müssen. * * @return array */ private function kostenfelder(): array { $felder = []; foreach (array_keys(Wertpapierkosten::arten()) as $art) { $felder[Wertpapierkosten::schluessel($art)] = 'text'; } return $felder; } /** @return list */ private function logDateien(): array { $dateien = []; foreach (glob(rtrim((string)\Finanzmanager\Config::get('log_dir'), '/') . '/*.log') ?: [] as $pfad) { $dateien[] = [ 'name' => basename($pfad), 'pfad' => $pfad, 'groesse' => (int)filesize($pfad), 'geaendert' => (int)filemtime($pfad), ]; } usort($dateien, fn($a, $b) => $b['geaendert'] <=> $a['geaendert']); return $dateien; } }