BUG-024: Декомпозиция
Код
Warehouse Service
- В
IngredientService.deleteIngredient(id, franchiseId)перед физическим удалением:- Проверка компонентного использования (
isIngredientInUse→ 422INGREDIENT_IN_USE) уже была - Добавлено: найти собственные техкарты через
techCardRepository.findByIngredientId(id). Если есть — удалитьtechCardRepository.deleteAll(...). Каскад наrecipe_items— черезON DELETE CASCADEFKfk_recipe_items_tech_cardв БД. Всё в одной транзакции.
- Проверка компонентного использования (
- Глобальный
@ExceptionHandler({DataIntegrityViolationException, ConstraintViolationException})вGlobalExceptionHandler→409 DB_CONSTRAINTкак safety net вместо 500
Admin Franchise (web)
- Карточка ингредиента: показывать блок «Техкарта» если ингредиент — полуфабрикат (у него есть
tech_cardscingredient_id = :id) - При клике «Удалить ингредиент» с ненулевой техкартой — модалка подтверждения: «У ингредиента есть техкарта. Удалить вместе?» Yes → DELETE, No → cancel
- Обработка
409 INGREDIENT_IN_USEот API — показать список затронутых продуктов/ингредиентов с ссылками в тосте/модалке
Спеки
-
08-Specs/Админка Франшизы/Ингредиенты.md(илиТехкарты.md) — добавить правило: «Удаление ингредиента-полуфабриката каскадно удаляет его техкарту. Удаление ингредиента, используемого как компонент в чужих техкартах, блокируется (409 с перечнем)» -
03-Services/Warehouse Service/API.md— уDELETE /ingredients/{id}добавить вErrors:409 INGREDIENT_IN_USEс форматомdetails.usages[] - Пометить обновление в спеках
*(Исправлено в [[07-Tasks/Bugs/BUG-024 500 при удалении ингредиента-полуфабриката с техкартой/Баг|BUG-024]])*