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>
6.9 KiB
6.9 KiB
Инвентаризация в МойСкладе — выписка (эталон для нашей реализации)
Источники: 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/newc передачейinventory(meta инвентаризации) — создаётся черновик со строками разницы. - Строки: излишки (correctionAmount>0) → в Оприходование; недостача (correctionAmount<0, по модулю) → в Списание. Цена — учётная себестоимость (FIFO у МойСклада).
- Созданные Оприходование/Списание — обычные документы: их можно открыть, поправить, провести (вот тогда меняются остатки) и отменить проведение.
Связи и видимость
- Из инвентаризации видно созданные на её основании документы (связанные документы).
- В Оприходовании/Списании «на основании» видно, из какой инвентаризации они созданы.
(В API жёсткого поля-ссылки у enter/loss на inventory нет — связь ведётся механизмом
«создать на основании»; у нас мы сохраняем явную ссылку
InventoryDocId— это осознанное улучшение, владелец просил видимые связи, см. docs/moysklad-logic-audit.md §3.3.)
Статусы (UI)
- У МойСклада документы: «Черновик» / «Проведён» (
applicable). Для инвентаризации «проведён» означает «пересчёт зафиксирован» (без движения остатков). - Решение владельца для нас: статусы инвентаризации — «Черновик» → «Завершена», без слова «Проведено» (понятнее; «Проведено» осталось бы только у Оприходования/Списания).
Себестоимость в документах результата
- Оприходование добавляет остаток по учётной себестоимости; Списание убирает по FIFO-себестоимости
(у нас пока скользящее среднее — см. ревизию). Для строк разницы берём снимок
Product.Cost.
Наша целевая модель (вывод)
- Инвентаризация: Черновик (идёт подсчёт) → Завершена (строки заморожены), остатки НЕ трогает. Показываем расчётное / фактическое / разница / сумма разницы.
- На завершённой — две кнопки: «Создать оприходование излишков», «Создать списание недостачи»
(кнопку «Применить результаты» НЕ добавляем — не одобрено владельцем). Документы со строками
разницы, ссылка
InventoryDocIdна инвентаризацию, проводятся как обычные. - Карточка инвентаризации: блок «Связанные документы»; список: колонка «Результат». В Оприходовании/Списании: «На основании инвентаризации №…».
- Нельзя вернуть инвентаризацию в черновик, пока есть проведённые связанные документы.
- Мобильный
postинвентаризации — временная совместимость: завершить + создать и провести оба документа (помечено в docs/mobile-api.md как compat).