d2100a9bab
Spec для фикса root-cause обнаруженной 26.05.2026 при разборе скриншота админки поставщика: 11 из первых 12 наших проектов в crm.bp-gr.ru имеют name без префикса B1_/B2_/B3_, в то время как старые ручные — с префиксом. Корень в SupplierPortalClient::toPayload() строка 468: name=uniqueKey без префикса. Допущение портал префиксует сам автоматически (комментарий 2026-05-19, recon Playwright) не подтверждено живым listProjects. Решения брейншторма (заказчик подтвердил): - toPayload префиксует name через helper prefixedName(): "B<n>_<uniqueKey>" если platforms содержит ровно 1 элемент, иначе throw LogicException (инвариант 1 POST = 1 платформа). - saveProjectMultiFlag реструктуризируется: один POST со всеми srcrt+srcbl+srcmt -> N последовательных POST'ов, по одному на платформу, external_id из ответа rt-project-save напрямую. - updateProject без изменений сигнатуры -- уже вызывается per-platform, через тот же toPayload автоматически реализует нормализацию на лету для 11 legacy без префикса. - partial-failure не откатываем: Laravel job retry создаст возможные дубли, чистим вручную (флоу отработан 26.05). - К1 учебник вебмастера НЕ правим в этом скоупе. - AjaxProjectChannel read-side не трогаем -- 26.05 фикс DIRECT для legacy продолжает работать естественно. Tests: unit для toPayload, feature для saveProjectMultiFlag с моком HTTP, live smoke на боевом через UI Лидерры + tinker listProjects. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>