Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
ModeleMesureProtection
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 6
650
0.00% covered (danger)
0.00%
0 / 1
 getModelClass
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 count
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 findPaginated
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
6
 addTableOrder
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
72
 addTableSearches
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
90
 findToDelete
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
12
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 App\Domain\AIPD\Repository;
11use Doctrine\ORM\QueryBuilder;
12use Doctrine\ORM\Tools\Pagination\Paginator;
13
14class 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}