Commit graph

233 commits

Author SHA1 Message Date
nns 1cc3c0a9dc test(e2e): filters-sweep — смысловая проверка фильтров списков
Независимо считает ожидаемый набор строк/итог (не «200 OK»): свежая temp-орг,
контролируемый сид (внук-со-стоком/ребёнок-ноль/родитель-минус/поиск/услуга в
3-уровневой группе), сверка для каждого контрола. Покрыто: stock includeZero,
negativeOnly, groupId/productGroupId (3 уровня вложенности), store-specific,
поиск по артикулу/штрихкоду, сортировка по количеству, пагинация (разбиение),
экспорт-с-фильтром; catalog groupId/productGroupId/isService. 21/21 ✓ на стенде.
Добавлено в nightly (step 3c) и quality-watchdog (step 12) на хосте.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 10:11:29 +05:00
nns d7db011331 test(sales): привести oversell-тест к политике «продажа в минус разрешена»
RetailOversellingTests ждал 409 на продажу сверх остатка — устаревшая политика.
По решению владельца 08.10 продажа в минус разрешена и создаёт предупреждение об
отрицательном остатке. Тест переписан: проведение успешно, остаток уходит в минус,
создан negative-stock alert. Плюс обновлён docs/filters-sweep-progress.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 10:01:56 +05:00
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
nns 80070cbace rebrand: переснять скриншоты кассы после фикса лого/бейджа (3a0f9e2)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
now-pos-sale.png / now-pos-login.png были сняты 17:41, до фикса 3a0f9e2 (18:07).
Переснято с текущего UI: лого ALL MARKET ~140px, «Касса» через разделитель,
бейдж «Отложенные 2» целиком внутри кнопки.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 08:51:55 +05:00
nns 4d3880395e docs(data-quality): все 5 пунктов выполнены + реальные числа seed-demo
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
2026-10-09 08:29:33 +05:00
nns 261a720b52 feat(data-quality): фоновая «Проверка данных» — бэкенд (п.1,3,4)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Hangfire DataQualityJob (ночью 02:20 UTC) считает по орг. счётчики проблем: без группы
(корень/«Без группы»), без цены продажи, без штрихкода (кроме услуг), дубль штрихкода,
возможный дубль имя+единица; товары в минусе — ссылкой на центр (не дублируем). Результаты
в data_quality_results (Phase43), живые детальные списки — по запросу.
API /api/data-quality: сводка, {check}/products, recompute, dismiss («это разные товары»),
bulk set-group/set-price/generate-barcodes, PUT settings (отключение проверок). unknown-cost
отложен до FIFO; PLU убран (поправка владельца). Integration-тест: счётчики/список/bulk/dismiss.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 08:11:57 +05:00
nns f6cd1063f1 docs(parity): все 10 пунктов выполнены — паритет с МойСкладом достигнут
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 07:43:05 +05:00
nns 87c4d16ed1 docs(parity): пасс 3 — 9/10 [x]; остаётся full-chain + 2 POS-десктоп мелочи
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
2026-10-09 07:24:48 +05:00
nns 9ca907ce47 docs(parity): пасс 2 — пп.2,7,9 закрыты; 1,5 продвинуты; 7 из 10 [x]
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
2026-10-09 06:55:51 +05:00
nns 8c163e63fc docs(parity): п.4 бэкенд готов; п.5 from-supply добавлен
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
2026-10-09 06:16:46 +05:00
nns ad2e3b3117 feat(purchases): создать возврат поставщику на основании приёмки (п.5 слайс)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
POST /api/purchases/supplier-returns/from-supply/{supplyId}: черновик возврата с
преднабором строк из проведённой приёмки (товар/кол-во/цена), поставщик/склад/валюта
и ссылка ReferenceSupplyId. Integration-тест: преднабор + связь.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 06:16:33 +05:00
nns ddf7918eb1 docs(parity): прогресс — пп.3,4,6,8 готовы; 1,2,7,9 частично; 5 основной незакрытый
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 06:11:50 +05:00
nns 0f1574df64 feat(web): привычные названия денег (ПКО/РКО) + прибыль на главной + статусы с подсказкой
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
П.7: типы денег названы привычно — «Приход наличных (ПКО)», «Расход наличных (РКО)»,
«Входящий/Исходящий платёж», «Перевод между счетами».
П.8: блок «Прибыль за сегодня/месяц» на дашборде (во всех режимах, /api/dashboard/margin),
с пометкой «приблизительно; точно после FIFO».
П.9: общий DocStatusBadge (Черновик/Проведён/Завершена) с tooltip «что это значит»,
применён на списках Приёмок/Продаж/Инвентаризаций.
П.6: проверено — Оприходование/Списание в простом режиме не прячутся (отдельные пункты).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 06:04:18 +05:00
nns 0ca0d6cc3b feat(catalog): карточка товара как МойСклад+ — обязательно только наименование
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Правки владельца 08.10 (п.4 паритета):
- Сохранить можно при наличии Наименования. Единица не обязательна в запросе →
  дефолт «шт»; группа → корень. Штрихкод ОБЯЗАТЕЛЕН у любого товара: нет в запросе/
  импорте → автогенерация внутреннего EAN-13 (верная контр. цифра, префикс не
  пересекается с весовыми/ценовыми префиксами орг. — InternalBarcode).
