Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 83 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 1 |
ModeleMesureProtection | |
0.00% |
0 / 83 |
|
0.00% |
0 / 6 |
650 | |
0.00% |
0 / 1 |
getModelClass | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
count | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
6 | |||
findPaginated | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
6 | |||
addTableOrder | |
0.00% |
0 / 21 |
|
0.00% |
0 / 1 |
72 | |||
addTableSearches | |
0.00% |
0 / 26 |
|
0.00% |
0 / 1 |
90 | |||
findToDelete | |
0.00% |
0 / 20 |
|
0.00% |
0 / 1 |
12 |
1 | <?php |
2 | |
3 | declare(strict_types=1); |
4 | |
5 | namespace App\Infrastructure\ORM\AIPD\Repository; |
6 | |
7 | use App\Application\Doctrine\Repository\CRUDRepository; |
8 | use App\Application\Traits\RepositoryUtils; |
9 | use App\Domain\AIPD\Model; |
10 | use App\Domain\AIPD\Repository; |
11 | use Doctrine\ORM\QueryBuilder; |
12 | use Doctrine\ORM\Tools\Pagination\Paginator; |
13 | |
14 | class ModeleMesureProtection extends CRUDRepository implements Repository\ModeleMesureProtection |
15 | { |
16 | use RepositoryUtils; |
17 | |
18 | protected function getModelClass(): string |
19 | { |
20 | return Model\ModeleMesureProtection::class; |
21 | } |
22 | |
23 | public function count(array $criteria = []) |
24 | { |
25 | $qb = $this->createQueryBuilder(); |
26 | |
27 | $qb->select('COUNT(o.id)'); |
28 | |
29 | foreach ($criteria as $key => $value) { |
30 | $this->addWhereClause($qb, $key, $value); |
31 | } |
32 | |
33 | return $qb->getQuery()->getSingleScalarResult(); |
34 | } |
35 | |
36 | public function findPaginated($firstResult, $maxResults, $orderColumn, $orderDir, $searches, $criteria = []) |
37 | { |
38 | $qb = $this->createQueryBuilder(); |
39 | $qb->addSelect('o.id'); |
40 | |
41 | foreach ($criteria as $key => $value) { |
42 | $this->addWhereClause($qb, $key, $value); |
43 | } |
44 | |
45 | $this->addTableOrder($qb, $orderColumn, $orderDir); |
46 | $this->addTableSearches($qb, $searches); |
47 | |
48 | $qb = $qb->getQuery(); |
49 | $qb->setFirstResult($firstResult); |
50 | $qb->setMaxResults($maxResults); |
51 | |
52 | return new Paginator($qb); |
53 | } |
54 | |
55 | private function addTableOrder(QueryBuilder $queryBuilder, $orderColumn, $orderDir) |
56 | { |
57 | switch ($orderColumn) { |
58 | case 'nom': |
59 | $queryBuilder->addOrderBy('o.nom', $orderDir); |
60 | break; |
61 | case 'nomCourt': |
62 | $queryBuilder->addOrderBy('o.nomCourt', $orderDir); |
63 | break; |
64 | case 'detail': |
65 | $queryBuilder->addOrderBy('o.detail', $orderDir); |
66 | break; |
67 | case 'poidsVraisemblance': |
68 | $queryBuilder->addOrderBy('o.poidsVraisemblance', $orderDir); |
69 | break; |
70 | case 'poidsGravite': |
71 | $queryBuilder->addOrderBy('o.poidsGravite', $orderDir); |
72 | break; |
73 | case 'updatedAt': |
74 | $queryBuilder->addOrderBy('o.updatedAt', $orderDir); |
75 | break; |
76 | case 'createdAt': |
77 | $queryBuilder->addOrderBy('o.createdAt', $orderDir); |
78 | break; |
79 | } |
80 | } |
81 | |
82 | private function addTableSearches(QueryBuilder $queryBuilder, $searches) |
83 | { |
84 | foreach ($searches as $columnName => $search) { |
85 | switch ($columnName) { |
86 | case 'nom': |
87 | $this->addWhereClause($queryBuilder, 'nom', '%' . $search . '%', 'LIKE'); |
88 | break; |
89 | case 'nomCourt': |
90 | $this->addWhereClause($queryBuilder, 'nomCourt', '%' . $search . '%', 'LIKE'); |
91 | break; |
92 | case 'detail': |
93 | $this->addWhereClause($queryBuilder, 'detail', '%' . $search . '%', 'LIKE'); |
94 | break; |
95 | case 'poidsVraisemblance': |
96 | $this->addWhereClause($queryBuilder, 'poidsVraisemblance', '%' . $search . '%', 'LIKE'); |
97 | break; |
98 | case 'poidsGravite': |
99 | $this->addWhereClause($queryBuilder, 'poidsGravite', '%' . $search . '%', 'LIKE'); |
100 | break; |
101 | case 'createdAt': |
102 | $queryBuilder->andWhere('o.createdAt BETWEEN :created_start_date AND :created_finish_date') |
103 | ->setParameter('created_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00')) |
104 | ->setParameter('created_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59')); |
105 | break; |
106 | case 'updatedAt': |
107 | $queryBuilder->andWhere('o.updatedAt BETWEEN :updated_start_date AND :updated_finish_date') |
108 | ->setParameter('updated_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00')) |
109 | ->setParameter('updated_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59')); |
110 | break; |
111 | } |
112 | } |
113 | } |
114 | |
115 | public function findToDelete(Model\ModeleAnalyse $modele) |
116 | { |
117 | $qb = $this->createQueryBuilder(); |
118 | $smIds = []; |
119 | foreach ($modele->getScenarioMenaces() as $sm) { |
120 | $smIds[] = $sm->getId()->toString(); |
121 | } |
122 | // get measure ids that are joined to another ModeleScenarionMenace |
123 | $qb->select('o.id')->join('o.scenariosMenaces', 'sm', 'sm.modele_analyse_id = o.id') |
124 | ->where('sm.id NOT IN (:ids)') |
125 | ->setParameter('ids', $smIds) |
126 | ; |
127 | // Keep only measure ids |
128 | $toNotDelete = array_map(function ($r) {return $r['id']->toString(); }, $qb->getQuery()->getResult()); |
129 | |
130 | // Get measures to delete: |
131 | // They are in the scenarioMenaces for the current ModeleAnalyse |
132 | // And are not part of the measures linked to other scenarios. |
133 | $toDelete = $this->createQueryBuilder() |
134 | ->select('o') |
135 | ->join('o.scenariosMenaces', 'sm', 'sm.modele_analyse_id = o.id') |
136 | ->where('sm.id IN (:ids)') |
137 | ->setParameter('ids', $smIds) |
138 | ; |
139 | |
140 | if (count($toNotDelete)) { |
141 | // Only check if they are in the otherwise linked array if it contains data |
142 | $toDelete->andWhere('o.id NOT IN (:mesureids)') |
143 | ->setParameter('mesureids', $toNotDelete) |
144 | ; |
145 | } |
146 | |
147 | return $toDelete->getQuery()->getResult(); |
148 | } |
149 | } |