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>
87 lines
3.6 KiB
PHP
87 lines
3.6 KiB
PHP
<?php
|
||
|
||
use Finanzmanager\View;
|
||
|
||
/** @var list<array<string,mixed>> $klassen */
|
||
/** @var string $csrfToken */
|
||
|
||
include __DIR__ . '/../layout/kopf.php';
|
||
?>
|
||
|
||
<div class="seitenaktionen">
|
||
<a href="/verwaltung" class="knopf">Zurück zur Verwaltung</a>
|
||
<a href="/verwaltung/import" class="knopf">QIF-Import</a>
|
||
</div>
|
||
|
||
<p class="hinweis">
|
||
Klassen sind die zweite Auswertungsdimension neben der Kategorie: dieselbe Ausgabe lässt
|
||
sich damit zusätzlich einer Person, einem Haus oder einem Projekt zuordnen.
|
||
</p>
|
||
|
||
<?php if ($klassen === []): ?>
|
||
<p class="platzhalter">Noch keine Klassen angelegt.</p>
|
||
<?php else: ?>
|
||
<?php
|
||
// Die Formulare stehen außerhalb der Tabelle und werden über das
|
||
// form-Attribut angesprochen – ein <form> zwischen <tr> und <td> wäre
|
||
// ungültiges HTML und würde vom Browser aus der Tabelle geschoben.
|
||
foreach ($klassen as $klasse): ?>
|
||
<form id="klasse-<?= (int)$klasse['id'] ?>" method="post"
|
||
action="/verwaltung/klassen/<?= (int)$klasse['id'] ?>"></form>
|
||
<form id="klasse-loeschen-<?= (int)$klasse['id'] ?>" method="post"
|
||
action="/verwaltung/klassen/<?= (int)$klasse['id'] ?>/loeschen"
|
||
onsubmit="return confirm('Klasse „<?= View::h($klasse['name']) ?>“ löschen?');"></form>
|
||
<?php endforeach; ?>
|
||
|
||
<table class="liste">
|
||
<thead>
|
||
<tr><th>Name</th><th>Beschreibung</th><th>Status</th><th class="rechts">Aktion</th></tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php foreach ($klassen as $klasse): ?>
|
||
<?php $f = 'klasse-' . (int)$klasse['id']; ?>
|
||
<tr<?= (int)$klasse['aktiv'] === 1 ? '' : ' class="inaktiv"' ?>>
|
||
<td>
|
||
<input type="hidden" form="<?= $f ?>" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||
<input type="text" form="<?= $f ?>" name="name"
|
||
value="<?= View::h($klasse['name']) ?>" required>
|
||
</td>
|
||
<td>
|
||
<input type="text" form="<?= $f ?>" name="beschreibung"
|
||
value="<?= View::h($klasse['beschreibung']) ?>">
|
||
</td>
|
||
<td>
|
||
<label class="ankreuzfeld">
|
||
<input type="checkbox" form="<?= $f ?>" name="aktiv" value="1"
|
||
<?= (int)$klasse['aktiv'] === 1 ? 'checked' : '' ?>> aktiv
|
||
</label>
|
||
</td>
|
||
<td class="rechts nowrap">
|
||
<input type="hidden" form="klasse-loeschen-<?= (int)$klasse['id'] ?>"
|
||
name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||
<button type="submit" form="<?= $f ?>" class="knopf klein">Speichern</button>
|
||
<button type="submit" form="klasse-loeschen-<?= (int)$klasse['id'] ?>"
|
||
class="knopf klein gefahr">Löschen</button>
|
||
</td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
<?php endif; ?>
|
||
|
||
<form method="post" action="/verwaltung/klassen/neu" class="formular breit">
|
||
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
|
||
<h3>Neue Klasse</h3>
|
||
|
||
<label for="name">Name</label>
|
||
<input type="text" id="name" name="name" required>
|
||
|
||
<label for="beschreibung">Beschreibung <span class="optional">(optional)</span></label>
|
||
<input type="text" id="beschreibung" name="beschreibung">
|
||
|
||
<div class="knopfleiste">
|
||
<button type="submit" class="knopf primaer">Klasse anlegen</button>
|
||
</div>
|
||
</form>
|
||
|
||
<?php include __DIR__ . '/../layout/fuss.php'; ?>
|