COOPENOMICS  v1
Кооперативная Экономика
Действия

Функции

void branch::setweight (eosio::name coopname, eosio::name braname, eosio::name contract, eosio::name username, uint64_t weight)
 Председатель КУ задаёт/меняет вес участника в распределении членских взносов от контракта-источника. Доля = вес / Σ весов. Подробнее...
 
void branch::delweight (eosio::name coopname, eosio::name braname, eosio::name contract, eosio::name username)
 Исключение участника из распределения (вес удаляется, доли остальных перебалансируются автоматически). Подробнее...
 
void branch::accrue (eosio::name coopname, eosio::name braname, eosio::name source_contract, eosio::asset amount, eosio::name process_type, eosio::checksum256 process_hash, std::string memo)
 Зачисление поступивших членских взносов КУ в общий кошелёк участка (o.brn.common, 100% суммы). Вызывается inline контрактом-источником (marketplace) при финализации заказа. Подробнее...
 
void branch::retfee (eosio::name coopname, eosio::name braname, eosio::name source_contract, eosio::asset amount, eosio::name process_type, eosio::checksum256 process_hash, std::string memo)
 Возврат членских взносов КУ из общего кошелька участка обратно в пул взносов программы-источника (o.brn.retfee) — инверсия accrue. Вызывается inline контрактом-источником (marketplace) при гарантийном возврате имущества, чтобы пайщику вернулась полная уплаченная сумма. Подробнее...
 
void branch::distribute (eosio::name coopname, eosio::name braname, eosio::name source_contract, eosio::checksum256 round_hash, eosio::asset amount, std::string memo)
 Ручное распределение средств общего кошелька КУ между председателем и доверенными по весам реестра: команда председателя, сумма раскладывается по весам (o.brn.release + o.brn.person), остаток округления остаётся в общем кошельке. Можно частично и многократно. Плановый резерв расходов (30 дней) контролирует бэкенд до вызова. Подробнее...
 
void branch::convert (eosio::name coopname, eosio::name username, eosio::checksum256 convert_hash, eosio::asset amount)
 Перевод персональных средств доверенного в членский кошелёк «Стола заказов» (o.brn.conv) — для заказов как обычный пайщик. Подробнее...
 
void branch::createaid (eosio::name coopname, eosio::name username, eosio::name braname, eosio::checksum256 aid_hash, eosio::asset amount, document2 statement, std::string meta)
 Заявление на материальную помощь доверенного из его персонального кошелька: подписанное заявление вносится на повестку совета (type=brnaid). Исходящий платёж кассиру создаётся только после решения совета — в callback'е onaidauth. Подробнее...
 
void branch::onaidauth (eosio::name coopname, eosio::checksum256 hash, document2 authorization)
 Callback от soviet — совет одобрил выплату материальной помощи. Заявление переходит в authorized, протокол сохраняется, и регистрируется исходящий платёж в gateway — заявка попадает к кассиру. Подробнее...
 
void branch::onaiddecl (eosio::name coopname, eosio::checksum256 hash, std::string reason)
 Callback от soviet — совет отказал в выплате либо срок рассмотрения истёк. Заявление закрывается, не доходя до кассира; средства остаются на персональном кошельке. Подробнее...
 
void branch::aidconfirm (eosio::name coopname, eosio::checksum256 outcome_hash)
 Callback от gateway::outcomplete — кассир подтвердил банковский перевод материальной помощи. Здесь применяются o.brn.aidtax (удержание налога, Дт 86 / Кт 68) и o.brn.aid (выплата, Дт 86 / Кт 51). Подробнее...
 
void branch::aiddecline (eosio::name coopname, eosio::checksum256 outcome_hash, std::string reason)
 Callback от gateway::outdecline — перевод не состоялся; средства остаются на персональном кошельке, заявление закрывается. Подробнее...
 
void branch::createexp (eosio::name coopname, eosio::name braname, eosio::name creator, eosio::checksum256 expense_hash, std::vector< ExpenseDomain::item > items, document2 statement)
 Подать расход участка в шасси расходов: средства уходят из общего кошелька КУ в пул расходов (o.brn.expfnd), записка передаётся шасси — решение совета, оплата по реквизитам либо аванс под отчёт, отчёт, закрытие. Подробнее...
 
void branch::onexpdone (eosio::name coopname, eosio::checksum256 expense_hash, uint8_t status, eosio::asset total_actual, std::vector< char > data)
 Callback шасси расходов — расход завершён (отклонён советом либо закрыт). Неизрасходованный остаток возвращается в общий кошелёк участка (o.brn.expunf), запись расхода стирается. Подробнее...
 
void branch::migrate ()
 Инициализация контракта кооперативных участков. Выполняет начальную настройку контракта. Подробнее...
 
void branch::init ()
 Инициализация контракта кооперативных участков. Выполняет начальную настройку контракта. Подробнее...
 
void branch::addtrusted (eosio::name coopname, eosio::name braname, eosio::name trusted)
 Добавление доверенного лица в кооперативный участок. Добавляет нового доверенного лица в существующий кооперативный участок. Максимальное количество доверенных лиц на один участок - 3. Подробнее...
 
void branch::addwhite (eosio::name coopname, eosio::name braname, eosio::name account)
 Добавление пайщика в белый список кооперативного участка. Пайщики из белого списка могут выбрать приватный кооперативный участок при вступлении или смене участка. В белый список можно добавить любого пайщика кооператива. Подробнее...
 
void branch::apprauth (eosio::name coopname, eosio::name username, eosio::checksum256 approval_hash, document2 approved_document)
 Встречная подпись председателя совета на доверенности председателя кооперативного участка. Callback одобрения совета: председатель совета подписал доверенность второй подписью (механизм soviet::confirmapprv проверил его подпись). Фиксируем полностью подписанную доверенность в реестре документов по якорю одобрения. Подробнее...
 
