verlangeAnmeldung(); $status = $this->query('status'); $this->render('zahlungsverkehr/index.php', [ 'titel' => 'Zahlungsverkehr', 'auftraege' => Zahlungsauftrag::alle($status), 'status' => $status, 'offen' => Zahlungsauftrag::anzahlOffen(), 'wartetTan' => FinTsUeberweisung::wartetAufTan(), ]); } /** * Das Übermittlungsprotokoll einer Überweisung. Das Skript holt es als * Fragment in den Dialog; ohne Skript ist es eine eigene Seite. * * @param array $params */ public function protokoll(array $params): void { $this->verlangeAnmeldung(); $auftrag = Zahlungsauftrag::find((int)$params['id']); if ($auftrag === null) { View::redirect('/zahlungsverkehr', 'Den Zahlungsauftrag gibt es nicht.', 'fehler'); return; } $this->render('zahlungsverkehr/protokoll.php', [ 'titel' => 'Übermittlungsprotokoll', 'auftrag' => $auftrag, 'eintraege' => Bankprotokoll::fuerAuftrag((int)$auftrag['id']), 'fragment' => $this->istAjax(), ]); } public function neu(): void { $this->verlangeAnmeldung(); $this->render('zahlungsverkehr/formular.php', [ 'titel' => 'Überweisung erfassen', 'auftrag' => null, 'konten' => $this->kontenMitBank(), 'adressen' => Adresse::alle(), 'kategorien' => Kategorie::baumFlach(null, true), 'klassen' => Klasse::alle(), ]); } public function anlegen(): void { $this->verlangeAnmeldung(); try { $id = Zahlungsauftrag::anlegen($this->formulardaten()); } catch (\Throwable $e) { View::redirect('/zahlungsverkehr/neu', $e->getMessage(), 'fehler'); return; } // Auf Wunsch eine neue Adresse aus dem Empfänger anlegen – so wächst // das Adressbuch beim Arbeiten, nicht durch Pflege. if (isset($_POST['adresse_merken'])) { try { Adresse::anlegen([ 'name' => $this->post('empfaenger'), 'iban' => $this->post('iban'), 'bic' => $this->post('bic'), ]); } catch (\Throwable) { // Gibt es die Adresse schon, ist nichts zu tun. } } View::redirect('/zahlungsverkehr/' . $id, 'Überweisung erfasst. Sie ist noch nicht abgesendet.'); } /** @param array $params */ public function bearbeiten(array $params): void { $this->verlangeAnmeldung(); $auftrag = Zahlungsauftrag::find((int)$params['id']); if ($auftrag === null) { View::redirect('/zahlungsverkehr', 'Den Zahlungsauftrag gibt es nicht.', 'fehler'); return; } $konten = $this->kontenMitBank(); // Ein Auftrag, dessen Bank nachträglich entfernt wurde, soll sein // Auftragskonto nicht verlieren – sonst würde beim Speichern // unbemerkt ein anderes Konto gewählt. if (!in_array((int)$auftrag['konto_id'], array_column($konten, 'id'), true)) { $bisheriges = Konto::find((int)$auftrag['konto_id']); if ($bisheriges !== null) { $konten[] = $bisheriges; } } $this->render('zahlungsverkehr/formular.php', [ 'titel' => 'Überweisung an ' . $auftrag['empfaenger'], 'auftrag' => $auftrag, 'konten' => $konten, 'adressen' => Adresse::alle(), 'kategorien' => Kategorie::baumFlach(null, true), 'klassen' => Klasse::alle(), ]); } /** @param array $params */ public function speichern(array $params): void { $this->verlangeAnmeldung(); $id = (int)$params['id']; try { Zahlungsauftrag::speichern($id, $this->formulardaten()); } catch (\Throwable $e) { View::redirect('/zahlungsverkehr/' . $id, $e->getMessage(), 'fehler'); return; } View::redirect('/zahlungsverkehr/' . $id, 'Überweisung gespeichert.'); } /** @param array $params */ public function loeschen(array $params): void { $this->verlangeAnmeldung(); try { Zahlungsauftrag::loeschen((int)$params['id']); } catch (\Throwable $e) { View::redirect('/zahlungsverkehr', $e->getMessage(), 'fehler'); return; } View::redirect('/zahlungsverkehr', 'Überweisung gelöscht.'); } /** @param array $params */ public function stornieren(array $params): void { $this->verlangeAnmeldung(); Zahlungsauftrag::stornieren((int)$params['id']); View::redirect('/zahlungsverkehr', 'Überweisung storniert.'); } // ── Absenden ───────────────────────────────────────────────────────────── /** @param array $params */ public function senden(array $params): void { $this->verlangeAnmeldung(); $this->zeige(FinTsUeberweisung::senden((int)$params['id'])); } public function tanFormular(): void { $this->verlangeAnmeldung(); $tan = FinTsUeberweisung::offeneTanAnfrage(); if ($tan === null) { View::redirect('/zahlungsverkehr', 'Es wartet keine Überweisung auf eine Freigabe.'); return; } $this->render('zahlungsverkehr/tan.php', [ 'titel' => 'Überweisung freigeben', 'tan' => $tan, 'meldung' => 'Die Bank verlangt eine Freigabe.', ]); } public function tanEinreichen(): void { $this->verlangeAnmeldung(); $this->zeige(FinTsUeberweisung::tanEinreichen($this->post('tan'))); } public function vopFormular(): void { $this->verlangeAnmeldung(); $vop = FinTsUeberweisung::offeneVopAnfrage(); if ($vop === null) { View::redirect('/zahlungsverkehr', 'Es wartet kein Namensabgleich auf eine Bestätigung.'); return; } $this->render('zahlungsverkehr/vop.php', [ 'titel' => 'Namensabgleich prüfen', 'vop' => $vop, 'meldung' => 'Die Bank meldet eine Abweichung beim Namensabgleich.', ]); } public function vopBestaetigen(): void { $this->verlangeAnmeldung(); $this->zeige(FinTsUeberweisung::vopBestaetigen()); } public function tanAbbrechen(): void { $this->verlangeAnmeldung(); FinTsUeberweisung::abbrechen(); View::redirect('/zahlungsverkehr', 'Vorgang abgebrochen. Der Auftrag bleibt als Entwurf stehen.'); } /** @param array $ergebnis */ private function zeige(array $ergebnis): void { if ($ergebnis['status'] === 'vop') { $this->render('zahlungsverkehr/vop.php', [ 'titel' => 'Namensabgleich prüfen', 'vop' => $ergebnis['vop'] ?? [], 'meldung' => $ergebnis['meldung'], ]); return; } if ($ergebnis['status'] === 'tan') { $this->render('zahlungsverkehr/tan.php', [ 'titel' => 'Überweisung freigeben', 'tan' => $ergebnis['tan'] ?? [], 'meldung' => $ergebnis['meldung'], ]); return; } View::redirect( '/zahlungsverkehr', $ergebnis['meldung'], $ergebnis['status'] === 'erfolg' ? 'erfolg' : 'fehler' ); } /** * Konten, denen eine Bankverbindung zugeordnet ist – nur die kommen als * Auftragskonto infrage, denn ohne Bank lässt sich nichts senden. * * @return list> */ private function kontenMitBank(): array { $zugangJeKonto = Bankzugang::zugangJeKonto(); return array_values(array_filter( Konto::alle(true), static fn(array $konto): bool => isset($zugangJeKonto[(int)$konto['id']]) )); } /** @return array */ private function formulardaten(): array { $kontoId = (int)$this->post('konto_id'); return [ 'konto_id' => $kontoId, // Die Bank ergibt sich aus dem Auftragskonto – eine eigene Auswahl // gibt es im Formular nicht mehr. 'zugang_id' => Bankzugang::zugangJeKonto()[$kontoId] ?? null, 'empfaenger' => $this->post('empfaenger'), 'iban' => $this->post('iban'), 'bic' => $this->post('bic'), 'betrag' => str_replace(',', '.', $this->post('betrag')), 'waehrung' => $this->post('waehrung', 'EUR'), 'verwendungszweck' => $this->post('verwendungszweck'), 'ausfuehrung_am' => $this->post('ausfuehrung_am'), 'echtzeit' => isset($_POST['echtzeit']), 'kategorie_id' => $this->post('kategorie_id'), 'klasse_id' => $this->post('klasse_id'), ]; } }