From f9b904d441ed7935dc69f12aa4e80e4309e6177b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 28 May 2026 07:02:49 +0300 Subject: [PATCH] =?UTF-8?q?feat(slepok):=20Task=202.11=20(backend=20slice)?= =?UTF-8?q?=20=E2=80=94=20ProjectResource=20serializes=20applies=5Ffrom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProjectResource теперь включает поле `applies_from` (ISO8601 строка | null) в JSON-ответе. Установлен ProjectService::update() для slepok-sensitive правок (Task 2.8 dynamic attribute). UI Vue/composables/Vitest часть откладывается на отдельную сессию — это backend-only commit для бэкенд-инструмента UI-сообщения. Spec §4.2.5. Plan: docs/superpowers/plans/2026-05-26-slepok-routing-protection.md §Task 2.11 Tests: tests/Feature/Http/Resources/ProjectResourceAppliesFromTest.php — 2/2 PASS. --- app/app/Http/Resources/ProjectResource.php | 4 +++ .../ProjectResourceAppliesFromTest.php | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 app/tests/Feature/Http/Resources/ProjectResourceAppliesFromTest.php diff --git a/app/app/Http/Resources/ProjectResource.php b/app/app/Http/Resources/ProjectResource.php index e8da77a0..85c995f8 100644 --- a/app/app/Http/Resources/ProjectResource.php +++ b/app/app/Http/Resources/ProjectResource.php @@ -35,6 +35,10 @@ class ProjectResource extends JsonResource $request->routeIs('projects.show'), fn () => $this->getSupplierLinks(), ), + // Task 2.11 (Spec §4.2.5): dynamic attribute, не БД-поле. Установлен + // ProjectService::update() для slepok-sensitive правок. UI показывает + // «изменения вступят в силу с DD.MM HH:MM МСК». + 'applies_from' => $this->applies_from?->toIso8601String(), ]; } } diff --git a/app/tests/Feature/Http/Resources/ProjectResourceAppliesFromTest.php b/app/tests/Feature/Http/Resources/ProjectResourceAppliesFromTest.php new file mode 100644 index 00000000..85b8f53c --- /dev/null +++ b/app/tests/Feature/Http/Resources/ProjectResourceAppliesFromTest.php @@ -0,0 +1,33 @@ +create(); + $project = Project::factory()->for($tenant)->create(); + $project->applies_from = CarbonImmutable::parse('2026-05-29 21:00:00', 'Europe/Moscow'); + + $resource = (new ProjectResource($project))->toArray(request()); + + expect($resource)->toHaveKey('applies_from'); + expect($resource['applies_from'])->toBe('2026-05-29T21:00:00+03:00'); +}); + +it('ProjectResource applies_from is null when not set', function (): void { + $tenant = Tenant::factory()->create(); + $project = Project::factory()->for($tenant)->create(); + // applies_from не установлен + + $resource = (new ProjectResource($project))->toArray(request()); + + expect($resource)->toHaveKey('applies_from'); + expect($resource['applies_from'])->toBeNull(); +});