food-market/docs/inventory-model-progress.md
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

3.2 KiB
Raw Blame History

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

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

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

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

План / статус

  1. Сверка с МойСкладом (headless Playwright) → docs/inventory-moysklad-reference.md.
  2. Инвентаризация не двигает остатки; статусы «Черновик» → «Завершена» (без «Проведено»).
  3. На завершённой — кнопки «Создать оприходование излишков» / «Создать списание недостачи» / «Применить результаты» (обе). Документы со строками разницы + ссылка на инвентаризацию.
  4. Блок «Связанные документы» в карточке; колонка «Результат» в списке; обратная ссылка в enter/loss.
  5. Отмена проведения связанных — штатно; инвентаризацию нельзя вернуть в черновик при проведённых связанных (понятный отказ).
  6. Миграция Posted+InventoryAdjustment → связанные проведённые Оприходование/Списание (движения перенести, не задвоить); статус → «Завершена». Остатки до/после совпадают. Backup stage.
  7. Веб + мобильное API (post/unpost совместимо: post = завершить+применить) + CSV-импорт.
  8. Тесты: unit / integration / e2e на стенде; full-chain шаг 10 + UAT.
  9. docs/supply-inventory.md — инструкция «Как провести инвентаризацию».
  10. deploy-stage; коммиты в main (Co-Authored-By: Claude Opus 5.5); global.json не коммитить; не мешать с rebrand.

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

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

Журнал

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