# Приёмка liderra.ru — ПУНКТ №15: Сделки не теряются при удалении проекта

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

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

**Что снимаем глазами:** **Проекты** (попытка удаления → подсказка про паузу), **Сделки** (остались на месте). Живые 📸.

**Источник сценария:** свод проверок №15 (T-DELPROJ); R3 «движок».

> ⚠️ **Уточнение по коду (важно):** свод проверок формулировал пункт как «удалить проект со сделками → сделки сохранены». **По коду поведение строже:** проект со сделками **вообще нельзя удалить** (ответ 422 с подсказкой «поставьте на паузу»). Итог тот же — сделки не теряются, — но механизм другой (запрет удаления, а не удаление с сохранением). Свод по этому пункту стоит поправить.

---

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

- **Удаление проекта со сделками запрещено** — `delete` проверяет `deals WHERE project_id` и при наличии бросает **422** «Нельзя удалить проект: по нему есть сделки. Поставьте приём на паузу…» — [ProjectService.php:186-191](../../../app/app/Services/Project/ProjectService.php#L186-L191).
- **Перед этим — гард слепка поставщика** (приоритетнее): если по проекту уже «заказаны лиды», формулировка про слепок — [:184](../../../app/app/Services/Project/ProjectService.php#L184).
- **Удалить можно только пустой проект** (без сделок) — тогда hard delete, каскад чистит pivot/служебное — [:204](../../../app/app/Services/Project/ProjectService.php#L204).
- **Пауза как «уход» проекта** — `PATCH /api/projects/{id}/toggle-active` `is_active=false` скрывает проект из работы, сделки остаются — [ProjectController.php:264-282](../../../app/app/Http/Controllers/Api/ProjectController.php#L264-L282).

---

## Шаг 15-0 — Предусловие: проект со сделками

**🔧 Код:** сделки по проекту — [ProjectService::delete :186](../../../app/app/Services/Project/ProjectService.php#L186).
**🎬 Действие (лок):** взять проект, по которому уже есть доставленные сделки (после раздачи); зафиксировать число сделок.

**📋 ОТЧЁТ:**
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Сделки по проекту | — | есть N сделок | _(слот прогона)_ | 📸 Сделки (число); 📝 SQL `COUNT deals WHERE project_id` |

**❌ Если не так:** сделок нет → влить заявку этому проекту сначала.

---

## Шаг 15-1 — Удалить проект со сделками не дают (защита)

**🔧 Код:** [ProjectService::delete :186-191](../../../app/app/Services/Project/ProjectService.php#L186-L191).
**🎬 Действие (лок):** попробовать удалить этот проект в разделе Проекты.

**📋 ОТЧЁТ:**
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Попытка удаления | проект есть | **отказ** + подсказка «есть сделки, поставьте на паузу» | _(слот)_ | 📸 Проекты (сообщение об отказе) |
| Проект | — | остался (не удалён) | _(слот)_ | 📸 Проекты (проект на месте) |

**💡 Что внутри:** если по проекту уже прошли сделки, портал не даёт его удалить — иначе клиент мог бы случайно стереть историю своих заявок. Вместо удаления он предлагает поставить приём на паузу: проект перестаёт получать новые заявки, но все прошлые сделки остаются. Историю не потерять.

**❌ Если не так:** проект со сделками удалился → риск потери истории (дефект).

---

## Шаг 15-2 — Сделки на месте

**🔧 Код:** список сделок — [DealController::index :57-210](../../../app/app/Http/Controllers/Api/DealController.php#L57-L210).
**🎬 Действие (лок):** после отказа в удалении открыть Сделки.

**📋 ОТЧЁТ:**
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Сделки | N | **те же N** (ничего не потеряно) | _(слот)_ | 📸 Сделки (число не изменилось) |

**❌ Если не так:** число сделок изменилось → дефект.

---

## Шаг 15-3 — Пустой проект удаляется; «уход» проекта со сделками — через паузу

**🔧 Код:** удаление пустого — [ProjectService::delete :204](../../../app/app/Services/Project/ProjectService.php#L204); пауза — [ProjectController::toggleActive :264-282](../../../app/app/Http/Controllers/Api/ProjectController.php#L264-L282).
**🎬 Действие (лок):** (а) удалить проект **без** сделок — проходит; (б) проект со сделками поставить на паузу — скрывается из работы, сделки остаются.

**📋 ОТЧЁТ:**
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Удаление пустого проекта | есть | удалён успешно | _(слот)_ | 📸 Проекты (пустого нет) |
| Пауза проекта со сделками | активен | на паузе, сделки целы | _(слот)_ | 📸 Проекты (пауза) + Сделки (на месте) |

**💡 Что внутри:** проект, по которому ещё ничего не приходило, удалить можно спокойно. А «убрать с глаз» проект, по которому уже есть сделки, — через паузу: он перестаёт работать, но история сохраняется. Так клиент управляет списком проектов, не рискуя данными.

**❌ Если не так:** пустой проект не удаляется / пауза теряет сделки → дефект.

---

## Verification №15 (выход из пункта)
- [ ] 📸 Проект со сделками удалить не дают (подсказка про паузу); проект остался.
- [ ] 📸 Сделки на месте (число не изменилось).
- [ ] 📸 Пустой проект удаляется; проект со сделками уходит через паузу (сделки целы).
- [ ] 📝 SQL: `COUNT deals` до и после попытки удаления не изменилось.

## 📸 vs 📝 в этом пункте
- **📸 Скриншот:** Проекты (отказ удаления, пауза, удаление пустого), Сделки (число неизменно).
- **📝 Текст:** `COUNT deals` до/после — текстом.

## Грабли
- **Расхождение со сводом:** свод писал «удалить → сделки сохранены»; по коду — удаление **запрещено** при наличии сделок. Проверять именно запрет + подсказку про паузу; свод поправить.
- Есть второй гард — слепок поставщика («уже заказали лиды») срабатывает раньше has-deals; на прогоне возможно увидеть его формулировку.
- Связка с №4 (пауза) и №14 (удаление сделки не возвращает деньги).
