fix stantards

This commit is contained in:
coopops
2026-05-12 04:25:54 +00:00
parent 44a0030fd6
commit d98041d44a
3 changed files with 465 additions and 398 deletions
@@ -18,8 +18,8 @@
# «кошелёк вне системы» для ISSUE/REVOKE/ACCOUNT_ONLY.
#
# Возврат поставщику и работа с поставщиком по претензиям — out of MVP;
# вернувшееся имущество остаётся на складе КУ как материальный остаток
# до отдельной процедуры по регламенту кооператива.
# вернувшееся имущество остаётся на складе КУ как материальный остаток,
# его дальнейшая судьба вне этого процесса.
#
# В процессе участвуют 2 ledger2-операции (compensating-forward пара, зеркало
# выдачи на supply — через транзит счёта 91):
@@ -28,7 +28,7 @@
# (восстановление «прочих» за счёт ЦФ)
# • o.mkt.return2 — часть 2: NONE Дт 10 / Кт 91 (имущество назад на склад
# через закрытие транзита). Атомарно с o.mkt.return
# в той же транзакции decretvisit.
# в той же транзакции accretrn.
#
# Канон формата:
# coopenomics-docs/docs/standards/_spec/canon.md
@@ -53,14 +53,23 @@ slug: return
status: proposed
contract: marketplace
purpose: >
Гарантийная защита пайщика по сделкам «Стола заказов». Если после
получения товара пайщик обнаружил дефект или истечение срока годности
в пределах гарантии, заданной поставщиком, он подаёт заявление на
возврат — председатель кооперативного участка рассматривает его по фото
и при необходимости приглашает пайщика на КУ для очной проверки.
Используется как штатный способ компенсировать пайщику членский взнос
при некондиционном товаре. Возврат имущества поставщику и претензионная
работа выходят за рамки этого процесса.
Гарантийная защита заказчика по сделкам «Стола заказов». Если после
получения товара заказчик обнаружил дефект, недокомплект или
истечение срока годности в пределах гарантии, заданной поставщиком,
он подаёт заявление на гарантийный возврат. Председатель участка
сначала рассматривает заявление удалённо — по фото и описанию — и
принимает одно из двух решений: одобрить очный визит или отказать
удалённо. Если визит одобрен, заказчик приходит с продукцией на
участок, председатель очно осматривает товар и выносит финальное
решение — принять возврат или отказать на месте. При принятии
возврата товар остаётся на складе участка, а сумма заказа
возвращается заказчику на программный членский кошелёк Стола
заказов: он может направить её на следующий заказ программы либо
вывести в универсальный членский кошелёк отдельным действием.
При отказе — на этом гарантийный возврат завершён, движений по
имуществу и средствам не происходит. Дальнейшая судьба возвращённого
имущества (возврат поставщику, перепоставка, списание) — вне этого
процесса.
roles:
- orderer # пайщик-заказчик, инициатор возврата
- chairman # председатель кооперативного участка (КУ)
@@ -70,35 +79,53 @@ roles:
# реализация в .cpp предстоит после согласования стандарта.
actions:
- name: marketplace::submretrn
human: Подать заявление
human: Подать заявление на гарантийный возврат
actor: orderer
role: opener
purpose: >
Пайщик в архиве заказа подаёт заявление на гарантийный возврат:
выбирает причину (некондиция / истёк срок / иное) и прикладывает
фото товара. Заявление возможно только пока не истёк гарантийный
срок, указанный поставщиком — после истечения кнопка скрывается.
Заказчик подаёт заявление на гарантийный возврат имущества:
указывает причину обращения (некондиция, истёк срок годности,
иное) и прикладывает фотографии товара. Подать заявление можно
только пока не истёк гарантийный срок, заданный поставщиком.
- name: marketplace::decretremot
human: Решить удалённо
- name: marketplace::aprretrem
human: Одобрить очный визит
actor: chairman
role: progress
purpose: >
Председатель участка удалённо рассматривает заявление и принимает
одно из двух решений: одобрить визит для очной проверки (пайщику
уходит уведомление прийти с продукцией) либо отказать удалённо
(спор уходит в отдельную процедуру по регламенту кооператива).
Председатель участка по результатам удалённого рассмотрения
решает, что для разбора обращения нужен очный осмотр товара, и
приглашает заказчика прийти на участок с продукцией.
- name: marketplace::decretvisit
human: Решить очно
- name: marketplace::rejretrem
human: Отказать удалённо
actor: chairman
role: reject
purpose: >
Председатель участка по результатам удалённого рассмотрения
решает отказать в гарантийном возврате с указанием причины — без
приглашения на очный осмотр. Решение финальное, движений по
имуществу и средствам не происходит.
- name: marketplace::accretrn
human: Принять возврат
actor: chairman
role: closer
purpose: >
Председатель очно осматривает товар, принесённый пайщиком, и
выносит финальное решение: принять возврат (товар остаётся на
складе участка, сумма возвращается пайщику в программу — он может
потратить её на следующий заказ) либо отказать на месте (пайщик
забирает товар обратно, спор — отдельной процедурой).
Председатель по результатам очного осмотра принимает гарантийный
возврат: товар остаётся на складе участка, сумма заказа
возвращается заказчику на программный членский кошелёк Стола
заказов.
- name: marketplace::rejretrn
human: Отказать на месте
actor: chairman
role: reject
purpose: >
Председатель по результатам очного осмотра отказывает в
гарантийном возврате с указанием причины. Заказчик забирает
товар обратно. Решение финальное, движений по имуществу и
средствам не происходит.
# ── Секция 3. Граф состояний ────────────────────────────────────────────────
# Сущность: marketplace::return_request (таблица return_requests, scope=coopname).
@@ -108,44 +135,44 @@ entity_source: cpp/marketplace/src/return/
states:
- name: pending_review
human: На рассмотрении
human: Заявление на рассмотрении
description: >
Заявление подано пайщиком, председатель участка получил уведомление
и должен принять решение — одобрить визит или отказать по фото.
Заявление подано заказчиком и ждёт решения председателя участка.
kind: normal
- name: approved_for_visit
human: Одобрен визит
human: Очный визит одобрен
description: >
Председатель одобрил очное рассмотрение. Пайщик получил уведомление
прийти на участок с продукцией; ждём визита и очного осмотра.
Председатель одобрил очное рассмотрение. Заказчику предстоит
прийти на участок с продукцией для очного осмотра.
kind: normal
- name: return_accepted
human: Возврат принят
description: >
Возврат принят кооперативом. Сумма заказа возвращена пайщику в
программу — он может потратить её на следующий заказ либо вывести
в общий членский кошелёк отдельным действием. Дальнейшая судьба
возвращённого товара (возврат поставщику, перепоставка, списание)
решается отдельно по регламенту кооператива; в этом процессе товар
Возврат принят кооперативом. Сумма заказа возвращена заказчику на
программный членский кошелёк Стола заказов — он может направить её
на следующий заказ программы либо вывести в универсальный членский
кошелёк отдельным действием. Дальнейшая судьба возвращённого
имущества (возврат поставщику, перепоставка, списание) — отдельная
процедура по регламенту кооператива; в рамках этого процесса товар
остаётся на складе участка.
kind: final
- name: rejected_remote
human: Отказано удалённо
human: Отказ удалённо
description: >
Председатель отказал по фото без визита. Пайщику отправлено
уведомление с причиной; спор — отдельной процедурой по регламенту
кооператива. Имущество и средства не двигаются.
Председатель отказал по результатам удалённого рассмотрения.
Гарантийный возврат завершён, движений по имуществу и средствам
не происходит.
kind: final
- name: rejected_at_ku
human: Отказано на месте
human: Отказ на месте
description: >
Председатель отказал после очного осмотра. Пайщик забирает товар
обратно; спор — отдельной процедурой. Имущество и средства не
двигаются.
Председатель отказал по результатам очного осмотра. Заказчик
забирает товар обратно. Гарантийный возврат завершён, движений
по имуществу и средствам не происходит.
kind: final
transitions:
@@ -154,43 +181,43 @@ transitions:
action: marketplace::submretrn
actor: orderer
guards:
- Заявитель — заказчик-пайщик исходного Order'а (статус received).
- Гарантийный срок, заданный в Offer'е поставщика, ещё не истёк.
- Прикреплены фотографии товара и указана причина возврата.
- Заявитель — заказчик-пайщик исходного заказа, по которому имущество уже выдано.
- Гарантийный срок, заданный поставщиком в предложении, ещё не истёк.
- К заявлению приложены фотографии товара и указана причина возврата.
- from: pending_review
to: approved_for_visit
action: marketplace::decretremot
action: marketplace::aprretrem
actor: chairman
guards:
- Председатель КУ (КУ-получателя) принял решение «Одобрить визит» по фото.
- Председатель решил пригласить заказчика на очный осмотр.
- from: pending_review
to: rejected_remote
action: marketplace::decretremot
action: marketplace::rejretrem
actor: chairman
guards:
- Председатель КУ принял решение «Отказать удалённо» с указанием причины.
- Председатель решил отказать в гарантийном возврате удалённо с указанием причины.
- from: approved_for_visit
to: return_accepted
action: marketplace::decretvisit
action: marketplace::accretrn
actor: chairman
ledger_code: p.mkt.return
operations:
- o.mkt.return
- o.mkt.return2
guards:
- Пайщик прибыл на КУ с продукцией.
- Председатель очно осмотрел имущество и принял решение «Принять возврат».
- Гарантийный срок ещё не истёк (повторная валидация на стороне контракта).
- Заказчик прибыл на участок с продукцией.
- Председатель очно осмотрел имущество и решил принять гарантийный возврат.
- Гарантийный срок ещё не истёк.
- from: approved_for_visit
to: rejected_at_ku
action: marketplace::decretvisit
action: marketplace::rejretrn
actor: chairman
guards:
- Председатель очно осмотрел имущество и принял решение «Отказать на месте» с указанием причины.
- Председатель очно осмотрел имущество и решил отказать в гарантийном возврате с указанием причины.
# ── Секция 4. Сценарий ──────────────────────────────────────────────────────
scenario:
@@ -200,80 +227,77 @@ scenario:
actor: orderer
action: marketplace::submretrn
description: >
Пайщик в архиве заказа открывает экран «Гарантийный возврат»
(доступен, пока не истёк гарантийный срок поставщика). Указывает
причину, прикладывает фотографии товара, ссылается на акт выдачи,
по которому получал. Председатель участка получает уведомление
о новом заявлении.
Заказчик подаёт заявление на гарантийный возврат имущества:
указывает причину обращения, прикладывает фотографии товара,
ссылается на акт приёма-передачи, по которому получал имущество.
Подать заявление
можно только пока не истёк гарантийный срок, заданный
поставщиком.
pre:
- Заказ закрыт (имущество выдано пайщику).
- Заказ закрыт, имущество выдано заказчику.
- Гарантийный срок ещё не истёк.
- Приложены фото и указана причина.
- Приложены фотографии товара и указана причина обращения.
post:
- Заявление зарегистрировано на рассмотрении.
- Председатель уведомлён.
- Заявление зарегистрировано и направлено председателю на рассмотрение.
- step: 2
title: Удалённое рассмотрение
title: Удалённое рассмотрение — приглашение на очный визит
actor: chairman
action: marketplace::decretremot
action: marketplace::aprretrem
description: >
Председатель открывает заявление в столе админа участка, видит
фото и описание. Решает: одобрить визит (пайщику уходит
уведомление прийти с продукцией) или отказать удалённо (пайщик
получает уведомление с причиной).
Председатель участка изучает заявление и приложенные материалы
и решает, что для разбора обращения нужен очный осмотр товара.
Заказчику предстоит прийти на участок с продукцией.
pre:
- Заявление на рассмотрении.
- Председатель авторизован.
post:
- Заявление одобрено к визиту либо отказано удалённо.
- Пайщик уведомлён.
- Очный визит одобрен.
- step: 3
title: Очный осмотр и финальное решение
title: Очный осмотр — принятие возврата
actor: chairman
action: marketplace::decretvisit
action: marketplace::accretrn
description: >
Пайщик приходит на участок с продукцией. Председатель осматривает
товар и выносит финальное решение: принять возврат (товар
остаётся на складе, сумма возвращается пайщику в программу — он
может потратить её на следующий заказ либо вывести в общий
членский кошелёк отдельным действием) или отказать на месте
(пайщик забирает товар обратно).
Заказчик приходит на участок с продукцией. Председатель очно
осматривает товар и принимает гарантийный возврат: товар
остаётся на складе участка, сумма заказа возвращается
заказчику на программный членский кошелёк Стола заказов.
pre:
- Визит одобрен.
- Пайщик прибыл с продукцией.
- Очный визит одобрен.
- Заказчик прибыл на участок с продукцией.
post:
- При принятии — товар на складе участка, сумма возвращена пайщику в программу.
- При отказе — пайщик забрал товар, ничего не двигалось.
- Товар остаётся на складе участка.
- Сумма заказа возвращена заказчику на программный членский кошелёк.
alternatives:
- branch: Истечение гарантийного срока
- branch: Гарантийный срок истёк
at_step: 1
action: null
actor: orderer
description: >
Если гарантийный срок поставщика истёк, кнопка «Гарантийный
возврат» в архиве заказа недоступна. Альтернатива — отдельная
претензионная процедура по регламенту кооператива.
Если гарантийный срок поставщика истёк, заявление на гарантийный
возврат подать нельзя.
- branch: Отказ удалённо
- branch: Удалённое рассмотрение — отказ
at_step: 2
action: marketplace::decretremot
action: marketplace::rejretrem
actor: chairman
description: >
Председатель отказал по фото без визита (например, товар
очевидно не подпадает под гарантию). Пайщик получает уведомление
с причиной. Спор — отдельной процедурой.
Председатель отказывает в гарантийном возврате удалённо с
указанием причины — например, обращение очевидно не подпадает
под гарантию. Решение финальное, движений по имуществу и
средствам не происходит.
- branch: Отказ на месте
- branch: Очный осмотр — отказ
at_step: 3
action: marketplace::decretvisit
action: marketplace::rejretrn
actor: chairman
description: >
Председатель отказал после очного осмотра (например, повреждение
не гарантийного характера). Пайщик забирает товар обратно. Спор —
отдельной процедурой.
Председатель отказывает в гарантийном возврате по результатам
очного осмотра с указанием причины — например, характер
повреждений не покрывается гарантией. Заказчик забирает товар
обратно. Решение финальное, движений по имуществу и средствам
не происходит.
# ── Секция 5. Документы и подписи ───────────────────────────────────────────
# В процессе подписывается заявление пайщика на возврат с приложениями
@@ -290,7 +314,7 @@ documents:
stored_in: return_requests.statement
note: "Используется существующий шаблон 800.ReturnByAssetStatement из cooptypes/cooperative/registry/. Оригинально создан под клиринговую модель donor'а («Заявление на возврат паевого взноса имуществом»); форма заявления пайщика на возврат структурно подходит и для членской модели гарантийного возврата. При необходимости методолог может создать специализированный шаблон в новой серии (1100+) — тогда registry_id обновится."
- action: marketplace::decretvisit
- action: marketplace::accretrn
title: Решение председателя КУ о принятии гарантийного возврата
registry_id: 0
signed_by: [chairman]
@@ -310,7 +334,7 @@ operations:
# выдачи): Дт 91 / Кт 86 — восстановление «прочих» за счёт ЦФ.
# Закрытие транзита выполняется отдельной операцией o.mkt.return2
# (Дт 10 / Кт 91), атомарно с o.mkt.return в той же транзакции
# decretvisit. Согласовано с Ангелиной 2026-05-11.
# accretrn. Согласовано с Ангелиной 2026-05-11.
debit: 91 # Прочие доходы и расходы (NEW)
credit: 86 # Целевое финансирование
# L2 — восстановление средств в программе
@@ -322,21 +346,21 @@ operations:
available_delta: +order.fact_cost
blocked_delta: null
amount_ref: order.fact_cost
triggered_by: marketplace::decretvisit
triggered_by: marketplace::accretrn
description: >
Compensating forward к выдаче имущества (o.mkt.consum), часть 1
композитной бухгалтерской проводки через транзит счёта 91. ISSUE на
пайщикском w.mkt.member — .available +fact_cost (восстановление ранее
списанной суммы); проводка Дт 91 / Кт 86 — восстановление «прочих»
за счёт ЦФ (зеркало 91-стороны от o.mkt.consum). Сразу после этой
операции в той же транзакции decretvisit контракт вызывает
операции в той же транзакции accretrn контракт вызывает
o.mkt.return2 (Дт 10 / Кт 91, NONE) — имущество назад на склад через
закрытие транзита. Транзит через 91 симметричен выбытию на выдаче —
согласовано с Ангелиной 2026-05-11. Журнал содержит payload
original_consume_op_id (ссылка на исходный o.mkt.consum для
трассировки) — это **прикладное поле**, не часть инфраструктуры
revert. Дальнейшая судьба возвращённого имущества — определяется
регламентом кооператива через отдельную процедуру вне Стола заказов.
revert. Дальнейшая судьба возвращённого имущества — вне этого
процесса.
Пайщик может потратить возвращённую сумму на следующий заказ в Столе
заказов либо вывести в общий членский кошелёк (w.wal.member) через
отдельную операцию o.mkt.recall — там средства универсальны между
@@ -357,12 +381,12 @@ operations:
available_delta: null
blocked_delta: null
amount_ref: order.fact_cost
triggered_by: marketplace::decretvisit
triggered_by: marketplace::accretrn
description: >
Закрытие транзита счёта 91 после восстановления членского взноса
пайщика. NONE — только бухпроводка Дт 10 / Кт 91, кошельки не
двигаются. Срабатывает атомарно с o.mkt.return в той же транзакции
decretvisit. По итогу пары operations нетто-эффект — Дт 10 / Кт 86
accretrn. По итогу пары operations нетто-эффект — Дт 10 / Кт 86
(имущество возвращается на склад + восстановление обязательства
по целевой программе), 91 проходит нулевым транзитом.
@@ -5,10 +5,11 @@
#
# Это базовый процесс контракта Marketplace в режиме членских взносов
# (закупка имущества кооперативом + потребление пайщиком). Содержит
# атомарную серию операций по программному кошельку при создании Order'а,
# цикл консолидации заявок Backend'ом, двухвариантную модель приёмки
# (Асамовывоз / Б — экспедитор + бумажная ТТН + дистанционная ЭЦП),
# двойные подписи на АПП приёмки и АПП выдачи.
# атомарную серию операций по программному кошельку при создании заказа,
# цикл отсечки заявок поставщика, двухвариантную модель передачи партии
# на участок (самовывоз или через экспедитора), двойные подписи на двух
# актах приёма-передачи — приёмки кооперативом от поставщика и выдачи
# заказчику от кооператива.
#
# **Модель кошельков (refinement 2026-05-04, трёхуровневая серия):**
# Членский взнос пайщика проходит через два кошелька:
@@ -87,9 +88,45 @@ slug: supply
status: proposed
contract: marketplace
purpose: >
Базовый процесс «Стола заказов»: пайщик-заказчик находит у пайщика-
поставщика нужный товар, оплачивает его членским взносом, кооператив
принимает товар на склад и затем выдаёт заказчику.
Базовый процесс «Стола заказов»: пайщик-заказчик выбирает у пайщика-
поставщика имущество, направляет на этот заказ свой членский взнос,
кооператив принимает имущество на склад участка и затем выдаёт его
заказчику. Процесс описывает весь путь — от размещения заказа до
передачи имущества на руки заказчику.
Как это устроено по шагам.
Поставщик-пайщик публикует предложение поставить имущество — в нём
он указывает товар, цену, минимальное количество, при котором ему
выгодно собрать партию, и срок, до которого собирает заказы. Это
предложение и есть исходная точка процесса.
Пока предложение открыто, заказчики-пайщики добавляют к нему свои
заказы. Этот период называется циклом отсечки заявок — окно, в
течение которого кооператив принимает заказы под одно предложение
поставщика. При создании заказа кооператив резервирует средства
заказчика на программном членском кошельке Стола заказов — до конца
цикла они не могут быть использованы.
Когда цикл завершается, кооператив смотрит, набрался ли минимальный
порог поставки — заданное поставщиком количество заказов, при
котором партию имеет смысл везти. Если порог набрался — все заказы
цикла объединяются в одну консолидированную заявку, и она уходит
поставщику на акцепт. Если не набрался — все заказы цикла
отменяются, резерв со средств заказчиков снимается.
Поставщик соглашается выполнить консолидированную заявку, готовит
партию и передаёт её на кооперативный участок. Приёмка оформляется
актом приёма-передачи с двойной подписью: первой — поставщик
подтверждает передачу, второй — председатель участка подтверждает
приёмку. С этого момента кооператив юридически принял имущество,
поставщику уходит оплата.
Дальше председатель открывает выдачу, заказчик приходит на пункт
выдачи участка. Выдача оформляется отдельным актом приёма-передачи
также с двойной подписью: первой — председатель подтверждает
передачу имущества заказчику, финальной — заказчик подтверждает
приёмку. Заказ закрыт, начинается гарантийное окно.
roles:
- orderer # пайщик-заказчик
- offerer # пайщик-поставщик
@@ -108,7 +145,7 @@ actions:
Заказчик размещает заказ на товар из каталога: указывает количество
и кооперативный участок, на котором заберёт товар. Кооператив
резервирует средства заказчика под этот заказ — до окончания цикла
поставки они не расходуются на другое. Заказ становится частью
поставки они не могут быть использованы. Заказ становится частью
консолидированной заявки поставщику.
- name: marketplace::cancelorder
@@ -116,87 +153,93 @@ actions:
actor: orderer
role: progress
purpose: >
Заказчик передумал и отменяет заказ до того, как поставщик его
принял в работу. Кооператив снимает резерв со средств — заказчик
снова свободно ими распоряжается в рамках программы.
Заказчик отменяет заказ до того, как поставщик принял
консолидированную заявку в работу. Кооператив снимает резерв со
средств — заказчик снова свободно ими распоряжается в рамках
программы.
- name: marketplace::expirecycle
human: Закрыть по истечении цикла
human: Закрыть цикл отсечки заявок
actor: backend
role: progress
purpose: >
Окно сбора заявок поставщика закрывается. Если набралось достаточно
заказов — поставщику уходит консолидированная заявка, и его дальше
ждёт акцепт. Если не набралось достаточно заявок — все заказы цикла отменяются,
резерв средств снимается, заказчики получают уведомление.
Цикл отсечки заявок поставщика завершается. Кооператив сверяет
количество заказов с минимальным порогом поставки, заданным
поставщиком. Если порог набрался — заказы объединяются в
консолидированную заявку и направляются поставщику для акцепта.
Если порог не набрался — все заказы цикла отменяются, резерв со
средств заказчиков снимается.
- name: marketplace::acceptbatch
human: Акцептовать партию
human: Акцептовать консолидированную заявку
actor: offerer
role: progress
purpose: >
Поставщик соглашается выполнить консолидированную заявку. Заказы переходят
из статуса ожидания в подготовку отгрузки.
Поставщик соглашается выполнить консолидированную заявку и берёт
на себя обязательство собрать и передать партию кооперативу.
Заказы переходят от ожидания к подготовке отгрузки.
- name: marketplace::declinebatch
human: Отказаться от партии
human: Отказаться от консолидированной заявки
actor: offerer
role: reject
purpose: >
Поставщик отказывается от заявки до того, как обязался её выполнить.
Все заказы партии отменяются, резерв со средств заказчиков снимается.
Договорные санкции — вне зоны контракта, по регламенту кооператива.
Поставщик отказывается выполнить консолидированную заявку. Все
заказы партии отменяются, резерв со средств заказчиков снимается.
Договорные санкции при отказе — вне этого процесса, по регламенту
кооператива.
- name: marketplace::prepship
human: Подготовить отгрузку
human: Собрать партию к отгрузке
actor: offerer
role: progress
purpose: >
Поставщик готовит партию к отправке: разбивает заказы по
кооперативным участкам и выбирает, как везёт сам или через
экспедитора с бумажной накладной. В режиме с экспедитором печатает
ТТН и подписывает её. Заменять номенклатуру нельзя — везёт ровно то,
что акцептовал.
Поставщик собирает партию: распределяет заказы по кооперативным
участкам и выбирает способ доставки — везёт сам или передаёт через
экспедитора. Состав партии должен в точности соответствовать тому,
что поставщик акцептовал: заменять или подменять позиции запрещено
(жёсткий акцепт).
- name: marketplace::signsupp
human: Поставщик подписал приёмку
human: Поставщик передал партию
actor: offerer
role: progress
purpose: >
Поставщик первой подписью подтверждает, что передал партию
кооперативу. Имущество физически на складе участка, но юридически
ещё не оприходовано — выдача пайщикам пока заблокирована до второй
подписи председателя.
Поставщик первой подписью на акте приёма-передачи подтверждает,
что передал партию кооперативу. Имущество физически на складе
участка, но юридически ещё не оприходовано — выдача заказчикам
открывается только после второй подписи председателя.
- name: marketplace::signchair
human: Председатель закрыл приёмку
human: Председатель принял поставку
actor: chairman
role: progress
purpose: >
Председатель участка ставит вторую — закрывающую — подпись на
приёмке. С этого момента партия юридически принята кооперативом,
поставщик получает оплату, а имущество разблокировано к выдаче
пайщикам.
Председатель участка ставит вторую — завершающую — подпись на
акте приёма-передачи. С этого момента партия юридически принята
кооперативом, поставщику уходит оплата, имущество приходуется на
склад участка и становится доступным к выдаче заказчикам.
- name: marketplace::signiss1
human: Председатель открыл выдачу
actor: chairman
role: progress
purpose: >
Председатель открывает выдачу: маркирует имущество и подтверждает,
что готов передать его заказчику. Заказчик получает уведомление,
что заказ ждёт его на пункте выдачи.
Председатель открывает выдачу: подтверждает, что готов передать
имущество заказчику. Заказ становится готов к получению на пункте
выдачи участка.
- name: marketplace::signiss2
human: Заказчик закрыл выдачу
human: Заказчик получил имущество
actor: orderer
role: closer
purpose: >
Заказчик пришёл на пункт выдачи и финальной подписью забрал свой
заказ. Если фактически выданное расходится с заказом — сумма
заранее корректируется до фактического (меньше — остаток вернётся
на программный кошелёк, больше — доберётся с паевого). Заказ
закрыт, открывается гарантийное окно.
Заказчик пришёл на пункт выдачи и финальной подписью на акте
выдачи забрал свой заказ. Если фактически выданное расходится с
заказом — сумма заранее корректируется до фактического: при
меньшем количестве остаток возвращается на программный членский
кошелёк, при большем — недостающая сумма берётся с паевого
заказчика. Заказ закрыт, открывается гарантийное окно.
# ── Секция 3. Граф состояний ────────────────────────────────────────────────
# Сущность: marketplace::order (таблица orders, scope=coopname).
@@ -208,65 +251,69 @@ entity_source: cpp/marketplace/src/
states:
- name: active
human: Заявка размещена
human: Заказ размещён
description: >
Заказ создан и ждёт окончания цикла отсечки + согласия поставщика.
Средства заказчика зарезервированы под этот заказ.
Заказ создан и ждёт завершения цикла отсечки заявок и акцепта
поставщика. Средства заказчика зарезервированы под этот заказ на
программном членском кошельке Стола заказов.
kind: normal
- name: cancelled
human: Отменено
human: Заказ отменён
description: >
Заказ аннулирован заказчиком до акцепта, либо системой по
истечении цикла без достижения порога, либо поставщиком при отказе
от партии. Резерв со средств снят, заказчик снова свободно ими
распоряжается в рамках программы.
Заказ отменён по одному из трёх оснований: заказчиком до акцепта,
кооперативом по итогам закрытия цикла без достижения минимального
порога поставки, поставщиком при отказе от консолидированной
заявки. Во всех трёх случаях резерв со средств заказчика снимается,
и заказчик снова свободно ими распоряжается в рамках программы.
kind: final
- name: accepted
human: Поставщик акцептовал
human: Заявка акцептована
description: >
Поставщик согласился выполнить консолидированную заявку. Средства
заказчика по-прежнему зарезервированы; имущество ещё не передано —
поставщик готовит отгрузку.
заказчика по-прежнему зарезервированы; поставщик готовит партию к
отгрузке.
kind: normal
- name: ship_ready
human: Отгрузка собрана
human: Партия собрана к отгрузке
description: >
Поставщик собрал партию по составу акцепта и выбрал способ доставки
(сам или через экспедитора с накладной). Готов к передаче на участок,
но имущество ещё не оприходовано кооперативом.
Поставщик собрал партию точно по составу акцептованной заявки и
выбрал способ доставки на участок — самовывоз или через
экспедитора. Имущество ещё не передано кооперативу.
kind: normal
- name: supply_prepared
human: Поставщик подписал
human: Имущество поставлено
description: >
Поставщик подписал приёмку первым. Имущество физически на участке,
но юридически ещё не оприходовано — выдача пайщикам заблокирована
до второй подписи председателя.
Поставщик передал партию на участок и подтвердил это первой
подписью на акте приёма-передачи. Имущество физически на складе
участка, но юридически ещё не оприходовано — выдача заказчикам
откроется только после второй подписи председателя.
kind: normal
- name: accepted_to_coop
human: Принято кооперативом
human: Поставка принята кооперативом
description: >
Кооператив юридически принял партию. Имущество на складе участка,
поставщик получил оплату. Ждём готовности к выдаче.
Председатель участка завершил приёмку второй подписью. Партия
юридически принята кооперативом, поставщику ушла оплата, имущество
числится на складе участка и ждёт открытия выдачи.
kind: normal
- name: ready_to_receive
human: Готово к выдаче
human: Заказ готов к выдаче
description: >
Имущество промаркировано и готово к передаче заказчику. Заказчику
отправлено уведомление, что заказ ждёт его на пункте выдачи.
Председатель открыл выдачу. Имущество готово к передаче заказчику
на пункте выдачи участка.
kind: normal
- name: received
human: Имущество выдано
description: >
Заказчик получил имущество, заказ закрыт. Открывается гарантийное
окно — в его пределах можно подать заявление на возврат, если товар
окажется некондиционным.
Заказчик получил имущество, заказ закрыт. Открыто гарантийное
окно — в его пределах заказчик может подать заявление на возврат,
если товар окажется некондиционным.
kind: final
transitions:
@@ -281,10 +328,10 @@ transitions:
- o.mkt.block
guards:
- Заказчик — активный пайщик кооператива.
- Заказчик подписал Соглашение ЦПП «Стол заказов» (программный кошелёк w.mkt.member открыт).
- Стоимость корзины не превышает 100 000 ₽ (валидируется Backend'ом до вызова контракта).
- Совокупных средств заказчика по цепочке w.wal.share → w.wal.member → w.mkt.member достаточно для полной стоимости заказа (частичная конвертация на каждом шаге — берётся ровно недостача).
- Указанный КУ принадлежит этому же кооперативу.
- Заказчик подписал Соглашение ЦПП «Стол заказов».
- Стоимость заказа не превышает упрощённый порог приёма имущества (100 000 ₽).
- Совокупных средств заказчика — на паевом и членских кошельках — достаточно для полной стоимости заказа.
- Указанный пункт выдачи принадлежит тому же кооперативу.
- from: active
to: cancelled
@@ -294,7 +341,7 @@ transitions:
operations:
- o.mkt.unblk
guards:
- Order ещё не акцептован поставщиком.
- Заказ ещё не вошёл в акцептованную поставщиком консолидированную заявку.
- from: active
to: cancelled
@@ -304,16 +351,16 @@ transitions:
operations:
- o.mkt.unblk
guards:
- Окно цикла отсечки Offer'а истекло.
- Минимальный порог поставки не достигнут.
- Цикл отсечки заявок поставщика завершился.
- Минимальный порог поставки по количеству заказов не достигнут.
- from: active
to: accepted
action: marketplace::acceptbatch
actor: offerer
guards:
- Минимальный порог достигнут к концу цикла.
- Поставщик владеет связанным Offer'ом.
- Минимальный порог поставки достигнут к концу цикла отсечки.
- Действие выполняет тот поставщик, чьё предложение лежит в основе консолидированной заявки.
- from: active
to: cancelled
@@ -323,24 +370,24 @@ transitions:
operations:
- o.mkt.unblk
guards:
- Поставщик отказывается от консолидированной партии до её публикации on-chain.
- Поставщик ещё не акцептовал консолидированную заявку.
- from: accepted
to: ship_ready
action: marketplace::prepship
actor: offerer
guards:
- Состав Shipment'а равен составу акцептованной партии (жёсткий акцепт; замены номенклатуры запрещены).
- Поставщик выбрал режим: A (самовывоз) или B (экспедитор + ТТН).
- Состав отгрузки в точности равен составу акцептованной заявки (жёсткий акцепт; замены номенклатуры запрещены).
- Поставщик выбрал способ доставки на участок — самовывоз или через экспедитора.
- from: ship_ready
to: supply_prepared
action: marketplace::signsupp
actor: offerer
guards:
- Состав АПП соответствует составу акцептованной партии.
- В модели A — председатель отсканировал штрих-код поставщика, скорректировал quantity/price (если нужно), нажал «Подтверждаю»; поставщик получил push-takeover и нажал «Передал».
- В модели B — председатель и экспедитор сверили груз очно и подписали бумажную ТТН с печатью КУ; председатель сделал фотофиксацию скорректированной ТТН; поставщик получил push-takeover (дистанционно) и подписал в течение 8 часов с момента ухода экспедитора.
- На участок передана партия точно в составе акцептованной заявки — самовывозом поставщика или через экспедитора.
- При самовывозе поставщик ставит первую подпись на акте приёма-передачи лично на участке.
- При доставке через экспедитора председатель и экспедитор очно сверяют партию, и поставщик ставит первую подпись дистанционно в установленный кооперативом срок.
- from: supply_prepared
to: accepted_to_coop
@@ -351,15 +398,15 @@ transitions:
- o.mkt.purch
- o.mkt.payout
guards:
- АПП приёмки имеет первую подпись поставщика.
- Председатель имеет роль оператора КУ-получателя.
- На акте приёма-передачи имеется первая подпись поставщика.
- Действие выполняет председатель того участка, который принимает поставку.
- from: accepted_to_coop
to: ready_to_receive
action: marketplace::signiss1
actor: chairman
guards:
- Имущество промаркировано штрих-кодом / QR на складе КУ.
- Партия принята кооперативом и числится на складе участка.
- from: ready_to_receive
to: received
@@ -370,8 +417,9 @@ transitions:
- o.mkt.consum
- o.mkt.consum2
guards:
- Заказчик присутствует на КУ; оператор сверил факт vs заказ.
- При расхождении факт vs заказ сначала выполнены корректирующие операции (o.mkt.unblk на остаток если факт меньше; o.wal.conv + o.mkt.assign + o.mkt.block на разницу если факт больше — первые две conditional; в пределах допустимого отрицательного баланса паевого ≤5%).
- Заказчик лично присутствует на пункте выдачи участка.
- Председатель сверил фактически выдаваемое имущество с составом заказа.
- При расхождении факта с заказом сумма заказа предварительно скорректирована до фактической в пределах допустимого регламентом отклонения.
# ── Секция 4. Сценарий ──────────────────────────────────────────────────────
scenario:
@@ -381,206 +429,190 @@ scenario:
actor: orderer
action: marketplace::createorder
description: >
Заказчик в столе заказчика выбирает позицию из каталога своего
кооператива, указывает количество и кооперативный участок,
на котором заберёт товар. Кооператив проверяет, что стоимость
корзины не превышает упрощённый налоговый порог ТМЦ (100 000 ₽),
и резервирует средства заказчика под этот заказ. Заказ появляется
у заказчика как «активный» и присоединяется к текущему циклу
отсечки.
Заказчик выбирает позицию из каталога своего кооператива,
указывает количество и пункт выдачи на участке, на котором
заберёт товар. Кооператив проверяет, что стоимость заказа не
превышает упрощённый порог приёма имущества, и резервирует под
этот заказ необходимую сумму со средств заказчика. Заказ
присоединяется к текущему циклу отсечки заявок поставщика.
pre:
- Пайщик имеет статус active.
- Подписано Соглашение ЦПП «Стол заказов».
- Совокупных средств заказчика на паевом + членском хватает.
- Стоимость корзины ≤ 100 000 ₽.
- Заказчик — активный пайщик кооператива.
- Заказчик подписал Соглашение ЦПП «Стол заказов».
- Совокупных средств заказчика на паевом и членских кошельках — достаточно.
- Стоимость заказа не превышает упрощённый порог приёма имущества.
post:
- Заказ создан и активен.
- Заказ размещён и активен.
- Средства заказчика зарезервированы под заказ.
- step: 2
title: Закрытие цикла отсечки
title: Закрытие цикла отсечки заявок
actor: backend
action: marketplace::expirecycle
description: >
Окно сбора заявок закрывается. Кооператив смотрит, набрался ли
минимальный порог поставки. Если набрался — поставщику уходит
консолидированная заявка, заказы остаются активными до акцепта.
Если не набрался — все заказы цикла отменяются, резерв средств
снимается, заказчики получают уведомление об отмене.
Цикл отсечки заявок завершается. Кооператив сверяет количество
собранных заказов с минимальным порогом поставки, заданным
поставщиком. Если порог набрался — заказы объединяются в
консолидированную заявку и направляются поставщику для акцепта.
Если порог не набрался — все заказы цикла отменяются, резерв со
средств заказчиков снимается.
pre:
- Окно цикла отсечки истекло.
- Цикл отсечки заявок поставщика завершился.
post:
- Если порог достигнут — заказы активны, поставщику отправлена консолидированная заявка.
- Если порог не достигнут — заказы отменены, резерв со средств снят.
- При достижении порога — заказы активны, поставщику направлена консолидированная заявка.
- При недостижении порога — заказы отменены, резерв со средств снят.
- step: 3
title: Акцепт поставщика
title: Акцепт консолидированной заявки
actor: offerer
action: marketplace::acceptbatch
description: >
Поставщик в своём кабинете видит консолидированную заявку
и нажимает «Акцептовать». С этого момента он юридически обязан
выполнить поставку — заказы переходят к подготовке отгрузки.
Поставщик видит консолидированную заявку и подтверждает её к
исполнению. С этого момента он принимает на себя обязательство
собрать и передать партию кооперативу.
pre:
- Минимальный порог достигнут.
- Поставщик владеет Offer'ом, на основе которого сформирована партия.
- Минимальный порог поставки достигнут.
- Действие выполняет тот поставщик, чьё предложение лежит в основе консолидированной заявки.
post:
- Заказы партии перешли к подготовке отгрузки.
- step: 4
title: Подготовка отгрузки
title: Подготовка партии к отгрузке
actor: offerer
action: marketplace::prepship
description: >
Поставщик в кабинете на вкладке «К отгрузке» видит акцептованные
заказы, сгруппированные по участкам. Выбирает способ доставки:
сам везёт на участок или отправляет через экспедитора с бумажной
накладной. В режиме с экспедитором печатает ТТН и подписывает её.
Замена номенклатуры запрещена — везёт ровно то, что акцептовал.
Поставщик собирает партию по составу акцептованной заявки —
точно в той же номенклатуре, без замен — и выбирает способ
доставки на участок: самовывоз или через экспедитора.
pre:
- Заказы в статусе «акцептованы».
- Состав отгрузки соответствует акцепту.
- Заявка акцептована поставщиком.
- Состав партии в точности соответствует составу акцепта.
post:
- Отгрузка собрана и готова к передаче на участок.
- В режиме с экспедитором — ТТН распечатана и подписана.
- Партия собрана к отгрузке.
- Способ доставки выбран.
- step: 5
title: Передача и приёмка — самовывозом
actor: chairman
title: Передача партии на участок
actor: offerer
action: marketplace::signsupp
description: >
Поставщик прибыл на участок. Председатель сканирует штрих-код
поставщика — открывается карточка с ожидаемыми параметрами; при
необходимости председатель правит количество или цену и нажимает
«Подтверждаю». Поставщику приходит push-окно во весь экран — он
нажимает «Передал», это его первая подпись приёмки. Имущество
физически на участке, но выдача пайщикам ещё заблокирована.
Поставщик передаёт партию кооперативу. При самовывозе он лично
сдаёт партию председателю и очно ставит первую подпись на акте
приёмки-передачи. При доставке через экспедитора председатель и
экспедитор очно сверяют груз с составом партии, и по итогам этой
сверки поставщик ставит первую подпись дистанционно в
установленный кооперативом срок. В обоих случаях имущество уже
физически на складе участка, но юридически ещё не оприходовано —
выдача заказчикам пока не открыта.
pre:
- Отгрузке соответствует акцептованный заказ.
- Поставщик и председатель физически на участке.
- Партия собрана к отгрузке.
- Состав акта приёма-передачи в точности соответствует составу акцептованной заявки.
post:
- Поставщик подписал приёмку первым.
- Выдача пайщикам ЗАБЛОКИРОВАНА до второй подписи председателя.
- Имущество поставлено, первая подпись на акте приёма-передачи поставлена.
- Выдача заказчикам не открыта до второй подписи председателя.
- step: 6
title: Закрытие приёмки председателем
title: Приёмка поставки председателем
actor: chairman
action: marketplace::signchair
description: >
Председатель ставит вторую — закрывающую — подпись на приёмке.
Партия юридически принята кооперативом, поставщику уходит оплата,
выдача пайщикам разблокирована. Заказчик пока не уведомлён —
ждёт открытия выдачи отдельным шагом.
Председатель участка ставит вторую — завершающую — подпись на
акте приёма-передачи. С этого момента партия юридически принята
кооперативом, поставщику уходит оплата, имущество приходуется на
склад участка.
pre:
- Поставщик подписал приёмку первым.
- Председатель имеет роль оператора участка-получателя.
- На акте приёма-передачи имеется первая подпись поставщика.
- Действие выполняет председатель того участка, который принимает поставку.
post:
- Партия принята кооперативом.
- Поставщик получил оплату.
- Поставка принята кооперативом.
- Поставщику направлена оплата.
- step: 7
title: Маркировка имущества и открытие выдачи
title: Открытие выдачи
actor: chairman
action: marketplace::signiss1
description: >
Оператор маркирует принятое имущество внутренним кодом для
учёта на складе участка (печатает на принтере участка) и
открывает выдачу: ставит первую подпись акта выдачи. Заказчику
уходит уведомление, что заказ готов на пункте выдачи.
Председатель открывает выдачу первой подписью на акте
приёма-передачи. Заказ становится готов к получению на пункте
выдачи участка.
pre:
- Партия принята кооперативом.
- Имущество физически на складе участка.
- Поставка принята кооперативом.
- Имущество числится на складе участка.
post:
- Имущество промаркировано.
- Заказчик уведомлён о готовности.
- Заказ готов к выдаче.
- step: 8
title: Выдача и финальная подпись заказчика
title: Выдача заказа
actor: orderer
action: marketplace::signiss2
description: >
Заказчик пришёл на участок и показывает QR-код заявки оператору.
Оператор сверяет факт vs заказ. Если совпадает — без корректировок.
Если фактически меньше (например, развесной товар: 90 г вместо
100 г) — кооператив снимает резерв с разницы, остаток вернётся
заказчику в программу. Если фактически больше — недостающую сумму
кооператив резервирует с паевого; при пустом паевом допускается
небольшой отрицательный баланс или донос наличными через кассира.
Заказчик подписывает выдачу на устройстве оператора — это
финальная подпись, заказ закрыт.
Заказчик приходит на пункт выдачи участка. Председатель сверяет
фактически выдаваемое имущество с составом заказа. Если факт
совпадает с заказом — выдача проходит без корректировок. При
расхождении (например, развесной товар: фактический вес меньше
заказанного) сумма заказа предварительно корректируется до
фактической: при меньшем количестве остаток возвращается на
программный членский кошелёк заказчика, при большем — недостающая
сумма берётся с паевого заказчика. Заказчик ставит финальную
подпись на акте приёма-передачи и забирает заказ.
pre:
- Заказ готов к выдаче.
- Заказчик присутствует на участке.
- Заказчик лично присутствует на пункте выдачи.
post:
- Имущество выдано пайщику.
- Имущество выдано заказчику.
- Заказ закрыт.
- Гарантийное окно открыто — пайщик может подать заявление на возврат до его истечения.
- Гарантийное окно открыто — в его пределах заказчик может подать заявление на возврат.
alternatives:
- branch: Передача и приёмка — через экспедитора с накладной
at_step: 5
action: marketplace::signsupp
actor: chairman
description: >
Бумажная ступень: председатель и экспедитор очно сверяют груз
по ТТН. При расхождении вычёркивают позиции прямо в накладной
ручкой, экспедитор расписывается под корректировкой, председатель
ставит подпись + дату + печать участка. Экспедитор забирает свой
экземпляр накладной с забракованным и уезжает. Цифровая ступень
(дистанционно с поставщиком): председатель в приложении
фотофиксирует исправленную ТТН — формируется скорректированный
акт приёмки — поставщик в своём приложении получает push-окно
во весь экран и подписывает. На дистанционную подпись поставщика
отводится не более 8 часов с момента ухода экспедитора. Если
не успел — выдача пайщикам остаётся заблокированной, дальнейшее
решение — по регламенту кооператива.
pre:
- Партия отправлена через экспедитора с бумажной накладной.
- Накладная подписана председателем + экспедитором + печатью участка.
post:
- Поставщик подписал приёмку первым (по фотофиксации ТТН).
- Выдача пайщикам ЗАБЛОКИРОВАНА до второй подписи председателя.
- Дальнейшие шаги — те же, что при самовывозе.
- branch: Поставщик отказался от корректировки (через экспедитора)
at_step: 5
action: null
actor: offerer
description: >
Поставщик дистанционно отказался подписать скорректированный
по накладной акт. Формируется претензионная запись на сверку
изначального акцепта против скорректированного. Дальнейшее
решение — ручная договорная процедура по регламенту кооператива
(санкции, возврат, перепоставка). Системные формы санкций в MVP
не реализуются. Выдача пайщикам не разблокирована.
- branch: Отмена заказчиком до акцепта
at_step: 2
action: marketplace::cancelorder
actor: orderer
description: >
Заказчик отменяет заказ до того, как поставщик его принял в работу.
Кооператив снимает резерв со средств — заказчик снова свободно
ими распоряжается в рамках программы. Если хочет вывести в общий
членский кошелёк — отдельным явным действием.
Заказчик отменяет заказ до того, как поставщик принял
консолидированную заявку. Кооператив снимает резерв со средств,
и заказчик снова свободно ими распоряжается в рамках программы.
- branch: Отказ поставщика от партии
at_step: 3
action: marketplace::declinebatch
actor: offerer
description: >
Поставщик отказывается от консолидированной заявки до того,
как обязался её выполнить. Все заказы партии отменяются, резерв
со средств заказчиков снимается. Заказчики получают уведомление.
- branch: Цикл истёк без достижения порога
- branch: Цикл закрыт без достижения порога
at_step: 2
action: marketplace::expirecycle
actor: backend
description: >
Окно сбора заявок истекло, минимальный порог поставки не набрался.
Все заказы цикла отменяются, резерв со средств снимается,
заказчики получают уведомление об отмене.
Цикл отсечки заявок завершился, но минимальный порог поставки
по количеству заказов не достигнут. Все заказы цикла отменяются,
резерв со средств заказчиков снимается.
- branch: Отказ поставщика от консолидированной заявки
at_step: 3
action: marketplace::declinebatch
actor: offerer
description: >
Поставщик отказывается выполнить консолидированную заявку до её
акцепта. Все заказы партии отменяются, резерв со средств
заказчиков снимается. Договорные санкции при отказе — вне этого
процесса, по регламенту кооператива.
- branch: Передача партии через экспедитора
at_step: 5
action: marketplace::signsupp
actor: offerer
description: >
Партия доставлена на участок через экспедитора. Председатель и
экспедитор очно сверяют груз с составом партии. При расхождении
председатель фиксирует фактический состав, экспедитор
подтверждает это своей подписью на сопроводительных документах.
По итогам очной сверки поставщик дистанционно ставит первую
подпись на акте приёма-передачи в установленный кооперативом
срок. Дальнейшие шаги — как при самовывозе.
- branch: Поставщик не подписал акт приёма-передачи в срок
at_step: 5
action: null
actor: offerer
description: >
Поставщик не поставил дистанционную первую подпись на акте
приёмки-передачи в установленный срок. Выдача заказчикам не
открывается; дальнейшее решение — по регламенту кооператива
(досверка, перепоставка, претензия).
# ── Секция 5. Документы и подписи ───────────────────────────────────────────
# В процессе подписываются два юридически значимых документа: АПП приёмки
@@ -620,11 +652,11 @@ documents:
note: "Тот же шаблон что у signiss1 (registry_id 802)."
- action: marketplace::prepship
title: Товарно-транспортная накладная (модель B, бумажная)
title: Товарно-транспортная накладная (при доставке через экспедитора)
registry_id: 0
signed_by: [offerer, chairman, expediter]
stored_in: shipments.ttn_pdf
note: "TODO: создать шаблон ТТН в registry. В модели A не используется. Подписи проставляются вне блокчейна (бумажно), фотофиксация председателя сохраняется для дистанционной ЭЦП поставщика."
note: "TODO: создать шаблон ТТН в registry. При самовывозе не используется. Подписи проставляются вне блокчейна (на бумажном носителе); фотофиксация председателя по результатам очной сверки сохраняется как основание для дистанционной подписи поставщика."
# ── Секция 6. Операции (Ledger2) ────────────────────────────────────────────
# Восемь ledger2-операций для процесса прямой поставки-приобретения. Имена
@@ -49,12 +49,21 @@ status: proposed
contract: marketplace
purpose: >
Штатный путь корректно отразить в учёте имущество, которое физически
пропало или стало непригодным к выдаче. Используется, когда товар на
складе кооперативного участка просрочился, испортился или иначе не
может быть передан пайщику-заказчику. Без этого процесса такие позиции
висели бы бесконечно на складе — здесь же кооператив честно фиксирует
свои потери через решение совета. По умолчанию запускается ежемесячно;
точную дату согласовывает бухгалтер.
пропало или стало непригодным к выдаче. Применяется, когда товар на
складе участка просрочился, испортился или иначе не может быть
передан заказчику. Без этого процесса такие позиции висели бы на
складе бесконечно — здесь кооператив честно фиксирует свои потери
через решение совета.
Процесс состоит из двух шагов. На первом шаге кооператив по расписанию
(по умолчанию раз в месяц; точную дату согласовывает бухгалтер)
собирает со складов участков позиции, удовлетворяющие критериям
списания, формирует проект решения и выносит его на повестку совета.
На втором шаге совет рассматривает проект и принимает решение:
при положительном решении позиции списываются со складов как
безвозвратные потери; при отрицательном — проект отклоняется или
откладывается, а позиции остаются на складах. По кошелькам заказчиков
движений не происходит — это чисто кооперативный учётный расход.
roles:
- backend # Backend Marketplace (крон-триггер, формирование проекта)
- chairman # председатель кооператива (вносит проект на повестку совета)
@@ -64,14 +73,14 @@ roles:
# Имена actions ≤12 символов eosio::name.
actions:
- name: marketplace::propwroff
human: Подать проект списания
human: Внести проект списания
actor: backend
role: opener
purpose: >
Кооператив по расписанию (по умолчанию раз в месяц) собирает на
складах участков товары, которые невозможно выдать пайщику —
просроченные и не востребованные, повреждённые, малооценка — и
формирует проект решения о списании. Проект уходит на повестку
складах участков позиции, которые невозможно выдать заказчику —
просроченные и не востребованные, повреждённые, малооценные — и
формирует проект решения о списании. Проект выносится на повестку
совета.
- name: marketplace::execwroff
@@ -79,18 +88,18 @@ actions:
actor: council
role: closer
purpose: >
Совет принял положительное решение по проекту. Кооператив списывает
позиции со складов — товар уходит из учёта как безвозвратные потери,
по кошелькам пайщиков ничего не двигается. Проект закрыт.
Совет принял положительное решение по проекту. Кооператив
списывает позиции со складов участков — имущество уходит из учёта
как безвозвратные потери. По кошелькам заказчиков движений нет.
- name: marketplace::declwroff
human: Отклонить проект списания
actor: council
role: reject
purpose: >
Совет отклонил проект либо отложил рассмотрение. Позиции остаются
на складах и попадут в следующий цикл утилизации, либо уйдут на
переуступку по сниженной цене (вне MVP).
Совет отклонил проект списания либо отложил его рассмотрение.
Позиции остаются на складах участков и попадут в следующий цикл
списания.
# ── Секция 3. Граф состояний ────────────────────────────────────────────────
# Сущность: marketplace::writeoff_proposal (таблица writeoff_proposals,
@@ -104,24 +113,24 @@ states:
- name: draft
human: Проект сформирован
description: >
Кооператив сформировал список позиций к утилизации и поставил проект
решения на повестку совета. Ждёт рассмотрения по протоколу.
Кооператив сформировал список позиций к списанию и вынес проект
решения на повестку совета. Ждёт рассмотрения советом.
kind: normal
- name: executed
human: Списание исполнено
description: >
Совет принял положительное решение, кооператив списал позиции со
складов. Имущество ушло из учёта как безвозвратные потери; по
кошелькам пайщиков движений не было.
складов участков. Имущество ушло из учёта как безвозвратные
потери. По кошелькам заказчиков движений не было.
kind: final
- name: rejected
human: Отклонено советом
human: Проект отклонён
description: >
Совет отклонил проект либо отложил рассмотрение. Позиции остаются
на складах и либо попадут в следующий цикл утилизации, либо уйдут
на переуступку по сниженной цене (вне MVP).
Совет отклонил проект списания либо отложил его рассмотрение.
Позиции остаются на складах участков и попадут в следующий цикл
списания.
kind: final
transitions:
@@ -130,8 +139,8 @@ transitions:
action: marketplace::propwroff
actor: backend
guards:
- Сработал крон утилизации (по умолчанию раз в месяц).
- Найдены позиции, удовлетворяющие критериям списания (просроченные, не выданные первичному заказчику, малооценка).
- Наступил регламентный срок очередного цикла списания.
- На складах участков найдены позиции, удовлетворяющие критериям списания (просроченные, не выданные первичному заказчику, повреждённые, малооценные).
- from: draft
to: executed
@@ -142,15 +151,14 @@ transitions:
- o.mkt.wroff
- o.mkt.wroff2
guards:
- Совет принял положительное решение по протоколу (sov.decision).
- Решение содержит подписанный документ authorization.
- Совет принял положительное решение по проекту и оформил его протоколом.
- from: draft
to: rejected
action: marketplace::declwroff
actor: council
guards:
- Совет принял отрицательное решение либо вышел регламентный срок рассмотрения без принятия решения.
- Совет принял отрицательное решение по проекту либо не принял решение в установленный регламентом срок.
# ── Секция 4. Сценарий ──────────────────────────────────────────────────────
scenario:
@@ -162,29 +170,31 @@ scenario:
description: >
Кооператив по расписанию (по умолчанию раз в месяц, точная дата
согласовывается с бухгалтером) опрашивает склады участков и
собирает товары, которые невозможно выдать пайщику: просроченные
и не востребованные, повреждённые, малооценка. Сформированный
список становится проектом решения и идёт на повестку совета.
собирает позиции, которые невозможно выдать заказчику:
просроченные и не востребованные, повреждённые, малооценные.
Сформированный список становится проектом решения и выносится
на повестку совета.
pre:
- Сработал крон утилизации.
- Найден непустой список позиций к списанию.
- Наступил регламентный срок очередного цикла списания.
- На складах участков найдены позиции, удовлетворяющие критериям списания.
post:
- Проект списания создан.
- Пункт повестки опубликован в совете.
- Проект списания сформирован.
- Проект вынесен на повестку совета.
- step: 2
title: Рассмотрение и принятие решения советом
title: Рассмотрение проекта советом
actor: council
action: marketplace::execwroff
description: >
Председатель или член совета вносит проект на ближайшее заседание
(или заочное голосование). Совет рассматривает список позиций
и принимает протокол. При положительном решении кооператив
списывает все позиции со складов — товар уходит из учёта как
безвозвратные потери. По кошелькам пайщиков движений не было.
Совет рассматривает проект на очном заседании или в форме
заочного голосования — и принимает решение, оформленное
протоколом. При положительном решении кооператив списывает
перечисленные в проекте позиции со складов участков. Имущество
уходит из учёта как безвозвратные потери. По кошелькам
заказчиков движений не происходит.
pre:
- Проект на рассмотрении.
- Совет принял положительное решение по протоколу.
- Проект внесён на рассмотрение совета.
- Совет принял положительное решение по проекту и оформил его протоколом.
post:
- Списание исполнено.
- Списанные позиции ушли со складов участков.
@@ -195,20 +205,21 @@ scenario:
action: marketplace::declwroff
actor: council
description: >
Совет отклонил проект (например, требует дополнительной
экспертизы) либо отложил рассмотрение. Позиции остаются на
складах и либо попадут в следующий цикл утилизации, либо уйдут
на альтернативный путь переуступки по сниженной цене.
Совет отклонил проект списания (например, требуется
дополнительная экспертиза) либо отложил его рассмотрение.
Позиции остаются на складах участков и попадут в следующий цикл
списания.
- branch: Альтернатива — переуступка по сниженной цене (вне MVP)
- branch: Альтернатива — переуступка имущества по сниженной цене
at_step: 1
action: null
actor: backend
description: >
Альтернативный путь: вместо списания кооператив сам выступает
поставщиком в новом предложении по сниженной цене (товар ещё
пригоден, например, накануне истечения срока). В MVP только
помечен; реализуется отдельным процессом в Phase 2.
Альтернативный путь для имущества, ещё пригодного к выдаче
(например, накануне истечения срока годности): кооператив сам
выступает поставщиком в новом предложении по сниженной цене и
ставит имущество на следующий цикл отсечки заявок. В MVP только
помечен; реализуется отдельным процессом в более поздней фазе.
# ── Секция 5. Документы и подписи ───────────────────────────────────────────
# В процессе подписывается протокол решения совета (authorization), который