Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 201
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestGenerator
0.00% covered (danger)
0.00%
0 / 201
0.00% covered (danger)
0.00%
0 / 3
812
0.00% covered (danger)
0.00%
0 / 1
 addGlobalOverview
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
90
 addSyntheticView
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
20
 addDetailedView
0.00% covered (danger)
0.00%
0 / 154
0.00% covered (danger)
0.00%
0 / 1
240
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\Reporting\Generator\Word;
25
26use App\Domain\Registry\Dictionary\RequestAnswerTypeDictionary;
27use App\Domain\Registry\Dictionary\RequestCivilityDictionary;
28use App\Domain\Registry\Dictionary\RequestObjectDictionary;
29use App\Domain\Registry\Dictionary\RequestStateDictionary;
30use App\Domain\Registry\Model\Request;
31use PhpOffice\PhpWord\Element\Section;
32
33class RequestGenerator extends AbstractGenerator implements ImpressionGeneratorInterface
34{
35    /**
36     * Global overview : Information to display for request in overview report.
37     *
38     * @throws \Exception
39     */
40    public function addGlobalOverview(Section $section, array $data): void
41    {
42        if ($this->collectivity) {
43            $collectivity = $this->collectivity;
44        } else {
45            $collectivity = $this->userProvider->getAuthenticatedUser()->getCollectivity();
46        }
47
48        // Aggregate data before rendering
49        $tableData = [
50            [
51                'Date de la demande',
52                'Objet de la demande',
53                'Date de traitement',
54                'Statut',
55            ],
56        ];
57        $nbTotal = \count($data);
58        foreach ($data as $request) {
59            $tableData[] = [
60                $request->getDate() ? $this->getDate($request->getDate(), 'd/m/Y') : '',
61                array_key_exists($request->getObject(), RequestObjectDictionary::getObjects()) ? RequestObjectDictionary::getObjects()[$request->getObject()] : $request->getObject(),
62                $request->getAnswer() ? $this->getDate($request->getAnswer()->getDate(), 'd/m/Y') : '',
63                array_key_exists($request->getState(), RequestStateDictionary::getStates()) ? RequestStateDictionary::getStates()[$request->getState()] : $request->getState(),
64            ];
65        }
66
67        $section->addTitle('Registre des demandes de personnes concernées', 2);
68
69        $section->addText('Un registre des demandes des personnes concernées est disponible et tenu à jour.');
70        if (0 === $nbTotal) {
71            $section->addText('À ce jour, il n’y a pas eu de demande de personnes concernées.');
72        }
73
74        if (0 < $nbTotal) {
75            $section->addText("Il y a eu {$nbTotal} demandes des personnes concernées.");
76            $this->addTable($section, $tableData, true, self::TABLE_ORIENTATION_HORIZONTAL);
77        }
78    }
79
80    public function addSyntheticView(Section $section, array $data): void
81    {
82        $section->addTitle('Liste des demandes', 1);
83
84        // Aggregate data before rendering
85        $tableData = [
86            [
87                'Personne concernée',
88                'Date de la demande',
89                'Objet de la demande',
90                'Date de traitement',
91            ],
92        ];
93        foreach ($data as $request) {
94            if ($request->getApplicant()->isConcernedPeople() || ' ' === $request->getConcernedPeople()->getFullName()) {
95                $concernedPeople = $request->getApplicant()->getFullName();
96            } else {
97                $concernedPeople = $request->getConcernedPeople()->getFullName();
98            }
99
100            $tableData[] = [
101                $concernedPeople,
102                $this->getDate($request->getDate(), 'd/m/Y'),
103                RequestObjectDictionary::getObjects()[$request->getObject()],
104                $this->getDate($request->getAnswer()->getDate(), 'd/m/Y'),
105            ];
106        }
107
108        // Rendering
109        $this->addTable($section, $tableData, true, self::TABLE_ORIENTATION_HORIZONTAL);
110        $section->addPageBreak();
111    }
112
113    public function addDetailedView(Section $section, array $data): void
114    {
115        $section->addTitle('Détail des demandes', 1);
116
117        /** @var Request $request */
118        foreach ($data as $key => $request) {
119            if (0 !== $key) {
120                $section->addPageBreak();
121            }
122            $section->addTitle($request->__toString(), 2);
123
124            $requestData = [];
125
126            // Ajouter les services si le module est actif
127            if ($request->getCollectivity()->getIsServicesEnabled()) {
128                $requestData[] = [
129                    'Service',
130                    $request->getService(),
131                ];
132            }
133
134            $requestData = array_merge($requestData, [
135                [
136                    'Objet de la demande',
137                    $request->getObject() ? RequestObjectDictionary::getObjects()[$request->getObject()] : null,
138                ],
139                [
140                    'Demande explicite',
141                    $request->getOtherObject(),
142                ],
143                [
144                    'Date de la demande',
145                    $this->getDate($request->getDate(), 'd/m/Y'),
146                ],
147                [
148                    'Motif',
149                    $request->getReason(),
150                ],
151                [
152                    'Demande complète',
153                    $request->isComplete() ? 'Oui' : 'Non',
154                ],
155                [
156                    'Demandeur légitime',
157                    $request->isLegitimateApplicant() ? 'Oui' : 'Non',
158                ],
159                [
160                    'Demande légitime',
161                    $request->isLegitimateRequest() ? 'Oui' : 'Non',
162                ],
163            ]);
164
165            $applicant     = $request->getApplicant();
166            $applicantData = [
167                [
168                    'Civilité',
169                    $applicant->getCivility() ? RequestCivilityDictionary::getCivilities()[$applicant->getCivility()] : null,
170                ],
171                [
172                    'Prénom',
173                    $applicant->getFirstName(),
174                ],
175                [
176                    'Nom',
177                    $applicant->getLastName(),
178                ],
179                [
180                    'Adresse',
181                    $applicant->getAddress(),
182                ],
183                [
184                    'Email',
185                    $applicant->getMail(),
186                ],
187                [
188                    'Téléphone',
189                    $applicant->getPhoneNumber(),
190                ],
191                [
192                    'Personne concernée',
193                    $applicant->isConcernedPeople() ? 'Oui' : 'Non',
194                ],
195            ];
196
197            $concernedPeople     = $request->getConcernedPeople();
198            $concernedPeopleData = [
199                [
200                    'Civilité',
201                    $concernedPeople->getCivility() ? RequestCivilityDictionary::getCivilities()[$concernedPeople->getCivility()] : null,
202                ],
203                [
204                    'Prénom',
205                    $concernedPeople->getFirstName(),
206                ],
207                [
208                    'Nom',
209                    $concernedPeople->getLastName(),
210                ],
211                [
212                    'Adresse',
213                    $concernedPeople->getAddress(),
214                ],
215                [
216                    'Email',
217                    $concernedPeople->getMail(),
218                ],
219                [
220                    'Téléphone',
221                    $concernedPeople->getPhoneNumber(),
222                ],
223                [
224                    'Lien avec le demandeur',
225                    $concernedPeople->getLinkWithApplicant(),
226                ],
227            ];
228
229            $response     = $request->getAnswer();
230            $responseData = [
231                [
232                    'Statut',
233                    $request->getState() ? RequestStateDictionary::getStates()[$request->getState()] : '',
234                ],
235            ];
236
237            if (RequestStateDictionary::STATE_DENIED === $request->getState()) {
238                $responseData[] = [
239                    'Motif du refus',
240                    $request->getStateRejectionReason(),
241                ];
242            }
243
244            $responseData[] = [
245                'Réponse apportée',
246                $response->getResponse(),
247            ];
248
249            $responseData[] = [
250                'Date de la réponse',
251                $this->getDate($response->getDate(), 'd/m/Y'),
252            ];
253
254            $responseData[] = [
255                'Moyen de la réponse',
256                $response->getType() ? RequestAnswerTypeDictionary::getTypes()[$response->getType()] : null,
257            ];
258
259            $historyData = [
260                [
261                    'Date de création',
262                    $this->getDate($request->getCreatedAt()),
263                ],
264                [
265                    'Date de modification',
266                    $this->getDate($request->getUpdatedAt()),
267                ],
268                [
269                    'Modifié par ',
270                    $request->getUpdatedBy(),
271                ],
272            ];
273
274            $section->addTitle('Demande', 3);
275            $this->addTable($section, $requestData, false, self::TABLE_ORIENTATION_VERTICAL);
276
277            $section->addTitle('Demandeur', 3);
278            $this->addTable($section, $applicantData, false, self::TABLE_ORIENTATION_VERTICAL);
279
280            // Only display concerned people if applicant isn't concerned one
281            if (!$applicant->isConcernedPeople()) {
282                $section->addTitle('Personne concernée', 3);
283                $this->addTable($section, $concernedPeopleData, false, self::TABLE_ORIENTATION_VERTICAL);
284            }
285
286            $section->addTitle('Réponse', 3);
287            $this->addTable($section, $responseData, false, self::TABLE_ORIENTATION_VERTICAL);
288
289            $section->addTitle('Éléments associés', 3);
290            $this->addLinkedData($section, $request);
291
292            $section->addTitle('Historique', 3);
293            $this->addTable($section, $historyData, false, self::TABLE_ORIENTATION_VERTICAL);
294        }
295    }
296}