Produkt-Bewegungen (ProductTransfers)
Zweck
ProductTransfer modelliert manuelle Bestandsbewegungen ausserhalb der automatisierten Workflows aus Verkaufs- und Bestellbelegen. Pro Bewegung wird movementType gepflegt:
movementType | Bedeutung | Quell-Lager | Ziel-Lager |
|---|---|---|---|
goodsReceipt | Wareneingang (z. B. Lager-Anlage) | — | erforderlich (Ziel) |
goodsIssue | Warenausgang (z. B. Verbrauch ohne Beleg) | erforderlich (Quelle) | — |
warehouseTransfer | Umlagerung | erforderlich | erforderlich |
inventory | Inventur-Korrektur | — | — (nur Mengen-Anpassung) |
Bei transferredAt = null ist der Transfer noch im Entwurf — Felder editierbar. Mit transferredAt-Timestamp wird die Bewegung gebucht und Felder werden read-only.
Voraussetzungen
Berechtigungen (CASL)
| Action | Subject | Wirkung | Keycloak-Rolle |
|---|---|---|---|
view | FE_ProductTransfer, ProductTransfer | Liste/Detail aufrufbar | — |
create/update/delete | ProductTransfer | Pflegen | APP_SPEAMCORE_CREATE/UPDATE/DELETE_PRODUCT_TRANSFER |
view | Warehouse | Lager-Auswahl | APP_SPEAMCORE_VIEW_WAREHOUSE |
view | WarehouseProduct | Produkt-Sub-Liste | APP_SPEAMCORE_VIEW_WAREHOUSE_PRODUCT |
Schritt-für-Schritt-Anleitung
Bewegung anlegen
- Produkt-Bewegungen (
/product-transfers) → + Neu. movementTypewählen — bestimmt, welche Lager-Felder Pflicht sind.- Bei
warehouseTransfer:fromWarehouseIdundtoWarehouseId. - Bei
goodsReceipt: nurtoWarehouseId. - Bei
goodsIssue: nurfromWarehouseId. - Bei
inventory: keine Lager-Felder (Korrektur erfolgt direkt am Bestand). descriptionals Erlaeuterung (z. B. „Umzug Lager A → Lager B").- Sub-Liste Produkte (
/product-transfers/:id/warehouse-products) — pro Produkt Menge eintragen.
Bewegung buchen
Mit dem Setzen von transferredAt wird die Bewegung gebucht und der Lagerbestand entsprechend aktualisiert. Felder sind danach read-only.

Toolbar (Detail-Seite)
Schlanke Toolbar oben rechts:
| Icon | Aktion (aria-label) | CASL | Wirkung |
|---|---|---|---|
| ← | Zurückgehen | — | Zurück zur Liste. |
| 🏠 | Zur Startseite gehen | — | Springt auf das Dashboard / /. |
| ⏮/◀/▶/⏭ | Pagination | — | Navigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung. |
Globale Floating-Drawer (links)
Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:
- KAL. (Mini-Kalender)
- ZEIT (Persoenliche Wochen-Arbeitszeit)
- ARBEIT (Eigene bevorstehende Aufträge)
Felder und Eingaben
| Feldname | Pflicht | Datentyp | Wirkung beim Ausfuellen | Voraussetzung |
|---|---|---|---|---|
movementType | ja (read-only) | ENUM | Bestimmt Lager-Felder. | — |
transferredAt | nein | DateTime | Gesetzt = Bewegung gebucht. Setzt alle anderen Felder auf read-only. | — |
fromWarehouseId | bedingt | UUID | Quell-Lager. | view:Warehouse, bei goodsIssue/warehouseTransfer Pflicht. |
toWarehouseId | bedingt | UUID | Ziel-Lager. | view:Warehouse, bei goodsReceipt/warehouseTransfer Pflicht. |
description | nein | TEXT | Erlaeuterung. | — |
Workflows und Zustaende
Anlege-Pattern
ProductTransfer ist eine Lager-zu-Lager-Bewegung (anders als WarehouseProduct.amount-Änderung, die Bestand-Buchungen abbildet):
fromWarehouseId/toWarehouseId— Quelle und Ziel.productId,quantity,transferredAt.- Optional:
transportEmployeeId,comment.
Der Transfer reduziert Bestand am Quell-Lager und erhoeht ihn am Ziel-Lager — atomare Operation. Reservierung waehrend des Transports (Bestand auf „in Transit" markiert) wird über den Status pending realisiert.
Wiederverwendbare Konzepte
Verknuepfungen zu anderen Modulen
- Lager — Quell-/Ziel-Lager.
- Lager-Spots — bei detaillierter Bestandsfuehrung.
- Inventuren — alternative Sicht für geplante Inventuren mit eigenem Workflow.
- Verkaufsbelege und Bestellbelege — automatisierte Bestandsbewegungen über Beleg-Lifecycle.
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/product-transfers | Liste | view ProductTransfer |
POST | /api/product-transfers | Anlegen | create ProductTransfer |
GET | /api/product-transfers/:id | Detail | view ProductTransfer |
PATCH | /api/product-transfers/:id | Ändern | update ProductTransfer |
DELETE | /api/product-transfers/:id | Soft-Delete | delete ProductTransfer |
GET | /api/warehouse-products?filter[productTransferId] | Produkt-Sub-Liste | view WarehouseProduct |
Versionshinweise
- 2026-04-30: Initiale Veroeffentlichung.