- Цена продажи не обязательна для сохранения; но ПРОДАТЬ без неё нельзя — касса и
  розничная продажа дают «У товара «X» нет цены продажи» (можно ввести вручную).
- Быстрое создание из кассы/приёмки: POST /api/catalog/products/quick (имя + опц.
  штрихкод/цена/весовой).
- Снят FluentValidation NotEqual(Guid.Empty) на единицу (контроллер подставляет дефолт).

Тесты: unit InternalBarcode 3/3 (валидный EAN-13, не парсится как весовой, обходит
префиксы); integration 3/3 (создание по одному имени, продажа без цены → 400, quick).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 05:45:38 +05:00
nns 92befd1f05 docs(pos): мгновенный старт — замеры до/после, МойСклад-разбор, установщик Windows
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
- docs/moysklad-pos-startup.md: прямой замер «Кассы МойСклад» (Celeron N4120, 99–113 с
  до готовности; каталог перезаписывается целиком, полный JSON+FTS) — подтверждённые
  причины, не догадки.
- docs/pos-progress.md: раздел «Мгновенный старт» — что сделано (касса из локальной базы +
  фоновый синк, дельта остатков, gzip-каталог ×7.3, синк вне UI-потока) + таблица замеров
  (Linux/стенд + Win11 VM + 1 ядро как прокси Celeron). Цель <2 с тёплый старт на слабом
  CPU достигнута (<1 с). Серверный кэш снимка осознанно не делали (риск памяти, путь
  «раз на установку»).
- deploy/pos-install.ps1: установщик Windows (исключение Defender + прогрев + ярлык);
  холодный старт 10 с → 4,5 с. deploy/pos-win-measure.ps1 — скрипт замеров на VM.
- docs/pos.md: обновлён раздел первого запуска + варианты/стоимость подписи exe (не покупали).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 05:11:34 +05:00
nns 0dc8703712 docs(stock): прогресс+mobile-api — все пункты 1–11 закрыты (п.12 отложен владельцем)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Пасс 3: касса (индикатор+предупреждение+офлайн), Web Push (VAPID), e2e колокольчика.
Итог: unit 299/299, integration 4/4, POS 4/4, e2e-браузер 2/2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 04:03:01 +05:00
nns 0d714e62bc docs(stock): прогресс — e2e-браузер добавлен, остаются Web Push и десктоп-касса
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 03:25:59 +05:00
nns c69d40a366 docs(stock): прогресс+mobile-api — центр уведомлений, агрегация/эскалация, каналы
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 03:14:17 +05:00
nns 242f48ff9f docs(stock): прогресс negative-stock — задел push выложен, скрины баннера/фильтра на стенде
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 02:33:52 +05:00
nns 3547e823c3 feat(notifications): задел push под iOS — device_tokens + IPushSender (заглушка)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Таблица токенов устройств (device_tokens, Phase40) + POST/DELETE /api/me/device-tokens
для регистрации iOS/Android/Web push-токенов. Контракт IPushSender.SendAsync; в DI
включён StubPushSender (пишет в лог) — реальный APNs/FCM/VAPID подменит заглушку, когда
появятся ключи, без правок вызывающего кода. Описано в docs/mobile-api.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 02:27:05 +05:00
nns 2d1cdd8519 docs(stock): прогресс negative-stock — что сделано/отложено
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 02:19:37 +05:00
nns 9ba1edb236 feat(stock): разрешение продажи в минус + предупреждения об отрицательных остатках
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
Решение владельца 08.10: продавать/списывать в минус РАЗРЕШЕНО, но с постоянным
предупреждением и требованием провести инвентаризацию.

