feat: Sonderführungen automatisch im Register SoFue2 nachtragen — Version 1.13.0

Beim Speichern eines Logbuch-Eintrags der Art 'SF' wird der passende
Datensatz in SoFue2 über das Datum gesucht und dort stattgefunden=1,
anzahl_echt, bezahlt und remarks gesetzt. Gibt es an dem Tag mehrere
Führungen, gewinnt die zeitlich nächstgelegene.

Das Ergebnis kommt als Feld 'sofue' aus der PHP-Bridge zurück und wird
über dem Formular angezeigt — grün bei Erfolg, gelb, wenn keine Führung
gefunden wurde. Der Logbuch-Eintrag wird in dem Fall trotzdem gespeichert.
Die Meldung liegt in MainClient, weil LogbuchForm beim Bearbeiten durch
onSaved() neu gemountet wird.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-08 12:57:22 +02:00
parent cfa1852d5e
commit b5b75e0d77
10 changed files with 78 additions and 13 deletions
+8 -4
View File
@@ -1,7 +1,7 @@
'use client';
import { useEffect, useRef, useState } from 'react';
import type { Kuppel, ArtFuehrung, SpendeArt, BeoOption, SelectedObjekt, Wetter, LogbuchEintrag } from '@/types/logbuch';
import type { Kuppel, ArtFuehrung, SpendeArt, BeoOption, SelectedObjekt, SofueStatus, Wetter, LogbuchEintrag } from '@/types/logbuch';
import { ARTEN, ARTEN_MAP, artLabel, SPENDE_ARTEN, spendeLabel } from '@/types/logbuch';
import BeoSelector from './BeoSelector';
import ObjektSelector from './ObjektSelector';
@@ -12,7 +12,8 @@ interface Props {
kuppel: Kuppel;
currentUserBeo: BeoOption;
editEntry?: LogbuchEintrag | null;
onSaved: () => void;
/** sofue: Ergebnis der Rückschreibung ins Sonderführungs-Register, sofern erfolgt. */
onSaved: (sofue?: SofueStatus | null) => void;
}
function toLocalDatetimeValue(isoOrDatetime: string): string {
@@ -214,6 +215,7 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(await res.text());
const daten: { sofue?: SofueStatus } = await res.json().catch(() => ({}));
setSuccess(true);
setTimeout(() => setSuccess(false), 5000);
if (!editEntry) {
@@ -227,7 +229,9 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
setSpende('');
setSpendeBetragRaw('');
}
onSaved();
// Die Meldung zur Sonderführung gehört nach oben: beim Bearbeiten wird dieses
// Formular durch onSaved() neu gemountet und verlöre eigenen State sofort.
onSaved(daten.sofue ?? null);
} catch {
setError('Fehler beim Speichern. Bitte erneut versuchen.');
} finally {
@@ -440,7 +444,7 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
{editEntry && (
<button
type="button"
onClick={onSaved}
onClick={() => onSaved()}
className="w-full sm:w-auto px-6 py-1 bg-gray-200 hover:bg-gray-300 text-gray-700 font-medium rounded-lg transition-colors text-sm"
>
Abbrechen