# R1 — Провижининг тест-клиентов и проектов (приёмочный тест liderra.ru)

**Owner:** исполнитель | **Зависит от:** R0. Парный teardown — R5. База: `prod-logic-map.md` §2, §3, §10, §18.1.

## Назначение
Завести **7 тест-клиентов** и **16 проектов** (популяция для all-pairs/шеринга/нагрузки) с маркером `TEST-`, чтобы teardown их однозначно нашёл. Все остальные ранбуки работают на этой популяции.

## ⚠️ Два способа завести клиента
- **G1 онбординг** (после деплоя ~18.06): самозапись (почта+пароль+капча+код на почту+ИНН/DaData, старт-баланс 300₽) ИЛИ админ-создание. **Когда деплой приедет — часть клиентов завести через онбординг (это и тест онбординга), прочитать реальную реализацию на проде.**
- **SQL (сейчас, fallback):** прямой INSERT тенанта+юзера (sudo postgres, owner-escape), маркер `TEST-`, известный пароль (bcrypt), нужный баланс.

## ⚠️ Проекты — создавать через ПОРТАЛ, не прямым SQL
Прямой SQL-INSERT проекта **НЕ дёрнет** `SyncSupplierProjectJob` → у поставщика не появятся rt-проекты, не создадутся `supplier_projects`+pivot → инъекция B-канала не сматчится и S0 не проверить. Поэтому **проекты заводим как клиент через портал** (UI/API) — тогда online-режим сам синкает к поставщику (и это заодно тест пункта 2). Альтернатива: SQL-INSERT + вручную `SyncSupplierProjectJob::dispatch(id)` через artisan, но портал чище.

---

## Популяция

### Клиенты (7)
| Клиент | Старт-баланс | Почта | Назначение |
|---|---|---|---|
| C1 | 100 000 ₽ (для R4 — поднять до ~10 млн) | kdv1@bk.ru | основной, мульти-источник |
| C2 | 100 000 ₽ (R4: ~10 млн) | dummy | основной |
| C3 | 100 000 ₽ (R4: ~10 млн) | dummy | каскад СПб |
| C4 | **600 ₽** | stels_info@bk.ru | заморозка/ноль |
| C5 | 100 000 ₽ (R4: ~10 млн) | dummy | каскад Татарстан/перелив |
| C6 | 100 000 ₽ (R4: ~10 млн) | dummy | мульти-регион |
| C7 | 100 000 ₽ (R4: ~10 млн) | dummy | Москобл (не маппится) |

Коды регионов — **порядковые 1..89** (Москва=82, СПб=83, Татарстан=16, Москобл=56; НЕ ГИБДД).

### Проекты (16)
| P# | Клиент | Источник | Тип | Регионы старт | Лимит | Дни | Назначение |
|---|---|---|---|---|---|---|---|
| P1 | C1 | test-okna.ru | сайт | [82] | 10 | 127 | шеринг+каскад ф1 |
| P2 | C2 | test-okna.ru | сайт | [82] | 10 | 127 | шеринг |
| P3 | C3 | test-okna.ru | сайт | [83] | 10 | 127 | каскад точный-2 |
| P4 | C4 | test-okna.ru | сайт | [] вся РФ | 10 | 127 | каскад ф2 добор |
| P5 | C5 | test-okna.ru | сайт | [16] | 10 | 127 | каскад/перелив |
| P6 | C6 | test-okna.ru | сайт | [82,83] | 10 | 127 | мультирегион |
| P7 | C7 | test-okna.ru | сайт | [56] | 10 | 127 | регион не маппится |
| P8 | C1 | msk.test-okna.ru | сайт | [82] | 10 | 127 | субдомен→корень + double-test |
| P9 | C1 | 79990001122 | звонок | [82] | 10 | 127 | all-pairs звонок |
| P10 | C2 | 79990001122 | звонок | [82] | 10 | 127 | all-pairs звонок |
| P11 | C1 | TESTKW +слово «окна» | смс+слово | [82] | 10 | 127 | all-pairs смс+слово |
| P12 | C2 | TESTKW +слово «окна» | смс+слово | [82] | 10 | 127 | all-pairs смс+слово |
| P13 | C1 | TESTSMS | смс | [82] | 10 | 127 | all-pairs смс |
| P14 | C2 | TESTSMS | смс | [82] | 10 | 127 | all-pairs смс |
| P15 | C1 | test-direct.ru | DIRECT | [82] | 10 | 127 | all-pairs DIRECT |
| P16 | C2 | test-direct.ru | DIRECT | [82] | 10 | 127 | all-pairs DIRECT |

**rt у поставщика (итог): 12** (корень-сайт 3 · субдомен 3 · звонок 3 · смс+слово 2 · смс 1 · DIRECT 0).

---

## Карточки уровня C

