Files
MABEA/backend/app/models/lagerbewegung.py
T
patrickandClaude Sonnet 5 417df2beb6
CI / backend-tests (push) Failing after 1m47s
CI / frontend-build (push) Successful in 17s
feat(lager): Lagerbewegung-Protokoll (Roadmap Phase 4, Modul Lager)
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
2026-09-05 13:46:33 +02:00

25 lines
1.1 KiB
Python

import uuid
from datetime import datetime
from sqlalchemy import ForeignKey, String
from sqlalchemy.dialects.postgresql import TIMESTAMP, UUID
from sqlalchemy.orm import Mapped, mapped_column
from app.db.base import Base
class Lagerbewegung(Base):
"""Roadmap Phase 4 (Modul Lager): protokolliert Standortwechsel eines
Objekts (Rucksack/Gerät/Fahrzeug - der Materialträger, Karte 11). Append-
only wie Historie, keine Update/Delete-Operation vorgesehen."""
__tablename__ = "lagerbewegung"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
objekt_id: Mapped[int] = mapped_column(ForeignKey("objekt.id"), nullable=False)
von_standort_id: Mapped[int | None] = mapped_column(ForeignKey("standort.id"))
nach_standort_id: Mapped[int] = mapped_column(ForeignKey("standort.id"), nullable=False)
benutzer_id: Mapped[int] = mapped_column(ForeignKey("benutzer.id"), nullable=False)
zeitpunkt: Mapped[datetime] = mapped_column(TIMESTAMP(timezone=True), nullable=False)
grund: Mapped[str | None] = mapped_column(String)