void branch::apprliab (eosio::name coopname, eosio::name username, eosio::checksum256 approval_hash, document2 approved_document)
 Встречная подпись председателя совета на договоре о полной материальной ответственности председателя кооперативного участка. Callback одобрения совета: председатель совета подписал договор второй подписью (механизм soviet::confirmapprv проверил его подпись). Фиксируем полностью подписанный договор в реестре документов по якорю процесса. Подробнее...
 
void branch::apprtrusted (eosio::name coopname, eosio::checksum256 hash, document2 countersigned, document2 countersigned_authority)
 Одобрение заявки доверенного лица председателем участка. Председатель кооперативного участка накладывает встречную подпись на договор материальной ответственности и доверенность заявителя; оба полностью подписанных документа фиксируются в реестре документов, пайщик добавляется в список доверенных лиц участка, заявка стирается. Подробнее...
 
void branch::canceldec (eosio::name coopname, eosio::checksum256 hash, std::string reason)
 Отмена собрания инициатором до вывода на совет. Инициатор сворачивает собрание, пока решение не ушло в совет; запись и вопросы повестки стираются, причина передаётся аргументом (история — в журнале действий). Подробнее...
 
void branch::closedec (eosio::name coopname, eosio::checksum256 hash, document2 protocol)
 Закрытие собрания и утверждение протокола председателем. Председатель закрывает голосование и утверждает протокол одной своей подписью (секретарь не нужен — подсчёт ведёт контракт). Проверяется кворум и итог голосования. Для типа "free" — терминал: запись стирается (история — в журнале). Для "createbranch" — решение переходит в статус "approved" в ожидании исполнения действием exec (вывод вопроса на совет). Подробнее...
 
void branch::confirmdec (eosio::name coopname, eosio::checksum256 hash, document2 authorization)
 Подтверждение решения советом — создание кооперативного участка. Callback совета: по утверждению учреждается кооперативный участок с реквизитами из решения (аккаунт участка, избранный председатель), после чего запись решения стирается (история — в журнале действий). Подробнее...
 
void branch::createbranch (eosio::name coopname, eosio::name braname, eosio::name trustee)
 Создание нового кооперативного участка. Создает новый кооперативный участок с указанным председателем. При создании третьего участка автоматически активирует систему кооперативных участков. Подробнее...
 
void branch::createdec (eosio::name coopname, eosio::checksum256 hash, eosio::name type, eosio::name initiator, document2 proposal, eosio::name braname, std::vector< decision_point > agenda)
 Объявление собрания пайщиков с повесткой (создание решения). Универсальный механизм: тип "free" — свободное решение (фиксируется протоколом), тип "createbranch" — автоматизируемое (после утверждения уходит в совет и создаёт КУ). Подробнее...
 
void branch::declauth (eosio::name coopname, eosio::name username, eosio::checksum256 approval_hash, std::string reason)
 Запрет отклонения доверенности председателя кооперативного участка. Callback отклонения совета: к этому моменту решение об учреждении кооперативного участка уже принято советом и участок создан, поэтому доверенность председателю участка отклонить нельзя — председателю совета остаётся только подписать её встречной подписью (см. branch::apprauth). Действие всегда завершается ошибкой. Подробнее...
 
void branch::declinedec (eosio::name coopname, eosio::checksum256 hash, std::string reason)
 Отклонение решения советом. Callback совета: при отказе совета запись решения и вопросы повестки стираются, причина передаётся аргументом (история — в журнале действий). Подробнее...
 
void branch::declliab (eosio::name coopname, eosio::name username, eosio::checksum256 approval_hash, std::string reason)
 Запрет отклонения договора о материальной ответственности председателя участка. Callback отклонения совета: к этому моменту решение об учреждении кооперативного участка уже принято советом и участок создан, поэтому договор о материальной ответственности отклонить нельзя — председателю совета остаётся только подписать его встречной подписью (см. branch::apprliab). Действие всегда завершается ошибкой, тем самым гарантируя, что процесс не уйдёт в неопределённое состояние. Подробнее...
 
void branch::decltrusted (eosio::name coopname, eosio::checksum256 hash, std::string reason)
 Отклонение заявки доверенного лица председателем участка. Заявка стирается, причина передаётся аргументом (история — в журнале действий). Подробнее...
 
void branch::deletebranch (eosio::name coopname, eosio::name braname)
 Удаление кооперативного участка. Удаляет существующий кооперативный участок и отключает его участников. При удалении участка, когда остается менее 3 участков, автоматически отключает систему кооперативных участков. Подробнее...
 
void branch::deltrusted (eosio::name coopname, eosio::name braname, eosio::name trusted)
 Удаление доверенного лица из кооперативного участка. Удаляет доверенное лицо из существующего кооперативного участка. Подробнее...
 
void branch::delwhite (eosio::name coopname, eosio::name braname, eosio::name account)
 Удаление аккаунта из белого списка кооперативного участка. Удаляет аккаунт пайщика из белого списка приватного кооперативного участка. Подробнее...
 
void branch::editbranch (eosio::name coopname, eosio::name braname, eosio::name trustee)
 Редактирование кооперативного участка. Изменяет председателя существующего кооперативного участка. Подробнее...
 
void branch::exec (eosio::name coopname, eosio::checksum256 hash, document2 petition, document2 liability, document2 authority)
 Исполнение утверждённого решения о создании кооперативного участка. Председатель собрания формирует заявление в совет и выводит вопрос об учреждении кооперативного участка на рассмотрение совета. К повестке совета прилагаются протокол собрания и бюллетени (по тому же якорю процесса). Подробнее...
 
