OrganizationRepository.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. namespace AppBundle\Entity\Organization\Repository;
  3. use AppBundle\Validator\AccessAndFunction\OrganizationFunction;
  4. use Doctrine\ORM\EntityRepository;
  5. use Doctrine\ORM\Query\ResultSetMappingBuilder;
  6. use Doctrine\ORM\Query\ResultSetMapping;
  7. use AppBundle\Enum\Organization\principalTypeEnum;
  8. use PDO;
  9. /**
  10. * Description of OrganizationRepository
  11. *
  12. * @author Sébastien Hupin <sebastien.hupin at gmail.com>
  13. */
  14. class OrganizationRepository extends EntityRepository
  15. {
  16. public function getCurrentsNetworkId($access)
  17. {
  18. $filter = $this->_em->getFilters()->enable('activity_year');
  19. $filter->setParameter('disabledFilter', 1);
  20. $queryBuilder = $this->createQueryBuilder('o');
  21. $queryBuilder
  22. ->select("network.id")
  23. ->innerJoin('o.network', 'networkOrga')
  24. ->innerJoin('networkOrga.network', 'network')
  25. ->where('o.id = :organizationId')
  26. ->andWhere(
  27. $queryBuilder->expr()->orX(
  28. $queryBuilder->expr()->gte('networkOrga.endDate', ':today'),
  29. $queryBuilder->expr()->isNull('networkOrga.endDate')
  30. )
  31. )
  32. ->setParameter('organizationId', $access->getOrganization()->getId())
  33. ->setParameter('today', new \DateTime('now'));
  34. $query = $queryBuilder->getQuery();
  35. $netWorks = $query->getOneOrNullResult();
  36. $filter->setParameter('disabledFilter', 0);
  37. return $netWorks;
  38. }
  39. /**
  40. * Finds all parent entities in the repository.
  41. *
  42. * @param integer $id The identifier.
  43. *
  44. * @return array The organizations.
  45. */
  46. public function findParents($id)
  47. {
  48. $sql = sprintf("
  49. SELECT *
  50. FROM Organization o
  51. JOIN
  52. (SELECT
  53. @parents:=(
  54. SELECT GROUP_CONCAT(parent_id)
  55. FROM NetworkOrganization
  56. WHERE organization_id = %d
  57. )
  58. ) tmp
  59. WHERE FIND_IN_SET(o.id, @parents)
  60. ", (int)$id);
  61. $rsm = new ResultSetMappingBuilder($this->getEntityManager());
  62. $rsm->addRootEntityFromClassMetadata('AppBundle:Organization\Organization', 'o');
  63. $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
  64. return $query->getResult();
  65. }
  66. /**
  67. * Finds recursively all parent entities in the repository.
  68. *
  69. * @param integer $id The identifier.
  70. *
  71. * @return array The organizations.
  72. */
  73. public function findAllParents($id)
  74. {
  75. $sql = sprintf("
  76. SELECT *
  77. FROM Organization o
  78. JOIN
  79. (
  80. SELECT
  81. GROUP_CONCAT(@target:=
  82. (
  83. SELECT @source:=GROUP_CONCAT(parent_id)
  84. FROM
  85. NetworkOrganization
  86. WHERE
  87. FIND_IN_SET(organization_id, @source) AND parent_id NOT IN (32366, 13)
  88. )
  89. ) AS parents
  90. FROM
  91. (SELECT
  92. @source:=%d,
  93. @target:=0
  94. ) vars,
  95. NetworkOrganization
  96. WHERE
  97. @source IS NOT NULL
  98. ) tmp
  99. WHERE FIND_IN_SET(o.id, parents)
  100. ", (int)$id);
  101. $rsm = new ResultSetMappingBuilder($this->getEntityManager());
  102. $rsm->addRootEntityFromClassMetadata('AppBundle:Organization\Organization', 'o');
  103. $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
  104. return $query->getResult();
  105. }
  106. /**
  107. * Check if this organization is a last parent
  108. *
  109. * @param integer $id The identifier.
  110. *
  111. * @return array The organizations.
  112. */
  113. public function isLastParent($id)
  114. {
  115. $sql = sprintf("
  116. SELECT
  117. IF( (SELECT o.id
  118. FROM Organization as o
  119. WHERE o.id=neto.organization_id
  120. AND o.principalType IN('%s','%s','%s','%s','%s','%s')) IS NOT NULL ,0,1) AS is_last_parent
  121. FROM
  122. NetworkOrganization as neto
  123. WHERE
  124. neto.parent_id = %d
  125. and (neto.endDate is null or neto.endDate = \"0000-00-00\" or neto.endDate > CURDATE())
  126. GROUP BY is_last_parent
  127. ORDER BY is_last_parent DESC", principalTypeEnum::NATIONAL_FEDERATION, principalTypeEnum::REGIONAL_FEDERATION, principalTypeEnum::LOCAL_FEDERATION, principalTypeEnum::GROUPMENT, principalTypeEnum::DEPARTEMENTAL_FEDERATION, principalTypeEnum::DELEGATION, (int)$id);
  128. $rsm = new ResultSetMapping();
  129. $rsm->addScalarResult('is_last_parent', 'is_last_parent', 'integer');
  130. $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
  131. $result = $query->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  132. foreach ($result as $a_tmp) {
  133. if ($a_tmp['is_last_parent']) {
  134. return true;
  135. }
  136. }
  137. return false;
  138. }
  139. /**
  140. * Route optimisée pour retourner l'ensemble des structures d'une fédération au format json
  141. *
  142. * Cette route est utilisée par l'iframe de recherche des structures
  143. * @see https://gitlab.2iopenservice.com/opentalent/frames
  144. */
  145. public function getDataByFederationId($parentId)
  146. {
  147. // NOTE: Cette route est utilisée pour l'affichage et la recherche des structures adhérentes à une fédération
  148. // Pour éviter une requête récursive et conserver des performances correctes, on a mis en place ces JOIN chainés.
  149. // Au moment du développement de cette route (juin 2021), aucune structure n'a plus de 4 fédération parentes,
  150. // les 5 niveaux de JOIN devraient donc suffire.
  151. $sql = "SELECT o.id, o.name, o.logo_id as logoId, o.principalType, p.otherWebsite as website,
  152. GROUP_CONCAT(COLUMN_JSON(COLUMN_CREATE(
  153. 'type', oa.type, 'latitude', a.latitude, 'longitude', a.longitude,
  154. 'streetAddress', TRIM(BOTH '\n' FROM CONCAT_WS('\n', a.streetAddress, a.streetAddressSecond, a.streetAddressThird)),
  155. 'postalCode', a.postalCode, 'addressCity', a.addressCity, 'country', c.name))) as addresses,
  156. (SELECT CONCAT(GROUP_CONCAT(DISTINCT CONCAT(tp.name)))
  157. FROM organization_type_of_practices AS otp
  158. LEFT JOIN TypeOfPractice AS tp ON(tp.id = otp.typeofpractice_id)
  159. WHERE otp.organization_id = o.id) AS practices,
  160. n1.parent_id as n1Id, net1.name as n1Name, n2.parent_id as n2Id, n3.parent_id as n3Id, n4.parent_id as n4Id, n5.parent_id as n5Id,
  161. CONCAT_WS(',', n1.parent_id, n2.parent_id, n3.parent_id, n4.parent_id, n5.parent_id) as parents
  162. FROM opentalent.Organization o
  163. INNER JOIN opentalent.Parameters p on o.parameters_id = p.id
  164. LEFT JOIN opentalent.OrganizationAddressPostal oa on oa.organization_id = o.id
  165. LEFT JOIN opentalent.AddressPostal a on oa.addressPostal_id = a.id
  166. LEFT JOIN opentalent.Country c ON (c.id = a.addressCountry_id)
  167. INNER JOIN (SELECT DISTINCT organization_id, parent_id FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n1 on n1.organization_id = o.id
  168. INNER JOIN Organization net1 ON net1.id = n1.parent_id
  169. LEFT JOIN (SELECT DISTINCT organization_id, parent_id FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n2 on n2.organization_id = n1.parent_id
  170. LEFT JOIN (SELECT DISTINCT organization_id, parent_id FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n3 on n3.organization_id = n2.parent_id
  171. LEFT JOIN (SELECT DISTINCT organization_id, parent_id FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n4 on n4.organization_id = n3.parent_id
  172. LEFT JOIN (SELECT DISTINCT organization_id, parent_id FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n5 on n5.organization_id = n4.parent_id
  173. WHERE :parentId IN (n1.parent_id, n2.parent_id, n3.parent_id, n4.parent_id, n5.parent_id)
  174. GROUP BY o.id
  175. ;";
  176. $em = $this->getEntityManager();
  177. $stmt = $em->getConnection()->prepare($sql);
  178. $stmt->execute(['parentId' => $parentId]);
  179. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  180. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  181. }
  182. /**
  183. * Route optimisée pour retourner les données de réseau d'une structure membre de fédération, au format json
  184. *
  185. * Cette route est utilisée par l'iframe de recherche des structures
  186. * @see https://gitlab.2iopenservice.com/opentalent/frames
  187. */
  188. public function getDataByOrganizationId($organizationId)
  189. {
  190. $sql = "SELECT o.id, o.name, o.logo_id as logoId, o.description, o.image_id as imageId, p.otherWebsite as website, a.latitude, a.longitude,
  191. GROUP_CONCAT(COLUMN_JSON(COLUMN_CREATE(
  192. 'type', oa.type, 'latitude', a.latitude, 'longitude', a.longitude,
  193. 'streetAddress', TRIM(BOTH '\n' FROM CONCAT_WS('\n', a.addressOwner, a.streetAddress, a.streetAddressSecond, a.streetAddressThird)),
  194. 'postalCode', a.postalCode, 'addressCity', a.addressCity, 'country', c.name))) as addresses,
  195. cp.telphone, cp.mobilPhone, cp.email, o.facebook, o.twitter, o.instagram, o.youtube,
  196. (SELECT CONCAT(GROUP_CONCAT(DISTINCT CONCAT(tp.name)))
  197. FROM organization_type_of_practices AS otp
  198. LEFT JOIN TypeOfPractice AS tp ON(tp.id = otp.typeofpractice_id)
  199. WHERE otp.organization_id = o.id) AS practices,
  200. oar.articles,
  201. n1.parent_id as n1Id, net1.name as n1Name
  202. FROM opentalent.Organization o
  203. INNER JOIN opentalent.Parameters p on o.parameters_id = p.id
  204. LEFT JOIN opentalent.OrganizationAddressPostal oa on oa.organization_id = o.id
  205. LEFT JOIN opentalent.AddressPostal a on oa.addressPostal_id = a.id
  206. LEFT JOIN opentalent.Country c ON c.id = a.addressCountry_id
  207. INNER JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n1 on n1.organization_id = o.id
  208. INNER JOIN Organization net1 ON net1.id = n1.parent_id
  209. LEFT JOIN opentalent.organization_contactpoint ocp ON ocp.organization_id = o.id
  210. INNER JOIN (SELECT * FROM opentalent.ContactPoint WHERE `contactType`='PRINCIPAL') cp ON cp.id = ocp.contactPoint_id
  211. LEFT JOIN (
  212. SELECT oar_.organization_id, GROUP_CONCAT(COLUMN_JSON(COLUMN_CREATE('id', oar_.id, 'title', oar_.title, 'date', DATE_FORMAT(oar_.date, '%Y-%m-%dT%TZ'), 'link', oar_.link))) as articles
  213. FROM (SELECT * FROM OrganizationArticle WHERE link is not null and link != '' ORDER BY date DESC) as oar_
  214. group by organization_id
  215. ) oar ON oar.organization_id = o.id
  216. WHERE o.id = :organizationId;";
  217. $em = $this->getEntityManager();
  218. $stmt = $em->getConnection()->prepare($sql);
  219. $stmt->execute(['organizationId' => $organizationId]);
  220. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  221. return $stmt->fetch(PDO::FETCH_ASSOC);
  222. }
  223. }