feat(dashboard): drei fehlende Kacheln (Kennzahlen, Mängel, Qualifikationsablauf)
CI / backend-tests (push) Failing after 1m40s
CI / frontend-build (push) Successful in 17s

Kennzahlen: bestehender Endpoint /dashboard/kennzahlen war seit Prompt 12.1
nie im Frontend verdrahtet - jetzt eigene Kachel (offene Fehlbestände,
genehmigte Mindermengen, kürzlich erledigt, problematische Objekte, Objekte
gesamt).

Mängel: eigene Übersicht (offen/kritisch-Zahl + aufklappbare Liste) zusätzlich
zur bisherigen Erwähnung als Grund in Kachel 1 - nutzt bestehendes GET
/maengel, kein neuer Backend-Code.

Qualifikationsablauf: neuer Endpoint /dashboard/qualifikationsablaeufe
(bevorstehende_qualifikationsablaeufe(), 60 Tage Vorlauf) - analog
bevorstehende_prueftermine, aber für BenutzerQualifikation.gueltig_bis
(Nutzer-Vorgabe: "wer verliert bald Führerschein/Lehrgang-Gültigkeit").

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:38:42 +02:00
co-authored by Claude Sonnet 5
parent 15fb8dbb16
commit e9904d5bea
6 changed files with 248 additions and 1 deletions
+59
View File
@@ -137,3 +137,62 @@ async def test_benutzer_einheit_zuordnung(client, admin_user):
f"/api/v1/benutzer/{benutzer_id}", json={"einheit_id": None}, headers=auth_header(token)
)
assert geloest.json()["einheit_id"] is None
@pytest.mark.asyncio
async def test_bald_ablaufende_qualifikation_erscheint_im_dashboard(
client, admin_user, mitarbeiter_user
):
from datetime import date, timedelta
token = await login(client, "admin1")
quali = await client.post(
"/api/v1/qualifikationstypen",
json={"name": "Führerschein C1", "kategorie": "fuehrerschein"},
headers=auth_header(token),
)
quali_id = quali.json()["id"]
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() - timedelta(days=365)).isoformat(),
"gueltig_bis": (date.today() + timedelta(days=10)).isoformat(),
},
headers=auth_header(token),
)
response = await client.get("/api/v1/dashboard/qualifikationsablaeufe", headers=auth_header(token))
body = response.json()
assert len(body) == 1
assert body[0]["status"] == "bald_ablaufend"
assert body[0]["benutzer_id"] == mitarbeiter_user.id
@pytest.mark.asyncio
async def test_unbefristete_qualifikation_erscheint_nicht_im_dashboard(client, admin_user, mitarbeiter_user):
from datetime import date, timedelta
token = await login(client, "admin1")
quali = await client.post(
"/api/v1/qualifikationstypen",
json={"name": "Sanitätshelfer", "kategorie": "lehrgang"},
headers=auth_header(token),
)
quali_id = quali.json()["id"]
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() - timedelta(days=365)).isoformat(),
"gueltig_bis": None,
},
headers=auth_header(token),
)
response = await client.get("/api/v1/dashboard/qualifikationsablaeufe", headers=auth_header(token))
assert response.json() == []