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>
126 lines
5.3 KiB
PHP
126 lines
5.3 KiB
PHP
<?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'; ?>
|