Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
7.14% covered (danger)
7.14%
5 / 70
14.29% covered (danger)
14.29%
1 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
ConformiteTraitement
7.14% covered (danger)
7.14%
5 / 70
14.29% covered (danger)
14.29%
1 / 7
308.04
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
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 findActiveByCollectivity
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
2
 count
80.00% covered (warning)
80.00%
4 / 5
0.00% covered (danger)
0.00%
0 / 1
2.03
 findPaginated
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
6
 addTableOrder
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
30
 addTableSearches
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
56
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\ConformiteTraitement;
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 Doctrine\ORM\QueryBuilder;
32use Doctrine\ORM\Tools\Pagination\Paginator;
33
34class ConformiteTraitement extends CRUDRepository implements Repository\ConformiteTraitement\ConformiteTraitement
35{
36    use RepositoryUtils;
37
38    protected function getModelClass(): string
39    {
40        return Model\ConformiteTraitement\ConformiteTraitement::class;
41    }
42
43    public function findAllByCollectivity(Collectivity $collectivity)
44    {
45        $qb = $this->createQueryBuilder();
46
47        $qb
48            ->leftJoin('o.traitement', 't')
49            ->andWhere($qb->expr()->eq('t.collectivity', ':collectivity'))
50            ->setParameter('collectivity', $collectivity)
51            ->orderBy('t.name')
52        ;
53
54        return $qb
55            ->getQuery()
56            ->getResult()
57        ;
58    }
59
60    public function findActiveByCollectivity(Collectivity $collectivity)
61    {
62        $qb = $this->createQueryBuilder();
63
64        $qb
65            ->leftJoin('o.traitement', 't')
66            ->andWhere($qb->expr()->eq('t.collectivity', ':collectivity'))
67            ->andWhere($qb->expr()->eq('t.active', ':active'))
68            ->setParameter('collectivity', $collectivity)
69            ->setParameter('active', true)
70            ->orderBy('t.name')
71        ;
72
73        return $qb
74            ->getQuery()
75            ->getResult()
76        ;
77    }
78
79    public function count(array $criteria = [])
80    {
81        $qb = $this->createQueryBuilder();
82
83        $qb->select('COUNT(o.id)');
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        foreach ($criteria as $key => $value) {
97            $this->addWhereClause($qb, $key, $value);
98        }
99
100        $this->addTableOrder($qb, $orderColumn, $orderDir);
101        $this->addTableSearches($qb, $searches);
102
103        $qb = $qb->getQuery();
104        $qb->setFirstResult($firstResult);
105        $qb->setMaxResults($maxResults);
106
107        return new Paginator($qb);
108    }
109
110    private function addTableOrder(QueryBuilder $queryBuilder, $orderColumn, $orderDir)
111    {
112        switch ($orderColumn) {
113            case 'name':
114                $queryBuilder->leftJoin('o.traitement', 't');
115                $queryBuilder->addOrderBy('t.name', $orderDir);
116                break;
117            case 'collectivite':
118                $queryBuilder->addOrderBy('collectivite.name', $orderDir);
119                break;
120            case 'gestionnaire':
121                $queryBuilder->addOrderBy('o.manager', $orderDir);
122                break;
123            case 'createdAt':
124                $queryBuilder->addOrderBy('o.createdAt', $orderDir);
125                break;
126        }
127    }
128
129    private function addTableSearches(QueryBuilder $queryBuilder, $searches)
130    {
131        foreach ($searches as $columnName => $search) {
132            switch ($columnName) {
133                case 'nom':
134                    $queryBuilder->andWhere('t.name LIKE :nom')
135                        ->setParameter('nom', '%' . $search . '%');
136                    break;
137                case 'collectivite':
138                    $queryBuilder->andWhere('collectivite.name LIKE :collectivite')
139                        ->setParameter('collectivite', '%' . $search . '%');
140                    break;
141                case 'gestionnaire':
142                    $this->addWhereClause($queryBuilder, 'manager', '%' . $search . '%', 'LIKE');
143                    break;
144                case 'createdAt':
145                    if (is_string($search)) {
146                        $queryBuilder->andWhere('o.createdAt BETWEEN :created_start_date AND :created_finish_date')
147                            ->setParameter('created_start_date', date_create_from_format('d/m/y', substr($search, 0, 8))->format('Y-m-d 00:00:00'))
148                            ->setParameter('created_finish_date', date_create_from_format('d/m/y', substr($search, 11, 8))->format('Y-m-d 23:59:59'));
149                    }
150                    break;
151            }
152        }
153    }
154}