|
|
@@ -1,6 +1,129 @@
|
|
|
<?php
|
|
|
|
|
|
+namespace App\Service\ApiResourceBuilder\Public;
|
|
|
+
|
|
|
+use App\ApiResources\Public\FederationStructure;
|
|
|
+use Doctrine\ORM\EntityManagerInterface;
|
|
|
+
|
|
|
class FederationStructureBuilder
|
|
|
{
|
|
|
+ public function __construct(
|
|
|
+ private EntityManagerInterface $em
|
|
|
+ ) {}
|
|
|
+
|
|
|
+ private static function buildFederationStructure(array $data) {
|
|
|
+ return (new FederationStructure())
|
|
|
+ ->setId((int)$data['id'])
|
|
|
+ ->setName((string)$data['name'])
|
|
|
+ ->setLogoId((int)$data['logoId'])
|
|
|
+ ->setPrincipalType((string)$data['principalType'])
|
|
|
+ ->setWebsite((string)$data['website'])
|
|
|
+ ->setAddresses((string)$data['addresses'])
|
|
|
+ ->setPractices((string)$data['practices'])
|
|
|
+ ->setParentId((int)$data['parentId'])
|
|
|
+ ->setN1Id((int)$data['n1Id'])
|
|
|
+ ->setN2Id((int)$data['n2id'])
|
|
|
+ ->setN3Id((int)$data['n3Id'])
|
|
|
+ ->setN4Id((int)$data['n4Id'])
|
|
|
+ ->setN5Id((int)$data['n5Id'])
|
|
|
+ ->setParents((string)$data['parents']);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Route optimisée pour retourner les données de réseau d'une structure membre de fédération, au format json
|
|
|
+ *
|
|
|
+ * Cette route est utilisée par l'iframe de recherche des structures
|
|
|
+ * @see https://gitlab.2iopenservice.com/opentalent/frames
|
|
|
+ *
|
|
|
+ * @param int $organizationId
|
|
|
+ * @return FederationStructure
|
|
|
+ * @throws \Doctrine\DBAL\DBALException
|
|
|
+ * @throws \Doctrine\DBAL\Driver\Exception
|
|
|
+ * @throws \Doctrine\DBAL\Exception
|
|
|
+ */
|
|
|
+ public function getFederationStructureByOrganizationId(int $organizationId): FederationStructure
|
|
|
+ {
|
|
|
+
|
|
|
+ $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,
|
|
|
+ GROUP_CONCAT(COLUMN_JSON(COLUMN_CREATE(
|
|
|
+ 'type', oa.type, 'latitude', a.latitude, 'longitude', a.longitude,
|
|
|
+ 'streetAddress', TRIM(BOTH '\n' FROM CONCAT_WS('\n', a.addressOwner, a.streetAddress, a.streetAddressSecond, a.streetAddressThird)),
|
|
|
+ 'postalCode', a.postalCode, 'addressCity', a.addressCity, 'country', c.name))) as addresses,
|
|
|
+ cp.telphone, cp.mobilPhone, cp.email, o.facebook, o.twitter, o.instagram, o.youtube,
|
|
|
+ (SELECT CONCAT(GROUP_CONCAT(DISTINCT CONCAT(tp.name)))
|
|
|
+ FROM organization_type_of_practices AS otp
|
|
|
+ LEFT JOIN TypeOfPractice AS tp ON(tp.id = otp.typeofpractice_id)
|
|
|
+ WHERE otp.organization_id = o.id) AS practices,
|
|
|
+ oar.articles,
|
|
|
+ n1.parent_id as n1Id, net1.name as n1Name
|
|
|
+ FROM opentalent.Organization o
|
|
|
+ INNER JOIN opentalent.Parameters p on o.parameters_id = p.id
|
|
|
+ LEFT JOIN opentalent.OrganizationAddressPostal oa on oa.organization_id = o.id
|
|
|
+ LEFT JOIN opentalent.AddressPostal a on oa.addressPostal_id = a.id
|
|
|
+ LEFT JOIN opentalent.Country c ON c.id = a.addressCountry_id
|
|
|
+ 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
|
|
|
+ INNER JOIN Organization net1 ON net1.id = n1.parent_id
|
|
|
+ LEFT JOIN opentalent.organization_contactpoint ocp ON ocp.organization_id = o.id
|
|
|
+ INNER JOIN (SELECT * FROM opentalent.ContactPoint WHERE `contactType`='PRINCIPAL') cp ON cp.id = ocp.contactPoint_id
|
|
|
+ LEFT JOIN (
|
|
|
+ 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
|
|
|
+ FROM (SELECT * FROM OrganizationArticle WHERE link is not null and link != '' ORDER BY date DESC) as oar_
|
|
|
+ group by organization_id
|
|
|
+ ) oar ON oar.organization_id = o.id
|
|
|
+ WHERE o.id = :organizationId;";
|
|
|
+
|
|
|
+ $stmt = $this->em->getConnection()->prepare($sql);
|
|
|
+ $data = $stmt->executeQuery(['organizationId' => $organizationId])->fetchAssociative();
|
|
|
+ return self::buildFederationStructure($data);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Route optimisée pour retourner l'ensemble des structures d'une fédération au format json
|
|
|
+ *
|
|
|
+ * Cette route est utilisée par l'iframe de recherche des structures
|
|
|
+ * @see https://gitlab.2iopenservice.com/opentalent/frames
|
|
|
+ *
|
|
|
+ * @param int $parentId
|
|
|
+ * @return array
|
|
|
+ * @throws \Doctrine\DBAL\DBALException
|
|
|
+ * @throws \Doctrine\DBAL\Driver\Exception
|
|
|
+ * @throws \Doctrine\DBAL\Exception
|
|
|
+ */
|
|
|
+ public function getDataByFederationId(int $parentId): array
|
|
|
+ {
|
|
|
+ // NOTE: Cette route est utilisée pour l'affichage et la recherche des structures adhérentes à une fédération
|
|
|
+ // Pour éviter une requête récursive et conserver des performances correctes, on a mis en place ces JOIN chainés.
|
|
|
+ // Au moment du développement de cette route (juin 2021), aucune structure n'a plus de 4 fédération parentes,
|
|
|
+ // les 5 niveaux de JOIN devraient donc suffire.
|
|
|
+ $sql = "SELECT o.id, o.name, o.logo_id as logoId, o.principalType, p.otherWebsite as website,
|
|
|
+ GROUP_CONCAT(COLUMN_JSON(COLUMN_CREATE(
|
|
|
+ 'type', oa.type, 'latitude', a.latitude, 'longitude', a.longitude,
|
|
|
+ 'streetAddress', TRIM(BOTH '\n' FROM CONCAT_WS('\n', a.streetAddress, a.streetAddressSecond, a.streetAddressThird)),
|
|
|
+ 'postalCode', a.postalCode, 'addressCity', a.addressCity, 'country', c.name))) as addresses,
|
|
|
+ (SELECT CONCAT(GROUP_CONCAT(DISTINCT CONCAT(tp.name)))
|
|
|
+ FROM organization_type_of_practices AS otp
|
|
|
+ LEFT JOIN TypeOfPractice AS tp ON(tp.id = otp.typeofpractice_id)
|
|
|
+ WHERE otp.organization_id = o.id) AS practices,
|
|
|
+ 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,
|
|
|
+ CONCAT_WS(',', n1.parent_id, n2.parent_id, n3.parent_id, n4.parent_id, n5.parent_id) as parents
|
|
|
+ FROM opentalent.Organization o
|
|
|
+ INNER JOIN opentalent.Parameters p on o.parameters_id = p.id
|
|
|
+ LEFT JOIN opentalent.OrganizationAddressPostal oa on oa.organization_id = o.id
|
|
|
+ LEFT JOIN opentalent.AddressPostal a on oa.addressPostal_id = a.id
|
|
|
+ LEFT JOIN opentalent.Country c ON (c.id = a.addressCountry_id)
|
|
|
+ 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
|
|
|
+ INNER JOIN Organization net1 ON net1.id = n1.parent_id
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+ WHERE :parentId IN (n1.parent_id, n2.parent_id, n3.parent_id, n4.parent_id, n5.parent_id)
|
|
|
+ GROUP BY o.id
|
|
|
+ ;";
|
|
|
+
|
|
|
+ $stmt = $this->em->getConnection()->prepare($sql);
|
|
|
+ $rows = $stmt->executeQuery(['parentId' => $parentId])->fetchAllAssociative();
|
|
|
|
|
|
+ return array_map('self::buildFederationStructure', $rows);
|
|
|
+ }
|
|
|
}
|