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>
55 lines
1.5 KiB
PHP
55 lines
1.5 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace Finanzmanager;
|
||
|
||
use Finanzmanager\Models\Benutzer;
|
||
|
||
/**
|
||
* Liefert die benutzer_id, unter der Stammdaten und Buchungen geführt werden.
|
||
*
|
||
* Die Oberfläche ist einbenutzerig, das Datenmodell nicht (PLAN.md, Kapitel 3).
|
||
* Im Web kommt die Kennung aus der Session; CLI-Skripte (Import, Migration von
|
||
* Altdaten) haben keine – dort greift der erste aktive Benutzer, solange kein
|
||
* anderer über setze() vorgegeben wurde.
|
||
*/
|
||
class Mandant
|
||
{
|
||
private static ?int $festgelegt = null;
|
||
|
||
public static function id(): int
|
||
{
|
||
if (self::$festgelegt !== null) {
|
||
return self::$festgelegt;
|
||
}
|
||
|
||
$ausSession = Auth::benutzerId();
|
||
if ($ausSession !== null) {
|
||
return $ausSession;
|
||
}
|
||
|
||
$id = Database::fetchValue(
|
||
'SELECT id FROM benutzer WHERE aktiv = 1 ORDER BY id LIMIT 1'
|
||
);
|
||
if ($id === null || $id === false) {
|
||
throw new \RuntimeException(
|
||
'Kein Benutzer vorhanden. Zuerst die Ersteinrichtung durchführen.'
|
||
);
|
||
}
|
||
|
||
return (int)$id;
|
||
}
|
||
|
||
/** Für CLI-Skripte und Tests: Mandanten fest vorgeben. */
|
||
public static function setze(?int $benutzerId): void
|
||
{
|
||
self::$festgelegt = $benutzerId;
|
||
}
|
||
|
||
/** Gibt es überhaupt einen Mandanten? Ohne Ausnahme, für Prüfungen vorab. */
|
||
public static function vorhanden(): bool
|
||
{
|
||
return Benutzer::anzahl() > 0;
|
||
}
|
||
}
|