AccessRepository.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Repository\Access;
  4. use App\DQL\DateConditions;
  5. use App\Entity\Access\Access;
  6. use App\Entity\Organization\Organization;
  7. use DateTime;
  8. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. /**
  13. * @method Access|null find($id, $lockMode = null, $lockVersion = null)
  14. * @method Access|null findOneBy(array $criteria, array $orderBy = null)
  15. * @method Access[] findAll()
  16. * @method Access[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  17. */
  18. class AccessRepository extends ServiceEntityRepository implements UserLoaderInterface
  19. {
  20. const ACCESS_NAME_HEADER = 'X-AccessId';
  21. const HTTP_X_SWITCH_USER = 'X-Switch-User';
  22. public function __construct(ManagerRegistry $registry, private RequestStack $requestStack)
  23. {
  24. parent::__construct($registry, Access::class);
  25. }
  26. /**
  27. * @deprecated in symfony 6.0, replace by loadUserByIdentifier
  28. * @param string $username
  29. * @return \Symfony\Component\Security\Core\User\UserInterface|void|null
  30. */
  31. public function loadUserByUsername(string $username)
  32. {}
  33. /**
  34. * Méthode permettant de fournir un userProvider custom (voir config provider : access_provider)
  35. * @param string $username
  36. * @return Access|mixed|object|\Symfony\Component\Security\Core\User\UserInterface|null
  37. * @throws \Doctrine\ORM\ORMException
  38. * @throws \Doctrine\ORM\OptimisticLockException
  39. * @throws \Doctrine\ORM\TransactionRequiredException
  40. */
  41. public function loadUserByIdentifier($identifier): mixed
  42. {
  43. if($this->requestStack->getMainRequest()->headers->get(self::HTTP_X_SWITCH_USER) == $identifier)
  44. return $this->getEntityManager()->find(Access::class, $identifier);
  45. return $this->findAccessByUsernameAndAccessId($identifier, $this->requestStack->getMainRequest()->headers->get(self::ACCESS_NAME_HEADER));
  46. }
  47. /**
  48. * Récupère un access grâce à son username et son ID
  49. * @param string $username
  50. * @param $id
  51. * @return mixed
  52. * @throws \Doctrine\ORM\NonUniqueResultException
  53. */
  54. private function findAccessByUsernameAndAccessId(string $username, $id): mixed
  55. {
  56. $entityManager = $this->getEntityManager();
  57. return $entityManager->createQuery(
  58. 'SELECT a
  59. FROM App\Entity\Access\Access a
  60. INNER JOIN a.person p
  61. WHERE p.username = :query AND a.id = :id'
  62. )
  63. ->setParameter('query', $username)
  64. ->setParameter('id', $id)
  65. ->getOneOrNullResult();
  66. }
  67. /**
  68. * @param Access $access
  69. * @return mixed
  70. * @throws \Exception
  71. */
  72. public function findAllValidAccesses(Access $access): array
  73. {
  74. $datetime = new \DateTime();
  75. $today = $datetime->format('Y-m-d');
  76. return $this->createQueryBuilder('access')
  77. ->innerJoin('access.organization', 'organization')
  78. ->innerJoin('organization.networkOrganizations', 'networkOrganizations')
  79. ->where('access.person = :person')
  80. ->andWhere('networkOrganizations.startDate <= :today')
  81. ->setParameter('person', $access->getPerson())
  82. ->setParameter('today', $today)
  83. ->getQuery()
  84. ->getResult()
  85. ;
  86. }
  87. public function hasGotFunctionAtThisDate(Access $access, $function, \DateTime $date): bool
  88. {
  89. $this->_em->getFilters()->disable('date_time_filter');
  90. $qb = $this->createQueryBuilder('access');
  91. $qb
  92. ->innerJoin('access.organizationFunction', 'organization_function')
  93. ->innerJoin('organization_function.functionType', 'function_type')
  94. ->where('function_type.mission = :mission')
  95. ->andWhere('access.id = :id')
  96. ->setParameter('id', $access->getId())
  97. ->setParameter('mission', $function)
  98. ;
  99. DateConditions::addDateInPeriodCondition($qb, 'organization_function', $date->format('Y-m-d'));
  100. $result = count($qb->getQuery()->getResult()) > 0;
  101. $this->_em->getFilters()->enable('date_time_filter');
  102. return $result;
  103. }
  104. /**
  105. * Retourne tous les accesses de l'organization ayant la fonction donnée à la date donnée
  106. *
  107. * @param Organization $organization
  108. * @param $function
  109. * @param DateTime|null $date
  110. * @return array
  111. */
  112. public function findByOrganizationAndMission(Organization $organization, $function, \DateTime $date = null): array
  113. {
  114. if ($date === null)
  115. $date = new DateTime();
  116. $this->_em->getFilters()->disable('date_time_filter');
  117. $qb = $this->createQueryBuilder('access');
  118. $qb
  119. ->innerJoin('access.organizationFunction', 'organization_function')
  120. ->innerJoin('organization_function.functionType', 'function_type')
  121. ->where('function_type.mission = :mission')
  122. ->andWhere('access.organization = :id')
  123. ->setParameter('id', $organization->getId())
  124. ->setParameter('mission', $function)
  125. ;
  126. DateConditions::addDateInPeriodCondition($qb, 'organization_function', $date->format('Y-m-d'));
  127. $this->_em->getFilters()->enable('date_time_filter');
  128. return $qb->getQuery()->getResult();
  129. }
  130. /**
  131. * Get all the currently active accesses and return an array
  132. * of the form ['id' => $accessId, 'organization_id' => $organizationId, 'mission' => $mission]
  133. *
  134. * Used by App\Service\Dolibarr\DolibarrSync\DolibarrSyncService
  135. *
  136. * @return array
  137. */
  138. public function getAllActiveMembersAndMissions(): array
  139. {
  140. $qb = $this->createQueryBuilder('access');
  141. $qb
  142. ->select('access.id', 'organization.id as organization_id', 'function_type.mission')
  143. ->innerJoin('access.organization', 'organization')
  144. ->innerJoin('access.organizationFunction', 'organization_function')
  145. ->innerJoin('organization_function.functionType', 'function_type')
  146. ;
  147. DateConditions::addDateInPeriodCondition($qb, 'organization_function', date('Y-m-d'));
  148. return $qb->getQuery()->getArrayResult();
  149. }
  150. }