Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.82% covered (danger)
0.82%
1 / 122
12.50% covered (danger)
12.50%
1 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
LogJournal
0.82% covered (danger)
0.82%
1 / 122
12.50% covered (danger)
12.50%
1 / 8
634.76
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
 updateDeletedLog
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
2
 findPaginated
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
2
 count
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 addOrder
0.00% covered (danger)
0.00%
0 / 43
0.00% covered (danger)
0.00%
0 / 1
90
 addSearches
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 1
110
 findAllByCollectivityWithoutSubjects
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 deleteAllAnteriorToDate
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace App\Infrastructure\ORM\Reporting\Repository;
6
7use App\Application\Doctrine\Repository\CRUDRepository;
8use App\Domain\Reporting\Dictionary\LogJournalActionDictionary;
9use App\Domain\Reporting\Dictionary\LogJournalSubjectDictionary;
10use App\Domain\Reporting\Model;
11use App\Domain\Reporting\Model\LoggableSubject;
12use App\Domain\Reporting\Repository;
13use App\Domain\User\Model\Collectivity;
14use Doctrine\ORM\QueryBuilder;
15use Doctrine\ORM\Tools\Pagination\Paginator;
16
17class LogJournal extends CRUDRepository implements Repository\LogJournal
18{
19    protected function getModelClass(): string
20    {
21        return Model\LogJournal::class;
22    }
23
24    public function updateDeletedLog(LoggableSubject $subject)
25    {
26        $qb = $this->getManager()->createQueryBuilder();
27        $qb
28            ->update($this->getModelClass(), 'o')
29            ->set('o.isDeleted', ':true')
30            ->andWhere($qb->expr()->eq('o.subjectId', ':uuid'))
31            ->setParameters(
32                [
33                    'true' => true,
34                    'uuid' => $subject->getId()->toString(),
35                ]
36            )
37        ;
38
39        $qb->getQuery()->execute();
40    }
41
42    public function findPaginated($firstResult, $maxResults, $orderColumn, $orderDir, $searches, $criteria = [])
43    {
44        $query = $this->createQueryBuilder()
45            ->addSelect('collectivite')
46            ->leftJoin('o.collectivity', 'collectivite')
47        ;
48
49        $this->addOrder($query, $orderColumn, $orderDir);
50        $this->addSearches($query, $searches);
51
52        $query = $query->getQuery();
53        $query->setFirstResult($firstResult);
54        $query->setMaxResults($maxResults);
55
56        return new Paginator($query);
57    }
58
59    public function count(array $criteria = [])
60    {
61        return $this
62            ->createQueryBuilder()
63            ->select('count(o.id)')
64            ->getQuery()
65            ->getSingleScalarResult()
66        ;
67    }
68
69    private function addOrder(&$queryBuilder, $orderColumn, $orderDir)
70    {
71        switch ($orderColumn) {
72            case 'subjectId':
73                $queryBuilder->addOrderBy('o.subjectId', $orderDir);
74                break;
75            case 'userFullName':
76                $queryBuilder->addOrderBy('o.userFullName', $orderDir);
77                break;
78            case 'userEmail':
79                $queryBuilder->addOrderBy('o.userEmail', $orderDir);
80                break;
81            case 'collectivite':
82                $queryBuilder
83                    ->addOrderBy('collectivite.name', $orderDir);
84                break;
85            case 'date':
86                $queryBuilder->addOrderBy('o.date', $orderDir);
87                break;
88            case 'subject':
89                $queryBuilder->addSelect('(case 
90                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_MESUREMENT . '\' THEN 1 
91                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_CONFORMITE_TRAITEMENT . '\' THEN 2 
92                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::USER_COLLECTIVITY . '\' THEN 3  
93                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_REQUEST . '\' THEN 4 
94                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::USER_EMAIL . '\' THEN 5 
95                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_CONFORMITE_ORGANISATION_EVALUATION . '\' THEN 6
96                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::MATURITY_SURVEY . '\' THEN 7
97                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::USER_PASSWORD . '\' THEN 8
98                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::USER_LASTNAME . '\' THEN 9
99                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::USER_FIRSTNAME . '\' THEN 10
100                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_PROOF . '\' THEN 11
101                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_CONTRACTOR . '\' THEN 12
102                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_TREATMENT . '\' THEN 13
103                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::USER_USER . '\' THEN 14
104                WHEN o.subjectType = \'' . LogJournalSubjectDictionary::REGISTRY_VIOLATION . '\' THEN 15
105                ELSE 16 END) AS HIDDEN subject_order')
106                    ->addOrderBy('subject_order', $orderDir);
107                break;
108            case 'action':
109                $queryBuilder->addSelect('(case when o.action = \'' . LogJournalActionDictionary::LOGIN . '\' THEN 1 WHEN o.action = \'' . LogJournalActionDictionary::CREATE . '\' THEN 2 WHEN o.action = \'' . LogJournalActionDictionary::UPDATE . '\' THEN 3 ELSE 4 END) AS HIDDEN action_order')
110                    ->addOrderBy('action_order', $orderDir);
111                break;
112            case 'subjectName':
113                $queryBuilder->addOrderBy('o.subjectName', $orderDir);
114                break;
115        }
116    }
117
118    private function addSearches(QueryBuilder $queryBuilder, array $searches)
119    {
120        foreach ($searches as $columnName => $search) {
121            switch ($columnName) {
122                case 'subjectId':
123                    $queryBuilder->andWhere('o.subjectId LIKE :id')
124                        ->setParameter('id', '%' . $search . '%');
125                    break;
126                case 'userFullName':
127                    $queryBuilder->andWhere('o.userFullName LIKE :name')
128                        ->setParameter('name', '%' . $search . '%');
129                    break;
130                case 'userEmail':
131                    $queryBuilder->andWhere('o.userEmail LIKE :email')
132                        ->setParameter('email', '%' . $search . '%');
133                    break;
134                case 'collectivite':
135                    $queryBuilder->andWhere('collectivite.name LIKE :collectivite')
136                        ->setParameter('collectivite', '%' . $search . '%');
137                    break;
138                case 'date':
139                    $queryBuilder->andWhere('o.date BETWEEN :start_date AND :finish_date')
140                        ->setParameter('start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00'))
141                        ->setParameter('finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59'));
142                    break;
143                case 'subject':
144                    $queryBuilder->andWhere('o.subjectType = :subject')
145                    ->setParameter('subject', $search);
146                    break;
147                case 'action':
148                    $queryBuilder->andWhere('o.action = :action')
149                        ->setParameter('action', $search);
150                    break;
151                case 'subjectName':
152                    $queryBuilder->andWhere('o.subjectName LIKE :subjectName')
153                        ->setParameter('subjectName', '%' . $search . '%');
154                    break;
155            }
156        }
157    }
158
159    public function findAllByCollectivityWithoutSubjects(Collectivity $collectivity, $limit, array $subjects = [])
160    {
161        $qb = $this->createQueryBuilder();
162        $qb->andWhere($qb->expr()->eq('o.collectivity', ':collectivity'))
163            ->andWhere($qb->expr()->notIn('o.subjectType', ':subjects'))
164            ->setParameters([
165                'collectivity' => $collectivity,
166                'subjects'     => $subjects,
167            ])
168            ->addOrderBy('o.date', 'DESC')
169            ->setMaxResults($limit)
170        ;
171
172        return $qb->getQuery()->getResult();
173    }
174
175    public function deleteAllAnteriorToDate(\DateTime $date)
176    {
177        $query = $this->getManager()->createQuery("DELETE FROM App\Domain\Reporting\Model\LogJournal o WHERE o.date < :dateP")
178            ->setParameter('dateP', $date)
179        ;
180
181        return $query->execute();
182    }
183}