Finanzmanager/src/Services/Dateiformat.php
fds2610-bot 2c86e8522b Import und Export in QIF und CSV, Housekeeping für Importdateien
Aus der Kachel QIF-Import wird Import/Export mit je einem Knopf für beide
Richtungen; davor steht die Wahl des Dateiformats (QIF oder CSV), die als
Dialog und ohne Skript als eigene Seite funktioniert.

- CsvBuchungsImport/CsvTabelle: Buchungen samt Splitzeilen, Spalten über die
  Kopfzeile, dieselbe Dublettenerkennung und der Trockenlauf wie beim QIF.
- BuchungsExport/ExportController: Filter nach Zeitraum, Konto, Kategorie und
  Klasse; die Datei entsteht im Speicher, ein Exportverzeichnis gibt es nicht.
- Housekeeping: Hochgeladene Importdateien und data/tmp werden nach der
  eingestellten Frist gelöscht (Vorgabe 14 Tage, 0 schaltet ab).

Migration 013, Test 29 sowie E2E-Spec importexport.spec.js.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:01:30 +02:00

51 lines
1.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace Finanzmanager\Services;
/**
* Die Dateiformate, die Import und Export beherrschen.
*
* Beide Richtungen kennen dieselben Formate, deshalb stehen sie hier und nicht
* je einmal im Importeur und im Exporteur. Kommt ein drittes hinzu, ist das die
* einzige Liste, die es zu ergänzen gilt.
*/
class Dateiformat
{
/** Schlüssel → Bezeichnung in der Oberfläche. Der Schlüssel ist zugleich die Dateiendung. */
public const ALLE = [
'qif' => 'QIF',
'csv' => 'CSV',
];
/** Kurze Beschreibung für die Formatwahl. */
public const BESCHREIBUNGEN = [
'qif' => 'Das Format des Lexware FinanzManagers – Klassen, Kategorien, Konten und Buchungen in einer Datei.',
'csv' => 'Tabelle mit Semikolon als Trenner, für Tabellenkalkulationen. Nur Buchungen, dafür überall lesbar.',
];
public static function gueltig(string $format): bool
{
return isset(self::ALLE[strtolower(trim($format))]);
}
/** Der geprüfte Schlüssel, oder null. */
public static function pruefe(string $format): ?string
{
$format = strtolower(trim($format));
return isset(self::ALLE[$format]) ? $format : null;
}
public static function name(string $format): string
{
return self::ALLE[strtolower(trim($format))] ?? strtoupper($format);
}
/** Format zu einem Dateinamen – anhand der Endung. */
public static function ausDateiname(string $name): ?string
{
return self::pruefe(pathinfo($name, PATHINFO_EXTENSION));
}
}