void branch::joindec (eosio::name coopname, eosio::checksum256 hash, eosio::name username)
 Присоединение пайщика к собранию. Пайщик фиксируется в списке участников собрания. Подробнее...
 
void branch::reqtrusted (eosio::name coopname, eosio::name braname, eosio::name username, eosio::checksum256 hash, document2 application, document2 authority)
 Подача заявки на приём доверенным лицом кооперативного участка. Пайщик прикладывает подписанные заявление и договор о полной материальной ответственности. Заявка ожидает одобрения председателя участка. Подробнее...
 
void branch::setprivate (eosio::name coopname, eosio::name braname, bool is_private)
 Установка признака приватности кооперативного участка. Приватный кооперативный участок нельзя выбрать при вступлении или смене участка, если аккаунт пайщика не добавлен в белый список этого участка. Подробнее...
 
void branch::startdec (eosio::name coopname, eosio::checksum256 hash, eosio::name chairman, std::string address, std::vector< decision_point > agenda)
 Открытие голосования по решению. Организатор собрания (он же председатель собрания) открывает голосование, указывая избираемого председателя кооперативного участка (из числа присоединившихся участников) и — для решения "createbranch" — адрес привязки кооперативного участка, определённый собранием. Окно голосования отмеряется автоматически (DECISION_VOTING_WINDOW_SECONDS). Подробнее...
 
void branch::votedec (eosio::name coopname, eosio::checksum256 hash, eosio::name username, document2 ballot, std::vector< decision_vote_point > votes)
 Голосование по вопросам повестки бюллетенем. Участник подаёт бюллетень-заявление с волеизъявлением (за/против/воздержался) по каждому вопросу повестки. Подсчёт ведёт контракт. Адаптация meet::vote. Подробнее...
 

Подробное описание

Функции

◆ accrue()

void branch::accrue ( eosio::name  coopname,
eosio::name  braname,
eosio::name  source_contract,
eosio::asset  amount,
eosio::name  process_type,
eosio::checksum256  process_hash,
std::string  memo 
)

Зачисление поступивших членских взносов КУ в общий кошелёк участка (o.brn.common, 100% суммы). Вызывается inline контрактом-источником (marketplace) при финализации заказа.

Зачисление поступивших членских взносов в общий кошелёк кооперативного участка (requirement b6 «Экономика КУ», раунд 5; процесс p.brn.fees).

Вызывается inline контрактом-источником (сегодня — marketplace при финализации заказа, signiss2): 100% фактического членского взноса уходит в общий кошелёк КУ (o.brn.common, username = braname) — приоритет общего кошелька (решение владельца 2026-06-10). Немедленного персонального распределения нет: дальнейшее использование — отдельные команды председателя (distribute / createexp) после контроля планового резерва расходов бэкендом.

Средства физически уходят с пула w.mkt.fee — он пополнен операцией o.mkt.fee при создании заказа, неиспользованная часть уже возвращена источником через o.mkt.refund.

Имя нитки процесса (process_type) передаёт контракт-источник: зачисление идёт внутри его нитки (у marketplace — поставка по хэшу заказа), поэтому сама операция не может называть процесс. Пока имя выводилось из кода операции, поставка подписывалась «Членские взносы кооперативного участка».

Guards:

  • авторизация: кооператив либо системный контракт из whitelist;
  • сумма в валюте кооператива, больше нуля;
  • имя нитки известно реестру процессов (проверяет ledger2::apply).

◆ addtrusted()

void branch::addtrusted ( eosio::name  coopname,
eosio::name  braname,
eosio::name  trusted 
)

Добавление доверенного лица в кооперативный участок. Добавляет нового доверенного лица в существующий кооперативный участок. Максимальное количество доверенных лиц на один участок - 3.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка
trustedДоверенное лицо для добавления (должно быть физическим лицом)
Заметки
Авторизация требуется от аккаунта: coopname

◆ addwhite()

void branch::addwhite ( eosio::name  coopname,
eosio::name  braname,
eosio::name  account 
)

Добавление пайщика в белый список кооперативного участка. Пайщики из белого списка могут выбрать приватный кооперативный участок при вступлении или смене участка. В белый список можно добавить любого пайщика кооператива.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка
accountАккаунт пайщика для добавления
Заметки
Авторизация требуется от аккаунта: coopname

◆ aidconfirm()

void branch::aidconfirm ( eosio::name  coopname,
eosio::checksum256  outcome_hash 
)

Callback от gateway::outcomplete — кассир подтвердил банковский перевод материальной помощи. Здесь применяются o.brn.aidtax (удержание налога, Дт 86 / Кт 68) и o.brn.aid (выплата, Дт 86 / Кт 51).

Callback от gateway о фактическом подтверждении выплаты материальной помощи (requirement b6 «Экономика КУ», процесс p.brn.aid).

Inline-action отправляется контрактом gateway из gateway::outcomplete после того, как кассир подтвердил реальный банковский перевод получателю. Здесь — единственное место, где применяется списание. С 2026-08-13 кооператив удерживает НДФЛ, поэтому сумма заявления расходится надвое:

  • Ledger2::apply(o.brn.aidtax, tax, …, hash=aid.hash) — TRANSFER w.brn.person → w.sov.ndfl, Дт 86 / Кт 68 (удержанный налог);
  • Ledger2::apply(o.brn.aid, net, …, hash=aid.hash) — BURN с w.brn.person получателя, Дт 86 / Кт 51 (выплата на руки).

Ровно ту же сумму net кассир увидел в исходящем платеже: она посчитана из aid.amount тем же BranchNdfl, поэтому расхождения между платёжкой и проводкой быть не может.

