getAllUsers($manager); $activities = $this->getAllActivities($manager); $projects = $this->getAllProjects($manager); $allTags = $this->getAllTags($manager); $faker = Factory::create(); // by using array_pop we make sure that at least one activity has NO entry! array_pop($activities); $all = 0; foreach ($allUser as $user) { // random amount of timesheet entries for every user $timesheetForUser = rand(self::MIN_TIMESHEETS_PER_USER, self::MAX_TIMESHEETS_PER_USER); for ($i = 1; $i <= $timesheetForUser; $i++) { if ($all > self::MAX_TIMESHEETS_TOTAL && $i > self::MIN_TIMESHEETS_PER_USER) { break; } $description = null; if ($i % 3 === 0) { $description = $faker->realText($faker->numberBetween(10, self::MAX_DESCRIPTION_LENGTH)); } elseif ($i % 7 === 0) { $description = substr($faker->text, 0, self::MAX_DESCRIPTION_LENGTH); } $entry = $this->createTimesheetEntry( $user, $activities[array_rand($activities)], $projects[array_rand($projects)], $description, true ); $all++; $manager->persist($entry); if ($i % self::BATCH_SIZE === 0) { $manager->flush(); $manager->clear(Timesheet::class); } } // create active recordings for test user $activeEntries = rand(0, self::MAX_RUNNING_TIMESHEETS_PER_USER); for ($i = 0; $i < $activeEntries; $i++) { $entry = $this->createTimesheetEntry( $user, $activities[array_rand($activities)], $projects[array_rand($projects)], null, false ); $all++; $manager->persist($entry); } $manager->flush(); $manager->clear(Timesheet::class); } $manager->flush(); // TODO this breaks if too many records need to be loaded: find a better way of adding tags if ($all < self::ADD_TAGS_MAX_ENTRIES) { $entries = $manager->getRepository(Timesheet::class)->findAll(); foreach ($entries as $temp) { $tagAmount = rand(0, self::MAX_TAG_PER_ENTRY); for ($iTag = 0; $iTag < $tagAmount; $iTag++) { $tagId = rand(1, TagFixtures::MAX_TAGS); if (isset($allTags[$tagId])) { $temp->addTag($allTags[$tagId]); } } } } $manager->flush(); $manager->clear(Timesheet::class); $manager->clear(Tag::class); } /** * @param ObjectManager $manager * @return array */ protected function getAllTags(ObjectManager $manager): array { $all = []; /** @var Tag[] $entries */ $entries = $manager->getRepository(Tag::class)->findAll(); foreach ($entries as $temp) { $all[$temp->getId()] = $temp; } return $all; } /** * @param ObjectManager $manager * @return array */ protected function getAllUsers(ObjectManager $manager): array { $all = []; /** @var User[] $entries */ $entries = $manager->getRepository(User::class)->findAll(); foreach ($entries as $temp) { $all[$temp->getId()] = $temp; } return $all; } /** * @param ObjectManager $manager * @return array */ protected function getAllProjects(ObjectManager $manager): array { $all = []; /** @var Project[] $entries */ $entries = $manager->getRepository(Project::class)->findAll(); foreach ($entries as $temp) { $all[$temp->getId()] = $temp; } return $all; } /** * @param ObjectManager $manager * @return array */ protected function getAllActivities(ObjectManager $manager): array { $all = []; /** @var Activity[] $entries */ $entries = $manager->getRepository(Activity::class)->findAll(); foreach ($entries as $temp) { $all[$temp->getId()] = $temp; } return $all; } private function createTimesheetEntry(User $user, Activity $activity, Project $project, $description, $setEndDate = true) { $start = new \DateTime(); $start = $start->modify('- ' . (rand(1, self::TIMERANGE_DAYS)) . ' days'); $start = $start->modify('- ' . (rand(1, 86400)) . ' seconds'); $start->setTimezone(new \DateTimeZone($user->getPreferenceValue(UserPreference::TIMEZONE, date_default_timezone_get()))); $entry = new Timesheet(); $entry ->setActivity($activity) ->setProject($activity->getProject() ?? $project) ->setDescription($description) ->setUser($user) ->setBegin($start); if ($setEndDate) { $end = clone $start; $end = $end->modify('+ ' . (rand(self::MIN_MINUTES_PER_ENTRY, self::MAX_MINUTES_PER_ENTRY)) . ' minutes'); $duration = $end->getTimestamp() - $start->getTimestamp(); $hourlyRate = (float) $user->getPreferenceValue(UserPreference::HOURLY_RATE); $rate = Util::calculateRate($hourlyRate, $duration); $entry ->setEnd($end) ->setRate($rate) ->setDuration($duration); } else { // running entries should be short $newBegin = clone $entry->getBegin(); $newBegin->setTimestamp(time())->modify('- ' . rand(10, self::TIMERANGE_RUNNING) . ' minutes'); $entry->setBegin($newBegin); } return $entry; } }