Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
16.03% covered (danger)
16.03%
21 / 131
28.57% covered (danger)
28.57%
2 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
AnalyseImpact
16.03% covered (danger)
16.03%
21 / 131
28.57% covered (danger)
28.57%
2 / 7
458.61
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
 count
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 findPaginated
0.00% covered (danger)
0.00%
0 / 39
0.00% covered (danger)
0.00%
0 / 1
30
 findOneById
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
1
 findOneByIdWithoutInvisibleScenarios
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 addTableSearches
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
56
 addTableOrder
0.00% covered (danger)
0.00%
0 / 32
0.00% covered (danger)
0.00%
0 / 1
132
1<?php
2
3declare(strict_types=1);
4
5namespace App\Infrastructure\ORM\AIPD\Repository;
6
7use App\Application\Doctrine\Repository\CRUDRepository;
8use App\Application\Traits\RepositoryUtils;
9use App\Domain\AIPD\Model;
10use Doctrine\Common\Collections\Collection;
11use Doctrine\ORM\QueryBuilder;
12use Doctrine\ORM\Tools\Pagination\Paginator;
13
14class AnalyseImpact extends CRUDRepository implements \App\Domain\AIPD\Repository\AnalyseImpact
15{
16    use RepositoryUtils;
17
18    protected function getModelClass(): string
19    {
20        return Model\AnalyseImpact::class;
21    }
22
23    public function count(array $criteria = [])
24    {
25        $qb = $this->createQueryBuilder();
26
27        $qb->select('COUNT(o.id)');
28
29        return $qb->getQuery()->getSingleScalarResult();
30    }
31
32    public function findPaginated($firstResult, $maxResults, $orderColumn, $orderDir, $searches, $criteria = [])
33    {
34        $qb = $this->createQueryBuilder();
35
36        $qb
37            ->leftJoin('o.conformiteTraitement', 'conformiteTraitement')
38            ->addSelect('conformiteTraitement')
39            ->leftJoin('conformiteTraitement.traitement', 'traitement')
40            ->addSelect('traitement')
41            ->leftJoin('traitement.collectivity', 'collectivity')
42            ->addSelect('collectivity')
43            ->leftJoin('o.avisReferent', 'avisReferent')
44            ->addSelect('avisReferent')
45            ->leftJoin('o.avisDpd', 'avisDpd')
46            ->addSelect('avisDpd')
47            ->leftJoin('o.avisRepresentant', 'avisRepresentant')
48            ->addSelect('avisRepresentant')
49            ->leftJoin('o.avisResponsable', 'avisResponsable')
50            ->addSelect('avisResponsable')
51            ->andWhere('collectivity.hasModuleConformiteTraitement=1')
52        ;
53        if (\array_key_exists('collectivity', $criteria) && $criteria['collectivity'] instanceof Collection) {
54            $qb->andWhere(
55                $qb->expr()->in('traitement.collectivity', ':collectivities')
56            )
57                ->setParameter('collectivities', $criteria['collectivity'])
58            ;
59            unset($criteria['collectivity']);
60        }
61
62        if (\array_key_exists('collectivity', $criteria)) {
63            $qb
64                ->andWhere('traitement.collectivity = :collectivity')
65                ->setParameter('collectivity', $criteria['collectivity'])
66            ;
67            unset($criteria['collectivity']);
68        }
69
70        foreach ($criteria as $key => $value) {
71            $this->addWhereClause($qb, $key, $value);
72        }
73
74        $this->addTableOrder($qb, $orderColumn, $orderDir);
75        $this->addTableSearches($qb, $searches);
76
77        $qb = $qb->getQuery();
78        $qb->setFirstResult($firstResult);
79        $qb->setMaxResults($maxResults);
80
81        return new Paginator($qb);
82    }
83
84    public function findOneById(string $id)
85    {
86        return $this->createQueryBuilder()
87            ->leftJoin('o.criterePrincipeFondamentaux', 'c')
88            ->addSelect('c')
89            ->leftJoin('o.questionConformites', 'q')
90            ->addSelect('q')
91            ->leftJoin('o.scenarioMenaces', 's')
92            ->addSelect('s')
93            ->leftJoin('o.avisReferent', 'avisReferent')
94            ->addSelect('avisReferent')
95            ->leftJoin('o.avisDpd', 'avisDpd')
96            ->addSelect('avisDpd')
97            ->leftJoin('o.avisRepresentant', 'avisRepresentant')
98            ->addSelect('avisRepresentant')
99            ->leftJoin('o.avisResponsable', 'avisResponsable')
100            ->addSelect('avisResponsable')
101            ->andWhere('o.id = :id')
102            ->setParameter('id', $id)
103            ->getQuery()
104            ->getOneOrNullResult()
105        ;
106
107        return $qb;
108    }
109
110    public function findOneByIdWithoutInvisibleScenarios(string $id)
111    {
112        return $this->createQueryBuilder()
113            ->leftJoin('o.criterePrincipeFondamentaux', 'c', 'WITH', 'c.isVisible = 1')
114            ->addSelect('c')
115            ->leftJoin('o.questionConformites', 'q')
116            ->addSelect('q')
117            ->leftJoin('o.scenarioMenaces', 's', 'WITH', 's.isVisible = 1')
118            ->addSelect('s')
119            ->andWhere('o.id = :id')
120            ->setParameter('id', $id)
121            ->getQuery()
122            ->getOneOrNullResult()
123        ;
124    }
125
126    private function addTableSearches(QueryBuilder $queryBuilder, $searches)
127    {
128        foreach ($searches as $columnName => $search) {
129            switch ($columnName) {
130                case 'traitement':
131                    $queryBuilder->andWhere('traitement.name LIKE :traitement_name')
132                        ->setParameter('traitement_name', '%' . $search . '%');
133                    break;
134                case 'service':
135                    $queryBuilder
136                        ->leftJoin('traitement.service', 'service')
137                        ->andWhere('service.name LIKE :service_name')
138                        ->setParameter('service_name', '%' . $search . '%');
139                    break;
140                case 'dateDeCreation':
141                    $queryBuilder->andWhere('o.createdAt BETWEEN :created_start_date AND :created_finish_date')
142                        ->setParameter('created_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00'))
143                        ->setParameter('created_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59'));
144                    break;
145                case 'dateDeValidation':
146                    $queryBuilder->andWhere('o.dateValidation BETWEEN :validation_start_date AND :validation_finish_date')
147                        ->setParameter('validation_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00'))
148                        ->setParameter('validation_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59'));
149                    break;
150                case 'modele':
151                    $this->addWhereClause($queryBuilder, 'modeleAnalyse', '%' . $search . '%', 'LIKE');
152                    break;
153            }
154        }
155    }
156
157    private function addTableOrder(QueryBuilder $queryBuilder, $orderColumn, $orderDir)
158    {
159        switch ($orderColumn) {
160            case 'traitement':
161                $queryBuilder->addOrderBy('traitement.name', $orderDir);
162                break;
163            case 'service':
164                $queryBuilder
165                    ->leftJoin('traitement.service', 'serviceorder')
166                    ->addOrderBy('serviceorder.name', $orderDir);
167                break;
168            case 'dateDeCreation':
169                $queryBuilder->addOrderBy('o.createdAt', $orderDir);
170                break;
171            case 'dateDeValidation':
172                $queryBuilder->addOrderBy('o.dateValidation', $orderDir);
173                break;
174            case 'modele':
175                $queryBuilder->addOrderBy('o.modeleAnalyse', $orderDir);
176                break;
177            case 'collectivite':
178                $queryBuilder->addOrderBy('collectivity.name', $orderDir);
179                break;
180            case 'avisReferent':
181                $queryBuilder->addOrderBy('avisReferent.reponse', $orderDir);
182                break;
183            case 'avisDpd':
184                $queryBuilder->addOrderBy('avisDpd.reponse', $orderDir);
185                break;
186            case 'avisRepresentant':
187                $queryBuilder->addOrderBy('avisRepresentant.reponse', $orderDir);
188                break;
189            case 'avisResponsable':
190                $queryBuilder->addOrderBy('avisResponsable.reponse', $orderDir);
191                break;
192        }
193    }
194}