Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
14.39% covered (danger)
14.39%
19 / 132
46.67% covered (danger)
46.67%
7 / 15
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestController
14.39% covered (danger)
14.39%
19 / 132
46.67% covered (danger)
46.67%
7 / 15
895.85
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 getDomain
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getModel
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getModelClass
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getFormType
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getListData
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 isSoftDelete
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 reportAction
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 listAction
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 listDataTables
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
156
 isRequestInUserServices
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getLabelAndKeysArray
0.00% covered (danger)
0.00%
0 / 44
0.00% covered (danger)
0.00%
0 / 1
12
 getRequestCriteria
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
 getActionsCellContent
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
12
 getLinkForPersonneConcernee
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
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\Domain\Registry\Controller;
25
26use App\Application\Controller\CRUDController;
27use App\Application\Symfony\Security\UserProvider;
28use App\Application\Traits\ServersideDatatablesTrait;
29use App\Domain\Documentation\Model\Category;
30use App\Domain\Registry\Dictionary\RequestObjectDictionary;
31use App\Domain\Registry\Dictionary\RequestStateDictionary;
32use App\Domain\Registry\Form\Type\RequestType;
33use App\Domain\Registry\Model;
34use App\Domain\Registry\Repository;
35use App\Domain\Reporting\Handler\WordHandler;
36use App\Domain\User\Dictionary\UserRoleDictionary;
37use Doctrine\ORM\EntityManagerInterface;
38use Knp\Snappy\Pdf;
39use Symfony\Component\HttpFoundation\JsonResponse;
40use Symfony\Component\HttpFoundation\Request;
41use Symfony\Component\HttpFoundation\RequestStack;
42use Symfony\Component\HttpFoundation\Response;
43use Symfony\Component\Routing\RouterInterface;
44use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
45use Symfony\Contracts\Translation\TranslatorInterface;
46
47/**
48 * @property Repository\Request $repository
49 */
50class RequestController extends CRUDController
51{
52    use ServersideDatatablesTrait;
53
54    /**
55     * @var RequestStack
56     */
57    protected $requestStack;
58
59    /**
60     * @var WordHandler
61     */
62    protected $wordHandler;
63
64    /**
65     * @var AuthorizationCheckerInterface
66     */
67    protected $authorizationChecker;
68
69    /**
70     * @var UserProvider
71     */
72    protected $userProvider;
73
74    /**
75     * @var RouterInterface
76     */
77    protected $router;
78
79    public function __construct(
80        EntityManagerInterface $entityManager,
81        TranslatorInterface $translator,
82        Repository\Request $repository,
83        RequestStack $requestStack,
84        WordHandler $wordHandler,
85        AuthorizationCheckerInterface $authorizationChecker,
86        UserProvider $userProvider,
87        Pdf $pdf,
88        RouterInterface $router,
89    ) {
90        parent::__construct($entityManager, $translator, $repository, $pdf, $userProvider, $authorizationChecker);
91        $this->requestStack         = $requestStack;
92        $this->wordHandler          = $wordHandler;
93        $this->authorizationChecker = $authorizationChecker;
94        $this->userProvider         = $userProvider;
95        $this->router               = $router;
96    }
97
98    protected function getDomain(): string
99    {
100        return 'registry';
101    }
102
103    protected function getModel(): string
104    {
105        return 'request';
106    }
107
108    protected function getModelClass(): string
109    {
110        return Model\Request::class;
111    }
112
113    protected function getFormType(): string
114    {
115        return RequestType::class;
116    }
117
118    protected function getListData()
119    {
120        $request  = $this->requestStack->getMasterRequest();
121        $archived = 'true' === $request->query->get('archive') ? true : false;
122
123        if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
124            return $this->repository->findAllArchived($archived);
125        }
126
127        return $this->repository->findAllArchivedByCollectivity(
128            $this->userProvider->getAuthenticatedUser()->getCollectivity(),
129            $archived
130        );
131    }
132
133    protected function isSoftDelete(): bool
134    {
135        return true;
136    }
137
138    /**
139     * Generate a word report of contractors.
140     *
141     * @throws \PhpOffice\PhpWord\Exception\Exception
142     */
143    public function reportAction(): Response
144    {
145        $objects = $this->repository->findAllByCollectivity(
146            $this->userProvider->getAuthenticatedUser()->getCollectivity(),
147            false,
148            ['date' => 'desc']
149        );
150
151        return $this->wordHandler->generateRegistryRequestReport($objects);
152    }
153
154    public function listAction(): Response
155    {
156        $criteria = $this->getRequestCriteria();
157
158        $category = $this->entityManager->getRepository(Category::class)->findOneBy([
159            'name' => 'Demande',
160        ]);
161
162        return $this->render($this->getTemplatingBasePath('list'), [
163            'totalItem' => $this->repository->count($criteria),
164            'category'  => $category,
165            'route'     => $this->router->generate('registry_request_list_datatables', ['archive' => $criteria['archive']]),
166        ]);
167    }
168
169    public function listDataTables(Request $request): JsonResponse
170    {
171        $criteria = $this->getRequestCriteria();
172        $demandes = $this->getResults($request, $criteria);
173
174        $reponse = $this->getBaseDataTablesResponse($request, $demandes, $criteria);
175
176        $yes = '<span class="badge bg-green">' . $this->translator->trans('global.label.yes') . '</span>';
177        $no  = '<span class="badge bg-red">' . $this->translator->trans('global.label.no') . '</span>';
178        // die();
179        /** @var Model\Request $demande */
180        foreach ($demandes as $demande) {
181            $reponse['data'][] = [
182                'id'                 => $demande->getId(),
183                'collectivite'       => $this->authorizationChecker->isGranted('ROLE_REFERENT') && $demande->getCollectivity() ? $demande->getCollectivity()->getName() : '',
184                'service'            => $demande->getService() ? $demande->getService()->getName() : '',
185                'personne_concernee' => $this->getLinkForPersonneConcernee($demande),
186                'date_demande'       => null !== $demande->getDate() ? \date_format($demande->getDate(), 'd/m/Y') : '',
187                'objet_demande'      => array_key_exists($demande->getObject(), RequestObjectDictionary::getObjects()) ? RequestObjectDictionary::getObjects()[$demande->getObject()] : $demande->getObject(),
188                'demande_complete'   => $demande->isComplete() ? $yes : $no,
189                'demandeur_legitime' => $demande->isLegitimateApplicant() ? $yes : $no,
190                'demande_legitime'   => $demande->isLegitimateRequest() ? $yes : $no,
191                'date_traitement'    => null !== $demande->getAnswer()->getDate() ? \date_format($demande->getAnswer()->getDate(), 'd/m/Y') : '',
192                'etat_demande'       => array_key_exists($demande->getState(), RequestStateDictionary::getStates()) ? RequestStateDictionary::getStates()[$demande->getState()] : $demande->getState(),
193                'createdAt'          => date_format($demande->getCreatedAt(), 'd-m-Y H:i'),
194                'updatedAt'          => date_format($demande->getUpdatedAt(), 'd-m-Y H:i'),
195                'actions'            => $this->getActionsCellContent($demande),
196            ];
197        }
198
199        $jsonResponse = new JsonResponse();
200        $jsonResponse->setJson(\json_encode($reponse));
201
202        return $jsonResponse;
203    }
204
205    private function isRequestInUserServices(Model\Request $request): bool
206    {
207        $user = $this->userProvider->getAuthenticatedUser();
208
209        if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
210            return true;
211        }
212
213        return $request->isInUserServices($user);
214    }
215
216    protected function getLabelAndKeysArray(): array
217    {
218        if ($this->authorizationChecker->isGranted('ROLE_REFERENT')) {
219            return [
220                'personne_concernee',
221                'collectivite',
222                'service',
223                'date_demande',
224                'objet_demande',
225                'demande_complete',
226                'demandeur_legitime',
227                'demande_legitime',
228                'date_traitement',
229                'etat_demande',
230                'createdAt',
231                'updatedAt',
232                'actions',
233            ];
234        }
235        if ($this->userProvider->getAuthenticatedUser()->hasServices()) {
236            return [
237                'personne_concernee',
238                'service',
239                'date_demande',
240                'objet_demande',
241                'demande_complete',
242                'demandeur_legitime',
243                'demande_legitime',
244                'date_traitement',
245                'etat_demande',
246                'createdAt',
247                'updatedAt',
248                'actions',
249            ];
250        }
251
252        return [
253            'personne_concernee',
254            'date_demande',
255            'objet_demande',
256            'demande_complete',
257            'demandeur_legitime',
258            'demande_legitime',
259            'date_traitement',
260            'etat_demande',
261            'createdAt',
262            'updatedAt',
263            'actions',
264        ];
265    }
266
267    private function getRequestCriteria()
268    {
269        $criteria            = [];
270        $criteria['archive'] = $this->requestStack->getMasterRequest()->query->getBoolean('archive');
271        $user                = $this->userProvider->getAuthenticatedUser();
272
273        if (!$this->authorizationChecker->isGranted('ROLE_ADMIN')) {
274            $criteria['collectivity'] = $user->getCollectivity();
275        }
276
277        if (\in_array(UserRoleDictionary::ROLE_REFERENT, $user->getRoles())) {
278            $criteria['collectivity'] = $user->getCollectivitesReferees();
279        }
280
281        return $criteria;
282    }
283
284    private function getActionsCellContent(Model\Request $demande)
285    {
286        $user = $this->userProvider->getAuthenticatedUser();
287        if ($user->getServices()->isEmpty() || $this->isRequestInUserServices($demande)) {
288            return
289                '<a href="' . $this->router->generate('registry_request_edit', ['id' => $demande->getId()]) . '">
290                    <i aria-hidden="true" class="fa fa-pencil"></i> ' .
291                    $this->translator->trans('global.action.edit') . '
292                </a>
293                <a href="' . $this->router->generate('registry_request_delete', ['id' => $demande->getId()]) . '">
294                    <i aria-hidden="true" class="fa fa-archive"></i> ' .
295                    $this->translator->trans('global.action.archive') .
296                '</a>';
297        }
298
299        return null;
300    }
301
302    private function getLinkForPersonneConcernee(Model\Request $demande)
303    {
304        $link = '<a href="' . $this->router->generate('registry_request_show', ['id' => $demande->getId()]) . '">';
305        if ($demande->getApplicant()->isConcernedPeople()
306            || ' ' === $demande->getConcernedPeople()->getFullName()) {
307            $link .= $demande->getApplicant()->getFullName();
308        } else {
309            $link .= $demande->getConcernedPeople()->getFullName();
310        }
311
312        return $link . '</a>';
313    }
314}