From d98041d44a4c7d81b8653bf90f339b36c1b91139 Mon Sep 17 00:00:00 2001 From: coopops Date: Tue, 12 May 2026 04:25:54 +0000 Subject: [PATCH] fix stantards --- .../marketplace/p.mkt.return.standard.yaml | 250 +++++---- .../marketplace/p.mkt.supply.standard.yaml | 496 ++++++++++-------- .../cpp/marketplace/p.mkt.wroff.standard.yaml | 117 +++-- 3 files changed, 465 insertions(+), 398 deletions(-) diff --git a/components/contracts/cpp/marketplace/p.mkt.return.standard.yaml b/components/contracts/cpp/marketplace/p.mkt.return.standard.yaml index a2e75877951..050d2bcb1d0 100644 --- a/components/contracts/cpp/marketplace/p.mkt.return.standard.yaml +++ b/components/contracts/cpp/marketplace/p.mkt.return.standard.yaml @@ -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 проходит нулевым транзитом. diff --git a/components/contracts/cpp/marketplace/p.mkt.supply.standard.yaml b/components/contracts/cpp/marketplace/p.mkt.supply.standard.yaml index 00fb9690e50..316b4ff584e 100644 --- a/components/contracts/cpp/marketplace/p.mkt.supply.standard.yaml +++ b/components/contracts/cpp/marketplace/p.mkt.supply.standard.yaml @@ -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-операций для процесса прямой поставки-приобретения. Имена diff --git a/components/contracts/cpp/marketplace/p.mkt.wroff.standard.yaml b/components/contracts/cpp/marketplace/p.mkt.wroff.standard.yaml index d4eb9bf4645..bca9a87d885 100644 --- a/components/contracts/cpp/marketplace/p.mkt.wroff.standard.yaml +++ b/components/contracts/cpp/marketplace/p.mkt.wroff.standard.yaml @@ -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), который