feat(supplier): group recompute + pause + source-change + root auto-link
Закрывает замечания заказчика (22.05.2026) по проектам/поставщику. Все 4 куска имеют общий корень: online-синхронизация одного проекта работала с данными ЭТОГО проекта, а не пересчитывала всю «группу» (проекты разных tenant'ов с одним identifier) — отсюда переплата ×3 при изменении лимита, затирание регионов/дней группы, неотправленная пауза, и осиротевшие проекты при смене источника. 1. Групповой пересчёт в SyncSupplierProjectJob::handleOnline (#1 при изменении, #2 дни, #3 регионы, C2/C3): union regions, computeOrder eligible, distributeForPlatform — те же расчёты, что в ночном syncGroup. Online и ночной теперь дают идентичный supplier-state, расхождение устранено. 2. Пауза #10: - ProjectController::toggleActive — диспатчит SyncSupplierProjectJob; - ProjectService::bulkPauseResume — диспатчит sync per project; - DTO status вычисляется из groupActive (paused когда группа без активных); - sp.inactive_since пишется при пересинке (для UI/DTO консистентности). 3. Смена источника #8/#9 в ProjectService::update: - до update снимается старый buildUniqueKeyAgnostic; - если изменился — отвязываем старые supplier_projects от этого project (pivot + legacy FK), DeleteSupplierProjectJob удаляет их у поставщика при отсутствии других потребителей, либо пересинкает агрегат. 4. Перенос auto-link корня из feat/root-domain-auto-link: новый App\Support\SupplierIdentifier::extractRootDomain + блоки auto-link в обоих джобах (online + nightly). Тесты: TDD на каждый кусок. SyncSupplierProjectJobTest +2 (group recompute, pause). ProjectUpdateDedupTest +1 (source detach + cleanup dispatch). ProjectsActionsTest +2 (toggle + bulk pause dispatches). Регрессия: 186/186 passed (Project/Plan5/Projects + Supplier), 502 assertions. Деплой: дельтой на боевой (база = root-domain ветка; на боевом джобы СТАРЕЕ main, deliver через копию изменённых файлов + config:cache + restart queue). План: docs/superpowers/plans/2026-05-22-замечания-проекты-чеклист.md Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,7 @@ use App\Http\Requests\BulkProjectActionRequest;
|
||||
use App\Http\Requests\StoreProjectRequest;
|
||||
use App\Http\Requests\UpdateProjectRequest;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Jobs\SyncSupplierProjectJob;
|
||||
use App\Models\Project;
|
||||
use App\Services\Project\ProjectService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -132,6 +133,10 @@ class ProjectController extends Controller
|
||||
$project = Project::where('tenant_id', $request->user()->tenant_id)->findOrFail($id);
|
||||
$project->update(['is_active' => $request->boolean('is_active')]);
|
||||
|
||||
// #10: pause/resume must reach the supplier. The job's group recompute pushes
|
||||
// status=paused when no active project of the group remains (resume → active).
|
||||
SyncSupplierProjectJob::dispatch($project->id);
|
||||
|
||||
return response()->json(['data' => new ProjectResource($project->fresh())]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user