Skip to Content

Kommissionierung – Prozess-Details

Diese Seite erklärt den technischen Ablauf hinter dem Kommissionierprozess: wann der Bestand gebucht wird, wie Status-Übergänge funktionieren und was bei Teilpicks passiert.

Status-Flow: Aufträge

Status-Flow: Picklisten

Zeitlinie einer Pickliste

Bestandsbuchung: Das Kernprinzip

Der Bestand wird erst am Ende gebucht — nicht während des Pickens.

Das ist ein zentrales Designprinzip. Die complete_picklist() Datenbankfunktion (RPC) fĂĽhrt am Ende des Pickens in einer einzigen atomaren Transaktion aus:

  1. Bestand fĂĽr alle gepickten Positionen reduzieren
  2. Stock Movements fĂĽr jede Position eintragen (movement_type: 'pick')
  3. Auftragsstatuse aktualisieren

Das bedeutet: Während der Picker die Pickliste abarbeitet, zeigt der Bestand noch die ursprünglichen Mengen. Erst nach Abschluss ist die Reduzierung im System sichtbar.

Warum diese Entscheidung?

Beim Picken verlässt die Ware das Lager Richtung Versand. Der genaue Zeitpunkt des Buchens innerhalb des Pick-Prozesses ist weniger kritisch als beim Nachfüllen (wo Ware den Platz wechselt und der Bestand jederzeit stimmen muss). Eine Buchung am Ende vereinfacht Fehlerfälle: Wenn eine Pickliste abgebrochen wird, gibt es nichts rückzubuchen.

Keine Reservierung bei Picklisten-Erstellung

Wenn eine Pickliste erstellt wird, wird der Bestand nicht reserviert. Das bedeutet:

  • Zwei Picklisten können theoretisch dieselben Artikel enthalten
  • Wer zuerst abschlieĂźt, bucht den Bestand
  • Falls beim zweiten Abschluss nicht mehr genug Bestand da ist: die betroffenen Positionen werden als is_out_of_stock markiert

Dieses Verhalten ist fĂĽr die Praxis akzeptabel, weil Picklisten typischerweise nicht stark ĂĽberlappen und der Lagerleiter die Picklisten-Erstellung kontrolliert.

Was trackt total_quantity_picked?

Das Feld total_quantity_picked auf picklist_items wächst während des Pickens mit jeder Bestätigung. Es spiegelt wider, wie viel der Picker tatsächlich genommen hat — und ist die Grundlage für die spätere Buchung.

Beispiel: Der Picker soll 5 Einheiten nehmen, findet aber nur 3 → total_quantity_picked = 3. Am Ende werden genau 3 Einheiten vom Bestand abgezogen.

Teilpicks: Was passiert?

Ein Teilpick entsteht, wenn der Picker weniger nimmt als gefordert:

Bei Teilpicks gilt:

  • Nur tatsächlich gepickte Mengen werden gebucht — niemals mehr als total_quantity_picked
  • Aufträge, fĂĽr die alle Positionen vollständig gedeckt sind, erhalten Status picked
  • Aufträge mit fehlenden Positionen bleiben auf ihrem aktuellen Status und mĂĽssen in einer neuen Pickliste abgearbeitet werden

is_out_of_stock

Wenn der Picker eine Position als “Nicht vorrätig” markiert:

  • is_out_of_stock = true auf dem picklist_item
  • Beim Abschluss wird keine Buchung fĂĽr diese Position erzeugt
  • Die zugehörigen Aufträge werden nicht auf picked gesetzt (die Position gilt als ungeklärt)
  • Im Abschluss-Ergebnis erscheint die Position unter items_out_of_stock

Manueller Abschluss durch Admin

Admins können eine Pickliste mit der Option “Manuell abschließen” beenden. In diesem Fall setzt das System total_quantity_picked = total_quantity_required für alle nicht-out-of-stock Positionen — also werden alle geforderten Mengen als gebucht behandelt, unabhängig davon, was der Picker tatsächlich eingegeben hat.

Einsatz: Wenn eine Pickliste außerplanmäßig beendet werden muss (z.B. Picker ausgefallen, Ware bereits physisch entnommen).

Technische Details: complete_picklist() RPC

Die complete_picklist() SQL-Funktion fĂĽhrt alle Buchungen in einer einzigen Transaktion aus:

Schritt 1 — Temp-Tabelle: Alle zu buchenden Positionen (NOT is_out_of_stock AND total_quantity_picked > 0) werden in eine temporäre Tabelle geschrieben.

Schritt 2 — Batch-UPDATE: Die stock-Tabelle wird für alle Positionen auf einmal aktualisiert (quantity - total_quantity_picked). Die CHECK-Bedingung (quantity >= 0) verhindert negativen Bestand.

Schritt 3 — Batch-INSERT: stock_movements werden für alle Positionen in einem einzigen INSERT erzeugt (movement_type: 'pick', negativer quantity_change).

Schritt 4 — Auftragsstatus: Ein set-based UPDATE setzt alle vollständig abgearbeiteten Aufträge auf picked. Ein Auftrag gilt als vollständig, wenn keine seiner Picklist-Assignments unter-versorgt oder is_out_of_stock ist.

Die Funktion ist als SECURITY DEFINER deklariert und läuft mit erhöhten DB-Rechten — alle RLS-Prüfungen werden durch explizite Workspace- und Nutzer-Checks in der Funktion selbst ersetzt.

Picking vs. NachfĂĽllung: Der entscheidende Unterschied

MerkmalKommissionierungNachfĂĽllung
BuchungszeitpunktBeim Abschluss der gesamten PicklisteSofort bei jeder Position
BuchungsrichtungLagerplatz → (Versand)Lagerplatz → Lagerplatz
ReservierungKeineNicht nötig (Echtzeit)
TeilmengenMöglich (Picker bestimmt Menge)Möglich (Mitarbeiter bestimmt Menge)
Storno-VerhaltenKeine Buchungen rückgängig nötigBereits gebuchte Bewegungen bleiben

Weitere Details zur Nachfüllung: Nachfüllung – Prozess-Details