Finanzmanager/src/Views/verwaltung/bargeld.php
fds2610-bot aeb8254840 Fix #21: Bargeld-Tool auch bei Adresse mit /api/v1 erreichen
Der Verbindungstest meldete „Das Bargeld-Tool kennt die Schnittstelle nicht
(HTTP 404)“, sobald die hinterlegte Adresse den Schnittstellenpfad schon
enthielt: Der Finanzmanager hängt ihn selbst an und fragte damit unter
/api/v1/api/v1/status an.

Die Adresse aus der Browserzeile zu kopieren ist der naheliegende Weg, und
der Pfad ist dort mit dabei. Ein abschließendes /api oder /api/v1 kürzt
BargeldTool::basisadresse() deshalb weg – beim Speichern und noch einmal im
Konstruktor, damit auch schon gespeicherte Adressen greifen. Ein
Unterverzeichnis davor bleibt erhalten, ein Hostname wie apianbieter.example
bleibt unangetastet.

Bereits gespeicherte Adressen räumt Migration 017 auf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 08:15:45 +02:00

126 lines
5.3 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
use Finanzmanager\View;
/**
* Die Konfiguration des Bargeld-Tools: Adresse, Zugangsdaten und die Auswahl
* der Kategorien, deren Buchungen dort nachgeschlagen werden.
*
* @var string $url
* @var string $benutzerkennung
* @var bool $hatPasswort
* @var int $tage
* @var list<array<string,mixed>> $kategorien Baum, flach mit 'ebene'
* @var list<int> $auswahl
* @var bool $schluessel APP_KEY vorhanden?
* @var string $csrfToken
*/
$gewaehlt = array_fill_keys($auswahl, true);
include __DIR__ . '/../layout/kopf.php';
?>
<div class="seitenaktionen">
<a href="/verwaltung" class="knopf">Zurück zur Verwaltung</a>
<a href="/verwaltung/kategorien" class="knopf">Kategorien</a>
<?php if ($url !== ''): ?>
<form method="post" action="/verwaltung/bargeld/test" class="inline">
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<button type="submit" class="knopf">Verbindung testen</button>
</form>
<?php endif; ?>
</div>
<p class="feldhinweis">
Bargeldausgaben werden in einem eigenen Programm erfasst. Ist hier eine Adresse
hinterlegt, fragt der Finanzmanager beim Zuweisen einer der unten gewählten
Kategorien dort nach, ob es im Suchzeitraum vor dem Buchungsdatum eine Buchung
mit demselben Betrag gibt. Das Ergebnis steht danach als Symbol im Kontoblatt –
grüner Haken gefunden, rotes X nicht gefunden, Ausrufezeichen Abruf gescheitert.
</p>
<?php if (!$schluessel): ?>
<p class="feldhinweis warnend">
<code>APP_KEY</code> ist nicht gesetzt. Ohne ihn lässt sich kein Passwort
speichern – die übrigen Angaben schon.
</p>
<?php endif; ?>
<form method="post" action="/verwaltung/bargeld" class="formular breit">
<input type="hidden" name="csrf_token" value="<?= View::h($csrfToken) ?>">
<label for="bargeld_url">Adresse</label>
<input type="text" id="bargeld_url" name="bargeld_url" value="<?= View::h($url) ?>"
placeholder="https://…" inputmode="url">
<p class="feldhinweis">
Die Basisadresse des Bargeld-Tools ohne Pfad; der Finanzmanager hängt
<code>/api/v1/buchungen</code> selbst an. Ein mitkopiertes <code>/api/v1</code>
am Ende entfernt er beim Speichern. Leer lassen schaltet den Abgleich ab –
das Kontoblatt zeigt dann überall den grauen Kreis.
</p>
<label for="bargeld_benutzer">Benutzerkennung</label>
<input type="text" id="bargeld_benutzer" name="bargeld_benutzer"
value="<?= View::h($benutzerkennung) ?>" autocomplete="off">
<label for="bargeld_passwort">Passwort</label>
<input type="password" id="bargeld_passwort" name="bargeld_passwort" autocomplete="off"
<?= $hatPasswort ? 'placeholder="unverändert lassen"' : '' ?>>
<p class="feldhinweis">
Wird AES-verschlüsselt gespeichert (Schlüssel <code>APP_KEY</code>) und nie wieder
angezeigt.
<?php if ($hatPasswort): ?>
Leer lassen heißt: bisheriges Passwort behalten.
<?php endif; ?>
</p>
<?php if ($hatPasswort): ?>
<label class="ankreuzfeld">
<input type="checkbox" name="passwort_loeschen" value="1">
<span>Gespeichertes Passwort löschen</span>
</label>
<?php endif; ?>
<label for="bargeld_tage">Suchzeitraum in Tagen</label>
<input type="number" id="bargeld_tage" name="bargeld_tage" value="<?= (int)$tage ?>"
min="1" max="365" class="schmal">
<p class="feldhinweis">
So viele Tage wird rückwärts ab dem Buchungsdatum gesucht. Bargeld wird
ausgegeben, bevor der Umsatz auf dem Konto ankommt – nie danach.
</p>
<h3>Abzugleichende Kategorien</h3>
<p class="feldhinweis">
Nur Buchungen dieser Kategorien werden nachgeschlagen. Alle anderen bleiben
unberührt und zeigen im Kontoblatt den grauen Kreis. Wird eine Kategorie hier
abgewählt, verlieren ihre Buchungen den bisherigen Abgleichstatus.
</p>
<div class="auswahlliste">
<?php if ($kategorien === []): ?>
<p class="platzhalter">Es gibt noch keine Kategorien.</p>
<?php endif; ?>
<?php foreach ($kategorien as $kategorie): ?>
<?php /* Eingerückt über data-ebene, nicht über ein style-Attribut:
Das verwirft die Content-Security-Policy (style-src 'self'). */ ?>
<label class="ankreuzfeld baumwahl" data-ebene="<?= min(6, (int)$kategorie['ebene']) ?>">
<input type="checkbox" name="kategorien[]" value="<?= (int)$kategorie['id'] ?>"
<?= isset($gewaehlt[(int)$kategorie['id']]) ? 'checked' : '' ?>>
<span>
<?= View::h($kategorie['name']) ?>
<span class="nebentext">
<?= (string)$kategorie['art'] === 'einnahme' ? 'Einnahme' : 'Ausgabe' ?>
<?= (int)$kategorie['aktiv'] === 1 ? '' : '· inaktiv' ?>
</span>
</span>
</label>
<?php endforeach; ?>
</div>
<div class="knopfleiste">
<button type="submit" class="knopf primaer">Speichern</button>
<a href="/verwaltung" class="knopf">Abbrechen</a>
</div>
</form>
<?php include __DIR__ . '/../layout/fuss.php'; ?>