# Приёмочное тестирование (UAT) — 2026-10-09 Стенд: `https://test.admin.food-market.kz`. Исполнитель: автономная сессия (Opus 4.8). Правило владельца: **не перепроверять уже проверенное**, тестировать только непокрытое; отчёт — двумя частями. ## Часть A. Уже покрыто (регрессия, НЕ перепроверяем заново) | Область | Чем покрыто | Где | |---|---|---| | Сквозная «жизнь магазина» (регистрация→справочники→сотрудники/точки→деньги→3 приёмки→оплаты→смена/продажи/возврат/Z→склад→отчёты→инварианты→откат), сверка ЧИСЕЛ | full-chain e2e (режим C temp-орг + режим B демо) | `tests/e2e/full-chain.sh`, nightly step 3b, watchdog step 11 | | Доступность всех пунктов меню, роутинг | menu-walk e2e | watchdog step 9 (4-час каденция) | | Касса (POS): продажа/оплата/отложенные/смена/деньги, кросс-платформенный рендер | POS `--uitest`/smoke + headless-скриншоты (24 кадра) | `src/food-market.pos`, [[pos_done]] | | iOS «FM Склад»: остатки по группе, штрихкоды, /api/me права, весовые этикетки | integration MobileApiTests | `tests/food-market.IntegrationTests/MobileApiTests.cs` | | Отрицательные остатки: разрешение продажи/списания в минус, алерт, recount, авто-resolve | integration NegativeStockTests | там же | | Отчёт остатков на дату, прибыль, продажи, ABC | integration StockReport/Profit/Sales/AbcReportTests | там же | | Деньги/смена: внесения/выемки, авто-открытие смены, Z-отчёт | integration MoneyModule + full-chain | там же | | Мультитенантность/авторизация/роли/2FA/SSO/лояльность/промо | integration + watchdog step 7 | [[sprint27_done]] и др. | | Простой/расширенный режим (гейтинг функций) | AdvancedMode unit+integration+e2e | [[sprint29_done]] | ## Часть B. Проверено сейчас (непокрытое ранее) ### B1. Баг владельца «показать нулевые» + фильтры (Часть 1–2) — ✅ Полная сверка — в `docs/filters-sweep-progress.md`. Кратко: | # | Проверка | Ожидание | Факт | ✓/✗ | |---|---|---|---|---| | 1 | Demo (30 894), `stock` без флага | только с остатком | total 12 | ✓ | | 2 | Demo, `stock?includeZero=true` | все не-услуги/не-архив | **30 894** | ✓ | | 3 | 4× «BIOBLAS шампунь» | различимы, не удалены, нулевой виден | разные арт.+ШК; art 19677 qty 0 виден | ✓ | | 4 | `catalog?productGroupId=` | фильтрует (был игнор) | 5047 (как groupId) | ✓ | | 5 | `stock?groupId&includeZero` (iOS) | товары группы с нулями | 5047 (было 0) | ✓ | | 6 | filters-sweep (21 смысловых проверок) | все сходятся | 21/21 ✓ | ✓ | | 7 | Производительность (30k, стр. 500) | < 500 мс | 162–399 мс | ✓ | ### B2. Ошибки ввода — дружелюбный русский (не 500 / не технический англ.) — ✅ Проба POST с кривыми телами на 6 типах (fresh temp-орг), ни одного 500 / утечки классов: | Эндпоинт | Вход | Ответ | ✓/✗ | |---|---|---|---| | `inventory/losses` | enum «ХЗ» | «Неверное значение поля «Причина»» | ✓ | | `sales/retail` | payment «нал» | «Неверное значение поля «Оплата»» | ✓ | | `catalog/products` | packaging «штук» | «Неверное значение поля «Фасовка»» | ✓ | | `inventory/enters` | пустое тело | «Поле StoreId обязательно.» | ✓ | | `catalog/counterparties` | пустое имя | «Название обязательно.» (+рус. заголовок) | ✓ | | `inventory/transfers` | в простом режиме | 403 «доступно в расширенном режиме» | ✓ | ### B3. Экраны P1–P4 на ширине телефона (390px) — ✅ Playwright-спека `stage-ui-uat-mobile.spec.ts` (в nightly-наборе): 16 экранов — dashboard, catalog/products, counterparties, inventory/{stock,movements,enters,losses, inventories}, purchases/supplies, sales/retail, money/{accounts,shifts}, reports/{sales, stock,profit}, settings/employees — **без горизонтального скролла**, без console-ошибок и 5xx. Скриншоты: `tests/e2e/reports/uat-mobile/` (галерея `index.html`). Все 16 — ✓. Плюс на «Остатках» (390px): по умолчанию виден товар со стоком с артикулом/штрихкодом, нулевой скрыт; тумблер «Показать нулевые» показывает нулевой — визуально подтверждено (`stock-includeZero-390.png`). ### B3a. UI-гейтинг прав по ролям (demo-admin/keeper/cashier) — ✅ (попутно) menu-walk (watchdog step 9) прошёл для 3 ролей и подтвердил разное меню: admin 34 пункта, keeper 17, cashier 8 — reload каждого пункта без 4xx/5xx/toast.error/console.error. 3/3 ✓. ### B3b. Реальное окно кассы на Windows 11 с новым лого — ✅ (rebrand) Снято на win11-kassa-test VM (`foodmarket.Pos.exe --demo`): заголовок «ALL MARKET · Касса», крупное лого all market, «Касса» рядом, экран продажи целиком, таскбар Windows 11. `docs/rebrand-screenshots/now-pos-win11.png` (коммит rebrand:, отдельно от фиксов). ### B4. Прочие найденные и починенные баги (детали в filters-sweep-progress.md) - Будущие времена в «Последние продажи» — нормализация даты к UTC + clamp будущего. - `causeUserId=null` в алертах минуса — автор пишется для всех типов документов. - Устаревший oversell-тест (409) приведён к политике «минус разрешён». - `food-market.UnitTests` не компилировался (FakeServer) — починен, юнит-тесты снова идут. ## Часть C. Per-control UI-UAT в браузере (доделано 2026-10-09) Методика: каждый контрол в РЕАЛЬНОМ браузере (Playwright, стенд) должен слать на API правильный параметр (поиск→search, сортировка→sort, фильтр→свой параметр, пагинация→page=2, экспорт→/export&format); семантику «параметр→правильные строки» независимо держит filters-sweep (21/21). Жизненный цикл документа — настоящими кнопками UI. Данные — свежая temp-орг, ожидаемое тест считает сам. Спеки: `stage-ui-uat-controls.spec.ts`, `stage-ui-uat-permissions.spec.ts` (в nightly step 3d). **Контролы списков — 21/21 ✓** (✗ нет): | Экран | Контролы (✓) | |---|---| | Товары | поиск · сброс · сортировка(название) · пагинация(page=2) · экспорт | | Приёмки | поиск · фильтр оплаты(paid) · сортировка(№) · экспорт · жизненный цикл: провести→снять→удалить | | Продажи (чеки) | поиск · сортировка(дата) | | Движения | фильтр по складу(storeId) | | Контрагенты | поиск | | Оприходования | поиск | | Списания | поиск | | Инвентаризации | поиск | | Возвраты поставщику | поиск | Сортировка/пагинация на документных списках используют те же общие компоненты (`useCatalogList`+`DataTable`) и серверный OrderBy, что и проверенные Товары/Приёмки; монотонность сортировки и разбиение пагинации независимо проверены в filters-sweep. **Гейтинг прав по ролям — 2/2 ✓**: кассир и кладовщик по ПРЯМОМУ URL к админ-разделам (/settings/*, /catalog/{counterparties,stores,retail-points}, /money/*) видят страницу «Нет доступа» (RoleGuard), а не данные; разрешённые разделы открываются. Меню- и API-гейтинг (403) — в full-chain. Кнопки действий на не-RoleGuard-страницах недоступны, т.к. запрос данных отдаёт 403 (страница без данных → без кнопок действий). ## Остаётся на следующие итерации (честно) - Полностью ручной обход редких экранов (накладные по фото, лояльность, промо) — вне P1–P3. - Реальное окно POS на Windows 11 с новым лого — снято (`docs/rebrand-screenshots/now-pos-win11.png`).