Zum Inhalt springen

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/count ACL: 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.

POST warehouse/stock/batch/{batchId}/correct ACL: 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.

MethodePfadWas er tutACL
POSTwarehouse/stock/delete-emptylässt eine leere Bestandszeile nach stockId fallenp2lab_stockly.execute_stock_operations
POSTwarehouse/stock/sync-product/{productId}berechnet product.stock aus den Regalen neup2lab_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.

Vier Vorgänge liefern sofort eine progressId zurück und laufen im Hintergrund weiter:

MethodePfadStartetACL
POSTwarehouse/stock/initialize/{warehouseId}befüllt Bestandszeilen aus product.stockp2lab_stockly.execute_stock_operations
POSTwarehouse/stock/transfer-bulkentleert ein Lager in ein anderesp2lab_stockly.execute_stock_operations
POSTwarehouse/{warehouseId}/auto-assign-binsgibt jeder nicht zugeordneten Zeile einen vorgeschlagenen Lagerplatzp2lab_stockly.execute_stock_operations
POSTwarehouse/stock/sync-variantssummiert Variantenbestand auf die Hauptprodukte aufp2lab_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.

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.stock die 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.

p2lab_stockly.execute_stock_operations deckt den gewöhnlichen Schreibweg ab. Vier Vorgänge sind gesondert begrenzt, weil sie Entscheidungen sind statt Bewegungen:

BerechtigungSichert
p2lab_stockly.commit_stocktakedas Buchen oder Zurücknehmen einer Bestandskontrollsitzung
p2lab_stockly.variance_approvedas Freigeben von Positionen, die ein Abweichungstor zurückgehalten hat
p2lab_stockly.reassign_binsdas Verschieben eines Lagerplatzes samt Bestand in ein anderes Lager
p2lab_stockly.run_integrity_fixdas Anwenden einer Integritätsreparatur und das Übernehmen offener Bestellungen

Einer Integration, die nur Bewegungen bucht, sollte keine der vier erteilt werden.