Zum Hauptinhalt springen

Produkt-Bewegungen (ProductTransfers)

Zweck

ProductTransfer modelliert manuelle Bestandsbewegungen ausserhalb der automatisierten Workflows aus Verkaufs- und Bestellbelegen. Pro Bewegung wird movementType gepflegt:

movementTypeBedeutungQuell-LagerZiel-Lager
goodsReceiptWareneingang (z. B. Lager-Anlage)erforderlich (Ziel)
goodsIssueWarenausgang (z. B. Verbrauch ohne Beleg)erforderlich (Quelle)
warehouseTransferUmlagerungerforderlicherforderlich
inventoryInventur-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

- Berechtigung `view:ProductTransfer` und `create:ProductTransfer`. - Lager-Berechtigungen (`view:Warehouse`). - Über die Sub-Liste werden konkrete Mengen pro [Warehouse-Product](/warehouses) gepflegt.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_ProductTransfer, ProductTransferListe/Detail aufrufbar
create/update/deleteProductTransferPflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_PRODUCT_TRANSFER
viewWarehouseLager-AuswahlAPP_SPEAMCORE_VIEW_WAREHOUSE
viewWarehouseProductProdukt-Sub-ListeAPP_SPEAMCORE_VIEW_WAREHOUSE_PRODUCT

Schritt-für-Schritt-Anleitung

Bewegung anlegen

  1. Produkt-Bewegungen (/product-transfers) → + Neu.
  2. movementType wählen — bestimmt, welche Lager-Felder Pflicht sind.
  3. Bei warehouseTransfer: fromWarehouseId und toWarehouseId.
  4. Bei goodsReceipt: nur toWarehouseId.
  5. Bei goodsIssue: nur fromWarehouseId.
  6. Bei inventory: keine Lager-Felder (Korrektur erfolgt direkt am Bestand).
  7. description als Erlaeuterung (z. B. „Umzug Lager A → Lager B").
  8. 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.

Listenansicht — product-transfers

Toolbar (Detail-Seite)

Schlanke Toolbar oben rechts:

IconAktion (aria-label)CASLWirkung
ZurückgehenZurück zur Liste.
🏠Zur Startseite gehenSpringt auf das Dashboard / /.
⏮/◀/▶/⏭PaginationNavigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung.

Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:

  • KAL. (Mini-Kalender)
  • ZEIT (Persoenliche Wochen-Arbeitszeit)
  • ARBEIT (Eigene bevorstehende Aufträge)

Felder und Eingaben

FeldnamePflichtDatentypWirkung beim AusfuellenVoraussetzung
movementTypeja (read-only)ENUMBestimmt Lager-Felder.
transferredAtneinDateTimeGesetzt = Bewegung gebucht. Setzt alle anderen Felder auf read-only.
fromWarehouseIdbedingtUUIDQuell-Lager.view:Warehouse, bei goodsIssue/warehouseTransfer Pflicht.
toWarehouseIdbedingtUUIDZiel-Lager.view:Warehouse, bei goodsReceipt/warehouseTransfer Pflicht.
descriptionneinTEXTErlaeuterung.

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

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/product-transfersListeview ProductTransfer
POST/api/product-transfersAnlegencreate ProductTransfer
GET/api/product-transfers/:idDetailview ProductTransfer
PATCH/api/product-transfers/:idÄndernupdate ProductTransfer
DELETE/api/product-transfers/:idSoft-Deletedelete ProductTransfer
GET/api/warehouse-products?filter[productTransferId]Produkt-Sub-Listeview WarehouseProduct

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung.