Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
14.39% |
19 / 132 |
|
46.67% |
7 / 15 |
CRAP | |
0.00% |
0 / 1 |
RequestController | |
14.39% |
19 / 132 |
|
46.67% |
7 / 15 |
895.85 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
1 | |||
getDomain | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getModel | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getModelClass | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getFormType | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getListData | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
3 | |||
isSoftDelete | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
reportAction | |
0.00% |
0 / 6 |
|
0.00% |
0 / 1 |
2 | |||
listAction | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
2 | |||
listDataTables | |
0.00% |
0 / 25 |
|
0.00% |
0 / 1 |
156 | |||
isRequestInUserServices | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
6 | |||
getLabelAndKeysArray | |
0.00% |
0 / 44 |
|
0.00% |
0 / 1 |
12 | |||
getRequestCriteria | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
12 | |||
getActionsCellContent | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
12 | |||
getLinkForPersonneConcernee | |
0.00% |
0 / 6 |
|
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 | |
22 | declare(strict_types=1); |
23 | |
24 | namespace App\Domain\Registry\Controller; |
25 | |
26 | use App\Application\Controller\CRUDController; |
27 | use App\Application\Symfony\Security\UserProvider; |
28 | use App\Application\Traits\ServersideDatatablesTrait; |
29 | use App\Domain\Documentation\Model\Category; |
30 | use App\Domain\Registry\Dictionary\RequestObjectDictionary; |
31 | use App\Domain\Registry\Dictionary\RequestStateDictionary; |
32 | use App\Domain\Registry\Form\Type\RequestType; |
33 | use App\Domain\Registry\Model; |
34 | use App\Domain\Registry\Repository; |
35 | use App\Domain\Reporting\Handler\WordHandler; |
36 | use App\Domain\User\Dictionary\UserRoleDictionary; |
37 | use Doctrine\ORM\EntityManagerInterface; |
38 | use Knp\Snappy\Pdf; |
39 | use Symfony\Component\HttpFoundation\JsonResponse; |
40 | use Symfony\Component\HttpFoundation\Request; |
41 | use Symfony\Component\HttpFoundation\RequestStack; |
42 | use Symfony\Component\HttpFoundation\Response; |
43 | use Symfony\Component\Routing\RouterInterface; |
44 | use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; |
45 | use Symfony\Contracts\Translation\TranslatorInterface; |
46 | |
47 | /** |
48 | * @property Repository\Request $repository |
49 | */ |
50 | class 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 | } |