[598][@ant] docs(marketplace): «Списания скоропорта» — 1 e2e скриншот стола председателя

Story 8.7: admin-стол /market/writeoffs. Снимок раскрывает регламент
1106→1105 (Заявление председателя + Протокол совета), кнопку
«+ Новый черновик», карточку «В работе совета», пустые ленты проектов
и архива у свежего стенда. Списание per-item через атомарную пару
o.mkt.wroff + o.mkt.wroff2; ролевой доступ chairman/member.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
ant
2026-05-21 00:06:05 +00:00
parent 5ddb76be54
commit e5b90062c4
3 changed files with 114 additions and 35 deletions
@@ -0,0 +1,30 @@
// Сценарий: chairman-стол списаний (Story 8.7).
// Председатель собирает черновик проекта списания (вручную или из крон-предложения),
// подписывает Заявление 1106 и отправляет проект в совет через propwroff +
// soviet::createagenda(type=mktwroff). Backend проводит per-item списания
// через execwroff (пары o.mkt.wroff + o.mkt.wroff2).
import { cleanViteOverlays, env, loginAsChairman } from '../../../lib/harness.mjs';
export const meta = {
title: 'Стол председателя — списания скоропорта',
docPath: 'new/marketplace/chairman/writeoff-propose.md',
assetsDir: 'assets/new/marketplace/chairman/writeoff-propose',
role: 'chairman',
};
export default async ({ page, shot }) => {
await loginAsChairman(page);
await page.evaluate(() => localStorage.setItem('harness:noBranchOverlay', '1'));
await page.goto(`${env.BASE_URL}/${env.COOPNAME}/market/writeoffs`, { waitUntil: 'domcontentloaded', timeout: 45000 });
await page.waitForLoadState('networkidle', { timeout: 20000 }).catch(() => {});
await page.waitForTimeout(3000);
await cleanViteOverlays(page);
await shot(
page,
'01-writeoffs-empty',
`Раздел «Списания скоропорта» председателя. URL: \`${page.url()}\`.`,
);
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

@@ -1,59 +1,108 @@
---
title: Списания скоропорта — стол председателя
generated_by: docs-harness
scenario: marketplace/chairman/writeoff-propose
tags:
- Председатель
---
# Списания имущества
# Списания скоропорта — admin-стол председателя
Если на складе участка скопилось имущество, которое нельзя выдать пайщикам (просрочено, испорчено, не востребовано), оно должно быть **списано**. Это финансовая операция, которая требует решения совета. Председатель кооператива инициирует её через страницу **Списания**.
Раздел `/<coopname>/market/writeoffs` (Story 8.7) — рабочее место
председателя по проектам списания **скоропорта**: имущества с истекающим
сроком годности, которое необходимо снять с баланса кооператива до
истечения. Доступ в access-matrix — `roles: ['chairman', 'member']`;
обычный пайщик пункт не видит.
## Когда нужно списание
![Списания скоропорта: подзаголовок о флоу 1106→1105, кнопка «+ Новый черновик», карточка «В работе совета — 0 проект(ов) на сумму 0.00 ₽», плейсхолдеры пустых проектов и архива](/assets/new/marketplace/chairman/writeoff-propose/01-writeoffs-empty.png)
Типовые сценарии для списания:
## Как устроен процесс списания
- **Просроченный товар** — продукты с истёкшим сроком годности.
- **Возвращённое имущество** — товар, который пайщик вернул как дефектный; кооператив не может его перепродать.
- **Невостребованные Заказы** — пайщик не пришёл за Заказом, прошёл срок хранения, имущество не имеет смысла держать.
- **Утрата при инвентаризации** — фактически отсутствует на складе по разным причинам.
Под заголовком — серая пояснительная строка, дублирующая регламент:
В каждом случае имущество физически вычеркивается из реестра кооператива, и сумма списания идёт на счёт «Прочие расходы».
> Сначала собирается черновик списания (вручную или автоматически
> крон-сервисом). Затем председатель подписывает **Заявление 1106**
> и отправляет проект в совет. Совет голосует через свою повестку и
> подписывает **Протокол 1105** — backend сам атомарно списывает
> позиции через пары **`o.mkt.wroff`** + **`o.mkt.wroff2`**.
## Подготовка предложения
Это полный жизненный цикл проекта списания:
Списание начинается с **предложения совету**. Председатель открывает страницу «Списания», нажимает «Создать предложение». В форме:
1. **Сбор черновика.** Председатель открывает новый черновик через
кнопку **«+ Новый черновик»** (правый верх) или ждёт, пока внутренний
крон-сервис (`@coopenomics/boot` -> mkt cron) сам не подберёт
позиции с истекающим сроком и не создаст proposal автоматически.
2. **Подпись 1106.** Председатель подписывает **Заявление о списании
(registry_id=1106)** своей ЭП. После подписи backend дёргает
action `propwroff` контракта marketplace.
3. **Повестка совета.** `propwroff` создаёт повестку через
`soviet::createagenda(type=mktwroff)`. Совет видит проект в своём
столе, голосует обычным `sov.decision` flow.
4. **Подпись 1105.** Положительное решение совета подписывается
**Протоколом 1105**, в backend срабатывает action `execwroff`.
5. **Per-item списание.** Backend атомарным циклом проходит по
позициям проекта и для каждой выполняет **пару действий**:
`o.mkt.wroff` (списание со склада участка) + `o.mkt.wroff2`
(списание в кооперативной книге). Атомарность гарантирована —
откат любой позиции откатывает весь проект.
1. **Перечень имущества** — единицы со склада с их штрих-кодами, заказчиками-владельцами (для возвращённых) и фактической стоимостью.
2. **Причина списания** — текстовое описание (до 2000 знаков): что случилось, почему имущество не может быть выдано / перепродано.
3. **Фотографии** — состояние имущества на момент списания (если применимо).
4. **Итоговая сумма** — рассчитывается автоматически из стоимостей единиц.
!!!warning "Зачем 1106 и 1105 — два документа"
Списание имущества — это финансовая операция, затрагивающая баланс
кооператива. Закон требует **подпись председателя** (заявление 1106
как инициатива) и **решение совета** (протокол 1105 как
коллегиальное одобрение). Один документ или одна подпись
юридически недостаточны.
После сохранения формируется **проект решения совета о списании** — стандартный документ из реестра с подставленными данными.
## Блоки страницы
## Подача на совет
### Карточка «В работе совета»
Председатель нажимает «Отправить на совет». Это запускает стандартный механизм повестки:
Сводная карточка с двумя счётчиками:
- Документ-предложение появляется в текущей или ближайшей повестке совета как пункт «Списание имущества».
- Члены совета (видят в [Голосовании по списанию][vote]) знакомятся с предложением и голосуют.
- **0 проект(ов)** — сколько проектов сейчас в повестке совета;
- **на сумму 0.00 ₽** — общая стоимость списываемого имущества по
всем активным проектам в валюте кооператива.
## Что после решения совета
В пустом состоянии — нули, как на скриншоте.
- **Совет принял**: предложение исполняется атомарной транзакцией:
- Единицы имущества помечаются как `WRITTEN_OFF` в реестре участка.
- Сумма списания списывается с накопителя на счёт «Прочие расходы» — это операция ledger2 на стороне Коопеномика.
- Председатель и оператор участка получают push «Списание исполнено».
- **Совет отклонил**: предложение возвращается председателю с комментарием. Имущество остаётся в реестре (но в статусе «proposed for write-off»). Председатель может скорректировать и подать новое предложение, либо вернуть имущество в обычный оборот.
### Список активных проектов
## Как пайщик это видит
Под карточкой — лента активных проектов списания (статусы «черновик»,
«подписан председателем», «в повестке совета», «в голосовании»). На
свежем стенде — плейсхолдер:
Если пайщик-владелец возвращённого имущества жив в кооперативе, в его карточке возврата отображается финальный шаг: «Имущество списано по решению совета №X от {дата}». Это закрывает историю возврата.
> Нет проектов на повестке. Откройте новый черновик или дождитесь,
> пока крон-сервис подберёт скоропорт.
## Связанные потоки
### Архив
- [Голосование по списанию][vote] — лента совета по предложениям.
- [Возврат имущества][return] — типовой источник имущества для списания.
- [Склад участка][warehouse] — реестр, в котором отражается статус единицы.
Блок **«Архив»** — закрытые проекты: исполненные (списание завершено
через `execwroff`), отклонённые советом, отозванные председателем.
Сейчас — **«Архив пуст.»**
[vote]: ../board/agenda-writeoff.md
[return]: ../orderer/return-claim.md
[warehouse]: ../operator/inventory-list.md
## Левый сайдбар Стола председателя
На скриншоте также видна полная навигация по другим разделам
Стола председателя:
- Онбординг
- Запросы одобрений
- Магазин приложений
- Стартовые страницы
- Члены совета
- Кооперативные Участки
- Регистрационные взносы
- Ключ кооператива
- Провайдер платежей
Карточка профиля внизу — **Иванов Иван Иванович**, бейдж
**«Председатель»**, остаток **0,00 RUB**.
!!!info "Отличие списаний скоропорта от обычных"
«Скоропорт» в названии раздела — это не любые списания
имущества, а только то, что снимается с баланса **по истечении
срока годности**. Гарантийные возвраты по решению пайщика — это
другой документ-флоу (registry_id=1104, см. [«Гарантийные возвраты»][returns]
на orderer-столе и operator-столе ПВЗ).
[returns]: ../orderer/return-claim.md