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
70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.api.deps import require_roles
|
|
from app.db.session import get_db
|
|
from app.models.auth import RolleTyp
|
|
from app.schemas.dashboard import (
|
|
AblaufdatumRead,
|
|
EinsatzbereitschaftRead,
|
|
KennzahlenRead,
|
|
PrueftermineintragRead,
|
|
QualifikationsablaufRead,
|
|
)
|
|
from app.services.dashboard import (
|
|
bevorstehende_ablaufdaten,
|
|
bevorstehende_prueftermine,
|
|
bevorstehende_qualifikationsablaeufe,
|
|
einsatzbereitschaft,
|
|
kennzahlen,
|
|
)
|
|
|
|
router = APIRouter()
|
|
|
|
_verantwortliche = require_roles(
|
|
RolleTyp.administration, RolleTyp.materialverantwortlicher, RolleTyp.leitungsverantwortlicher
|
|
)
|
|
|
|
|
|
@router.get("/dashboard/kennzahlen", response_model=KennzahlenRead)
|
|
async def hole_kennzahlen(db: AsyncSession = Depends(get_db), _=Depends(_verantwortliche)) -> KennzahlenRead:
|
|
"""Prompt 12.1: Zielgruppe Materialverantwortlicher/Leitungsverantwortlicher/
|
|
Administration. Filterung nach Zuständigkeitsbereich (Karte 04) folgt später,
|
|
V1 zeigt globale Zahlen für diese Rollen."""
|
|
return KennzahlenRead(**await kennzahlen(db))
|
|
|
|
|
|
@router.get("/dashboard/ablaufdaten", response_model=list[AblaufdatumRead])
|
|
async def hole_ablaufdaten(db: AsyncSession = Depends(get_db), _=Depends(_verantwortliche)) -> list[AblaufdatumRead]:
|
|
return [AblaufdatumRead(**eintrag) for eintrag in await bevorstehende_ablaufdaten(db)]
|
|
|
|
|
|
@router.get("/dashboard/einsatzbereitschaft", response_model=EinsatzbereitschaftRead)
|
|
async def hole_einsatzbereitschaft(
|
|
db: AsyncSession = Depends(get_db), _=Depends(_verantwortliche)
|
|
) -> EinsatzbereitschaftRead:
|
|
"""Kachel 1 Leitungs-Dashboard: einsatzbereit/eingeschränkt/nicht einsatzbereit
|
|
je Objekt, siehe app/services/dashboard.py:einsatzbereitschaft für die
|
|
Kriterien und die Mindermenge-Sonderrolle (U2, Karte 08)."""
|
|
return EinsatzbereitschaftRead(**await einsatzbereitschaft(db))
|
|
|
|
|
|
@router.get("/dashboard/prueftermine", response_model=list[PrueftermineintragRead])
|
|
async def hole_prueftermine(
|
|
db: AsyncSession = Depends(get_db), _=Depends(_verantwortliche)
|
|
) -> list[PrueftermineintragRead]:
|
|
"""Kachel 2 Leitungs-Dashboard: Geräteprüfungen (Karte 14), bewusst getrennt
|
|
von /dashboard/ablaufdaten (Nutzer-Entscheidung: Prüfung ≠ Ablauf)."""
|
|
return [PrueftermineintragRead(**eintrag) for eintrag in await bevorstehende_prueftermine(db)]
|
|
|
|
|
|
@router.get("/dashboard/qualifikationsablaeufe", response_model=list[QualifikationsablaufRead])
|
|
async def hole_qualifikationsablaeufe(
|
|
db: AsyncSession = Depends(get_db), _=Depends(_verantwortliche)
|
|
) -> list[QualifikationsablaufRead]:
|
|
"""Kachel Personal-Modul: bald ablaufende/abgelaufene Führerscheine/
|
|
Lehrgänge/Berechtigungen."""
|
|
return [
|
|
QualifikationsablaufRead(**eintrag) for eintrag in await bevorstehende_qualifikationsablaeufe(db)
|
|
]
|