- Снята блокировка «недостаточно остатка» (409 oversell): розница, касса (POS-синк),
  опт-отгрузка, списание, перемещение, возврат поставщику, отмена приёмки. Деньги
  (минус счёта) — по-прежнему запрещены (другое правило).
- NegativeStockAlert (сущность + миграция Phase39): создаётся/обновляется при уходе
  остатка < 0 (единая точка — StockService), авто-закрытие при возврате ≥ 0. Частичный
  уникальный индекс: один открытый алерт на (org, store, product). Причина: тип/номер
  документа/автор/время.
- API /api/negative-stock: список (с подсказкой «возможно, не проведена приёмка П-…»),
  /count (для баннеров), /recount (черновик инвентаризации по минусам склада). Отчёт
  «Остатки» — фильтр negativeOnly.
- Веб: постоянный баннер «N товаров в минусе — нужна инвентаризация» (сворачивается,
  крестиком не закрыть) + «Пересчитать эти товары»; в остатках — красная пометка и
  фильтр «Только минусы».
- Тесты: integration 2/2 (минус разрешён → алерт → recount → авто-закрытие; фильтр);
  full-chain шаг 9/13 переписаны (oversell/отмена приёмки → проведено + предупреждение).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 02:18:29 +05:00
nns b095329c5a docs(inventory): прогресс cancel-results — стенд 8/8, integration 4/4, full-chain шаг 10
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 01:31:11 +05:00
nns ab416d720c feat(inventory): отмена результатов не удаляет проведённые документы
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
Было: unpost при проведённых связанных Оприходовании/Списании молча снимал их с
проведения и УДАЛЯЛ (204, номера исчезали). Хуже МойСклада, теряется история.

- unpost при ПРОВЕДЁННЫХ связанных → 409 с номерами О-/С- и текстом «Сначала
  отмените результаты». Если связанные только черновики — удаляем черновики
  (не влияли на остатки) и возвращаем инвентаризацию в черновик.
- Новое POST /{id}/cancel-results (InventoryEdit + EnterEdit/LossEdit): снимает
  связанные Оприходование/Списание с проведения, НЕ удаляя (остаются черновиками,
  видны в «Связанных документах», истории, аудите); остатки возвращаются; для
  Оприходования — гард на уход остатка в минус. Аудит InventoryCancelResults.
- Веб: кнопка «Отменить результаты» (при проведённых связанных) + диалог со
  списком документов и влиянием на остатки; «Вернуть в черновик» переформулирован.
- docs/mobile-api.md: unpost больше не удаляет проведённые (409), добавлен cancel-results.
- Тесты: integration (409 + cancel-results оставляет черновики + повторное
  проведение) + full-chain шаг 10.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:51:00 +05:00
nns 447568fbda docs(site): скриншоты честных страниц сайта после выкладки
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Галерея docs/site-screenshots/ — задеплоенные страницы test.food-market.kz
с новыми честными текстами (главная, касса, импорт, возможности, перенос и
интеграции, тарифы, для продуктовых, о нас). Удалён кадр удалённой вертикали.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:19:24 +05:00
nns 184fd14df2 copy(site): честные тексты — только то, что есть в коде (ревью владельца)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Убраны обещания того, чего нет: фискализация ОФД/Kaspi Pay (skeleton) →
«в разработке»; ЕГАИС/акцизы/модификаторы/серии-сроки/размерные сетки →
удалены 5 выдуманных страниц-вертикалей (остался продуктовый); CRM/публичный
API убраны; «О нас» без выдуманной истории и команды. Касса — Windows и Linux
(не .msi), «Скачать» → «скоро». Импорт — CSV/1С-CSV/МойСклад. Лояльность — в
админке, не в кассе. Интеграции — честный блок «есть / в разработке».

