from datetime import datetime, timezone from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.models.mangel import Mangel, MangelPrioritaet, MangelStatus from app.services import historie as historie_service OFFENE_MANGEL_STATI = ( MangelStatus.neu, MangelStatus.in_bearbeitung, MangelStatus.ersatzteil_bestellt, MangelStatus.reparatur_geplant, ) async def objekt_ids_mit_kritischem_offenem_mangel(db: AsyncSession) -> set[int]: """Dashboard/Einsatzbereitschaft (Nutzer-Vorgabe): nur ein offener Mangel mit prioritaet=hoch macht ein Objekt "nicht einsatzbereit" - niedrige/normale Mängel sind Hinweise, aber kein Einsatzbereitschafts-Blocker.""" result = await db.execute( select(func.distinct(Mangel.objekt_id)).where( Mangel.status.in_(OFFENE_MANGEL_STATI), Mangel.prioritaet == MangelPrioritaet.hoch ) ) return set(result.scalars().all()) async def aendere_status( db: AsyncSession, *, mangel: Mangel, status: MangelStatus, benutzer_id: int, zustaendiger_server_id: int ) -> Mangel: """Historie-Lücke (Roadmap-Review): Status-Änderungen wurden bisher NICHT protokolliert - Mangel hatte anders als Kontrolle/Fehlbestand/Geräteinstanz kein Audit-Trail, obwohl "wer hat den Mangel auf erledigt gesetzt" fachlich genauso relevant ist.""" alter_status = mangel.status mangel.status = status if status == MangelStatus.erledigt: mangel.erledigt_von = benutzer_id mangel.erledigt_am = datetime.now(timezone.utc) await db.flush() await historie_service.log( db, zustaendiger_server_id=zustaendiger_server_id, benutzer_id=benutzer_id, ereignistyp="mangel_status_geaendert", entitaet_typ="mangel", entitaet_id=mangel.id, alter_wert={"status": alter_status.value}, neuer_wert={"status": status.value}, ) return mangel