fix(historie): Audit-Lücke bei Mangel/Personal/Objekt-Änderungen geschlossen
CI / backend-tests (push) Failing after 1m47s
CI / frontend-build (push) Successful in 17s

Bisher waren nur Kontrolle/Fehlbestand/Nachfüllung/Mindermenge/Geräteinstanz
im append-only Audit-Log (historie.log() war seit Prompt 13 nie flächendeckend
verdrahtet, docstring sagte das bereits so). Drei neue Ereignisse ergänzt:

- mangel_gemeldet / mangel_status_geaendert (Mangel-Modul)
- qualifikation_erfasst (Personal-Modul, sicherheitsrelevant: "wer hat wem
  wann eine Qualifikation bestätigt" hängt fachlich direkt an "wer darf
  fahren")
- objekt_geaendert (Status-/Fahrzeug-Zuordnungsänderungen via PATCH /objekte)

Lagerbewegung bewusst NICHT zusätzlich in historie dupliziert - hat bereits
eigenes vollständiges Audit-Trail (Wer/Wann/Von/Nach/Grund in eigener
Tabelle).

Frontend: Änderungslog-Filter um geraet_instanz/mangel/benutzer_qualifikation/
objekt ergänzt (geraet_instanz fehlte dort zuvor ebenfalls).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC8HYvv6UkCVYheYiTw9DD
This commit is contained in:
2026-09-05 13:50:48 +02:00
co-authored by Claude Sonnet 5
parent 417df2beb6
commit 11ad747136
9 changed files with 201 additions and 16 deletions
+32
View File
@@ -196,3 +196,35 @@ async def test_unbefristete_qualifikation_erscheint_nicht_im_dashboard(client, a
response = await client.get("/api/v1/dashboard/qualifikationsablaeufe", headers=auth_header(token))
assert response.json() == []
@pytest.mark.asyncio
async def test_qualifikation_erfassen_steht_in_historie(client, admin_user, mitarbeiter_user):
from datetime import date
token = await login(client, "admin1")
quali = await client.post(
"/api/v1/qualifikationstypen",
json={"name": "Maschinist", "kategorie": "lehrgang"},
headers=auth_header(token),
)
quali_id = quali.json()["id"]
erfasst = await client.post(
f"/api/v1/benutzer/{mitarbeiter_user.id}/qualifikationen",
json={
"benutzer_id": mitarbeiter_user.id,
"qualifikationstyp_id": quali_id,
"erworben_am": date.today().isoformat(),
},
headers=auth_header(token),
)
qualifikation_id = erfasst.json()["id"]
historie = await client.get(
f"/api/v1/historie?entitaet_typ=benutzer_qualifikation&entitaet_id={qualifikation_id}",
headers=auth_header(token),
)
body = historie.json()
assert len(body) == 1
assert body[0]["ereignistyp"] == "qualifikation_erfasst"