Выплата подтверждена — терминал жизненного цикла: запись заявления стирается из RAM, история — в журнале действий и в решении совета.

Guards:

  • require_auth(_gateway) — callback легитимен только от gateway-контракта;
  • заявление найдено по outcome_hash и одобрено советом (статус authorized): исходящий платёж создаётся только в onaidauth, поэтому иной статус означал бы выплату в обход решения совета.

◆ aiddecline()

void branch::aiddecline ( eosio::name  coopname,
eosio::checksum256  outcome_hash,
std::string  reason 
)

Callback от gateway::outdecline — перевод не состоялся; средства остаются на персональном кошельке, заявление закрывается.

Callback от gateway — попытка отменить выплату материальной помощи (requirement b6 «Экономика КУ», процесс p.brn.aid).

Действие обязано существовать: Gateway::create_outcome требует имя decline-callback'а в сигнатуре, иначе исходящий платёж не зарегистрировать. Но отмены в этом процессе нет — действие всегда падает.

Почему. Выплату материальной помощи разрешает совет (onaidauth), и кассир это решение не пересматривает: принятое решение исполняется. Единственная реальная причина «не смог заплатить» — неверные реквизиты получателя; она решается уточнением реквизитов у получателя, а не отменой решения совета. Отказ до выплаты возможен только на стороне совета — через onaiddecl, пока заявление в статусе proposed.

◆ apprauth()

void branch::apprauth ( eosio::name  coopname,
eosio::name  username,
eosio::checksum256  approval_hash,
document2  approved_document 
)

Встречная подпись председателя совета на доверенности председателя кооперативного участка. Callback одобрения совета: председатель совета подписал доверенность второй подписью (механизм soviet::confirmapprv проверил его подпись). Фиксируем полностью подписанную доверенность в реестре документов по якорю одобрения.

Аргументы
coopnameНаименование кооператива
usernameПредседатель кооперативного участка — уполномоченный по доверенности
approval_hashЯкорь одобрения (хэш документа доверенности)
approved_documentДоверенность с встречной подписью председателя совета
Заметки
Авторизация требуется от аккаунта: soviet

◆ apprliab()

void branch::apprliab ( eosio::name  coopname,
eosio::name  username,
eosio::checksum256  approval_hash,
document2  approved_document 
)

Встречная подпись председателя совета на договоре о полной материальной ответственности председателя кооперативного участка. Callback одобрения совета: председатель совета подписал договор второй подписью (механизм soviet::confirmapprv проверил его подпись). Фиксируем полностью подписанный договор в реестре документов по якорю процесса.

Аргументы
coopnameНаименование кооператива
usernameПредседатель кооперативного участка — сторона «Исполнитель»
approval_hashЯкорь процесса (хэш одобрения)
approved_documentДоговор с встречной подписью председателя совета
Заметки
Авторизация требуется от аккаунта: soviet

◆ apprtrusted()

void branch::apprtrusted ( eosio::name  coopname,
eosio::checksum256  hash,
document2  countersigned,
document2  countersigned_authority 
)

Одобрение заявки доверенного лица председателем участка. Председатель кооперативного участка накладывает встречную подпись на договор материальной ответственности и доверенность заявителя; оба полностью подписанных документа фиксируются в реестре документов, пайщик добавляется в список доверенных лиц участка, заявка стирается.

Аргументы
coopnameНаименование кооператива
hashВнешний идентификатор заявки
countersignedДоговор материальной ответственности со встречной подписью председателя участка
countersigned_authorityДоверенность доверенному лицу со встречной подписью председателя участка
Заметки
Авторизация требуется от аккаунта: coopname

◆ canceldec()

void branch::canceldec ( eosio::name  coopname,
eosio::checksum256  hash,
std::string  reason 
)

Отмена собрания инициатором до вывода на совет. Инициатор сворачивает собрание, пока решение не ушло в совет; запись и вопросы повестки стираются, причина передаётся аргументом (история — в журнале действий).

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
reasonПричина отмены
Заметки
Авторизация требуется от аккаунта: coopname

◆ closedec()

void branch::closedec ( eosio::name  coopname,
eosio::checksum256  hash,
document2  protocol 
)

Закрытие собрания и утверждение протокола председателем. Председатель закрывает голосование и утверждает протокол одной своей подписью (секретарь не нужен — подсчёт ведёт контракт). Проверяется кворум и итог голосования. Для типа "free" — терминал: запись стирается (история — в журнале). Для "createbranch" — решение переходит в статус "approved" в ожидании исполнения действием exec (вывод вопроса на совет).

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
protocolПодписанный председателем протокол решения
Заметки
Авторизация требуется от аккаунта: coopname

◆ confirmdec()

void branch::confirmdec ( eosio::name  coopname,
eosio::checksum256  hash,
document2  authorization 
)

Подтверждение решения советом — создание кооперативного участка. Callback совета: по утверждению учреждается кооперативный участок с реквизитами из решения (аккаунт участка, избранный председатель), после чего запись решения стирается (история — в журнале действий).

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
authorizationДокумент решения совета
Заметки
Авторизация требуется от аккаунта: soviet

◆ convert()

void branch::convert ( eosio::name  coopname,
eosio::name  username,
eosio::checksum256  convert_hash,
eosio::asset  amount 
)

Перевод персональных средств доверенного в членский кошелёк «Стола заказов» (o.brn.conv) — для заказов как обычный пайщик.

Перевод персональных средств доверенного КУ в членский кошелёк «Стола заказов» (requirement b6 «Экономика КУ», процесс p.brn.fees).

