Konten, Kontengruppen, Kategorien und Klassen samt Übernahme aus dem
QIF-Export des Lexware FinanzManagers.
Kontenübersicht nach Kontengruppen gebündelt, mit Gruppensummen und
Gesamtsumme; die drei Saldospalten (Online-Saldo, aktueller und erwarteter
Saldo) sind angelegt und werden bis Phase 2 aus dem Anfangssaldo gespeist.
Kategorien sind hierarchisch mit ":" als Trenner. Der vollständige Pfad
steht redundant in der Tabelle, weil jede Anzeige und der gesamte Import
darüber laufen; Umbenennen und Verschieben schreiben den Teilbaum neu. Die
Art (Einnahme/Ausgabe) gilt für den ganzen Ast. Register wie im Original:
Alle, Einnahmen, Ausgaben, Umbuchungskonten.
QifParser liest zustandsbehaftet und sequenziell, wandelt ISO-8859-1 nach
UTF-8 und versteht US-Beträge sowie das Datumsformat aus der Kopfzeile.
QifStammdatenImport ist idempotent und bietet Trockenlauf und Protokoll -
im Dialog unter Verwaltung sowie über scripts/qif-import.php. Am echten
Export geprüft: 17 Klassen, 105 Kategorien, 37 Konten.
Enthält außerdem die Korrektur der englischen Monatsnamen im
Einstellungsdialog: date('F') ist sprachlich nicht umschaltbar, deshalb
liegen die Namen jetzt zentral als View::MONATE vor. Die Änderung ließ
sich nicht als eigener Commit trennen, weil sie dieselben Dateien berührt
wie Phase 1.
Tests: 227 PHP-Prüfungen und 14 Playwright-Tests, alle grün.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
59 lines
2.7 KiB
PHP
59 lines
2.7 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Finanzmanager\View;
|
||
|
||
class DarstellungTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 05: Darstellung (Formate auf Deutsch)';
|
||
|
||
public function run(): void
|
||
{
|
||
$this->monatsnamen();
|
||
$this->betraege();
|
||
$this->datumsformat();
|
||
}
|
||
|
||
private function monatsnamen(): void
|
||
{
|
||
$this->assertEquals('Januar', View::monat(1), 'Erster Monat heißt Januar');
|
||
$this->assertEquals('März', View::monat(3), 'Umlaut im Monatsnamen bleibt erhalten');
|
||
$this->assertEquals('Dezember', View::monat(12), 'Letzter Monat heißt Dezember');
|
||
$this->assertEquals('Mär', View::monat(3, true), 'Kurzform mit Umlaut');
|
||
$this->assertEquals('Dez', View::monat(12, true), 'Kurzform des letzten Monats');
|
||
|
||
$this->assertEquals(12, count(View::MONATE), 'Zwölf Monatsnamen');
|
||
$this->assertEquals(12, count(View::MONATE_KURZ), 'Zwölf Kurzformen');
|
||
|
||
// Vollständige Sollliste: date('F') liefert englische Namen, und für
|
||
// April, August, September und November fällt das nicht auf, weil sie
|
||
// in beiden Sprachen gleich heißen. Deshalb Wert für Wert vergleichen.
|
||
$soll = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
|
||
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
|
||
foreach ($soll as $i => $name) {
|
||
$this->assertEquals($name, View::monat($i + 1), 'Monat ' . ($i + 1) . ' heißt ' . $name);
|
||
$this->assertNotEmpty(View::monat($i + 1, true), 'Kurzform für Monat ' . ($i + 1) . ' vorhanden');
|
||
}
|
||
|
||
// Ungültige Werte dürfen die Oberfläche nicht zerlegen.
|
||
$this->assertEquals('0', View::monat(0), 'Unbekannter Monat gibt die Zahl zurück');
|
||
$this->assertEquals('13', View::monat(13), 'Monat außerhalb des Bereichs gibt die Zahl zurück');
|
||
}
|
||
|
||
private function betraege(): void
|
||
{
|
||
$this->assertEquals('1.234,50', View::betrag(1234.5, false), 'Deutsches Zahlenformat');
|
||
$this->assertEquals("1.234,50\u{00A0}€", View::betrag(1234.5), 'Währung mit geschütztem Leerzeichen');
|
||
$this->assertEquals('-58.457,07', View::betrag(-58457.07, false), 'Negativer Betrag');
|
||
$this->assertEquals('betrag negativ', View::betragKlasse(-1), 'Negative Beträge werden markiert');
|
||
$this->assertEquals('betrag', View::betragKlasse(0), 'Null gilt nicht als negativ');
|
||
}
|
||
|
||
private function datumsformat(): void
|
||
{
|
||
$this->assertEquals('18.03.2026', View::datum('2026-03-18'), 'Deutsches Datumsformat');
|
||
$this->assertEquals('18.03.2026', View::datum('2026-03-18 14:22:01'), 'Zeitanteil wird abgeschnitten');
|
||
$this->assertEquals('–', View::datum(null), 'Leeres Datum als Gedankenstrich');
|
||
}
|
||
}
|