feat(wartung): MAINT-005 Ersatzteile/Kosten je Wartungsauftrag
CI / backend-tests (push) Successful in 2m22s
CI / frontend-build (push) Successful in 25s

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:
2026-09-08 22:06:02 +02:00
co-authored by Claude Sonnet 5
parent 3b5cf8feab
commit 847c303a97
14 changed files with 5232 additions and 6 deletions
+22
View File
@@ -10,6 +10,7 @@ from app.models.wartung import (
IntervallTyp,
Wartungsauftrag,
WartungsauftragStatus,
WartungsauftragTeil,
Wartungsintervall,
Wartungsplan,
WartungsplanPosition,
@@ -135,6 +136,27 @@ async def liste_wartungsauftraege(
return list(result.scalars().all())
async def erstelle_wartungsauftrag_teil(
db: AsyncSession, *, auftrag_id, bezeichnung: str, menge: Decimal, kosten: Decimal
) -> WartungsauftragTeil:
teil = WartungsauftragTeil(auftrag_id=auftrag_id, bezeichnung=bezeichnung, menge=menge, kosten=kosten)
db.add(teil)
await db.flush()
return teil
async def liste_wartungsauftrag_teile(db: AsyncSession, *, auftrag_id) -> list[WartungsauftragTeil]:
result = await db.execute(
select(WartungsauftragTeil).where(WartungsauftragTeil.auftrag_id == auftrag_id)
)
return list(result.scalars().all())
async def entferne_wartungsauftrag_teil(db: AsyncSession, *, teil: WartungsauftragTeil) -> None:
await db.delete(teil)
await db.flush()
async def faellige_wartungen_fuer_objekt(db: AsyncSession, objekt: Objekt) -> list[dict]:
"""MAINT-002: kombiniert Zeit-/km-/Betriebsstunden-Intervalle je Position -
fällig, sobald das erste Kriterium erreicht ist. Nie durchgeführt gilt