requestStack->getMainRequest()->headers->get(self::HTTP_X_SWITCH_USER) === $identifier) return $this->getEntityManager()->find(Access::class, $identifier); return $this->findAccessByUsernameAndAccessId($identifier, (int) $this->requestStack->getMainRequest()->headers->get(self::ACCESS_NAME_HEADER)); } /** * Récupère un access grâce à son username et son ID * @param string $username * @param int $id * @return mixed * @throws \Doctrine\ORM\NonUniqueResultException */ private function findAccessByUsernameAndAccessId(string $username, int $id): mixed { $entityManager = $this->getEntityManager(); return $entityManager->createQuery( 'SELECT a FROM App\Entity\Access\Access a INNER JOIN a.person p WHERE p.username = :query AND a.id = :id' ) ->setParameter('query', $username) ->setParameter('id', $id) ->getOneOrNullResult(); } /** * Retourne tous les access qui appartiennent à une organisation qui est active dans un réseau * @param Access $access * @return mixed * @throws \Exception */ public function findAllValidAccesses(Access $access): mixed { $datetime = new \DateTime(); $today = $datetime->format('Y-m-d'); return $this->createQueryBuilder('access') ->innerJoin('access.organization', 'organization') ->innerJoin('organization.networkOrganizations', 'networkOrganizations') ->where('access.person = :person') ->andWhere('networkOrganizations.startDate <= :today') ->setParameter('person', $access->getPerson()) ->setParameter('today', $today) ->getQuery() ->getResult() ; } /** * Retoune si oui ou non un access possède une fonction F active à une date précise * @param Access $access * @param FunctionEnum $function * @param DateTime $date * @return bool */ public function hasGotFunctionAtThisDate(Access $access, FunctionEnum $function, \DateTime $date): bool { $this->_em->getFilters()->disable('date_time_filter'); $qb = $this->createQueryBuilder('access'); $qb ->innerJoin('access.organizationFunction', 'organization_function') ->innerJoin('organization_function.functionType', 'function_type') ->where('function_type.mission = :mission') ->andWhere('access.id = :id') ->setParameter('id', $access->getId()) ->setParameter('mission', $function) ; DateConditions::addDateInPeriodCondition($qb, 'organization_function', $date->format('Y-m-d')); $result = count($qb->getQuery()->getResult()) > 0; $this->_em->getFilters()->enable('date_time_filter'); return $result; } /** * Retourne tous les accesses de l'organization ayant la fonction donnée à la date donnée * * @param Organization $organization * @param string $function * @param DateTime|null $date * @return list */ public function findByOrganizationAndMission(Organization $organization, string $function, \DateTime $date = null): array { if ($date === null) $date = new DateTime(); $this->_em->getFilters()->disable('date_time_filter'); $qb = $this->createQueryBuilder('access'); $qb ->innerJoin('access.organizationFunction', 'organization_function') ->innerJoin('organization_function.functionType', 'function_type') ->where('function_type.mission = :mission') ->andWhere('access.organization = :id') ->setParameter('id', $organization->getId()) ->setParameter('mission', $function) ; DateConditions::addDateInPeriodCondition($qb, 'organization_function', $date->format('Y-m-d')); $this->_em->getFilters()->enable('date_time_filter'); return $qb->getQuery()->getResult(); } /** * Get all the currently active accesses and return an array * of the form ['id' => $accessId, 'organization_id' => $organizationId, 'mission' => $mission] * * Used by App\Service\Dolibarr\DolibarrSync\DolibarrSyncService * * @return list */ public function getAllActiveMembersAndMissions(): array { $qb = $this->createQueryBuilder('access'); $qb ->select('access.id', 'organization.id as organization_id', 'function_type.mission') ->innerJoin('access.organization', 'organization') ->innerJoin('access.organizationFunction', 'organization_function') ->innerJoin('organization_function.functionType', 'function_type') ; DateConditions::addDateInPeriodCondition($qb, 'organization_function', date('Y-m-d')); return $qb->getQuery()->getArrayResult(); } }