Язык владельца магазина, без жаргона (дашборд, нативно, вертикали, фишки,
триал, SLA, CRM, Unlimited, кейсы) и пафоса. Заголовок кассы: «Быстрая касса,
которая работает и без интернета». Цены тарифов не менялись.

По правкам Mac-Claude после ревью docs/site-copy-draft.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:13:33 +05:00
nns 2965ced43d docs(site): реестр утверждений + черновик честных текстов сайта (на ревью)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Проверил каждое утверждение сайта по коду/стенду: фискализация ОФД/Kaspi Pay —
skeleton (нет), ЕГАИС/акцизы/модификаторы/серии-сроки/размерные сетки/гарантии —
нет, CRM — нет, лояльность — в админке не в кассе, импорт — CSV/1С-CSV/МойСклад,
касса — Windows+Linux (zip/AppImage, не .msi), «О нас» — выдуманная история.
Замеры скорости кассы: холодный старт 82 мс, инициализация 625 мс (< 1 c), поиск
по ШК 36 мс. Черновик переписанных текстов — docs/site-copy-draft.md (было→стало).
НЕ выкладывается до «ок» Mac-Claude.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:00:01 +05:00
nns 6557ac34ec test(menu-walk): лингва-проверка UI + фикс «low-stock» в настройках
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
- stage-ui-menu-walk: assertNoUiEnglish — узкий denylist хромовых строк
  (Dashboard / «Low-stock alerts» / live / offline / Live-обновл), пропуск
  документации (/help, /whats-new, /admin/diagnostic), где латиница легитимна
  (клавиши, код-идентификаторы, бренды). Прогон admin: 1 passed, 0 ошибок.
- Настройки Telegram: «…топ-3 товара, low-stock…» → «…низкий остаток…» (ru.json
  + OrganizationSettingsPage) — единственная оставшаяся видимая латиница в UI.
- Галерея сайта и прогресс обновлены.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 23:30:37 +05:00
nns d20cf15ca2 fix(ui): правки по ревью скриншотов — i18n, валюта, дубль групп, касса, фасовки
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
1. Английские строки в админке → русский: ru.json dashboard.title «Dashboard»→
   «Сводка», common.live/offline «live/offline»→«онлайн/офлайн»; дашборд-виджеты
   defaultValue «Low-stock alerts»→«Низкий остаток», «Live-обновление»→«Обновляется
   в реальном времени».
2. Каталог: системная группа «Все товары» больше не дублирует корень дерева
   (ProductGroupDto.IsSystem + ProductGroupTree прячет системные группы).
3. Валюта: розничная цена в каталоге теперь «₸», а не «KZT» (символ вместо кода).
4. Касса на сайте: вместо HTML-макета — НАСТОЯЩИЙ экран Avalonia-кассы
   (--screenshots) с витринными данными «Магазин у дома», кассир Виктория Ким, с
   логотипом; убран префикс «Магазин » в шапке (не было двойного «Магазин Магазин»).
   HTML-макет удалён из публичного пайплайна.
5. Витрина: фасовка/единица товара выводится из названия (кг→весовой, иначе
   штучный) — нет «Авокадо 1шт весовой» / «Бешбармак 1кг штучный».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 22:53:28 +05:00
