Stocuri
Stocul per locație pentru fiecare produs, plus o vedere agregată per produs și operațiuni de ajustare a stocului.
Endpoint-uri
| Metodă | Cale | Descriere |
|---|---|---|
| GET | /api/v1/inventory | Listă paginată a rândurilor de stoc (unul per produs+locație); filtre product_id, location_id, sku, low_stock. |
| GET | /api/v1/inventory/summary | Total agregat per produs, peste toate locațiile. |
| POST | /api/v1/inventory/add-stock | Adaugă stoc la un produs într-o locație. |
| POST | /api/v1/inventory/remove-stock | Scoate stoc dintr-un produs la o locație. |
Filtre la listare (GET /api/v1/inventory)
| Parametru | Tip | Note |
|---|---|---|
product_id | integer | Filtrează după produs (products.product_id). |
location_id | integer | Filtrează după locație (locations.id). |
sku | string | Filtrează după SKU-ul produsului. |
low_stock | boolean | true → doar produsele sub min_stock_level (când e configurat). |
per_page | integer | Implicit 100. |
GET /api/v1/inventory/summary acceptă product_id și per_page (implicit 100); fiecare rând conține product_id, total_quantity, total_reserved, available_quantity (= total − rezervat) și location_count.
Adăugare stoc
Câmpuri pentru POST /api/v1/inventory/add-stock:
| Câmp | Tip | Obligatoriu | Note |
|---|---|---|---|
product_id | integer | da | Trebuie să existe (products.product_id). |
location_id | integer | da | Trebuie să existe (locations.id). |
quantity | integer ≥ 1 | da | Cantitatea de adăugat. |
batch_number | string ≤ 50 | nu | Lot/șarjă. |
lot_number | string ≤ 50 | nu | |
expiry_date | YYYY-MM-DD | nu | Data de expirare. |
notes | text | nu | Notă liberă, salvată în mișcarea de stoc. |
curl -X POST https://tenant.notsowms.ro/api/v1/inventory/add-stock \
-H "Authorization: Bearer tenant.7c4a8d09ca3762af61e59520943dc26494f8941b" \
-H "Content-Type: application/json" \
-d '{
"product_id": 812,
"location_id": 14,
"quantity": 20,
"batch_number": "B-2026-06",
"notes": "Recepție furnizor"
}'Răspuns 201 — rândul de stoc actualizat (cu produsul și locația):
{
"data": {
"id": 3391,
"product_id": 812,
"location_id": 14,
"quantity": 20,
"reserved_quantity": 0,
"batch_number": "B-2026-06",
"product": { "product_id": 812, "sku": "BRK-PAD-001", "name": "Plăcuțe frână față" },
"location": { "id": 14, "location_code": "CULOAR1-RAFT-3" }
}
}Scoatere stoc
Câmpuri pentru POST /api/v1/inventory/remove-stock:
| Câmp | Tip | Obligatoriu | Note |
|---|---|---|---|
product_id | integer | da | Trebuie să existe (products.product_id). |
location_id | integer | da | Trebuie să existe (locations.id). |
quantity | integer ≥ 1 | da | Cantitatea de scos. |
notes | text | nu | Notă liberă, salvată în mișcarea de stoc. |
Dacă produsul nu are stoc la acea locație sau cantitatea cerută depășește stocul disponibil, primești 422:
{ "error": "Insufficient stock." }Fără cod de motiv
Operațiunile de stoc nu primesc un cod de motiv de la apelant. Fiecare adăugare/scoatere se înregistrează automat în inventory_transactions (vizibil în pagina Mișcări stocuri) cu un motiv setat de server (Adăugare stoc via API / Eliminare stoc via API). Singurul text liber pe care îl poți atașa este notes.