Produse
Produse din catalog. Fiecare produs identifică un SKU care poate fi stocat, pickat și expediat.
Identificator
Tabela de produse folosește product_id ca cheie primară (nu id). Valoarea pe care o pui în {id} din cale este product_id, iar răspunsurile și referințele din alte resurse (stoc, linii de comandă) folosesc tot product_id.
Endpoint-uri
| Metodă | Cale | Descriere |
|---|---|---|
| GET | /api/v1/products | Listă paginată; filtre status, sku, barcode, seller_id, search. |
| GET | /api/v1/products/{id} | Citește un produs (cu furnizorul și stocul pe locații). |
| POST | /api/v1/products | Creează un produs. |
| PUT | /api/v1/products/{id} | Actualizează un produs (parțial). |
| DELETE | /api/v1/products/{id} | Șterge un produs (doar dacă nu mai are stoc). |
Filtre la listare
| Parametru | Tip | Note |
|---|---|---|
status | enum | active | inactive. |
sku | string | Potrivire exactă pe SKU. |
barcode | string | Potrivire exactă pe cod de bare. |
seller_id | integer | Filtrează după furnizor. |
search | string | Caută în name, sku, barcode. |
per_page | integer | Implicit 50. |
Schema unui produs
Câmpuri acceptate la POST / PUT. La POST, sku și name sunt obligatorii; restul sunt opționale. La PUT, toate sunt opționale (trimite doar câmpurile pe care vrei să le schimbi).
| Câmp | Tip | Note |
|---|---|---|
sku | string ≤ 50 | Obligatoriu la POST. Unic per tenant. |
name | string ≤ 255 | Obligatoriu la POST. |
description | text | |
category | string ≤ 100 | |
unit_of_measure | string ≤ 20 | ex. bucata, kg. |
min_stock_level | integer ≥ 0 | Pragul sub care produsul declanșează alerte de stoc redus. |
price | numeric ≥ 0 | Preț în moneda de bază (RON). |
price_eur | numeric ≥ 0 | Preț în EUR. |
weight | numeric ≥ 0 | Greutate unitară. |
dimensions | string ≤ 100 | Text liber (ex. 20x15x10 cm). |
barcode | string ≤ 50 | |
seller_id | integer | Trebuie să existe în furnizori (sellers.id). |
status | enum | active | inactive. Implicit active. |
Exemplu — creare produs
curl -X POST https://tenant.notsowms.ro/api/v1/products \
-H "Authorization: Bearer tenant.7c4a8d09ca3762af61e59520943dc26494f8941b" \
-H "Content-Type: application/json" \
-d '{
"sku": "BRK-PAD-001",
"name": "Plăcuțe frână față",
"category": "Frânare",
"unit_of_measure": "set",
"min_stock_level": 5,
"price": 149.90,
"barcode": "5941234567890"
}'Răspuns 201:
{
"data": {
"product_id": 812,
"sku": "BRK-PAD-001",
"name": "Plăcuțe frână față",
"category": "Frânare",
"unit_of_measure": "set",
"min_stock_level": 5,
"price": "149.90",
"barcode": "5941234567890",
"status": "active",
"created_at": "2026-06-11T08:42:11.000000Z",
"updated_at": "2026-06-11T08:42:11.000000Z"
}
}GET /api/v1/products/{id} întoarce în plus furnizorul (seller) și stocul pe locații (inventory_items cu locația aferentă).
Ștergere
curl -X DELETE https://tenant.notsowms.ro/api/v1/products/812 \
-H "Authorization: Bearer tenant.7c4a8d09ca3762af61e59520943dc26494f8941b"Dacă produsul mai are stoc (orice rând de inventar cu quantity > 0), ștergerea este refuzată cu 422:
{ "error": "Cannot delete product with active inventory." }Golește stocul (vezi stocuri) înainte de a șterge.