from sqlalchemy import or_, select from sqlalchemy.ext.asyncio import AsyncSession from app.models.objekt import Objekt from app.models.zustaendigkeit import Zustaendigkeit async def zustaendige_objekte(db: AsyncSession, benutzer_id: int) -> list[Objekt]: """Karte 04 / Sprintplan E2: ein Benutzer ist für ein Objekt zuständig, wenn ENTWEDER eine Standort-Zeile für dessen Standort ODER eine Objekt-Zeile für das Objekt selbst existiert (Vereinigung, keine Überschreibung – eine objektspezifische Zuordnung ergänzt die Standort-Vererbung, ersetzt sie nicht).""" standort_ids_subq = ( select(Zustaendigkeit.standort_id) .where(Zustaendigkeit.benutzer_id == benutzer_id, Zustaendigkeit.standort_id.is_not(None)) ) objekt_ids_subq = ( select(Zustaendigkeit.objekt_id) .where(Zustaendigkeit.benutzer_id == benutzer_id, Zustaendigkeit.objekt_id.is_not(None)) ) stmt = select(Objekt).where( or_( Objekt.standort_id.in_(standort_ids_subq), Objekt.id.in_(objekt_ids_subq), ) ) result = await db.execute(stmt) return list(result.scalars().all())