# E2E report: stage-inventory

Запущен: 2026-05-29T12:05:09.680Z
Длительность: 6.6с

**Итог:** 8 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 8)

## ✓ Step inv01_setup: 2 org. У org A — продукт1 (qty=50) + продукт2 (qty=80) через Enter

Длительность: 4502мс

| Тип | Проверка | Результат |
|---|---|---|
| api | Enter posted (initial stock) | ✓ 204 |
| api | Stock: p1=50, p2=80 | ✓ p1=50 p2=80 |

## ✓ Step inv02_create_draft_autopopulate: POST /api/inventory/inventories без Lines → автозаполнение всех товаров склада с book = текущий stock

Длительность: 172мс

| Тип | Проверка | Результат |
|---|---|---|
| api | POST inventories без Lines → 201 | ✓ 201 {"id":"8e1e2ef2-65c0-4a91-9fca-1e6f79f4f952","number":"И-2026-000001","date":"2026-05-29T12:05:14.183Z","status":0,"storeId":"4b4962e8-3e70-41ea-becf-e46331095da9","storeName":"Основной склад","no |
| api | Авто-Lines содержат оба товара с bookQty = текущий stock | ✓ p1.book=50 p2.book=80 |
| api | Auto: ActualQty=0, Diff=-bookQty | ✓ p1.actual=0 p1.diff=-50 |

## ✓ Step inv03_create_draft_explicit_lines: POST с явными Lines — book подгружается, diff = actual - book

Длительность: 190мс

| Тип | Проверка | Результат |
|---|---|---|
| api | POST с явными Lines → 201 | ✓ 201 |
| api | p1: book=50, actual=48, diff=-2 | ✓ book=50 actual=48 diff=-2 |
| api | p2: book=80, actual=85, diff=+5 | ✓ book=80 actual=85 diff=5 |

## ✓ Step inv04_update_actual_quantities: PUT — поменять ActualQty по строкам, Diff пересчитан (фикс EF8)

Длительность: 181мс

| Тип | Проверка | Результат |
|---|---|---|
| api | PUT inventory → 204 (фикс EF8 на nav-collection) | ✓ 204  |
| api | После PUT: p1.actual=49,diff=-1; p2.actual=82,diff=+2 | ✓ p1.actual=49 diff=-1; p2.actual=82 diff=2 |

## ✓ Step inv05_post_creates_adjustment_movements: POST /post → 204; StockMovement type=InventoryAdjustment с qty=diff; Stock приведён к фактическому

Длительность: 548мс

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /post → 204 | ✓ 204  |
| api | p1: stock -=1 (был 50→49) | ✓ 50 → 49 |
| api | p2: stock +=2 (был 80→82) | ✓ 80 → 82 |
| api | Создано 2 StockMovement type=InventoryAdjustment | ✓ count=2 types=InventoryAdjustment |

## ✓ Step inv06_unpost: POST /unpost → 204; Stock восстановлен; Status=Draft

Длительность: 594мс

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /unpost → 204 | ✓ 204  |
| api | p1: stock +1 обратно (49→50) | ✓ 49 → 50 |
| api | p2: stock -2 обратно (82→80) | ✓ 82 → 80 |
| api | Status=Draft (0) | ✓ status=0 |

## ✓ Step inv07_multi_tenant_isolation: Org B не видит inventory org A

Длительность: 169мс

| Тип | Проверка | Результат |
|---|---|---|
| api | Org B не видит inventory org A | ✓ total=0 sees=false |
| api | GET чужого id → 404 | ✓ 404 |

## ✓ Step inv08_csv_import_gap_check: CSV-импорт фактического — endpoint существует? (logic gap если нет)

Длительность: 231мс

| Тип | Проверка | Результат |
|---|---|---|
| api | CSV-import endpoint существует ИЛИ отсутствует (см. gap) | ✓ not found — см. logic gap |

## Summary

- Passed: 8
- Failed: 0
- Warnings: 0
- Skipped: 0

## Critical bugs

Нет.

## Logic gaps

- CSV-импорт фактических количеств в Inventory не реализован. Все строки задаются через JSON-API POST/PUT inventories. Для оператора склада это неудобно: реальная инвентаризация — это сканер штрихкодов или Excel-таблица, а не ручной JSON. Желательно добавить POST /api/inventory/inventories/{id}/import-actual с multipart CSV { barcode|article, actualQty }.
