Compare commits

..

No commits in common. "7ede21321b11a0ac8665a5706191ad1b983771c7" and "5a2ab4589c32c466a6c7c8a107d1fb79cfaea667" have entirely different histories.

4 changed files with 13 additions and 51 deletions

View file

@ -118,29 +118,5 @@ _(pageSize=50, время полного HTTP-ответа)_
- [x] (попутно) `food-market.UnitTests` не компилировался (FakeServer не реализовывал
новый QuickCreateProductAsync) → все юнит-тесты не запускались. Стаб добавлен. Коммит 1324ffd.
## Итог (2026-10-09)
Жалоба владельца «показать нулевые» — исправлена по корню (выборка ОТ Products
LEFT JOIN остатки) и проверена на реальном Demo (30 894 товара): без флага 12,
includeZero → 30 894, <500 мс/страница. Группы (с 3-уровневой вложенностью),
синонимы groupId/productGroupId, артикул+штрихкод для различения дублей — работают.
Попутно починены: будущие времена чеков, causeUserId для всех документов, дружелюбные
русские ошибки ввода; устаревший oversell-тест приведён к политике; разблокирован
проект юнит-тестов.
**Приёмочные ворота (стенд):**
- full-chain C (--api-only): 16/16 ✓ (дважды подряд зелёный)
- filters-sweep: 21/21 ✓
- menu-walk (3 роли): 3/3 ✓
- integration (затронутые классы): 18/18 ✓; unit BusinessTime 5/5 ✓
- mobile-UAT 390px: 16 экранов ✓; окно кассы Windows 11 с новым лого ✓
Коммиты в main (тематические, Co-Authored-By: Claude Opus 4.8; global.json не трогали;
rebrand отдельными коммитами 80070cb/28e8d08). Запушено.
**Остаётся на следующие итерации:** полный per-control UI-UAT P2–P4 (взаимодействие с
каждым контролом формы, граничные значения в браузере) сверх покрытого (loads — menu-walk,
list-фильтры — filters-sweep, ошибки — API-пробы, mobile — 16 экранов); расширение
filters-sweep на остальные web-списки (продажи/приёмки/движения — периоды/статусы/сорт).
## Что НЕ трогаем
Прод, shared-postgres, global.json, gateway nginx, sklad.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

View file

@ -45,26 +45,23 @@
| `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 — ✓.
### B3. Экраны P1 на ширине телефона (390px) — ✅
Playwright-спека `stage-ui-uat-mobile.spec.ts` (в nightly-наборе): dashboard, catalog/products,
inventory/stock, sales/retail, reports — **без горизонтального скролла**, без console-ошибок и 5xx.
Скриншоты: `tests/e2e/reports/uat-mobile/` (галерея `index.html`).
| Экран | 390px без h-scroll | console/5xx | ✓/✗ |
|---|---|---|---|
| Дашборд | да | чисто | ✓ |
| Товары | да | чисто | ✓ |
| Остатки | да | чисто | ✓ |
| Продажи | да | чисто | ✓ |
| Отчёты | да | чисто | ✓ |
Плюс на «Остатках» (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` в алертах минуса — автор пишется для всех типов документов.

View file

@ -55,20 +55,9 @@ test.describe('UAT mobile 390px', () => {
const pages: [string, string, RegExp][] = [
['/dashboard', 'dashboard', /./],
['/catalog/products', 'catalog-products', /Товары|товар/i],
['/catalog/counterparties', 'counterparties', /./],
['/inventory/stock', 'stock', /Остатки/i],
['/inventory/movements', 'movements', /./],
['/inventory/enters', 'enters', /./],
['/inventory/losses', 'losses', /./],
['/inventory/inventories', 'inventories', /./],
['/purchases/supplies', 'supplies', /./],
['/sales/retail', 'sales-retail', /Продажи|чек/i],
['/money/accounts', 'money-accounts', /./],
['/money/shifts', 'money-shifts', /./],
['/reports/sales', 'reports-sales', /Отчёт|отчёт|продаж/i],
['/reports/stock', 'reports-stock', /Остат|Отчёт/i],
['/reports/profit', 'reports-profit', /./],
['/settings/employees', 'settings-employees', /./],
['/reports', 'reports', /Отчёт|отчёт/i],
]
for (const [path, shot, _re] of pages) {
await attachSession(page, sess, path)