nns bce417941c docs(site): галерея публичного сайта после выкладки + финал прогресса
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Скриншоты задеплоенных страниц test.food-market.kz (главная/касса/импорт/
тарифы/вертикали/о компании) для проверки на глаз. Все новые скриншоты ALL MARKET
на витринных данных отрисовываются корректно.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-08 22:22:06 +05:00
nns f7f92261ca feat(site): свежие скриншоты ALL MARKET на витринных данных
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Пересняты скриншоты публичного сайта в интерфейсе ALL MARKET на витринной
организации «Магазин у дома» (200 товаров, ~30 дней продаж, чистые данные
без e2e/test-мусора). Светлая тема, 1440×900 @2x, WebP + srcset, alt по-русски.

- screenshots.mjs: стенд + витринный владелец, 14 экранов (дашборд/каталог/
  карточка/приёмки/остатки/инвентаризация/деньги/отчёты/контрагенты), скрытие
  баннеров стенда/«что нового»/MoM-дельты, резолв AsyncSelect-подписей
- optimize-screenshots.mjs: PNG→WebP (1x 1440w / 2x 2880w) через canvas, все ≤300КБ
- pos-mockup/pos-mockup.html: светлая касса ALL MARKET «Магазин у дома» (продажа+оплата)
- index.astro: hero-дашборд + каталог + новый блок «Касса»; pos.astro: продажа+оплата
- ShowcaseSeeder: стартовый завоз всех товаров (нет отрицательных остатков)
- deploy/showcase-seed.sh: RESET=1 пересоздаёт витрину с нуля
- исходные PNG не коммитятся (.gitignore), доставка — только WebP

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-08 22:19:46 +05:00
nns 9ddbffc04a feat(seed): витринный сидер «Магазин у дома» для скриншотов сайта
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
ShowcaseSeeder — чистые данные для публичных скриншотов: 200 товаров без
Article-маркеров, реальные EAN-13, боевой формат номеров документов
(П-2026-…, ПР-2026-…), 3 поставщика, счета (касса/Kaspi/эквайринг),
сотрудники с нормальными именами, ~30 дней продаж, приёмки, 2 списания,
1 завершённая инвентаризация. Без e2e/test/Y1/DEMO в видимых данных.

- POST /api/admin/seed-demo?showcase=1 (DemoSeedController)
- повторяемый deploy/showcase-seed.sh (signup + seed, идемпотентно)
- YearDemoSeeder: data-массивы → internal для переиспользования

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-08 21:46:45 +05:00
nns db8cd637e5 docs(inventory): итог проверки + скриншоты новой модели
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Прогресс-док: итог проверки (unit 64/64, live e2e на стенде всех сценариев,
миграция stockUnchanged, full-chain 16/16, menu-walk 3/3, deploy-stage OK).
Скриншоты: карточка «Завершена» с кнопками «Создать оприходование/списание» и
блоком «Связанные документы» (Списание С-2026-000002 проведён), колонка «Результат».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 21:24:45 +05:00
nns b4bd0e41d4 feat(inventory): веб-UI по модели МойСклада + доки
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
- InventoryEditPage: «Завершить подсчёт» вместо «Провести»; на завершённой — кнопки
  «Создать оприходование излишков» / «Создать списание недостачи» (блокируются, если нет
  разницы или документ уже создан) + блок «Связанные документы» + «Вернуть в черновик».
- InventoriesPage: статус «Завершена»; колонка «Результат» (опр./спис. № или «не применено»).
- Enter/LossEditPage: «На основании инвентаризации №…» со ссылкой.
- types.ts: InventoryStatus Draft/Completed; related в InventoryDto; результат в списке;
  inventoryDocId/Number в Enter/Loss DTO.
- docs/inventory-moysklad-reference.md (сверка), inventory-model-progress.md,
  supply-inventory.md («Как провести инвентаризацию», 5 шагов), mobile-api.md (compat post/unpost).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 20:34:18 +05:00
nns 0d44cdabaf feat(inventory): модель МойСклада — инвентаризация не двигает остатки
Замечание владельца: инвентаризация стояла «Проведено» без оприходования/списания.
Переделано по МойСкладу (docs/inventory-moysklad-reference.md):

- InventoryStatus Draft→Completed (было Posted; значение 1 то же). Инвентаризация
  остатки НЕ двигает: endpoint complete замораживает строки без движений.
