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
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, model_validator
|
||||
|
||||
from app.models.mangel import MangelPrioritaet, MangelStatus
|
||||
|
||||
EntitaetTyp = Literal["objektposition", "geraet_instanz"]
|
||||
|
||||
|
||||
class MangelCreate(BaseModel):
|
||||
objekt_id: int
|
||||
entitaet_typ: EntitaetTyp | None = None
|
||||
entitaet_id: str | None = None
|
||||
beschreibung: str
|
||||
prioritaet: MangelPrioritaet = MangelPrioritaet.normal
|
||||
|
||||
@model_validator(mode="after")
|
||||
def _entitaet_beide_oder_keins(self) -> "MangelCreate":
|
||||
if (self.entitaet_typ is None) != (self.entitaet_id is None):
|
||||
raise ValueError("entitaet_typ und entitaet_id müssen beide gesetzt oder beide leer sein")
|
||||
return self
|
||||
|
||||
|
||||
class MangelRead(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
id: uuid.UUID
|
||||
objekt_id: int
|
||||
entitaet_typ: str | None
|
||||
entitaet_id: str | None
|
||||
beschreibung: str
|
||||
prioritaet: MangelPrioritaet
|
||||
status: MangelStatus
|
||||
gemeldet_von: int
|
||||
gemeldet_am: datetime
|
||||
erledigt_von: int | None
|
||||
erledigt_am: datetime | None
|
||||
|
||||
|
||||
class MangelStatusUpdate(BaseModel):
|
||||
status: MangelStatus
|
||||
Reference in New Issue
Block a user