### PR1 — Завести 7 тест-тенантов + пользователей
**§ref:** §10. **Способ:** онбординг (после деплоя — и тест) ИЛИ SQL (сейчас).
**Действие (SQL, owner-escape):** INSERT в `tenants` (name `TEST-C1..C7`, маркер) + `users` (email из таблицы, пароль = известный bcrypt-хеш, `tenant_id`, `is_active=true`). Стартовый баланс по таблице.
**Сверка:** `SELECT id,name,balance_rub FROM tenants WHERE name LIKE 'TEST-%'` → 7 строк; вход в портал каждым работает.
**Если не так:** не входит → проверь bcrypt-хеш/`is_active`; дубль email → почисти.
**Покрывает:** провижининг клиентов (+ онбординг-тест после деплоя).

### PR2 — Завести 16 проектов ЧЕРЕЗ ПОРТАЛ (online-синк к поставщику)
> **⚠️ Предусловие (N-7) — иначе создание проекта упрётся в гейт:**
> - **422 `requisites_required`** — создание проекта блокируется, если у тенанта нет **лёгких реквизитов** ([ProjectController.php:131-133](../../../app/app/Http/Controllers/Api/ProjectController.php#L131)). SQL-засев тенанта (PR1) даёт его **без** реквизитов. → ДО PR2 заполнить лёгкие реквизиты: `subject_type` + `contact_name` + `contact_phone` (+ИНН для ЮЛ/ИП) через портал/API.
> - **409** при нехватке баланса под лимит ([ProjectController.php:140-156](../../../app/app/Http/Controllers/Api/ProjectController.php#L140)). → выставить баланс **≥ Σ(лимиты)×тариф** ДО создания/подъёма лимитов (часть PR3 выполнить ПЕРЕД PR2, либо стартовый баланс из PR1 покрывает Σ лимитов).
>
> **§ref:** §2, §3. **Действие:** под каждым клиентом в портале создать его проект(ы) по таблице (тип/источник/регионы/лимит/дни). Online-режим → авто-`SyncSupplierProjectJob` → rt-проекты у поставщика + `supplier_projects` + pivot.
**Ожидаем:** 16 проектов в БД; у поставщика **12 rt-проектов** (`B*_test-okna.ru`, `B*_msk…`, `B*_799…`, `B2/B3_TESTKW`, `B3_TESTSMS`); pivot `project_supplier_links` заполнен (для B-каналов).
**Сверка:** `SELECT count(*) FROM projects WHERE tenant_id IN (<TEST>)` = 16; глазами админка поставщика = 12 rt; `SELECT count(*) FROM supplier_projects WHERE unique_key LIKE 'test-%' OR ...`.
**Если не так:** rt не появились → синк упал (логи §3) или режим не online; pivot пуст → инъекция B не сматчится.
**Покрывает:** создание проектов (= тест пункта 2 / S0), связка с поставщиком.

### PR3 — Балансы под сценарии
**Действие:** C4 = 600 ₽ (заморозка); под нагрузку R4 — поднять C1–C3,C5–C7 до ~10 млн (`UPDATE tenants.balance_rub` через админ append-only / SQL). Между all-pairs-прогонами баланс меняется по таблице переконфига (R3 Часть E).
**Покрывает:** B-измерение, нагрузочный баланс.

### PR4 — Скрипт teardown (парный, готовить вместе с провижинингом)
**§ref:** R5 TD3. **Что:** заранее собрать список id тест-тенантов и порядок каскадного DELETE (с trigger-bypass под postgres для audit-таблиц). Хранить рядом, выполнять в R5.
**Покрывает:** обратимость.

---

## Verification
- [ ] 7 тенантов `TEST-`, вход работает.
- [ ] 16 проектов; 12 rt у поставщика; pivot заполнен.
- [ ] C4 малый баланс; нагрузочные балансы готовы к R4.
- [ ] teardown-скрипт собран (R5).

## Troubleshooting
| Симптом | Причина | Фикс |
|---|---|---|
| rt у поставщика не появились | проект создан SQL-ом (без синка) / синк упал | создавать через портал; логи §3 |
| вход тест-клиентом не идёт | bcrypt/is_active | проверь хеш пароля, is_active |
| инъекция B не матчится | нет pivot/supplier_project | PR2 через портал |

## Rollback / Teardown
Полный teardown — R5 (TD1–TD5): rt у поставщика до 21:00 → слепки → DELETE тест-тенантов по `TEST-` (trigger-bypass) → проверка чистоты + сохранность tenant 2.

## Матрица покрытия R1
| Задача | Карточка |
|---|---|
| клиенты (онбординг/SQL) | PR1 |
| проекты через портал + rt у поставщика | PR2 |
| балансы (B + нагрузка) | PR3 |
| teardown-скрипт | PR4 |

**Чек-лист «не пропущено»:** ✅ 7 клиентов · ✅ 16 проектов через портал · ✅ 12 rt у поставщика · ✅ балансы · ✅ teardown-скрипт. **Дальше → R2 (инъекция) → R3 (прогон).**
