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(); +});