setName('users:reputation:recalculate') ->setDescription('Recalcul des scores de reputation') ->addOption('user', null, InputOption::VALUE_REQUIRED, 'username du compte a traiter') // ->addArgument('sites', InputArgument::OPTIONAL, 'Liste exhaustive des site a traiter') // ->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters') ; } protected function execute(InputInterface $input, OutputInterface $output) { $doctrine = $this->getContainer()->get('doctrine'); $em = $doctrine->getEntityManager(); $output->writeln('#'); $output->writeln('## Script de recalcul des scores de reputation ##'); $output->writeln('#'); $output->writeln('Début du traitement ...'); if (($username = $input->getOption('user'))) { $output->writeln('Utilisateur choisis: '.$username.''); $user = $em->createQuery( "SELECT u FROM MuzichCoreBundle:User u" . " WHERE u.username = :username" )->setParameter('username', $username) ->getResult() ; if (count($user)) { $output->writeln('Utilisateur trouvé'); $users = array($user[0]); } } else { // Sinon on traite tout les utilisateurs $users = $em->createQuery( "SELECT u FROM MuzichCoreBundle:User u" ) ->getResult() ; } // Pour chaque utilisateur a traiter foreach ($users as $user) { $user_points = 0; /* * On calcule pour les éléments */ $elements = $em->createQuery( "SELECT e FROM MuzichCoreBundle:Element e" . " WHERE e.owner = :uid" )->setParameter('uid', $user->getId()) ->getResult() ; $coef_element_point = $this->getContainer()->getParameter('reputation_element_point_value'); $element_points = 0; foreach ($elements as $element) { $element_points += $element->getPoints(); } /* * On calcule pour les favoris */ $coef_element_fav = $this->getContainer()->getParameter('reputation_element_favorite_value'); $count_favs = 0; $fav = $em->createQuery( "SELECT COUNT(f) FROM MuzichCoreBundle:UsersElementsFavorites f" . " JOIN f.element e" . " WHERE e.owner = :uid AND f.user != :uid" )->setParameter('uid', $user->getId()) ->getScalarResult() ; if (count($fav)) { if (count($fav[0])) { $count_favs = $fav[0][1]; } } /* * Calcul pour les utilisateurs suivis */ $coef_follow = $this->getContainer()->getParameter('reputation_element_follow_value'); $count_follow = 0; $fol = $em->createQuery( "SELECT COUNT(f) FROM MuzichCoreBundle:FollowUser f" . " WHERE f.followed = :uid" )->setParameter('uid', $user->getId()) ->getScalarResult() ; if (count($fol)) { if (count($fol[0])) { $count_follow = $fol[0][1]; } } /* * Calcul pour les tags proposés sur des éléments */ $coef_tag_prop = $this->getContainer()->getParameter('reputation_element_tags_element_prop_value'); try { $count_tag_prop = $em->createQuery( "SELECT a.count FROM MuzichCoreBundle:EventArchive a" . " WHERE a.user = :uid AND a.type = :type" )->setParameters(array( 'uid' => $user->getId(), 'type' => EventArchive::PROP_TAGS_ELEMENT_ACCEPTED )) ->getSingleScalarResult() ; } catch (\Doctrine\ORM\NoResultException $exc) { $count_tag_prop = 0; } $points = ($element_points * $coef_element_point) + ($count_favs * $coef_element_fav) + ($count_follow * $coef_follow) + ($count_tag_prop * $coef_tag_prop) ; $user->setReputation($points); $em->persist($user); $em->flush(); } $output->writeln('Terminé !'); } }