Files
MABEA/backend/app/services/mangel.py
T
patrickandClaude Sonnet 5 eb20affd5d
CI / backend-tests (push) Failing after 1m37s
CI / frontend-build (push) Successful in 18s
feat(mangel): Mangel-Ticket-System (Roadmap Phase 2)
Eigener Workflow für Schäden/Defekte, getrennt von Fehlbestand (Mengen-
Abweichung Soll/Ist). Status: neu → in_bearbeitung → ersatzteil_bestellt/
reparatur_geplant → erledigt. entitaet_typ/entitaet_id optional (Objektposition
oder Geräteinstanz), analog zum bestehenden historie.entitaet_typ-Muster,
objekt_id immer gesetzt für Dashboard-Abfragen.

Ein offener Mangel mit prioritaet=hoch macht das Objekt "nicht einsatzbereit"
(neuer Grund mangel_kritisch_offen in dashboard.einsatzbereitschaft) -
niedrige/normale Mängel blockieren nicht.

Melden/Lesen: alle Mitarbeiter+. Status ändern: Materialverantwortliche+.
Neue Seite /maengel für alle eingeloggten Nutzer (Nav-Link "Mängel").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC8HYvv6UkCVYheYiTw9DD
2026-09-05 13:23:38 +02:00

34 lines
1.1 KiB
Python

from datetime import datetime, timezone
from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.mangel import Mangel, MangelPrioritaet, MangelStatus
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 erledige_mangel(db: AsyncSession, *, mangel: Mangel, benutzer_id: int) -> Mangel:
mangel.status = MangelStatus.erledigt
mangel.erledigt_von = benutzer_id
mangel.erledigt_am = datetime.now(timezone.utc)
await db.flush()
return mangel