COOPENOMICS  v1
Кооперативная Экономика
Возврат средств из проекта в программу

Процесс, при котором кооператив возвращает ранее направленные в проект средства обратно в кошелёк программы «Благорост» — целиком или частично, не дожидаясь завершения проекта. Обратная операция к Аллокации средств в проект.

Возврат остатка при выбытии проекта — отдельный процесс: он происходит сам при финализации, удалении или отклонении проекта, и возвращает всё неизрасходованное одной суммой.

Предусловие
Обязательные условия:
  • Проект в статусе PENDING или ACTIVE (после начала голосования суммы уже участвуют в расчёте результата, двигать их нельзя)
  • Сумма возврата не превышает предела, рассчитанного контрактом
  • Авторизация от имени кооператива

sequenceDiagram participant К as Кооператив participant Контракт as Capital Contract participant Пр as Проект participant С as Сегменты участников participant П as Программа благороста К->>Контракт: 1. Запрос возврата суммы Note over Контракт: Проверка статуса проекта Контракт->>С: 2. Пересчёт суммы непогашенных ссуд Контракт->>Пр: 3. Расчёт предельной суммы возврата Note over Пр: Минимум из трёх ограничений Контракт->>Пр: 4. Уменьшение пулов и пересчёт коэффициентов Контракт->>П: 5. Зачисление суммы в программу Note over С: Участникам потребуется обновить сегменты

Пошаговое описание процесса

Шаг 1: Инициация возврата средств

Действие: Возврат средств из проекта

Кооператив указывает проект и сумму, которую хочет вернуть в программу.

Заметки
Авторизация требуется от аккаунта кооператива, подтверждая его право распоряжаться средствами программы благороста

Шаг 2: Проверка статуса проекта

Действие: Валидация статуса проекта

Возврат разрешён, пока проект в статусе PENDING или ACTIVE. С переходом на голосование суммы участвуют в расчёте результата, и изменение бюджета исказило бы уже начисленные доли.

Постусловие
Projects::get_project_or_fail подтверждает существование проекта

Шаг 3: Пересчёт непогашенных ссуд

Действие: Синхронизация агрегата ссуд проекта

Сумма непогашенных ссуд — производная от сегментов участников, поэтому перед расчётом предела она пересчитывается обходом сегментов проекта.

Постусловие
Capital::Projects::sync_total_debt обновляет поле total_debt_amount

Шаг 4: Расчёт предельной суммы возврата

Действие: Определение максимума, доступного к возврату

Предел — минимум из трёх ограничений:

Третье ограничение — ключевое. Без него у заёмщика перестал бы обновляться сегмент: обновление падало бы на проверке «доступная сумма не меньше выданных ссуд». Такой участник не смог бы ни внести результат, ни сконвертировать сегмент, а проект — никогда финализироваться.

Постусловие
Capital::Projects::calculate_max_deallocatable возвращает предельную сумму

Шаг 5: Уменьшение пулов проекта

Действие: Списание суммы и пересчёт коэффициентов

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

Постусловие
Capital::Core::deallocate_program_investment_from_project изменяет пулы проекта

Шаг 6: Зачисление в программу и последствия для участников

Действие: Возврат суммы в глобальный пул

Сумма зачисляется в свободный остаток программы и снова доступна для аллокации в другие проекты.

Сегменты всех участников проекта становятся неактуальными — как и после обычной аллокации, им потребуется обновление. Доступные участникам суммы уменьшатся пропорционально уменьшению пула, но ни у кого не опустятся ниже выданной ссуды.

Постусловие
После завершения процесса:
  1. Сумма возвращена в свободный остаток программы благороста
  2. Пулы проекта и коэффициенты пересчитаны
  3. Сегменты участников требуют обновления
  4. Средства доступны для повторной аллокации