Commit graph

672 commits

Author SHA1 Message Date
nns 5f2188a7f9 fix(signup): устранён React #418 (hydration) + дефолтная конфигурация «Бизнес»
- ?plan= и параметры конфигуратора читаются в useEffect ПОСЛЕ гидрации, поэтому
  первый клиентский рендер совпадает с SSR-разметкой — ошибка React #418
  (hydration mismatch) на /signup?plan=business&shops=… больше не возникает.
- plan=business без параметров → выбирается «Бизнес» с дефолтной конфигурацией
  1/1/1/5 = 10 000 ₸; plan=network → «Сеть»; неизвестный план → «Старт».
- Клик по плитке тарифа обновляет URL (history.replaceState), ссылку можно
  сохранить/поделиться.
- Плитка «Старт» теперь «5 000 ₸/мес»; цены плиток без переноса (whitespace-nowrap).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-11 01:21:58 +05:00
nns 330032b13a fix(site): честность текстов + убраны чужие системы учёта; статус/changelog без фикции
Чужие СИСТЕМЫ УЧЁТА (МойСклад, 1С) убраны со всего публичного сайта: тексты,
KB, блог, FAQ, og-картинки, meta. Платёжные системы и маркетплейсы (Kaspi,
Wildberries, Ozon и т.п.) оставлены только как честная пометка «в разработке»
на /integrations и главной.

- /integrations, /import, главная, about, features, pricing, blog, kb/faq:
  «перенос из МойСклад/1С» → «импорт каталога из файлов Excel/CSV»; импорт из
  других систем учёта — «в разработке, в личном кабинете магазина».
- kb/pos-setup: касса для Windows и Linux, вход по адресу сервера + логин + PIN,
  установка «скоро»; чековые принтеры 58/80 мм (ESC/POS).
- kb/billing: переписан под реальность — биллинг-UI/подписки в продукте нет
  (заглушка до Phase 4); оплата вручную через поддержку, онлайн-оплата «в
  разработке»; убраны несуществующие «Настройки→Подписка→История», e-mail-
  напоминания, баннер, формула кредита, SLA. Цены «тг» → «₸».
- kb/faq: бэкапы «каждые 24 ч» → «регулярно»; «TLS 1.3» → «TLS»; формулировка
  про ЗРК смягчена; «триал» → «бесплатный период».
- /status: убраны фиктивные зелёные индикаторы (мониторинга нет) — честная
  пометка «в разработке» + контакты для инцидентов.
- /changelog: убран внутренний жаргон (Phase N, SuperAdmin, retention, tenant,
  inline) — человеческие формулировки.
