HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //home/timetracker.panomity.com/tm.old/DataFixtures/TasksFixtures.php
<?php

/*
 * This file is part of the TaskManagementBundle for Kimai 2.
 * All rights reserved by Kevin Papst (www.kevinpapst.de).
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace KimaiPlugin\TaskManagementBundle\DataFixtures;

use App\DataFixtures\CustomerFixtures;
use App\DataFixtures\TeamFixtures;
use App\DataFixtures\UserFixtures;
use App\Entity\Activity;
use App\Entity\Project;
use App\Entity\Team;
use App\Entity\User;
use App\Entity\UserPreference;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use Faker\Factory;
use KimaiPlugin\TaskManagementBundle\Entity\Task;

/**
 * Defines the sample data to load in the database when running the unit and
 * functional tests or while development.
 *
 * Execute this command to load the data:
 * bin/console doctrine:fixtures:load
 *
 * @codeCoverageIgnore
 */
final class TasksFixtures extends Fixture implements DependentFixtureInterface
{
    public const MIN_ITEMS_PER_USER = 1;
    public const MAX_ITEMS_PER_USER = 15;
    public const MAX_ITEMS_TOTAL = 2500;

    public const TIMERANGE_DAYS = 31;
    public const MAX_DESCRIPTION_LENGTH = 100;
    public const MIN_ESTIMATION = 1800; // 30 minutes
    public const MAX_ESTIMATION = 50400; // 14 hours
    public const BATCH_SIZE = 100;

    /**
     * @return array
     */
    public function getDependencies()
    {
        return [
            UserFixtures::class,
            TeamFixtures::class,
            CustomerFixtures::class,
        ];
    }

    /**
     * @param ObjectManager $manager
     * @return void
     */
    public function load(ObjectManager $manager)
    {
        $faker = Factory::create();

        $allUser = $this->getAllUsers($manager);
        $activities = $this->getAllActivities($manager);
        $projects = $this->getAllProjects($manager);
        $all = 0;
        $statusUser = [Task::STATUS_PENDING, Task::STATUS_IN_PROGRESS];
        $statusAll = [Task::STATUS_PENDING, Task::STATUS_IN_PROGRESS, Task::STATUS_DONE];

        foreach ($allUser as $user) {
            $itemsPerUser = mt_rand(self::MIN_ITEMS_PER_USER, self::MAX_ITEMS_PER_USER);
            $teams = $user->getTeams();
            for ($i = 1; $i <= $itemsPerUser; $i++) {
                if ($all > self::MAX_ITEMS_TOTAL) {
                    break;
                }

                $status = $statusUser[array_rand($statusUser)];

                $entry = new Task();
                $entry->setStatus($status);

                if ($i % 2 === 0) {
                    $entry->setDescription($faker->realText($faker->numberBetween(10, self::MAX_DESCRIPTION_LENGTH)));
                }

                if ($i % 3 === 0 && \count($teams) > 0) {
                    $entry->setTeam($teams[array_rand($teams)]);
                }

                if ($i % 3 !== 0) {
                    $start = new \DateTime();
                    $start = $start->modify('+ ' . (mt_rand(1, self::TIMERANGE_DAYS)) . ' days');
                    $start = $start->modify('+ ' . (mt_rand(1, 86400)) . ' seconds');
                    $start->setTimezone(new \DateTimeZone($user->getPreferenceValue(UserPreference::TIMEZONE, date_default_timezone_get())));

                    $end = clone $start;
                    $end = $end->modify('+ ' . (mt_rand(0, self::TIMERANGE_DAYS)) . ' days');

                    $entry
                        ->setBegin($start)
                        ->setEnd($end)
                    ;
                }

                if ($i % 4 !== 0) {
                    $entry->setEstimation(mt_rand(self::MIN_ESTIMATION, self::MAX_ESTIMATION));
                }

                $activity = $activities[array_rand($activities)];
                if (null !== $activity->getProject()) {
                    $project = $activity->getProject();
                } else {
                    $project = $projects[array_rand($projects)];
                }

                $entry
                    ->setTitle($faker->catchPhrase) // $faker->bs
                    ->setActivity($activity)
                    ->setProject($activity->getProject() ?? $project)
                    ->setUser($user)
                ;

                $all++;

                $manager->persist($entry);

                if ($status === Task::STATUS_IN_PROGRESS) {
                    $this->startTimesheet($entry);
                }

                if ($i % self::BATCH_SIZE == 0) {
                    $manager->flush();
                    $manager->clear(Task::class);
                }
            }

            $manager->flush();
            $manager->clear(Task::class);
        }

        $teams = $this->getAllTeams($manager);

        // fill in pending tasks, which are not yet assigned
        while ($all < self::MAX_ITEMS_TOTAL) {
            $entry = new Task();

            $status = $statusAll[array_rand($statusAll)];
            $user = $allUser[array_rand($allUser)];

            $entry->setStatus($status);

            if ($all % 3 === 0) {
                $entry->setDescription($faker->realText($faker->numberBetween(10, self::MAX_DESCRIPTION_LENGTH)));
            } elseif ($all % 4 === 0) {
                $entry->setTeam($teams[array_rand($teams)]);
            } elseif ($all % 7 === 0) {
                $entry->setDescription(substr($faker->text, 0, self::MAX_DESCRIPTION_LENGTH));
            } elseif ($all % 2 === 0) {
                $start = new \DateTime();
                $start = $start->modify('+ ' . (mt_rand(1, self::TIMERANGE_DAYS)) . ' days');
                $start = $start->modify('+ ' . (mt_rand(1, 86400)) . ' seconds');
                $start->setTimezone(new \DateTimeZone($user->getPreferenceValue(UserPreference::TIMEZONE, date_default_timezone_get())));

                $end = clone $start;
                $end = $end->modify('+ ' . (mt_rand(0, self::TIMERANGE_DAYS)) . ' days');

                $entry
                    ->setTitle($faker->catchPhrase) // $faker->bs
                    ->setBegin($start)
                    ->setEnd($end)
                ;
            }

            $activity = $activities[array_rand($activities)];
            $project = $projects[array_rand($projects)];

            $entry
                ->setTitle($faker->bs) // $faker->bs
                ->setActivity($activity)
                ->setProject($activity->getProject() ?? $project)
            ;

            $all++;

            $manager->persist($entry);

            if ($status === Task::STATUS_IN_PROGRESS) {
                $this->startTimesheet($entry);
            }

            if ($all % self::BATCH_SIZE == 0) {
                $manager->flush();
                $manager->clear(Task::class);
            }
        }

        $manager->flush();
        $manager->clear(Task::class);
    }

    /**
     * Start a new timesheet for tasks "in progress".
     *
     * @param Task $task
     * @return void
     */
    private function startTimesheet(Task $task)
    {
        // FIXME add startTimesheet()
    }

    /**
     * @param ObjectManager $manager
     * @return User[]
     */
    private function getAllUsers(ObjectManager $manager)
    {
        $all = [];
        /* @var User[] $entries */
        $entries = $manager->getRepository(User::class)->findBy(['enabled' => true]);
        foreach ($entries as $temp) {
            $all[$temp->getId()] = $temp;
        }

        return $all;
    }

    /**
     * @param ObjectManager $manager
     * @return Team[]
     */
    protected function getAllTeams(ObjectManager $manager)
    {
        $all = [];
        /* @var User[] $entries */
        $entries = $manager->getRepository(Team::class)->findAll();
        foreach ($entries as $temp) {
            $all[$temp->getId()] = $temp;
        }

        return $all;
    }

    /**
     * @param ObjectManager $manager
     * @return Project[]
     */
    private function getAllProjects(ObjectManager $manager)
    {
        $all = [];
        /* @var Project[] $entries */
        $entries = $manager->getRepository(Project::class)->findBy(['visible' => true]);
        foreach ($entries as $temp) {
            if (!$temp->isVisible() || !$temp->getCustomer()->isVisible()) {
                continue;
            }
            $all[$temp->getId()] = $temp;
        }

        return $all;
    }

    /**
     * @param ObjectManager $manager
     * @return Activity[]
     */
    private function getAllActivities(ObjectManager $manager)
    {
        $all = [];
        /* @var Activity[] $entries */
        $entries = $manager->getRepository(Activity::class)->findBy(['visible' => true]);
        foreach ($entries as $temp) {
            if (!$temp->isVisible()) {
                continue;
            }
            if (null !== $temp->getProject() && (!$temp->getProject()->isVisible() || !$temp->getProject()->getCustomer()->isVisible())) {
                continue;
            }
            $all[$temp->getId()] = $temp;
        }

        return $all;
    }
}