Одна ledger2-операция:

  • o.brn.conv (TRANSFER w.brn.person → w.mkt.member, без проводки — оба кошелька на счёте 86): распределённые членские средства доверенного становятся членскими средствами «Стола заказов», и он заказывает имущество как обычный пайщик.

Guards:

  • amount > 0 в валюте кооператива;
  • доверенный — активный пайщик кооператива;
  • достаточность L3-средств на w.brn.person и подписанная программа «Стола заказов» для w.mkt.member проверяются внутри ledger2::walletop.
Заметки
Авторизация требуется от аккаунта: coopname (инициирует сам доверенный из ЛК стола ПВЗ, право проверяет бэкенд).

◆ createaid()

void branch::createaid ( eosio::name  coopname,
eosio::name  username,
eosio::name  braname,
eosio::checksum256  aid_hash,
eosio::asset  amount,
document2  statement,
std::string  meta 
)

Заявление на материальную помощь доверенного из его персонального кошелька: подписанное заявление вносится на повестку совета (type=brnaid). Исходящий платёж кассиру создаётся только после решения совета — в callback'е onaidauth.

Заявление на материальную помощь доверенного/председателя КУ (requirement b6 «Экономика КУ», процесс p.brn.aid).

Источник — собственный персональный кошелёк членских средств получателя (w.brn.person), пополненный распределением членских взносов участка. Получатель сам подписывает заявление.

НДФЛ удерживает кооператив: он выступает налоговым агентом и перечисляет получателю сумму за вычетом налога (решение владельца 2026-08-13, отменяет прежний порядок «налог платит получатель сам»). amount здесь — сумма заявления целиком: именно она списывается с персонального кошелька, а разбивка на выплату и удержание считается в BranchNdfl на шаге выплаты.

Действие НЕ применяет ledger2 и НЕ создаёт исходящий платёж. Материальная помощь выводит деньги из кооператива, поэтому решение о выплате принимает совет: здесь заявление лишь вносится на повестку (soviet::createagenda, type=brnaid) со статусом proposed. Регистрация исходящего платежа в gateway происходит в callback'е onaidauth после положительного решения; при отказе совета срабатывает onaiddecl и заявление закрывается, не доходя до кассира. Списание выполняется ещё позже — в aidconfirm, после фактического банковского перевода кассиром, и идёт двумя операциями: o.brn.aidtax (удержание, Дт 86 / Кт 68) и o.brn.aid (выплата, Дт 86 / Кт 51).

Средства под заявление не блокируются ни на одном шаге: если к моменту подтверждения кассиром баланса уже не хватает (получатель параллельно перевёл их в «Стол заказов»), списание упадёт и кассир не сможет подтвердить выплату.

Guards:

  • amount > 0 в валюте кооператива; заявление с таким hash не существует;
  • получатель — активный пайщик; заявление подписано получателем;
  • получатель — доверенное лицо либо председатель указанного участка;
  • на персональном кошельке достаточно средств на момент подачи.
Заметки
Авторизация требуется от аккаунта: coopname.

◆ createbranch()

void branch::createbranch ( eosio::name  coopname,
eosio::name  braname,
eosio::name  trustee 
)

Создание нового кооперативного участка. Создает новый кооперативный участок с указанным председателем. При создании третьего участка автоматически активирует систему кооперативных участков.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка
trusteeПредседатель кооперативного участка (должен быть физическим лицом)
Заметки
Авторизация требуется от аккаунта: coopname

◆ createdec()

void branch::createdec ( eosio::name  coopname,
eosio::checksum256  hash,
eosio::name  type,
eosio::name  initiator,
document2  proposal,
eosio::name  braname,
std::vector< decision_point agenda 
)

Объявление собрания пайщиков с повесткой (создание решения). Универсальный механизм: тип "free" — свободное решение (фиксируется протоколом), тип "createbranch" — автоматизируемое (после утверждения уходит в совет и создаёт КУ).

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса (внешний идентификатор решения)
typeТип решения: "free" | "createbranch"
initiatorОрганизатор собрания
proposalПодписанное предложение/повестка
branameЗаранее сгенерированный аккаунт будущего КУ (для "createbranch", иначе пустое)
agendaВопросы повестки дня
Заметки
Авторизация требуется от аккаунта: coopname

◆ createexp()

void branch::createexp ( eosio::name  coopname,
eosio::name  braname,
eosio::name  creator,
eosio::checksum256  expense_hash,
std::vector< ExpenseDomain::item items,
document2  statement 
)

Подать расход участка в шасси расходов: средства уходят из общего кошелька КУ в пул расходов (o.brn.expfnd), записка передаётся шасси — решение совета, оплата по реквизитам либо аванс под отчёт, отчёт, закрытие.

Подать расход кооперативного участка в шасси расходов (requirement b6 «Экономика КУ»; процесс p.brn.spend).

Участок — только инициатор. Сумма служебной записки уходит из общего кошелька членских взносов КУ в пул расходов участка (o.brn.expfnd) и перестаёт быть доступной распределению между участниками, после чего записка передаётся шасси расходов: решение совета, оплата по реквизитам либо выдача аванса под отчёт, отчёт с чеками, закрытие. На терминальном переходе шасси вызывает branch::onexpdone, где неизрасходованный остаток возвращается участку.

Транзит через пул нужен и по существу (видно, сколько средств участка отдано под расходы), и технически: шасси работает с кооперативным пулом, а общий кошелёк участка ведёт разрез по участку — прямой перевод между ними невозможен, операция несёт один username.

Механика оплаты задаётся по каждой позиции (аванс под отчёт пайщику либо прямая оплата организации) и проверяется шасси.