- og.mjs: сабтайтлы без чужих брендов; касса Windows и Linux; «триал»→«бесплатно».
- sitemap.xml: канонические URL со слэшем + статьи KB и блога.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-11 01:21:47 +05:00
nns 304b72dc04 docs(site): обновлён отчёт проверки (10/10, повторный прогон на живом test.food-market.kz)
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-11 00:21:09 +05:00
nns ad747bf58c docs(site): отчёт и скриншоты проверки исправлений test.food-market.kz (10/10)
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/site-fixes-2026-10-10/{index.html,REPORT.md,screenshots}; tools/site-fixes-verify.mjs
(Playwright-проверка: signup plan/конфигурация/цена, мобильное меню, без промисов/REPLACE_ME).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 00:03:01 +05:00
nns 7fbf94a202 fix(site): /status «Касса (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
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:55:02 +05:00
nns b8e42e216c fix(site): критичные + честность текстов на test.food-market.kz (этап 1)
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
1. /signup читает ?plan= и конфигурацию (общий модуль lib/pricing.ts): предвыбор тарифа,
   для «Бизнес» — конфигурация и цена (15 500 ₸ для 3/4/1); неизвестный план → «Старт».
2. Мобильная шапка: гамбургер + панель со всеми пунктами (aria-expanded, Esc/клик-вне, ≥44px).
3. og-картинки без ОФД/REST API/ABC — перегенерированы.
4. KB/блог: убраны несуществующие обещания (Kaspi Pay/Halyk/Visa, REST API, «Скачать установщик»,
   Kaspi Magazin Q3, маркировка, платные консультации, скидки 3/6/12, «Триал» как тариф).
   Противоречия сведены к оферте (удаление данных 30 дн, возврат по заявлению, Старт=2 сотр.).
5. /import: чужой HR-скриншот заменён на скриншот каталога продукта.
6. KB рендерился как сырой front-matter в code-блоке — развёрнут, дубль # убран.
7. Аналитика без реальных ID не подключается (нет data-id=REPLACE_ME).
8. robots.txt → рабочий /sitemap.xml.
9. Футер: дубль «Дорожная карта»/«Changelog» убран; 10. зоны нажатия футера + width/height у lazy-картинок.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:53:58 +05:00
nns 5cb2c5934c test(uat): покрытие P1-P2 98% / P3 81% — цели go/no-go достигнуты
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
- browser-прогон доведён правками СМЫСЛА: filter:period (react-datepicker), точный sort
  по заголовку, смены (сид+драйвер открытия→POST), sort:vat (showVat), фильтр товаров (панель)
- build-coverage: цели go/no-go (P1-P2 95, P3 80, P4 70)
- матрица/цифры → docs/uat-coverage.html

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:53:59 +05:00
nns a2183e9532 perf(stock-report): покрывающий индекс движений (Phase45) — отчёт остатков 2.4с→1.1с на реальном объёме
Some checks failed
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) Has been cancelled
Docker API / Deploy API on stage (push) Has been cancelled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:29:27 +05:00
nns 6a7806ff08 perf(movements): считать total по базовой таблице без join (287k движений: count 1.1с→65мс)
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
На реальном объёме перенесённого магазина список движений отдавал >2.5с из-за COUNT по
3-table join. Count теперь по stock_movements с фильтрами (join не меняет число строк).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:27:37 +05:00
nns b04d3f0d0c feat(pos): окно выбора товара при скане ШК с несколькими карточками (дубли ШК)
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
- PosStore.FindAllByBarcode; SaleViewModel.ScanCandidates/IsScanPickerOpen + PickScanCandidate
- SaleView: модалка выбора; сервер by-barcode уже отдаёт items, веб-приёмка уже показывает выбор

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:04:20 +05:00
nns 30b39a7bcb docs(migration): сверка после фикса ревью — остатки 0, документы точны, долги по контрагенту
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 20:58:26 +05:00
nns 1ee3c9b598 fix(migration): import — ChangeTracker.Clear при сбое товара (устранить каскад потери прогона)
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-09 20:48:18 +05:00
nns 99c2fc1e5a feat(migration-review): долги топ-20, UI «начальный остаток при переносе», дельта-таймер, прогресс
Some checks failed
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) Has been cancelled
Docker Web / Deploy Web on stage (push) Has been cancelled
- docs/migration-debts-top20.md: топ-20 долгов (контрагент-уровень) + находка (paymentout agent=орг)
- MoneyAccountsPage: строка «Начальный остаток при переносе из МойСклад на <дата>» для МС-счетов
- systemd food-market-migration-delta.timer (каждые 10 мин) — непрерывная дельта до перехода
- прогресс: раздел «Исправления по ревью» (все 4 пункта)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:43:44 +05:00
nns 150947c5fb fix(migration): импорт переносит дубль-ШК и дубль-артикул карточки (дизамбиг артикула, пары товар-ШК)
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
- create: артикул-коллизия → суффикс msId (перенести карточку, не падать на unique)
- create/update: ШК не уникален → добавляем код каждой карточке (пары товар|код против
  повторов), дубли ловит «Проверка данных»

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:21:03 +05:00
nns b1bdf5c228 fix(migration): не схлопывать разные карточки МойСклада по артикулу + актуализировать объяснение сверки
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-09 20:11:06 +05:00
nns 9d5c23d32c fix(migration): штрихкод не уникален (не сливать карточки), долг по контрагенту, выравнивание остатков
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
- Phase44: снята UNIQUE с (OrganizationId,Code) product_barcodes — «минимум как МойСклад»;
  импорт больше НЕ сливает/не пропускает карточки с дублем ШК (MergeByBarcode default=false,
  dupeInInput не пропускает). Дубли ловит «Проверка данных» (dup-barcode, уже есть).
- SupplierDebts: долг на уровне КОНТРАГЕНТА = Σприёмок − Σвозвратов − ΣисходящихРКО + Σвходящих
  + корректировки (учёт paymentout/cashout/paymentin/cashin по CounterpartyId).
- AlignStockToMoySkladAsync (type=align-stock): корректирующие Initial-движения на разницу
  (МС report/stock/all − наш остаток) → остаток точно = МойСклад, инвариант stock=Σдвижений.
