Процесс, при котором кооператив возвращает ранее направленные в проект средства обратно в кошелёк программы «Благорост» — целиком или частично, не дожидаясь завершения проекта. Обратная операция к Аллокации средств в проект.
Возврат остатка при выбытии проекта — отдельный процесс: он происходит сам при финализации, удалении или отклонении проекта, и возвращает всё неизрасходованное одной суммой.
- Предусловие
- Обязательные условия:
- Проект в статусе 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: Зачисление в программу и последствия для участников
Действие: Возврат суммы в глобальный пул
Сумма зачисляется в свободный остаток программы и снова доступна для аллокации в другие проекты.
Сегменты всех участников проекта становятся неактуальными — как и после обычной аллокации, им потребуется обновление. Доступные участникам суммы уменьшатся пропорционально уменьшению пула, но ни у кого не опустятся ниже выданной ссуды.
- Постусловие
- После завершения процесса:
- Сумма возвращена в свободный остаток программы благороста
- Пулы проекта и коэффициенты пересчитаны
- Сегменты участников требуют обновления
- Средства доступны для повторной аллокации