Guards:

  • записка подписана создателем; хотя бы одна позиция; сумма > 0;
  • КУ существует, создатель — председатель этого участка;
  • расход с таким идентификатором ещё не подавался;
  • достаточность средств проверяет сам перевод в книге учёта.
Заметки
Авторизация требуется от аккаунта: coopname.

◆ declauth()

void branch::declauth ( eosio::name  coopname,
eosio::name  username,
eosio::checksum256  approval_hash,
std::string  reason 
)

Запрет отклонения доверенности председателя кооперативного участка. Callback отклонения совета: к этому моменту решение об учреждении кооперативного участка уже принято советом и участок создан, поэтому доверенность председателю участка отклонить нельзя — председателю совета остаётся только подписать её встречной подписью (см. branch::apprauth). Действие всегда завершается ошибкой.

Аргументы
coopnameНаименование кооператива
usernameПредседатель кооперативного участка — уполномоченный по доверенности
approval_hashЯкорь одобрения (хэш документа доверенности)
reasonПричина отклонения (не используется)
Заметки
Авторизация требуется от аккаунта: soviet

◆ declinedec()

void branch::declinedec ( eosio::name  coopname,
eosio::checksum256  hash,
std::string  reason 
)

Отклонение решения советом. Callback совета: при отказе совета запись решения и вопросы повестки стираются, причина передаётся аргументом (история — в журнале действий).

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
reasonПричина отклонения
Заметки
Авторизация требуется от аккаунта: soviet

◆ declliab()

void branch::declliab ( eosio::name  coopname,
eosio::name  username,
eosio::checksum256  approval_hash,
std::string  reason 
)

Запрет отклонения договора о материальной ответственности председателя участка. Callback отклонения совета: к этому моменту решение об учреждении кооперативного участка уже принято советом и участок создан, поэтому договор о материальной ответственности отклонить нельзя — председателю совета остаётся только подписать его встречной подписью (см. branch::apprliab). Действие всегда завершается ошибкой, тем самым гарантируя, что процесс не уйдёт в неопределённое состояние.

Аргументы
coopnameНаименование кооператива
usernameПредседатель кооперативного участка — сторона «Исполнитель»
approval_hashЯкорь процесса (хэш одобрения)
reasonПричина отклонения (не используется)
Заметки
Авторизация требуется от аккаунта: soviet

◆ decltrusted()

void branch::decltrusted ( eosio::name  coopname,
eosio::checksum256  hash,
std::string  reason 
)

Отклонение заявки доверенного лица председателем участка. Заявка стирается, причина передаётся аргументом (история — в журнале действий).

Аргументы
coopnameНаименование кооператива
hashВнешний идентификатор заявки
reasonПричина отклонения
Заметки
Авторизация требуется от аккаунта: coopname

◆ deletebranch()

void branch::deletebranch ( eosio::name  coopname,
eosio::name  braname 
)

Удаление кооперативного участка. Удаляет существующий кооперативный участок и отключает его участников. При удалении участка, когда остается менее 3 участков, автоматически отключает систему кооперативных участков.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка для удаления
Заметки
Авторизация требуется от аккаунта: coopname

◆ deltrusted()

void branch::deltrusted ( eosio::name  coopname,
eosio::name  braname,
eosio::name  trusted 
)

Удаление доверенного лица из кооперативного участка. Удаляет доверенное лицо из существующего кооперативного участка.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка
trustedДоверенное лицо для удаления
Заметки
Авторизация требуется от аккаунта: coopname

◆ delweight()

void branch::delweight ( eosio::name  coopname,
eosio::name  braname,
eosio::name  contract,
eosio::name  username 
)

Исключение участника из распределения (вес удаляется, доли остальных перебалансируются автоматически).

Исключение участника из распределения членских взносов КУ (requirement b6 «Экономика КУ»).

Запись веса удаляется, Σ весов уменьшается — доли оставшихся участников перебалансируются автоматически на следующих начислениях. Ничего не блокируется и не переносится в общий кошелёк (решение владельца 2026-06-10). Уже распределённые средства остаются на персональном кошельке участника.

Заметки
Авторизация требуется от аккаунта: coopname.

◆ delwhite()

void branch::delwhite ( eosio::name  coopname,
eosio::name  braname,
eosio::name  account 
)

Удаление аккаунта из белого списка кооперативного участка. Удаляет аккаунт пайщика из белого списка приватного кооперативного участка.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка
accountАккаунт пайщика для удаления
Заметки
Авторизация требуется от аккаунта: coopname

◆ distribute()

void branch::distribute ( eosio::name  coopname,
eosio::name  braname,
eosio::name  source_contract,
eosio::checksum256  round_hash,
eosio::asset  amount,
std::string  memo 
)

Ручное распределение средств общего кошелька КУ между председателем и доверенными по весам реестра: команда председателя, сумма раскладывается по весам (o.brn.release + o.brn.person), остаток округления остаётся в общем кошельке. Можно частично и многократно. Плановый резерв расходов (30 дней) контролирует бэкенд до вызова.

Ручное распределение средств общего кошелька кооперативного участка (requirement b6 «Экономика КУ», раунд 5; процесс p.brn.fees).

Команда председателя КУ (НЕ автоматическое действие при финализации заказа — приоритет общего кошелька, решение владельца 2026-06-10): председатель указывает сумму, она раскладывается по весам реестра weights (braname, source_contract). Можно распределять не всё и несколько раз. Плановый резерв расходов (30 дней) контролирует бэкенд до отправки транзакции — гард сознательно оффчейн до шасси расходов.

Раскладка per-доверенный — двухходовка (walletop несёт один username, прямой TRANSFER между USER_SHARED-разрезами braname → доверенный невозможен):

  • o.brn.release: TRANSFER w.brn.common → w.brn.pool (username = braname);
  • o.brn.person: TRANSFER w.brn.pool → w.brn.person (username = доверенный).

