feat(lager): Lagerbewegung-Protokoll (Roadmap Phase 4, Modul Lager)
CI / backend-tests (push) Failing after 1m47s
CI / frontend-build (push) Successful in 17s

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
This commit is contained in:
2026-09-05 13:46:33 +02:00
co-authored by Claude Sonnet 5
parent 8fbb356c34
commit 417df2beb6
12 changed files with 467 additions and 1 deletions
+11 -1
View File
@@ -10,6 +10,7 @@ import { EskalationSection } from "./admin/EskalationSection";
import { FachSection } from "./admin/FachSection";
import { HistorieSection } from "./admin/HistorieSection";
import { KategorieSection } from "./admin/KategorieSection";
import { LagerbewegungSection } from "./admin/LagerbewegungSection";
import { KontrollverantwortungSection } from "./admin/KontrollverantwortungSection";
import { MaterialSection } from "./admin/MaterialSection";
import { ObjektSection } from "./admin/ObjektSection";
@@ -30,7 +31,8 @@ type Tab =
| "eskalation"
| "kontrollverantwortung"
| "zustaendigkeit"
| "personal";
| "personal"
| "lagerbewegungen";
// Deckt sich mit den require_roles()-Gates der jeweiligen Backend-Endpunkte
// (Rollen-Vorgabe: Material-/Leitungsverantwortliche sahen bisher exakt
@@ -56,6 +58,11 @@ const TABS: { key: Tab; label: string; rollen: ("administration" | "materialvera
},
{ key: "eskalation", label: "Eskalation", rollen: ["administration"] },
{ key: "personal", label: "Personal", rollen: ["administration"] },
{
key: "lagerbewegungen",
label: "Lagerbewegungen",
rollen: ["administration", "materialverantwortlicher", "leitungsverantwortlicher"],
},
];
/**
@@ -212,6 +219,9 @@ export function AdminPage() {
<KontrollverantwortungSection objekte={objekte} benutzer={benutzer} onFehler={setFehler} />
)}
{aktiverTab === "historie" && <HistorieSection onFehler={setFehler} />}
{aktiverTab === "lagerbewegungen" && (
<LagerbewegungSection objekte={objekte} standorte={standorte} onFehler={setFehler} />
)}
{aktiverTab === "eskalation" && <EskalationSection onFehler={setFehler} />}
{aktiverTab === "personal" && (
<>