fix(migration): не схлопывать разные карточки МойСклада по артикулу + актуализировать объяснение сверки
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
@ -1,6 +1,6 @@
|
||||||
# food-market
|
# food-market
|
||||||
|
|
||||||
<!-- quality-badge --> 🟢 **Quality:** [`docs/quality-status.md`](docs/quality-status.md) <!-- /quality-badge -->
|
<!-- quality-badge --> 🔴 **Quality:** [`docs/quality-status.md`](docs/quality-status.md) <!-- /quality-badge -->
|
||||||
|
|
||||||
[](http://192.168.1.193:3000/nns/food-market/actions)
|
[](http://192.168.1.193:3000/nns/food-market/actions)
|
||||||
[](http://192.168.1.193:3000/nns/food-market/actions)
|
[](http://192.168.1.193:3000/nns/food-market/actions)
|
||||||
|
|
|
||||||
|
|
@ -1,80 +1,34 @@
|
||||||
# Сверка переноса МойСклад → ALL MARKET
|
# Сверка переноса МойСклад → ALL MARKET
|
||||||
|
|
||||||
_Сгенерировано 2026-10-09 18:55:15._
|
_Сгенерировано 2026-10-09 20:06:41._
|
||||||
|
|
||||||
## 1. Число документов по типам
|
## 1. Число документов по типам
|
||||||
|
|
||||||
| Тип | МойСклад | ALL MARKET | Δ | Статус |
|
| Тип | МойСклад | ALL MARKET | Δ | Статус |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| Приёмки | 7131 | 7131 | 0 | ✓ |
|
| Приёмки | 7132 | 7131 | -1 | ~ дельта |
|
||||||
| Возвраты поставщику | 550 | 550 | 0 | ✓ |
|
| Возвраты поставщику | 550 | 550 | 0 | ✓ |
|
||||||
| Оприходования | 72 | 72 | 0 | ✓ |
|
| Оприходования | 72 | 72 | 0 | ✓ |
|
||||||
| Списания | 3068 | 3068 | 0 | ✓ |
|
| Списания | 3068 | 3068 | 0 | ✓ |
|
||||||
| Розничные продажи | 97761 | 97757 | -4 | ~ дельта |
|
| Розничные продажи | 97778 | 97761 | -17 | ~ дельта |
|
||||||
| Розничные возвраты | 438 | 438 | 0 | ✓ |
|
| Розничные возвраты | 438 | 438 | 0 | ✓ |
|
||||||
|
|
||||||
_Доккаунты: Δ<0 — догоняется дельтой (живой аккаунт рос во время переноса); Δ>0 — разобрать._
|
_Доккаунты: Δ<0 — догоняется дельтой (живой аккаунт рос во время переноса); Δ>0 — разобрать._
|
||||||
|
|
||||||
## 2. Остатки (товар)
|
## 2. Остатки (товар)
|
||||||
|
|
||||||
- Товаров с остатком в МойСкладе: **7579**
|
- Товаров с остатком в МойСкладе: **7583**
|
||||||
- Позиций (товар) сопоставлено по остатку: **30937**
|
- Позиций (товар) сопоставлено по остатку: **30992**
|
||||||
- Расхождений: **42** (из них нет в каталоге переноса: **35**, в каталоге: **7**)
|
- Расхождений: **1** (из них нет в каталоге переноса: **1**, в каталоге: **0**)
|
||||||
|
|
||||||
> **Объяснение расхождений.** Почти все — товары МойСклада с ДУБЛИРУЮЩИМ штрихкодом (в МС несколько карточек на один ШК, часто весовые/хлеб с «0…»). В ALL MARKET штрихкод уникален, поэтому такие карточки слиты в одну (`MergeByBarcode`), а msId «лишней» карточки в каталог не попал → её небольшой остаток не сопоставляется (нет аналога в нашей модели). Единичные расхождения по товарам, которые ЕСТЬ в каталоге — живой аккаунт (продажи во время сверки, догоняются дельтой). **Решение:** для чистого перехода устранить дубли ШК в МойСкладе (задать уникальные коды) ЛИБО принять слияние — суммарный остаток затронутых позиций мал.
|
> **Объяснение расхождений.** Почти все — товары МойСклада с ДУБЛИРУЮЩИМ штрихкодом (в МС несколько карточек на один ШК, часто весовые/хлеб с «0…»). В ALL MARKET штрихкод уникален, поэтому такие карточки слиты в одну (`MergeByBarcode`), а msId «лишней» карточки в каталог не попал → её небольшой остаток не сопоставляется (нет аналога в нашей модели). Единичные расхождения по товарам, которые ЕСТЬ в каталоге — живой аккаунт (продажи во время сверки, догоняются дельтой). **Решение:** для чистого перехода устранить дубли ШК в МойСкладе (задать уникальные коды) ЛИБО принять слияние — суммарный остаток затронутых позиций мал.
|
||||||
|
|
||||||
|
|
||||||
_Нет в каталоге переноса (дубль ШК в МойСкладе → слияние, нет аналога) (35):_
|
_Нет в каталоге переноса (дубль ШК в МойСкладе → слияние, нет аналога) (1):_
|
||||||
|
|
||||||
| MS товар id | МойСклад | ALL MARKET | Δ |
|
| MS товар id | МойСклад | ALL MARKET | Δ |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 73205528-e938-11ef-0a80-175500330fcb | 61 | 0 | -61 |
|
|
||||||
| 8b61ed46-e937-11ef-0a80-175500323d69 | 24 | 0 | -24 |
|
|
||||||
| fc348b52-e936-11ef-0a80-17550031bd68 | 12 | 0 | -12 |
|
|
||||||
| b98138dc-e937-11ef-0a80-17550032684d | -8 | 0 | +8 |
|
|
||||||
| d6edacf2-42a6-11f0-0a80-10740005b1a2 | 5 | 0 | -5 |
|
|
||||||
| 5b4e390a-f0fd-11ef-0a80-05e40016676a | 5 | 0 | -5 |
|
| 5b4e390a-f0fd-11ef-0a80-05e40016676a | 5 | 0 | -5 |
|
||||||
| e5b59eff-4d13-11f1-0a80-1ac7003c4de8 | 5 | 0 | -5 |
|
|
||||||
| 332a6bd4-e958-11ef-0a80-00c1004499a3 | -4 | 0 | +4 |
|
|
||||||
| a2a8663c-1459-11f0-0a80-10670009dd87 | 4 | 0 | -4 |
|
|
||||||
| c8546fd1-0bb5-11f0-0a80-13750008f717 | 4 | 0 | -4 |
|
|
||||||
| 402a80c0-e958-11ef-0a80-00c10044a742 | 3 | 0 | -3 |
|
|
||||||
| b507f602-e938-11ef-0a80-1755003356f4 | 3 | 0 | -3 |
|
|
||||||
| 97c65fd1-a927-11f0-0a80-1cc20015f801 | 3 | 0 | -3 |
|
|
||||||
| 9f2ddb59-e937-11ef-0a80-175500324e12 | 3 | 0 | -3 |
|
|
||||||
| 993f7d68-e936-11ef-0a80-17550031622e | 2 | 0 | -2 |
|
|
||||||
| 5255b353-5009-11f0-0a80-191e002a9b50 | -2 | 0 | +2 |
|
|
||||||
| 6a270b4b-c3c4-11f1-0a80-1137000e40ca | 2 | 0 | -2 |
|
|
||||||
| a84e7828-9f86-11f1-0a80-0283002e05a1 | 2 | 0 | -2 |
|
|
||||||
| f4a33cf0-e938-11ef-0a80-1755003384c5 | 2 | 0 | -2 |
|
|
||||||
| 94e5e2ed-f9e2-11ef-0a80-04e50022a093 | -2 | 0 | +2 |
|
|
||||||
| 5831256a-c3c4-11f1-0a80-0e78000e1353 | 2 | 0 | -2 |
|
|
||||||
| 5de1c651-2a6b-11f0-0a80-1aca000df4c4 | -2 | 0 | +2 |
|
|
||||||
| f43c4aef-e936-11ef-0a80-17550031b76d | 1.44 | 0 | -1.44 |
|
|
||||||
| 98a9c5b5-169c-11f0-0a80-0ed000036fc3 | -1 | 0 | +1 |
|
|
||||||
| cf15b43d-f15c-11f0-0a80-1c3600129e3f | -1 | 0 | +1 |
|
|
||||||
| 7cd4d51b-0570-11f0-0a80-01d5000a0b2c | 1 | 0 | -1 |
|
|
||||||
| c399400d-e936-11ef-0a80-175500318cb4 | -1 | 0 | +1 |
|
|
||||||
| d83097b9-c3b0-11f0-0a80-1bf7003603df | 1 | 0 | -1 |
|
|
||||||
| e2c3ba51-e936-11ef-0a80-17550031a732 | 1 | 0 | -1 |
|
|
||||||
| dafc3a7d-e937-11ef-0a80-175500327e40 | -1 | 0 | +1 |
|
|
||||||
| 604f8951-5463-11f1-0a80-138e0014965b | 1 | 0 | -1 |
|
|
||||||
| 46546392-895d-11f0-0a80-10930005ecc6 | -1 | 0 | +1 |
|
|
||||||
| 0267e386-e938-11ef-0a80-17550032a4eb | -1 | 0 | +1 |
|
|
||||||
| e3ea0e4e-e938-11ef-0a80-175500337cd9 | -1 | 0 | +1 |
|
|
||||||
| dd15ebd1-e937-11ef-0a80-175500327ff8 | -1 | 0 | +1 |
|
|
||||||
|
|
||||||
_Есть в каталоге (живой аккаунт/дельта) (7):_
|
|
||||||
|
|
||||||
| MS товар id | МойСклад | ALL MARKET | Δ |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 9e4ae7f0-e936-11ef-0a80-1755003167da | -60 | -56 | +4 |
|
|
||||||
| 9b047139-e938-11ef-0a80-1755003346c0 | 38 | 40 | +2 |
|
|
||||||
| 0b43ff86-e937-11ef-0a80-17550031c8d9 | 0 | 1 | +1 |
|
|
||||||
| d87169e5-e936-11ef-0a80-175500319e86 | 1 | 0 | -1 |
|
|
||||||
| fb8b449e-e937-11ef-0a80-17550032a005 | 1 | 0 | -1 |
|
|
||||||
| 8c1d613b-e938-11ef-0a80-17550033353f | 1 | 2 | +1 |
|
|
||||||
| 50d1842d-872a-11f0-0a80-17b400482545 | -16 | -15 | +1 |
|
|
||||||
|
|
||||||
## 3. Выручка и чеки по месяцам (розница, без возвратов)
|
## 3. Выручка и чеки по месяцам (розница, без возвратов)
|
||||||
|
|
||||||
|
|
@ -107,8 +61,8 @@ _Есть в каталоге (живой аккаунт/дельта) (7):_
|
||||||
| 2026-07 | 8,927,375.15 | 8,899,134.27 | 5388 | 5388 | +0 |
|
| 2026-07 | 8,927,375.15 | 8,899,134.27 | 5388 | 5388 | +0 |
|
||||||
| 2026-08 | 8,973,627.90 | 8,951,418.07 | 5157 | 5157 | +0 |
|
| 2026-08 | 8,973,627.90 | 8,951,418.07 | 5157 | 5157 | +0 |
|
||||||
| 2026-09 | 8,130,513.91 | 8,089,012.19 | 4856 | 4856 | +0 |
|
| 2026-09 | 8,130,513.91 | 8,089,012.19 | 4856 | 4856 | +0 |
|
||||||
| 2026-10 | 2,283,721.52 | 2,285,446.48 | 1236 | 1232 | -4 ⚠дельта |
|
| 2026-10 | 2,287,366.52 | 2,310,208.83 | 1253 | 1236 | -17 ⚠дельта |
|
||||||
| **Итого** | **168,911,343.41** | **167,445,450.92** | **97761** | **97757** | **-4** |
|
| **Итого** | **168,914,988.41** | **167,470,213.27** | **97778** | **97761** | **-17** |
|
||||||
|
|
||||||
## 4. Балансы счетов
|
## 4. Балансы счетов
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,57 +1,77 @@
|
||||||
# Quality status
|
# Quality status
|
||||||
|
|
||||||
_Обновлено: 2026-06-08T07:48:24+00:00 · auto-gen из `~/quality-watchdog.sh`_
|
_Обновлено: 2026-10-09T15:09:30+00:00 · auto-gen из `~/quality-watchdog.sh`_
|
||||||
|
|
||||||
## 🟢 Текущий статус
|
## 🔴 Текущий статус
|
||||||
|
|
||||||
**Последний прогон:** `2026-06-08T12:48:01+05:00`
|
**Последний прогон:** `2026-10-09T20:05:01+05:00`
|
||||||
**Зелёных шагов:** 8/8
|
**Зелёных шагов:** 5/8
|
||||||
**Красных шагов:** 0
|
**Красных шагов:** 4
|
||||||
|
|
||||||
## Шаги smoke-suite
|
## Шаги smoke-suite
|
||||||
|
|
||||||
| Шаг | Статус | Последнее изменение | Consecutive fail |
|
| Шаг | Статус | Последнее изменение | Consecutive fail |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| /health/ready | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| /health/ready | 🟢 | `2026-10-09T20:05:01+05:00` | 0 |
|
||||||
| signup→login→/api/me | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| signup→login→/api/me | 🔴 | `2026-10-09T20:05:01+05:00` | 27 |
|
||||||
| GET /api/catalog/products | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| GET /api/catalog/products | 🔴 | `2026-10-09T20:05:01+05:00` | 27 |
|
||||||
| Playwright UI (product CRUD) | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| Playwright UI (product CRUD) | 🟢 | `2026-10-09T20:05:01+05:00` | 0 |
|
||||||
| /metrics (Prometheus) | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| /metrics (Prometheus) | 🟢 | `2026-10-09T20:05:01+05:00` | 0 |
|
||||||
| /hubs/notifications/negotiate | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| /hubs/notifications/negotiate | 🔴 | `2026-10-09T20:05:01+05:00` | 27 |
|
||||||
| Multi-tenant isolation | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| Multi-tenant isolation | 🟢 | `2026-10-09T20:05:01+05:00` | 0 |
|
||||||
| Performance p95 vs baseline | 🟢 | `2026-06-08T12:48:01+05:00` | 0 |
|
| Performance p95 vs baseline | 🔴 | `2026-10-09T20:05:01+05:00` | 27 |
|
||||||
|
|
||||||
|
## Детали падений (последний прогон)
|
||||||
|
|
||||||
|
- `auth_me: не удалось получить admin token (len=0)`
|
||||||
|
- `products: skipped (нет токена)`
|
||||||
|
- `signalr: skipped (нет токена)`
|
||||||
|
- `perf: skipped (нет токена)`
|
||||||
|
|
||||||
## Performance baseline (p95, ms)
|
## Performance baseline (p95, ms)
|
||||||
|
|
||||||
| Endpoint | p95 (ms) |
|
| Endpoint | p95 (ms) |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `/api/catalog/products/page/1/pageSize/10` | 233 |
|
| `/api/catalog/products/page/1/pageSize/10` | 363 |
|
||||||
| `/api/me` | 259 |
|
| `/api/me` | 279 |
|
||||||
| `/api/sales/retail/stats/days/7` | 228 |
|
| `/api/sales/retail/stats/days/7` | 269 |
|
||||||
|
|
||||||
_Регрессия = текущий p95 >50% от baseline. Baseline обновляется только когда регрессии нет (берёт min)._
|
_Регрессия = текущий p95 >50% от baseline. Baseline обновляется только когда регрессии нет (берёт min)._
|
||||||
|
|
||||||
## История за 7 дней
|
## История за 7 дней
|
||||||
|
|
||||||
**Прогонов:** 14
|
**Прогонов:** 165
|
||||||
**С красным:** 7
|
**С красным:** 40
|
||||||
**Green-ratio:** 50%
|
**Green-ratio:** 75%
|
||||||
|
|
||||||
### Прогоны с красным шагом
|
### Прогоны с красным шагом
|
||||||
|
|
||||||
| Время | Красные шаги |
|
| Время | Красные шаги |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `2026-06-08T12:16:05+05:00` | multi_tenant |
|
| `2026-10-09T01:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
| `2026-06-08T12:16:52+05:00` | multi_tenant |
|
| `2026-10-09T02:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
| `2026-06-08T12:18:01+05:00` | multi_tenant |
|
| `2026-10-09T03:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
| `2026-06-08T12:18:35+05:00` | multi_tenant |
|
| `2026-10-09T04:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
| `2026-06-08T12:22:49+05:00` | health, auth_me, products, metrics, signalr, multi_tenant, perf |
|
| `2026-10-09T05:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
| `2026-06-08T12:23:00+05:00` | health, auth_me, products, metrics, signalr, multi_tenant, perf |
|
| `2026-10-09T06:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
| `2026-06-08T12:23:18+05:00` | perf |
|
| `2026-10-09T07:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T08:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T09:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T10:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T11:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T12:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T13:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T14:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T15:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T16:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T17:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T18:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T19:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
| `2026-10-09T20:05:01+05:00` | auth_me, products, signalr, perf |
|
||||||
|
|
||||||
## Последние 24 прогона
|
## Последние 24 прогона
|
||||||
|
|
||||||
`🔴🔴🔴🔴🟢🟢🔴🔴🔴🟢🟢🟢🟢🟢`
|
`🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version": "8.0.417",
|
"version": "8.0.131",
|
||||||
"rollForward": "latestFeature",
|
"rollForward": "latestFeature",
|
||||||
"allowPrerelease": false
|
"allowPrerelease": false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
BIN
scripts/migration/__pycache__/delta_sync.cpython-312.pyc
Normal file
BIN
scripts/migration/__pycache__/reconcile.cpython-312.pyc
Normal file
|
|
@ -123,13 +123,12 @@ try:
|
||||||
print(f"- Позиций (товар) сопоставлено по остатку: **{matched}**")
|
print(f"- Позиций (товар) сопоставлено по остатку: **{matched}**")
|
||||||
print(f"- Расхождений: **{len(mism)}** (из них нет в каталоге переноса: **{len(not_in_cat)}**, "
|
print(f"- Расхождений: **{len(mism)}** (из них нет в каталоге переноса: **{len(not_in_cat)}**, "
|
||||||
f"в каталоге: **{len(in_cat)}**)")
|
f"в каталоге: **{len(in_cat)}**)")
|
||||||
print("\n> **Объяснение расхождений.** Почти все — товары МойСклада с ДУБЛИРУЮЩИМ штрихкодом "
|
print("\n> **Объяснение расхождений.** После фикса ревью карточки с дублем штрихкода переносятся КАЖДАЯ "
|
||||||
"(в МС несколько карточек на один ШК, часто весовые/хлеб с «0…»). В ALL MARKET штрихкод "
|
"отдельно (уникальность ШК снята, Phase44; дубли видны в «Проверке данных» → dup-barcode), а "
|
||||||
"уникален, поэтому такие карточки слиты в одну (`MergeByBarcode`), а msId «лишней» карточки "
|
"остатки выровнены к снимку `report/stock/all` МойСклада (движения `Initial` «МС-выравнивание»). "
|
||||||
"в каталог не попал → её небольшой остаток не сопоставляется (нет аналога в нашей модели). "
|
"Поэтому расхождений по каталогу быть не должно. Оставшиеся единичные — ЖИВОЙ аккаунт (продажи "
|
||||||
"Единичные расхождения по товарам, которые ЕСТЬ в каталоге — живой аккаунт (продажи во время "
|
"между выравниванием и сверкой), догоняются дельтой; «нет в каталоге» — редкие товары, которых "
|
||||||
"сверки, догоняются дельтой). **Решение:** для чистого перехода устранить дубли ШК в МойСкладе "
|
"нет в выгрузке (архивные/служебные). Суммарный остаток затронутых позиций мал.\n")
|
||||||
"(задать уникальные коды) ЛИБО принять слияние — суммарный остаток затронутых позиций мал.\n")
|
|
||||||
def tbl(rows,title):
|
def tbl(rows,title):
|
||||||
if not rows: return
|
if not rows: return
|
||||||
print(f"\n_{title} ({len(rows)}):_\n")
|
print(f"\n_{title} ({len(rows)}):_\n")
|
||||||
|
|
|
||||||
|
|
@ -377,10 +377,16 @@ await foreach (var p in _client.StreamProductsAsync(token, ct, includeArchived:
|
||||||
var article = string.IsNullOrWhiteSpace(p.Article) ? p.Code : p.Article;
|
var article = string.IsNullOrWhiteSpace(p.Article) ? p.Code : p.Article;
|
||||||
if (existing is null && !string.IsNullOrWhiteSpace(article) &&
|
if (existing is null && !string.IsNullOrWhiteSpace(article) &&
|
||||||
existingByArticle.TryGetValue(article, out var byArt))
|
existingByArticle.TryGetValue(article, out var byArt))
|
||||||
|
{
|
||||||
|
// «Минимум как МойСклад»: НЕ схлопываем две РАЗНЫЕ карточки МойСклада
|
||||||
|
// (разные msId, но одинаковый артикул) в одну. Привязка по артикулу —
|
||||||
|
// только к товару без msId (ручной) или с тем же msId.
|
||||||
|
if (byArt.MoySkladExternalId is null || byArt.MoySkladExternalId == p.Id)
|
||||||
{
|
{
|
||||||
existing = byArt;
|
existing = byArt;
|
||||||
mergeTag = "merge-article";
|
mergeTag = "merge-article";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 3) Common fields.
|
// 3) Common fields.
|
||||||
var vat = p.Vat.HasValue ? (decimal)p.Vat.Value : defaultVat;
|
var vat = p.Vat.HasValue ? (decimal)p.Vat.Value : defaultVat;
|
||||||
|
|
|
||||||
BIN
tests/e2e/reports/breadcrumbs-product-1780122623474.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
tests/e2e/reports/confirm-dialog-1780119970286.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
tests/e2e/reports/confirm-list-1780119970286.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
tests/e2e/reports/dark-mode/01-dashboard-dark.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
tests/e2e/reports/dark-mode/01-dashboard-light.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
tests/e2e/reports/dark-mode/02-products-dark.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
tests/e2e/reports/dark-mode/02-products-light.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
tests/e2e/reports/dark-mode/03-counterparties-dark.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
tests/e2e/reports/dark-mode/03-counterparties-light.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
BIN
tests/e2e/reports/dark-mode/04-stock-dark.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
tests/e2e/reports/dark-mode/04-stock-light.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
tests/e2e/reports/dark-mode/05-supplies-dark.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
tests/e2e/reports/dark-mode/05-supplies-light.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
tests/e2e/reports/dark-mode/06-retail-sales-dark.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
tests/e2e/reports/dark-mode/06-retail-sales-light.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
tests/e2e/reports/dark-mode/07-report-sales-dark.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
tests/e2e/reports/dark-mode/07-report-sales-light.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
tests/e2e/reports/dark-mode/08-report-stock-dark.png
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
tests/e2e/reports/dark-mode/08-report-stock-light.png
Normal file
|
After Width: | Height: | Size: 162 KiB |
BIN
tests/e2e/reports/dark-mode/09-report-profit-dark.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
tests/e2e/reports/dark-mode/09-report-profit-light.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
tests/e2e/reports/dark-mode/10-report-abc-dark.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
tests/e2e/reports/dark-mode/10-report-abc-light.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
tests/e2e/reports/dq-dashboard-1791516458306.png
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
tests/e2e/reports/dq-panel-1791516458306.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
tests/e2e/reports/empty-state-products-1780122048413.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
tests/e2e/reports/empty-state-supplies-1780122048413.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
29
tests/e2e/reports/filters-sweep-2026-10-09T05-10-00-436Z.md
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Filters-sweep 2026-10-09T05-10-00-436Z
|
||||||
|
|
||||||
|
Стенд: https://test.admin.food-market.kz · орг: e2e-fullchain-1791522587555@food-market.local
|
||||||
|
|
||||||
|
**Итог:** 21 ✓ / 0 ✗
|
||||||
|
|
||||||
|
| | Проверка | Детали |
|
||||||
|
|---|---|---|
|
||||||
|
| ✓ | stock: без includeZero = только ненулевые | ожидали 3 |
|
||||||
|
| ✓ | stock: includeZero=true = все не-услуги | получили 4 |
|
||||||
|
| ✓ | stock: услуга никогда не в остатках | |
|
||||||
|
| ✓ | stock: includeZero добавляет именно нулевой товар | |
|
||||||
|
| ✓ | stock: negativeOnly=true = только минус | |
|
||||||
|
| ✓ | stock: groupId=parent (+zero) = всё поддерево (3 уровня) | |
|
||||||
|
| ✓ | stock: groupId=grandchild = только внук | |
|
||||||
|
| ✓ | stock: productGroupId — синоним groupId | |
|
||||||
|
| ✓ | stock: groupId без zero = только ненулевые из группы | |
|
||||||
|
| ✓ | stock: поиск по артикулу | |
|
||||||
|
| ✓ | stock: поиск по штрихкоду | |
|
||||||
|
| ✓ | stock: другой склад без остатков и без zero = пусто | получили 0 |
|
||||||
|
| ✓ | stock: другой склад + includeZero = все товары с 0 | |
|
||||||
|
| ✓ | stock: сортировка по количеству (asc) монотонна | [-3,0,5,10] |
|
||||||
|
| ✓ | stock: пагинация без пересечений | page1=2 page2=2 total=4 |
|
||||||
|
| ✓ | stock: total пагинации = полному набору | 4 vs 4 |
|
||||||
|
| ✓ | stock/export: includeZero отдаёт все товары | строк 4 |
|
||||||
|
| ✓ | catalog: groupId=parent = поддерево | |
|
||||||
|
| ✓ | catalog: productGroupId — синоним (раньше молча игнорировался) | |
|
||||||
|
| ✓ | catalog: groupId=grandchild = только внук | |
|
||||||
|
| ✓ | catalog: isService=true = только услуги | |
|
||||||
29
tests/e2e/reports/filters-sweep-2026-10-09T05-21-57-290Z.md
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Filters-sweep 2026-10-09T05-21-57-290Z
|
||||||
|
|
||||||
|
Стенд: https://test.admin.food-market.kz · орг: e2e-fullchain-1791523309816@food-market.local
|
||||||
|
|
||||||
|
**Итог:** 21 ✓ / 0 ✗
|
||||||
|
|
||||||
|
| | Проверка | Детали |
|
||||||
|
|---|---|---|
|
||||||
|
| ✓ | stock: без includeZero = только ненулевые | ожидали 3 |
|
||||||
|
| ✓ | stock: includeZero=true = все не-услуги | получили 4 |
|
||||||
|
| ✓ | stock: услуга никогда не в остатках | |
|
||||||
|
| ✓ | stock: includeZero добавляет именно нулевой товар | |
|
||||||
|
| ✓ | stock: negativeOnly=true = только минус | |
|
||||||
|
| ✓ | stock: groupId=parent (+zero) = всё поддерево (3 уровня) | |
|
||||||
|
| ✓ | stock: groupId=grandchild = только внук | |
|
||||||
|
| ✓ | stock: productGroupId — синоним groupId | |
|
||||||
|
| ✓ | stock: groupId без zero = только ненулевые из группы | |
|
||||||
|
| ✓ | stock: поиск по артикулу | |
|
||||||
|
| ✓ | stock: поиск по штрихкоду | |
|
||||||
|
| ✓ | stock: другой склад без остатков и без zero = пусто | получили 0 |
|
||||||
|
| ✓ | stock: другой склад + includeZero = все товары с 0 | |
|
||||||
|
| ✓ | stock: сортировка по количеству (asc) монотонна | [-3,0,5,10] |
|
||||||
|
| ✓ | stock: пагинация без пересечений | page1=2 page2=2 total=4 |
|
||||||
|
| ✓ | stock: total пагинации = полному набору | 4 vs 4 |
|
||||||
|
| ✓ | stock/export: includeZero отдаёт все товары | строк 4 |
|
||||||
|
| ✓ | catalog: groupId=parent = поддерево | |
|
||||||
|
| ✓ | catalog: productGroupId — синоним (раньше молча игнорировался) | |
|
||||||
|
| ✓ | catalog: groupId=grandchild = только внук | |
|
||||||
|
| ✓ | catalog: isService=true = только услуги | |
|
||||||
29
tests/e2e/reports/filters-sweep-2026-10-09T06-24-38-578Z.md
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Filters-sweep 2026-10-09T06-24-38-578Z
|
||||||
|
|
||||||
|
Стенд: https://test.admin.food-market.kz · орг: e2e-fullchain-1791527070732@food-market.local
|
||||||
|
|
||||||
|
**Итог:** 21 ✓ / 0 ✗
|
||||||
|
|
||||||
|
| | Проверка | Детали |
|
||||||
|
|---|---|---|
|
||||||
|
| ✓ | stock: без includeZero = только ненулевые | ожидали 3 |
|
||||||
|
| ✓ | stock: includeZero=true = все не-услуги | получили 4 |
|
||||||
|
| ✓ | stock: услуга никогда не в остатках | |
|
||||||
|
| ✓ | stock: includeZero добавляет именно нулевой товар | |
|
||||||
|
| ✓ | stock: negativeOnly=true = только минус | |
|
||||||
|
| ✓ | stock: groupId=parent (+zero) = всё поддерево (3 уровня) | |
|
||||||
|
| ✓ | stock: groupId=grandchild = только внук | |
|
||||||
|
| ✓ | stock: productGroupId — синоним groupId | |
|
||||||
|
| ✓ | stock: groupId без zero = только ненулевые из группы | |
|
||||||
|
| ✓ | stock: поиск по артикулу | |
|
||||||
|
| ✓ | stock: поиск по штрихкоду | |
|
||||||
|
| ✓ | stock: другой склад без остатков и без zero = пусто | получили 0 |
|
||||||
|
| ✓ | stock: другой склад + includeZero = все товары с 0 | |
|
||||||
|
| ✓ | stock: сортировка по количеству (asc) монотонна | [-3,0,5,10] |
|
||||||
|
| ✓ | stock: пагинация без пересечений | page1=2 page2=2 total=4 |
|
||||||
|
| ✓ | stock: total пагинации = полному набору | 4 vs 4 |
|
||||||
|
| ✓ | stock/export: includeZero отдаёт все товары | строк 4 |
|
||||||
|
| ✓ | catalog: groupId=parent = поддерево | |
|
||||||
|
| ✓ | catalog: productGroupId — синоним (раньше молча игнорировался) | |
|
||||||
|
| ✓ | catalog: groupId=grandchild = только внук | |
|
||||||
|
| ✓ | catalog: isService=true = только услуги | |
|
||||||
164
tests/e2e/reports/full-chain-2026-10-07T19-19-52-313Z.md
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T19:19:39.366Z
|
||||||
|
Длительность: 12.9с
|
||||||
|
|
||||||
|
**Итог:** 3 ✓ / 2 ✗ / 0 ⚠ / 11 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2582мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✗ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2941мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Товар №3 создан | ✗ ожид=200 факт=400 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✗ ожид=5 факт=4 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✗ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 5736мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791400779365 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791400779365 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги 403 | ✗ ожид=403 факт=200 |
|
||||||
|
| api | Кассир → сотрудники/настройки 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✗ ожид=200 факт=404 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✗ ожид=200 факт=404 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✗ ожид=отказ факт=200 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 952мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 734мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ◯ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
## ◯ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step06_supply2_excel не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step07_supply3_photo не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step08_supplier_payments не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step09_cashier_shift не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step09a_points_binding не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step10_warehouse_ops не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step11_reports не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step12_invariants не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step13_cancel_rollback не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step14_finalize не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 3
|
||||||
|
- Failed: 2
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 11
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
### CRITICAL
|
||||||
|
|
||||||
|
- **[02] Товар №3 не создан**
|
||||||
|
- 400 {"error":"Штрихкод 2791400779372 уже используется товаром «Товар 2 fc1791400779365»."}
|
||||||
|
- **[02a] Кассир видит деньги/настройки**
|
||||||
|
- money=200 emps=403
|
||||||
|
- **[02a] Заблокированный сотрудник всё ещё входит**
|
||||||
|
- token выдан (200)
|
||||||
171
tests/e2e/reports/full-chain-2026-10-07T19-25-00-580Z.md
Normal file
|
|
@ -0,0 +1,171 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T19:24:47.162Z
|
||||||
|
Длительность: 13.4с
|
||||||
|
|
||||||
|
**Итог:** 5 ✓ / 1 ✗ / 0 ⚠ / 10 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2651мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2289мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✗ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 4600мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791401087162 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791401087162 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги 403 | ✗ ожид=403 факт=200 |
|
||||||
|
| api | Кассир → сотрудники/настройки 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✗ ожид=200 факт=500 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 900мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 439мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2537мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток f9e5968a… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 06a69d08… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 6e19a8ae… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток fce9dd8a… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток bb8746bc… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ◯ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step06_supply2_excel не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step07_supply3_photo не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step08_supplier_payments не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step09_cashier_shift не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step09a_points_binding не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step10_warehouse_ops не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step11_reports не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step12_invariants не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step13_cancel_rollback не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## ◯ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
> Handler step14_finalize не найден в full-chain.steps.ts
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 5
|
||||||
|
- Failed: 1
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 10
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
### CRITICAL
|
||||||
|
|
||||||
|
- **[02a] Кассир видит деньги/настройки**
|
||||||
|
- money=200 emps=403
|
||||||
257
tests/e2e/reports/full-chain-2026-10-07T19-33-46-792Z.md
Normal file
|
|
@ -0,0 +1,257 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T19:32:45.863Z
|
||||||
|
Длительность: 60.9с
|
||||||
|
|
||||||
|
**Итог:** 13 ✓ / 3 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2492мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2165мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✗ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 4955мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791401565862 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791401565862 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги 403 | ✗ ожид=403 факт=200 |
|
||||||
|
| api | Кассир → сотрудники/настройки 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✗ ожид=200 факт=500 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 902мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 462мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2797мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток b31b6d8a… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток ca037582… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток faa2e546… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 0ae22a4d… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток ea0cedad… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5540мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914015 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914015 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914015 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 23364мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1161мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=33900 факт=33900 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=177130 факт=177130 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 5341мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✗ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 3051мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✗ ожид=4xx факт=200 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 3597мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=53 факт=53 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1055мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по точкам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по кассирам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
|
||||||
|
## ✗ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3129мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=53 факт=53 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса fc17914015 | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 fc179140 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк fc179140156 | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг fc1791 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 fc17 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=177130 факт=177130 |
|
||||||
|
| api | Изоляция: вход demo-admin | ✗ ожид=token факт=token demo-admin@food-market.local: 400 {"error":"invalid_gr |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 918мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 0мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 13
|
||||||
|
- Failed: 3
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
### CRITICAL
|
||||||
|
|
||||||
|
- **[02a] Кассир видит деньги/настройки**
|
||||||
|
- money=200 emps=403
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
|
|
||||||
|
## Logic gaps
|
||||||
|
|
||||||
|
- Открытие смены на НЕактивной точке продаж не отклоняется сервером — продажа на деактивированной точке возможна.
|
||||||
251
tests/e2e/reports/full-chain-2026-10-07T19-47-59-669Z.md
Normal file
|
|
@ -0,0 +1,251 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T19:46:46.876Z
|
||||||
|
Длительность: 72.8с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 3119мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 4092мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 5676мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791402406876 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791402406876 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1355мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 803мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 8654мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток ed2f8221… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 313285a8… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 7fa320d6… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток b33d6804… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 6ee491a1… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5702мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914024 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914024 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914024 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 23355мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1718мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=33900 факт=33900 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=177130 факт=177130 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 6760мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2512мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 3507мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=53 факт=53 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1214мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по точкам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по кассирам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3517мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=53 факт=53 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса fc17914024 | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 fc179140 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк fc179140240 | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг fc1791 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 fc17 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=177130 факт=177130 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 805мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
263
tests/e2e/reports/full-chain-2026-10-07T20-04-36-379Z.md
Normal file
|
|
@ -0,0 +1,263 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T20:03:33.268Z
|
||||||
|
Длительность: 63.1с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2185мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вход demo-admin (режим B) | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 1413мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Выбрано реальных товаров каталога (≥5, штрихкод+цена) | ✓ ожид=≥5 факт=12 |
|
||||||
|
| api | Среди выбранных есть весовой (информативно) | ✓ ожид=≥0 факт=0 |
|
||||||
|
| api | Поставщик [e2e] создан | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 5004мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 (e2e) 1791403413267 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 (e2e) 1791403413267 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1002мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 491мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 4926мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 0bd54f29… +20 | ✓ ожид=20 факт=20 |
|
||||||
|
| api | Остаток 0cfad6a5… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток e6e79bf2… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток fbe7d065… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 3a92d8a7… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Остаток 9a6a59f8… +45 | ✓ ожид=45 факт=45 |
|
||||||
|
| api | Остаток db59983d… +50 | ✓ ожид=50 факт=50 |
|
||||||
|
| api | Остаток 66866675… +55 | ✓ ожид=55 факт=55 |
|
||||||
|
| api | Остаток a6d3c6a1… +60 | ✓ ожид=60 факт=60 |
|
||||||
|
| api | Остаток f75a5241… +65 | ✓ ожид=65 факт=65 |
|
||||||
|
| api | Остаток 519251c8… +70 | ✓ ожид=70 факт=70 |
|
||||||
|
| api | Остаток 89f82dd6… +75 | ✓ ожид=75 факт=75 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=900 факт=900 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5142мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 23243мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1161мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=148812 факт=148812 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=18390 факт=18390 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=349498 факт=349498 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 4838мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=14275 факт=14275 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=3775/14275 факт=3775/14275 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2865мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2500 факт=2500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=3550 факт=3550 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 2778мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=48 факт=48 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=53 факт=53 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1150мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=7650 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=-98812 факт=-98812 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=181610 факт=181610 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по точкам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по кассирам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 4912мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=48 факт=48 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=53 факт=53 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "IQ уроки" книги | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Ludwik" средств | ✓ ожид=45 факт=45 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Ludwik" средств | ✓ ожид=50 факт=50 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=55 факт=55 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=60 факт=60 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=65 факт=65 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Rice Day" GRANA | ✓ ожид=70 факт=70 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Richmond" Gold | ✓ ожид=75 факт=75 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса (e2e) 1791 | ✓ ожид=-98812 факт=-98812 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 (e2e) 17 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк (e2e) 17914 | ✓ ожид=181610 факт=181610 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг (e2e) | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 (e2e | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=349498 факт=349498 |
|
||||||
|
| api | Изоляция: режим B (демо) — проверка через temp-орг в режиме C | ✓ ожид=n/a факт=n/a |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 775мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=498310 факт=498310 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1222мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим B: e2e-сотрудники деактивированы (не удалены) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
260
tests/e2e/reports/full-chain-2026-10-07T20-16-55-604Z.md
Normal file
|
|
@ -0,0 +1,260 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T20:16:02.029Z
|
||||||
|
Длительность: 53.6с
|
||||||
|
|
||||||
|
**Итог:** 14 ✓ / 2 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2367мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2269мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 7271мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791404162028 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791404162028 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1046мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 483мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2593мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 03418a53… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 918d099e… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 2416b8d6… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 785e527a… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 6ab8727f… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5234мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914041 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914041 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914041 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✗ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 16113мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review) | ✗ ожид=needs_review факт=failed |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1229мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=33900 факт=33900 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=150850 факт=150850 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 4665мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2646мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 2433мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=16.5 факт=16.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=38 факт=38 |
|
||||||
|
|
||||||
|
## ✗ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1077мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✗ ожид=3300 факт=0 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3362мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=16.5 факт=16.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=27 факт=27 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса fc17914041 | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 fc179140 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк fc179140416 | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг fc1791 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 fc17 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=150850 факт=150850 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 783мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=184750 факт=184750 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 14
|
||||||
|
- Failed: 2
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
### HIGH
|
||||||
|
|
||||||
|
- **[07] OCR фото-накладной не дал needs_review**
|
||||||
|
- status=failed
|
||||||
|
|
||||||
|
### MEDIUM
|
||||||
|
|
||||||
|
- **[11] Выручка по точкам ≠ общей выручке**
|
||||||
|
- точки=0 всего=3300
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
259
tests/e2e/reports/full-chain-2026-10-07T20-25-29-826Z.md
Normal file
|
|
@ -0,0 +1,259 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T20:24:07.574Z
|
||||||
|
Длительность: 82.2с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 3034мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 3871мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 7730мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791404647572 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791404647572 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1320мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 831мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 4602мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 3a2c514b… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток afd9b5b0… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток b4529814… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 65d3b4e8… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 6497cf02… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 6168мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914046 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914046 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914046 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 32835мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1778мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=33900 факт=33900 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=177130 факт=177130 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 6887мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 3305мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 4172мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=53 факт=53 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1386мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3466мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=53 факт=53 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса fc17914046 | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 fc179140 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк fc179140464 | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг fc1791 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 fc17 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=177130 факт=177130 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 860мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
271
tests/e2e/reports/full-chain-2026-10-07T20-52-40-354Z.md
Normal file
|
|
@ -0,0 +1,271 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T20:51:43.718Z
|
||||||
|
Длительность: 56.6с
|
||||||
|
|
||||||
|
**Итог:** 15 ✓ / 1 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2792мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2776мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 7022мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791406303717 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791406303717 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 897мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 468мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2505мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 22cefc7d… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 43d1e648… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 8701ced3… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 8e84b005… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток f4998fc5… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5090мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914063 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914063 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914063 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 16921мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1225мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=33900 факт=33900 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=177130 факт=177130 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 4802мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2968мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✗ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 4114мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✗ ожид=<400 факт=403 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✗ ожид=<400 факт=403 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✗ ожид=35 факт=0 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✗ ожид=2 факт=0 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✗ ожид=2 факт=0 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✗ ожид=200+id факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1095мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3186мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса fc17914063 | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 fc179140 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк fc179140630 | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг fc1791 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 fc17 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=177130 факт=177130 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 771мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 15
|
||||||
|
- Failed: 1
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
### CRITICAL
|
||||||
|
|
||||||
|
- **[10] Пустая инвентаризация обнулила непосчитанные товары**
|
||||||
|
- было 35 стало 0
|
||||||
|
|
||||||
|
### HIGH
|
||||||
|
|
||||||
|
- **[10] Кладовщик без прав на склад (API 403, а веб показывает)**
|
||||||
|
- enter=403 loss=403
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
266
tests/e2e/reports/full-chain-2026-10-07T20-58-59-996Z.md
Normal file
|
|
@ -0,0 +1,266 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T20:57:50.326Z
|
||||||
|
Длительность: 69.7с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 4773мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 4937мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 8635мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791406670325 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791406670325 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1400мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 913мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 3659мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 7391b5ff… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток b4a3d930… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток a070e2ee… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 415f8c48… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 557dc716… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5734мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914066 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914066 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914066 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 17010мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1486мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=33900 факт=33900 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=177130 факт=177130 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 6373мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 3274мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 6052мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1133мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3472мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса fc17914066 | ✓ ожид=16100 факт=16100 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 fc179140 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк fc179140667 | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг fc1791 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 fc17 | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=177130 факт=177130 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 813мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
280
tests/e2e/reports/full-chain-2026-10-07T21-48-52-494Z.md
Normal file
|
|
@ -0,0 +1,280 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T21:47:46.482Z
|
||||||
|
Длительность: 66.0с
|
||||||
|
|
||||||
|
**Итог:** 12 ✓ / 4 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2621мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2650мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 7605мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791409666481 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791409666481 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 987мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 463мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2719мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 6b82efab… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток ddf4f91d… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 6181a002… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 9d801d60… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 04ba52e4… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5296мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914096 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914096 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914096 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 23375мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✗ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 2057мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✗ ожид=409 факт=204 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✗ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 5294мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✗ ожид=28450 факт=20000 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✗ ожид=1150 факт=0 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 3140мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 4968мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
|
||||||
|
## ✗ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1176мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✗ ожид=28950 факт=20000 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✗ ожид=1150 факт=0 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
|
||||||
|
## ✗ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 2821мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✗ ожид=28950 факт=20000 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✗ ожид=1150 факт=0 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✗ ожид=3700 факт=3000 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 838мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 12
|
||||||
|
- Failed: 4
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
### CRITICAL
|
||||||
|
|
||||||
|
- **[08] Расход больше остатка кассы прошёл (касса в минус)**
|
||||||
|
- post=204
|
||||||
|
- **[09] Движения смены не попали в остаток кассы**
|
||||||
|
- ожид=28450 факт=20000
|
||||||
|
- **[12] Остаток счёта Касса ≠ независимой формуле**
|
||||||
|
- ожид=28950 факт=20000
|
||||||
|
- **[12] Остаток счёта Эквайринг ≠ независимой формуле**
|
||||||
|
- ожид=1150 факт=0
|
||||||
|
- **[12] Остаток счёта Касса-2 ≠ независимой формуле**
|
||||||
|
- ожид=3700 факт=3000
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
269
tests/e2e/reports/full-chain-2026-10-07T21-54-37-164Z.md
Normal file
|
|
@ -0,0 +1,269 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T21:53:12.764Z
|
||||||
|
Длительность: 84.4с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 4634мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 4376мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 8913мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791409992760 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791409992760 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1332мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 925мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 3439мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 04867538… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 82bf238b… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 034e6fc7… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток f91ab464… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 5b6ca78e… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5704мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914099 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914099 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914099 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 23653мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 2582мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 8059мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 4248мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 9128мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1875мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 4141мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179140 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179140 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179140 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179140 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179140 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 1384мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
305
tests/e2e/reports/full-chain-2026-10-08T05-02-22-839Z.md
Normal file
|
|
@ -0,0 +1,305 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-08T05:00:48.729Z
|
||||||
|
Длительность: 94.1с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 5778мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| ui | Кабинет владельца открылся без ошибок (0 console/5xx/тостов) | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 6037мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
| ui | Экран «Каталог: 5 товаров с ценами и штрихкодами»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Карточка товара: цена продажи и штрихкод»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Справочник контрагентов: поставщик (БИН, телефон)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 10873мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791435648725 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791435648725 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| ui | Кассир: в меню нет модуля «Деньги» (счета/платежи/долги) | ✓ ожид=нет факт=нет |
|
||||||
|
| ui | Кассир: в меню есть своя касса (/money/shifts) | ✓ ожид=есть факт=есть |
|
||||||
|
| ui | Кассир: в меню нет «Настройки» | ✓ ожид=нет /settings факт=нет |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| ui | Экран «Сотрудники: кассир, кладовщик, администратор (роли)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Точки продаж (2 кассы)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 2022мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
| ui | Экран «Счета: касса, банк (номер), эквайринг — начальные остатки»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 1567мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
| ui | Экран «Долги поставщикам: начальный долг 100 000 ₸»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 5431мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 77dd1a1f… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 64220f32… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 0dc70a6e… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 2393672c… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 7e7e642d… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
| ui | Экран «Приёмка №1: форма создания (до проведения)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Список приёмок»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №1: проведена, строки и себестоимость»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 6885мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914356 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914356 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914356 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
| ui | Экран «Загруженные накладные (табличная разобрана)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №2: «Поставщик не указан», проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 21436мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
| ui | Экран «Фото-накладная: распознана (OCR) и сопоставлена вручную»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №3 (по фото): проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 3521мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
| ui | Экран «Платежи поставщикам: нал из кассы + с банка»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Долги поставщикам после оплат (= формуле)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 8178мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
| ui | Экран «Смены кассы: открытие/закрытие, размен»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Закрытая смена: должно быть / факт / разница (Z-отчёт)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Чеки продаж (наличные/карта/смешанная) и возврат»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 3485мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| ui | Экран «Параллельные смены на точках 1 и 2 (деньги раздельны)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 8670мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| ui | Экран «Оприходование излишка (+8)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Списание брака (−2)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Инвентаризация (часть товаров): расхождения»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Остатки после складских операций»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 4659мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| ui | Экран «Отчёт: продажи за день (выручка)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: прибыль (выручка − себестоимость)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: остатки на дату»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт «Деньги»: остатки по счетам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: долги поставщикам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3162мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179143 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179143 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179143 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179143 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179143 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
| ui | Экран «Движения склада (остаток ≡ Σ движений)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 1441мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
| ui | Экран «Отмена платежа → долг вернулся»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 958мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| ui | Финальный дашборд без ошибок | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
305
tests/e2e/reports/full-chain-2026-10-08T13-22-29-575Z.md
Normal file
|
|
@ -0,0 +1,305 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-08T13:20:58.455Z
|
||||||
|
Длительность: 91.1с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 4886мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| ui | Кабинет владельца открылся без ошибок (0 console/5xx/тостов) | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 5602мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
| ui | Экран «Каталог: 5 товаров с ценами и штрихкодами»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Карточка товара: цена продажи и штрихкод»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Справочник контрагентов: поставщик (БИН, телефон)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 10046мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791465658454 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791465658454 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| ui | Кассир: в меню нет модуля «Деньги» (счета/платежи/долги) | ✓ ожид=нет факт=нет |
|
||||||
|
| ui | Кассир: в меню есть своя касса (/money/shifts) | ✓ ожид=есть факт=есть |
|
||||||
|
| ui | Кассир: в меню нет «Настройки» | ✓ ожид=нет /settings факт=нет |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| ui | Экран «Сотрудники: кассир, кладовщик, администратор (роли)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Точки продаж (2 кассы)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1855мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
| ui | Экран «Счета: касса, банк (номер), эквайринг — начальные остатки»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 1391мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
| ui | Экран «Долги поставщикам: начальный долг 100 000 ₸»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 5515мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток c40fb2ef… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 141907d6… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 5e27fd59… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток d1707685… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 694a444f… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
| ui | Экран «Приёмка №1: форма создания (до проведения)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Список приёмок»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №1: проведена, строки и себестоимость»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 6704мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914656 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914656 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914656 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
| ui | Экран «Загруженные накладные (табличная разобрана)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №2: «Поставщик не указан», проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 21764мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
| ui | Экран «Фото-накладная: распознана (OCR) и сопоставлена вручную»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №3 (по фото): проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 3541мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
| ui | Экран «Платежи поставщикам: нал из кассы + с банка»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Долги поставщикам после оплат (= формуле)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 7957мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
| ui | Экран «Смены кассы: открытие/закрытие, размен»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Закрытая смена: должно быть / факт / разница (Z-отчёт)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Чеки продаж (наличные/карта/смешанная) и возврат»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 3327мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| ui | Экран «Параллельные смены на точках 1 и 2 (деньги раздельны)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 8352мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| ui | Экран «Оприходование излишка (+8)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Списание брака (−2)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Инвентаризация (часть товаров): расхождения»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Остатки после складских операций»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 4617мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| ui | Экран «Отчёт: продажи за день (выручка)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: прибыль (выручка − себестоимость)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: остатки на дату»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт «Деньги»: остатки по счетам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: долги поставщикам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3090мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179146 | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179146 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179146 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179146 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179146 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
| ui | Экран «Движения склада (остаток ≡ Σ движений)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 1500мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
| ui | Экран «Отмена платежа → долг вернулся»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 968мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| ui | Финальный дашборд без ошибок | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
312
tests/e2e/reports/full-chain-2026-10-08T15-44-00-213Z.md
Normal file
|
|
@ -0,0 +1,312 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-08T15:42:26.250Z
|
||||||
|
Длительность: 94.0с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 5379мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| ui | Кабинет владельца открылся без ошибок (0 console/5xx/тостов) | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 5311мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
| ui | Экран «Каталог: 5 товаров с ценами и штрихкодами»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Карточка товара: цена продажи и штрихкод»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Справочник контрагентов: поставщик (БИН, телефон)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 11136мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791474146246 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791474146246 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| ui | Кассир: в меню нет модуля «Деньги» (счета/платежи/долги) | ✓ ожид=нет факт=нет |
|
||||||
|
| ui | Кассир: в меню есть своя касса (/money/shifts) | ✓ ожид=есть факт=есть |
|
||||||
|
| ui | Кассир: в меню нет «Настройки» | ✓ ожид=нет /settings факт=нет |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| ui | Экран «Сотрудники: кассир, кладовщик, администратор (роли)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Точки продаж (2 кассы)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 2322мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
| ui | Экран «Счета: касса, банк (номер), эквайринг — начальные остатки»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 1416мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
| ui | Экран «Долги поставщикам: начальный долг 100 000 ₸»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 5513мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 07b0f8f2… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 85c5df41… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 3a92b534… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 14a6ac60… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 83273433… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
| ui | Экран «Приёмка №1: форма создания (до проведения)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Список приёмок»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №1: проведена, строки и себестоимость»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 6622мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914741 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914741 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914741 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
| ui | Экран «Загруженные накладные (табличная разобрана)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №2: «Поставщик не указан», проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 21655мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
| ui | Экран «Фото-накладная: распознана (OCR) и сопоставлена вручную»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №3 (по фото): проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 3639мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
| ui | Экран «Платежи поставщикам: нал из кассы + с банка»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Долги поставщикам после оплат (= формуле)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 8204мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
| ui | Экран «Смены кассы: открытие/закрытие, размен»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Закрытая смена: должно быть / факт / разница (Z-отчёт)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Чеки продаж (наличные/карта/смешанная) и возврат»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 3484мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| ui | Экран «Параллельные смены на точках 1 и 2 (деньги раздельны)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 8710мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвентаризация завершена (Completed) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После завершения остаток НЕ изменился | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Создано оприходование излишков | ✓ ожид=200+enterId факт=200 |
|
||||||
|
| api | В инвентаризации виден связанный документ | ✓ ожид=true факт=true |
|
||||||
|
| api | Оприходование проведено | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Излишек применён оприходованием (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
| api | Оприходование «на основании инвентаризации №…» | ✓ ожид=инв.№ факт=И-2026-000003 |
|
||||||
|
| ui | Экран «Оприходование излишка (+8)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Списание брака (−2)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Инвентаризация (часть товаров): расхождения»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Остатки после складских операций»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 4760мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| ui | Экран «Отчёт: продажи за день (выручка)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: прибыль (выручка − себестоимость)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: остатки на дату»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт «Деньги»: остатки по счетам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: долги поставщикам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 3249мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179147 | ✓ ожид=43.5 факт=43.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179147 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179147 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179147 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179147 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
| ui | Экран «Движения склада (остаток ≡ Σ движений)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 1504мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
| ui | Экран «Отмена платежа → долг вернулся»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1056мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| ui | Финальный дашборд без ошибок | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
283
tests/e2e/reports/full-chain-2026-10-08T20-28-47-547Z.md
Normal file
|
|
@ -0,0 +1,283 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-08T20:27:42.485Z
|
||||||
|
Длительность: 65.1с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2496мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2224мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 7486мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791491262483 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791491262483 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1211мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 841мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2880мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 2c431ed6… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 1b17444d… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток d69bed51… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 39be51c4… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 3aa12e64… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5762мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17914912 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17914912 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17914912 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 19934мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 2153мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 6018мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2848мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 7138мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвентаризация завершена (Completed) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После завершения остаток НЕ изменился | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Создано оприходование излишков | ✓ ожид=200+enterId факт=200 |
|
||||||
|
| api | В инвентаризации виден связанный документ | ✓ ожид=true факт=true |
|
||||||
|
| api | Оприходование проведено | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Излишек применён оприходованием (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
| api | Оприходование «на основании инвентаризации №…» | ✓ ожид=инв.№ факт=И-2026-000003 |
|
||||||
|
| api | unpost при проведённом связанном → 409 (не удаляет) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Отмена результатов (cancel-results) → 200 | ✓ ожид=200 факт=200 |
|
||||||
|
| api | После отмены результатов остаток вернулся | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Оприходование НЕ удалено, стало черновиком | ✓ ожид=draft факт=200/0 |
|
||||||
|
| api | Связанный документ остался (черновик) | ✓ ожид=true факт=true |
|
||||||
|
| api | Повторное проведение оприходования | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После повторного проведения остаток снова = факт (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1031мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=3300 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=3300 факт=3300 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 2343мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179149 | ✓ ожид=43.5 факт=43.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179149 | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179149 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179149 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179149 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 691мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
285
tests/e2e/reports/full-chain-2026-10-09T02-32-35-066Z.md
Normal file
|
|
@ -0,0 +1,285 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-09T02:31:28.439Z
|
||||||
|
Длительность: 66.6с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2579мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2727мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 7284мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791513088437 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791513088437 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1261мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 688мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 3094мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 320cbae3… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 70b1d7d1… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток c8952930… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 2426489b… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 66127d8b… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5196мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17915130 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17915130 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17915130 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 19951мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 2053мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 6434мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После продажи в минус появилось предупреждение | ✓ ожид=>=1 факт=1 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Z-отчёт: разбивка по товарам (byProduct) | ✓ ожид=>0 факт=3 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без смены → автооткрытие смены | ✓ ожид=204 факт=204 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2680мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 8336мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвентаризация завершена (Completed) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После завершения остаток НЕ изменился | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Создано оприходование излишков | ✓ ожид=200+enterId факт=200 |
|
||||||
|
| api | В инвентаризации виден связанный документ | ✓ ожид=true факт=true |
|
||||||
|
| api | Оприходование проведено | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Излишек применён оприходованием (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
| api | Оприходование «на основании инвентаризации №…» | ✓ ожид=инв.№ факт=И-2026-000003 |
|
||||||
|
| api | unpost при проведённом связанном → 409 (не удаляет) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Отмена результатов (cancel-results) → 200 | ✓ ожид=200 факт=200 |
|
||||||
|
| api | После отмены результатов остаток вернулся | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Оприходование НЕ удалено, стало черновиком | ✓ ожид=draft факт=200/0 |
|
||||||
|
| api | Связанный документ остался (черновик) | ✓ ожид=true факт=true |
|
||||||
|
| api | Повторное проведение оприходования | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После повторного проведения остаток снова = факт (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1056мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=4000 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 2298мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179151 | ✓ ожид=43.5 факт=43.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179151 | ✓ ожид=56 факт=56 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179151 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179151 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179151 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 984мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 2мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
282
tests/e2e/reports/full-chain-2026-10-09T05-21-47-078Z.md
Normal file
|
|
@ -0,0 +1,282 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-09T05:20:36.351Z
|
||||||
|
Длительность: 70.7с
|
||||||
|
|
||||||
|
**Итог:** 12 ✓ / 4 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 4776мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 4355мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 8187мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791523236350 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791523236350 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1309мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 756мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✗ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 3480мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 64df7151… +12.5 | ✗ ожид=12.5 факт=0 |
|
||||||
|
| api | Остаток f0f839c9… +25 | ✗ ожид=25 факт=0 |
|
||||||
|
| api | Остаток fe1be28a… +30 | ✗ ожид=30 факт=0 |
|
||||||
|
| api | Остаток 214e4381… +35 | ✗ ожид=35 факт=0 |
|
||||||
|
| api | Остаток 851ac7fb… +40 | ✗ ожид=40 факт=0 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✗ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5315мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17915232 +7 | ✗ ожид=7 факт=0 |
|
||||||
|
| api | Остаток Товар 2 fc17915232 +4 | ✗ ожид=4 факт=0 |
|
||||||
|
| api | Остаток Товар 3 fc17915232 +9 | ✗ ожид=9 факт=0 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 20124мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 2339мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 6514мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После продажи в минус появилось предупреждение | ✓ ожид=>=1 факт=1 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Z-отчёт: разбивка по товарам (byProduct) | ✓ ожид=>0 факт=3 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без смены → автооткрытие смены | ✓ ожид=204 факт=204 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2757мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✗ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 6382мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✗ ожид=-1 факт=0 |
|
||||||
|
| api | Оприходование излишка (+8) | ✗ ожид=8 факт=0 |
|
||||||
|
| api | Списание брака (−2) | ✗ ожид=2 факт=0 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✗ ожид=2 факт=0 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✗ ожид=200+id факт=400 |
|
||||||
|
| api | Инвентаризация завершена (Completed) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После завершения остаток НЕ изменился | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Создано оприходование излишков | ✗ ожид=200+enterId факт=400 |
|
||||||
|
| api | В инвентаризации виден связанный документ | ✗ ожид=true факт=false |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 1021мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=4000 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
|
||||||
|
## ✗ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 2477мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179152 | ✗ ожид=41.5 факт=0 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179152 | ✗ ожид=56 факт=0 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179152 | ✗ ожид=54 факт=0 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179152 | ✗ ожид=43 факт=0 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179152 | ✗ ожид=38 факт=0 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 931мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 12
|
||||||
|
- Failed: 4
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
### CRITICAL
|
||||||
|
|
||||||
|
- **[12] Остаток ≠ сумме движений склада**
|
||||||
|
- см. строки шага
|
||||||
|
|
||||||
|
### HIGH
|
||||||
|
|
||||||
|
- **[05] Остатки не выросли на количество приёмки**
|
||||||
|
- supply=fc4e0c87-0c9e-4c83-8cc7-76e86b8fb97d
|
||||||
|
- **[06] Остатки после приёмки №2 не совпали**
|
||||||
|
- supply=22a8eb2c-50bb-42be-9ed3-78f1740aa228
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
285
tests/e2e/reports/full-chain-2026-10-09T05-23-34-327Z.md
Normal file
|
|
@ -0,0 +1,285 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-09T05:22:39.032Z
|
||||||
|
Длительность: 55.3с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 1815мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 1869мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 6426мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791523359030 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791523359030 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 814мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 381мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2306мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 34a7a0a2… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 2c8be8bf… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток da57d45d… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 87f7fda1… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток a5d5bfa5… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5153мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17915233 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17915233 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17915233 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 16945мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1437мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 4840мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После продажи в минус появилось предупреждение | ✓ ожид=>=1 факт=1 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Z-отчёт: разбивка по товарам (byProduct) | ✓ ожид=>0 факт=3 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без смены → автооткрытие смены | ✓ ожид=204 факт=204 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2642мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 6721мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвентаризация завершена (Completed) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После завершения остаток НЕ изменился | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Создано оприходование излишков | ✓ ожид=200+enterId факт=200 |
|
||||||
|
| api | В инвентаризации виден связанный документ | ✓ ожид=true факт=true |
|
||||||
|
| api | Оприходование проведено | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Излишек применён оприходованием (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
| api | Оприходование «на основании инвентаризации №…» | ✓ ожид=инв.№ факт=И-2026-000003 |
|
||||||
|
| api | unpost при проведённом связанном → 409 (не удаляет) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Отмена результатов (cancel-results) → 200 | ✓ ожид=200 факт=200 |
|
||||||
|
| api | После отмены результатов остаток вернулся | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Оприходование НЕ удалено, стало черновиком | ✓ ожид=draft факт=200/0 |
|
||||||
|
| api | Связанный документ остался (черновик) | ✓ ожид=true факт=true |
|
||||||
|
| api | Повторное проведение оприходования | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После повторного проведения остаток снова = факт (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 899мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=4000 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 2153мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179152 | ✓ ожид=43.5 факт=43.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179152 | ✓ ожид=56 факт=56 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179152 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179152 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179152 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 887мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
285
tests/e2e/reports/full-chain-2026-10-09T05-39-00-855Z.md
Normal file
|
|
@ -0,0 +1,285 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-09T05:38:01.732Z
|
||||||
|
Длительность: 59.1с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2451мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2190мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 6704мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791524281730 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791524281730 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 906мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 423мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 2431мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 55e93eb8… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток ac63b7c4… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток c30c9385… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток b081da76… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 43a52782… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 4884мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17915242 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17915242 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17915242 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 19904мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 1390мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 4746мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После продажи в минус появилось предупреждение | ✓ ожид=>=1 факт=1 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Z-отчёт: разбивка по товарам (byProduct) | ✓ ожид=>0 факт=3 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без смены → автооткрытие смены | ✓ ожид=204 факт=204 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2708мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 6294мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвентаризация завершена (Completed) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После завершения остаток НЕ изменился | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Создано оприходование излишков | ✓ ожид=200+enterId факт=200 |
|
||||||
|
| api | В инвентаризации виден связанный документ | ✓ ожид=true факт=true |
|
||||||
|
| api | Оприходование проведено | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Излишек применён оприходованием (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
| api | Оприходование «на основании инвентаризации №…» | ✓ ожид=инв.№ факт=И-2026-000003 |
|
||||||
|
| api | unpost при проведённом связанном → 409 (не удаляет) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Отмена результатов (cancel-results) → 200 | ✓ ожид=200 факт=200 |
|
||||||
|
| api | После отмены результатов остаток вернулся | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Оприходование НЕ удалено, стало черновиком | ✓ ожид=draft факт=200/0 |
|
||||||
|
| api | Связанный документ остался (черновик) | ✓ ожид=true факт=true |
|
||||||
|
| api | Повторное проведение оприходования | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После повторного проведения остаток снова = факт (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 842мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=4000 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 2235мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179152 | ✓ ожид=43.5 факт=43.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179152 | ✓ ожид=56 факт=56 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179152 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179152 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179152 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 1011мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
285
tests/e2e/reports/full-chain-2026-10-09T06-24-27-925Z.md
Normal file
|
|
@ -0,0 +1,285 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-09T06:23:18.925Z
|
||||||
|
Длительность: 69.0с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 2549мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Регистрация организации e2e-fullchain + вход владельцем | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 2412мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Группа товаров создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Создано 5 товаров (разные ед.изм.) | ✓ ожид=5 факт=5 |
|
||||||
|
| api | Один товар весовой (дробное кол-во) | ✓ ожид=1 факт=1 |
|
||||||
|
| api | Товар находится по штрихкоду | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Поставщик создан (БИН+телефон) | ✓ ожид=200+id факт=201 |
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 7959мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Штрихкоды EAN-13 с валидной контрольной цифрой | ✓ ожид=0 неверных факт=0/5 |
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 fc1791526998918 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 fc1791526998918 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 1271мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 821мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 3334мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 8db5fd64… +12.5 | ✓ ожид=12.5 факт=12.5 |
|
||||||
|
| api | Остаток 878b7af1… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток 4b8131d1… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток 70ac094f… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 0081b920… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=300 факт=300 |
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 5266мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток Товар 1 fc17915269 +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток Товар 2 fc17915269 +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток Товар 3 fc17915269 +9 | ✓ ожид=9 факт=9 |
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 20155мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 2273мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы (≤ остатка) | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата больше остатка кассы → отказ (409 insufficient-funds) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=30000 факт=30000 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=8640 факт=8640 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=181030 факт=181030 |
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 6971мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После продажи в минус появилось предупреждение | ✓ ожид=>=1 факт=1 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=12950 факт=12950 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=1450/12950 факт=1450/12950 |
|
||||||
|
| api | Z-отчёт: разбивка по товарам (byProduct) | ✓ ожид=>0 факт=3 |
|
||||||
|
| api | Деньги смены в остатке кассы (касса += факт − размен) | ✓ ожид=28450 факт=28450 |
|
||||||
|
| api | Продажи картой в остатке эквайринга | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Продажа без смены → автооткрытие смены | ✓ ожид=204 факт=204 |
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 2584мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=1500 факт=1500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2700 факт=2700 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 8983мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик → оприходование доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → списание доступно (не 403) | ✓ ожид=<400 факт=201 |
|
||||||
|
| api | Кладовщик → инвентаризация доступна (не 403) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Пустая инвентаризация проведена (одно расхождение) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Пустая инвентаризация: непосчитанный НЕ обнулён | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Пустая инвентаризация: посчитанный применён (недостача 1) | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвентаризация завершена (Completed) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После завершения остаток НЕ изменился | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Создано оприходование излишков | ✓ ожид=200+enterId факт=200 |
|
||||||
|
| api | В инвентаризации виден связанный документ | ✓ ожид=true факт=true |
|
||||||
|
| api | Оприходование проведено | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Излишек применён оприходованием (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
| api | Оприходование «на основании инвентаризации №…» | ✓ ожид=инв.№ факт=И-2026-000003 |
|
||||||
|
| api | unpost при проведённом связанном → 409 (не удаляет) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Отмена результатов (cancel-results) → 200 | ✓ ожид=200 факт=200 |
|
||||||
|
| api | После отмены результатов остаток вернулся | ✓ ожид=40.5 факт=40.5 |
|
||||||
|
| api | Оприходование НЕ удалено, стало черновиком | ✓ ожид=draft факт=200/0 |
|
||||||
|
| api | Связанный документ остался (черновик) | ✓ ожид=true факт=true |
|
||||||
|
| api | Повторное проведение оприходования | ✓ ожид=204 факт=204 |
|
||||||
|
| api | После повторного проведения остаток снова = факт (+3) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 979мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=4000 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплаты + движения смен | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Деньги: эквайринг = продажи картой − возвраты картой | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=4000 факт=4000 |
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 2461мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 1 fc179152 | ✓ ожид=43.5 факт=43.5 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 2 fc179152 | ✓ ожид=56 факт=56 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 3 fc179152 | ✓ ожид=52 факт=52 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 4 fc179152 | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: Товар 5 fc179152 | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант Касса ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=28950 факт=28950 |
|
||||||
|
| api | Инвариант Банк ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=191360 факт=191360 |
|
||||||
|
| api | Инвариант Эквайринг ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=1150 факт=1150 |
|
||||||
|
| api | Инвариант Касса-2 ≡ независимому расчёту (нач+платежи+смены) | ✓ ожид=3700 факт=3700 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=181030 факт=181030 |
|
||||||
|
| api | Изоляция: demo-admin НЕ видит товар e2e-орг | ✓ ожид=404/403 факт=404 |
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 978мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → проведено (минус разрешён) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=211030 факт=211030 |
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 1мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Режим C: temp-орг чистится ночной уборкой (>3 дней) | ✓ ожид=cleanup факт=ночь |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
481
tests/e2e/reports/full-chain-demo-20261008-010636.md
Normal file
|
|
@ -0,0 +1,481 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T20:06:43.067Z
|
||||||
|
Длительность: 119.0с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 5107мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вход demo-admin (режим B) | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| ui | Кабинет владельца открылся без ошибок (0 console/5xx/тостов) | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Вход владельца → дашборд](full-chain-demo-20261008-010636/screenshots/01-vhod-dashboard.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 5709мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Выбрано реальных товаров каталога (≥5, штрихкод+цена) | ✓ ожид=≥5 факт=12 |
|
||||||
|
| api | Среди выбранных есть весовой (информативно) | ✓ ожид=≥0 факт=0 |
|
||||||
|
| api | Поставщик [e2e] создан | ✓ ожид=200+id факт=201 |
|
||||||
|
| ui | Экран «Каталог «Демо-магазина»: реальные товары»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Поставщик [e2e]»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Каталог «Демо-магазина»: реальные товары](full-chain-demo-20261008-010636/screenshots/02-tovary-realnye.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Поставщик [e2e]](full-chain-demo-20261008-010636/screenshots/02-postavshchik.png)
|
||||||
|
|
||||||
|
![Поставщик [e2e]](full-chain-demo-20261008-010636/screenshots/02-postavshchik.png)
|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 8377мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 (e2e) 1791403603066 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 (e2e) 1791403603066 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| ui | Экран «Сотрудники: кассир, кладовщик, администратор (роли)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Точки продаж (2 кассы)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Сотрудники: кассир, кладовщик, администратор (роли)](full-chain-demo-20261008-010636/screenshots/02a-sotrudniki.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Точки продаж (2 кассы)](full-chain-demo-20261008-010636/screenshots/02a-tochki-prodazh.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 2564мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
| ui | Экран «Счета: касса, банк (номер), эквайринг — начальные остатки»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Счета: касса, банк (номер), эквайринг — начальные остатки](full-chain-demo-20261008-010636/screenshots/03-scheta.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 2068мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
| ui | Экран «Долги поставщикам: начальный долг 100 000 ₸»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Долги поставщикам: начальный долг 100 000 ₸](full-chain-demo-20261008-010636/screenshots/04-dolg-nachalnyy.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 9501мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 0bd54f29… +20 | ✓ ожид=20 факт=20 |
|
||||||
|
| api | Остаток 0cfad6a5… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток e6e79bf2… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток fbe7d065… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 3a92d8a7… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Остаток 9a6a59f8… +45 | ✓ ожид=45 факт=45 |
|
||||||
|
| api | Остаток db59983d… +50 | ✓ ожид=50 факт=50 |
|
||||||
|
| api | Остаток 66866675… +55 | ✓ ожид=55 факт=55 |
|
||||||
|
| api | Остаток a6d3c6a1… +60 | ✓ ожид=60 факт=60 |
|
||||||
|
| api | Остаток f75a5241… +65 | ✓ ожид=65 факт=65 |
|
||||||
|
| api | Остаток 519251c8… +70 | ✓ ожид=70 факт=70 |
|
||||||
|
| api | Остаток 89f82dd6… +75 | ✓ ожид=75 факт=75 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=900 факт=900 |
|
||||||
|
| ui | Экран «Приёмка №1: форма создания (до проведения)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Список приёмок»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №1: проведена, строки и себестоимость»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Приёмка №1: форма создания (до проведения)](full-chain-demo-20261008-010636/screenshots/05-priemka1-forma.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Список приёмок](full-chain-demo-20261008-010636/screenshots/05-priemka1-spisok.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Приёмка №1: проведена, строки и себестоимость](full-chain-demo-20261008-010636/screenshots/05-priemka1-provedena.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 8516мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +9 | ✓ ожид=9 факт=9 |
|
||||||
|
| ui | Экран «Загруженные накладные (табличная разобрана)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №2: «Поставщик не указан», проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Загруженные накладные (табличная разобрана)](full-chain-demo-20261008-010636/screenshots/06-nakladnye-spisok.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Приёмка №2: «Поставщик не указан», проведена](full-chain-demo-20261008-010636/screenshots/06-priemka2-provedena.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 25707мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
| ui | Экран «Фото-накладная: распознана (OCR) и сопоставлена вручную»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №3 (по фото): проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Фото-накладная: распознана (OCR) и сопоставлена вручную](full-chain-demo-20261008-010636/screenshots/07-foto-nakladnaya-razobrana.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Приёмка №3 (по фото): проведена](full-chain-demo-20261008-010636/screenshots/07-priemka3-provedena.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Фото-приёмка с телефона (моб.)](full-chain-demo-20261008-010636/screenshots/07-mob-foto-priemka.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 4651мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=148812 факт=148812 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=18390 факт=18390 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=349498 факт=349498 |
|
||||||
|
| ui | Экран «Платежи поставщикам: нал из кассы + с банка»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Долги поставщикам после оплат (= формуле)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Платежи поставщикам: нал из кассы + с банка](full-chain-demo-20261008-010636/screenshots/08-platezhi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Долги поставщикам после оплат (= формуле)](full-chain-demo-20261008-010636/screenshots/08-dolg-posle-oplat.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 9860мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=14275 факт=14275 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=3775/14275 факт=3775/14275 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
| ui | Экран «Смены кассы: открытие/закрытие, размен»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Закрытая смена: должно быть / факт / разница (Z-отчёт)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Чеки продаж (наличные/карта/смешанная) и возврат»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Смены кассы: открытие/закрытие, размен](full-chain-demo-20261008-010636/screenshots/09-smeny-spisok.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Закрытая смена: должно быть / факт / разница (Z-отчёт)](full-chain-demo-20261008-010636/screenshots/09-smena-zakryta-z.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Чеки продаж (наличные/карта/смешанная) и возврат](full-chain-demo-20261008-010636/screenshots/09-cheki-prodazhi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 4205мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2500 факт=2500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=3550 факт=3550 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| ui | Экран «Параллельные смены на точках 1 и 2 (деньги раздельны)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Параллельные смены на точках 1 и 2 (деньги раздельны)](full-chain-demo-20261008-010636/screenshots/09a-parallelnye-smeny.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 10471мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=48 факт=48 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=53 факт=53 |
|
||||||
|
| ui | Экран «Оприходование излишка (+8)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Списание брака (−2)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Инвентаризация (часть товаров): расхождения»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Остатки после складских операций»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Оприходование излишка (+8)](full-chain-demo-20261008-010636/screenshots/10-oprihodovanie.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Списание брака (−2)](full-chain-demo-20261008-010636/screenshots/10-spisanie-braka.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Инвентаризация (часть товаров): расхождения](full-chain-demo-20261008-010636/screenshots/10-inventarizaciya.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Остатки после складских операций](full-chain-demo-20261008-010636/screenshots/10-ostatki-sklad.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Инвентаризация с телефона (сканер) (моб.)](full-chain-demo-20261008-010636/screenshots/10-mob-inventarizaciya.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 9412мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=7650 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=-98812 факт=-98812 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=181610 факт=181610 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по точкам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Отчёт продаж по кассирам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| ui | Экран «Отчёт: продажи за день (выручка)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: прибыль (выручка − себестоимость)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: остатки на дату»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт «Деньги»: остатки по счетам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: долги поставщикам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Отчёт: продажи за день (выручка)](full-chain-demo-20261008-010636/screenshots/11-otchet-prodazhi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт: прибыль (выручка − себестоимость)](full-chain-demo-20261008-010636/screenshots/11-otchet-pribyl.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт: остатки на дату](full-chain-demo-20261008-010636/screenshots/11-otchet-ostatki.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт «Деньги»: остатки по счетам](full-chain-demo-20261008-010636/screenshots/11-otchet-dengi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт: долги поставщикам](full-chain-demo-20261008-010636/screenshots/11-otchet-dolgi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 7084мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=48 факт=48 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=53 факт=53 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "IQ уроки" книги | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Ludwik" средств | ✓ ожид=45 факт=45 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Ludwik" средств | ✓ ожид=50 факт=50 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=55 факт=55 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=60 факт=60 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=65 факт=65 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Rice Day" GRANA | ✓ ожид=70 факт=70 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Richmond" Gold | ✓ ожид=75 факт=75 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса (e2e) 1791 | ✓ ожид=-98812 факт=-98812 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 (e2e) 17 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк (e2e) 17914 | ✓ ожид=181610 факт=181610 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг (e2e) | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 (e2e | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=349498 факт=349498 |
|
||||||
|
| api | Изоляция: режим B (демо) — проверка через temp-орг в режиме C | ✓ ожид=n/a факт=n/a |
|
||||||
|
| ui | Экран «Движения склада (остаток ≡ Σ движений)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Движения склада (остаток ≡ Σ движений)](full-chain-demo-20261008-010636/screenshots/12-dvizheniya-sklada.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 2491мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=498310 факт=498310 |
|
||||||
|
| ui | Экран «Отмена платежа → долг вернулся»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Отмена платежа → долг вернулся](full-chain-demo-20261008-010636/screenshots/13-otkat-dolg-vernulsya.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 3230мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| ui | Финальный дашборд без ошибок | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Галерея index.html собрана (34 кадров) | ✓ ожид=index.html факт=34 |
|
||||||
|
| api | Режим B: e2e-сотрудники деактивированы (не удалены) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Итоговый дашборд](full-chain-demo-20261008-010636/screenshots/14-itog-dashboard.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Галерея скриншотов: /home/nns/food-market/tests/e2e/reports/full-chain-demo-20261008-010636/index.html
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
237
tests/e2e/reports/full-chain-demo-20261008-010636/index.html
Normal file
|
|
@ -0,0 +1,237 @@
|
||||||
|
<!doctype html><html lang="ru"><head><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
<title>Full-chain e2e — скриншоты процессов (Демо-магазин (B))</title>
|
||||||
|
<style>
|
||||||
|
body{font:14px/1.5 system-ui,Segoe UI,Roboto,sans-serif;margin:0;background:#0f172a;color:#e2e8f0}
|
||||||
|
header{padding:20px 24px;background:#1e293b;position:sticky;top:0;box-shadow:0 1px 0 #334155}
|
||||||
|
h1{margin:0 0 4px;font-size:20px} .sub{color:#94a3b8;font-size:13px}
|
||||||
|
section{padding:8px 24px 24px} h2{font-size:15px;color:#7dd3fc;border-bottom:1px solid #334155;padding-bottom:6px}
|
||||||
|
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:16px}
|
||||||
|
figure{margin:0;background:#1e293b;border:1px solid #334155;border-radius:10px;overflow:hidden}
|
||||||
|
img{width:100%;display:block;background:#fff;cursor:zoom-in}
|
||||||
|
figcaption{padding:8px 10px;font-size:12px;color:#cbd5e1}
|
||||||
|
small{color:#64748b}
|
||||||
|
</style></head><body>
|
||||||
|
<header><h1>Жизнь магазина — скриншоты процессов</h1>
|
||||||
|
<div class="sub">Прогон: Демо-магазин (B) · 2026-10-07T20:08:40.638Z · всего кадров: 34</div></header>
|
||||||
|
<section><h2>step01_register_and_login</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/01-vhod-dashboard.png" target="_blank">
|
||||||
|
<img src="screenshots/01-vhod-dashboard.png" loading="lazy" alt="Вход владельца → дашборд организации"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Вход владельца → дашборд организации<br><small>01-vhod-dashboard.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step02_catalog_and_supplier</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02-tovary-realnye.png" target="_blank">
|
||||||
|
<img src="screenshots/02-tovary-realnye.png" loading="lazy" alt="Каталог «Демо-магазина»: реальные товары"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Каталог «Демо-магазина»: реальные товары<br><small>02-tovary-realnye.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02-postavshchik.png" target="_blank">
|
||||||
|
<img src="screenshots/02-postavshchik.png" loading="lazy" alt="Поставщик [e2e]"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Поставщик [e2e]<br><small>02-postavshchik.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step02a_employees_and_points</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02a-sotrudniki.png" target="_blank">
|
||||||
|
<img src="screenshots/02a-sotrudniki.png" loading="lazy" alt="Сотрудники: кассир, кладовщик, администратор (роли)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Сотрудники: кассир, кладовщик, администратор (роли)<br><small>02a-sotrudniki.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02a-tochki-prodazh.png" target="_blank">
|
||||||
|
<img src="screenshots/02a-tochki-prodazh.png" loading="lazy" alt="Точки продаж (2 кассы)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Точки продаж (2 кассы)<br><small>02a-tochki-prodazh.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step03_money_accounts</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/03-scheta.png" target="_blank">
|
||||||
|
<img src="screenshots/03-scheta.png" loading="lazy" alt="Счета: касса, банк (номер), эквайринг — начальные остатки"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Счета: касса, банк (номер), эквайринг — начальные остатки<br><small>03-scheta.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step04_initial_supplier_debt</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/04-dolg-nachalnyy.png" target="_blank">
|
||||||
|
<img src="screenshots/04-dolg-nachalnyy.png" loading="lazy" alt="Долги поставщикам: начальный долг 100 000 ₸"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Долги поставщикам: начальный долг 100 000 ₸<br><small>04-dolg-nachalnyy.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step05_supply1_manual</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/05-priemka1-forma.png" target="_blank">
|
||||||
|
<img src="screenshots/05-priemka1-forma.png" loading="lazy" alt="Приёмка №1: форма создания (до проведения)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №1: форма создания (до проведения)<br><small>05-priemka1-forma.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/05-priemka1-spisok.png" target="_blank">
|
||||||
|
<img src="screenshots/05-priemka1-spisok.png" loading="lazy" alt="Список приёмок"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Список приёмок<br><small>05-priemka1-spisok.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/05-priemka1-provedena.png" target="_blank">
|
||||||
|
<img src="screenshots/05-priemka1-provedena.png" loading="lazy" alt="Приёмка №1: проведена, строки и себестоимость"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №1: проведена, строки и себестоимость<br><small>05-priemka1-provedena.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step06_supply2_excel</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/06-nakladnye-spisok.png" target="_blank">
|
||||||
|
<img src="screenshots/06-nakladnye-spisok.png" loading="lazy" alt="Загруженные накладные (табличная разобрана)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Загруженные накладные (табличная разобрана)<br><small>06-nakladnye-spisok.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/06-priemka2-provedena.png" target="_blank">
|
||||||
|
<img src="screenshots/06-priemka2-provedena.png" loading="lazy" alt="Приёмка №2: «Поставщик не указан», проведена"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №2: «Поставщик не указан», проведена<br><small>06-priemka2-provedena.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step07_supply3_photo</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/07-foto-nakladnaya-razobrana.png" target="_blank">
|
||||||
|
<img src="screenshots/07-foto-nakladnaya-razobrana.png" loading="lazy" alt="Фото-накладная: распознана (OCR) и сопоставлена вручную"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Фото-накладная: распознана (OCR) и сопоставлена вручную<br><small>07-foto-nakladnaya-razobrana.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/07-priemka3-provedena.png" target="_blank">
|
||||||
|
<img src="screenshots/07-priemka3-provedena.png" loading="lazy" alt="Приёмка №3 (по фото): проведена"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №3 (по фото): проведена<br><small>07-priemka3-provedena.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/07-mob-foto-priemka.png" target="_blank">
|
||||||
|
<img src="screenshots/07-mob-foto-priemka.png" loading="lazy" alt="Фото-приёмка с телефона"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>📱 Фото-приёмка с телефона<br><small>07-mob-foto-priemka.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step08_supplier_payments</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/08-platezhi.png" target="_blank">
|
||||||
|
<img src="screenshots/08-platezhi.png" loading="lazy" alt="Платежи поставщикам: нал из кассы + с банка"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Платежи поставщикам: нал из кассы + с банка<br><small>08-platezhi.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/08-dolg-posle-oplat.png" target="_blank">
|
||||||
|
<img src="screenshots/08-dolg-posle-oplat.png" loading="lazy" alt="Долги поставщикам после оплат (= формуле)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Долги поставщикам после оплат (= формуле)<br><small>08-dolg-posle-oplat.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step09_cashier_shift</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09-smeny-spisok.png" target="_blank">
|
||||||
|
<img src="screenshots/09-smeny-spisok.png" loading="lazy" alt="Смены кассы: открытие/закрытие, размен"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Смены кассы: открытие/закрытие, размен<br><small>09-smeny-spisok.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09-smena-zakryta-z.png" target="_blank">
|
||||||
|
<img src="screenshots/09-smena-zakryta-z.png" loading="lazy" alt="Закрытая смена: должно быть / факт / разница (Z-отчёт)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Закрытая смена: должно быть / факт / разница (Z-отчёт)<br><small>09-smena-zakryta-z.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09-cheki-prodazhi.png" target="_blank">
|
||||||
|
<img src="screenshots/09-cheki-prodazhi.png" loading="lazy" alt="Чеки продаж (наличные/карта/смешанная) и возврат"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Чеки продаж (наличные/карта/смешанная) и возврат<br><small>09-cheki-prodazhi.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step09a_points_binding</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09a-parallelnye-smeny.png" target="_blank">
|
||||||
|
<img src="screenshots/09a-parallelnye-smeny.png" loading="lazy" alt="Параллельные смены на точках 1 и 2 (деньги раздельны)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Параллельные смены на точках 1 и 2 (деньги раздельны)<br><small>09a-parallelnye-smeny.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step10_warehouse_ops</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-oprihodovanie.png" target="_blank">
|
||||||
|
<img src="screenshots/10-oprihodovanie.png" loading="lazy" alt="Оприходование излишка (+8)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Оприходование излишка (+8)<br><small>10-oprihodovanie.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-spisanie-braka.png" target="_blank">
|
||||||
|
<img src="screenshots/10-spisanie-braka.png" loading="lazy" alt="Списание брака (−2)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Списание брака (−2)<br><small>10-spisanie-braka.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-inventarizaciya.png" target="_blank">
|
||||||
|
<img src="screenshots/10-inventarizaciya.png" loading="lazy" alt="Инвентаризация (часть товаров): расхождения"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Инвентаризация (часть товаров): расхождения<br><small>10-inventarizaciya.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-ostatki-sklad.png" target="_blank">
|
||||||
|
<img src="screenshots/10-ostatki-sklad.png" loading="lazy" alt="Остатки после складских операций"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Остатки после складских операций<br><small>10-ostatki-sklad.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-mob-inventarizaciya.png" target="_blank">
|
||||||
|
<img src="screenshots/10-mob-inventarizaciya.png" loading="lazy" alt="Инвентаризация с телефона (сканер)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>📱 Инвентаризация с телефона (сканер)<br><small>10-mob-inventarizaciya.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step11_reports</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-prodazhi.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-prodazhi.png" loading="lazy" alt="Отчёт: продажи за день (выручка)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: продажи за день (выручка)<br><small>11-otchet-prodazhi.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-pribyl.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-pribyl.png" loading="lazy" alt="Отчёт: прибыль (выручка − себестоимость)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: прибыль (выручка − себестоимость)<br><small>11-otchet-pribyl.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-ostatki.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-ostatki.png" loading="lazy" alt="Отчёт: остатки на дату"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: остатки на дату<br><small>11-otchet-ostatki.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-dengi.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-dengi.png" loading="lazy" alt="Отчёт «Деньги»: остатки по счетам"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт «Деньги»: остатки по счетам<br><small>11-otchet-dengi.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-dolgi.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-dolgi.png" loading="lazy" alt="Отчёт: долги поставщикам"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: долги поставщикам<br><small>11-otchet-dolgi.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step12_invariants</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/12-dvizheniya-sklada.png" target="_blank">
|
||||||
|
<img src="screenshots/12-dvizheniya-sklada.png" loading="lazy" alt="Движения склада (остаток ≡ Σ движений)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Движения склада (остаток ≡ Σ движений)<br><small>12-dvizheniya-sklada.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step13_cancel_rollback</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/13-otkat-dolg-vernulsya.png" target="_blank">
|
||||||
|
<img src="screenshots/13-otkat-dolg-vernulsya.png" loading="lazy" alt="Отмена платежа → долг вернулся"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отмена платежа → долг вернулся<br><small>13-otkat-dolg-vernulsya.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step14_finalize</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/14-itog-dashboard.png" target="_blank">
|
||||||
|
<img src="screenshots/14-itog-dashboard.png" loading="lazy" alt="Итоговый дашборд магазина после полного дня"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Итоговый дашборд магазина после полного дня<br><small>14-itog-dashboard.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
</body></html>
|
||||||
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 229 KiB |
|
After Width: | Height: | Size: 629 KiB |
|
After Width: | Height: | Size: 389 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 285 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 457 KiB |
|
After Width: | Height: | Size: 250 KiB |
|
After Width: | Height: | Size: 330 KiB |
|
After Width: | Height: | Size: 377 KiB |
|
After Width: | Height: | Size: 381 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 377 KiB |
|
After Width: | Height: | Size: 267 KiB |
|
After Width: | Height: | Size: 298 KiB |
|
After Width: | Height: | Size: 345 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 240 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 234 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 424 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 267 KiB |
|
After Width: | Height: | Size: 262 KiB |
|
After Width: | Height: | Size: 275 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 671 KiB |
|
After Width: | Height: | Size: 267 KiB |
|
After Width: | Height: | Size: 340 KiB |
500
tests/e2e/reports/full-chain-demo-final-20261008-013158.md
Normal file
|
|
@ -0,0 +1,500 @@
|
||||||
|
# E2E report: full-chain
|
||||||
|
|
||||||
|
Запущен: 2026-10-07T20:32:02.141Z
|
||||||
|
Длительность: 141.3с
|
||||||
|
|
||||||
|
**Итог:** 16 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 16)
|
||||||
|
|
||||||
|
## ✓ Step step01_register_and_login: Регистрация организации → вход владельцем → простой режим (скрытые модули 403)
|
||||||
|
|
||||||
|
Длительность: 4850мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Вход demo-admin (режим B) | ✓ ожид=token факт=token |
|
||||||
|
| api | /api/me: роль Admin | ✓ ожид=Admin факт=Admin |
|
||||||
|
| api | Простой режим включён (advancedMode=false) | ✓ ожид=false факт=false |
|
||||||
|
| api | Скрытый модуль недоступен: приёмка оптовых отгрузок (demands) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: перемещения (transfers) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: акции (promotions) | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| api | Скрытый модуль недоступен: ABC-отчёт | ✓ ожид=403 advanced-mode-required факт=403 https://food-market.kz/errors/advanced-mode-required |
|
||||||
|
| ui | Кабинет владельца открылся без ошибок (0 console/5xx/тостов) | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Вход владельца → дашборд](full-chain-demo-final-20261008-013158/screenshots/01-vhod-dashboard.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step02_catalog_and_supplier: Справочники — группа, 5 товаров (разные ед.изм., 1 весовой) + цены + штрихкоды; поставщик
|
||||||
|
|
||||||
|
Длительность: 5195мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Валюта KZT в справочнике | ✓ ожид=KZT факт=есть |
|
||||||
|
| api | Магазин (склад) существует | ✓ ожид=≥1 факт=1 |
|
||||||
|
| api | Единицы измерения доступны (≥5 различных) | ✓ ожид=≥5 факт=5 |
|
||||||
|
| api | Выбрано реальных товаров каталога (≥5, штрихкод+цена) | ✓ ожид=≥5 факт=12 |
|
||||||
|
| api | Среди выбранных есть весовой (информативно) | ✓ ожид=≥0 факт=0 |
|
||||||
|
| api | Поставщик [e2e] создан | ✓ ожид=200+id факт=201 |
|
||||||
|
| ui | Экран «Каталог «Демо-магазина»: реальные товары»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Поставщик [e2e]»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Каталог «Демо-магазина»: реальные товары](full-chain-demo-final-20261008-013158/screenshots/02-tovary-realnye.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Поставщик [e2e]](full-chain-demo-final-20261008-013158/screenshots/02-postavshchik.png)
|
||||||
|
|
||||||
|
![Поставщик [e2e]](full-chain-demo-final-20261008-013158/screenshots/02-postavshchik.png)
|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step02a_employees_and_points: Сотрудники (кассир/кладовщик/админ) + 2 точки продаж; права (API 403); правка/пароль/блокировка
|
||||||
|
|
||||||
|
Длительность: 18827мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Системные роли Кассир/Кладовщик есть | ✓ ожид=есть факт=Администратор,Кладовщик,Кассир |
|
||||||
|
| api | Точка продаж создана: Касса-1 (e2e) 1791405122140 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка продаж создана: Касса-2 (e2e) 1791405122140 | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Точка 2: переименование + деактивация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Точка 2: повторная активация | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Сотрудник создан: Кассир | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Кладовщик | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Сотрудник создан: Администратор | ✓ ожид=200+пароль факт=ok |
|
||||||
|
| api | Кассир → деньги (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → платежи (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → сотрудники/настройки (API) 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кассир → продажи доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Кассир → свои смены доступны (касса) | ✓ ожид=200 факт=200 |
|
||||||
|
| ui | Кассир: в меню нет модуля «Деньги» (счета/платежи/долги) | ✓ ожид=нет факт=нет |
|
||||||
|
| ui | Кассир: в меню есть своя касса (/money/shifts) | ✓ ожид=есть факт=есть |
|
||||||
|
| ui | Кассир: в меню нет «Настройки» | ✓ ожид=нет /settings факт=нет |
|
||||||
|
| api | Кассир сменил пароль | ✓ ожид=204 факт=200 |
|
||||||
|
| api | Вход по новому паролю — успех | ✓ ожид=успех факт=200 |
|
||||||
|
| api | Вход по старому паролю — отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Кладовщик → деньги 403 | ✓ ожид=403 факт=403 |
|
||||||
|
| api | Кладовщик → приёмки доступны | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Правка сотрудника (ФИО/тел/должность) | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Блокировка (увольнение) сотрудника | ✓ ожид=200 факт=204 |
|
||||||
|
| api | Заблокированный кассир не получает токен | ✓ ожид=отказ факт=400 |
|
||||||
|
| api | Заблокированный кассир: обновление токена (refresh) → отказ | ✓ ожид=отказ факт=400 |
|
||||||
|
| ui | Экран «Сотрудники: кассир, кладовщик, администратор (роли)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Точки продаж (2 кассы)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Кабинет кассира (ограниченное меню)](full-chain-demo-final-20261008-013158/screenshots/02a-kabinet-kassira.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Кассир: прямой URL /money/accounts не открывает данные](full-chain-demo-final-20261008-013158/screenshots/02a-kassir-pryamoy-url.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Сотрудники: кассир, кладовщик, администратор (роли)](full-chain-demo-final-20261008-013158/screenshots/02a-sotrudniki.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Точки продаж (2 кассы)](full-chain-demo-final-20261008-013158/screenshots/02a-tochki-prodazh.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step03_money_accounts: Деньги — касса, банковский счёт (номер), эквайринг; начальные остатки
|
||||||
|
|
||||||
|
Длительность: 2672мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Касса магазина создана (Cash, нач.остаток 50000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Банковский счёт создан (Bank, номер, нач.остаток 200000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Счёт эквайринга создан (Acquiring) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Для 2-й точки созданы своя касса и эквайринг | ✓ ожид=2 счёта факт=201/201 |
|
||||||
|
| api | Отчёт «Деньги»: касса currentBalance = начальный остаток | ✓ ожид=50000 факт=50000 |
|
||||||
|
| api | Отчёт «Деньги»: банк currentBalance = начальный остаток | ✓ ожид=200000 факт=200000 |
|
||||||
|
| ui | Экран «Счета: касса, банк (номер), эквайринг — начальные остатки»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Счета: касса, банк (номер), эквайринг — начальные остатки](full-chain-demo-final-20261008-013158/screenshots/03-scheta.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step04_initial_supplier_debt: Начальный долг поставщику через корректировку взаиморасчётов (WeOwe) → долг = сумме
|
||||||
|
|
||||||
|
Длительность: 2013мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Корректировка взаиморасчётов создана (WeOwe 100000) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Корректировка проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг поставщика = 100000 (только начальный) | ✓ ожид=100000 факт=100000 |
|
||||||
|
| ui | Экран «Долги поставщикам: начальный долг 100 000 ₸»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Долги поставщикам: начальный долг 100 000 ₸](full-chain-demo-final-20261008-013158/screenshots/04-dolg-nachalnyy.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step05_supply1_manual: Приёмка №1 вручную (кладовщик) → провести → остатки +кол-во; себестоимость
|
||||||
|
|
||||||
|
Длительность: 9626мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кладовщик авторизован для приёмки | ✓ ожид=token факт=keeper |
|
||||||
|
| api | Приёмка №1 создана (черновик) | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Приёмка №1 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток 0bd54f29… +20 | ✓ ожид=20 факт=20 |
|
||||||
|
| api | Остаток 0cfad6a5… +25 | ✓ ожид=25 факт=25 |
|
||||||
|
| api | Остаток e6e79bf2… +30 | ✓ ожид=30 факт=30 |
|
||||||
|
| api | Остаток fbe7d065… +35 | ✓ ожид=35 факт=35 |
|
||||||
|
| api | Остаток 3a92d8a7… +40 | ✓ ожид=40 факт=40 |
|
||||||
|
| api | Остаток 9a6a59f8… +45 | ✓ ожид=45 факт=45 |
|
||||||
|
| api | Остаток db59983d… +50 | ✓ ожид=50 факт=50 |
|
||||||
|
| api | Остаток 66866675… +55 | ✓ ожид=55 факт=55 |
|
||||||
|
| api | Остаток a6d3c6a1… +60 | ✓ ожид=60 факт=60 |
|
||||||
|
| api | Остаток f75a5241… +65 | ✓ ожид=65 факт=65 |
|
||||||
|
| api | Остаток 519251c8… +70 | ✓ ожид=70 факт=70 |
|
||||||
|
| api | Остаток 89f82dd6… +75 | ✓ ожид=75 факт=75 |
|
||||||
|
| api | Себестоимость товара = цене приёмки | ✓ ожид=900 факт=900 |
|
||||||
|
| ui | Экран «Приёмка №1: форма создания (до проведения)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Список приёмок»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №1: проведена, строки и себестоимость»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Приёмка №1: форма создания (до проведения)](full-chain-demo-final-20261008-013158/screenshots/05-priemka1-forma.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Список приёмок](full-chain-demo-final-20261008-013158/screenshots/05-priemka1-spisok.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Приёмка №1: проведена, строки и себестоимость](full-chain-demo-final-20261008-013158/screenshots/05-priemka1-provedena.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step06_supply2_excel: Приёмка №2 из табличной накладной (поставщик не указан → «Поставщик не указан») → провести
|
||||||
|
|
||||||
|
Длительность: 20829мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Табличная накладная загружена | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Накладная разобрана (не pending/parsing) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | Накладная перенесена в приёмку (apply) | ✓ ожид=200+supplyId факт=200 |
|
||||||
|
| api | Поставщик приёмки №2 = «Поставщик не указан» | ✓ ожид=Поставщик не указан факт=Поставщик не указан |
|
||||||
|
| api | Приёмка №2 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +7 | ✓ ожид=7 факт=7 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +4 | ✓ ожид=4 факт=4 |
|
||||||
|
| api | Остаток "BIOBLAS" шампунь +9 | ✓ ожид=9 факт=9 |
|
||||||
|
| ui | Экран «Загруженные накладные (табличная разобрана)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №2: «Поставщик не указан», проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Загруженные накладные (табличная разобрана)](full-chain-demo-final-20261008-013158/screenshots/06-nakladnye-spisok.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Приёмка №2: «Поставщик не указан», проведена](full-chain-demo-final-20261008-013158/screenshots/06-priemka2-provedena.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step07_supply3_photo: Приёмка №3 по фото-накладной → ручное сопоставление → провести; снимки удалены с диска
|
||||||
|
|
||||||
|
Длительность: 25889мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Фото-накладная загружена | ✓ ожид=200+id факт=id |
|
||||||
|
| api | Фото-накладная распознана (OCR, needs_review; до 3 попыток) | ✓ ожид=needs_review факт=needs_review |
|
||||||
|
| api | OCR извлёк хотя бы одну строку | ✓ ожид=≥1 факт=5 |
|
||||||
|
| api | Фото-накладная перенесена в приёмку | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Приёмка №3 проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Снимки удалены с диска после apply (photo → 404) | ✓ ожид=404 факт=404 |
|
||||||
|
| ui | Экран «Фото-накладная: распознана (OCR) и сопоставлена вручную»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Приёмка №3 (по фото): проведена»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Фото-накладная: распознана (OCR) и сопоставлена вручную](full-chain-demo-final-20261008-013158/screenshots/07-foto-nakladnaya-razobrana.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Приёмка №3 (по фото): проведена](full-chain-demo-final-20261008-013158/screenshots/07-priemka3-provedena.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Фото-приёмка с телефона (моб.)](full-chain-demo-final-20261008-013158/screenshots/07-mob-foto-priemka.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step08_supplier_payments: Оплата — №1 частично нал из кассы, №2 полностью с банка; статусы + долг = формуле
|
||||||
|
|
||||||
|
Длительность: 4408мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оплата №1 частично наличными из кассы | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Оплата №2 полностью с банковского счёта | ✓ ожид=204 факт=201 |
|
||||||
|
| api | Приёмка №1: оплачено = частичной сумме | ✓ ожид=148812 факт=148812 |
|
||||||
|
| api | Приёмка №2: оплачено полностью | ✓ ожид=18390 факт=18390 |
|
||||||
|
| api | Долг реального поставщика = начальный + приёмки − оплаты | ✓ ожид=349498 факт=349498 |
|
||||||
|
| ui | Экран «Платежи поставщикам: нал из кассы + с банка»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Долги поставщикам после оплат (= формуле)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Платежи поставщикам: нал из кассы + с банка](full-chain-demo-final-20261008-013158/screenshots/08-platezhi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Долги поставщикам после оплат (= формуле)](full-chain-demo-final-20261008-013158/screenshots/08-dolg-posle-oplat.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step09_cashier_shift: Смена — размен, 3 продажи (нал/карта/смеш), oversell→отказ, возврат, внесение/выплата, закрытие с расхождением + Z; продажа без смены→отказ
|
||||||
|
|
||||||
|
Длительность: 10008мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Смена открыта (размен 5000) | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажа 1 (наличные) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 2 (карта) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа 3 (смешанная) проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Продажа больше остатка → отказ (409) | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Возврат по чеку проведён (1 шт, наличные) | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Внесение и выплата зафиксированы | ✓ ожид=2×200 факт=200/200 |
|
||||||
|
| api | Смена закрыта | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Закрытие: «должно быть» (expectedCash) верно | ✓ ожид=14275 факт=14275 |
|
||||||
|
| api | Закрытие: разница (факт − должно) = расхождению | ✓ ожид=500 факт=500 |
|
||||||
|
| api | Z-отчёт: нал.продажи и expectedCash сходятся | ✓ ожид=3775/14275 факт=3775/14275 |
|
||||||
|
| api | Продажа без открытой смены → отказ | ✓ ожид=409 факт=409 |
|
||||||
|
| ui | Экран «Смены кассы: открытие/закрытие, размен»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Закрытая смена: должно быть / факт / разница (Z-отчёт)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Чеки продаж (наличные/карта/смешанная) и возврат»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Смены кассы: открытие/закрытие, размен](full-chain-demo-final-20261008-013158/screenshots/09-smeny-spisok.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Закрытая смена: должно быть / факт / разница (Z-отчёт)](full-chain-demo-final-20261008-013158/screenshots/09-smena-zakryta-z.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Чеки продаж (наличные/карта/смешанная) и возврат](full-chain-demo-final-20261008-013158/screenshots/09-cheki-prodazhi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step09a_points_binding: Привязка кассира к точкам; параллельные смены на 2 точках не смешивают деньги; продажа на неактивной→отказ
|
||||||
|
|
||||||
|
Длительность: 4759мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Кассир авторизован для проверки привязки | ✓ ожид=token факт=ok |
|
||||||
|
| api | Кассир открывает смену на НЕзакреплённой точке 2 → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| api | Кассир открывает смену на закреплённой точке 1 → успех | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Вторая смена на той же точке → 409 | ✓ ожид=409 факт=409 |
|
||||||
|
| api | Параллельная смена на точке 2 открыта | ✓ ожид=200+id факт=200 |
|
||||||
|
| api | Продажи прошли на обеих точках | ✓ ожид=2×204 факт=204/204 |
|
||||||
|
| api | Точка 1: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=2500 факт=2500 |
|
||||||
|
| api | Точка 2: касса = размен + её продажа (деньги не смешаны) | ✓ ожид=3550 факт=3550 |
|
||||||
|
| api | Смена/продажа на неактивной точке → отказ | ✓ ожид=4xx факт=400 |
|
||||||
|
| ui | Экран «Параллельные смены на точках 1 и 2 (деньги раздельны)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Параллельные смены на точках 1 и 2 (деньги раздельны)](full-chain-demo-final-20261008-013158/screenshots/09a-parallelnye-smeny.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step10_warehouse_ops: Склад — оприходование излишка, списание брака, инвентаризация CSV (часть товаров): непосчитанные не обнулены
|
||||||
|
|
||||||
|
Длительность: 10399мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Оприходование излишка (+8) | ✓ ожид=8 факт=8 |
|
||||||
|
| api | Списание брака (−2) | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Импорт инвентаризации нашёл 2 товара | ✓ ожид=2 факт=2 |
|
||||||
|
| api | Инвентаризация (частичная) создана | ✓ ожид=200+id факт=201 |
|
||||||
|
| api | Инвентаризация проведена | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Расхождение применено (товар с недостачей → факт) | ✓ ожид=48 факт=48 |
|
||||||
|
| api | Непосчитанный товар не обнулён | ✓ ожид=53 факт=53 |
|
||||||
|
| ui | Экран «Оприходование излишка (+8)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Списание брака (−2)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Инвентаризация (часть товаров): расхождения»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Остатки после складских операций»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Оприходование излишка (+8)](full-chain-demo-final-20261008-013158/screenshots/10-oprihodovanie.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Списание брака (−2)](full-chain-demo-final-20261008-013158/screenshots/10-spisanie-braka.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Инвентаризация (часть товаров): расхождения](full-chain-demo-final-20261008-013158/screenshots/10-inventarizaciya.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Остатки после складских операций](full-chain-demo-final-20261008-013158/screenshots/10-ostatki-sklad.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Инвентаризация с телефона (сканер) (моб.)](full-chain-demo-final-20261008-013158/screenshots/10-mob-inventarizaciya.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step11_reports: Отчёты — продажи за день, прибыль, остатки на дату, «Деньги», долги; по точкам/кассирам
|
||||||
|
|
||||||
|
Длительность: 9510мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отчёт продаж за день доступен, выручка ≥ 0 | ✓ ожид=≥0 факт=7650 |
|
||||||
|
| api | Прибыль = выручка − себестоимость (по каждой строке) | ✓ ожид=revenue−cost факт=200 |
|
||||||
|
| api | Отчёт остатков на дату доступен | ✓ ожид=список факт=200 |
|
||||||
|
| api | Деньги: касса = начальный − оплата наличными | ✓ ожид=-98812 факт=-98812 |
|
||||||
|
| api | Деньги: банк = начальный − оплата с банка | ✓ ожид=181610 факт=181610 |
|
||||||
|
| api | Отчёт долгов поставщикам доступен | ✓ ожид=200 факт=200 |
|
||||||
|
| api | Выручка по точкам в сумме = общей выручке дня | ✓ ожид=7650 факт=7650 |
|
||||||
|
| api | Выручка по кассирам в сумме = общей выручке дня | ✓ ожид=7650 факт=7650 |
|
||||||
|
| ui | Экран «Отчёт: продажи за день (выручка)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: прибыль (выручка − себестоимость)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: остатки на дату»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт «Деньги»: остатки по счетам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Экран «Отчёт: долги поставщикам»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Отчёт: продажи за день (выручка)](full-chain-demo-final-20261008-013158/screenshots/11-otchet-prodazhi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт: прибыль (выручка − себестоимость)](full-chain-demo-final-20261008-013158/screenshots/11-otchet-pribyl.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт: остатки на дату](full-chain-demo-final-20261008-013158/screenshots/11-otchet-ostatki.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт «Деньги»: остатки по счетам](full-chain-demo-final-20261008-013158/screenshots/11-otchet-dengi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Отчёт: долги поставщикам](full-chain-demo-final-20261008-013158/screenshots/11-otchet-dolgi.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step12_invariants: Инварианты — остаток≡Σдвижений; счёт≡начальный+Σопераций; долг≡формуле; изоляция орг
|
||||||
|
|
||||||
|
Длительность: 6687мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=48 факт=48 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=57 факт=57 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=53 факт=53 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "BIOBLAS" шампун | ✓ ожид=43 факт=43 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "IQ уроки" книги | ✓ ожид=38 факт=38 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Ludwik" средств | ✓ ожид=45 факт=45 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Ludwik" средств | ✓ ожид=50 факт=50 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=55 факт=55 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=60 факт=60 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Pero" салфетки | ✓ ожид=65 факт=65 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Rice Day" GRANA | ✓ ожид=70 факт=70 |
|
||||||
|
| api | Инвариант остаток≡Σдвижений: "Richmond" Gold | ✓ ожид=75 факт=75 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса (e2e) 1791 | ✓ ожид=-98812 факт=-98812 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Касса-2 (e2e) 17 | ✓ ожид=3000 факт=3000 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Банк (e2e) 17914 | ✓ ожид=181610 факт=181610 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг (e2e) | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант счёт≡начальный+Σопераций: Эквайринг-2 (e2e | ✓ ожид=0 факт=0 |
|
||||||
|
| api | Инвариант долг≡формуле | ✓ ожид=349498 факт=349498 |
|
||||||
|
| api | Изоляция: режим B (демо) — проверка через temp-орг в режиме C | ✓ ожид=n/a факт=n/a |
|
||||||
|
| ui | Экран «Движения склада (остаток ≡ Σ движений)»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Движения склада (остаток ≡ Σ движений)](full-chain-demo-final-20261008-013158/screenshots/12-dvizheniya-sklada.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step13_cancel_rollback: Отмена/откат — отмена приёмки с проданным товаром→отказ; отмена платежа→долг вернулся
|
||||||
|
|
||||||
|
Длительность: 2371мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| api | Отмена приёмки с проданным товаром → отказ | ✓ ожид=4xx факт=409 |
|
||||||
|
| api | Отмена платежа №1 | ✓ ожид=204 факт=204 |
|
||||||
|
| api | Долг вернулся на сумму платежа | ✓ ожид=498310 факт=498310 |
|
||||||
|
| ui | Экран «Отмена платежа → долг вернулся»: 0 console/5xx/тостов | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Отмена платежа → долг вернулся](full-chain-demo-final-20261008-013158/screenshots/13-otkat-dolg-vernulsya.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## ✓ Step step14_finalize: Финал — скриншоты ключевых экранов, деактивация e2e-сущностей (режим B)
|
||||||
|
|
||||||
|
Длительность: 3273мс
|
||||||
|
|
||||||
|
| Тип | Проверка | Результат |
|
||||||
|
|---|---|---|
|
||||||
|
| ui | Финальный дашборд без ошибок | ✓ ожид=0 ошибок факт=0 ошибок |
|
||||||
|
| ui | Галерея index.html собрана (36 кадров) | ✓ ожид=index.html факт=36 |
|
||||||
|
| api | Режим B: e2e-сотрудники деактивированы (не удалены) | ✓ ожид=3 факт=3 |
|
||||||
|
|
||||||
|
Скриншоты процесса:
|
||||||
|
|
||||||
|
[Итоговый дашборд](full-chain-demo-final-20261008-013158/screenshots/14-itog-dashboard.png)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Passed: 16
|
||||||
|
- Failed: 0
|
||||||
|
- Warnings: 0
|
||||||
|
- Skipped: 0
|
||||||
|
|
||||||
|
## Critical bugs
|
||||||
|
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## UX recommendations
|
||||||
|
|
||||||
|
- Галерея скриншотов: /home/nns/food-market/tests/e2e/reports/full-chain-demo-final-20261008-013158/index.html
|
||||||
|
- Скриншоты ключевых экранов: tests/e2e/reports/full-chain/*.png
|
||||||
|
|
@ -0,0 +1,249 @@
|
||||||
|
<!doctype html><html lang="ru"><head><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
<title>Full-chain e2e — скриншоты процессов (Демо-магазин (B))</title>
|
||||||
|
<style>
|
||||||
|
body{font:14px/1.5 system-ui,Segoe UI,Roboto,sans-serif;margin:0;background:#0f172a;color:#e2e8f0}
|
||||||
|
header{padding:20px 24px;background:#1e293b;position:sticky;top:0;box-shadow:0 1px 0 #334155}
|
||||||
|
h1{margin:0 0 4px;font-size:20px} .sub{color:#94a3b8;font-size:13px}
|
||||||
|
section{padding:8px 24px 24px} h2{font-size:15px;color:#7dd3fc;border-bottom:1px solid #334155;padding-bottom:6px}
|
||||||
|
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:16px}
|
||||||
|
figure{margin:0;background:#1e293b;border:1px solid #334155;border-radius:10px;overflow:hidden}
|
||||||
|
img{width:100%;display:block;background:#fff;cursor:zoom-in}
|
||||||
|
figcaption{padding:8px 10px;font-size:12px;color:#cbd5e1}
|
||||||
|
small{color:#64748b}
|
||||||
|
</style></head><body>
|
||||||
|
<header><h1>Жизнь магазина — скриншоты процессов</h1>
|
||||||
|
<div class="sub">Прогон: Демо-магазин (B) · 2026-10-07T20:34:21.934Z · всего кадров: 36</div></header>
|
||||||
|
<section><h2>step01_register_and_login</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/01-vhod-dashboard.png" target="_blank">
|
||||||
|
<img src="screenshots/01-vhod-dashboard.png" loading="lazy" alt="Вход владельца → дашборд организации"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Вход владельца → дашборд организации<br><small>01-vhod-dashboard.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step02_catalog_and_supplier</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02-tovary-realnye.png" target="_blank">
|
||||||
|
<img src="screenshots/02-tovary-realnye.png" loading="lazy" alt="Каталог «Демо-магазина»: реальные товары"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Каталог «Демо-магазина»: реальные товары<br><small>02-tovary-realnye.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02-postavshchik.png" target="_blank">
|
||||||
|
<img src="screenshots/02-postavshchik.png" loading="lazy" alt="Поставщик [e2e]"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Поставщик [e2e]<br><small>02-postavshchik.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step02a_employees_and_points</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02a-kabinet-kassira.png" target="_blank">
|
||||||
|
<img src="screenshots/02a-kabinet-kassira.png" loading="lazy" alt="Кабинет кассира: без «Деньги»/«Настроек»"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Кабинет кассира: без «Деньги»/«Настроек»<br><small>02a-kabinet-kassira.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02a-kassir-pryamoy-url.png" target="_blank">
|
||||||
|
<img src="screenshots/02a-kassir-pryamoy-url.png" loading="lazy" alt="Кассир по прямому URL /money/accounts — нет данных"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Кассир по прямому URL /money/accounts — нет данных<br><small>02a-kassir-pryamoy-url.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02a-sotrudniki.png" target="_blank">
|
||||||
|
<img src="screenshots/02a-sotrudniki.png" loading="lazy" alt="Сотрудники: кассир, кладовщик, администратор (роли)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Сотрудники: кассир, кладовщик, администратор (роли)<br><small>02a-sotrudniki.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/02a-tochki-prodazh.png" target="_blank">
|
||||||
|
<img src="screenshots/02a-tochki-prodazh.png" loading="lazy" alt="Точки продаж (2 кассы)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Точки продаж (2 кассы)<br><small>02a-tochki-prodazh.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step03_money_accounts</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/03-scheta.png" target="_blank">
|
||||||
|
<img src="screenshots/03-scheta.png" loading="lazy" alt="Счета: касса, банк (номер), эквайринг — начальные остатки"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Счета: касса, банк (номер), эквайринг — начальные остатки<br><small>03-scheta.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step04_initial_supplier_debt</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/04-dolg-nachalnyy.png" target="_blank">
|
||||||
|
<img src="screenshots/04-dolg-nachalnyy.png" loading="lazy" alt="Долги поставщикам: начальный долг 100 000 ₸"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Долги поставщикам: начальный долг 100 000 ₸<br><small>04-dolg-nachalnyy.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step05_supply1_manual</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/05-priemka1-forma.png" target="_blank">
|
||||||
|
<img src="screenshots/05-priemka1-forma.png" loading="lazy" alt="Приёмка №1: форма создания (до проведения)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №1: форма создания (до проведения)<br><small>05-priemka1-forma.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/05-priemka1-spisok.png" target="_blank">
|
||||||
|
<img src="screenshots/05-priemka1-spisok.png" loading="lazy" alt="Список приёмок"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Список приёмок<br><small>05-priemka1-spisok.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/05-priemka1-provedena.png" target="_blank">
|
||||||
|
<img src="screenshots/05-priemka1-provedena.png" loading="lazy" alt="Приёмка №1: проведена, строки и себестоимость"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №1: проведена, строки и себестоимость<br><small>05-priemka1-provedena.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step06_supply2_excel</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/06-nakladnye-spisok.png" target="_blank">
|
||||||
|
<img src="screenshots/06-nakladnye-spisok.png" loading="lazy" alt="Загруженные накладные (табличная разобрана)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Загруженные накладные (табличная разобрана)<br><small>06-nakladnye-spisok.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/06-priemka2-provedena.png" target="_blank">
|
||||||
|
<img src="screenshots/06-priemka2-provedena.png" loading="lazy" alt="Приёмка №2: «Поставщик не указан», проведена"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №2: «Поставщик не указан», проведена<br><small>06-priemka2-provedena.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step07_supply3_photo</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/07-foto-nakladnaya-razobrana.png" target="_blank">
|
||||||
|
<img src="screenshots/07-foto-nakladnaya-razobrana.png" loading="lazy" alt="Фото-накладная: распознана (OCR) и сопоставлена вручную"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Фото-накладная: распознана (OCR) и сопоставлена вручную<br><small>07-foto-nakladnaya-razobrana.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/07-priemka3-provedena.png" target="_blank">
|
||||||
|
<img src="screenshots/07-priemka3-provedena.png" loading="lazy" alt="Приёмка №3 (по фото): проведена"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Приёмка №3 (по фото): проведена<br><small>07-priemka3-provedena.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/07-mob-foto-priemka.png" target="_blank">
|
||||||
|
<img src="screenshots/07-mob-foto-priemka.png" loading="lazy" alt="Фото-приёмка с телефона"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>📱 Фото-приёмка с телефона<br><small>07-mob-foto-priemka.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step08_supplier_payments</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/08-platezhi.png" target="_blank">
|
||||||
|
<img src="screenshots/08-platezhi.png" loading="lazy" alt="Платежи поставщикам: нал из кассы + с банка"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Платежи поставщикам: нал из кассы + с банка<br><small>08-platezhi.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/08-dolg-posle-oplat.png" target="_blank">
|
||||||
|
<img src="screenshots/08-dolg-posle-oplat.png" loading="lazy" alt="Долги поставщикам после оплат (= формуле)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Долги поставщикам после оплат (= формуле)<br><small>08-dolg-posle-oplat.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step09_cashier_shift</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09-smeny-spisok.png" target="_blank">
|
||||||
|
<img src="screenshots/09-smeny-spisok.png" loading="lazy" alt="Смены кассы: открытие/закрытие, размен"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Смены кассы: открытие/закрытие, размен<br><small>09-smeny-spisok.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09-smena-zakryta-z.png" target="_blank">
|
||||||
|
<img src="screenshots/09-smena-zakryta-z.png" loading="lazy" alt="Закрытая смена: должно быть / факт / разница (Z-отчёт)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Закрытая смена: должно быть / факт / разница (Z-отчёт)<br><small>09-smena-zakryta-z.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09-cheki-prodazhi.png" target="_blank">
|
||||||
|
<img src="screenshots/09-cheki-prodazhi.png" loading="lazy" alt="Чеки продаж (наличные/карта/смешанная) и возврат"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Чеки продаж (наличные/карта/смешанная) и возврат<br><small>09-cheki-prodazhi.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step09a_points_binding</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/09a-parallelnye-smeny.png" target="_blank">
|
||||||
|
<img src="screenshots/09a-parallelnye-smeny.png" loading="lazy" alt="Параллельные смены на точках 1 и 2 (деньги раздельны)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Параллельные смены на точках 1 и 2 (деньги раздельны)<br><small>09a-parallelnye-smeny.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step10_warehouse_ops</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-oprihodovanie.png" target="_blank">
|
||||||
|
<img src="screenshots/10-oprihodovanie.png" loading="lazy" alt="Оприходование излишка (+8)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Оприходование излишка (+8)<br><small>10-oprihodovanie.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-spisanie-braka.png" target="_blank">
|
||||||
|
<img src="screenshots/10-spisanie-braka.png" loading="lazy" alt="Списание брака (−2)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Списание брака (−2)<br><small>10-spisanie-braka.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-inventarizaciya.png" target="_blank">
|
||||||
|
<img src="screenshots/10-inventarizaciya.png" loading="lazy" alt="Инвентаризация (часть товаров): расхождения"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Инвентаризация (часть товаров): расхождения<br><small>10-inventarizaciya.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-ostatki-sklad.png" target="_blank">
|
||||||
|
<img src="screenshots/10-ostatki-sklad.png" loading="lazy" alt="Остатки после складских операций"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Остатки после складских операций<br><small>10-ostatki-sklad.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/10-mob-inventarizaciya.png" target="_blank">
|
||||||
|
<img src="screenshots/10-mob-inventarizaciya.png" loading="lazy" alt="Инвентаризация с телефона (сканер)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>📱 Инвентаризация с телефона (сканер)<br><small>10-mob-inventarizaciya.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step11_reports</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-prodazhi.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-prodazhi.png" loading="lazy" alt="Отчёт: продажи за день (выручка)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: продажи за день (выручка)<br><small>11-otchet-prodazhi.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-pribyl.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-pribyl.png" loading="lazy" alt="Отчёт: прибыль (выручка − себестоимость)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: прибыль (выручка − себестоимость)<br><small>11-otchet-pribyl.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-ostatki.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-ostatki.png" loading="lazy" alt="Отчёт: остатки на дату"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: остатки на дату<br><small>11-otchet-ostatki.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-dengi.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-dengi.png" loading="lazy" alt="Отчёт «Деньги»: остатки по счетам"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт «Деньги»: остатки по счетам<br><small>11-otchet-dengi.png</small></figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/11-otchet-dolgi.png" target="_blank">
|
||||||
|
<img src="screenshots/11-otchet-dolgi.png" loading="lazy" alt="Отчёт: долги поставщикам"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отчёт: долги поставщикам<br><small>11-otchet-dolgi.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step12_invariants</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/12-dvizheniya-sklada.png" target="_blank">
|
||||||
|
<img src="screenshots/12-dvizheniya-sklada.png" loading="lazy" alt="Движения склада (остаток ≡ Σ движений)"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Движения склада (остаток ≡ Σ движений)<br><small>12-dvizheniya-sklada.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step13_cancel_rollback</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/13-otkat-dolg-vernulsya.png" target="_blank">
|
||||||
|
<img src="screenshots/13-otkat-dolg-vernulsya.png" loading="lazy" alt="Отмена платежа → долг вернулся"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Отмена платежа → долг вернулся<br><small>13-otkat-dolg-vernulsya.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
<section><h2>step14_finalize</h2><div class="grid">
|
||||||
|
<figure>
|
||||||
|
<a href="screenshots/14-itog-dashboard.png" target="_blank">
|
||||||
|
<img src="screenshots/14-itog-dashboard.png" loading="lazy" alt="Итоговый дашборд магазина после полного дня"/>
|
||||||
|
</a>
|
||||||
|
<figcaption>🖥 Итоговый дашборд магазина после полного дня<br><small>14-itog-dashboard.png</small></figcaption>
|
||||||
|
</figure></div></section>
|
||||||
|
</body></html>
|
||||||
|
After Width: | Height: | Size: 305 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 629 KiB |
|
After Width: | Height: | Size: 254 KiB |