# E2E report: stage-loss

Запущен: 2026-05-29T11:59:38.289Z
Длительность: 6.3с

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

## ✓ Step loss01_setup: 2 org + продукт + начальный остаток через Enter (qty=100)

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

| Тип | Проверка | Результат |
|---|---|---|
| api | Initial Enter posted | ✓ 204 |
| api | Initial Stock = 100 | ✓ stock=100 |

## ✓ Step loss02_create_draft: POST /api/inventory/losses → 201 с reason=Defect(0), 1 строка

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

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /api/inventory/losses → 201 | ✓ 201 {"id":"393e869a-6c86-403a-8831-6ffceaa60880","number":"С-2026-000001","date":"2026-05-29T11:59:42.519Z","status":0,"reason":0,"storeId":"2096cbc7-0b2f-4ded-8dda-6b281549639d","storeName":"Основной |
| api | Total = 10*50 = 500 | ✓ total=500 |
| api | Status = Draft (0) | ✓ status=0 |

## ✓ Step loss03_update_draft: PUT — заменить qty + reason; пересчёт Total; 204 (фикс EF8)

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

| Тип | Проверка | Результат |
|---|---|---|
| api | PUT loss → 204 (фикс EF8) | ✓ 204  |
| api | После PUT: total=750, reason=1, lines.length=1 | ✓ total=750 reason=1 lines=1 |

## ✓ Step loss04_post: POST /post → Stock -= qty; StockMovement type=Loss с UnitCost; Status=Posted

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

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /post → 204 | ✓ 204  |
| api | Stock -= 15 | ✓ before=100 after=85 |
| api | StockMovement type=WriteOff (MovementType.WriteOff) создан | ✓ count=1 type=WriteOff |
| api | После Post: Status = Posted (1), PostedAt!=null | ✓ status=1 postedAt=2026-05-29T11:59:42.969609Z |

## ✓ Step loss05_post_more_than_stock: Списание больше текущего остатка → 400/409 (Stock не уходит в минус)

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

| Тип | Проверка | Результат |
|---|---|---|
| api | Списание > остатка → 400/409 с понятной ошибкой | ✓ 409 {"error":"Нельзя списать больше, чем есть в наличии.","lines":[{"productId":"03af1a30-3083-4204-81d0-51d24a0abb58","productName":"Loss Prod a 1780055978289","writeOffQty":185,"available":85}]} |

## ✓ Step loss06_unpost: POST /unpost → Stock += qty обратно; Status=Draft

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

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /unpost → 204 | ✓ 204 |
| api | Stock += 15 обратно | ✓ before=85 after=100 |
| api | После Unpost: Status = Draft (0) | ✓ status=0 postedAt=null |

## ✓ Step loss07_reason_invalid: POST с reason=99999 → 400; reason=Other(99) → 201

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

| Тип | Проверка | Результат |
|---|---|---|
| api | Строка вместо reason → 400 (binding error) | ✓ 400 |
| api | reason=99 (Other) → 201 | ✓ 201 {"id":"05533225-1637-4528-b53c-ef2a8ea83430","number":"С-2026-000003","date":"2026-05-29T11:59:44.144Z","status":0,"reason":99,"storeId":"2096cbc7-0b2f-4ded-8dda-6b281549639d","storeName":"Основно |

## ✓ Step loss08_multi_tenant_isolation: Org B не видит loss org A (GET/PUT/POST → 404)

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

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

## Summary

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

## Critical bugs

Нет.
