RecalculateReputationCommand.php 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. namespace Muzich\CoreBundle\Command;
  3. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  4. use Symfony\Component\Console\Input\InputArgument;
  5. use Symfony\Component\Console\Input\InputInterface;
  6. use Symfony\Component\Console\Input\InputOption;
  7. use Symfony\Component\Console\Output\OutputInterface;
  8. class RecalculateReputationCommand extends ContainerAwareCommand
  9. {
  10. protected function configure()
  11. {
  12. $this
  13. ->setName('users:reputation:recalculate')
  14. ->setDescription('Recalcul des scores de reputation')
  15. ->addOption('user', null, InputOption::VALUE_REQUIRED, 'username du compte a traiter')
  16. // ->addArgument('sites', InputArgument::OPTIONAL, 'Liste exhaustive des site a traiter')
  17. // ->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters')
  18. ;
  19. }
  20. protected function execute(InputInterface $input, OutputInterface $output)
  21. {
  22. $doctrine = $this->getContainer()->get('doctrine');
  23. $em = $doctrine->getEntityManager();
  24. $output->writeln('#');
  25. $output->writeln('## Script de recalcul des scores de reputation ##');
  26. $output->writeln('#');
  27. $output->writeln('<info>Début du traitement ...</info>');
  28. if (($username = $input->getOption('user')))
  29. {
  30. $output->writeln('<info>Utilisateur choisis: '.$username.'</info>');
  31. $user = $em->createQuery(
  32. "SELECT u FROM MuzichCoreBundle:User u"
  33. . " WHERE u.username = :username"
  34. )->setParameter('username', $username)
  35. ->getResult()
  36. ;
  37. if (count($user))
  38. {
  39. $output->writeln('<info>Utilisateur trouvé</info>');
  40. $users = array($user[0]);
  41. }
  42. }
  43. else
  44. {
  45. // Sinon on traite tout les utilisateurs
  46. $users = $em->createQuery(
  47. "SELECT u FROM MuzichCoreBundle:User u"
  48. )
  49. ->getResult()
  50. ;
  51. }
  52. // Pour chaque utilisateur a traiter
  53. foreach ($users as $user)
  54. {
  55. $user_points = 0;
  56. // On calcule pour les éléments
  57. $elements = $em->createQuery(
  58. "SELECT e FROM MuzichCoreBundle:Element e"
  59. . " WHERE e.owner = :uid"
  60. )->setParameter('uid', $user->getId())
  61. ->getResult()
  62. ;
  63. $coef_element_point = $this->getContainer()->getParameter('reputation_element_point_value');
  64. $element_points = 0;
  65. foreach ($elements as $element)
  66. {
  67. $element_points += $element->getPoints();
  68. }
  69. $user->setReputation($element_points * $coef_element_point);
  70. $em->persist($user);
  71. }
  72. $output->writeln('<info>Enregistrement en base ...</info>');
  73. $em->flush();
  74. $output->writeln('<info>Terminé !</info>');
  75. }
  76. }