task; } public function withIntervals(int $quantity = 1): self { $this->intervalsAmount = $quantity; return $this; } public function forUser(User $user): self { $this->user = $user; return $this; } public function forProject(Project $project): self { $this->project = $project; return $this; } public function create(array $attributes = []): Task { $modelData = $this->createRandomModelData(); $this->task = Task::make($modelData); $this->defineProject(); $this->defineUser(); $this->task->save(); if (isset($this->user)) { $this->task->users()->attach($this->user->id); } if ($this->intervalsAmount) { $this->createIntervals(); } if ($this->timestampsHidden) { $this->hideTimestamps(); } return $this->task; } public function createRandomModelData(): array { $faker = FakerFactory::create(); return [ 'task_name' => $faker->jobTitle, 'description' => $faker->text(self::DESCRIPTION_LENGTH), 'priority_id' => Priority::min('id'), 'status_id' => Status::min('id'), ]; } private function defineProject(): void { if (!isset($this->project)) { $this->project = ProjectFactory::create(); } $this->task->project_id = $this->project->id; } private function defineUser(): void { if (!isset($this->user)) { $this->user = UserFactory::create(); } } private function createIntervals(): void { do { IntervalFactory::forUser($this->user) ->forTask($this->task) ->create(); } while (--$this->intervalsAmount); } }