Objekt bleibt der Materialträger (Rucksack/Gerät/Fahrzeug, Karte 11) -
"Material verschieben" heißt: das Objekt bekommt einen neuen Standort, jede
Bewegung wird append-only protokolliert (Wer/Wann/Von/Nach/Grund, Nutzer-
Vorgabe Modul 5).
POST /objekte/{id}/lagerbewegungen setzt Standort + protokolliert in einem
Zug, GET /lagerbewegungen (Filter objekt_id/standort_id) für die Historie.
Rollen wie beim Mangel-Modul: Materialverantwortliche+Leitung+Admin dürfen
verschieben, alle Eingeloggten dürfen lesen.
Frontend: "Verschieben"-Aktion in ObjektSection, neuer Admin-Tab
"Lagerbewegungen" (reine Anzeige, analog HistorieSection).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC8HYvv6UkCVYheYiTw9DD
27 lines
896 B
Python
27 lines
896 B
Python
from datetime import datetime, timezone
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models.lagerbewegung import Lagerbewegung
|
|
from app.models.objekt import Objekt
|
|
|
|
|
|
async def verschiebe_objekt(
|
|
db: AsyncSession, *, objekt: Objekt, nach_standort_id: int, benutzer_id: int, grund: str | None
|
|
) -> Lagerbewegung:
|
|
"""Roadmap Phase 4 (Modul Lager): setzt objekt.standort_id und protokolliert
|
|
die Bewegung in einem Zug - von_standort_id ist der ALTE Stand vor dem
|
|
Setzen (muss vor der Zuweisung gelesen werden)."""
|
|
bewegung = Lagerbewegung(
|
|
objekt_id=objekt.id,
|
|
von_standort_id=objekt.standort_id,
|
|
nach_standort_id=nach_standort_id,
|
|
benutzer_id=benutzer_id,
|
|
zeitpunkt=datetime.now(timezone.utc),
|
|
grund=grund,
|
|
)
|
|
objekt.standort_id = nach_standort_id
|
|
db.add(bewegung)
|
|
await db.flush()
|
|
return bewegung
|