Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
8.03% covered (danger)
8.03%
11 / 137
18.18% covered (danger)
18.18%
2 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
Contractor
8.03% covered (danger)
8.03%
11 / 137
18.18% covered (danger)
18.18%
2 / 11
1222.26
0.00% covered (danger)
0.00%
0 / 1
 getModelClass
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 findAllByCollectivity
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
2
 countAllByCollectivity
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 count
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
20
 findPaginated
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
20
 addTableOrder
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
110
 addTableWhere
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 1
132
 findAllByActiveCollectivity
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
6
 findBy
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 findAllByClonedFromCollectivity
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
 resetClonedFromCollectivity
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
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
22declare(strict_types=1);
23
24namespace App\Infrastructure\ORM\Registry\Repository;
25
26use App\Application\Doctrine\Repository\CRUDRepository;
27use App\Application\Traits\RepositoryUtils;
28use App\Domain\Registry\Model;
29use App\Domain\Registry\Repository;
30use App\Domain\User\Model\Collectivity;
31use App\Domain\User\Model\User;
32use Doctrine\Common\Collections\Collection;
33use Doctrine\ORM\QueryBuilder;
34use Doctrine\ORM\Tools\Pagination\Paginator;
35
36class Contractor extends CRUDRepository implements Repository\Contractor
37{
38    use RepositoryUtils;
39
40    protected function getModelClass(): string
41    {
42        return Model\Contractor::class;
43    }
44
45    public function findAllByCollectivity(Collectivity $collectivity, array $order = [])
46    {
47        $qb = $this->createQueryBuilder()
48            ->andWhere('o.collectivity = :collectivity')
49            ->setParameter('collectivity', $collectivity)
50        ;
51
52        foreach ($order as $key => $dir) {
53            $qb->addOrderBy("o.{$key}", $dir);
54        }
55
56        return $qb
57            ->getQuery()
58            ->getResult()
59        ;
60    }
61
62    public function countAllByCollectivity(Collectivity $collectivity)
63    {
64        $qb = $this->createQueryBuilder();
65
66        $qb->select('COUNT(o.id)');
67        $qb->andWhere($qb->expr()->eq('o.collectivity', ':collectivity'));
68        $qb->setParameter('collectivity', $collectivity);
69
70        return $qb->getQuery()->getSingleScalarResult();
71    }
72
73    public function count(array $criteria = [])
74    {
75        $qb = $this->createQueryBuilder();
76
77        $qb->select('COUNT(o.id)');
78
79        if (isset($criteria['collectivity']) && $criteria['collectivity'] instanceof Collection) {
80            $qb->leftJoin('o.collectivity', 'collectivite');
81            $this->addInClauseCollectivities($qb, $criteria['collectivity']->toArray());
82            unset($criteria['collectivity']);
83        }
84
85        foreach ($criteria as $key => $value) {
86            $this->addWhereClause($qb, $key, $value);
87        }
88
89        return $qb->getQuery()->getSingleScalarResult();
90    }
91
92    public function findPaginated($firstResult, $maxResults, $orderColumn, $orderDir, $searches, $criteria = [])
93    {
94        $qb = $this->createQueryBuilder();
95
96        $qb
97            ->leftJoin('o.collectivity', 'collectivite')
98            ->leftJoin('o.service', 'service')
99            ->addSelect('collectivite');
100
101        if (isset($criteria['collectivity']) && $criteria['collectivity'] instanceof Collection) {
102            $this->addInClauseCollectivities($qb, $criteria['collectivity']->toArray());
103            unset($criteria['collectivity']);
104        }
105
106        foreach ($criteria as $key => $value) {
107            $this->addWhereClause($qb, $key, $value);
108        }
109
110        $this->addTableOrder($qb, $orderColumn, $orderDir);
111        $this->addTableWhere($qb, $searches);
112
113        $query = $qb->getQuery();
114        $query->setFirstResult($firstResult);
115        $query->setMaxResults($maxResults);
116
117        return new Paginator($query);
118    }
119
120    private function addTableOrder(QueryBuilder $queryBuilder, $orderColumn, $orderDir)
121    {
122        switch ($orderColumn) {
123            case 'nom':
124                $queryBuilder->addOrderBy('o.name', $orderDir);
125                break;
126            case 'collectivite':
127                $queryBuilder->addOrderBy('collectivite.name', $orderDir);
128                break;
129            case 'service':
130                $queryBuilder->addOrderBy('service.name', $orderDir);
131                break;
132            case 'clauses_contractuelles':
133                $queryBuilder->addOrderBy('o.contractualClausesVerified', $orderDir);
134                break;
135            case 'element_securite':
136                $queryBuilder->addOrderBy('o.adoptedSecurityFeatures', $orderDir);
137                break;
138            case 'registre_traitements':
139                $queryBuilder->addOrderBy('o.maintainsTreatmentRegister', $orderDir);
140                break;
141            case 'donnees_hors_eu':
142                $queryBuilder->addOrderBy('o.sendingDataOutsideEu', $orderDir);
143                break;
144            case 'createdAt':
145                $queryBuilder->addOrderBy('o.createdAt', $orderDir);
146                break;
147            case 'updatedAt':
148                $queryBuilder->addOrderBy('o.updatedAt', $orderDir);
149                break;
150        }
151    }
152
153    private function addTableWhere(QueryBuilder $queryBuilder, $searches)
154    {
155        foreach ($searches as $columnName => $search) {
156            switch ($columnName) {
157                case 'nom':
158                    $this->addWhereClause($queryBuilder, 'name', '%' . $search . '%', 'LIKE');
159                    break;
160                case 'collectivite':
161                    $queryBuilder->andWhere('collectivite.name LIKE :collectivite_name')
162                        ->setParameter('collectivite_name', '%' . $search . '%');
163                    break;
164                case 'service':
165                    $queryBuilder->andWhere('service.name LIKE :service_name')
166                        ->setParameter('service_name', '%' . $search . '%');
167                    break;
168                case 'clauses_contractuelles':
169                    $this->addWhereClause($queryBuilder, 'contractualClausesVerified', '%' . $search . '%', 'LIKE');
170                    break;
171                case 'element_securite':
172                    $this->addWhereClause($queryBuilder, 'adoptedSecurityFeatures', $search);
173                    break;
174                case 'registre_traitements':
175                    $this->addWhereClause($queryBuilder, 'maintainsTreatmentRegister', $search);
176                    break;
177                case 'donnees_hors_eu':
178                    $this->addWhereClause($queryBuilder, 'sendingDataOutsideEu', $search);
179                    break;
180                case 'createdAt':
181                    $queryBuilder->andWhere('o.createdAt BETWEEN :created_start_date AND :created_finish_date')
182                        ->setParameter('created_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00'))
183                        ->setParameter('created_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59'));
184                    break;
185                case 'updatedAt':
186                    $queryBuilder->andWhere('o.updatedAt BETWEEN :updated_start_date AND :updated_finish_date')
187                        ->setParameter('updated_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00'))
188                        ->setParameter('updated_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59'));
189                    break;
190            }
191        }
192    }
193
194    public function findAllByActiveCollectivity(bool $active = true, ?User $user = null)
195    {
196        $qb = $this->createQueryBuilder();
197
198        $qb->leftJoin('o.collectivity', 'c')
199            ->andWhere($qb->expr()->eq('c.active', ':active'))
200            ->setParameter('active', $active)
201            ->addOrderBy('c.name')
202            ->addOrderBy('o.createdAt', 'DESC')
203        ;
204
205        if (null !== $user) {
206            $qb->leftJoin('c.userReferents', 'u')
207                ->andWhere('u.id = :user')
208                ->setParameter('user', $user);
209        }
210
211        return $qb
212            ->getQuery()
213            ->getResult()
214        ;
215    }
216
217    public function findBy(array $criteria = [])
218    {
219        $qb = $this->createQueryBuilder();
220
221        foreach ($criteria as $key => $value) {
222            $this->addWhereClause($qb, $key, $value);
223        }
224
225        return $qb
226            ->getQuery()
227            ->getResult()
228        ;
229    }
230
231    public function findAllByClonedFromCollectivity(Collectivity $collectivity)
232    {
233        $qb = $this->createQueryBuilder();
234
235        $qb->leftJoin('o.clonedFrom', 'c')
236            ->andWhere('c.collectivity = :collectivity')
237            ->setParameter('collectivity', $collectivity);
238
239        return $qb
240            ->getQuery()
241            ->getResult()
242        ;
243    }
244
245    public function resetClonedFromCollectivity(Collectivity $collectivity)
246    {
247        $qb = $this->createQueryBuilder();
248
249        $qb->leftJoin('o.clonedFrom', 'c')
250            ->andWhere('c.collectivity = :collectivity')
251            ->setParameter('collectivity', $collectivity);
252
253        $qb->update(['o.clonedFrom' => null]);
254    }
255}