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:
- Bestand für alle gepickten Positionen reduzieren
- Stock Movements für jede Position eintragen (
movement_type: 'pick') - 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 = trueauf dempicklist_item- Beim Abschluss wird keine Buchung für diese Position erzeugt
- Die zugehörigen Aufträge werden nicht auf
pickedgesetzt (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
| Merkmal | Kommissionierung | Nachfüllung |
|---|---|---|
| Buchungszeitpunkt | Beim Abschluss der gesamten Pickliste | Sofort bei jeder Position |
| Buchungsrichtung | Lagerplatz → (Versand) | Lagerplatz → Lagerplatz |
| Reservierung | Ja (bis Versand/Ausbuchen) | Nicht nötig (Echtzeit) |
| Teilmengen | Möglich (Picker bestimmt Menge) | Möglich (Mitarbeiter bestimmt Menge) |
| Storno-Verhalten | Keine Buchungen rückgängig nötig | Bereits gebuchte Bewegungen bleiben |
Weitere Details zur Nachfüllung: Nachfüllung – Prozess-Details