mirror of
https://github.com/complexcaresolutions/dak.c2s.git
synced 2026-03-17 18:23:42 +00:00
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:
parent
ab0ed453fa
commit
97731552c5
2 changed files with 87 additions and 2 deletions
|
|
@ -340,6 +340,49 @@ def set_case_icd(
|
|||
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)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -311,16 +311,36 @@ function CaseDetail({
|
|||
onIcdSaved: (updated: Case) => void
|
||||
}) {
|
||||
const [icdValue, setIcdValue] = useState(caseData.icd || '')
|
||||
const [kvnrValue, setKvnrValue] = useState(caseData.kvnr || '')
|
||||
const [saving, setSaving] = useState(false)
|
||||
const [savingKvnr, setSavingKvnr] = useState(false)
|
||||
const [error, setError] = useState('')
|
||||
const [success, setSuccess] = useState(false)
|
||||
const [kvnrSuccess, setKvnrSuccess] = useState(false)
|
||||
|
||||
// Reset on case change
|
||||
useEffect(() => {
|
||||
setIcdValue(caseData.icd || '')
|
||||
setKvnrValue(caseData.kvnr || '')
|
||||
setError('')
|
||||
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 () => {
|
||||
if (!icdValue.trim()) return
|
||||
|
|
@ -361,7 +381,29 @@ function CaseDetail({
|
|||
<DetailField label="Vorname" value={caseData.vorname} />
|
||||
<DetailField label="Nachname" value={caseData.nachname} />
|
||||
<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} />
|
||||
</div>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue