From 5a85b1d37e43c4cb6a29464feccf1e778a8d816f Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Thu, 20 Oct 2016 23:25:08 +0200 Subject: [PATCH] added files from demo --- src/AppBundle/Command/AddUserCommand.php | 280 ++++++ src/AppBundle/Command/DeleteUserCommand.php | 149 ++++ src/AppBundle/Command/ListUsersCommand.php | 143 +++ src/AppBundle/Entity/KimaiActivities.php | 190 ++++ src/AppBundle/Entity/KimaiConfiguration.php | 66 ++ src/AppBundle/Entity/KimaiCustomers.php | 686 +++++++++++++++ src/AppBundle/Entity/KimaiExpenses.php | 345 ++++++++ src/AppBundle/Entity/KimaiFixedrates.php | 113 +++ src/AppBundle/Entity/KimaiPreferences.php | 113 +++ src/AppBundle/Entity/KimaiProjects.php | 345 ++++++++ .../Entity/KimaiProjectsActivities.php | 175 ++++ src/AppBundle/Entity/KimaiRates.php | 146 ++++ src/AppBundle/Entity/KimaiStatuses.php | 66 ++ src/AppBundle/Entity/KimaiUsers.php | 562 ++++++++++++ var/SymfonyRequirements.php | 819 ++++++++++++++++++ web/apple-touch-icon.png | Bin 0 -> 10784 bytes web/config.php | 422 +++++++++ web/favicon.ico | Bin 0 -> 1150 bytes 18 files changed, 4620 insertions(+) create mode 100644 src/AppBundle/Command/AddUserCommand.php create mode 100644 src/AppBundle/Command/DeleteUserCommand.php create mode 100644 src/AppBundle/Command/ListUsersCommand.php create mode 100644 src/AppBundle/Entity/KimaiActivities.php create mode 100644 src/AppBundle/Entity/KimaiConfiguration.php create mode 100644 src/AppBundle/Entity/KimaiCustomers.php create mode 100644 src/AppBundle/Entity/KimaiExpenses.php create mode 100644 src/AppBundle/Entity/KimaiFixedrates.php create mode 100644 src/AppBundle/Entity/KimaiPreferences.php create mode 100644 src/AppBundle/Entity/KimaiProjects.php create mode 100644 src/AppBundle/Entity/KimaiProjectsActivities.php create mode 100644 src/AppBundle/Entity/KimaiRates.php create mode 100644 src/AppBundle/Entity/KimaiStatuses.php create mode 100644 src/AppBundle/Entity/KimaiUsers.php create mode 100644 var/SymfonyRequirements.php create mode 100644 web/apple-touch-icon.png create mode 100644 web/config.php create mode 100644 web/favicon.ico diff --git a/src/AppBundle/Command/AddUserCommand.php b/src/AppBundle/Command/AddUserCommand.php new file mode 100644 index 00000000..2f8220ce --- /dev/null +++ b/src/AppBundle/Command/AddUserCommand.php @@ -0,0 +1,280 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace AppBundle\Command; + +use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\Question; +use Doctrine\Common\Persistence\ObjectManager; +use AppBundle\Entity\User; + +/** + * A command console that creates users and stores them in the database. + * To use this command, open a terminal window, enter into your project + * directory and execute the following: + * + * $ php bin/console app:add-user + * + * To output detailed information, increase the command verbosity: + * + * $ php bin/console app:add-user -vv + * + * See http://symfony.com/doc/current/cookbook/console/console_command.html + * + * @author Javier Eguiluz + */ +class AddUserCommand extends ContainerAwareCommand +{ + const MAX_ATTEMPTS = 5; + + /** + * @var ObjectManager + */ + private $entityManager; + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + // a good practice is to use the 'app:' prefix to group all your custom application commands + ->setName('app:add-user') + ->setDescription('Creates users and stores them in the database') + ->setHelp($this->getCommandHelp()) + // commands can optionally define arguments and/or options (mandatory and optional) + // see http://symfony.com/doc/current/components/console/console_arguments.html + ->addArgument('username', InputArgument::OPTIONAL, 'The username of the new user') + ->addArgument('password', InputArgument::OPTIONAL, 'The plain password of the new user') + ->addArgument('email', InputArgument::OPTIONAL, 'The email of the new user') + ->addOption('is-admin', null, InputOption::VALUE_NONE, 'If set, the user is created as an administrator') + ; + } + + /** + * This method is executed before the interact() and the execute() methods. + * It's main purpose is to initialize the variables used in the rest of the + * command methods. + * + * Beware that the input options and arguments are validated after executing + * the interact() method, so you can't blindly trust their values in this method. + */ + protected function initialize(InputInterface $input, OutputInterface $output) + { + $this->entityManager = $this->getContainer()->get('doctrine')->getManager(); + } + + /** + * This method is executed after initialize() and before execute(). Its purpose + * is to check if some of the options/arguments are missing and interactively + * ask the user for those values. + * + * This method is completely optional. If you are developing an internal console + * command, you probably should not implement this method because it requires + * quite a lot of work. However, if the command is meant to be used by external + * users, this method is a nice way to fall back and prevent errors. + */ + protected function interact(InputInterface $input, OutputInterface $output) + { + if (null !== $input->getArgument('username') && null !== $input->getArgument('password') && null !== $input->getArgument('email')) { + return; + } + + // multi-line messages can be displayed this way... + $output->writeln(''); + $output->writeln('Add User Command Interactive Wizard'); + $output->writeln('-----------------------------------'); + + // ...but you can also pass an array of strings to the writeln() method + $output->writeln([ + '', + 'If you prefer to not use this interactive wizard, provide the', + 'arguments required by this command as follows:', + '', + ' $ php bin/console app:add-user username password email@example.com', + '', + ]); + + $output->writeln([ + '', + 'Now we\'ll ask you for the value of all the missing command arguments.', + '', + ]); + + // See http://symfony.com/doc/current/components/console/helpers/questionhelper.html + $console = $this->getHelper('question'); + + // Ask for the username if it's not defined + $username = $input->getArgument('username'); + if (null === $username) { + $question = new Question(' > Username: '); + $question->setValidator(function ($answer) { + if (empty($answer)) { + throw new \RuntimeException('The username cannot be empty'); + } + + return $answer; + }); + $question->setMaxAttempts(self::MAX_ATTEMPTS); + + $username = $console->ask($input, $output, $question); + $input->setArgument('username', $username); + } else { + $output->writeln(' > Username: '.$username); + } + + // Ask for the password if it's not defined + $password = $input->getArgument('password'); + if (null === $password) { + $question = new Question(' > Password (your type will be hidden): '); + $question->setValidator([$this, 'passwordValidator']); + $question->setHidden(true); + $question->setMaxAttempts(self::MAX_ATTEMPTS); + + $password = $console->ask($input, $output, $question); + $input->setArgument('password', $password); + } else { + $output->writeln(' > Password: '.str_repeat('*', strlen($password))); + } + + // Ask for the email if it's not defined + $email = $input->getArgument('email'); + if (null === $email) { + $question = new Question(' > Email: '); + $question->setValidator([$this, 'emailValidator']); + $question->setMaxAttempts(self::MAX_ATTEMPTS); + + $email = $console->ask($input, $output, $question); + $input->setArgument('email', $email); + } else { + $output->writeln(' > Email: '.$email); + } + } + + /** + * This method is executed after interact() and initialize(). It usually + * contains the logic to execute to complete this command task. + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $startTime = microtime(true); + + $username = $input->getArgument('username'); + $plainPassword = $input->getArgument('password'); + $email = $input->getArgument('email'); + $isAdmin = $input->getOption('is-admin'); + + // first check if a user with the same username already exists + $existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $username]); + + if (null !== $existingUser) { + throw new \RuntimeException(sprintf('There is already a user registered with the "%s" username.', $username)); + } + + // create the user and encode its password + $user = new User(); + $user->setUsername($username); + $user->setEmail($email); + $user->setRoles([$isAdmin ? 'ROLE_ADMIN' : 'ROLE_USER']); + + // See http://symfony.com/doc/current/book/security.html#security-encoding-password + $encoder = $this->getContainer()->get('security.password_encoder'); + $encodedPassword = $encoder->encodePassword($user, $plainPassword); + $user->setPassword($encodedPassword); + + $this->entityManager->persist($user); + $this->entityManager->flush(); + + $output->writeln(''); + $output->writeln(sprintf('[OK] %s was successfully created: %s (%s)', $isAdmin ? 'Administrator user' : 'User', $user->getUsername(), $user->getEmail())); + + if ($output->isVerbose()) { + $finishTime = microtime(true); + $elapsedTime = $finishTime - $startTime; + + $output->writeln(sprintf('[INFO] New user database id: %d / Elapsed time: %.2f ms', $user->getId(), $elapsedTime*1000)); + } + } + + /** + * This internal method should be private, but it's declared as public to + * maintain PHP 5.3 compatibility when using it in a callback. + * + * @internal + */ + public function passwordValidator($plainPassword) + { + if (empty($plainPassword)) { + throw new \Exception('The password can not be empty'); + } + + if (strlen(trim($plainPassword)) < 6) { + throw new \Exception('The password must be at least 6 characters long'); + } + + return $plainPassword; + } + + /** + * This internal method should be private, but it's declared as public to + * maintain PHP 5.3 compatibility when using it in a callback. + * + * @internal + */ + public function emailValidator($email) + { + if (empty($email)) { + throw new \Exception('The email can not be empty'); + } + + if (false === strpos($email, '@')) { + throw new \Exception('The email should look like a real email'); + } + + return $email; + } + + /** + * The command help is usually included in the configure() method, but when + * it's too long, it's better to define a separate method to maintain the + * code readability. + */ + private function getCommandHelp() + { + return <<%command.name% command creates new users and saves them in the database: + + php %command.full_name% username password email + +By default the command creates regular users. To create administrator users, +add the --is-admin option: + + php %command.full_name% username password email --is-admin + +If you omit any of the three required arguments, the command will ask you to +provide the missing values: + + # command will ask you for the email + php %command.full_name% username password + + # command will ask you for the email and password + php %command.full_name% username + + # command will ask you for all arguments + php %command.full_name% + +HELP; + } +} diff --git a/src/AppBundle/Command/DeleteUserCommand.php b/src/AppBundle/Command/DeleteUserCommand.php new file mode 100644 index 00000000..09a1b339 --- /dev/null +++ b/src/AppBundle/Command/DeleteUserCommand.php @@ -0,0 +1,149 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace AppBundle\Command; + +use AppBundle\Entity\User; +use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\Question; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * A command console that deletes users from the database. + * To use this command, open a terminal window, enter into your project + * directory and execute the following: + * + * $ php bin/console app:delete-user + * + * Check out the code of the src/AppBundle/Command/AddUserCommand.php file for + * the full explanation about Symfony commands. + * See http://symfony.com/doc/current/cookbook/console/console_command.html + * + * @author Oleg Voronkovich + */ +class DeleteUserCommand extends ContainerAwareCommand +{ + const MAX_ATTEMPTS = 5; + + /** + * @var ObjectManager + */ + private $entityManager; + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->setName('app:delete-user') + ->setDescription('Deletes users from the database') + ->addArgument('username', InputArgument::REQUIRED, 'The username of an existing user') + ->setHelp(<<%command.name% command deletes users from the database: + + php %command.full_name% username + +If you omit the argument, the command will ask you to +provide the missing value: + + php %command.full_name% +HELP + ); + } + + protected function initialize(InputInterface $input, OutputInterface $output) + { + $this->entityManager = $this->getContainer()->get('doctrine')->getManager(); + } + + protected function interact(InputInterface $input, OutputInterface $output) + { + if (null !== $input->getArgument('username')) { + return; + } + + $output->writeln(''); + $output->writeln('Delete User Command Interactive Wizard'); + $output->writeln('-----------------------------------'); + + $output->writeln([ + '', + 'If you prefer to not use this interactive wizard, provide the', + 'arguments required by this command as follows:', + '', + ' $ php bin/console app:delete-user username', + '', + ]); + + $output->writeln([ + '', + 'Now we\'ll ask you for the value of all the missing command arguments.', + '', + ]); + + $helper = $this->getHelper('question'); + + $question = new Question(' > Username: '); + $question->setValidator([$this, 'usernameValidator']); + $question->setMaxAttempts(self::MAX_ATTEMPTS); + + $username = $helper->ask($input, $output, $question); + $input->setArgument('username', $username); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $username = $input->getArgument('username'); + $this->usernameValidator($username); + + $repository = $this->entityManager->getRepository(User::class); + /** @var User $user */ + $user = $repository->findOneByUsername($username); + + if (null === $user) { + throw new \RuntimeException(sprintf('User with username "%s" not found.', $username)); + } + + // After an entity has been removed its in-memory state is the same + // as before the removal, except for generated identifiers. + // See http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#removing-entities + $userId = $user->getId(); + + $this->entityManager->remove($user); + $this->entityManager->flush(); + + $output->writeln(''); + $output->writeln(sprintf('[OK] User "%s" (ID: %d, email: %s) was successfully deleted.', $user->getUsername(), $userId, $user->getEmail())); + } + + /** + * This internal method should be private, but it's declared public to + * maintain PHP 5.3 compatibility when using it in a callback. + * + * @internal + */ + public function usernameValidator($username) + { + if (empty($username)) { + throw new \Exception('The username can not be empty.'); + } + + if (1 !== preg_match('/^[a-z_]+$/', $username)) { + throw new \Exception('The username must contain only lowercase latin characters and underscores.'); + } + + return $username; + } +} diff --git a/src/AppBundle/Command/ListUsersCommand.php b/src/AppBundle/Command/ListUsersCommand.php new file mode 100644 index 00000000..075aea66 --- /dev/null +++ b/src/AppBundle/Command/ListUsersCommand.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace AppBundle\Command; + +use AppBundle\Entity\User; +use Doctrine\Common\Persistence\ObjectManager; +use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; +use Symfony\Component\Console\Helper\Table; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Output\BufferedOutput; + +/** + * A command console that lists all the existing users. To use this command, open + * a terminal window, enter into your project directory and execute the following: + * + * $ php bin/console app:list-users + * + * See http://symfony.com/doc/current/cookbook/console/console_command.html + * + * @author Javier Eguiluz + */ +class ListUsersCommand extends ContainerAwareCommand +{ + /** + * @var ObjectManager + */ + private $entityManager; + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + // a good practice is to use the 'app:' prefix to group all your custom application commands + ->setName('app:list-users') + ->setDescription('Lists all the existing users') + ->setHelp(<<%command.name% command lists all the users registered in the application: + + php %command.full_name% + +By default the command only displays the 50 most recent users. Set the number of +results to display with the --max-results option: + + php %command.full_name% --max-results=2000 + +In addition to displaying the user list, you can also send this information to +the email address specified in the --send-to option: + + php %command.full_name% --send-to=fabien@symfony.com + +HELP + ) + // commands can optionally define arguments and/or options (mandatory and optional) + // see http://symfony.com/doc/current/components/console/console_arguments.html + ->addOption('max-results', null, InputOption::VALUE_OPTIONAL, 'Limits the number of users listed', 50) + ->addOption('send-to', null, InputOption::VALUE_OPTIONAL, 'If set, the result is sent to the given email address') + ; + } + + /** + * This method is executed before the the execute() method. It's main purpose + * is to initialize the variables used in the rest of the command methods. + */ + protected function initialize(InputInterface $input, OutputInterface $output) + { + $this->entityManager = $this->getContainer()->get('doctrine')->getManager(); + } + + /** + * This method is executed after initialize(). It usually contains the logic + * to execute to complete this command task. + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $maxResults = $input->getOption('max-results'); + // Use ->findBy() instead of ->findAll() to allow result sorting and limiting + $users = $this->entityManager->getRepository(User::class)->findBy([], ['id' => 'DESC'], $maxResults); + + // Doctrine query returns an array of objects and we need an array of plain arrays + $usersAsPlainArrays = array_map(function (User $user) { + return [$user->getId(), $user->getUsername(), $user->getEmail(), implode(', ', $user->getRoles())]; + }, $users); + + // In your console commands you should always use the regular output type, + // which outputs contents directly in the console window. However, this + // particular command uses the BufferedOutput type instead. + // The reason is that the table displaying the list of users can be sent + // via email if the '--send-to' option is provided. Instead of complicating + // things, the BufferedOutput allows to get the command output and store + // it in a variable before displaying it. + $bufferedOutput = new BufferedOutput(); + + $table = new Table($bufferedOutput); + $table + ->setHeaders(['ID', 'Username', 'Email', 'Roles']) + ->setRows($usersAsPlainArrays) + ; + $table->render(); + + // instead of displaying the table of users, store it in a variable + $tableContents = $bufferedOutput->fetch(); + + if (null !== $email = $input->getOption('send-to')) { + $this->sendReport($tableContents, $email); + } + + $output->writeln($tableContents); + } + + /** + * Sends the given $contents to the $recipient email address. + * + * @param string $contents + * @param string $recipient + */ + private function sendReport($contents, $recipient) + { + // See http://symfony.com/doc/current/cookbook/email/email.html + $mailer = $this->getContainer()->get('mailer'); + + $message = $mailer->createMessage() + ->setSubject(sprintf('app:list-users report (%s)', date('Y-m-d H:i:s'))) + ->setFrom($this->getContainer()->getParameter('app.notifications.email_sender')) + ->setTo($recipient) + ->setBody($contents, 'text/plain') + ; + + $mailer->send($message); + } +} diff --git a/src/AppBundle/Entity/KimaiActivities.php b/src/AppBundle/Entity/KimaiActivities.php new file mode 100644 index 00000000..cdb9f861 --- /dev/null +++ b/src/AppBundle/Entity/KimaiActivities.php @@ -0,0 +1,190 @@ +name = $name; + + return $this; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set comment + * + * @param string $comment + * + * @return KimaiActivities + */ + public function setComment($comment) + { + $this->comment = $comment; + + return $this; + } + + /** + * Get comment + * + * @return string + */ + public function getComment() + { + return $this->comment; + } + + /** + * Set visible + * + * @param boolean $visible + * + * @return KimaiActivities + */ + public function setVisible($visible) + { + $this->visible = $visible; + + return $this; + } + + /** + * Get visible + * + * @return boolean + */ + public function getVisible() + { + return $this->visible; + } + + /** + * Set filter + * + * @param boolean $filter + * + * @return KimaiActivities + */ + public function setFilter($filter) + { + $this->filter = $filter; + + return $this; + } + + /** + * Get filter + * + * @return boolean + */ + public function getFilter() + { + return $this->filter; + } + + /** + * Set trash + * + * @param boolean $trash + * + * @return KimaiActivities + */ + public function setTrash($trash) + { + $this->trash = $trash; + + return $this; + } + + /** + * Get trash + * + * @return boolean + */ + public function getTrash() + { + return $this->trash; + } + + /** + * Get activityid + * + * @return integer + */ + public function getActivityid() + { + return $this->activityid; + } +} diff --git a/src/AppBundle/Entity/KimaiConfiguration.php b/src/AppBundle/Entity/KimaiConfiguration.php new file mode 100644 index 00000000..efd17517 --- /dev/null +++ b/src/AppBundle/Entity/KimaiConfiguration.php @@ -0,0 +1,66 @@ +value = $value; + + return $this; + } + + /** + * Get value + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Get option + * + * @return string + */ + public function getOption() + { + return $this->option; + } +} diff --git a/src/AppBundle/Entity/KimaiCustomers.php b/src/AppBundle/Entity/KimaiCustomers.php new file mode 100644 index 00000000..f59bc088 --- /dev/null +++ b/src/AppBundle/Entity/KimaiCustomers.php @@ -0,0 +1,686 @@ +name = $name; + + return $this; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set password + * + * @param string $password + * + * @return KimaiCustomers + */ + public function setPassword($password) + { + $this->password = $password; + + return $this; + } + + /** + * Get password + * + * @return string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set passwordresethash + * + * @param string $passwordresethash + * + * @return KimaiCustomers + */ + public function setPasswordresethash($passwordresethash) + { + $this->passwordresethash = $passwordresethash; + + return $this; + } + + /** + * Get passwordresethash + * + * @return string + */ + public function getPasswordresethash() + { + return $this->passwordresethash; + } + + /** + * Set secure + * + * @param string $secure + * + * @return KimaiCustomers + */ + public function setSecure($secure) + { + $this->secure = $secure; + + return $this; + } + + /** + * Get secure + * + * @return string + */ + public function getSecure() + { + return $this->secure; + } + + /** + * Set comment + * + * @param string $comment + * + * @return KimaiCustomers + */ + public function setComment($comment) + { + $this->comment = $comment; + + return $this; + } + + /** + * Get comment + * + * @return string + */ + public function getComment() + { + return $this->comment; + } + + /** + * Set visible + * + * @param boolean $visible + * + * @return KimaiCustomers + */ + public function setVisible($visible) + { + $this->visible = $visible; + + return $this; + } + + /** + * Get visible + * + * @return boolean + */ + public function getVisible() + { + return $this->visible; + } + + /** + * Set filter + * + * @param boolean $filter + * + * @return KimaiCustomers + */ + public function setFilter($filter) + { + $this->filter = $filter; + + return $this; + } + + /** + * Get filter + * + * @return boolean + */ + public function getFilter() + { + return $this->filter; + } + + /** + * Set company + * + * @param string $company + * + * @return KimaiCustomers + */ + public function setCompany($company) + { + $this->company = $company; + + return $this; + } + + /** + * Get company + * + * @return string + */ + public function getCompany() + { + return $this->company; + } + + /** + * Set vat + * + * @param string $vat + * + * @return KimaiCustomers + */ + public function setVat($vat) + { + $this->vat = $vat; + + return $this; + } + + /** + * Get vat + * + * @return string + */ + public function getVat() + { + return $this->vat; + } + + /** + * Set contact + * + * @param string $contact + * + * @return KimaiCustomers + */ + public function setContact($contact) + { + $this->contact = $contact; + + return $this; + } + + /** + * Get contact + * + * @return string + */ + public function getContact() + { + return $this->contact; + } + + /** + * Set street + * + * @param string $street + * + * @return KimaiCustomers + */ + public function setStreet($street) + { + $this->street = $street; + + return $this; + } + + /** + * Get street + * + * @return string + */ + public function getStreet() + { + return $this->street; + } + + /** + * Set zipcode + * + * @param string $zipcode + * + * @return KimaiCustomers + */ + public function setZipcode($zipcode) + { + $this->zipcode = $zipcode; + + return $this; + } + + /** + * Get zipcode + * + * @return string + */ + public function getZipcode() + { + return $this->zipcode; + } + + /** + * Set city + * + * @param string $city + * + * @return KimaiCustomers + */ + public function setCity($city) + { + $this->city = $city; + + return $this; + } + + /** + * Get city + * + * @return string + */ + public function getCity() + { + return $this->city; + } + + /** + * Set country + * + * @param string $country + * + * @return KimaiCustomers + */ + public function setCountry($country) + { + $this->country = $country; + + return $this; + } + + /** + * Get country + * + * @return string + */ + public function getCountry() + { + return $this->country; + } + + /** + * Set phone + * + * @param string $phone + * + * @return KimaiCustomers + */ + public function setPhone($phone) + { + $this->phone = $phone; + + return $this; + } + + /** + * Get phone + * + * @return string + */ + public function getPhone() + { + return $this->phone; + } + + /** + * Set fax + * + * @param string $fax + * + * @return KimaiCustomers + */ + public function setFax($fax) + { + $this->fax = $fax; + + return $this; + } + + /** + * Get fax + * + * @return string + */ + public function getFax() + { + return $this->fax; + } + + /** + * Set mobile + * + * @param string $mobile + * + * @return KimaiCustomers + */ + public function setMobile($mobile) + { + $this->mobile = $mobile; + + return $this; + } + + /** + * Get mobile + * + * @return string + */ + public function getMobile() + { + return $this->mobile; + } + + /** + * Set mail + * + * @param string $mail + * + * @return KimaiCustomers + */ + public function setMail($mail) + { + $this->mail = $mail; + + return $this; + } + + /** + * Get mail + * + * @return string + */ + public function getMail() + { + return $this->mail; + } + + /** + * Set homepage + * + * @param string $homepage + * + * @return KimaiCustomers + */ + public function setHomepage($homepage) + { + $this->homepage = $homepage; + + return $this; + } + + /** + * Get homepage + * + * @return string + */ + public function getHomepage() + { + return $this->homepage; + } + + /** + * Set timezone + * + * @param string $timezone + * + * @return KimaiCustomers + */ + public function setTimezone($timezone) + { + $this->timezone = $timezone; + + return $this; + } + + /** + * Get timezone + * + * @return string + */ + public function getTimezone() + { + return $this->timezone; + } + + /** + * Set trash + * + * @param boolean $trash + * + * @return KimaiCustomers + */ + public function setTrash($trash) + { + $this->trash = $trash; + + return $this; + } + + /** + * Get trash + * + * @return boolean + */ + public function getTrash() + { + return $this->trash; + } + + /** + * Get customerid + * + * @return integer + */ + public function getCustomerid() + { + return $this->customerid; + } +} diff --git a/src/AppBundle/Entity/KimaiExpenses.php b/src/AppBundle/Entity/KimaiExpenses.php new file mode 100644 index 00000000..50215b40 --- /dev/null +++ b/src/AppBundle/Entity/KimaiExpenses.php @@ -0,0 +1,345 @@ +timestamp = $timestamp; + + return $this; + } + + /** + * Get timestamp + * + * @return integer + */ + public function getTimestamp() + { + return $this->timestamp; + } + + /** + * Set userid + * + * @param integer $userid + * + * @return KimaiExpenses + */ + public function setUserid($userid) + { + $this->userid = $userid; + + return $this; + } + + /** + * Get userid + * + * @return integer + */ + public function getUserid() + { + return $this->userid; + } + + /** + * Set projectid + * + * @param integer $projectid + * + * @return KimaiExpenses + */ + public function setProjectid($projectid) + { + $this->projectid = $projectid; + + return $this; + } + + /** + * Get projectid + * + * @return integer + */ + public function getProjectid() + { + return $this->projectid; + } + + /** + * Set designation + * + * @param string $designation + * + * @return KimaiExpenses + */ + public function setDesignation($designation) + { + $this->designation = $designation; + + return $this; + } + + /** + * Get designation + * + * @return string + */ + public function getDesignation() + { + return $this->designation; + } + + /** + * Set comment + * + * @param string $comment + * + * @return KimaiExpenses + */ + public function setComment($comment) + { + $this->comment = $comment; + + return $this; + } + + /** + * Get comment + * + * @return string + */ + public function getComment() + { + return $this->comment; + } + + /** + * Set commenttype + * + * @param boolean $commenttype + * + * @return KimaiExpenses + */ + public function setCommenttype($commenttype) + { + $this->commenttype = $commenttype; + + return $this; + } + + /** + * Get commenttype + * + * @return boolean + */ + public function getCommenttype() + { + return $this->commenttype; + } + + /** + * Set refundable + * + * @param boolean $refundable + * + * @return KimaiExpenses + */ + public function setRefundable($refundable) + { + $this->refundable = $refundable; + + return $this; + } + + /** + * Get refundable + * + * @return boolean + */ + public function getRefundable() + { + return $this->refundable; + } + + /** + * Set cleared + * + * @param boolean $cleared + * + * @return KimaiExpenses + */ + public function setCleared($cleared) + { + $this->cleared = $cleared; + + return $this; + } + + /** + * Get cleared + * + * @return boolean + */ + public function getCleared() + { + return $this->cleared; + } + + /** + * Set multiplier + * + * @param string $multiplier + * + * @return KimaiExpenses + */ + public function setMultiplier($multiplier) + { + $this->multiplier = $multiplier; + + return $this; + } + + /** + * Get multiplier + * + * @return string + */ + public function getMultiplier() + { + return $this->multiplier; + } + + /** + * Set value + * + * @param string $value + * + * @return KimaiExpenses + */ + public function setValue($value) + { + $this->value = $value; + + return $this; + } + + /** + * Get value + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Get expenseid + * + * @return integer + */ + public function getExpenseid() + { + return $this->expenseid; + } +} diff --git a/src/AppBundle/Entity/KimaiFixedrates.php b/src/AppBundle/Entity/KimaiFixedrates.php new file mode 100644 index 00000000..066c83a5 --- /dev/null +++ b/src/AppBundle/Entity/KimaiFixedrates.php @@ -0,0 +1,113 @@ +rate = $rate; + + return $this; + } + + /** + * Get rate + * + * @return string + */ + public function getRate() + { + return $this->rate; + } + + /** + * Set projectid + * + * @param integer $projectid + * + * @return KimaiFixedrates + */ + public function setProjectid($projectid) + { + $this->projectid = $projectid; + + return $this; + } + + /** + * Get projectid + * + * @return integer + */ + public function getProjectid() + { + return $this->projectid; + } + + /** + * Set activityid + * + * @param integer $activityid + * + * @return KimaiFixedrates + */ + public function setActivityid($activityid) + { + $this->activityid = $activityid; + + return $this; + } + + /** + * Get activityid + * + * @return integer + */ + public function getActivityid() + { + return $this->activityid; + } +} diff --git a/src/AppBundle/Entity/KimaiPreferences.php b/src/AppBundle/Entity/KimaiPreferences.php new file mode 100644 index 00000000..56ffbef4 --- /dev/null +++ b/src/AppBundle/Entity/KimaiPreferences.php @@ -0,0 +1,113 @@ +value = $value; + + return $this; + } + + /** + * Get value + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Set option + * + * @param string $option + * + * @return KimaiPreferences + */ + public function setOption($option) + { + $this->option = $option; + + return $this; + } + + /** + * Get option + * + * @return string + */ + public function getOption() + { + return $this->option; + } + + /** + * Set userid + * + * @param integer $userid + * + * @return KimaiPreferences + */ + public function setUserid($userid) + { + $this->userid = $userid; + + return $this; + } + + /** + * Get userid + * + * @return integer + */ + public function getUserid() + { + return $this->userid; + } +} diff --git a/src/AppBundle/Entity/KimaiProjects.php b/src/AppBundle/Entity/KimaiProjects.php new file mode 100644 index 00000000..3bbf3f3d --- /dev/null +++ b/src/AppBundle/Entity/KimaiProjects.php @@ -0,0 +1,345 @@ +customerid = $customerid; + + return $this; + } + + /** + * Get customerid + * + * @return integer + */ + public function getCustomerid() + { + return $this->customerid; + } + + /** + * Set name + * + * @param string $name + * + * @return KimaiProjects + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set comment + * + * @param string $comment + * + * @return KimaiProjects + */ + public function setComment($comment) + { + $this->comment = $comment; + + return $this; + } + + /** + * Get comment + * + * @return string + */ + public function getComment() + { + return $this->comment; + } + + /** + * Set visible + * + * @param boolean $visible + * + * @return KimaiProjects + */ + public function setVisible($visible) + { + $this->visible = $visible; + + return $this; + } + + /** + * Get visible + * + * @return boolean + */ + public function getVisible() + { + return $this->visible; + } + + /** + * Set filter + * + * @param boolean $filter + * + * @return KimaiProjects + */ + public function setFilter($filter) + { + $this->filter = $filter; + + return $this; + } + + /** + * Get filter + * + * @return boolean + */ + public function getFilter() + { + return $this->filter; + } + + /** + * Set trash + * + * @param boolean $trash + * + * @return KimaiProjects + */ + public function setTrash($trash) + { + $this->trash = $trash; + + return $this; + } + + /** + * Get trash + * + * @return boolean + */ + public function getTrash() + { + return $this->trash; + } + + /** + * Set budget + * + * @param string $budget + * + * @return KimaiProjects + */ + public function setBudget($budget) + { + $this->budget = $budget; + + return $this; + } + + /** + * Get budget + * + * @return string + */ + public function getBudget() + { + return $this->budget; + } + + /** + * Set effort + * + * @param string $effort + * + * @return KimaiProjects + */ + public function setEffort($effort) + { + $this->effort = $effort; + + return $this; + } + + /** + * Get effort + * + * @return string + */ + public function getEffort() + { + return $this->effort; + } + + /** + * Set approved + * + * @param string $approved + * + * @return KimaiProjects + */ + public function setApproved($approved) + { + $this->approved = $approved; + + return $this; + } + + /** + * Get approved + * + * @return string + */ + public function getApproved() + { + return $this->approved; + } + + /** + * Set internal + * + * @param boolean $internal + * + * @return KimaiProjects + */ + public function setInternal($internal) + { + $this->internal = $internal; + + return $this; + } + + /** + * Get internal + * + * @return boolean + */ + public function getInternal() + { + return $this->internal; + } + + /** + * Get projectid + * + * @return integer + */ + public function getProjectid() + { + return $this->projectid; + } +} diff --git a/src/AppBundle/Entity/KimaiProjectsActivities.php b/src/AppBundle/Entity/KimaiProjectsActivities.php new file mode 100644 index 00000000..da63d539 --- /dev/null +++ b/src/AppBundle/Entity/KimaiProjectsActivities.php @@ -0,0 +1,175 @@ +budget = $budget; + + return $this; + } + + /** + * Get budget + * + * @return string + */ + public function getBudget() + { + return $this->budget; + } + + /** + * Set effort + * + * @param string $effort + * + * @return KimaiProjectsActivities + */ + public function setEffort($effort) + { + $this->effort = $effort; + + return $this; + } + + /** + * Get effort + * + * @return string + */ + public function getEffort() + { + return $this->effort; + } + + /** + * Set approved + * + * @param string $approved + * + * @return KimaiProjectsActivities + */ + public function setApproved($approved) + { + $this->approved = $approved; + + return $this; + } + + /** + * Get approved + * + * @return string + */ + public function getApproved() + { + return $this->approved; + } + + /** + * Set projectid + * + * @param integer $projectid + * + * @return KimaiProjectsActivities + */ + public function setProjectid($projectid) + { + $this->projectid = $projectid; + + return $this; + } + + /** + * Get projectid + * + * @return integer + */ + public function getProjectid() + { + return $this->projectid; + } + + /** + * Set activityid + * + * @param integer $activityid + * + * @return KimaiProjectsActivities + */ + public function setActivityid($activityid) + { + $this->activityid = $activityid; + + return $this; + } + + /** + * Get activityid + * + * @return integer + */ + public function getActivityid() + { + return $this->activityid; + } +} diff --git a/src/AppBundle/Entity/KimaiRates.php b/src/AppBundle/Entity/KimaiRates.php new file mode 100644 index 00000000..b864500b --- /dev/null +++ b/src/AppBundle/Entity/KimaiRates.php @@ -0,0 +1,146 @@ +rate = $rate; + + return $this; + } + + /** + * Get rate + * + * @return string + */ + public function getRate() + { + return $this->rate; + } + + /** + * Set userid + * + * @param integer $userid + * + * @return KimaiRates + */ + public function setUserid($userid) + { + $this->userid = $userid; + + return $this; + } + + /** + * Get userid + * + * @return integer + */ + public function getUserid() + { + return $this->userid; + } + + /** + * Set projectid + * + * @param integer $projectid + * + * @return KimaiRates + */ + public function setProjectid($projectid) + { + $this->projectid = $projectid; + + return $this; + } + + /** + * Get projectid + * + * @return integer + */ + public function getProjectid() + { + return $this->projectid; + } + + /** + * Set activityid + * + * @param integer $activityid + * + * @return KimaiRates + */ + public function setActivityid($activityid) + { + $this->activityid = $activityid; + + return $this; + } + + /** + * Get activityid + * + * @return integer + */ + public function getActivityid() + { + return $this->activityid; + } +} diff --git a/src/AppBundle/Entity/KimaiStatuses.php b/src/AppBundle/Entity/KimaiStatuses.php new file mode 100644 index 00000000..6394d1d5 --- /dev/null +++ b/src/AppBundle/Entity/KimaiStatuses.php @@ -0,0 +1,66 @@ +status = $status; + + return $this; + } + + /** + * Get status + * + * @return string + */ + public function getStatus() + { + return $this->status; + } + + /** + * Get statusid + * + * @return boolean + */ + public function getStatusid() + { + return $this->statusid; + } +} diff --git a/src/AppBundle/Entity/KimaiUsers.php b/src/AppBundle/Entity/KimaiUsers.php new file mode 100644 index 00000000..63702049 --- /dev/null +++ b/src/AppBundle/Entity/KimaiUsers.php @@ -0,0 +1,562 @@ +name = $name; + + return $this; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set alias + * + * @param string $alias + * + * @return KimaiUsers + */ + public function setAlias($alias) + { + $this->alias = $alias; + + return $this; + } + + /** + * Get alias + * + * @return string + */ + public function getAlias() + { + return $this->alias; + } + + /** + * Set trash + * + * @param boolean $trash + * + * @return KimaiUsers + */ + public function setTrash($trash) + { + $this->trash = $trash; + + return $this; + } + + /** + * Get trash + * + * @return boolean + */ + public function getTrash() + { + return $this->trash; + } + + /** + * Set active + * + * @param boolean $active + * + * @return KimaiUsers + */ + public function setActive($active) + { + $this->active = $active; + + return $this; + } + + /** + * Get active + * + * @return boolean + */ + public function getActive() + { + return $this->active; + } + + /** + * Set mail + * + * @param string $mail + * + * @return KimaiUsers + */ + public function setMail($mail) + { + $this->mail = $mail; + + return $this; + } + + /** + * Get mail + * + * @return string + */ + public function getMail() + { + return $this->mail; + } + + /** + * Set password + * + * @param string $password + * + * @return KimaiUsers + */ + public function setPassword($password) + { + $this->password = $password; + + return $this; + } + + /** + * Get password + * + * @return string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set passwordresethash + * + * @param string $passwordresethash + * + * @return KimaiUsers + */ + public function setPasswordresethash($passwordresethash) + { + $this->passwordresethash = $passwordresethash; + + return $this; + } + + /** + * Get passwordresethash + * + * @return string + */ + public function getPasswordresethash() + { + return $this->passwordresethash; + } + + /** + * Set ban + * + * @param integer $ban + * + * @return KimaiUsers + */ + public function setBan($ban) + { + $this->ban = $ban; + + return $this; + } + + /** + * Get ban + * + * @return integer + */ + public function getBan() + { + return $this->ban; + } + + /** + * Set bantime + * + * @param integer $bantime + * + * @return KimaiUsers + */ + public function setBantime($bantime) + { + $this->bantime = $bantime; + + return $this; + } + + /** + * Get bantime + * + * @return integer + */ + public function getBantime() + { + return $this->bantime; + } + + /** + * Set secure + * + * @param string $secure + * + * @return KimaiUsers + */ + public function setSecure($secure) + { + $this->secure = $secure; + + return $this; + } + + /** + * Get secure + * + * @return string + */ + public function getSecure() + { + return $this->secure; + } + + /** + * Set lastproject + * + * @param integer $lastproject + * + * @return KimaiUsers + */ + public function setLastproject($lastproject) + { + $this->lastproject = $lastproject; + + return $this; + } + + /** + * Get lastproject + * + * @return integer + */ + public function getLastproject() + { + return $this->lastproject; + } + + /** + * Set lastactivity + * + * @param integer $lastactivity + * + * @return KimaiUsers + */ + public function setLastactivity($lastactivity) + { + $this->lastactivity = $lastactivity; + + return $this; + } + + /** + * Get lastactivity + * + * @return integer + */ + public function getLastactivity() + { + return $this->lastactivity; + } + + /** + * Set lastrecord + * + * @param integer $lastrecord + * + * @return KimaiUsers + */ + public function setLastrecord($lastrecord) + { + $this->lastrecord = $lastrecord; + + return $this; + } + + /** + * Get lastrecord + * + * @return integer + */ + public function getLastrecord() + { + return $this->lastrecord; + } + + /** + * Set timeframebegin + * + * @param string $timeframebegin + * + * @return KimaiUsers + */ + public function setTimeframebegin($timeframebegin) + { + $this->timeframebegin = $timeframebegin; + + return $this; + } + + /** + * Get timeframebegin + * + * @return string + */ + public function getTimeframebegin() + { + return $this->timeframebegin; + } + + /** + * Set timeframeend + * + * @param string $timeframeend + * + * @return KimaiUsers + */ + public function setTimeframeend($timeframeend) + { + $this->timeframeend = $timeframeend; + + return $this; + } + + /** + * Get timeframeend + * + * @return string + */ + public function getTimeframeend() + { + return $this->timeframeend; + } + + /** + * Set apikey + * + * @param string $apikey + * + * @return KimaiUsers + */ + public function setApikey($apikey) + { + $this->apikey = $apikey; + + return $this; + } + + /** + * Get apikey + * + * @return string + */ + public function getApikey() + { + return $this->apikey; + } + + /** + * Set globalroleid + * + * @param integer $globalroleid + * + * @return KimaiUsers + */ + public function setGlobalroleid($globalroleid) + { + $this->globalroleid = $globalroleid; + + return $this; + } + + /** + * Get globalroleid + * + * @return integer + */ + public function getGlobalroleid() + { + return $this->globalroleid; + } + + /** + * Get userid + * + * @return integer + */ + public function getUserid() + { + return $this->userid; + } +} diff --git a/var/SymfonyRequirements.php b/var/SymfonyRequirements.php new file mode 100644 index 00000000..7e7723af --- /dev/null +++ b/var/SymfonyRequirements.php @@ -0,0 +1,819 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Users of PHP 5.2 should be able to run the requirements checks. + * This is why the file and all classes must be compatible with PHP 5.2+ + * (e.g. not using namespaces and closures). + * + * ************** CAUTION ************** + * + * DO NOT EDIT THIS FILE as it will be overridden by Composer as part of + * the installation/update process. The original file resides in the + * SensioDistributionBundle. + * + * ************** CAUTION ************** + */ + +/** + * Represents a single PHP requirement, e.g. an installed extension. + * It can be a mandatory requirement or an optional recommendation. + * There is a special subclass, named PhpIniRequirement, to check a php.ini configuration. + * + * @author Tobias Schultze + */ +class Requirement +{ + private $fulfilled; + private $testMessage; + private $helpText; + private $helpHtml; + private $optional; + + /** + * Constructor that initializes the requirement. + * + * @param bool $fulfilled Whether the requirement is fulfilled + * @param string $testMessage The message for testing the requirement + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement + */ + public function __construct($fulfilled, $testMessage, $helpHtml, $helpText = null, $optional = false) + { + $this->fulfilled = (bool) $fulfilled; + $this->testMessage = (string) $testMessage; + $this->helpHtml = (string) $helpHtml; + $this->helpText = null === $helpText ? strip_tags($this->helpHtml) : (string) $helpText; + $this->optional = (bool) $optional; + } + + /** + * Returns whether the requirement is fulfilled. + * + * @return bool true if fulfilled, otherwise false + */ + public function isFulfilled() + { + return $this->fulfilled; + } + + /** + * Returns the message for testing the requirement. + * + * @return string The test message + */ + public function getTestMessage() + { + return $this->testMessage; + } + + /** + * Returns the help text for resolving the problem. + * + * @return string The help text + */ + public function getHelpText() + { + return $this->helpText; + } + + /** + * Returns the help text formatted in HTML. + * + * @return string The HTML help + */ + public function getHelpHtml() + { + return $this->helpHtml; + } + + /** + * Returns whether this is only an optional recommendation and not a mandatory requirement. + * + * @return bool true if optional, false if mandatory + */ + public function isOptional() + { + return $this->optional; + } +} + +/** + * Represents a PHP requirement in form of a php.ini configuration. + * + * @author Tobias Schultze + */ +class PhpIniRequirement extends Requirement +{ + /** + * Constructor that initializes the requirement. + * + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement + */ + public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false) + { + $cfgValue = ini_get($cfgName); + + if (is_callable($evaluation)) { + if (null === $testMessage || null === $helpHtml) { + throw new InvalidArgumentException('You must provide the parameters testMessage and helpHtml for a callback evaluation.'); + } + + $fulfilled = call_user_func($evaluation, $cfgValue); + } else { + if (null === $testMessage) { + $testMessage = sprintf('%s %s be %s in php.ini', + $cfgName, + $optional ? 'should' : 'must', + $evaluation ? 'enabled' : 'disabled' + ); + } + + if (null === $helpHtml) { + $helpHtml = sprintf('Set %s to %s in php.ini*.', + $cfgName, + $evaluation ? 'on' : 'off' + ); + } + + $fulfilled = $evaluation == $cfgValue; + } + + parent::__construct($fulfilled || ($approveCfgAbsence && false === $cfgValue), $testMessage, $helpHtml, $helpText, $optional); + } +} + +/** + * A RequirementCollection represents a set of Requirement instances. + * + * @author Tobias Schultze + */ +class RequirementCollection implements IteratorAggregate +{ + /** + * @var Requirement[] + */ + private $requirements = array(); + + /** + * Gets the current RequirementCollection as an Iterator. + * + * @return Traversable A Traversable interface + */ + public function getIterator() + { + return new ArrayIterator($this->requirements); + } + + /** + * Adds a Requirement. + * + * @param Requirement $requirement A Requirement instance + */ + public function add(Requirement $requirement) + { + $this->requirements[] = $requirement; + } + + /** + * Adds a mandatory requirement. + * + * @param bool $fulfilled Whether the requirement is fulfilled + * @param string $testMessage The message for testing the requirement + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addRequirement($fulfilled, $testMessage, $helpHtml, $helpText = null) + { + $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, false)); + } + + /** + * Adds an optional recommendation. + * + * @param bool $fulfilled Whether the recommendation is fulfilled + * @param string $testMessage The message for testing the recommendation + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addRecommendation($fulfilled, $testMessage, $helpHtml, $helpText = null) + { + $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, true)); + } + + /** + * Adds a mandatory requirement in form of a php.ini configuration. + * + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) + { + $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, false)); + } + + /** + * Adds an optional recommendation in form of a php.ini configuration. + * + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) + { + $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, true)); + } + + /** + * Adds a requirement collection to the current set of requirements. + * + * @param RequirementCollection $collection A RequirementCollection instance + */ + public function addCollection(RequirementCollection $collection) + { + $this->requirements = array_merge($this->requirements, $collection->all()); + } + + /** + * Returns both requirements and recommendations. + * + * @return Requirement[] + */ + public function all() + { + return $this->requirements; + } + + /** + * Returns all mandatory requirements. + * + * @return Requirement[] + */ + public function getRequirements() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns the mandatory requirements that were not met. + * + * @return Requirement[] + */ + public function getFailedRequirements() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && !$req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns all optional recommendations. + * + * @return Requirement[] + */ + public function getRecommendations() + { + $array = array(); + foreach ($this->requirements as $req) { + if ($req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns the recommendations that were not met. + * + * @return Requirement[] + */ + public function getFailedRecommendations() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && $req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns whether a php.ini configuration is not correct. + * + * @return bool php.ini configuration problem? + */ + public function hasPhpIniConfigIssue() + { + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && $req instanceof PhpIniRequirement) { + return true; + } + } + + return false; + } + + /** + * Returns the PHP configuration file (php.ini) path. + * + * @return string|false php.ini file path + */ + public function getPhpIniConfigPath() + { + return get_cfg_var('cfg_file_path'); + } +} + +/** + * This class specifies all requirements and optional recommendations that + * are necessary to run the Symfony Standard Edition. + * + * @author Tobias Schultze + * @author Fabien Potencier + */ +class SymfonyRequirements extends RequirementCollection +{ + const LEGACY_REQUIRED_PHP_VERSION = '5.3.3'; + const REQUIRED_PHP_VERSION = '5.5.9'; + + /** + * Constructor that initializes the requirements. + */ + public function __construct() + { + /* mandatory requirements follow */ + + $installedPhpVersion = phpversion(); + $requiredPhpVersion = $this->getPhpRequiredVersion(); + + $this->addRecommendation( + $requiredPhpVersion, + 'Vendors should be installed in order to check all requirements.', + 'Run the composer install command.', + 'Run the "composer install" command.' + ); + + if (false !== $requiredPhpVersion) { + $this->addRequirement( + version_compare($installedPhpVersion, $requiredPhpVersion, '>='), + sprintf('PHP version must be at least %s (%s installed)', $requiredPhpVersion, $installedPhpVersion), + sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. + Before using Symfony, upgrade your PHP installation, preferably to the latest version.', + $installedPhpVersion, $requiredPhpVersion), + sprintf('Install PHP %s or newer (installed version is %s)', $requiredPhpVersion, $installedPhpVersion) + ); + } + + $this->addRequirement( + version_compare($installedPhpVersion, '5.3.16', '!='), + 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', + 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)' + ); + + $this->addRequirement( + is_dir(__DIR__.'/../vendor/composer'), + 'Vendor libraries must be installed', + 'Vendor libraries are missing. Install composer following instructions from http://getcomposer.org/. '. + 'Then run "php composer.phar install" to install them.' + ); + + $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache'; + + $this->addRequirement( + is_writable($cacheDir), + 'app/cache/ or var/cache/ directory must be writable', + 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.' + ); + + $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs'; + + $this->addRequirement( + is_writable($logsDir), + 'app/logs/ or var/logs/ directory must be writable', + 'Change the permissions of either "app/logs/" or "var/logs/" directory so that the web server can write into it.' + ); + + if (version_compare($installedPhpVersion, '7.0.0', '<')) { + $this->addPhpIniRequirement( + 'date.timezone', true, false, + 'date.timezone setting must be set', + 'Set the "date.timezone" setting in php.ini* (like Europe/Paris).' + ); + } + + if (false !== $requiredPhpVersion && version_compare($installedPhpVersion, $requiredPhpVersion, '>=')) { + $timezones = array(); + foreach (DateTimeZone::listAbbreviations() as $abbreviations) { + foreach ($abbreviations as $abbreviation) { + $timezones[$abbreviation['timezone_id']] = true; + } + } + + $this->addRequirement( + isset($timezones[@date_default_timezone_get()]), + sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()), + 'Your default timezone is not supported by PHP. Check for typos in your php.ini file and have a look at the list of deprecated timezones at http://php.net/manual/en/timezones.others.php.' + ); + } + + $this->addRequirement( + function_exists('iconv'), + 'iconv() must be available', + 'Install and enable the iconv extension.' + ); + + $this->addRequirement( + function_exists('json_encode'), + 'json_encode() must be available', + 'Install and enable the JSON extension.' + ); + + $this->addRequirement( + function_exists('session_start'), + 'session_start() must be available', + 'Install and enable the session extension.' + ); + + $this->addRequirement( + function_exists('ctype_alpha'), + 'ctype_alpha() must be available', + 'Install and enable the ctype extension.' + ); + + $this->addRequirement( + function_exists('token_get_all'), + 'token_get_all() must be available', + 'Install and enable the Tokenizer extension.' + ); + + $this->addRequirement( + function_exists('simplexml_import_dom'), + 'simplexml_import_dom() must be available', + 'Install and enable the SimpleXML extension.' + ); + + if (function_exists('apc_store') && ini_get('apc.enabled')) { + if (version_compare($installedPhpVersion, '5.4.0', '>=')) { + $this->addRequirement( + version_compare(phpversion('apc'), '3.1.13', '>='), + 'APC version must be at least 3.1.13 when using PHP 5.4', + 'Upgrade your APC extension (3.1.13+).' + ); + } else { + $this->addRequirement( + version_compare(phpversion('apc'), '3.0.17', '>='), + 'APC version must be at least 3.0.17', + 'Upgrade your APC extension (3.0.17+).' + ); + } + } + + $this->addPhpIniRequirement('detect_unicode', false); + + if (extension_loaded('suhosin')) { + $this->addPhpIniRequirement( + 'suhosin.executor.include.whitelist', + create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'), + false, + 'suhosin.executor.include.whitelist must be configured correctly in php.ini', + 'Add "phar" to suhosin.executor.include.whitelist in php.ini*.' + ); + } + + if (extension_loaded('xdebug')) { + $this->addPhpIniRequirement( + 'xdebug.show_exception_trace', false, true + ); + + $this->addPhpIniRequirement( + 'xdebug.scream', false, true + ); + + $this->addPhpIniRecommendation( + 'xdebug.max_nesting_level', + create_function('$cfgValue', 'return $cfgValue > 100;'), + true, + 'xdebug.max_nesting_level should be above 100 in php.ini', + 'Set "xdebug.max_nesting_level" to e.g. "250" in php.ini* to stop Xdebug\'s infinite recursion protection erroneously throwing a fatal error in your project.' + ); + } + + $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null; + + $this->addRequirement( + null !== $pcreVersion, + 'PCRE extension must be available', + 'Install the PCRE extension (version 8.0+).' + ); + + if (extension_loaded('mbstring')) { + $this->addPhpIniRequirement( + 'mbstring.func_overload', + create_function('$cfgValue', 'return (int) $cfgValue === 0;'), + true, + 'string functions should not be overloaded', + 'Set "mbstring.func_overload" to 0 in php.ini* to disable function overloading by the mbstring extension.' + ); + } + + /* optional recommendations follow */ + + if (file_exists(__DIR__.'/../vendor/composer')) { + require_once __DIR__.'/../vendor/autoload.php'; + + try { + $r = new ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle'); + + $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php'); + } catch (ReflectionException $e) { + $contents = ''; + } + $this->addRecommendation( + file_get_contents(__FILE__) === $contents, + 'Requirements file should be up-to-date', + 'Your requirements file is outdated. Run composer install and re-check your configuration.' + ); + } + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.3.4', '>='), + 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions', + 'Your project might malfunction randomly due to PHP bug #52083 ("Notice: Trying to get property of non-object"). Install PHP 5.3.4 or newer.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.3.8', '>='), + 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156', + 'Install PHP 5.3.8 or newer if your project uses annotations.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.4.0', '!='), + 'You should not use PHP 5.4.0 due to the PHP bug #61453', + 'Your project might not work properly due to the PHP bug #61453 ("Cannot dump definitions which have method calls"). Install PHP 5.4.1 or newer.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.4.11', '>='), + 'When using the logout handler from the Symfony Security Component, you should have at least PHP 5.4.11 due to PHP bug #63379 (as a workaround, you can also set invalidate_session to false in the security logout handler configuration)', + 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.' + ); + + $this->addRecommendation( + (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<')) + || + version_compare($installedPhpVersion, '5.4.8', '>='), + 'You should use PHP 5.3.18+ or PHP 5.4.8+ to always get nice error messages for fatal errors in the development environment due to PHP bug #61767/#60909', + 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.' + ); + + if (null !== $pcreVersion) { + $this->addRecommendation( + $pcreVersion >= 8.0, + sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion), + 'PCRE 8.0+ is preconfigured in PHP since 5.3.2 but you are using an outdated version of it. Symfony probably works anyway but it is recommended to upgrade your PCRE extension.' + ); + } + + $this->addRecommendation( + class_exists('DomDocument'), + 'PHP-DOM and PHP-XML modules should be installed', + 'Install and enable the PHP-DOM and the PHP-XML modules.' + ); + + $this->addRecommendation( + function_exists('mb_strlen'), + 'mb_strlen() should be available', + 'Install and enable the mbstring extension.' + ); + + $this->addRecommendation( + function_exists('iconv'), + 'iconv() should be available', + 'Install and enable the iconv extension.' + ); + + $this->addRecommendation( + function_exists('utf8_decode'), + 'utf8_decode() should be available', + 'Install and enable the XML extension.' + ); + + $this->addRecommendation( + function_exists('filter_var'), + 'filter_var() should be available', + 'Install and enable the filter extension.' + ); + + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->addRecommendation( + function_exists('posix_isatty'), + 'posix_isatty() should be available', + 'Install and enable the php_posix extension (used to colorize the CLI output).' + ); + } + + $this->addRecommendation( + extension_loaded('intl'), + 'intl extension should be available', + 'Install and enable the intl extension (used for validators).' + ); + + if (extension_loaded('intl')) { + // in some WAMP server installations, new Collator() returns null + $this->addRecommendation( + null !== new Collator('fr_FR'), + 'intl extension should be correctly configured', + 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.' + ); + + // check for compatible ICU versions (only done when you have the intl extension) + if (defined('INTL_ICU_VERSION')) { + $version = INTL_ICU_VERSION; + } else { + $reflector = new ReflectionExtension('intl'); + + ob_start(); + $reflector->info(); + $output = strip_tags(ob_get_clean()); + + preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches); + $version = $matches[1]; + } + + $this->addRecommendation( + version_compare($version, '4.0', '>='), + 'intl ICU version should be at least 4+', + 'Upgrade your intl extension with a newer ICU version (4+).' + ); + + if (class_exists('Symfony\Component\Intl\Intl')) { + $this->addRecommendation( + \Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion(), + sprintf('intl ICU version installed on your system is outdated (%s) and does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), + 'To get the latest internationalization data upgrade the ICU system package and the intl PHP extension.' + ); + if (\Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion()) { + $this->addRecommendation( + \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), + sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), + 'To avoid internationalization data inconsistencies upgrade the symfony/intl component.' + ); + } + } + + $this->addPhpIniRecommendation( + 'intl.error_level', + create_function('$cfgValue', 'return (int) $cfgValue === 0;'), + true, + 'intl.error_level should be 0 in php.ini', + 'Set "intl.error_level" to "0" in php.ini* to inhibit the messages when an error occurs in ICU functions.' + ); + } + + $accelerator = + (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) + || + (extension_loaded('apc') && ini_get('apc.enabled')) + || + (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable')) + || + (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) + || + (extension_loaded('xcache') && ini_get('xcache.cacher')) + || + (extension_loaded('wincache') && ini_get('wincache.ocenabled')) + ; + + $this->addRecommendation( + $accelerator, + 'a PHP accelerator should be installed', + 'Install and/or enable a PHP accelerator (highly recommended).' + ); + + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $this->addRecommendation( + $this->getRealpathCacheSize() >= 5 * 1024 * 1024, + 'realpath_cache_size should be at least 5M in php.ini', + 'Setting "realpath_cache_size" to e.g. "5242880" or "5M" in php.ini* may improve performance on Windows significantly in some cases.' + ); + } + + $this->addPhpIniRecommendation('short_open_tag', false); + + $this->addPhpIniRecommendation('magic_quotes_gpc', false, true); + + $this->addPhpIniRecommendation('register_globals', false, true); + + $this->addPhpIniRecommendation('session.auto_start', false); + + $this->addRecommendation( + class_exists('PDO'), + 'PDO should be installed', + 'Install PDO (mandatory for Doctrine).' + ); + + if (class_exists('PDO')) { + $drivers = PDO::getAvailableDrivers(); + $this->addRecommendation( + count($drivers) > 0, + sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'), + 'Install PDO drivers (mandatory for Doctrine).' + ); + } + } + + /** + * Loads realpath_cache_size from php.ini and converts it to int. + * + * (e.g. 16k is converted to 16384 int) + * + * @return int + */ + protected function getRealpathCacheSize() + { + $size = ini_get('realpath_cache_size'); + $size = trim($size); + $unit = strtolower(substr($size, -1, 1)); + switch ($unit) { + case 'g': + return $size * 1024 * 1024 * 1024; + case 'm': + return $size * 1024 * 1024; + case 'k': + return $size * 1024; + default: + return (int) $size; + } + } + + /** + * Defines PHP required version from Symfony version. + * + * @return string|false The PHP required version or false if it could not be guessed + */ + protected function getPhpRequiredVersion() + { + if (!file_exists($path = __DIR__.'/../composer.lock')) { + return false; + } + + $composerLock = json_decode(file_get_contents($path), true); + foreach ($composerLock['packages'] as $package) { + $name = $package['name']; + if ('symfony/symfony' !== $name && 'symfony/http-kernel' !== $name) { + continue; + } + + return (int) $package['version'][1] > 2 ? self::REQUIRED_PHP_VERSION : self::LEGACY_REQUIRED_PHP_VERSION; + } + + return false; + } +} diff --git a/web/apple-touch-icon.png b/web/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..11f17e6d89ee3b416218ede42b66ec1dd81507f2 GIT binary patch literal 10784 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 f!getFailedRequirements(); +$minorProblems = $symfonyRequirements->getFailedRecommendations(); +$hasMajorProblems = (bool) count($majorProblems); +$hasMinorProblems = (bool) count($minorProblems); + +?> + + + + + + Symfony Configuration Checker + + + +
+
+ + + +
+ +
+
+
+

Configuration Checker

+

+ This script analyzes your system to check whether is + ready to run Symfony applications. +

+ + +

Major problems

+

Major problems have been detected and must be fixed before continuing:

+
    + +
  1. getTestMessage() ?> +

    getHelpHtml() ?>

    +
  2. + +
+ + + +

Recommendations

+

+ Additionally, toTo enhance your Symfony experience, + it’s recommended that you fix the following: +

+
    + +
  1. getTestMessage() ?> +

    getHelpHtml() ?>

    +
  2. + +
+ + + hasPhpIniConfigIssue()): ?> +

* + getPhpIniConfigPath()): ?> + Changes to the php.ini file must be done in "getPhpIniConfigPath() ?>". + + To change settings, create a "php.ini". + +

+ + + +

All checks passed successfully. Your system is ready to run Symfony applications.

+ + + +
+
+
+
Symfony Standard Edition
+
+ + diff --git a/web/favicon.ico b/web/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..864803618e0888f8463c0b30038633c018f939cc GIT binary patch literal 1150 zcmaizUr1AN6vuy3^oL%AsH~?RBQobI=ccaNk~J)QQD?41%~lUl4?1&O#PTUgotA-9 zsDZB9Dx!CTsTlUUw?V5x4YK5>5M*n+r|-FL<1!X8KKK0Y+4-K|Ip_DgLX_ZFS}O27 zD6VZ4Vy_V55P%DwO+Snf_;2^FO_X=lLt9ZPzz)z@c~ldI{Q@#slCUp96W9qfs%tQ*oXL6(4`+eocJ>~>XTi!Tx6`NE0#k>{2Oo} ztK9}W2EBZ;)|i=(L{i>6UU}sHFa>93DOU?()OGNh>)?K^U==8P)fsB(g!Z`H)Oe2K zAL8V3c}P=UQK;p237iK()-qO$m3q1_)5Uf>)l?g3abZDzzr3uhc^8WX1k|b(vZuwUYd`2nOcXxJ?f6`A^uQ+Js>k0*)1Z4Ms zn^LJ1IeVQ{e)veSS*BUf_2AsdWHfQT>0~mg)MIP0(fZmtg+pPwU~40@=~Q74tpCV* z?ho@%#bU9aI76NxIeHwFNF*?aMWwIcY>?`WCUqU3p`BrU7P-H#KQlGy-*EQ!{qC?| zBHyTwqR}XwX|T}E>o*E#8G_CNzUOjq9hiOEpwp*$E~o3w^mcAenG2uk(7mCIUZ>~% zB=me1mhaCn;Cq#;BX2o}t+|y3?+$Lc6{R^^&pjZF^ literal 0 HcmV?d00001