feat: add editable KVNR field in case detail view with dedicated API endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
CCS Admin 2026-02-24 11:07:49 +00:00
parent ab0ed453fa
commit 97731552c5
2 changed files with 87 additions and 2 deletions

View file

@ -340,6 +340,49 @@ def set_case_icd(
return case return case
# ---------------------------------------------------------------------------
# KVNR update
# ---------------------------------------------------------------------------
@router.put("/{case_id}/kvnr", response_model=CaseResponse)
def set_case_kvnr(
case_id: int,
payload: dict,
request: Request,
db: Session = Depends(get_db),
user: User = Depends(get_current_user),
):
"""Update the KVNR for a case. Accessible to both admin and dak_mitarbeiter."""
case = db.query(Case).filter(Case.id == case_id).first()
if not case:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Case not found",
)
old_kvnr = case.kvnr
new_kvnr = payload.get("kvnr")
case.kvnr = new_kvnr
case.updated_by = user.id
db.commit()
db.refresh(case)
log_action(
db,
user_id=user.id,
action="kvnr_updated",
entity_type="case",
entity_id=case.id,
old_values={"kvnr": old_kvnr},
new_values={"kvnr": new_kvnr},
ip_address=request.client.host if request.client else None,
user_agent=request.headers.get("user-agent"),
)
return case
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Coding (Gutachten classification) # Coding (Gutachten classification)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View file

@ -311,16 +311,36 @@ function CaseDetail({
onIcdSaved: (updated: Case) => void onIcdSaved: (updated: Case) => void
}) { }) {
const [icdValue, setIcdValue] = useState(caseData.icd || '') const [icdValue, setIcdValue] = useState(caseData.icd || '')
const [kvnrValue, setKvnrValue] = useState(caseData.kvnr || '')
const [saving, setSaving] = useState(false) const [saving, setSaving] = useState(false)
const [savingKvnr, setSavingKvnr] = useState(false)
const [error, setError] = useState('') const [error, setError] = useState('')
const [success, setSuccess] = useState(false) const [success, setSuccess] = useState(false)
const [kvnrSuccess, setKvnrSuccess] = useState(false)
// Reset on case change // Reset on case change
useEffect(() => { useEffect(() => {
setIcdValue(caseData.icd || '') setIcdValue(caseData.icd || '')
setKvnrValue(caseData.kvnr || '')
setError('') setError('')
setSuccess(false) setSuccess(false)
}, [caseData.id, caseData.icd]) setKvnrSuccess(false)
}, [caseData.id, caseData.icd, caseData.kvnr])
const saveKvnr = async () => {
setSavingKvnr(true)
setError('')
setKvnrSuccess(false)
try {
const res = await api.put<Case>(`/cases/${caseData.id}/kvnr`, { kvnr: kvnrValue.trim() || null })
onIcdSaved(res.data)
setKvnrSuccess(true)
} catch {
setError('Fehler beim Speichern der KVNR.')
} finally {
setSavingKvnr(false)
}
}
const saveIcd = async () => { const saveIcd = async () => {
if (!icdValue.trim()) return if (!icdValue.trim()) return
@ -361,7 +381,29 @@ function CaseDetail({
<DetailField label="Vorname" value={caseData.vorname} /> <DetailField label="Vorname" value={caseData.vorname} />
<DetailField label="Nachname" value={caseData.nachname} /> <DetailField label="Nachname" value={caseData.nachname} />
<DetailField label="Geburtsdatum" value={caseData.geburtsdatum ? formatDate(caseData.geburtsdatum) : null} /> <DetailField label="Geburtsdatum" value={caseData.geburtsdatum ? formatDate(caseData.geburtsdatum) : null} />
<DetailField label="KVNR" value={caseData.kvnr} /> <div className="col-span-2">
<label className="text-sm text-muted-foreground">KVNR (Versichertennummer)</label>
<div className="flex gap-2 mt-1">
<Input
value={kvnrValue}
onChange={(e) => { setKvnrValue(e.target.value); setKvnrSuccess(false) }}
placeholder="z.B. A123456789"
className="flex-1 font-mono"
/>
<Button
size="sm"
variant="outline"
onClick={saveKvnr}
disabled={savingKvnr || kvnrValue === (caseData.kvnr || '')}
>
<Save className="size-4 mr-1" />
{savingKvnr ? '...' : 'Speichern'}
</Button>
</div>
{kvnrSuccess && (
<p className="text-sm text-green-600 mt-1">KVNR gespeichert.</p>
)}
</div>
<DetailField label="Versicherung" value={caseData.versicherung} /> <DetailField label="Versicherung" value={caseData.versicherung} />
</div> </div>