IntervenantDossierController.php 13.6 KB
Newer Older
Antony Le Courtes's avatar
Antony Le Courtes committed
1
2
3
4
5
<?php

namespace Application\Controller;

use Application\Constants;
6
use Application\Entity\Db\IndicModifDossier;
Antony Le Courtes's avatar
Antony Le Courtes committed
7
use Application\Entity\Db\Intervenant;
8
use Application\Entity\Db\WfEtape;
Antony Le Courtes's avatar
Antony Le Courtes committed
9
use Application\Form\Intervenant\DossierValidation;
10
use Application\Form\Intervenant\Traits\AutresFormAwareTrait;
11
use Application\Form\Intervenant\Traits\IntervenantDossierFormAwareTrait;
12
use Application\Service\Traits\AnneeServiceAwareTrait;
Antony Le Courtes's avatar
Antony Le Courtes committed
13
use Application\Service\Traits\ContextServiceAwareTrait;
14
use Application\Service\Traits\DossierAutreServiceAwareTrait;
Antony Le Courtes's avatar
Antony Le Courtes committed
15
use Application\Service\Traits\DossierServiceAwareTrait;
16
use Application\Service\Traits\IntervenantServiceAwareTrait;
Antony Le Courtes's avatar
Antony Le Courtes committed
17
use Application\Service\Traits\ServiceServiceAwareTrait;
18
use Application\Service\Traits\StatutIntervenantServiceAwareTrait;
Antony Le Courtes's avatar
Antony Le Courtes committed
19
20
use Application\Service\Traits\ValidationServiceAwareTrait;
use Application\Service\Traits\WorkflowServiceAwareTrait;
21
use UnicaenApp\Util;
Antony Le Courtes's avatar
Antony Le Courtes committed
22
23
use UnicaenApp\View\Model\MessengerViewModel;
use UnicaenAuth\Service\Traits\UserContextServiceAwareTrait;
24
use UnicaenImport\Processus\Traits\ImportProcessusAwareTrait;
25

Antony Le Courtes's avatar
Antony Le Courtes committed
26
27
28
29
30
31
32
33

class IntervenantDossierController extends AbstractController
{
    use ContextServiceAwareTrait;
    use ServiceServiceAwareTrait;
    use DossierServiceAwareTrait;
    use WorkflowServiceAwareTrait;
    use ValidationServiceAwareTrait;
34
    use IntervenantDossierFormAwareTrait;
Antony Le Courtes's avatar
Antony Le Courtes committed
35
    use UserContextServiceAwareTrait;
36
    use DossierServiceAwareTrait;
37
    use DossierAutreServiceAwareTrait;
38
39
    use AutresFormAwareTrait;
    use DossierAutreServiceAwareTrait;
40
41
    use IntervenantServiceAwareTrait;
    use AnneeServiceAwareTrait;
42
    use StatutIntervenantServiceAwareTrait;
43
    use ImportProcessusAwareTrait;
Antony Le Courtes's avatar
Antony Le Courtes committed
44
45
46
47
48
49
50
51
52
53
54


    protected function initFilters()
    {
        $this->em()->getFilters()->enable('historique')->init([
            \Application\Entity\Db\Intervenant::class,
            \Application\Entity\Db\Validation::class,
            \Application\Entity\Db\Dossier::class,
        ]);
    }

55
56
57
58


