Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.66% |
1 / 152 |
|
11.11% |
1 / 9 |
CRAP | |
0.00% |
0 / 1 |
Collectivity | |
0.66% |
1 / 152 |
|
11.11% |
1 / 9 |
1530.18 | |
0.00% |
0 / 1 |
getModelClass | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
findByIds | |
0.00% |
0 / 6 |
|
0.00% |
0 / 1 |
2 | |||
findByTypes | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
6 | |||
findAllActive | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
6 | |||
count | |
0.00% |
0 / 15 |
|
0.00% |
0 / 1 |
12 | |||
findPaginated | |
0.00% |
0 / 14 |
|
0.00% |
0 / 1 |
12 | |||
addTableOrder | |
0.00% |
0 / 48 |
|
0.00% |
0 / 1 |
182 | |||
addTableWhere | |
0.00% |
0 / 38 |
|
0.00% |
0 / 1 |
182 | |||
findByUserReferent | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | /** |
4 | * This file is part of the MADIS - RGPD Management application. |
5 | * |
6 | * @copyright Copyright (c) 2018-2019 Soluris - Solutions Numériques Territoriales Innovantes |
7 | * |
8 | * This program is free software: you can redistribute it and/or modify |
9 | * it under the terms of the GNU Affero General Public License as published by |
10 | * the Free Software Foundation, either version 3 of the License, or |
11 | * (at your option) any later version. |
12 | * |
13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU Affero General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU Affero General Public License |
19 | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
20 | */ |
21 | |
22 | declare(strict_types=1); |
23 | |
24 | namespace App\Infrastructure\ORM\User\Repository; |
25 | |
26 | use App\Application\Doctrine\Repository\CRUDRepository; |
27 | use App\Application\Traits\RepositoryUtils; |
28 | use App\Domain\User\Dictionary\CollectivityTypeDictionary; |
29 | use App\Domain\User\Model; |
30 | use App\Domain\User\Repository; |
31 | use Doctrine\ORM\QueryBuilder; |
32 | use Doctrine\ORM\Tools\Pagination\Paginator; |
33 | |
34 | class Collectivity extends CRUDRepository implements Repository\Collectivity |
35 | { |
36 | use RepositoryUtils; |
37 | |
38 | protected function getModelClass(): string |
39 | { |
40 | return Model\Collectivity::class; |
41 | } |
42 | |
43 | public function findByIds(array $ids): array |
44 | { |
45 | $qb = $this->createQueryBuilder(); |
46 | |
47 | $qb |
48 | ->andWhere($qb->expr()->in('o.id', ':in_ids')) |
49 | ->setParameter('in_ids', $ids) |
50 | ; |
51 | |
52 | return $qb->getQuery()->getResult(); |
53 | } |
54 | |
55 | public function findByTypes(array $types, ?Model\Collectivity $excludedCollectivity = null): array |
56 | { |
57 | $qb = $this->createQueryBuilder(); |
58 | |
59 | $qb |
60 | ->andWhere($qb->expr()->in('o.type', ':in_types')) |
61 | ->setParameter('in_types', $types) |
62 | ; |
63 | |
64 | if (null !== $excludedCollectivity) { |
65 | $qb |
66 | ->andWhere($qb->expr()->neq('o.id', ':excluded_collectivity_id')) |
67 | ->setParameter('excluded_collectivity_id', $excludedCollectivity->getId()->toString()) |
68 | ; |
69 | } |
70 | |
71 | return $qb->getQuery()->getResult(); |
72 | } |
73 | |
74 | public function findAllActive(bool $active = true, array $order = []) |
75 | { |
76 | $qb = $this->createQueryBuilder(); |
77 | |
78 | $qb->andWhere('o.active = :active') |
79 | ->setParameter('active', $active) |
80 | ; |
81 | |
82 | foreach ($order as $key => $dir) { |
83 | $qb->addOrderBy("o.{$key}", $dir); |
84 | } |
85 | |
86 | return $qb |
87 | ->getQuery() |
88 | ->getResult() |
89 | ; |
90 | } |
91 | |
92 | public function count(array $criteria = []) |
93 | { |
94 | $qb = $this |
95 | ->createQueryBuilder() |
96 | ->select('count(o.id)') |
97 | ; |
98 | |
99 | if (\array_key_exists('collectivitesReferees', $criteria)) { |
100 | $qb |
101 | ->andWhere($qb->expr()->in('o.id', ':collectivitesReferees')) |
102 | ->setParameter('collectivitesReferees', $criteria['collectivitesReferees']); |
103 | unset($criteria['collectivitesReferees']); |
104 | } |
105 | |
106 | foreach ($criteria as $key => $value) { |
107 | $this->addWhereClause($qb, $key, $value); |
108 | } |
109 | |
110 | return $qb |
111 | ->getQuery() |
112 | ->getSingleScalarResult() |
113 | ; |
114 | } |
115 | |
116 | public function findPaginated($firstResult, $maxResults, $orderColumn, $orderDir, $searches, $criteria = []) |
117 | { |
118 | $qb = $this->createQueryBuilder(); |
119 | |
120 | if (\array_key_exists('collectivitesReferees', $criteria)) { |
121 | $qb |
122 | ->andWhere($qb->expr()->in('o.id', ':collectivitesReferees')) |
123 | ->setParameter('collectivitesReferees', $criteria['collectivitesReferees']); |
124 | unset($criteria['collectivitesReferees']); |
125 | } |
126 | |
127 | foreach ($criteria as $key => $value) { |
128 | $this->addWhereClause($qb, $key, $value); |
129 | } |
130 | |
131 | $this->addTableOrder($qb, $orderColumn, $orderDir); |
132 | $this->addTableWhere($qb, $searches); |
133 | |
134 | $query = $qb->getQuery(); |
135 | $query->setFirstResult($firstResult); |
136 | $query->setMaxResults($maxResults); |
137 | |
138 | return new Paginator($query); |
139 | } |
140 | |
141 | private function addTableOrder(QueryBuilder $queryBuilder, $orderColumn, $orderDir) |
142 | { |
143 | switch ($orderColumn) { |
144 | case 'nom': |
145 | $queryBuilder->addOrderBy('o.name', $orderDir); |
146 | break; |
147 | case 'nom_court': |
148 | $queryBuilder->addOrderBy('o.shortName', $orderDir); |
149 | break; |
150 | case 'type': |
151 | $queryBuilder->addSelect('(case |
152 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_COMMUNE . '\' THEN 1 |
153 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_CCAS . '\' THEN 2 |
154 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_EPCI . '\' THEN 3 |
155 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_CIAS . '\' THEN 4 |
156 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_SYNDICAT . '\' THEN 5 |
157 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_SANITARY_INSTITUTION . '\' THEN 6 |
158 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_MEDICAL_INSTITUTION . '\' THEN 7 |
159 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_ASSOCIATION . '\' THEN 8 |
160 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_ENTERPRISE . '\' THEN 9 |
161 | WHEN o.type = \'' . CollectivityTypeDictionary::TYPE_OTHER . '\' THEN 10 |
162 | ELSE 11 END) AS HIDDEN hidden_type') |
163 | ->addOrderBy('hidden_type', $orderDir); |
164 | break; |
165 | case 'siren': |
166 | $queryBuilder->addOrderBy('o.siren', $orderDir); |
167 | break; |
168 | case 'info': |
169 | $queryBuilder->addOrderBy('o.informationsComplementaires', $orderDir); |
170 | break; |
171 | case 'statut': |
172 | $queryBuilder->addOrderBy('o.active', $orderDir); |
173 | break; |
174 | case 'informations_complementaires': |
175 | $queryBuilder->addOrderBy('o.informationsComplementaires', $orderDir); |
176 | break; |
177 | case 'nbr_agents': |
178 | $queryBuilder->addOrderBy('o.nbrAgents', $orderDir); |
179 | break; |
180 | case 'population': |
181 | $queryBuilder->addOrderBy('o.population', $orderDir); |
182 | break; |
183 | case 'nbr_cnil': |
184 | $queryBuilder->addOrderBy('o.nbrCnil', $orderDir); |
185 | break; |
186 | case 'updatedAt': |
187 | $queryBuilder->addOrderBy('o.updatedAt', $orderDir); |
188 | break; |
189 | case 'createdAt': |
190 | $queryBuilder->addOrderBy('o.createdAt', $orderDir); |
191 | break; |
192 | } |
193 | } |
194 | |
195 | private function addTableWhere(QueryBuilder $queryBuilder, $searches) |
196 | { |
197 | foreach ($searches as $columnName => $search) { |
198 | switch ($columnName) { |
199 | case 'nom': |
200 | $this->addWhereClause($queryBuilder, 'name', '%' . $search . '%', 'LIKE'); |
201 | break; |
202 | case 'nom_court': |
203 | $this->addWhereClause($queryBuilder, 'shortName', '%' . $search . '%', 'LIKE'); |
204 | break; |
205 | case 'type': |
206 | $this->addWhereClause($queryBuilder, 'type', $search); |
207 | break; |
208 | case 'informations_complementaires': |
209 | $this->addWhereClause($queryBuilder, 'informationsComplementaires', '%' . $search . '%', 'LIKE'); |
210 | break; |
211 | case 'siren': |
212 | $this->addWhereClause($queryBuilder, 'siren', '%' . $search . '%', 'LIKE'); |
213 | break; |
214 | case 'statut': |
215 | $this->addWhereClause($queryBuilder, 'active', $search); |
216 | break; |
217 | case 'nbr_cnil': |
218 | $this->addWhereClause($queryBuilder, 'nbrCnil', '%' . $search . '%', 'LIKE'); |
219 | break; |
220 | case 'nbr_agents': |
221 | $this->addWhereClause($queryBuilder, 'nbrAgents', '%' . $search . '%', 'LIKE'); |
222 | break; |
223 | case 'population': |
224 | $this->addWhereClause($queryBuilder, 'population', '%' . $search . '%', 'LIKE'); |
225 | break; |
226 | case 'createdAt': |
227 | $queryBuilder->andWhere('o.createdAt BETWEEN :created_start_date AND :created_finish_date') |
228 | ->setParameter('created_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00')) |
229 | ->setParameter('created_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59')); |
230 | break; |
231 | case 'updatedAt': |
232 | $queryBuilder->andWhere('o.updatedAt BETWEEN :updated_start_date AND :updated_finish_date') |
233 | ->setParameter('updated_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00')) |
234 | ->setParameter('updated_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59')); |
235 | break; |
236 | } |
237 | } |
238 | } |
239 | |
240 | public function findByUserReferent(Model\User $userReferent, bool $active = true) |
241 | { |
242 | return $this->createQueryBuilder() |
243 | ->leftJoin('o.userReferents', 'u') |
244 | ->andWhere('u.id = :user') |
245 | ->setParameter('user', $userReferent) |
246 | ->andWhere('o.active = :active') |
247 | ->setParameter('active', $active) |
248 | ->getQuery() |
249 | ->getResult() |
250 | ; |
251 | } |
252 | } |