- GetStockAllAsync в клиенте; MsStockRow DTO.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:00:34 +05:00
nns b49abfdbd7 feat(prod): запуск admin.food-market.kz — бэкапы (hourly/daily/офсайт), restore-verify, мониторинг, deploy-prod
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
- prod-backup.sh (tier hourly 48ч / daily 30д + uploads), prod-backup-offsite-pull.sh (DR на dev-vm)
- prod-restore-verify.sh: restore во временную БД + сверка числа строк, дроп
- prod-monitor.sh: api/web/public/БД/диск/5xx → Telegram владельцу (+ --test)
- deploy-prod.sh: guard'ы (prod-postgres, .env chmod600, не dev-пароль, quick-login off,
  SEED_DEMO_DATA=false, issuer), бэкап ДО миграций, только --yes, НЕ в ночных
- systemd таймеры (backup-hourly/daily, monitor, offsite-pull); docs/prod-runbook.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:31:55 +05:00
nns a7b8bbc593 feat(prod): compose прокидывает SEED_SUPERADMIN_PASSWORD/SEED_DEMO_DATA + прогресс запуска прода
Some checks failed
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
Docker Public / Build + push Public (test + latest) (push) Has been cancelled
Docker Public / Deploy :test → test.food-market.kz (push) Has been cancelled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:21:38 +05:00
nns 77464d6c83 feat(prod): флаг SEED_DEMO_DATA — отключить демо-орг «Demo Market» и demo-admin на проде
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
DevDataSeeder по умолчанию (dev/stage) сидирует демо-орг; на проде SEED_DEMO_DATA=false
отключает демо-орг/demo-admin/привязку, сохраняя SuperAdmin+роли+глобальные ед.изм.+SystemSettings.
Нужно для чистого (пустого) старта реального магазина.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:19:10 +05:00
nns 7229a50a74 docs(migration): перенос завершён на стенде — сверка 0/объяснено, дельта работает
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 18:59:25 +05:00
nns 18578e2f0c fix(migration): сверка остатков — скоуп по орг (Демо тоже засеян из МС) + классификация 42 расхождений
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
- reconcile: ORG-фильтр во всех SQL (остатки/выручка/балансы/долги) — без него Демо-магазин
  (те же msId из МС) суммировался и давал ложные расхождения остатков
- орг «FOOD MARKET» чистая: 30944 товара = 30944 msId, stocks == Σдвижений
- остатки: 42 расхождения классифицированы — 35 дубль-ШК в МС (слияние, нет аналога, объяснено
  + решение), 7 живой аккаунт (±1-4, дельта). Все объяснены построчно
- delta подтверждён: подтянул 4 живые продажи

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:58:19 +05:00
nns 574de0dafb feat(pos): CLI-диагностика оборудования кассы --probe-hw и тест-печать --test-print
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
- ProbeRunner: COM-порты (имя/VID/PID/описание через WMI), open→close (занят/свободен без
  удержания), опрос весов Масса-К+CAS 9600 (таймаут 1.5с), принтеры Windows (имя/порт/драйвер,
  БЕЗ печати), HID-клавиатуры (возможные сканеры). --port COMx — один порт; занятый не трогаем.
- --test-print "<принтер>": отдельный флаг, ESC/POS тест-чек «ТЕСТ ALL MARKET» через spooler
  (winspool RAW). Без флага ничего не печатается.