    public function indexAction()
    {
Antony Le Courtes's avatar
Antony Le Courtes committed
59
60
61
        $this->initFilters();

        /* Initialisation */
62
        $role        = $this->getServiceContext()->getSelectedIdentityRole();
Antony Le Courtes's avatar
Antony Le Courtes committed
63
64
65
66
        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
        if (!$intervenant) {
            throw new \LogicException('Intervenant non précisé ou inexistant');
        }
67
        /* Récupération du dossier de l'intervenant */
68
        $intervenantDossier = $this->getServiceDossier()->getByIntervenant($intervenant);
69

70
71
72
73
74
        /*Si dossier n'a pas encore d'id alors on le save et on calcule la completude*/
        if (!$intervenantDossier->getId()) {
            $this->getServiceDossier()->save($intervenantDossier);
            $this->updateTableauxBord($intervenantDossier->getIntervenant());
        }
75
        $intervenantDossierValidation = $this->getServiceDossier()->getValidation($intervenant);
76
        $tblDossier                   = $intervenantDossier->getTblDossier();
77
78
79
80
        if (!$tblDossier) {
            $this->em()->refresh($intervenantDossier);
            $tblDossier = $intervenantDossier->getTblDossier();
        }
81

82
        $lastCompleted = $tblDossier->getCompletude();
83
84
        /* Initialisation du formulaire */
        $form = $this->getIntervenantDossierForm($intervenant);
85
86
87
88
89
90
91
92
93
        $form->bind($intervenantDossier);

        //si on vient de post
        if ($this->getRequest()->isPost()) {
            $data = $this->getRequest()->getPost();
            $form->setData($data);
            if ($form->isValid()) {
                /* Traitement du formulaire */
                $intervenantDossier = $this->getServiceDossier()->save($intervenantDossier);
94
95
                //Alimentation de la table INDIC_MODIF_DOSSIER
                $this->getServiceDossier()->updateIndicModifDossier($intervenant, $intervenantDossier);
96
                //Recalcul des tableaux de bord nécessaires
97
                $this->updateTableauxBord($intervenantDossier->getIntervenant());
98
99
                $this->em()->refresh($tblDossier);

100
101
102
103
                /*On reinitialise le formulaire car le statut du dossier a
                pu être changé donc les règles d'affichage ne sont plus les mêmes*/
                $form = $this->getIntervenantDossierForm($intervenant);
                $form->bind($intervenantDossier);
104
                $this->flashMessenger()->addSuccessMessage('Enregistrement de vos données effectué');
105
                //return $this->redirect()->toUrl($this->url()->fromRoute('intervenant/dossier', [], [], true));
106
107
108
109
110
111
112

                if (!$lastCompleted && $tblDossier->getCompletude() && $role->getIntervenant()) { // on ne redirige que pour l'intervenant et seulement si le dossier a été nouvellement créé
                    $nextEtape = $this->getServiceWorkflow()->getNextEtape(WfEtape::CODE_DONNEES_PERSO_SAISIE, $intervenant);
                    if ($nextEtape && $url = $nextEtape->getUrl()) {
                        return $this->redirect()->toUrl($url);
                    }
                }
113
114
            } else {
                $this->flashMessenger()->addErrorMessage("Vos données n'ont pas été enregistré, veuillez vérifier les erreurs.");
Antony Le Courtes's avatar
Antony Le Courtes committed
115
            }
116
        }
117

118
119
        $intervenantDossierStatut = $intervenantDossier->getStatut();
        //Règles pour afficher ou non les fieldsets
120
121
        $champsAutres  = $intervenantDossier->getStatut()->getChampsAutres();
        $fieldsetRules = [
122
123
124
125
126
127
128
129
130
            'fieldset-identite-complementaire' => $intervenantDossier->getStatut()->getDossierIdentiteComplementaire(),
            'fieldset-adresse'                 => $intervenantDossier->getStatut()->getDossierAdresse(),
            'fieldset-contact'                 => $intervenantDossier->getStatut()->getDossierContact(),
            'fieldset-iban'                    => $intervenantDossier->getStatut()->getDossierIban(),
            'fieldset-insee'                   => $intervenantDossier->getStatut()->getDossierInsee(),
            'fieldset-employeur'               => $intervenantDossier->getStatut()->getDossierEmployeur(),
            'fieldset-autres'                  => (!empty($champsAutres)) ? 1 : 0,//Si le statut intervenant a au moins 1 champs autre
        ];

131
132
133
134
135
136
        $iPrec    = $this->getServiceDossier()->intervenantVacataireAnneesPrecedentes($intervenant, 1);
        $lastHETD = $iPrec ? $this->getServiceService()->getTotalHetdIntervenant($iPrec) : 0;

        if ($lastHETD > 0) {
            $hetd = Util::formattedFloat(
                $lastHETD,
Laurent Lécluse's avatar
Laurent Lécluse committed
137
                \NumberFormatter::DECIMAL,
138
139
140
141
142
143
144
                2);
            $this->flashMessenger()->addInfoMessage(
                $role->getIntervenant() ?
                    sprintf("Vous avez effectué %s HETD en %s.", $hetd, $iPrec->getAnnee())
                    : sprintf("L'intervenant a effectué %s HETD en %s.", $hetd, $iPrec->getAnnee())
            );
        }
145

146

147
        return compact(
Laurent Lécluse's avatar
Laurent Lécluse committed
148
149
150
151
152
153
            'form',
            'role',
            'intervenant',
            'intervenantDossier',
            'intervenantDossierValidation',
            'intervenantDossierStatut',
154
            'tblDossier',
Laurent Lécluse's avatar
Laurent Lécluse committed
155
156
            'champsAutres',
            'fieldsetRules'
157
        );
Antony Le Courtes's avatar
Antony Le Courtes committed
158
159
160
161
    }



162
163
164
165
166
167
168
169
170
    public function changeStatutDossierAction()
    {
        if ($this->getRequest()->isPost()) {
            $data        = $this->getRequest()->getPost();
            $role        = $this->getServiceContext()->getSelectedIdentityRole();
            $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
            if (!$intervenant) {
                throw new \LogicException('Intervenant non précisé ou inexistant');
            }
171

172
            $intervenantDossier = $this->getServiceDossier()->getByIntervenant($intervenant);
173
            $statutIntervenant  = $this->getServiceStatutIntervenant()->get($data['DossierStatut']['statut']);
174
175
            if ($statutIntervenant) {
                $intervenantDossier->setStatut($statutIntervenant);
176
177
178
179
                $this->getServiceDossier()->save($intervenantDossier);
                $intervenant->setStatut($statutIntervenant);
                $intervenant->setSyncStatut(false);
                $this->getServiceIntervenant()->save($intervenant);
180
                $this->updateTableauxBord($intervenant);
181
182
183
184
185
186
187
188
189

                // Lorsqu'un intervenant modifie son dossier, le rôle à sélectionner à la prochine requête doit correspondre
                // au statut choisi dans le dossier.
                if ($role->getIntervenant()) {
                    $this->serviceUserContext->clearIdentityRoles();
                    \Application::$container->get(\Application\Provider\Identity\IdentityProvider::class)->clearIdentityRoles();
                    \Application::$container->get(\Application\Provider\Role\RoleProvider::class)->clearRoles();
                    $this->serviceUserContext->setSelectedIdentityRole($statutIntervenant->getRoleId());
                }
190
191
192
193
194
195
196
197
            }
        }

        return $this->redirect()->toUrl($this->url()->fromRoute('intervenant/dossier', [], [], true));
    }



Antony Le Courtes's avatar
Antony Le Courtes committed
198
199
200
201
    public function validerAction()
    {
        $this->initFilters();

202
203
204
205
        $role               = $this->getServiceContext()->getSelectedIdentityRole();
        $intervenant        = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
        $intervenantDossier = $this->getServiceDossier()->getByIntervenant($intervenant);
        $validation         = $this->getServiceDossier()->getValidation($intervenant);
Antony Le Courtes's avatar
Antony Le Courtes committed
206
207
208
209
        if ($validation) {
            throw new \Exception('Ce dossier a déjà été validé par ' . $validation->getHistoCreateur() . ' le ' . $validation->getHistoCreation()->format(Constants::DATE_FORMAT));
        }
        try {
210
            $this->getServiceValidation()->validerDossier($intervenantDossier);
211
            $this->getProcessusImport()->execMaj('INTERVENANT', 'CODE', $intervenant->getCode());
Antony Le Courtes's avatar
Antony Le Courtes committed
212
            $this->updateTableauxBord($intervenant, true);
213
            $this->flashMessenger()->addSuccessMessage("Validation des données personnelles <strong>enregistrée</strong> avec succès.");
Antony Le Courtes's avatar
Antony Le Courtes committed
214
215
216
217
218
219
220
221
222
        } catch (\Exception $e) {
            $this->flashMessenger()->addErrorMessage($this->translate($e));
        }

        return new MessengerViewModel;
    }



223
    public function devaliderAction()
Antony Le Courtes's avatar
Antony Le Courtes committed
224
225
226
227
228
229
230
231
232
    {
        $this->initFilters();

        $role        = $this->getServiceContext()->getSelectedIdentityRole();
        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
        $validation  = $this->getServiceDossier()->getValidation($intervenant);
        try {
            $this->getServiceValidation()->delete($validation);
            $this->updateTableauxBord($intervenant, true);
233
            $this->flashMessenger()->addSuccessMessage("Validation des données personnelles <strong>supprimée</strong> avec succès.");
Antony Le Courtes's avatar
Antony Le Courtes committed
234
235
236
237
238
239
240
241
242
        } catch (\Exception $e) {
            $this->flashMessenger()->addErrorMessage($this->translate($e));
        }

        return new MessengerViewModel;
    }



243
    public function supprimerAction()
Antony Le Courtes's avatar
Antony Le Courtes committed
244
245
246
247
248
249
250
251
252
253
    {
        $this->initFilters();

        $role        = $this->getServiceContext()->getSelectedIdentityRole();
        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
        $dossier     = $this->getServiceDossier()->getByIntervenant($intervenant);

        try {
            $this->getServiceDossier()->delete($dossier);
            $this->updateTableauxBord($intervenant);
254
            $this->flashMessenger()->addSuccessMessage("Suppression des données personnelles <strong>effectuée</strong> avec succès.");
Antony Le Courtes's avatar
Antony Le Courtes committed
255
256
257
258
259
260
261
262
263
        } catch (\Exception $e) {
            $this->flashMessenger()->addErrorMessage($this->translate($e));
        }

        return new MessengerViewModel;
    }



264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
    public function differencesAction()
    {
        $intervenant = $this->getEvent()->getParam('intervenant');

        $dql = "
        SELECT
          vi
        FROM
          " . IndicModifDossier::class . " vi
        WHERE
          vi.histoDestruction IS NULL
          AND vi.intervenant = :intervenant
        ORDER BY
          vi.attrName, vi.histoCreation
        ";

        // refetch intervenant avec jointures
        $query = $this->em()->createQuery($dql);
        $query->setParameter('intervenant', $intervenant);

        $differences = $query->getResult();
        $title       = "Historique des modifications d'informations importantes dans les données personnelles";

        return compact('title', 'intervenant', 'differences');
    }



292
293
294
    public function purgerDifferencesAction()
    {
        $intervenant = $this->getEvent()->getParam('intervenant');
295

296
297
298
299
        if ($this->getRequest()->isPost()) {
            try {
                $utilisateur = $this->getServiceContext()->getUtilisateur();
                $this->getServiceDossier()->purgerDonneesPersoModif($intervenant, $utilisateur);
300

301
302
303
                $this->flashMessenger()->addSuccessMessage(sprintf(
                    "L'historique des modifications d'informations importantes dans les données personnelles de %s a été effacé avec succès.",
                    $intervenant));
304

305
306
307
308
                $this->flashMessenger()->addSuccessMessage("Action effectuée avec succès.");
            } catch (\Exception $e) {
                $this->flashMessenger()->addErrorMessage($this->translate($e));
            }
309

310
311
312
313
314
            return new MessengerViewModel();
        } else {
            return compact('intervenant');
        }
    }
315
316
317



318
    private function updateTableauxBord(Intervenant $intervenant, $validation = false)
Antony Le Courtes's avatar
Antony Le Courtes committed
319
320
321
    {
        $this->getServiceWorkflow()->calculerTableauxBord([
            'dossier',
322
            'service_saisie',
Antony Le Courtes's avatar
Antony Le Courtes committed
323
324
325
326
            'piece_jointe_demande',
        ], $intervenant);
    }
}