Обе ноги выполняются на фактическую долю (целочисленно, вниз), поэтому транзитный пул w.brn.pool в нуле после транзакции, а остаток округления вообще не покидает общий кошелёк. Состояния в RAM раунд не оставляет: история распределений собирается парсером из самого действия (таблица blockchain_actions), round_hash — process_hash ledger2-операций.

Guards:

  • авторизация: кооператив либо системный контракт из whitelist (председательство проверяет бэкенд — все пути идут через контроллер);
  • сумма в валюте кооператива, больше нуля;
  • веса настроены (Σ весов > 0);
  • достаточность общего кошелька проверяет сам ledger2 при o.brn.release.

◆ editbranch()

void branch::editbranch ( eosio::name  coopname,
eosio::name  braname,
eosio::name  trustee 
)

Редактирование кооперативного участка. Изменяет председателя существующего кооперативного участка.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка
trusteeНовый председатель кооперативного участка (должен быть физическим лицом)
Заметки
Авторизация требуется от аккаунта: coopname

◆ exec()

void branch::exec ( eosio::name  coopname,
eosio::checksum256  hash,
document2  petition,
document2  liability,
document2  authority 
)

Исполнение утверждённого решения о создании кооперативного участка. Председатель собрания формирует заявление в совет и выводит вопрос об учреждении кооперативного участка на рассмотрение совета. К повестке совета прилагаются протокол собрания и бюллетени (по тому же якорю процесса).

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
petitionПодписанное заявление председателя в совет
liabilityПодписанный председателем участка договор о полной материальной ответственности
authorityПодписанная председателем участка доверенность председателю кооперативного участка
Заметки
Авторизация требуется от аккаунта: coopname

◆ init()

void branch::init ( )

Инициализация контракта кооперативных участков. Выполняет начальную настройку контракта.

Заметки
Авторизация требуется от аккаунта: _system

◆ joindec()

void branch::joindec ( eosio::name  coopname,
eosio::checksum256  hash,
eosio::name  username 
)

Присоединение пайщика к собранию. Пайщик фиксируется в списке участников собрания.

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
usernameИмя присоединяющегося пайщика
Заметки
Авторизация требуется от аккаунта: coopname

◆ migrate()

void branch::migrate ( )

Инициализация контракта кооперативных участков. Выполняет начальную настройку контракта.

Заметки
Авторизация требуется от аккаунта: _branch

◆ onaidauth()

void branch::onaidauth ( eosio::name  coopname,
eosio::checksum256  hash,
document2  authorization 
)

Callback от soviet — совет одобрил выплату материальной помощи. Заявление переходит в authorized, протокол сохраняется, и регистрируется исходящий платёж в gateway — заявка попадает к кассиру.

Callback контракта Soviet — совет принял положительное решение по заявлению на материальную помощь (requirement b6, процесс p.brn.aid).

Приходит inline-вызовом из soviet::authorize_action_effect после того, как совет проголосовал за выплату и председатель подписал протокол. Здесь заявление переходит proposed → authorized, протокол совета сохраняется в записи, и только теперь регистрируется исходящий платёж в gateway — заявка появляется у кассира в реестре исходящих платежей.

Само списание o.brn.aid (Дт 86 / Кт 51) и удержание налога o.brn.aidtax (Дт 86 / Кт 68) произойдут ещё позже — в callback'е aidconfirm, после фактического банковского перевода кассиром.

