IntervenantDossierController.php 13.5 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 Indicateur\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 Intervenant\Service\StatutServiceAwareTrait;
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 StatutServiceAwareTrait;
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

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

        /* Initialisation */
61
        $role = $this->getServiceContext()->getSelectedIdentityRole();
Antony Le Courtes's avatar
Antony Le Courtes committed
62
63
64
65
        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
        if (!$intervenant) {
            throw new \LogicException('Intervenant non précisé ou inexistant');
        }
66
        /* Récupération du dossier de l'intervenant */
67
        $intervenantDossier = $this->getServiceDossier()->getByIntervenant($intervenant);
68
        /* Récupération de la validation du dossier si elle existe */
69
        $intervenantDossierValidation = $this->getServiceDossier()->getValidation($intervenant);
70
        $tblDossier = $intervenantDossier->getTblDossier();
71
72
        if (!$tblDossier and $intervenantDossier->getId()) {
            //$this->em()->refresh($intervenantDossier);
73
74
            $tblDossier = $intervenantDossier->getTblDossier();
        }
75
        $lastCompleted = (!empty($tblDossier)) ? $tblDossier->getCompletude() : '';
76

77
        /* Initialisation du formulaire */
78
        $form = $this->getFormIntervenantIntervenantDossier()->setIntervenant($intervenant)->initForm();
79
80
        $form->bind($intervenantDossier);

81
82
        //si on vient de post et que le dossier n'est pas encore validé
        if ($this->getRequest()->isPost() && empty($intervenantDossierValidation)) {
83
84
85
86
87
            $data = $this->getRequest()->getPost();
            $form->setData($data);
            if ($form->isValid()) {
                /* Traitement du formulaire */
                $intervenantDossier = $this->getServiceDossier()->save($intervenantDossier);
88
89
                /*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*/
90
                $form = $this->getFormIntervenantIntervenantDossier()->setIntervenant($intervenant)->initForm();
91
                $form->bind($intervenantDossier);
92
93
                //Alimentation de la table INDIC_MODIF_DOSSIER
                $this->getServiceDossier()->updateIndicModifDossier($intervenant, $intervenantDossier);
94
                //Recalcul des tableaux de bord nécessaires
95
                $this->updateTableauxBord($intervenantDossier->getIntervenant());
96
                $this->em()->refresh($intervenantDossier);
97
                $tblDossier = $intervenantDossier->getTblDossier();
98
                $lastCompleted = $tblDossier->getCompletude();
99

100
                $this->flashMessenger()->addSuccessMessage('Enregistrement de vos données effectué');
101
                //return $this->redirect()->toUrl($this->url()->fromRoute('intervenant/dossier', [], [], true));
102
103
104
105
106
107
108

                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);
                    }
                }
109
110
            } 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
111
            }
112
        }
113

114
115
        $intervenantDossierStatut = $intervenantDossier->getStatut();
        //Règles pour afficher ou non les fieldsets
116
        $champsAutres = $intervenantDossier->getStatut()->getChampsAutres();
117
        $fieldsetRules = [
118
119
120
            'fieldset-identite-complementaire' => $intervenantDossier->getStatut()->getDossierIdentiteComplementaire(),
            'fieldset-adresse'                 => $intervenantDossier->getStatut()->getDossierAdresse(),
            'fieldset-contact'                 => $intervenantDossier->getStatut()->getDossierContact(),
Laurent Lécluse's avatar
Laurent Lécluse committed
121
            'fieldset-iban'                    => $intervenantDossier->getStatut()->getDossierBanque(),
122
123
124
125
126
            '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
        ];

127
        $iPrec = $this->getServiceDossier()->intervenantVacataireAnneesPrecedentes($intervenant, 1);
128
129
130
131
132
        $lastHETD = $iPrec ? $this->getServiceService()->getTotalHetdIntervenant($iPrec) : 0;

        if ($lastHETD > 0) {
            $hetd = Util::formattedFloat(
                $lastHETD,
Laurent Lécluse's avatar
Laurent Lécluse committed
133
                \NumberFormatter::DECIMAL,
134
135
136
137
138
139
140
                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())
            );
        }