- WinExe → AttachConsole(parent) для видимого вывода; --out пишет чистый UTF-8 JSON.
- System.Management (WMI, только Windows, под guard'ами). Проверено на Win11 VM: выход <10с,
  COM1/принтер/HID определяются, test-print на несуществующий принтер — мягкая ошибка (код 4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:45:57 +05:00
nns 8be44055a2 docs(migration): сверка после полного прогона — выручка/балансы точны, остатки: найден фантом-сид
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
- reconcile: выручка по документам (точно до копейки), plotseries как справка; чеки сходятся
- delta_sync: camelCase ключи job (created/skipped), повторный опрос, audit tolerant — дельта
  подтверждена (новый чек из МС подтянут: created 1)
- НАЙДЕНО: 30000 строк stocks без движений (прежний прямой сид) → пересобрать из движений

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:30:02 +05:00
nns 81398fadad fix(migration): экранировать filter=updated>= целиком; дельта-драйвер — точный повторный опрос job + audit tolerant
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
- StreamDocumentsAsync: Uri.EscapeDataString всего выражения updated>=<дата> (>= → %3E%3D),
  не только даты — иначе часть форм 400/неоднозначна
- delta_sync: повторное чтение job после Succeeded (устранить гонку счётчиков), audit в try
- reconcile: розница демо/возвраты раздельно, URL-энкод фильтра чеков по месяцам

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:12:59 +05:00
nns 110ecf551d feat(migration): дельта-драйвер + рунбук дня перехода + сверка балансов/долгов
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
- scripts/migration/delta_sync.py: раз в N мин updated>=lastSync по всем типам,
  удаления через /audit, состояние в ~/.fm-watchdog, перекрытие окна 2 мин
- docs/migration-runbook.md: фазы A/B/C, откат на МойСклад, надёжность, ограничения токена
- reconcile.py: секции балансов счетов (report/money/byaccount) и долгов (403-ограничение)
- progress: Parts 5/6/7 закрыты

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 16:36:14 +05:00
nns 39d0243ba3 feat(migration): денежные документы (платежи/ордера/внесения/выплаты) + плуг балансов счетов
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
- ImportMoneyDocsAsync: paymentout/paymentin/cashin/cashout/retaildrawercashin/out
  → MoneyTransaction (история), agent→контрагент по externalId, суммы ÷100, МСК→UTC
- EnsureMoneyAccountsAsync: касса + расчётный счёт орг (идемпотентно)
- SetMoneyOpeningBalancesAsync: OpeningBalance = report/money/byaccount − Σпроводок,
  текущий баланс счёта точно совпадает с МойСкладом
- GetMoneyByAccountAsync в MoySkladClient; MsMoneyByAccountRow, paymentPurpose в DTO
- контроллер: type=money (все деньги+плуг), type=balances, одиночные денежные типы

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 16:32:22 +05:00
nns ec2a9db8e3 feat(migration): сверка остатков (report/stock/all vs stocks) + выручка/чеки по месяцам
- остатки по товару через Product.MoySkladExternalId, read-only SQL stage
- выручка из report/sales/plotseries (÷100, МСК-месяцы), чеки из meta.size по filter moment
- наши — retail_sales без возвратов, Date+3ч → МСК-месяц

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 16:22:06 +05:00
nns 5d11dd7434 feat(migration): возвраты розницы + инвентаризация + дельта-синхронизация (updated>=)
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
- ImportRetailReturnsAsync (retailsalesreturn): связь с чеком по externalId demand, +остаток
- ImportInventoriesAsync (inventory): Completed без движений, BookQty/ActualQty из calculated/quantity
- Все 7 импортёров принимают updatedFromMsk → filter=updated>= (МСК) для дельты
- Контроллер: ?updatedFrom=<МСК> прокинут во все типы

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 16:18:32 +05:00
nns 2d57ceab54 feat(migration): сверка по числу документов + loss/purchasereturn/enter перенесены
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
loss 3068/3068, purchasereturn 550/550, enter 72/72 — сходятся точно. Приёмки 7130
(Δ -1 к живому МС). Розничные продажи — перенос продолжается (резюм по offset).
scripts/migration/reconcile.py сравнивает МойСклад vs ALL MARKET (read-only) →
docs/migration-reconciliation.md. Счётчики МС растут (живой аккаунт) → нужна дельта.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:01:29 +05:00
nns 9506f9edc8 perf(migration): резюм документов по offset (не перечитывать уже перенесённое)
startOffset у всех документных импортов + эндпоинт ?offset=N: при продолжении
пропускаем уже перенесённые через offset API (а не перечитывая сотни страниц).
Идемпотентный skip по msId держит границу.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:52:28 +05:00
nns 417030827f docs(migration): enter 72/72 + retaildemand мигратор проверен (оплата верна), прогон 97k идёт
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-09 15:41:06 +05:00
nns 0c9d20a469 feat(migration): мигратор оприходований/списаний/возвратов поставщику/розничных продаж
По проверенному шаблону приёмок (идемпотентно по msId, резюмируемо, МСК→UTC, тиыны,
дизамбигуация номеров, SaveChanges по документу, движения остатков):
- enter (+остаток), loss (−остаток, WriteOff), purchasereturn (−остаток, SupplierReturn),
  retaildemand (−остаток, RetailSale; оплата нал/безнал из cashSum/noCashSum, кассир=owner).
- Общие помощники LoadMaps/Aggregate. Эндпоинт POST /import-supplies?type=enter|loss|
  purchasereturn|retaildemand (фон, job с нужным kind).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:34:36 +05:00
nns a517c32fee docs(migration): приёмки перенесены и проверены (7130) — документный мигратор работает
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-09 15:24:36 +05:00
nns 025d468492 fix(migration): дизамбигуация повторяющихся номеров приёмок (МойСклад дублирует по годам)
Номера МойСклада повторяются по годам, а у нас (OrganizationId, Number) уникален →
дубли роняли импорт. Сохраняем оригинальный номер где можно, при коллизии —
«<номер>-<год>[-N]». Оригинал всегда в MoySkladExternalId.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:08:15 +05:00
nns 955c3f5e77 fix(migration): очищать ChangeTracker при ошибке документа (стоп каскада сбоев)
Сбой SaveChanges одного документа оставлял сущности tracked → все последующие
падали (каскад), импорт застревал. Теперь в catch — ChangeTracker.Clear().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:53:05 +05:00
nns d3b1a7d3df docs(migration): документный мигратор работает — приёмки переносятся с остатками
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-09 14:50:22 +05:00
nns 6fdc9e527a fix(migration): приёмки — сохранение по одному документу + агрегация позиций по товару
Батч из 50 приёмок с общим товаром давал дубль строки stocks (ApplyMovementAsync
создавал новую строку, не видя ещё не сохранённую). Теперь: SaveChanges после КАЖДОГО
документа (следующий видит закоммиченные остатки) + агрегация позиций по товару в
документе (средневзвешенная цена) + ChangeTracker.Clear (не копим граф на 7k докумов).
Идемпотентно по msId — повторный запуск продолжает с места.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:31:27 +05:00
nns 10cd9f989b fix(migration): суммы документов МойСклада как decimal (приходят «900000.0») + GET статуса job
МойСклад отдаёт sum/cashSum/price как число с точкой (900000.0) → long не парсился
(«JSON value could not be converted to System.Int64»). Поля DTO → decimal. Плюс
GET /api/admin/moysklad/jobs/{id} для наблюдения за прогрессом/ошибками переноса.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:19:52 +05:00
nns f2a1493ea0 fix(migration): лёгкий expand для документов (positions, не positions.assortment) + таймаут 130с
Тяжёлый expand=positions.assortment раскрывал весь товар в каждой позиции → страница
гигантская и зависала. assortment.meta.href в позиции есть и без раскрытия. Таймаут
HttpClient МойСклада поднят до 130с (страница иногда > 100с).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:07:54 +05:00
nns 2ed9f04cb2 feat(migration): документный мигратор МойСклад (приёмки) + externalId на документах
Part 2 (документы) — проверенный шаблон на приёмках:
- Phase41: MoySkladExternalId у counterparties/stores/units/retail_points/employees и
  документов (supplies/enters/losses/inventories/supplier_returns/retail_sales/
  cash_shifts/money_transactions) + индексы. Свойства на доменных сущностях.
- MoySkladClient.StreamDocumentsAsync: документы в хронологии (order=moment,asc), expand
  позиций/связей (limit=100), обработка 429/сбоев.
- MoySkladDocumentImportService.ImportSuppliesAsync: идемпотентно по msId, резюмируемо
  (skip перенесённых), moment МСК→UTC, суммы из тиынов, поставщик по externalId контрагента,
  товары по externalId, проведение → движения остатков (StockService). Журнал ошибок.
- Импорт контрагентов теперь пишет MoySkladExternalId (нужно для ссылок в документах).
- Эндпоинт POST /api/admin/moysklad/import-supplies (фон, job). Остальные типы — по шаблону.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:53:52 +05:00
nns 4667d8e1a7 docs(migration): статус — Part 1 (инвентаризация) + Part 3 (орг) done; Part 2 справочники на реальных данных
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Пайплайн справочников проверен на реальном аккаунте: орг «FOOD MARKET» на стенде,
контрагенты 628 (МС 627) и группы 53 перенесены, товары (31k) импортируются в фоне.
Документы (110k), сверка и дельта — спроектированы (migration-design.md), основной
объём впереди (многочасовой прогон). global.json не трогал; в МойСклад только чтение.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:31:37 +05:00
nns a2ee85bc12 docs(migration): инвентаризация источника МойСклад + дизайн мигратора (Part 1)
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
Решение владельца 09.10: полный перенос магазина из МойСклада в ALL MARKET с историей.
- scripts/migration/ms_inventory.py — read-only инвентаризация источника.
- docs/migration-source-inventory.md: орг «FOOD MARKET», ~31k товаров, 627 контрагентов,
  ~110k документов (97 707 чеков, 7 125 приёмок, 3 068 списаний…), 7 558 строк остатков,
  1 склад/точка/орг, касса наличных, 1 тип цены; gap-анализ модели + цели сверки.
- docs/migration-design.md: идемпотентность по msId, хронология документов, МСК→UTC,
  тиыны, резюмируемость, порядок этапов, сверка, дельта, runbook.
- docs/migration-progress.md: план Part 1–7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:26:35 +05:00
nns 2b751dc129 test(uat): измеримое покрытие — прогон + HTML с цифрами (P1–P3 80%, P4 37%)
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
Доработаны хендлеры браузерного прогона (пагинация со сбросом поиска, обобщённое
создание/сохранение/удаление, период-фильтры, доп. сид: чек/приёмка/оприходование/
списание/инвентаризация/возврат). Экстрактор ловит строковый фолбэк заголовка колонки.
docs/uat-coverage.html — цифры по экрану/приоритету/общим. Цели (P1–P3 ≥95%, P4 ≥70%)
пока НЕ достигнуты (переход на ALL MARKET в приоритете) — остаток задокументирован в
docs/uat-coverage-progress.md, продолжим после перехода.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:09:46 +05:00
nns 848e747379 fix: внутренний ШК 2x (не 02/ведущий-0) + разовый прогон «Проверки данных» при старте
Найдено Mac-Claude на стенде:
1. Генератор внутреннего EAN-13 давал «02…» (ведущий 0 → зона UPC-A, может совпасть
   с реальным товаром). InternalBarcode.PickPrefix теперь берёт 2x из restricted-
   circulation 20–29 (без ведущего нуля), не пересекаясь с весовыми префиксами орг;
   «02» — только крайний резерв. Юнит-тест обновлён.
2. «Проверка данных» на Демо показывала все 0 и lastCheckedAt=null — ночной cron ещё
   не отрабатывал после пересева. Добавлен разовый BackgroundJob.Enqueue(DataQualityJob)
   при старте: после деплоя/пересева счётчики считаются сразу по всем организациям.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:45:17 +05:00
nns 3f416e71ad test(uat): измеримое покрытие — экстрактор элементов из кода + браузерный прогон
- tools/extract-controls.ts: статически из web/src/pages достаёт все интерактивные
  элементы каждого экрана (поиск/фильтры/сортировки/пагинация/экспорт/тумблеры/
  действия) → docs/uat-coverage.expected.json (36 экранов, 195 элементов; приоритеты).
- scenarios/stage-ui-uat-coverage.spec.ts: читает expected, в браузере задействует
  каждый элемент (фиксирует запрос с параметром/действие), пишет reports/uat-covered.json.
- tools/build-coverage.ts: сводит → docs/uat-coverage.{json,html} с % по экрану/
  приоритету/общим (цель P1–P3 ≥95%, P4 ≥70%).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:27:31 +05:00
nns a539c31cbc docs(uat): часть C отчёта (per-control в браузере) + прогресс done + nightly step 3d
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
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:11:33 +05:00
nns eafc8c15fc test(uat): расширить per-control на оприходования/списания/инвентаризации/возвраты/движения
21/21 ✓: Товары (поиск/сброс/сорт/пагинация/экспорт), Приёмки (поиск/фильтр оплаты/
сорт/экспорт + жизненный цикл провести→снять→удалить), Продажи (поиск/сорт),
Движения (store-фильтр), Контрагенты (поиск), Оприходования/Списания/Инвентаризации/
Возвраты поставщику (поиск). Семантику параметр→строки держит filters-sweep.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:10:18 +05:00
nns 605c1bac2c test(uat): браузерные per-control проверки + гейтинг прав по прямым URL
- stage-ui-uat-controls: в браузере контролы списков шлют правильный параметр
  (поиск→search, сортировка→sort, фильтр→свой параметр, пагинация→page=2,
  экспорт→/export&format), + жизненный цикл документа приёмки (провести чекбоксом
  «Проведено»→POST /post, снять→/unpost, удалить→DELETE). 16/16 ✓. Семантику
  параметр→строки независимо держит filters-sweep.
- stage-ui-uat-permissions: кассир/кладовщик по ПРЯМОМУ URL к админ-разделам видят
  «Нет доступа» (RoleGuard), разрешённые разделы открываются. 2/2 ✓.
- docs/uat-per-control-progress.md — реестр экранов × контролов.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:06:02 +05:00
nns 12406d2503 docs(weighted): финальный итог — оба бага устранены, ворота зелёные
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
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 11:31:12 +05:00
nns b72b375381 style(pos): компактный бейдж весов (иконка ⚖ уже обозначает «весы»)
Чтобы статус весов не обрезался на узких экранах кассы (1280).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 11:30:42 +05:00