Guards:

  • require_auth(_soviet);
  • заявление найдено по hash решения и находится в статусе proposed (защита от повторного или позднего callback'а).

◆ onaiddecl()

void branch::onaiddecl ( eosio::name  coopname,
eosio::checksum256  hash,
std::string  reason 
)

Callback от soviet — совет отказал в выплате либо срок рассмотрения истёк. Заявление закрывается, не доходя до кассира; средства остаются на персональном кошельке.

Callback контракта Soviet — совет отказал в выплате материальной помощи либо срок рассмотрения заявления истёк (requirement b6, p.brn.aid).

Приходит inline-вызовом из soviet::decline_and_erase_decision (голоса «против» либо просрочка повестки). Заявление закрывается, не доходя до кассира: исходящий платёж не создавался, ledger2-операций не было, средства так и остались на персональном кошельке получателя — он может распорядиться ими иначе или подать заявление повторно.

Guards:

  • require_auth(_soviet);
  • заявление найдено по hash решения и находится в статусе proposed (одобренное заявление отзывается уже кассиром через aiddecline).

◆ onexpdone()

void branch::onexpdone ( eosio::name  coopname,
eosio::checksum256  expense_hash,
uint8_t  status,
eosio::asset  total_actual,
std::vector< char >  data 
)

Callback шасси расходов — расход завершён (отклонён советом либо закрыт). Неизрасходованный остаток возвращается в общий кошелёк участка (o.brn.expunf), запись расхода стирается.

Callback шасси расходов — расход участка завершён (requirement b6 «Экономика КУ»; процесс p.brn.spend).

Приходит inline-вызовом из шасси на терминальном переходе служебной записки: совет отклонил расход либо расход закрыт после отчёта. Всё, что из выделенных средств не было потрачено, возвращается в общий кошелёк участка (o.brn.expunf) и снова становится доступным распределению:

  • отклонение — возвращается вся сумма (оплат до отклонения быть не может);
  • закрытие — возвращается разница между выделенным и фактически потраченным (в том числе после возврата пайщиком остатка аванса).

Расход завершён — запись участка стирается из RAM, история движений остаётся в журнале действий.

Guards:

  • require_auth(_expense) — вызывает только шасси расходов;
  • расход найден по идентификатору записки;
  • потрачено не больше, чем было выделено.

◆ reqtrusted()

void branch::reqtrusted ( eosio::name  coopname,
eosio::name  braname,
eosio::name  username,
eosio::checksum256  hash,
document2  application,
document2  authority 
)

Подача заявки на приём доверенным лицом кооперативного участка. Пайщик прикладывает подписанные заявление и договор о полной материальной ответственности. Заявка ожидает одобрения председателя участка.

Аргументы
coopnameНаименование кооператива
branameКооперативный участок
usernameЗаявитель
hashВнешний идентификатор заявки
applicationПодписанный заявителем договор о полной материальной ответственности
authorityПодписанная заявителем доверенность доверенному лицу/оператору участка
Заметки
Авторизация требуется от аккаунта: coopname

◆ retfee()

void branch::retfee ( eosio::name  coopname,
eosio::name  braname,
eosio::name  source_contract,
eosio::asset  amount,
eosio::name  process_type,
eosio::checksum256  process_hash,
std::string  memo 
)

Возврат членских взносов КУ из общего кошелька участка обратно в пул взносов программы-источника (o.brn.retfee) — инверсия accrue. Вызывается inline контрактом-источником (marketplace) при гарантийном возврате имущества, чтобы пайщику вернулась полная уплаченная сумма.

Возврат членских взносов из общего кошелька кооперативного участка в пул взносов программы-источника (процесс p.brn.fees) — точная инверсия accrue.

Вызывается inline контрактом-источником (сегодня — marketplace при приёме гарантийного возврата, accretrn): доля членского взноса, приходящаяся на возвращаемое имущество, уходит из общего кошелька участка (o.brn.retfee, username = braname) обратно в пул взносов программы. Оттуда контракт-источник своей операцией возврата довозвращает её на членский кошелёк заказчика — пайщику возвращается полная уплаченная сумма, а не только стоимость имущества.

Двухходовка нужна из-за инварианта walletop «один username на обе стороны»: прямой перевод с общего кошелька участка (разрез по braname) на кошелёк пайщика (разрез по пайщику) невозможен, поэтому транзит идёт через кооперативный пул взносов программы.

Guards:

  • авторизация: кооператив либо системный контракт из whitelist;
  • сумма в валюте кооператива, больше нуля;
  • средств в общем кошельке участка достаточно. Взнос попадает в общий кошелёк сразу при выдаче заказа, а возврат приходит в течение гарантийного срока — к этому моменту участок мог уже распределить или потратить эти средства. Тогда приём возврата не проходит, и председатель сперва пополняет общий кошелёк участка.

◆ setprivate()

void branch::setprivate ( eosio::name  coopname,
eosio::name  braname,
bool  is_private 
)

Установка признака приватности кооперативного участка. Приватный кооперативный участок нельзя выбрать при вступлении или смене участка, если аккаунт пайщика не добавлен в белый список этого участка.

Аргументы
coopnameНаименование кооператива
branameНаименование кооперативного участка
is_privateПризнак приватности (true — приватный, false — публичный)
Заметки
Авторизация требуется от аккаунта: coopname

◆ setweight()

void branch::setweight ( eosio::name  coopname,
eosio::name  braname,
eosio::name  contract,
eosio::name  username,
uint64_t  weight 
)

Председатель КУ задаёт/меняет вес участника в распределении членских взносов от контракта-источника. Доля = вес / Σ весов.

Назначение/изменение веса участника в распределении членских взносов кооперативного участка (requirement b6 «Экономика КУ»).

Условия распределения задаются per (КУ, контракт-источник): сегодня источник — «Стол заказов» (marketplace), той же методикой управляются финансы КУ других потребительских программ. Доля участника = вес / Σ весов; изменение состава перебалансирует доли автоматически на следующих начислениях.

Guards:

  • КУ существует; участник — председатель (trustee) или доверенный КУ.
  • weight > 0 (исключение из распределения — delweight).
Заметки
Авторизация требуется от аккаунта: coopname (назначение — прерогатива председателя КУ, право проверяет бэкенд).

◆ startdec()

void branch::startdec ( eosio::name  coopname,
eosio::checksum256  hash,
eosio::name  chairman,
std::string  address,
std::vector< decision_point agenda 
)

Открытие голосования по решению. Организатор собрания (он же председатель собрания) открывает голосование, указывая избираемого председателя кооперативного участка (из числа присоединившихся участников) и — для решения "createbranch" — адрес привязки кооперативного участка, определённый собранием. Окно голосования отмеряется автоматически (DECISION_VOTING_WINDOW_SECONDS).

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
chairmanИзбираемый председатель кооперативного участка (из участников)
addressАдрес привязки кооперативного участка (для "createbranch")
agendaИтоговая повестка собрания: если непуста — заменяет предварительную (уточнённые на собрании формулировки и дополнительные вопросы); пустая — повестка без изменений
Заметки
Авторизация требуется от аккаунта: coopname

◆ votedec()

void branch::votedec ( eosio::name  coopname,
eosio::checksum256  hash,
eosio::name  username,
document2  ballot,
std::vector< decision_vote_point votes 
)

Голосование по вопросам повестки бюллетенем. Участник подаёт бюллетень-заявление с волеизъявлением (за/против/воздержался) по каждому вопросу повестки. Подсчёт ведёт контракт. Адаптация meet::vote.

Аргументы
coopnameНаименование кооператива
hashЯкорь процесса
usernameИмя голосующего участника
ballotПодписанный бюллетень
votesМассив голосов по вопросам повестки
Заметки
Авторизация требуется от аккаунта: coopname