#!/usr/bin/env php \n"); exit(1); } // Relative Angaben beziehen sich auf das Projektverzeichnis. if (!str_starts_with($datei, '/')) { $datei = dirname(__DIR__) . '/' . $datei; } if (!is_file($datei)) { fwrite(STDERR, "Datei nicht gefunden: {$datei}\n"); exit(1); } if ($benutzer !== null) { $zeile = Benutzer::findByName($benutzer); if ($zeile === null) { fwrite(STDERR, "Benutzer nicht gefunden: {$benutzer}\n"); exit(1); } Mandant::setze((int)$zeile['id']); } $stichtag ??= (string)Einstellung::get('import_stichtag', '2026-01-01'); $bis ??= date('Y-m-d'); // Die Konten der Datei nennen, ohne etwas anzufassen – so lässt sich // nachsehen, welche Namen --konto= überhaupt kennt. if ($nurKonten) { try { $parser = QifParser::ausDatei($datei); } catch (\Throwable $e) { fwrite(STDERR, 'Datei nicht lesbar: ' . $e->getMessage() . "\n"); exit(1); } echo 'Konten in ' . basename($datei) . ":\n"; foreach (QifBuchungsImport::kontenDerDatei($parser) as $name => $anzahl) { printf(" %-40s %6d Einträge\n", $name, $anzahl); } exit(0); } try { $parser = QifParser::ausDatei($datei); // Ein Tippfehler im Kontonamen bliebe sonst unbemerkt: Der Import liefe // durch und legte nichts an. $bekannt = array_keys(QifBuchungsImport::kontenDerDatei($parser)); foreach ($konten as $name) { if (!in_array($name, $bekannt, true)) { fwrite(STDERR, "Konto nicht in der Datei: {$name}\n"); fwrite(STDERR, "Vorhanden: " . implode(', ', $bekannt) . "\n"); exit(1); } } $stamm = (new QifStammdatenImport($parser))->ausfuehren(!$uebernehmen); $buch = null; if (!$nurStammdaten) { $buch = (new QifBuchungsImport($parser, [ 'stichtag' => $stichtag, 'bis' => $bis, 'konten' => $konten, ]))->ausfuehren(!$uebernehmen); } } catch (\Throwable $e) { fwrite(STDERR, 'Import fehlgeschlagen: ' . $e->getMessage() . "\n"); exit(1); } echo ($uebernehmen ? 'Import' : 'Trockenlauf') . ': ' . basename($datei) . "\n"; $abschnitte = []; foreach ($parser->zusammenfassung() as $typ => $anzahl) { $abschnitte[] = "{$typ}: {$anzahl}"; } echo 'Datei enthält ' . implode(' · ', $abschnitte) . "\n\n"; printf("%-12s %8s %12s %8s\n", 'Bereich', $uebernehmen ? 'angelegt' : 'neu', 'vorhanden', 'Fehler'); foreach (['klassen' => 'Klassen', 'kategorien' => 'Kategorien', 'konten' => 'Konten'] as $schluessel => $titel) { printf( "%-12s %8d %12d %8d\n", $titel, $stamm[$schluessel]['neu'], $stamm[$schluessel]['vorhanden'], $stamm[$schluessel]['fehler'] ); } $meldungen = $stamm['meldungen']; if ($buch !== null) { printf("%-12s %8d %12d %8d\n", 'Buchungen', $buch['buchungen']['neu'], $buch['buchungen']['vorhanden'], $buch['buchungen']['fehler']); echo "\nZeitraum ab {$stichtag} bis {$bis}\n"; if ($buch['konten'] !== null) { echo ' nur die Konten: ' . implode(', ', $buch['konten']) . "\n"; printf(" wegen der Kontoauswahl übergangen: %4d Buchungen\n", $buch['buchungen']['nicht_gewaehlt']); } printf(" vor dem Stichtag verrechnet: %6d Buchungen auf %d Konten (Summe %s)\n", $buch['buchungen']['vor_stichtag'], $buch['anfangssalden']['konten'], number_format($buch['anfangssalden']['summe'], 2, ',', '.')); printf(" nach dem Enddatum verworfen: %6d vorausberechnete Buchungen\n", $buch['buchungen']['zukunft']); printf(" darunter Wertpapiergeschäfte: %5d (nur Geldfluss)\n", $buch['buchungen']['wertpapier']); $meldungen = array_merge($meldungen, $buch['meldungen']); } if ($meldungen !== []) { echo "\nProtokoll:\n"; foreach ($meldungen as $meldung) { echo ' - ' . $meldung['text'] . "\n"; } } if (!$uebernehmen) { echo "\nEs wurde nichts gespeichert. Mit --uebernehmen wird der Import durchgeführt.\n"; } $fehler = $stamm['klassen']['fehler'] + $stamm['kategorien']['fehler'] + $stamm['konten']['fehler'] + ($buch['buchungen']['fehler'] ?? 0); exit($fehler > 0 ? 1 : 0);