food-market/docs/inventory-moysklad-reference.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

6.9 KiB
Raw Permalink Blame History

Инвентаризация в МойСкладе — выписка (эталон для нашей реализации)

Источники: dev.moysklad.ru/doc/api/remap/1.2 (documents/inventory, /enter, /loss), support.moysklad.ru (UI-логика), moysklad.ru/poleznoe/shkola-torgovli (излишки/пересортица). JS-рендер SPA мешал полной выгрузке полей — факты сверены по справке UI + школе торговли + известной модели API.

Документ «Инвентаризация» (inventory)

  • Не двигает остатки сама. Инвентаризация фиксирует пересчёт; изменение остатков делают отдельные документы Оприходование/Списание, создаваемые «на основании» инвентаризации. (support: инвентаризация товаров, школа: излишки).
  • Поля позиции (positions):
    • assortment — товар;
    • price — учётная цена (себестоимость) на момент;
    • calculatedQuantity — расчётное (учётное) количество по системе;
    • correctionAmount — коррекция = фактическое − расчётное (>0 излишек, <0 недостача);
    • correctionSum — сумма коррекции = correctionAmount × price.
    • Фактическое кол-во = calculatedQuantity + correctionAmount. (API documents).
  • applicable есть (как у всех документов), но для инвентаризации проведение не меняет остатки — это просто «пересчёт зафиксирован».
  • Через API можно пересчитать calculatedQuantity (перезасечь учётные остатки) — документ пересохранится.

Создание Оприходования/Списания «на основании» (UI)

  • На документе инвентаризации кнопка «Создать документ» → в выпадающем списке «Оприходование» (для излишков) или «Списание» (для недостачи). (support: оприходование, списание).
  • Шаблоны API: /entity/enter/new и /entity/loss/new c передачей inventory (meta инвентаризации) — создаётся черновик со строками разницы.
  • Строки: излишки (correctionAmount>0) → в Оприходование; недостача (correctionAmount<0, по модулю) → в Списание. Цена — учётная себестоимость (FIFO у МойСклада).
  • Созданные Оприходование/Списание — обычные документы: их можно открыть, поправить, провести (вот тогда меняются остатки) и отменить проведение.

Связи и видимость

  • Из инвентаризации видно созданные на её основании документы (связанные документы).
  • В Оприходовании/Списании «на основании» видно, из какой инвентаризации они созданы. (В API жёсткого поля-ссылки у enter/loss на inventory нет — связь ведётся механизмом «создать на основании»; у нас мы сохраняем явную ссылку InventoryDocId — это осознанное улучшение, владелец просил видимые связи, см. docs/moysklad-logic-audit.md §3.3.)

Статусы (UI)

  • У МойСклада документы: «Черновик» / «Проведён» (applicable). Для инвентаризации «проведён» означает «пересчёт зафиксирован» (без движения остатков).
  • Решение владельца для нас: статусы инвентаризации — «Черновик» → «Завершена», без слова «Проведено» (понятнее; «Проведено» осталось бы только у Оприходования/Списания).

Себестоимость в документах результата

  • Оприходование добавляет остаток по учётной себестоимости; Списание убирает по FIFO-себестоимости (у нас пока скользящее среднее — см. ревизию). Для строк разницы берём снимок Product.Cost.

Наша целевая модель (вывод)

  1. Инвентаризация: Черновик (идёт подсчёт) → Завершена (строки заморожены), остатки НЕ трогает. Показываем расчётное / фактическое / разница / сумма разницы.
  2. На завершённой — две кнопки: «Создать оприходование излишков», «Создать списание недостачи» (кнопку «Применить результаты» НЕ добавляем — не одобрено владельцем). Документы со строками разницы, ссылка InventoryDocId на инвентаризацию, проводятся как обычные.
  3. Карточка инвентаризации: блок «Связанные документы»; список: колонка «Результат». В Оприходовании/Списании: «На основании инвентаризации №…».
  4. Нельзя вернуть инвентаризацию в черновик, пока есть проведённые связанные документы.
  5. Мобильный post инвентаризации — временная совместимость: завершить + создать и провести оба документа (помечено в docs/mobile-api.md как compat).