Przejdź do głównej zawartości

Korekty i zadania masowe

Cztery endpointy zapisu księgują po jednym ruchu. To, co niżej, księguje wiele naraz, albo księguje różnicę zamiast ilości, albo w ogóle nie kończy się w obrębie żądania.

POST warehouse/stock/count ACL: p2lab_stockly.execute_stock_operations

Ustawia miejsca na to, co ktoś policzył. Endpoint przyjmuje cały arkusz, nie jedną linię:

{
"warehouseId": "0191f1…",
"level": "aggregate",
"comment": "Liczenie cykliczne, alejka A",
"lines": [
{ "productId": "0191f3…", "binLocationId": "0191f2…", "countedQty": 22 },
{ "productId": "0191f8…", "binLocationId": "0191f2…", "countedQty": 0 }
]
}

level to aggregate (suma produktu w binie) albo batch. Na poziomie partii każda linia może nieść dodatkowo batchId, batchNumber i expiresAt.

Odpowiedź mówi, co każda linia faktycznie zmieniła:

{ "success": true, "results": [
{ "productId": "0191f3…", "binLocationId": "0191f2…", "batchId": null, "delta": -2 }
] }

Księgowana jest wyłącznie różnica, jako ruch typu count. Linia, której policzona liczba już się zgadza, nie księguje niczego i zgłasza delta: 0. Policzone zero jest w porządku, bo pusta półka musi dać się zaksięgować, ale liczba ujemna jest odrzucana przez P2LAB_STOCKLY__STOCK__NEGATIVE_COUNT: fizyczne liczenie nie ma kierunku.

Stan systemowy jest odczytywany ponownie w chwili księgowania, a nie w chwili liczenia, więc wynik równa się liczbie policzonej niezależnie od tego, ile zmieniło się w międzyczasie.

POST warehouse/stock/batch/{batchId}/correct ACL: p2lab_stockly.execute_stock_operations

Zmienia opis partii: jej numer, jej termin. Neutralne dla stanu: księguje ruch batch_correction o ilości zero, żeby historia produktu pokazywała, kiedy partia dostała nowy termin, nigdy nie sugerując, że ruszyły się sztuki.

MetodaŚcieżkaCo robiACL
POSTwarehouse/stock/delete-emptyusuwa jeden pusty wiersz zapasu po stockIdp2lab_stockly.execute_stock_operations
POSTwarehouse/stock/sync-product/{productId}przelicza product.stock z półekp2lab_stockly.execute_stock_operations

delete-empty odmawia z kodem 409 not_deletable, gdy wiersz wciąż trzyma stan albo sztuki zarezerwowane. Warunek siedzi w samej instrukcji usuwającej, więc wiersz, który przed chwilą nabrał znaczenia, nie zostanie usunięty przez żądanie będące już w drodze.

sync-product jest naprawą product.stock, który ktoś nadpisał. Nie potrzebuje ładunku i można go powtarzać bezpiecznie, ponieważ wyprowadza wartość, a nie koryguje ją o różnicę.

Cztery operacje odsyłają progressId natychmiast i pracują dalej w tle:

MetodaŚcieżkaUruchamiaACL
POSTwarehouse/stock/initialize/{warehouseId}zasilenie wierszy zapasu z product.stockp2lab_stockly.execute_stock_operations
POSTwarehouse/stock/transfer-bulkprzelanie jednego magazynu w drugip2lab_stockly.execute_stock_operations
POSTwarehouse/{warehouseId}/auto-assign-binsnadanie binu każdemu nieprzypisanemu wierszowip2lab_stockly.execute_stock_operations
POSTwarehouse/stock/sync-variantszsumowanie stanu wariantów na produkt nadrzędnyp2lab_stockly.execute_stock_operations

Każda odpowiada {"success": true, "progressId": "0191f9…"}. Odpytuj o postęp:

GET /api/_action/p2lab-stockly/warehouse/stock/job/{progressId}/status
{ "progressId": "0191f9…", "status": "running",
"totalItems": 4812, "processedItems": 1200, "error": null }

initialize i sync-variants mają własne trasy statusu, warehouse/stock/initialize/{progressId}/status i warehouse/stock/sync-variants/{progressId}/status, o tym samym kształcie odpowiedzi. Wszystkie trzy wymagają p2lab_stockly_task_progress:read, czyli innego uprawnienia niż to, które uruchomiło zadanie: system, który może patrzeć, nie jest automatycznie systemem, który może działać.

Nieznane progressId to 404.

initialize kopiuje product.stock na bin unassigned magazynu i celowo jest wąskie w tym, czego dotyka:

  • tylko produkty bez wariantów potomnych, ponieważ stan produktu nadrzędnego jest sumą jego dzieci, więc zasilenie obu policzyłoby wszystko dwa razy;
  • produkty ze stanem większym od zera;
  • produkty nieobecne jeszcze w żadnym magazynie, ponieważ product.stock jest sumą dla całej sieci, więc zasilenie artykułu, który już gdzieś leży, skopiowałoby całą jego ilość drugi raz, a następne przeliczenie zawyżyłoby liczbę.

To jednorazowy krok wdrożenia, nie synchronizacja. Drugie uruchomienie nie dokłada niczego i taki jest zamysł.

p2lab_stockly.execute_stock_operations obejmuje zwykłą ścieżkę zapisu. Cztery operacje mają osobne bramki, bo są decyzjami, a nie ruchami:

UprawnienieChroni
p2lab_stockly.commit_stocktakezatwierdzenie albo wycofanie sesji kontroli stanu
p2lab_stockly.variance_approveakceptację linii wstrzymanych przez bramkę rozbieżności
p2lab_stockly.reassign_binsprzeniesienie binu wraz z zapasem do innego magazynu
p2lab_stockly.run_integrity_fixnaprawę spójności i przejęcie otwartych zamówień

Integracja, która tylko księguje ruchy, nie powinna dostać żadnego z tych czterech.