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

71 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Инвентаризация в МойСкладе — выписка (эталон для нашей реализации)
Источники: 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: инвентаризация товаров](https://support.moysklad.ru/hc/ru/товары%20и%20склады/операции/инвентаризация_товаров),
[школа: излишки](https://www.moysklad.ru/poleznoe/shkola-torgovli/izlishki-pri-inventarizacii/)).
- **Поля позиции (positions):**
- `assortment` — товар;
- `price` — учётная цена (себестоимость) на момент;
- `calculatedQuantity` — **расчётное** (учётное) количество по системе;
- `correctionAmount` — **коррекция** = фактическое − расчётное (>0 излишек, <0 недостача);
- `correctionSum` — сумма коррекции = `correctionAmount × price`.
- Фактическое кол-во = `calculatedQuantity + correctionAmount`.
([API documents](https://dev.moysklad.ru/doc/api/remap/1.2/documents/)).
- **`applicable`** есть (как у всех документов), но для инвентаризации проведение не меняет
остатки — это просто «пересчёт зафиксирован».
- Через API можно пересчитать `calculatedQuantity` (перезасечь учётные остатки) — документ пересохранится.
## Создание Оприходования/Списания «на основании» (UI)
- На документе инвентаризации кнопка **«Создать документ»** → в выпадающем списке
**«Оприходование»** (для излишков) или **«Списание»** (для недостачи).
([support: оприходование](https://support.moysklad.ru/hc/ru/товары%20и%20склады/операции/оприходование_товаров),
[списание](https://support.moysklad.ru/hc/ru/товары%20и%20склады/операции/списание_товаров)).
- Шаблоны 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).