fix(dashboard): nie kontrollierte Objekte gelten nicht mehr als einsatzbereit
CI / backend-tests (push) Failing after 1m54s
CI / frontend-build (push) Successful in 16s

Nutzer-Fund (Readiness-Backlog-Review): einsatzbereitschaft() zählte ein
Objekt ohne jede Kontrolle bisher als "einsatzbereit", weil keine Kriterien
verletzt waren - fachlich falsch, "nie geprüft" ist nicht dasselbe wie
"geprüft und in Ordnung".

Neuer vierter Zustand "unbekannt": Objekte ohne abgeschlossene Kontrolle UND
ohne sonstige Blocker fallen jetzt hierunter statt unter "einsatzbereit".
Objekte mit anderen Gründen (Fehlbestand/Mangel/Prüfung/...) bleiben davon
unberührt, die zählten schon vorher korrekt.

Tests angepasst: zwei bestehende Tests nutzten ungeprüfte Objekte und
erwarteten fälschlich "einsatzbereit" - jetzt entweder explizit kontrolliert
(Ist=Soll) oder auf "unbekannt" korrigiert, plus neuer Test für den Kernfall.

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 15:47:39 +02:00
co-authored by Claude Sonnet 5
parent f158cb87bb
commit fab3a06073
6 changed files with 92 additions and 6 deletions
+14 -2
View File
@@ -14,6 +14,7 @@ from app.models.objektposition import Objektposition
from app.models.personal import BenutzerQualifikation, Qualifikationstyp
from app.models.stammdaten import Material
from app.services.mangel import objekt_ids_mit_kritischem_offenem_mangel
from app.services.objekte import letzte_kontrollen_map
# Prompt 12.2: offen/in_bearbeitung/nachgefuellt_teilweise zählen gemeinsam als "offen"
# (technischer Substatus ist keine Erledigung, Prompt 03/20).
@@ -171,6 +172,11 @@ async def einsatzbereitschaft(db: AsyncSession) -> dict:
objekt_ids_kritischer_mangel = await objekt_ids_mit_kritischem_offenem_mangel(db)
# Nutzer-Fund (Readiness-Review): ein nie kontrolliertes Objekt hatte bisher als
# "einsatzbereit" gegolten, weil keine Kriterien verletzt waren - fachlich falsch,
# "nie geprüft" ist nicht dasselbe wie "geprüft und in Ordnung".
letzte_kontrolle_map = await letzte_kontrollen_map(db, [o.id for o in objekte])
objekt_ids_hu_uvv_ueberfaellig = set(
(
await db.execute(
@@ -190,7 +196,7 @@ async def einsatzbereitschaft(db: AsyncSession) -> dict:
.all()
)
bereit = eingeschraenkt = 0
bereit = eingeschraenkt = unbekannt = 0
details: list[dict] = []
for objekt in objekte:
gruende: list[str] = []
@@ -216,6 +222,11 @@ async def einsatzbereitschaft(db: AsyncSession) -> dict:
details.append(
{"objekt_id": objekt.id, "code": objekt.code, "name": objekt.name, "gruende": ["mindermenge_genehmigt"]}
)
elif not gruende and letzte_kontrolle_map.get(objekt.id) is None:
unbekannt += 1
details.append(
{"objekt_id": objekt.id, "code": objekt.code, "name": objekt.name, "gruende": ["noch_nie_kontrolliert"]}
)
elif not gruende:
bereit += 1
else:
@@ -224,7 +235,8 @@ async def einsatzbereitschaft(db: AsyncSession) -> dict:
return {
"einsatzbereit": bereit,
"eingeschraenkt_einsatzbereit": eingeschraenkt,
"nicht_einsatzbereit": len(objekte) - bereit - eingeschraenkt,
"unbekannt": unbekannt,
"nicht_einsatzbereit": len(objekte) - bereit - eingeschraenkt - unbekannt,
"gesamt": len(objekte),
"details": details,
}