[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:
@@ -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()}\`.`,
|
||||
);
|
||||
};
|
||||
BIN
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** — 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
|
||||
|
||||
Reference in New Issue
Block a user