- create-enter (излишки diff>0) / create-loss (недостача diff<0) — создают черновики
  Оприходования/Списания со строками разницы + ссылка InventoryDocId. Повторно нельзя (409).
- Кнопки «Применить результаты» НЕТ (поправка Mac-Claude — не одобрено владельцем).
- unpost («вернуть в черновик») отменяет проведение и удаляет связанные документы.
- post/unpost — временная совместимость для мобильного «FM Склад» (post = завершить +
  создать и провести оба документа); помечено в docs/mobile-api.md.
- Enter/Loss: поле InventoryDocId (+ миграция Phase38) + в DTO «на основании инвентаризации №…».
- InventoryResult (application) — чистая разбивка diff→излишки/недостача (unit-тесты:
  разница/сумма/только посчитанные строки/округление).
- InventoryMigrationController (dry-run/apply): старые Posted+InventoryAdjustment →
  связанные проведённые документы переметкой движений (не задваивает), с проверкой
  неизменности остатков. Скрипт deploy/migrate-inventory-to-docs.sh (backup + запуск).
- Демо-сидеры: инвентаризации теперь Completed без прямых движений.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 20:34:05 +05:00
nns 466e546ae2 rebrand: кэш-бастинг логотипа (старое лого залипало в SW/кэше)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
Причина: SW веб-админки прекэшировал /logo.svg и отдавал stale, CACHE_VERSION не
менялся при ребрендинге; публичный сайт отдавал лого/favicon без Cache-Control.

- sw.js: CACHE_VERSION fm-v2 → am-v3 (+ASSET_VERSION am3); activate чистит старые
  кэши, skipWaiting+clients.claim; прекэш бренд-ассетов версионирован; бренд в
  комментариях → ALL MARKET.
- ?v=am3 на нехэшированных бренд-ассетах: index.html, manifest, Logo.tsx,
  публичный Logo.astro + BaseLayout favicon.