141

142

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


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

167
            $intervenantDossier = $this->getServiceDossier()->getByIntervenant($intervenant);
168
            $statut = $this->getServiceStatut()->get($data['DossierStatut']['statut']);
169
170
            if ($statut) {
                $intervenantDossier->setStatut($statut);
171
                $this->getServiceDossier()->save($intervenantDossier);
172
                $intervenant->setStatut($statut);
173
174
                $intervenant->setSyncStatut(false);
                $this->getServiceIntervenant()->save($intervenant);
175
                $this->updateTableauxBord($intervenant);
176
177
178
179
180
181
182

                // 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();
183
                    $this->serviceUserContext->setSelectedIdentityRole($statut->getRoleId());
184
                }
185
186
187
188
189
190
191
            }
        }

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


Antony Le Courtes's avatar
Antony Le Courtes committed
192
193
194
195
    public function validerAction()
    {
        $this->initFilters();

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

        return new MessengerViewModel;
    }


216
    public function devaliderAction()
Antony Le Courtes's avatar
Antony Le Courtes committed
217
218
219
    {
        $this->initFilters();

220
        $role = $this->getServiceContext()->getSelectedIdentityRole();
Antony Le Courtes's avatar
Antony Le Courtes committed
221
        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
222
        $validation = $this->getServiceDossier()->getValidation($intervenant);
Antony Le Courtes's avatar
Antony Le Courtes committed
223
224
225
        try {
            $this->getServiceValidation()->delete($validation);
            $this->updateTableauxBord($intervenant, true);
226
            $this->flashMessenger()->addSuccessMessage("Validation des données personnelles <strong>supprimée</strong> avec succès.");
Antony Le Courtes's avatar
Antony Le Courtes committed
227
228
229
230
231
232
233
234
        } catch (\Exception $e) {
            $this->flashMessenger()->addErrorMessage($this->translate($e));
        }

        return new MessengerViewModel;
    }


235
    public function supprimerAction()
Antony Le Courtes's avatar
Antony Le Courtes committed
236
237
238
    {
        $this->initFilters();

239
        $role = $this->getServiceContext()->getSelectedIdentityRole();
Antony Le Courtes's avatar
Antony Le Courtes committed
240
        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
241
        $dossier = $this->getServiceDossier()->getByIntervenant($intervenant);
Antony Le Courtes's avatar
Antony Le Courtes committed
242
243
244
245

        try {
            $this->getServiceDossier()->delete($dossier);
            $this->updateTableauxBord($intervenant);
246
            $this->flashMessenger()->addSuccessMessage("Suppression des données personnelles <strong>effectuée</strong> avec succès.");
Antony Le Courtes's avatar
Antony Le Courtes committed
247
248
249
250
251
252
253
254
        } catch (\Exception $e) {
            $this->flashMessenger()->addErrorMessage($this->translate($e));
        }

        return new MessengerViewModel;
    }


255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
    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();
276
        $title = "Historique des modifications d'informations importantes dans les données personnelles";
277
278
279
280
281

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


282
283
284
    public function purgerDifferencesAction()
    {
        $intervenant = $this->getEvent()->getParam('intervenant');
285

286
287
288
289
        if ($this->getRequest()->isPost()) {
            try {
                $utilisateur = $this->getServiceContext()->getUtilisateur();
                $this->getServiceDossier()->purgerDonneesPersoModif($intervenant, $utilisateur);
290

291
292
293
                $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));
294

295
296
297
298
                $this->flashMessenger()->addSuccessMessage("Action effectuée avec succès.");
            } catch (\Exception $e) {
                $this->flashMessenger()->addErrorMessage($this->translate($e));
            }
299

300
301
302
303
304
            return new MessengerViewModel();
        } else {
            return compact('intervenant');
        }
    }
305
306


307
    private function updateTableauxBord(Intervenant $intervenant, $validation = false)
Antony Le Courtes's avatar
Antony Le Courtes committed
308
309
310
311
312
313
314
    {
        $this->getServiceWorkflow()->calculerTableauxBord([
            'dossier',
            'piece_jointe_demande',
        ], $intervenant);
    }
}