Zum Inhalt springen

Bestand lesen

Die meisten Integrationen, die den Bestand falsch machen, machen nicht das Schreiben falsch. Sie leiten eine Zahl, die das Modul bereits veröffentlicht, auf leicht andere Weise neu ab und sind sich danach mit der Administration darüber uneinig.

Alles hier ist ein Lesen. p2lab_stockly.viewer oder das eigene :read-Recht der Entität genügt.

GET warehouse/stock/product/{productId}?page=1&limit=10 ACL: p2lab_stockly_warehouse_stock:read · höchstens 100 Zeilen je Seite

Eine Zeile je (Lager, Lagerplatz), dazu die Nachbestellregeln und die verkäufliche Zahl, die zum ganzen Lager gehören und nicht zur Seite.

{
"data": [
{
"id": "0191f0…",
"productId": "0191f3…",
"warehouseId": "0191f1…",
"warehouseName": "Main warehouse",
"binLocationId": "0191f2…",
"binLocationCode": "A-01-02",
"binRole": null,
"stock": 24,
"reserved": 6,
"available": 18
}
],
"rules": {},
"purchasable": {},
"total": 3,
"page": 1,
"limit": 10
}

binRole: null ist ein gewöhnlicher Lagerplatz. Jeder andere Wert ist ein Puffer; siehe das Bestandsmodell dafür, was jeder davon ausschließt.

GET warehouse/stock/product/{productId}/summary?withVariants=1 ACL: p2lab_stockly_warehouse_stock:read

Die Zahlen hinter den Kacheln der Produktseite. withVariants=1 lässt ein Hauptprodukt seine Varianten aggregieren.

{
"data": {
"total": 24, "reserved": 6, "available": 17, "backordered": 1,
"pending": 0, "warehouses": 2, "expiring": 0,
"inTransit": 0, "onOrder": 40
}
}
FeldBedeutet
totaldie rohe körperliche Zählung, Puffer eingeschlossen
reservedwie viel Bestellungen beansprucht haben
availablewas noch verkauft werden kann
backorderedBedarf, den kein Regal deckt
pendingEinheiten im Wareneingangspuffer oder unterwegs — auf dem Weg herein
expiringLots mit einem Ablaufdatum innerhalb von 30 Tagen
inTransit, onOrdervon einem anderen Lager / von einem Lieferanten geschuldet

GET warehouse/{warehouseId}/product/{productId}/available ACL: p2lab_stockly_warehouse_stock:read

Antwortet {"available": 12} und sonst nichts. Verwenden Sie es für eine Scanprüfung oder ein Tor, wo die Zeilen zu laden und lokal zu summieren zusätzliche Arbeit für dieselbe Antwort ist.

GET warehouse/stock/product/{productId}/reservations?grain=order&page=1&limit=10 ACL: p2lab_stockly_warehouse_stock:read

grainEine Zeile je
orderBestellung (die Voreinstellung)
binLager + Lagerplatz + Ladungsträger + Bestellung
backorderBestellung, der noch Ware geschuldet wird

Die Antwort trägt data, total, totalReserved, totalBackordered, page, limit und das grain, das sie beantwortet hat. Ein unbekanntes Grain ist eine 400, kein stiller Rückfall.

Diese Zeilen stammen aus den Reservierungszeilen, denselben Zahlen, die die Kachel Reserviert in der Administration summiert: Eine Liste und eine Kachel, die sich widersprechen, sind der Fehler, den es mit diesem Endpunkt zu verhindern gilt.

MethodePfadAntwortet
GETwarehouse/stock/batches/{productId}jedes Lot des Produkts, mit Ablaufdatum
GETwarehouse/stock/{warehouseId}/batches/{productId}dasselbe, in einem Lager
GETwarehouse/stock/placements/{productId}wo seine Lots körperlich sitzen
GETwarehouse/stock/{warehouseId}/{binLocationId}/placements/{productId}die Platzierungen in einem Lagerplatz
GETwarehouse/stock/{warehouseId}/loose-bins/{productId}Lagerplätze, die es lose halten, abseits jedes Trägers
GETwarehouse/{warehouseId}/stock/pickable-source/{productId}Platzierungen, aus denen eine Entnahme ziehen darf
GETwarehouse/stock/product/{productId}/batch-historywie seine Lots sich über die Zeit geändert haben
GETwarehouse/batch-trace/{batchNumber}wohin eine Lotnummer ging, über das Netz hinweg
GETwarehouse/order-lots/{orderId}welche Lots eine Bestellung versandt hat

Die letzten beiden sind das, was eine Rückruffrage tatsächlich braucht: Sie beantworten „wer hat dieses Lot erhalten”, ohne einen von Hand geschriebenen Join.

GET|POST warehouse/stock/movements/{productId} ACL: p2lab_stockly_warehouse_stock_movement:read

Das Journal für ein Produkt. POST nimmt einen Filterkörper entgegen, für die Fälle, die eine Abfragezeichenkette nicht ausdrücken kann.

Für alles Berichtsförmige ist das Journal auch eine gewöhnliche Entität: /api/search/p2lab-stockly-warehouse-stock-movement mit eigenen Filtern und Aggregationen ist oft weniger Arbeit, als diesen Endpunkt zu blättern.

MethodePfadAntwortetACL
GETwarehouse/order/{orderId}/allocationsdas Beschaffungsbild je Position; ?warehouseId= ergänzen für das Urteil „anderswo offen”p2lab_stockly.viewer
GETwarehouse/order/{orderId}/stock-targetsgegen welchen Standort jede Position gebucht istp2lab_stockly_warehouse_stock:read
GETwarehouse/order/{orderId}/pick-planwohin ein Kommissionierer geschickt würdep2lab_stockly_warehouse_stock:read

pick-plan ist ein Vorschlag und schreibt nichts, was ihn nützlich macht, um einen Plan zu zeigen, bevor jemand losgeht.

POST warehouse/{warehouseId}/bin-options ACL: p2lab_stockly.viewer

Eine Seite Optionen für die Lagerplatzauswahl mit ihren Kennzeichen und ihrer Reihenfolge, serverseitig zusammengestellt. Es gibt sie, weil die Alternative, jeden Lagerplatz und jede Bestandszeile des Lagers zum Client zu ziehen und dort zu sortieren, der Weg ist, auf dem eine Lagerplatzauswahl in einem echten Lager unbenutzbar wird.

Verwandt: POST warehouse/{warehouseId}/bin-occupancy dafür, wie voll Lagerplätze sind, und POST warehouse/{warehouseId}/suggest-bin dafür, wohin eine Einlagerung ginge.

Alles ist eine Shopware-Entität, und /api/search/… ist das richtige Werkzeug für Berichte, Exporte und jede Frage mit eigenen Filtern. Verloren geht dabei das, was diese Endpunkte obendrauf legen: eine Verfügbarkeitsrechnung, die Zeile für Zeile zu product.stock passt, Reservierungszahlen aus den Zeilen statt aus dem Zwischenspeicher, und die Aggregation über Varianten.

Zwei Regeln aus der Packing API gelten hier genauso:

Null ist nicht null. Ein fehlender Wert heißt, dass niemand einen erfasst hat: Ein Ablaufdatum von null ist ein Lot ohne erfasste Haltbarkeit, keines, das abgelaufen ist.

Leiten Sie eine veröffentlichte Zahl nicht neu ab. Hat eine Zahl einen Endpunkt, lesen Sie den Endpunkt. Jedes örtlich nachgebaute „available” in der Geschichte dieses Moduls ist irgendwann mit dem uneins geworden, gegen das der Shop verkauft.