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.

Reservierung bei Picklisten-Erstellung

Sobald eine Pickliste erstellt wird, wird der zugeteilte Bestand reserviert — auf Ebene des einzelnen Lagerplatzes. Das bedeutet:

  • Der reservierte Bestand wird in der verfügbaren Menge anderer Prozesse abgezogen (verfügbar = Bestand − reserviert).
  • Eine zweite Picklisten-Erstellung, eine Umlagerung oder eine manuelle Bestandskorrektur kann reservierten Bestand nicht mehr wegnehmen — die Datenbank blockiert Buchungen, die unter die reservierte Menge fallen würden.
  • Die Reservierung bleibt bestehen, bis der Bestand tatsächlich das Lager verlässt (Versand bzw. Ausbuchen), und wird beim Stornieren/Löschen der Pickliste automatisch wieder freigegeben.

Die Reservierung ist rein abgeleitet — sie wird bei jeder Abfrage aus den offenen Picklisten berechnet, es gibt kein separat gepflegtes Reservierungs-Feld:

  • Profil-basierte Picklisten reservieren über ihre Auftrags-Zuteilungen (offene Positionen, die noch nicht versendet sind).
  • Manuelle Picklisten (z.B. FBA-Anlieferungen) reservieren die volle geplante Menge, bis sie ausgebucht oder gelöscht werden. Damit kann der reguläre Versand die für eine FBA-Anlieferung eingeplante Ware nicht mehr versehentlich wegpicken.

Hinweis: Eine als „Nicht vorrätig” (is_out_of_stock) markierte Position gibt ihren reservierten Bestand wieder frei — der Picker hat die Ware am zugeteilten Platz nicht gefunden.

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
ReservierungJa (bis Versand/Ausbuchen)Nicht 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