food-market/docs/data-quality-progress.md
2026-10-09 08:29:33 +05:00

52 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Фоновая «Проверка данных» — прогресс
Идея владельца (08.10): «система в фоне не спеша должна выявлять товары без группы и
выводить это как предупреждение, что необходимо задать им группу». Расширяем на основные
проблемы данных. Правило: минимум как у МойСклада, где можно — лучше.
Легенда: [x] готово · [~] частично · [ ] не начато.
## Сверка с МойСкладом
- У МойСклада **нет отдельного дашборда «проверка данных»**. Есть фильтры в списке
ассортимента: по папке/группе (можно отобрать «без папки»), по архивности; отчёт
«Остатки» с фильтром отрицательных. Поиск дублей штрихкодов/названий как встроенной
фичи у них **нет** (ловится только при вводе дубля штрихкода — ошибка).
- **Делаем лучше:** выделенная панель «Проверка данных» со счётчиками по каждой проблеме,
фоновый расчёт (не грузит БД в часы продаж), массовое исправление из списка, детект
дублей (штрихкод; имя+единица «возможно, дубль») с «это разные товары», отключение
проверок, ненавязчивый бейдж, то же через API для iOS.
## Проверки (поправка: PLU убран; без-штрихкода — для старых/импорта)
- `no-group` — товар в корневой группе / «Без группы» (нужно задать группу).
- `no-sale-price` — нет цены продажи (продать нельзя).
- `no-barcode` — нет штрихкода (кроме услуг; новые получают автоматически — это для старых/импорта).
- `dup-barcode` — один штрихкод у разных товаров.
- `dup-name-unit` — одинаковое название+единица у разных товаров («возможно, дубль»).
- `negative-stock` — товары в минусе: НЕ дублируем уведомления, ссылаемся на центр (задача 01b34).
- `unknown-cost` — ОТЛОЖЕНО до FIFO (себестоимость «неизвестна», а не «0»).
## План / статус
1. [x] Hangfire `DataQualityJob` (ночью 02:20 UTC, по организациям) + recompute по запросу; счётчики
в `data_quality_results` (учёт «это разные товары»); живые детальные списки по запросу.
2. [x] Админка: страница `/catalog/data-quality` (счётчики по проверкам + детальные списки + время
последней проверки) + ненавязчивый бейдж «N товаров требуют внимания» на дашборде (исчезает при 0);
iOS — те же эндпоинты `/api/data-quality/*`.
3. [x] Массовое исправление из списка: «Задать группу», «Задать цену», «Сгенерировать штрихкоды»;
дубли — «Это разные товары» (dismiss) + ссылка на карточку. (Объединение дублей — позже, по ТЗ.)
4. [x] Отключение проверок — тумблеры на странице (PUT settings, CSV в организации); счётчик/бейдж
исчезают сами при исправлении (живые списки + recompute).
5. [x] Тесты: unit 303 (InternalBarcode и пр.) + integration (счётчики/список/bulk/dismiss) + e2e-браузер
(бейдж+панель) ✅; деплой на стенд ✅; скрины `dq-panel-*`, `dq-dashboard-*`.
**Реальные числа (seed-demo, 50 товаров + 3 добавленных с проблемами):** Без группы 3, Без цены 3,
Без штрихкода 0, Дубль ШК 0, Возможный дубль (имя+ед.) 1, Товары в минусе 20 (ссылкой на центр).
Прим.: после фикса «без группы» считает только служебный корень «Все товары» (было 50 ложно → 3).
## Итог
Все 5 пунктов выполнены ([x]). Фоновая «Проверка данных» минимум как у МойСклада (фильтры без
группы/без штрихкода) + лучше: выделенная панель со счётчиками, детект дублей, массовое исправление,
«это разные товары», отключение проверок, бейдж, то же через API для iOS. `unknown-cost` — после FIFO.
**Все [x] → touch ~/.fm-watchdog/DONE.**
## Что НЕ трогаем
Прод, shared-postgres, global.json, gateway nginx, sklad. FIFO/себестоимость — отдельная тема.