feat(wartung): MAINT-005 Ersatzteile/Kosten je Wartungsauftrag
Neue Tabelle wartungsauftrag_teil (Migration 0033), CRUD-Endpunkte
/wartungsauftraege/{id}/teile, UI-Panel in WartungSection.tsx mit
Summenanzeige. Backlog Epic 22 (UI-Redesign Runde 2, Kacheln UI2-001..005)
als geplant ergänzt, Umsetzung folgt separat.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
@@ -8,26 +8,31 @@ from app.api.deps import get_current_user, require_roles
|
||||
from app.db.session import get_db
|
||||
from app.models.auth import Benutzer, RolleTyp
|
||||
from app.models.objekt import Objekt
|
||||
from app.models.wartung import Wartungsauftrag, Wartungsplan, WartungsauftragStatus
|
||||
from app.models.wartung import Wartungsauftrag, WartungsauftragTeil, Wartungsplan, WartungsauftragStatus
|
||||
from app.schemas.wartung import (
|
||||
FaelligeWartungRead,
|
||||
WartungsauftragCreate,
|
||||
WartungsauftragErledigen,
|
||||
WartungsauftragRead,
|
||||
WartungsauftragStatusUpdate,
|
||||
WartungsauftragTeilCreate,
|
||||
WartungsauftragTeilRead,
|
||||
WartungsplanCreate,
|
||||
WartungsplanPositionRead,
|
||||
WartungsplanRead,
|
||||
)
|
||||
from app.services.wartung import (
|
||||
aendere_status,
|
||||
entferne_wartungsauftrag_teil,
|
||||
erledige_wartungsauftrag,
|
||||
erstelle_wartungsauftrag,
|
||||
erstelle_wartungsauftrag_teil,
|
||||
erstelle_wartungsplan,
|
||||
faellige_wartungen_fuer_objekt,
|
||||
hole_intervalle,
|
||||
hole_positionen_mit_intervallen,
|
||||
liste_wartungsauftraege,
|
||||
liste_wartungsauftrag_teile,
|
||||
)
|
||||
|
||||
router = APIRouter()
|
||||
@@ -151,3 +156,45 @@ async def route_erledigen(
|
||||
kilometerstand_bei_erledigung=payload.kilometerstand_bei_erledigung,
|
||||
betriebsstunden_bei_erledigung=payload.betriebsstunden_bei_erledigung,
|
||||
)
|
||||
|
||||
|
||||
@router.get("/wartungsauftraege/{auftrag_id}/teile", response_model=list[WartungsauftragTeilRead])
|
||||
async def liste_teile(
|
||||
auftrag_id: uuid.UUID, db: AsyncSession = Depends(get_db), _=Depends(get_current_user)
|
||||
) -> list[WartungsauftragTeil]:
|
||||
auftrag = await db.get(Wartungsauftrag, auftrag_id)
|
||||
if auftrag is None:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Wartungsauftrag nicht gefunden")
|
||||
return await liste_wartungsauftrag_teile(db, auftrag_id=auftrag_id)
|
||||
|
||||
|
||||
@router.post(
|
||||
"/wartungsauftraege/{auftrag_id}/teile",
|
||||
response_model=WartungsauftragTeilRead,
|
||||
status_code=status.HTTP_201_CREATED,
|
||||
)
|
||||
async def erstelle_teil(
|
||||
auftrag_id: uuid.UUID,
|
||||
payload: WartungsauftragTeilCreate,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_=Depends(_verantwortliche),
|
||||
) -> WartungsauftragTeil:
|
||||
auftrag = await db.get(Wartungsauftrag, auftrag_id)
|
||||
if auftrag is None:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Wartungsauftrag nicht gefunden")
|
||||
return await erstelle_wartungsauftrag_teil(
|
||||
db, auftrag_id=auftrag_id, bezeichnung=payload.bezeichnung, menge=payload.menge, kosten=payload.kosten
|
||||
)
|
||||
|
||||
|
||||
@router.delete("/wartungsauftraege/{auftrag_id}/teile/{teil_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
async def loesche_teil(
|
||||
auftrag_id: uuid.UUID,
|
||||
teil_id: uuid.UUID,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_=Depends(_verantwortliche),
|
||||
) -> None:
|
||||
teil = await db.get(WartungsauftragTeil, teil_id)
|
||||
if teil is None or teil.auftrag_id != auftrag_id:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Ersatzteil nicht gefunden")
|
||||
await entferne_wartungsauftrag_teil(db, teil=teil)
|
||||
|
||||
Reference in New Issue
Block a user