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
- 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>
71 lines
6.9 KiB
Markdown
71 lines
6.9 KiB
Markdown
# Инвентаризация в МойСкладе — выписка (эталон для нашей реализации)
|
||
|
||
Источники: 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).
|