mirror of
https://github.com/complexcaresolutions/dak.c2s.git
synced 2026-03-17 21:53:41 +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
|
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)
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue