diff --git a/docs/negative-stock-alerts-progress.md b/docs/negative-stock-alerts-progress.md index 80d31dc..c74d8f6 100644 --- a/docs/negative-stock-alerts-progress.md +++ b/docs/negative-stock-alerts-progress.md @@ -39,11 +39,16 @@ ровно с минусовыми товарами (BookQty = текущий отрицательный остаток), открывается из баннера. 5. [~] Каналы: **веб** — постоянный баннер + фильтр/пометка в остатках ✓; отчёт «Отрицательные» (фильтр `negativeOnly`) ✓. **Мобильное API** — `GET /api/negative-stock` + `/count` готовы (iOS читает) ✓. - **Отложено:** центр уведомлений (realtime-событие NegativeStock), Telegram-рассылка, Web Push - (VAPID + SW), APNs-заглушка (device tokens + IPushSender). + **APNs-заглушка заложена** ✓ — таблица `device_tokens` (Phase40) + `POST/DELETE /api/me/device-tokens` + + контракт `IPushSender`, в DI `StubPushSender` (лог); реальный APNs/FCM/VAPID подменит заглушку + без правок вызова. Описано в `docs/mobile-api.md`. **Отложено:** центр уведомлений (realtime-событие + NegativeStock), Telegram-рассылка, Web Push (VAPID + SW), реальная отправка push. 6. [~] Тесты: integration **2/2** (минус разрешён → алерт → recount → авто-закрытие; фильтр negativeOnly) ✓; full-chain шаг 9/13 переписаны (oversell/отмена приёмки → проведено + предупреждение) ✓. - **Отложено:** unit на агрегацию/дебаунс (нет job), e2e в браузере на баннер. Деплой/скрины — ниже. + **Скрины на стенде** ✓ — `tests/e2e/reports/neg-banner-home-*.png` (баннер «22 товаров в минусе»), + `neg-stock-filter-*.png` (фильтр «Только минусы» + красные остатки). Стенд-smoke: `/count` 200, + `/api/negative-stock` 200, `device-tokens` DELETE 204 (Phase39+Phase40 применились). + **Отложено:** unit на агрегацию/дебаунс (нет job), e2e в браузере на баннер. 7. [x] Снята блокировка продажи в минус: розница, касса (POS-синк), опт, списание, перемещение, возврат поставщику, отмена приёмки. Деньги (минус счёта) — не трогали (другое правило). 8. [ ] **Отложено** (десктопная Avalonia-касса): предупреждение в строке + жёлтый индикатор в шапке + @@ -61,8 +66,8 @@ ## Что отложено (заложен фундамент, нужен отдельный проход) Фоновая рассылка (email/telegram, агрегация/тихие часы/получатели/настройки), эскалация-job и -«просроченные минусы», центр уведомлений (realtime-событие), Web Push (VAPID), APNs-заглушка -(device tokens + IPushSender), индикаторы в десктопной Avalonia-кассе (в т.ч. офлайн). +«просроченные минусы», центр уведомлений (realtime-событие), Web Push (VAPID), **реальная** +отправка push (APNs/FCM — заглушка уже в DI), индикаторы в десктопной Avalonia-кассе (в т.ч. офлайн). **DONE не ставим — не все пункты закрыты.** ## Что НЕ трогаем @@ -70,3 +75,8 @@ ## Журнал - 09.10 — старт: прогресс-док, сверка с МойСкладом, обследование кода. +- 09.10 — ядро выложено на стенд (9ba1edb): разрешение минуса + детекция/авто-закрытие + + API (список/счётчик/recount/фильтр) + веб-баннер/пометки + integration 2/2. +- 09.10 — задел push (3547e82): `device_tokens` (Phase40) + `IPushSender`/`StubPushSender` + + `/api/me/device-tokens`, описано в `docs/mobile-api.md`. Выложено на стенд, Phase39+Phase40 + применились (`/api/negative-stock/count` → 200). Скрины баннера + фильтра минусов сняты.