- nginx web: index.html + бренд-ассеты + manifest → no-cache; /assets/* → immutable.
- nginx public: html + лого/favicon → no-cache; /_astro/* → immutable.

Проверено Playwright: старый клиент (SW fm-v2 + лого Food Market) → после выкладки
+ 1 перезагрузки кэш am-v3, fm-v2 удалён, лого ALL MARKET. Заметка на будущее про
очистку API_CACHE при logout — в прогресс-доке.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:47:41 +05:00
nns e5bbd4a047 docs: аудит против МойСклада — проход 2 (факт-проверки, Казахстан)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Дополнен docs/moysklad-logic-audit.md (+ .html) разделом «Проход 2»:
- Все «проверить» закрыты фактом (код файл:строка и/или запрос на стенде):
  возврат→ReferenceSaleId; Z-отчёт без «по товарам»; долг поставщику считается
  (MoneyReportsController:120-183); обязательные поля товара Name+Unit+Group;
  приёмка с телефона/терминалы/фискализация — нет; отмена проведения ЕСТЬ у всех
  документов (исправление прохода 1); смена — только ручное открытие.
- Себестоимость: подтверждён FIFO у МойСклада; у нас средняя; реальный пример Демо
  (BIOBLAS, Product.Cost=548.6441 из 3 приёмок) — показано искажение прибыли.
- Казахстан (новое): фискализация ОФД РК (заглушка у нас; МойСклад — WebKassa/reKassa),
  НДС 16% с 2026 (дефолт KZ уже 16, SystemReferenceSeeder:38), маркировка ИС МПТ
  (только флаг IsMarked), СНТ/ЭСФ, акциз. Блок «Казахстан — обязательное по закону».
- Сводка обновлена: топ-15 скорректирован (фискализация/маркировка РК вместо неверных
  пунктов), добавлен KZ-блок. Касса МойСклад vs наша — по функциям кассира.

Только отчёт, без правок кода.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:21:57 +05:00
nns 338965a76c docs: аудит логики процессов против МойСклада (только отчёт)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Сверка всех процессов простого режима + справочников/кассы/мобильного/отчётов с
МойСкладом (API dev.moysklad.ru + support.moysklad.ru + школа торговли). Для каждого:
как в МойСкладе (ссылки) | как у нас (файл:строка) | расхождение | серьёзность |
слабые места МойСклада | предложение «как лучше» [НА РЕШЕНИЕ ВЛАДЕЛЬЦА].

Главные находки (🔴): себестоимость у нас скользящее среднее vs FIFO у МойСклада;
прибыль берёт COGS приближённо (Product.Cost), а не на момент продажи; инвентаризация
сама двигает остатки и статус «Проведено» без оприходования/списания. Также — какие
наши тесты закрепляют неправильное поведение и должны быть переписаны.

docs/moysklad-logic-audit.md — полный отчёт; .html — краткая версия для владельца.
Только отчёт, без правок кода.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:52:19 +05:00
nns 821f40634c rebrand: прогресс-док — диапазон коммитов для отката + итог проверки
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
Диапазон pre-rebrand-all-market..HEAD (11 коммитов). Итог: grep чисто,
скриншоты Было/Стало, POS uitest/smoke OK, deploy-stage OK, menu-walk 3/3,
full-chain 16/16 ЗЕЛЁНЫЙ, откат проверен в worktree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:23:11 +05:00
nns af00f04e4e rebrand: галерея — реальный стенд (вход без тоста/префилла) + rollback-кадр
- now-web-login-stage.png: вход на test.admin.food-market.kz после деплоя —
  баннер стенда, быстрый вход, логотип ALL MARKET, без тостов ошибок.
- rollback-logo-foodmarket.png: подтверждение отката (лого Food Market).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:21:29 +05:00
nns f9b4d3bd68 rebrand: прогресс-док — безопасность, проверка отката, границы
Отчёт по ревью безопасности (сидер/префилл/ротация пароля стенда), результат
проверки отката в worktree, уточнённые границы (артефакты кассы, маркетинг-скриншоты).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:08:48 +05:00
nns 3a0f9e24d5 rebrand: касса — крупнее логотип + бейдж «Отложенные» внутри кнопки (ревью Mac-Claude)
- Верхняя полоса: логотип ALL MARKET высотой 48 (ширина ≈140px ≥ минимума
  брендбука), «Касса» отделена тонким разделителем (не оторвана).
- Бейдж количества у «Отложенные» теперь целиком внутри кнопки (меньше паддинг
  кнопки, плотнее контент) — не обрезается правым краем.
- Перегенерированы скриншоты кассы; обновлён кадр веб-входа в галерее (без тоста,
  без префилла пароля).
- Зелёный UI не менялся (--color-brand #00B207, идентичен дорибрендинговому).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:07:51 +05:00
nns 89c5c6df37 rebrand: галерея Было/Стало (лого, favicon, письмо, OG, касса, вход, сайт)
docs/rebrand-screenshots/ + index.html: пары Было|Стало по логотипу, favicon,
письму-приглашению, OG-картинке, кассе (вход/продажа); «Стало» для веб-входа и
публичной главной. «Было» извлечено из тега pre-rebrand-all-market.
Отмечено, что встроенные продуктовые скриншоты маркетинг-сайта обновятся при
прод-выкатке (screenshots.mjs против живой админки).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:44:24 +05:00
nns 828080c321 rebrand: пользовательские доки + скриншоты кассы с новым лого
- docs/imports.md, docs/simple-mode.md: «Food Market» → «ALL MARKET».
- Перегенерированы скриншоты кассы (вход/продажа/оплата/смена/возврат) с
  логотипом ALL MARKET в шапке и на экране входа.
- Внутренние TZ/verify-доки оставлены как историческая фиксация.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:35:15 +05:00
nns d0d6ebcea1 rebrand: касса ALL MARKET (лого, иконка, заголовок, чек)
- Верхняя полоса и экран входа: логотип-изображение ALL MARKET из ресурсов
  (avares Assets/), color на светлой теме и white на тёмной (Brand.ApplyLogo).
- Заголовок окна «ALL MARKET · Касса»; иконка окна и ApplicationIcon = allmarket.ico
  (собрана из фирменных PNG 32/180/192).
- Чек: в шапке — название точки/магазина (резолвится из RetailPoint, PosSession.StoreName),
  внизу мелко «ALL MARKET — система учёта торговли» (был хардкод «Food Market» в шапке).
- AppImage .desktop: Name «ALL MARKET Касса» + фирменная иконка.
- Эталон-макет pos-mockup.html — логотип «all market».
- AssemblyName/exe (foodmarket.Pos) и имена артефактов не менялись (инфраструктура).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:35:05 +05:00
nns ec7d2dc601 rebrand: подготовка к откату (тег, rollback-док и скрипт, прогресс)
- Тег pre-rebrand-all-market на дорибрендинговом main (c8c0be5), запушен.
- docs/rebrand-all-market-progress.md — план и границы (что НЕ трогаем).
- docs/rebrand-rollback.md — точные команды отката кода (revert-диапазон) и стенда.
- deploy/rebrand-rollback.sh — dry-run по умолчанию, --apply для реального отката.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:13:21 +05:00
nns c8c0be56b4 docs(pos-ui): скриншоты после полировки + адаптив (density) + Windows 11
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
- Реальное окно Windows 11 заново: продажа (1280×800, компактный уровень —
  «Очистить чек» виден, ничего не перекрывается) и оплата.
- docs/pos-screenshots/density/: экран продажи в 1280×720/800, 1366×768, 1920×1080
  (подтверждает адаптив панели по высоте и шапки по ширине) + раздел в галерее.
- Перегенерированы «Стало»-кадры и compare-*.png — вёрстка 1:1 с макетом сохранена.
- docs/pos-ui-progress.md: раздел «Полировка» 7/7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 16:52:03 +05:00
nns 61985c1062 docs(pos-ui): сверка с эталон-макетом + финальные скриншоты + Windows 11
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
- docs/pos-design/: эталон-макет (pos-mockup.html + mockup-*.png) и сверка
  «макет | касса» рядом — compare-sale.png, compare-payment.png (данные те же:
  4 позиции, 3 362 ₸, получено 5 000 → сдача 1 638 ₸). Расхождений
  выравнивания/размеров > 4px нет.
- Перегенерированы скриншоты «Стало» (1920×1080 + 1366×768) и галерея.
- Реальное окно Windows 11 (software-рендер на VM): экран продажи и оплаты
  (docs/pos-screenshots/windows/windows11-{sale,payment}.png).
- Обновлены docs/pos-design.md (раздел сверки) и docs/pos-ui-progress.md (итог).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-08 14:35:31 +05:00
nns 85e486abc7 docs(pos-ui): реальное окно Windows 11 — новая светлая тема
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:53:57 +05:00
nns 29ef76990e fix(pos-ui): выравнивание по замечаниям (кнопки, клавиатура, модалка, правая панель)
- Текст во ВСЕХ кнопках по центру: HorizontalAlignment=Stretch + Horizontal/
  VerticalContentAlignment=Center в стилях Button.pos/key/seg (раньше key/seg не
  наследовали центровку → цифры/«−/+»/«Сброс»/«⌫» липли влево-вверх).
- Клавиатура оплаты — ровная сетка 3×4 одинаковых крупных клавиш (72px), цифры по центру.
- Быстрые суммы и сегменты «Нал/Карта/Смешанная» — UniformGrid одинаковой ширины;
  сегменты слитным переключателем; «Без сдачи» не обрезается.
- Модалка оплаты по высоте содержимого, по центру, на затемнённой подложке (#0F1F17 ~40%).
- Правая панель: ровная 2-кол. сетка вторичных кнопок; добавлены «Возврат · F9» и
  «Внесение/Выплата · F10»; «Очистить · Esc» — красный контур во всю ширину; без пустот
  (блок компактный, Оплатить сразу под ИТОГО).
- Строка корзины: степпер 44×44 с количеством по центру, отступ до иконки удаления.
- Экран продажи снимается С ОБОЛОЧКОЙ (верхняя полоса + капсулы горячих клавиш);
  «Избранное» — шеврон ▾/▸. --uitest OK, 44 unit зелёные.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:46:17 +05:00