# E2E report: stage-pos

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

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

## ✓ Step pos01_setup: org + продукт + Enter 100, валидный JWT с org_id для POS-запросов

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

| Тип | Проверка | Результат |
|---|---|---|
| api | org + product + stock=100 готовы | ✓ org product=f919c21d |

## ✓ Step pos02_sync_full: GET /api/pos/v1/sync?storeId=… → 200, products содержит наш товар, stocks.qty=100

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

| Тип | Проверка | Результат |
|---|---|---|
| api | GET /pos/v1/sync → 200 | ✓ 200 |
| api | products содержит наш товар | ✓ products=1 |
| api | prices содержит цену продукта | ✓ prices=1 |
| api | stocks.qty = 100 | ✓ qty=100 |
| api | serverTime ISO 8601 | ✓ t=2026-05-29T12:52:56.8154928Z |

## ✓ Step pos03_sync_incremental: GET /sync?since=ServerTime → 200, products пустой (с последнего вызова не было изменений)

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

| Тип | Проверка | Результат |
|---|---|---|
| api | GET /sync?since=… → 200 | ✓ 200 |
| api | products пустой (с last sync нет изменений) | ✓ products=0 |
| api | stocks все ещё актуальный снимок | ✓ stocks=1 |

## ✓ Step pos04_sales_create: POST /api/pos/v1/sales {idempotencyKey, sales[1]} → 200, accepted=1, RetailSale создан

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

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /sales → 200 | ✓ 200 {"idempotencyKey":"fdbca3cd-ce7c-4490-a70c-a72185cae043","accepted":[{"clientSaleId":"1104b207-bb9c-4391-b9a9-bffdd7203fc1","serverSaleId":"0557e109-061d-4bca-8077-8d7a488c7de5","serverSaleNumber" |
| api | accepted=1, failed=0 | ✓ acc=1 fail=0 |
| api | replayedFromCache = false (новая продажа) | ✓ replayed=false |
| api | Stock = 98 (100 - 2) | ✓ qty=98 |

## ✓ Step pos05_sales_replay_same_key: Повтор того же ключа — replayedFromCache=true, RetailSale НЕ дублируется

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

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /sales с тем же ключом → 200 | ✓ 200 |
| api | replayedFromCache = true | ✓ replayed=true |
| api | Stock остался 98 (не дублировано списание) | ✓ qty=98 |

## ✓ Step pos06_sales_new_key_same_client_sale_id: Новый idempotencyKey + тот же ClientSaleId → accepted с тем же ServerSaleId (per-sale дедуп)

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

| Тип | Проверка | Результат |
|---|---|---|
| api | POST → 200 | ✓ 200 |
| api | accepted с тем же ServerSaleId (per-sale дедуп) | ✓ serverSaleId=0557e109-061d-4bca-8077-8d7a488c7de5 vs first=0557e109-061d-4bca-8077-8d7a488c7de5 |
| api | Stock остался 98 (нет дубля) | ✓ qty=98 |

## ✓ Step pos07_sales_insufficient_stock: Продажа с qty > stock → failed запись c error «Недостаточно остатка»

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

| Тип | Проверка | Результат |
|---|---|---|
| api | POST с qty > stock → 200 (failed-секция) | ✓ 200 |
| api | failed.length = 1 с error о недостатке остатка | ✓ failed={"clientSaleId":"a9a710d1-0a3a-4ee8-a015-cd031952c2a8","error":"Недостаточный остаток для товара f919c21d-64f0-4930-8d66-54568c14acc6.","field":"productId"} |
| api | accepted = 0 | ✓ acc=0 |

## Summary

- Passed: 7
- Failed: 0
- Warnings: 0
- Skipped: 0

## Critical bugs

Нет.
