food-market/src/food-market.api/Controllers
nns 193ba49ecb fix(stock): «показать нулевые» и фильтр по группе показывают товары без прихода
Остатки строились ОТ таблицы Stocks (JOIN Products), поэтому товары без строки
Stock (ни разу не приходованные) не попадали в список вообще, а includeZero лишь
снимал фильтр Quantity!=0 у существующих строк. То же в отчёте «Остатки на дату»,
в экспорте и в фильтре по группе (iOS получал total 0).

- GetStock/ExportStock: выборка ОТ Products (не-услуги, не-архивные) с остатком
  коррелированным подзапросом (товар без Stock = 0). Склад выбран → строка склада;
  без склада → агрегат «Все склады». Нулевые видны при includeZero; negativeOnly и
  пагинация/сортировка/поиск/экспорт работают и для нулевых. Остаток/ед./штрихкод
  дотягиваются batch-запросом по id страницы (EF8 не переводит подзапросы в SELECT+ORDER BY).
- Отчёт «Остатки на дату»: includeZero добавляет товары без движений (Qty 0);
  фильтр по группе теперь с вложенностью.
- groupId/productGroupId — синонимы с вложенными группами на всех списках остатков
  и в каталоге (List + Export). Раньше catalog?productGroupId молча игнорировался.
- Штрихкод рядом с артикулом в списке/экспорте — различать одноимённые товары
  (4× «BIOBLAS шампунь» с разными артикулами из МойСклада — не удалять).
- Demo (30 894 товара): без флага 12, includeZero → 30 894, <500мс/страница.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 09:44:50 +05:00
..
Admin test(pos): инструменты замера старта — bulk-каталог + bench 2026-10-09 04:59:11 +05:00
Auth feat(s20): Mapster + SSO scaffold + maintenance automation (7 пунктов) 2026-06-07 21:54:12 +05:00
Catalog fix(stock): «показать нулевые» и фильтр по группе показывают товары без прихода 2026-10-09 09:44:50 +05:00
Common feat(s29): [RequiresAdvancedMode] + гейтинг скрытых модулей (шаг 3/8) 2026-10-04 11:38:10 +05:00
Dashboard feat(s10): year-demo seeder + 4 dashboard виджета + week-stats 2026-06-06 01:03:36 +05:00
Inventory fix(stock): «показать нулевые» и фильтр по группе показывают товары без прихода 2026-10-09 09:44:50 +05:00
Loyalty feat(s29): [RequiresAdvancedMode] + гейтинг скрытых модулей (шаг 3/8) 2026-10-04 11:38:10 +05:00
Money feat(money): акт сверки с поставщиком — печать/PDF (п.7) 2026-10-09 06:39:08 +05:00
Organizations feat(notifications): центр уведомлений + агрегация/эскалация минусов + каналы 2026-10-09 02:56:59 +05:00
Pos feat(money): автооткрытие смены на POS-синке + уведомление о сменах >24ч (п.1) 2026-10-09 07:11:29 +05:00
Promotions feat(s29): [RequiresAdvancedMode] + гейтинг скрытых модулей (шаг 3/8) 2026-10-04 11:38:10 +05:00
Purchases feat(purchases): создать возврат поставщику на основании приёмки (п.5 слайс) 2026-10-09 06:16:33 +05:00
Reports fix(stock): «показать нулевые» и фильтр по группе показывают товары без прихода 2026-10-09 09:44:50 +05:00
Sales feat(money): автооткрытие смены первой продажей + Z-отчёт по товарам + 24ч 2026-10-09 05:58:31 +05:00
Search feat(s10-3): глобальная Cmd+K палитра + GET /api/search/global 2026-06-06 01:20:05 +05:00
SuperAdmin rebrand: письма и серверные строки ALL MARKET 2026-10-08 17:34:38 +05:00
Telegram feat(s29): [RequiresAdvancedMode] + гейтинг скрытых модулей (шаг 3/8) 2026-10-04 11:38:10 +05:00
Uploads perf(s14): индексы + N+1 fix + bundle -50% + WebP variants + pool + Hangfire timing 2026-06-07 13:21:39 +05:00
AuthForgotPasswordController.cs rebrand: письма и серверные строки ALL MARKET 2026-10-08 17:34:38 +05:00
AuthorizationController.cs feat(pos): быстрый вход кассира по PIN (grant_type=pin) + lockout 2026-10-08 09:38:36 +05:00
AuthSignupController.cs fix(phone): серверная KZ-ФЛК на всех endpoint'ах принимающих phone 2026-05-08 01:05:48 +05:00
DataQualityController.cs feat(data-quality): фоновая «Проверка данных» — бэкенд (п.1,3,4) 2026-10-09 08:11:57 +05:00
DeviceTokensController.cs feat(notifications): задел push под iOS — device_tokens + IPushSender (заглушка) 2026-10-09 02:27:05 +05:00
DocumentsController.cs feat(documents): единый блок «Связанные документы» на всех документах (п.5) 2026-10-09 07:06:07 +05:00
FeedbackController.cs rebrand: письма и серверные строки ALL MARKET 2026-10-08 17:34:38 +05:00
MeAccountController.cs feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana 2026-06-07 12:30:10 +05:00
MeSessionsController.cs feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana 2026-06-07 12:30:10 +05:00
NotificationsController.cs feat(notifications): центр уведомлений + агрегация/эскалация минусов + каналы 2026-10-09 02:56:59 +05:00
QuickLoginController.cs feat(s30): /api/dev/quick-login/accounts — анонимный список для стенда (шаг 3/9) 2026-10-04 15:38:23 +05:00
TwoFactorController.cs feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana 2026-06-07 12:30:10 +05:00
WebPushController.cs feat(notifications): Web Push (VAPID) — браузерный push о минусах 2026-10-09 03:49:32 +05:00
WhatsNewController.cs feat(s17): onboarding wizard + help kb + feedback + diagnostic + whats-new 2026-06-07 17:04:26 +05:00