Korrekturen und Massenaufträge
Die vier Schreib-Endpunkte buchen je eine Bewegung. Was folgt, bucht viele oder bucht eine Differenz statt einer Menge oder wird innerhalb der Anfrage überhaupt nicht fertig.
POST warehouse/stock/countACL:p2lab_stockly.execute_stock_operations
Setzt Lagerplätze auf das, was jemand gezählt hat. Der Endpunkt nimmt einen ganzen Bogen entgegen, nicht eine Zeile:
{ "warehouseId": "0191f1…", "level": "aggregate", "comment": "Cycle count, aisle A", "lines": [ { "productId": "0191f3…", "binLocationId": "0191f2…", "countedQty": 22 }, { "productId": "0191f8…", "binLocationId": "0191f2…", "countedQty": 0 } ]}level ist aggregate (die Summe des Lagerplatzes für dieses Produkt) oder batch. Auf Chargenebene darf jede
Zeile außerdem batchId, batchNumber und expiresAt tragen.
Die Antwort meldet, was jede Zeile tatsächlich geändert hat:
{ "success": true, "results": [ { "productId": "0191f3…", "binLocationId": "0191f2…", "batchId": null, "delta": -2 }] }Gebucht wird nur die Differenz, als count-Bewegung. Eine Zeile, deren gezählte Zahl bereits übereinstimmt,
bucht nichts und meldet delta: 0. Eine Zählung von null ist berechtigt, weil ein leeres Fach buchbar sein muss,
eine negative wird aber mit P2LAB_STOCKLY__STOCK__NEGATIVE_COUNT abgelehnt: Eine körperliche Zählung hat keine
Richtung.
Die Systemmenge wird beim Anwenden der Korrektur neu gelesen, nicht als die Zählung stattfand, das Ergebnis entspricht also der gezählten Zahl, so viel zwischenzeitlich auch abgedriftet ist.
Ein Lot berichtigen
Abschnitt betitelt „Ein Lot berichtigen“
POST warehouse/stock/batch/{batchId}/correctACL:p2lab_stockly.execute_stock_operations
Beschriftet ein Lot neu: seine Nummer, sein Ablaufdatum. Bestandsneutral: Es bucht eine
batch_correction-Bewegung mit Menge null, die Historie des Produkts zeigt also, wann ein Lot neu datiert wurde,
ohne je zu behaupten, dass Einheiten sich bewegt hätten.
Aufräumen
Abschnitt betitelt „Aufräumen“| Methode | Pfad | Was er tut | ACL |
|---|---|---|---|
POST | warehouse/stock/delete-empty | lässt eine leere Bestandszeile nach stockId fallen | p2lab_stockly.execute_stock_operations |
POST | warehouse/stock/sync-product/{productId} | berechnet product.stock aus den Regalen neu | p2lab_stockly.execute_stock_operations |
delete-empty lehnt mit 409 not_deletable ab, wenn die Zeile noch Bestand oder reservierte Einheiten hält.
Die Absicherung steckt in der Löschanweisung selbst, eine Zeile, die einen Moment zuvor bedeutsam wurde, lässt
sich also nicht von einer Anfrage entfernen, die bereits unterwegs war.
sync-product ist die Reparatur für ein product.stock, das jemand anders überschrieben hat. Es braucht keine
Nutzdaten und lässt sich gefahrlos wiederholen, weil es den Wert ableitet, statt ihn anzupassen.
Aufträge, die im Hintergrund laufen
Abschnitt betitelt „Aufträge, die im Hintergrund laufen“Vier Vorgänge liefern sofort eine progressId zurück und laufen im Hintergrund weiter:
| Methode | Pfad | Startet | ACL |
|---|---|---|---|
POST | warehouse/stock/initialize/{warehouseId} | befüllt Bestandszeilen aus product.stock | p2lab_stockly.execute_stock_operations |
POST | warehouse/stock/transfer-bulk | entleert ein Lager in ein anderes | p2lab_stockly.execute_stock_operations |
POST | warehouse/{warehouseId}/auto-assign-bins | gibt jeder nicht zugeordneten Zeile einen vorgeschlagenen Lagerplatz | p2lab_stockly.execute_stock_operations |
POST | warehouse/stock/sync-variants | summiert Variantenbestand auf die Hauptprodukte auf | p2lab_stockly.execute_stock_operations |
Jeder antwortet {"success": true, "progressId": "0191f9…"}. Fragen Sie sie ab:
GET /api/_action/p2lab-stockly/warehouse/stock/job/{progressId}/status{ "progressId": "0191f9…", "status": "running", "totalItems": 4812, "processedItems": 1200, "error": null }initialize und sync-variants haben eigene Statusrouten,
warehouse/stock/initialize/{progressId}/status und warehouse/stock/sync-variants/{progressId}/status, mit
derselben Antwortform. Alle drei Statusrouten brauchen p2lab_stockly_task_progress:read, und das ist eine
andere Berechtigung als die, die den Auftrag gestartet hat: Ein System, das zusehen darf, ist nicht selbsttätig
eines, das handeln darf.
Eine unbekannte progressId ist eine 404.
Ein Lager befüllen
Abschnitt betitelt „Ein Lager befüllen“initialize kopiert product.stock auf den unassigned-Lagerplatz des Lagers, und es ist mit Absicht eng darin,
was es anfasst:
- nur Blattprodukte, weil der Bestand eines Hauptprodukts die Summe seiner Kinder ist und beides zu befüllen alles doppelt zählte;
- Produkte mit einem Bestand über null;
- Produkte, die noch in keinem Lager geführt werden, weil
product.stockdie Summe über das ganze Netz ist; einen Artikel zu befüllen, der bereits anderswo lebt, kopierte seine ganze Menge ein zweites Mal, und die nächste Neuberechnung bliese die Zahl auf.
Es ist ein einmaliger Einführungsschritt, keine Synchronisierung. Es zweimal auszuführen fügt nichts hinzu, und das ist die Absicht.
Verwandte Berechtigungen
Abschnitt betitelt „Verwandte Berechtigungen“p2lab_stockly.execute_stock_operations deckt den gewöhnlichen Schreibweg ab. Vier Vorgänge sind gesondert
begrenzt, weil sie Entscheidungen sind statt Bewegungen:
| Berechtigung | Sichert |
|---|---|
p2lab_stockly.commit_stocktake | das Buchen oder Zurücknehmen einer Bestandskontrollsitzung |
p2lab_stockly.variance_approve | das Freigeben von Positionen, die ein Abweichungstor zurückgehalten hat |
p2lab_stockly.reassign_bins | das Verschieben eines Lagerplatzes samt Bestand in ein anderes Lager |
p2lab_stockly.run_integrity_fix | das Anwenden einer Integritätsreparatur und das Übernehmen offener Bestellungen |
Einer Integration, die nur Bewegungen bucht, sollte keine der vier erteilt werden.
- Bestand in einen Lagerplatz legen
- Externe Änderungen — was geschieht, wenn jemand das alles überspringt
- Bestandskontrolle — der Zählablauf, wie der Mitarbeiter ihn sieht