food-market/docs/inventory-model-progress.md
nns b4bd0e41d4
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
feat(inventory): веб-UI по модели МойСклада + доки
- 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

4.9 KiB
Raw Blame History

Инвентаризация по модели МойСклада — прогресс

Замечание владельца (08.10.2026): «инвентаризация стоит в состоянии „проведено“, но без оприходования и списания — логика непонятная».

Сейчас (неправильно): InventoriesController.Post сам применяет движения MovementType.InventoryAdjustment к остаткам и ставит Status=Posted — без создания Оприходования/Списания. Владелец видит «Проведено» без связанных документов; в отчётах непонятно, откуда изменения.

Как должно быть (по МойСкладу): инвентаризация НЕ двигает остатки; она фиксирует расчётный/фактический/разницу, а движения создаются связанными документами Оприходование (излишки) и Списание (недостача).

ПОПРАВКА (Mac-Claude): кнопку «Применить результаты» НЕ добавляем (не одобрено владельцем). Только две кнопки «Создать оприходование» / «Создать списание». Мобильный post — временная совместимость (в docs помечено).

План / статус

  1. Сверка с МойСкладом → docs/inventory-moysklad-reference.md (API SPA — факты из справки + школы торговли; поля calculatedQuantity/correctionAmount/correctionSum, applicable, enter/loss «на основании»).
  2. Инвентаризация не двигает остатки; статусы Draft→Completed («Черновик»→«Завершена»). Эндпоинт complete замораживает строки без движений (InventoriesController).
  3. На завершённой — create-enter (излишки) / create-loss (недостача): создают черновики Оприходования/Списания со строками разницы + ссылка InventoryDocId. Повторно нельзя (409). Кнопки «Применить результаты» НЕТ (по поправке).
  4. Блок «Связанные документы» в карточке (web); колонка «Результат» в списке; «На основании инвентаризации №…» в Оприходовании/Списании (web + DTO).
  5. «Вернуть в черновик» (unpost) отменяет проведение и удаляет связанные документы (остатки возвращаются). Править завершённую нельзя (Update/AddLine требуют Draft).
  6. Миграция Posted+InventoryAdjustment → связанные проведённые Оприходование/Списание: InventoryMigrationController (dry-run/apply) переметка движений (не задваивает), остатки до/после проверяются (stockUnchanged). Backup — в deploy/migrate-inventory-to-docs.sh.
  7. Веб + мобильное API: post/unpost совместимость (post = завершить+создать&провести оба), помечено временным в docs/mobile-api.md. CSV-импорт инвентаризации — без изменений (работает).
  8. [~] Тесты: unit (InventoryResult — разница/сумма/только посчитанные) ✓; integration/e2e/full-chain шаг 10 — ниже.
  9. docs/supply-inventory.md — «Как провести инвентаризацию» (5 шагов).
  10. [~] deploy-stage + коммиты в main (Opus 5.5), global.json не коммитить, не мешать с rebrand — ниже.

Домен/миграция

  • InventoryStatus { Draft=0, Completed=1 } (переименован Posted→Completed, значение то же).
  • Enter.InventoryDocId / Loss.InventoryDocId (nullable) + EF-миграция Phase38_InventoryLinks.
  • InventoryResult (application) — чистая разбивка diff→излишки/недостача (юнит-тесты).
  • Демо-сидеры: инвентаризации теперь Completed без прямых движений.

Что НЕ трогаем

Прод, shared-postgres, global.json, gateway nginx, sklad.

Журнал

  • 08.10 — старт: прочитано замечание, составлен план. Следующий шаг — сверка с МойСкладом.