# Приёмка liderra.ru — ПУНКТ PR3: выставить балансы под сценарии

> **Для исполнителя:** формат PR1 (одобрен 20.06). Каждый шаг = `🔧 Код-факт (file:line)` · `🎬 Действие` · `📋 ОТЧЁТ (было→ожидали→стало + 📸/📝)` · `❌ Если не так`. Техника — «под капотом», владельцу в эфир — человеческие карточки.

**Цель:** подготовить балансы клиентов под будущие проверки — у одного клиента (C4) сделать **маленький баланс 600 ₽** (чтобы показать заморозку/нехватку денег), а у остальных при нагрузочном прогоне поднять баланс **до ~10 млн ₽** (чтобы хватило на тысячи заявок). И показать, что баланс на дашборде меняется ровно на ту сумму.

**Что снимаем глазами:** **Дашборд** клиента (число баланса + «хватит на … дней») и **Биллинг** (кошелёк) — живые 📸.

**Источник сценария:** R1 карточка PR3 (`docs/superpowers/runbooks/2026-06-18-acceptance-r1-provisioning.md`); план PR1 «Шаг C1».

---

## 🔧 Код-факты (подтверждено чтением 20.06)

- Баланс клиента — поле `tenants.balance_rub` (рубли, 2 знака).
- **Списание** (вниз) — единственный путь через реестр, bcmath: `balance_rub -= цена` — [LedgerService.php:72-84](../../../app/app/Services/Billing/LedgerService.php#L72-L84).
- **Пополнение (вверх) законно** — админ-кредит: append-only транзакция `type='topup'` + новый баланс + запись в аудит — [AdminBillingController::refund :79-142](../../../app/app/Http/Controllers/Api/AdminBillingController.php#L79-L142).
- Клиентского самопополнения/счетов **пока нет** — G5 заглушка (ждёт регистрации ООО). Поэтому под тест баланс выставляем **админ-кредитом (прод)** или **сидом/SQL (локально)**, а не клиентским потоком.
- Баланс на **дашборде**: `balance.amount_rub` + `runway_days` («хватит на … дней») — [DashboardController.php:142-144](../../../app/app/Http/Controllers/Api/DashboardController.php#L142-L144); запас считается от цены тарифа — [:118-124](../../../app/app/Http/Controllers/Api/DashboardController.php#L118-L124).
- Локальный засев фондирует баланс **100 000 ₽** на клиента — [ImitationSeedCommand :73](../../../app/app/Console/Commands/Imitation/ImitationSeedCommand.php#L73).

---

## Целевые балансы (R1 PR3)

| Клиент | Старт (после засева) | Цель PR3 | Зачем |
|---|---|---|---|
| C4 | 100 000 ₽ | **600 ₽** | маленький — показать нехватку/заморозку (пункт #9) |
| C1–C3, C5–C7 | 100 000 ₽ | **~10 000 000 ₽** (только под нагрузку R4) | чтобы хватило на тысячи заявок |

> Для обычных проверок (#1–#26) хватает базовых 100 000 ₽ — подъём до 10 млн нужен **только** перед нагрузочным прогоном R4. C4 в 600 ₽ выставляем сразу.

---

## Шаг PR3-1 — Опустить баланс C4 до 600 ₽

**🔧 Код:** поле `tenants.balance_rub`; дашборд — [DashboardController :142-144](../../../app/app/Http/Controllers/Api/DashboardController.php#L142-L144).
**🎬 Действие (лок):** выставить C4 баланс 600 ₽ (через сид-правку/SQL `UPDATE tenants SET balance_rub='600.00' WHERE id=<C4>`).
**🎬 Действие (прод):** админ-кредит/корректировка через [refund :79-142](../../../app/app/Http/Controllers/Api/AdminBillingController.php#L79-L142) (append-only + аудит), без прямого UPDATE.

**📋 ОТЧЁТ:**
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Баланс C4 на дашборде | 100 000 ₽ (или 300 ₽ если онбординг) | **600 ₽** | _(слот прогона)_ | 📸 Дашборд C4 (600 ₽) |
| «Хватит на … дней» | большое число | пересчитано под 600 ₽ (мало) | _(слот)_ | 📸 тот же экран (runway) |
| Баланс в базе | старый | `600.00` | _(слот)_ | 📝 SQL `SELECT id,balance_rub FROM tenants WHERE id=<C4>` |

**💡 Что внутри:** у C4 специально оставляем мало денег — на 1 заявку (500 ₽) хватит, на вторую уже нет. На этом клиенте потом покажем, что портал не уходит в минус: при нехватке заявка не доставляется, проект встаёт на паузу.

**❌ Если не так:** баланс не изменился / дашборд показывает старое → проверить кэш/тенанта; на проде прямой UPDATE вместо аудируемого кредита → нарушение append-only.

---

## Шаг PR3-2 — Поднять C1–C3, C5–C7 до ~10 млн (только под нагрузку R4)

**🔧 Код:** те же `balance_rub` / refund / дашборд (ссылки выше).
**🎬 Действие (лок):** `UPDATE tenants SET balance_rub='10000000.00' WHERE id IN (<C1,C2,C3,C5,C6,C7>)`.
**🎬 Действие (прод):** админ-кредит крупной суммой через refund (append-only + аудит).

**📋 ОТЧЁТ:**
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Баланс одного из C1–C3/C5–C7 | 100 000 ₽ | ~10 000 000 ₽ | _(слот)_ | 📸 Дашборд клиента (большой баланс) |
| «Хватит на … дней» | умеренно | большое число (запас под тысячи заявок) | _(слот)_ | 📸 тот же экран |
| Балансы в базе | старые | целевые у всех 6 | _(слот)_ | 📝 SQL `SELECT id,balance_rub FROM tenants WHERE id IN (…)` |

**💡 Что внутри:** перед «стресс-тестом» (когда вольём 500–1000 заявок) клиентам нужно много денег, иначе они закончатся на середине и мы проверим не нагрузку, а нехватку. Поэтому заранее наливаем большой баланс — это подготовка, не трата.

**❌ Если не так:** баланс не дотянул до требуемого под лимиты проектов → префлайт 409 при правке проектов (см. PR2 грабли).

---

## Шаг PR3-3 — Сверить все балансы разом

**🔧 Код:** `tenants.balance_rub`.
**🎬 Действие:** один запрос по всем 7 тест-клиентам — сверить с целевой таблицей.

**📋 ОТЧЁТ:**
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Балансы 7 клиентов | разные | C4=600 ₽; остальные = цель сценария | _(слот)_ | 📝 SQL `SELECT id,organization_name,balance_rub,status FROM tenants WHERE … ORDER BY id` |
| Вход в кабинеты | — | у каждого баланс на дашборде совпал с базой | _(слот)_ | 📸 сводный/по одному дашборду |

**❌ Если не так:** дашборд ≠ база → дефект отображения; статус не `active` → клиент не сможет работать.

---

## Verification PR3 (выход из пункта)
- [ ] 📸 Дашборд C4 = **600 ₽** (+ пересчитанный «хватит на дней»).
- [ ] 📸 (под R4) Дашборд хотя бы одного крупного клиента ~10 млн.
- [ ] 📝 SQL: балансы 7 клиентов = целевым; все `active`.
- [ ] (прод) подъём баланса сделан **аудируемым кредитом**, не прямым UPDATE.

## 📸 vs 📝 в этом пункте
- **📸 Скриншот:** Дашборд с числом баланса и «хватит на … дней»; Биллинг-кошелёк.
- **📝 Текст:** строки `tenants.balance_rub`, запись `topup` в реестре/аудите — глазами не видны.

## Грабли
- Дашборд может кэшировать — после правки баланса перезайти/обновить.
- На проде **только** аудируемый кредит (refund), иначе ломается денежный аудит #12 (цепочка).
- Подъём до 10 млн — **подготовка под R4**, не часть обычных проверок; для #1–#26 базовых 100 000 ₽ достаточно.
