diff --git a/phpstan-critical.neon b/phpstan-critical.neon index 31bd2f99f..2e2f778d8 100644 --- a/phpstan-critical.neon +++ b/phpstan-critical.neon @@ -90,51 +90,21 @@ parameters: count: 1 path: src/Bundle/ChillTaskBundle/Controller/TaskController.php - - - message: "#^Undefined variable\\: \\$id$#" - count: 1 - path: src/Bundle/ChillFamilyMembersBundle/Controller/FamilyMemberController.php - - message: "#^Call to an undefined method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\AbstractCRUDController\\:\\:getRoleFor\\(\\)\\.$#" count: 1 path: src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php - - - message: "#^Call to an undefined method Chill\\\\MainBundle\\\\Command\\\\ChillImportUsersCommand\\:\\:tempOutput\\(\\)\\.$#" - count: 1 - path: src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php - - - - message: "#^Access to an undefined property Chill\\\\MainBundle\\\\Controller\\\\AdminCountryCRUDController\\:\\:\\$paginatorFactory\\.$#" - count: 1 - path: src/Bundle/ChillMainBundle/Controller/AdminCountryCRUDController.php - - message: "#^Call to an undefined method Chill\\\\MainBundle\\\\Controller\\\\UserController\\:\\:createEditForm\\(\\)\\.$#" count: 1 path: src/Bundle/ChillMainBundle/Controller/UserController.php - - - message: "#^Access to an undefined property Chill\\\\MainBundle\\\\Entity\\\\RoleScope\\:\\:\\$new\\.$#" - count: 1 - path: src/Bundle/ChillMainBundle/Entity/RoleScope.php - - message: "#^Undefined variable\\: \\$current$#" count: 1 path: src/Bundle/ChillMainBundle/Pagination/PageGenerator.php - - - message: "#^Access to an undefined property Chill\\\\MainBundle\\\\Routing\\\\MenuComposer\\:\\:\\$routeCollection\\.$#" - count: 1 - path: src/Bundle/ChillMainBundle/Routing/MenuComposer.php - - - - message: "#^Access to an undefined property Chill\\\\MainBundle\\\\Search\\\\SearchApiResult\\:\\:\\$relevance\\.$#" - count: 2 - path: src/Bundle/ChillMainBundle/Search/SearchApiResult.php - - message: "#^Call to an undefined method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AbstractChillVoter\\:\\:getSupportedAttributes\\(\\)\\.$#" count: 1 @@ -155,46 +125,6 @@ parameters: count: 3 path: src/Bundle/ChillPersonBundle/Controller/PersonController.php - - - message: "#^Access to an undefined property Chill\\\\PersonBundle\\\\Controller\\\\TimelinePersonController\\:\\:\\$authorizationHelper\\.$#" - count: 1 - path: src/Bundle/ChillPersonBundle/Controller/TimelinePersonController.php - - - - message: "#^Access to an undefined property Chill\\\\PersonBundle\\\\DataFixtures\\\\ORM\\\\LoadHousehold\\:\\:\\$personIds\\.$#" - count: 2 - path: src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadHousehold.php - - - - message: "#^Access to an undefined property Chill\\\\PersonBundle\\\\Form\\\\CreationPersonType\\:\\:\\$centerTransformer\\.$#" - count: 1 - path: src/Bundle/ChillPersonBundle/Form/CreationPersonType.php - - - - message: "#^Access to an undefined property Chill\\\\ReportBundle\\\\Timeline\\\\TimelineReportProvider\\:\\:\\$security\\.$#" - count: 4 - path: src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php - - - - message: "#^Access to an undefined property Chill\\\\AsideActivityBundle\\\\Entity\\\\AsideActivityCategory\\:\\:\\$oldParent\\.$#" - count: 2 - path: src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivityCategory.php - - - - message: "#^Access to an undefined property Chill\\\\AsideActivityBundle\\\\Form\\\\AsideActivityCategoryType\\:\\:\\$categoryRender\\.$#" - count: 2 - path: src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityCategoryType.php - - - - message: "#^Access to an undefined property Chill\\\\AsideActivityBundle\\\\Form\\\\AsideActivityFormType\\:\\:\\$translatableStringHelper\\.$#" - count: 1 - path: src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php - - - - message: "#^Access to an undefined property Chill\\\\CalendarBundle\\\\DataFixtures\\\\ORM\\\\LoadCalendarRange\\:\\:\\$userRepository\\.$#" - count: 2 - path: src/Bundle/ChillCalendarBundle/DataFixtures/ORM/LoadCalendarRange.php - - message: "#^Call to an undefined method Chill\\\\ThirdPartyBundle\\\\Form\\\\Type\\\\PickThirdPartyTypeCategoryType\\:\\:transform\\(\\)\\.$#" count: 1 diff --git a/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivityCategory.php b/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivityCategory.php index 09087226c..143e430f7 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivityCategory.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivityCategory.php @@ -44,13 +44,15 @@ class AsideActivityCategory * @ORM\ManyToOne(targetEntity=AsideActivityCategory::class, inversedBy="children") * @ORM\JoinColumn(nullable=true) */ - private $parent; + private AsideActivityCategory $parent; /** * @ORM\OneToMany(targetEntity=AsideActivityCategory::class, mappedBy="parent") */ private $children; + private AsideActivityCategory $oldParent; + public function __construct() { $this->children = new ArrayCollection(); diff --git a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityCategoryType.php b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityCategoryType.php index 0060ab1b9..e438998b0 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityCategoryType.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityCategoryType.php @@ -1,5 +1,7 @@ translatableStringHelper = $translatableStringHelper; + public function __construct( + CategoryRender $categoryRender + ) { $this->categoryRender = $categoryRender; } diff --git a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php index 53ce5bd40..f517279bb 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php @@ -25,18 +25,16 @@ use Symfony\Component\Templating\EngineInterface; final class AsideActivityFormType extends AbstractType { - protected array $timeChoices; + private array $timeChoices; private TokenStorageInterface $storage; private CategoryRender $categoryRender; public function __construct ( - TranslatableStringHelper $translatableStringHelper, ParameterBagInterface $parameterBag, TokenStorageInterface $storage, CategoryRender $categoryRender ){ $this->timeChoices = $parameterBag->get('chill_aside_activity.form.time_duration'); - $this->translatableStringHelper = $translatableStringHelper; $this->storage = $storage; $this->categoryRender = $categoryRender; } diff --git a/src/Bundle/ChillCalendarBundle/DataFixtures/ORM/LoadCalendarRange.php b/src/Bundle/ChillCalendarBundle/DataFixtures/ORM/LoadCalendarRange.php index c23871c26..42218da03 100644 --- a/src/Bundle/ChillCalendarBundle/DataFixtures/ORM/LoadCalendarRange.php +++ b/src/Bundle/ChillCalendarBundle/DataFixtures/ORM/LoadCalendarRange.php @@ -1,5 +1,7 @@ chillMainLogger = $chillMainLogger; } - + /** * @Route( * "{_locale}/family-members/family-members/by-person/{id}", @@ -54,11 +42,11 @@ class FamilyMemberController extends Controller public function indexAction(Person $person) { $this->denyAccessUnlessGranted(FamilyMemberVoter::SHOW, $person); - + $familyMembers = $this->em ->getRepository(FamilyMember::class) ->findByPerson($person); - + return $this->render('ChillAMLIFamilyMembersBundle:FamilyMember:index.html.twig', array( 'person' => $person, 'familyMembers' => $familyMembers @@ -76,26 +64,26 @@ class FamilyMemberController extends Controller $familyMember = (new FamilyMember()) ->setPerson($person) ; - + $this->denyAccessUnlessGranted(FamilyMemberVoter::CREATE, $familyMember); - + $form = $this->createForm(FamilyMemberType::class, $familyMember); $form->add('submit', SubmitType::class); - + $form->handleRequest($request); - + if ($form->isSubmitted() and $form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($familyMember); $em->flush(); - + $this->addFlash('success', $this->translator->trans('Family member created')); - + return $this->redirectToRoute('chill_family_members_family_members_index', [ 'id' => $person->getId() ]); } - + return $this->render('ChillAMLIFamilyMembersBundle:FamilyMember:new.html.twig', array( 'form' => $form->createView(), 'person' => $person @@ -111,37 +99,37 @@ class FamilyMemberController extends Controller public function editAction(FamilyMember $familyMember, Request $request) { $this->denyAccessUnlessGranted(FamilyMemberVoter::UPDATE, $familyMember); - + $form = $this->createForm(FamilyMemberType::class, $familyMember); $form->add('submit', SubmitType::class); - + $form->handleRequest($request); - + if ($form->isSubmitted() and $form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->flush(); - + $this->addFlash('success', $this->translator->trans('Family member updated')); - + return $this->redirectToRoute('chill_family_members_family_members_index', [ 'id' => $familyMember->getPerson()->getId() ]); } - + return $this->render('ChillAMLIFamilyMembersBundle:FamilyMember:edit.html.twig', array( 'familyMember' => $familyMember, 'form' => $form->createView(), 'person' => $familyMember->getPerson() )); } - + /** - * + * * @Route( * "{_locale}/family-members/family-members/{id}/delete", * name="chill_family_members_family_members_delete" * ) - * + * * @param FamilyMember $familyMember * @param Request $request * @return \Symfony\Component\BrowserKit\Response @@ -183,7 +171,7 @@ class FamilyMemberController extends Controller 'delete_form' => $form->createView() )); } - + /** * @Route( * "{_locale}/family-members/family-members/{id}/view", @@ -193,12 +181,12 @@ class FamilyMemberController extends Controller public function viewAction(FamilyMember $familyMember) { $this->denyAccessUnlessGranted(FamilyMemberVoter::SHOW, $familyMember); - + return $this->render('ChillAMLIFamilyMembersBundle:FamilyMember:view.html.twig', array( 'familyMember' => $familyMember )); } - + /** * Creates a form to delete a help request entity by id. * diff --git a/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php b/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php index a1d28483d..451ce8aab 100644 --- a/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php +++ b/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php @@ -1,5 +1,7 @@ getDoctrine() + $e = $this + ->getDoctrine() ->getRepository($this->getEntityClass()) ->find($id); - if (NULL === $e) { + if (null === $e) { throw $this->createNotFoundException(sprintf("The object %s for id %s is not found", $this->getEntityClass(), $id)); } @@ -47,61 +46,50 @@ class AbstractCRUDController extends AbstractController /** * Create an entity. - * - * @param string $action - * @param Request $request + * * @return object */ protected function createEntity(string $action, Request $request): object { - $type = $this->getEntityClass(); - - return new $type; + return $this->getEntityClass(); } /** * Count the number of entities * - * By default, count all entities. You can customize the query by + * By default, count all entities. You can customize the query by * using the method `customizeQuery`. - * - * @param string $action - * @param Request $request - * @return int */ protected function countEntities(string $action, Request $request, $_format): int { return $this->buildQueryEntities($action, $request) ->select('COUNT(e)') ->getQuery() - ->getSingleScalarResult() - ; + ->getSingleScalarResult(); } /** * Query the entity. - * + * * By default, get all entities. You can customize the query by using the * method `customizeQuery`. - * + * * The method `orderEntity` is called internally to order entities. - * + * * It returns, by default, a query builder. - * */ protected function queryEntities(string $action, Request $request, string $_format, PaginatorInterface $paginator) { $query = $this->buildQueryEntities($action, $request) ->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber()) ->setMaxResults($paginator->getItemsPerPage()); - + // allow to order queries and return the new query return $this->orderQuery($action, $query, $request, $paginator, $_format); } /** * Add ordering fields in the query build by self::queryEntities - * */ protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator, $_format) { @@ -112,14 +100,12 @@ class AbstractCRUDController extends AbstractController * Build the base query for listing all entities. * * This method is used internally by `countEntities` `queryEntities` - * + * * This base query does not contains any `WHERE` or `SELECT` clauses. You * can add some by using the method `customizeQuery`. * * The alias for the entity is "e". - * - * @param string $action - * @param Request $request + * * @return QueryBuilder */ protected function buildQueryEntities(string $action, Request $request) @@ -127,8 +113,7 @@ class AbstractCRUDController extends AbstractController $qb = $this->getDoctrine()->getManager() ->createQueryBuilder() ->select('e') - ->from($this->getEntityClass(), 'e') - ; + ->from($this->getEntityClass(), 'e'); $this->customizeQuery($action, $request, $qb); @@ -138,55 +123,55 @@ class AbstractCRUDController extends AbstractController protected function customizeQuery(string $action, Request $request, $query): void {} /** - * Get the result of the query + * Get the result of the query. */ - protected function getQueryResult(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query) + protected function getQueryResult(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query) { return $query->getQuery()->getResult(); } protected function onPreIndex(string $action, Request $request, string $_format): ?Response - { - return null; - } - - /** - * method used by indexAction - */ - protected function onPreIndexBuildQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator): ?Response - { + { return null; } /** - * method used by indexAction + * Method used by indexAction. + */ + protected function onPreIndexBuildQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator): ?Response + { + return null; + } + + /** + * Method used by indexAction. */ protected function onPostIndexBuildQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query): ?Response { return null; } - + /** - * method used by indexAction + * Method used by indexAction. */ protected function onPostIndexFetchQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $entities): ?Response { return null; } - + /** - * Get the complete FQDN of the class - * - * @return string the complete fqdn of the class + * Get the FQDN of the class. + * + * @return string The FQDN of the class */ protected function getEntityClass(): string { return $this->crudConfig['class']; } - + /** - * called on post fetch entity + * Called on post fetch entity. */ protected function onPostFetchEntity(string $action, Request $request, $entity, $_format): ?Response { @@ -194,7 +179,7 @@ class AbstractCRUDController extends AbstractController } /** - * Called on post check ACL + * Called on post check ACL. */ protected function onPostCheckACL(string $action, Request $request, string $_format, $entity): ?Response { @@ -203,23 +188,23 @@ class AbstractCRUDController extends AbstractController /** * check the acl. Called by every action. - * - * By default, check the role given by `getRoleFor` for the value given in + * + * By default, check the role given by `getRoleFor` for the value given in * $entity. - * + * * Throw an \Symfony\Component\Security\Core\Exception\AccessDeniedHttpException * if not accessible. - * + * * @throws \Symfony\Component\Security\Core\Exception\AccessDeniedHttpException */ protected function checkACL(string $action, Request $request, string $_format, $entity = null) { + // @TODO: Implements abstract getRoleFor method or do it in the interface. $this->denyAccessUnlessGranted($this->getRoleFor($action, $request, $entity, $_format), $entity); } /** - * - * @return string the crud name + * @return string The crud name. */ protected function getCrudName(): string { @@ -230,7 +215,7 @@ class AbstractCRUDController extends AbstractController { return $this->crudConfig['actions'][$action]; } - + /** * Set the crud configuration * @@ -241,9 +226,6 @@ class AbstractCRUDController extends AbstractController $this->crudConfig = $config; } - /** - * @return PaginatorFactory - */ protected function getPaginatorFactory(): PaginatorFactory { return $this->container->get('chill_main.paginator_factory'); @@ -254,9 +236,6 @@ class AbstractCRUDController extends AbstractController return $this->get('validator'); } - /** - * @return array - */ public static function getSubscribedServices(): array { return \array_merge( diff --git a/src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php b/src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php index 99bd17d8f..d3fb6980f 100644 --- a/src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php +++ b/src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php @@ -1,7 +1,10 @@ passwordEncoder = $passwordEncoder; $this->validator = $validator; $this->logger = $logger; - - + $this->userRepository = $em->getRepository(User::class); - + parent::__construct('chill:main:import-users'); } - - protected function configure() { $this @@ -126,25 +79,24 @@ class ChillImportUsersCommand extends Command ->addArgument('csvfile', InputArgument::REQUIRED, 'Path to the csv file. Columns are: `username`, `email`, `center` (can contain alias), `permission group`') ->addOption('grouping-centers', null, InputOption::VALUE_OPTIONAL, 'Path to a csv file to aggregate multiple centers into a single alias') ->addOption('dry-run', null, InputOption::VALUE_NONE, 'Do not commit the changes') - ->addOption('csv-dump', null, InputOption::VALUE_REQUIRED, 'A path to dump a summary of the created file') - ; + ->addOption('csv-dump', null, InputOption::VALUE_REQUIRED, 'A path to dump a summary of the created file'); } protected function execute(InputInterface $input, OutputInterface $output) { $this->tempOutput = $output; $this->tempInput = $input; - + if ($input->getOption('dry-run')) { $this->doChanges = false; } - + $this->prepareWriter(); - + if ($input->hasOption('grouping-centers')) { $this->prepareGroupingCenters(); } - + try { $this->loadUsers(); } @@ -152,19 +104,19 @@ class ChillImportUsersCommand extends Command throw $e; } } - + protected function prepareWriter() { $this->output = $output = Writer::createFromPath($this->tempInput ->getOption('csv-dump'), 'a+'); - + $output->insertOne([ 'email', 'username', 'id' ]); } - + protected function appendUserToFile(User $user) { $this->output->insertOne( [ @@ -173,35 +125,35 @@ class ChillImportUsersCommand extends Command $user->getId() ]); } - + protected function loadUsers() { $reader = Reader::createFromPath($this->tempInput->getArgument('csvfile')); $reader->setHeaderOffset(0); - + foreach ($reader->getRecords() as $line => $r) { $this->logger->debug("starting handling new line", [ 'line' => $line ]); - + if ($this->doesUserExists($r)) { $this->tempOutput->writeln(sprintf("User with username '%s' already " . "exists, skipping", $r["username"])); - + $this->logger->info("One user already exists, skipping creation", [ 'username_in_file' => $r['username'], 'email_in_file' => $r['email'], 'line' => $line ]); - + continue; } - + $user = $this->createUser($line, $r); $this->appendUserToFile($user); } } - + protected function doesUserExists($data) { if ($this->userRepository->countByUsernameOrEmail($data['username']) > 0) { @@ -211,10 +163,10 @@ class ChillImportUsersCommand extends Command if ($this->userRepository->countByUsernameOrEmail($data['email']) > 0) { return true; } - + return false; } - + protected function createUser($offset, $data) { $user = new User(); @@ -222,41 +174,41 @@ class ChillImportUsersCommand extends Command ->setEmail(\trim($data['email'])) ->setUsername(\trim($data['username'])) ->setEnabled(true) - ->setPassword($this->passwordEncoder->encodePassword($user, + ->setPassword($this->passwordEncoder->encodePassword($user, \bin2hex(\random_bytes(32)))) ; - + $errors = $this->validator->validate($user); - + if ($errors->count() > 0) { $errorMessages = $this->concatenateViolations($errors); - + $this->tempOutput->writeln(sprintf("%d errors found with user with username \"%s\" at line %d", $errors->count(), $data['username'], $offset)); $this->tempOutput->writeln($errorMessages); throw new \RuntimeException("Found errors while creating an user. " . "Watch messages in command output"); } - + $pgs = $this->getPermissionGroup($data['permission group']); $centers = $this->getCenters($data['center']); - + foreach($pgs as $pg) { foreach ($centers as $center) { $groupcenter = $this->createOrGetGroupCenter($center, $pg); - + if (FALSE === $user->getGroupCenters()->contains($groupcenter)) { $user->addGroupCenter($groupcenter); } } } - + if ($this->doChanges) { $this->em->persist($user); $this->em->flush(); } - + $this->logger->notice("Create user", [ 'username' => $user->getUsername(), 'id' => $user->getId(), @@ -265,65 +217,58 @@ class ChillImportUsersCommand extends Command return $user; } - + protected function getPermissionGroup($alias) { if (\array_key_exists($alias, $this->permissionGroups)) { return $this->permissionGroups[$alias]; } - + $permissionGroupsByName = []; - + foreach($this->em->getRepository(PermissionsGroup::class) ->findAll() as $permissionGroup) { $permissionGroupsByName[$permissionGroup->getName()] = $permissionGroup; } - + if (count($permissionGroupsByName) === 0) { throw new \RuntimeException("no permission groups found. Create them " . "before importing users"); } - - $question = new ChoiceQuestion("To which permission groups associate with \"$alias\" ?", + + $question = new ChoiceQuestion("To which permission groups associate with \"$alias\" ?", \array_keys($permissionGroupsByName)); $question ->setMultiselect(true) ->setAutocompleterValues(\array_keys($permissionGroupsByName)) ->setNormalizer(function($value) { if (NULL === $value) { return ''; } - + return \trim($value); }) ; $helper = $this->getHelper('question'); - + $keys = $helper->ask($this->tempInput, $this->tempOutput, $question); - + $this->tempOutput->writeln("You have chosen ".\implode(", ", $keys)); - - if ($helper->ask($this->tempInput, $this->tempOutput, + + if ($helper->ask($this->tempInput, $this->tempOutput, new ConfirmationQuestion("Are you sure ?", true))) { - + foreach ($keys as $key) { $this->permissionGroups[$alias][] = $permissionGroupsByName[$key]; } - + return $this->permissionGroups[$alias]; - } else { - $this->logger->error("Error while responding to a a question"); - - $this->tempOutput("Ok, I accept, but I do not know what to do. Please try again."); - - throw new \RuntimeException("Error while responding to a question"); } + + $this->logger->error('Error while responding to a a question'); + $this->tempOutput->writeln('Ok, I accept, but I do not know what to do. Please try again.'); + + throw new \RuntimeException('Error while responding to a question'); } - - /** - * - * @param Center $center - * @param \Chill\MainBundle\Command\PermissionGroup $pg - * @return GroupCenter - */ + protected function createOrGetGroupCenter(Center $center, PermissionsGroup $pg): GroupCenter { if (\array_key_exists($center->getId(), $this->groupCenters)) { @@ -331,36 +276,36 @@ class ChillImportUsersCommand extends Command return $this->groupCenters[$center->getId()][$pg->getId()]; } } - + $repository = $this->em->getRepository(GroupCenter::class); - + $groupCenter = $repository->findOneBy(array( 'center' => $center, 'permissionsGroup' => $pg )); - + if ($groupCenter === NULL) { $groupCenter = new GroupCenter(); $groupCenter ->setCenter($center) ->setPermissionsGroup($pg) ; - + $this->em->persist($groupCenter); } - + $this->groupCenters[$center->getId()][$pg->getId()] = $groupCenter; - + return $groupCenter; } - + protected function prepareGroupingCenters() { $reader = Reader::createFromPath($this->tempInput->getOption('grouping-centers')); $reader->setHeaderOffset(0); - + foreach ($reader->getRecords() as $r) { - $this->centers[$r['alias']] = + $this->centers[$r['alias']] = \array_merge( $this->centers[$r['alias']] ?? [], $this->getCenters($r['center'] @@ -368,18 +313,18 @@ class ChillImportUsersCommand extends Command ); } } - + /** * return a list of centers matching the name of alias. - * + * * If the name match one center, this center is returned in an array. - * - * If the name match an alias, the centers corresponding to the alias are + * + * If the name match an alias, the centers corresponding to the alias are * returned in an array. - * + * * If the center is not found or alias is not created, a new center is created * and suggested to user - * + * * @param string $name the name of the center or the alias regrouping center * @return Center[] */ @@ -387,62 +332,62 @@ class ChillImportUsersCommand extends Command { // sanitize $name = \trim($name); - + if (\array_key_exists($name, $this->centers)) { return $this->centers[$name]; } - + // search for a center with given name $center = $this->em->getRepository(Center::class) ->findOneByName($name); - + if ($center instanceof Center) { $this->centers[$name] = [$center]; - + return $this->centers[$name]; } - + // suggest and create $center = (new Center()) ->setName($name); - + $this->tempOutput->writeln("Center with name \"$name\" not found."); $qFormatter = $this->getHelper('question'); $question = new ConfirmationQuestion("Create a center with name \"$name\" ?", true); - + if ($qFormatter->ask($this->tempInput, $this->tempOutput, $question)) { $this->centers[$name] = [ $center ]; - + $errors = $this->validator->validate($center); - + if ($errors->count() > 0) { $errorMessages = $this->concatenateViolations($errors); - + $this->tempOutput->writeln(sprintf("%d errors found with center with name \"%s\"", $errors->count(), $name)); $this->tempOutput->writeln($errorMessages); - + throw new \RuntimeException("Found errors while creating one center. " . "Watch messages in command output"); } - + $this->em->persist($center); - + return $this->centers[$name]; } - + return null; } - + protected function concatenateViolations(ConstraintViolationListInterface $list) { $str = []; - + foreach ($list as $e) { /* @var $e \Symfony\Component\Validator\ConstraintViolationInterface */ $str[] = $e->getMessage(); } - + return \implode(";", $str); } - + } diff --git a/src/Bundle/ChillMainBundle/Controller/AdminCountryCRUDController.php b/src/Bundle/ChillMainBundle/Controller/AdminCountryCRUDController.php index 310a36c60..3be418698 100644 --- a/src/Bundle/ChillMainBundle/Controller/AdminCountryCRUDController.php +++ b/src/Bundle/ChillMainBundle/Controller/AdminCountryCRUDController.php @@ -1,20 +1,12 @@ paginatorFactory = $paginator; - } + } diff --git a/src/Bundle/ChillMainBundle/Controller/UserController.php b/src/Bundle/ChillMainBundle/Controller/UserController.php index bb8203011..bd2ad89d7 100644 --- a/src/Bundle/ChillMainBundle/Controller/UserController.php +++ b/src/Bundle/ChillMainBundle/Controller/UserController.php @@ -136,20 +136,17 @@ class UserController extends CRUDController ]); } - /** - * - * - * @param User $user - * @return \Symfony\Component\Form\Form - */ - private function createEditPasswordForm(User $user) + private function createEditPasswordForm(User $user): FormInterface { - return $this->createForm(UserPasswordType::class, null, array( - 'user' => $user - )) + return $this->createForm( + UserPasswordType::class, + null, + [ + 'user' => $user + ] + ) ->add('submit', SubmitType::class, array('label' => 'Change password')) - ->remove('actual_password') - ; + ->remove('actual_password'); } /** diff --git a/src/Bundle/ChillMainBundle/Entity/RoleScope.php b/src/Bundle/ChillMainBundle/Entity/RoleScope.php index 7842267a9..315e8f594 100644 --- a/src/Bundle/ChillMainBundle/Entity/RoleScope.php +++ b/src/Bundle/ChillMainBundle/Entity/RoleScope.php @@ -1,23 +1,5 @@ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - namespace Chill\MainBundle\Entity; use Doctrine\ORM\Mapping as ORM; @@ -28,38 +10,30 @@ use Doctrine\Common\Collections\ArrayCollection; * @ORM\Entity * @ORM\Table(name="role_scopes") * @ORM\Cache(usage="NONSTRICT_READ_WRITE", region="acl_cache_region") - * - * @author Julien Fastré */ class RoleScope { /** - * @var integer - * * @ORM\Id * @ORM\Column(name="id", type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ - private $id; - + private int $id; + /** - * @var string - * * @ORM\Column(type="string", length=255) */ - private $role; - + private string $role; + /** - * @var Scope - * * @ORM\ManyToOne( * targetEntity="Chill\MainBundle\Entity\Scope", * inversedBy="roleScopes") * @ORM\JoinColumn(nullable=true, name="scope_id") * @ORM\Cache(usage="NONSTRICT_READ_WRITE") */ - private $scope; - + private Scope $scope; + /** * @var Collection * @@ -68,16 +42,14 @@ class RoleScope * mappedBy="roleScopes") */ private $permissionsGroups; - - - /** - * RoleScope constructor. - */ + + private bool $new; + public function __construct() { $this->new = true; $this->permissionsGroups = new ArrayCollection(); } - + /** * @return int */ @@ -101,7 +73,7 @@ class RoleScope { return $this->scope; } - + /** * @param type $role * @return RoleScope @@ -120,7 +92,7 @@ class RoleScope public function setScope(Scope $scope = null) { $this->scope = $scope; - + return $this; } } diff --git a/src/Bundle/ChillMainBundle/Pagination/PageGenerator.php b/src/Bundle/ChillMainBundle/Pagination/PageGenerator.php index 26add87fa..93c481a2e 100644 --- a/src/Bundle/ChillMainBundle/Pagination/PageGenerator.php +++ b/src/Bundle/ChillMainBundle/Pagination/PageGenerator.php @@ -1,50 +1,23 @@ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +declare(strict_types=1); namespace Chill\MainBundle\Pagination; /** - * PageGenerator associated with a Paginator - * - * @author Julien Fastré - * @author Champs Libres + * PageGenerator associated with a Paginator. */ class PageGenerator implements \Iterator { - /** - * - * @var Paginator - */ - protected $paginator; - - /** - * - * @var int - */ - protected $current = 1; - - public function __construct(Paginator $paginator) + protected Paginator $paginator; + + protected int $current = 1; + + public function __construct(Paginator $paginator) { $this->paginator = $paginator;; } - + public function current() { return $this->paginator->getPage($current); @@ -67,7 +40,7 @@ class PageGenerator implements \Iterator public function valid() { - return $this->current > 0 + return $this->current > 0 && $this->current <= $this->paginator->countPages(); } } diff --git a/src/Bundle/ChillMainBundle/Routing/MenuComposer.php b/src/Bundle/ChillMainBundle/Routing/MenuComposer.php index 0bcee4c81..b1883c61d 100644 --- a/src/Bundle/ChillMainBundle/Routing/MenuComposer.php +++ b/src/Bundle/ChillMainBundle/Routing/MenuComposer.php @@ -1,5 +1,7 @@ all() as $routeKey => $route) { if ($route->hasOption('menus')) { - + if (array_key_exists($menuId, $route->getOption('menus'))) { $route = $route->getOption('menus')[$menuId]; @@ -101,12 +88,12 @@ class MenuComposer return $routes; } - + public function getMenuFor($menuId, array $parameters = array()) { $routes = $this->getRoutesFor($menuId, $parameters); $menu = $this->menuFactory->createItem($menuId); - + // build menu from routes foreach ($routes as $order => $route) { $menu->addChild($this->translator->trans($route['label']), [ @@ -121,24 +108,24 @@ class MenuComposer ]) ; } - + if ($this->hasLocalMenuBuilder($menuId)) { foreach ($this->localMenuBuilders[$menuId] as $builder) { /* @var $builder LocalMenuBuilderInterface */ $builder->buildMenu($menuId, $menu, $parameters['args']); } } - + $this->reorderMenu($menu); - + return $menu; } - + /** * recursive function to resolve the order of a array of routes. - * If the order chosen in routing.yml is already in used, find the + * If the order chosen in routing.yml is already in used, find the * first next order available. - * + * * @param array $routes the routes previously added * @param int $order * @return int @@ -151,41 +138,41 @@ class MenuComposer return $order; } } - - private function reorderMenu(ItemInterface $menu) + + private function reorderMenu(ItemInterface $menu) { $ordered = []; $unordered = []; - + foreach ($menu->getChildren() as $name => $item) { $order = $item->getExtra('order'); - + if ($order !== null) { $ordered[$this->resolveOrder($ordered, $order)] = $name; } else { $unordered = $name; } } - + ksort($ordered); - + $menus = \array_merge(\array_values($ordered), $unordered); $menu->reorderChildren($menus); } - - - public function addLocalMenuBuilder(LocalMenuBuilderInterface $menuBuilder, $menuId) + + + public function addLocalMenuBuilder(LocalMenuBuilderInterface $menuBuilder, $menuId) { $this->localMenuBuilders[$menuId][] = $menuBuilder; } - + /** * Return true if the menu has at least one builder. - * + * * This function is a helper to determine if the method `getMenuFor` * should be used, or `getRouteFor`. The method `getMenuFor` should be used * if the result is true (it **does** exists at least one menu builder. - * + * * @param string $menuId * @return bool */ diff --git a/src/Bundle/ChillMainBundle/Search/SearchApiResult.php b/src/Bundle/ChillMainBundle/Search/SearchApiResult.php index bbc66877f..c44db3339 100644 --- a/src/Bundle/ChillMainBundle/Search/SearchApiResult.php +++ b/src/Bundle/ChillMainBundle/Search/SearchApiResult.php @@ -1,5 +1,7 @@ relevance = $relevance; @@ -20,7 +24,7 @@ class SearchApiResult $this->result = $result; return $this; - } + } /** * @Serializer\Groups({"read"}) diff --git a/src/Bundle/ChillMainBundle/Security/Authorization/AbstractChillVoter.php b/src/Bundle/ChillMainBundle/Security/Authorization/AbstractChillVoter.php index 9131a6501..fec4da627 100644 --- a/src/Bundle/ChillMainBundle/Security/Authorization/AbstractChillVoter.php +++ b/src/Bundle/ChillMainBundle/Security/Authorization/AbstractChillVoter.php @@ -1,34 +1,17 @@ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +declare(strict_types=1); namespace Chill\MainBundle\Security\Authorization; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\User\UserInterface; /** * Voter for Chill software. * * This abstract Voter provide generic methods to handle object specific to Chill - * - * - * @author Julien Fastré */ abstract class AbstractChillVoter extends Voter implements ChillVoterInterface { @@ -39,6 +22,8 @@ abstract class AbstractChillVoter extends Voter implements ChillVoterInterface . 'getSupportedAttributes and getSupportedClasses methods.', E_USER_DEPRECATED); + // @TODO: getSupportedAttributes() should be created in here and made abstract or in ChillVoterInterface. + // @TODO: getSupportedClasses() should be created in here and made abstract or in ChillVoterInterface. return \in_array($attribute, $this->getSupportedAttributes($attribute)) && \in_array(\get_class($subject), $this->getSupportedClasses()); } @@ -49,7 +34,7 @@ abstract class AbstractChillVoter extends Voter implements ChillVoterInterface . 'methods introduced by Symfony 3.0, and do not rely on ' . 'isGranted method', E_USER_DEPRECATED); + // @TODO: isGranted() should be created in here and made abstract or in ChillVoterInterface. return $this->isGranted($attribute, $subject, $token->getUser()); } - } diff --git a/src/Bundle/ChillPersonBundle/Controller/TimelinePersonController.php b/src/Bundle/ChillPersonBundle/Controller/TimelinePersonController.php index 4e3d67755..389c723ce 100644 --- a/src/Bundle/ChillPersonBundle/Controller/TimelinePersonController.php +++ b/src/Bundle/ChillPersonBundle/Controller/TimelinePersonController.php @@ -1,87 +1,62 @@ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +declare(strict_types=1); namespace Chill\PersonBundle\Controller; +use Chill\MainBundle\Security\Authorization\AuthorizationHelperInterface; +use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Privacy\PrivacyEvent; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; use Chill\MainBundle\Timeline\TimelineBuilder; use Chill\MainBundle\Pagination\PaginatorFactory; use Chill\PersonBundle\Security\Authorization\PersonVoter; -use Chill\MainBundle\Security\Authorization\AuthorizationHelper; -use Symfony\Component\Security\Core\Role\Role; class TimelinePersonController extends AbstractController { - protected EventDispatcherInterface $eventDispatcher; - + protected TimelineBuilder $timelineBuilder; - + protected PaginatorFactory $paginatorFactory; - - /** - * TimelinePersonController constructor. - * - * @param EventDispatcherInterface $eventDispatcher - */ + public function __construct( EventDispatcherInterface $eventDispatcher, TimelineBuilder $timelineBuilder, - PaginatorFactory $paginatorFactory, - AuthorizationHelper $authorizationHelper + PaginatorFactory $paginatorFactory ) { $this->eventDispatcher = $eventDispatcher; $this->timelineBuilder = $timelineBuilder; $this->paginatorFactory = $paginatorFactory; - $this->authorizationHelper = $authorizationHelper; } - - + public function personAction(Request $request, $person_id) { $person = $this->getDoctrine() - ->getRepository('ChillPersonBundle:Person') + ->getRepository(Person::class) ->find($person_id); if ($person === NULL) { throw $this->createNotFoundException(); } - + $this->denyAccessUnlessGranted(PersonVoter::SEE, $person); - - $nbItems = $this->timelineBuilder->countItems('person', + + $nbItems = $this->timelineBuilder->countItems('person', [ 'person' => $person ] ); - + $paginator = $this->paginatorFactory->create($nbItems); - + $event = new PrivacyEvent($person, array('action' => 'timeline')); $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event); - + return $this->render('ChillPersonBundle:Timeline:index.html.twig', array ( 'timeline' => $this->timelineBuilder->getTimelineHTML( - 'person', + 'person', array('person' => $person), $paginator->getCurrentPage()->getFirstItemNumber(), $paginator->getItemsPerPage() diff --git a/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadHousehold.php b/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadHousehold.php index 14420ed88..50bf94e58 100644 --- a/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadHousehold.php +++ b/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadHousehold.php @@ -1,5 +1,7 @@ editorFactory = $editorFactory; @@ -149,14 +153,14 @@ class LoadHousehold extends Fixture implements DependentFixtureInterface private function preparePersonIds() { + // @TODO: Remove this and make this service stateless $this->personIds = $this->em ->createQuery('SELECT p.id FROM '.Person::class.' p '. 'JOIN p.center c '. 'WHERE c.name = :center ' ) ->setParameter('center', 'Center A') - ->getScalarResult() - ; + ->getScalarResult(); \shuffle($this->personIds); } @@ -169,9 +173,7 @@ class LoadHousehold extends Fixture implements DependentFixtureInterface for ($i=0; $i < $nb; $i++) { $personId = \array_pop($this->personIds)['id']; - $persons[] = $this->em->getRepository(Person::class) - ->find($personId) - ; + $persons[] = $this->em->getRepository(Person::class)->find($personId); } return $persons; diff --git a/src/Bundle/ChillPersonBundle/Form/CreationPersonType.php b/src/Bundle/ChillPersonBundle/Form/CreationPersonType.php index 3fa8f5cda..704a6e47b 100644 --- a/src/Bundle/ChillPersonBundle/Form/CreationPersonType.php +++ b/src/Bundle/ChillPersonBundle/Form/CreationPersonType.php @@ -1,28 +1,10 @@ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +declare(strict_types=1); namespace Chill\PersonBundle\Form; use Chill\MainBundle\Form\Event\CustomizeFormEvent; -use Chill\MainBundle\Repository\CenterRepository; use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Security\Authorization\PersonVoter; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; @@ -30,12 +12,9 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer; -use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Chill\MainBundle\Form\Type\ChillDateType; use Chill\MainBundle\Form\Type\PickCenterType; use Chill\PersonBundle\Form\Type\GenderType; -use Chill\MainBundle\Form\Type\DataTransformer\CenterTransformer; use Chill\PersonBundle\Config\ConfigPersonAltNamesHelper; use Chill\PersonBundle\Form\Type\PersonAltNameType; @@ -43,27 +22,19 @@ final class CreationPersonType extends AbstractType { // TODO: This is only used in test. // TODO: See if this is still valid and update accordingly. - const NAME = 'chill_personbundle_person_creation'; + public const NAME = 'chill_personbundle_person_creation'; - private CenterRepository $centerRepository; - - /** - * - * @var ConfigPersonAltNamesHelper - */ - protected $configPersonAltNamesHelper; + private ConfigPersonAltNamesHelper $configPersonAltNamesHelper; private EventDispatcherInterface $dispatcher; private bool $askCenters; public function __construct( - CenterRepository $centerRepository, ConfigPersonAltNamesHelper $configPersonAltNamesHelper, EventDispatcherInterface $dispatcher, ParameterBagInterface $parameterBag ) { - $this->centerTransformer = $centerRepository; $this->configPersonAltNamesHelper = $configPersonAltNamesHelper; $this->dispatcher = $dispatcher; $this->askCenters = $parameterBag->get('chill_main')['acl']['form_show_centers']; diff --git a/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php b/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php index 49e237d87..a0e77bbaa 100644 --- a/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php +++ b/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php @@ -1,22 +1,6 @@ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +declare(strict_types=1); namespace Chill\ReportBundle\Timeline; @@ -38,38 +22,39 @@ use Chill\MainBundle\Timeline\TimelineSingleQuery; */ class TimelineReportProvider implements TimelineProviderInterface { - + protected EntityManager $em; - + protected AuthorizationHelper $helper; - + protected CustomFieldsHelper $customFieldsHelper; - - protected $showEmptyValues; - + + protected bool $showEmptyValues; + + private Security $security; + public function __construct( EntityManager $em, AuthorizationHelper $helper, Security $security, CustomFieldsHelper $customFieldsHelper, $showEmptyValues - ) - { + ) { $this->em = $em; $this->helper = $helper; $this->security = $security; $this->customFieldsHelper = $customFieldsHelper; $this->showEmptyValues = $showEmptyValues; } - + /** - * + * * {@inheritDoc} */ public function fetchQuery($context, array $args) { $this->checkContext($context); - + $report = $this->em->getClassMetadata(Report::class); [$where, $parameters] = $this->getWhereClause($context, $args); @@ -84,7 +69,7 @@ class TimelineReportProvider implements TimelineProviderInterface 'parameters' => $parameters ]); } - + private function getWhereClause(string $context, array $args): array { switch ($context) { @@ -102,7 +87,7 @@ class TimelineReportProvider implements TimelineProviderInterface $report = $this->em->getClassMetadata(Report::class); $person = $this->em->getClassMetadata(Person::class); $role = new Role('CHILL_REPORT_SEE'); - $reachableCenters = $this->helper->getReachableCenters($this->security->getUser(), + $reachableCenters = $this->helper->getReachableCenters($this->security->getUser(), $role); $reportPersonId = $report->getAssociationMapping('person')['joinColumns'][0]['name']; $reportScopeId = $report->getAssociationMapping('scope')['joinColumns'][0]['name']; @@ -123,13 +108,13 @@ class TimelineReportProvider implements TimelineProviderInterface } // add the center id to the parameters - $parameters[] = $center->getId(); + $parameters[] = $center->getId(); // loop over scopes $scopeIds = []; - foreach ($this->helper->getReachableScopes($this->security->getUser(), + foreach ($this->helper->getReachableScopes($this->security->getUser(), $role, $center) as $scope) { if (\in_array($scope->getId(), $scopeIds)) { - continue; + continue; } $scopeIds[] = $scope->getId(); } @@ -173,7 +158,7 @@ class TimelineReportProvider implements TimelineProviderInterface // this is the final clause that we are going to fill $clause = "{report}.{person_id} = ? AND {report}.{scopes_id} IN ({scopes_ids})"; // iterate over reachable scopes - $scopes = $this->helper->getReachableScopes($this->security->getUser(), $role, + $scopes = $this->helper->getReachableScopes($this->security->getUser(), $role, $args['person']->getCenter()); foreach ($scopes as $scope) { @@ -194,16 +179,16 @@ class TimelineReportProvider implements TimelineProviderInterface $clause, [ '{report}' => $report->getTableName(), - '{person_id}' => $reportPersonId, + '{person_id}' => $reportPersonId, '{scopes_id}' => $reportScopeId, - '{scopes_ids}' => \implode(', ', + '{scopes_ids}' => \implode(', ', \array_fill(0, \count($parameters)-1, '?')) ] ), $parameters ]; } - + private function getFromClause(string $context): string { $report = $this->em->getClassMetadata(Report::class); @@ -229,30 +214,30 @@ class TimelineReportProvider implements TimelineProviderInterface } /** - * + * * {@inheritDoc} */ public function getEntities(array $ids) { $reports = $this->em->getRepository('ChillReportBundle:Report') ->findBy(array('id' => $ids)); - + $result = array(); foreach($reports as $report) { $result[$report->getId()] = $report; } - + return $result; } /** - * + * * {@inheritDoc} */ public function getEntityTemplate($entity, $context, array $args) { $this->checkContext($context); - + return array( 'template' => 'ChillReportBundle:Timeline:report.html.twig', 'template_data' => array( @@ -262,19 +247,19 @@ class TimelineReportProvider implements TimelineProviderInterface ) ); } - + protected function getFieldsToRender(Report $entity, $context, array $args = array()) { //gather all custom fields which should appears in summary $gatheredFields = array(); - + if (array_key_exists('summary_fields', $entity->getCFGroup()->getOptions())) { // keep in memory title $title = null; $subtitle = null; - + foreach ($entity->getCFGroup()->getCustomFields() as $customField) { - if (in_array($customField->getSlug(), + if (in_array($customField->getSlug(), $entity->getCFGroup()->getOptions()['summary_fields'])) { // if we do not want to show empty values if ($this->showEmptyValues === false) { @@ -304,23 +289,23 @@ class TimelineReportProvider implements TimelineProviderInterface } } } - + return $gatheredFields; - + } /** - * + * * {@inheritDoc} */ public function supportsType($type) { return $type === 'report'; } - + /** * check if the context is supported - * + * * @param string $context * @throws \LogicException if the context is not supported */