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>
51 lines
1.6 KiB
PHP
51 lines
1.6 KiB
PHP
<?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));
|
||
}
|
||
}
|