projectService = $projectService; $this->activityRepository = $activityRepository; $this->projectRateRepository = $projectRateRepository; $this->activityRateRepository = $activityRateRepository; } public function duplicate(Project $project, string $newName): Project { $newProject = clone $project; $newProject->setName($newName); foreach ($project->getTeams() as $team) { $newProject->addTeam($team); } foreach ($project->getMetaFields() as $metaField) { $newMetaField = clone $metaField; $newMetaField->setEntity($newProject); $newProject->setMetaField($newMetaField); } if (null !== $project->getEnd()) { $newProject->setStart(clone $project->getEnd()); $newProject->setEnd(null); } $this->projectService->saveNewProject($newProject); foreach ($this->projectRateRepository->getRatesForProject($project) as $rate) { /** @var ProjectRate $newRate */ $newRate = clone $rate; $newRate->setProject($newProject); $this->projectRateRepository->saveRate($newRate); } $allActivities = $this->activityRepository->findByProject($project); foreach ($allActivities as $activity) { $newActivity = clone $activity; $newActivity->setProject($newProject); foreach ($activity->getMetaFields() as $metaField) { $newMetaField = clone $metaField; $newMetaField->setEntity($newActivity); $newActivity->setMetaField($newMetaField); } $this->activityRepository->saveActivity($newActivity); foreach ($this->activityRateRepository->getRatesForActivity($activity) as $rate) { /** @var ActivityRate $newRate */ $newRate = clone $rate; $newRate->setActivity($newActivity); $this->activityRateRepository->saveRate($newRate); } } return $newProject; } }