IntervenantController.php 25.8 KB
Newer Older
gauthierb's avatar
gauthierb committed
1
2
3
4
<?php

namespace Application\Controller;

5
use Application\Entity\Db\RegleStructureValidation;
6
use Application\Entity\Db\TypeVolumeHoraire;
7
use Application\Entity\Db\Validation;
8
use Application\Entity\Service\Recherche;
lecluse's avatar
#2574    
lecluse committed
9
use Application\Form\Intervenant\Traits\EditionFormAwareTrait;
lecluse's avatar
lecluse committed
10
use Application\Form\Intervenant\Traits\HeuresCompFormAwareTrait;
11
use Application\Form\Intervenant\Traits\RegleStructureValidationFormAwareTrait;
12
use Application\Processus\Traits\IntervenantProcessusAwareTrait;
13
use Application\Processus\Traits\PlafondProcessusAwareTrait;
14
use Application\Processus\Traits\ServiceProcessusAwareTrait;
15
16
use Application\Processus\Traits\ServiceReferentielProcessusAwareTrait;
use Application\Provider\Privilege\Privileges;
17
use Application\Service\Traits\CampagneSaisieServiceAwareTrait;
18
use Application\Service\Traits\DossierServiceAwareTrait;
19
use Application\Service\Traits\EtatVolumeHoraireServiceAwareTrait;
20
use Application\Service\Traits\FormuleResultatServiceAwareTrait;
21
use Application\Service\Traits\LocalContextServiceAwareTrait;
22
use Application\Service\Traits\RegleStructureValidationServiceAwareTrait;
Laurent Lécluse's avatar
Laurent Lécluse committed
23
24
use Application\Service\Traits\SourceServiceAwareTrait;
use Application\Service\Traits\StatutIntervenantServiceAwareTrait;
25
use Application\Service\Traits\TypeVolumeHoraireServiceAwareTrait;
26
use Application\Service\Traits\UtilisateurServiceAwareTrait;
27
use Application\Service\Traits\ValidationServiceAwareTrait;
28
use Application\Service\Traits\WorkflowServiceAwareTrait;
29
use ExportRh\Connecteur\Siham\SihamConnecteurAwareTrait;
lecluse's avatar
lecluse committed
30
use UnicaenApp\Traits\SessionContainerTrait;
31
use LogicException;
32
use Application\Entity\Db\Intervenant;
33
use Application\Service\Traits\ContextServiceAwareTrait;
34
use Application\Service\Traits\IntervenantServiceAwareTrait;
35
use UnicaenApp\View\Model\MessengerViewModel;
36
use UnicaenImport\Entity\Differentiel\Query;
37
use UnicaenImport\Processus\Traits\ImportProcessusAwareTrait;
38
use UnicaenImport\Service\Traits\DifferentielServiceAwareTrait;
39
use Zend\View\Model\ViewModel;
gauthierb's avatar
gauthierb committed
40
41
42
43
44

/**
 * Description of IntervenantController
 *
 */
45
class  IntervenantController extends AbstractController
gauthierb's avatar
gauthierb committed
46
{
47
    use WorkflowServiceAwareTrait;
48
    use ContextServiceAwareTrait;
49
    use IntervenantServiceAwareTrait;
lecluse's avatar
lecluse committed
50
51
    use HeuresCompFormAwareTrait;
    use SessionContainerTrait;
lecluse's avatar
#2574    
lecluse committed
52
    use EditionFormAwareTrait;
53
54
    use TypeVolumeHoraireServiceAwareTrait;
    use EtatVolumeHoraireServiceAwareTrait;
55
56
    use IntervenantProcessusAwareTrait;
    use ServiceProcessusAwareTrait;
57
    use ServiceReferentielProcessusAwareTrait;
58
    use LocalContextServiceAwareTrait;
59
    use CampagneSaisieServiceAwareTrait;
60
    use ValidationServiceAwareTrait;
61
    use PlafondProcessusAwareTrait;
62
    use FormuleResultatServiceAwareTrait;
63
64
    use RegleStructureValidationServiceAwareTrait;
    use RegleStructureValidationFormAwareTrait;
Laurent Lécluse's avatar
Laurent Lécluse committed
65
66
    use StatutIntervenantServiceAwareTrait;
    use SourceServiceAwareTrait;
67
    use UtilisateurServiceAwareTrait;
68
    use DossierServiceAwareTrait;
69
    use ImportProcessusAwareTrait;
70
    use DifferentielServiceAwareTrait;
71

72

gauthierb's avatar
gauthierb committed
73
74
    public function indexAction()
    {
75
        $role = $this->getServiceContext()->getSelectedIdentityRole();
76

77

lecluse's avatar
lecluse committed
78
        if ($intervenant = $role->getIntervenant()) {
79
            $etapeCourante = $this->getServiceWorkflow()->getEtapeCourante();
80
            if ($etapeCourante && $this->getServiceWorkflow()->isAllowed($etapeCourante)) {
81
82
83
                if ($etapeCourante && $url = $etapeCourante->getUrl()) {
                    return $this->redirect()->toUrl($url);
                }
84
            } else {
85
                return $this->redirect()->toRoute('intervenant/voir', ['intervenant' => $intervenant->getId()]);
86
            }
87
        }
88

89
90
        return $this->redirect()->toRoute('intervenant/rechercher');
    }
91

lecluse's avatar
lecluse committed
92
93


94
95
    public function rechercherAction()
    {
lecluse's avatar
lecluse committed
96
        $recents = $this->getIntervenantsRecents();
97

lecluse's avatar
lecluse committed
98
99
        return compact('recents');
    }
100
101


102

lecluse's avatar
lecluse committed
103
    public function rechercheAction()
gauthierb's avatar
gauthierb committed
104
    {
lecluse's avatar
lecluse committed
105
106
107
        $this->em()->getFilters()->enable('historique')->init([
            Intervenant::class,
        ]);
108

109
110
111
        $critere   = $this->params()->fromPost('critere');
        $recherche = $this->getProcessusIntervenant()->recherche();

112
113
        $canShowHistorises = $this->isAllowed(Privileges::getResourceId(Privileges::INTERVENANT_VISUALISATION_HISTORISES));
        $recherche->setShowHisto($canShowHistorises);
114
115

        $intervenants = $recherche->rechercher($critere, 21);
116

lecluse's avatar
lecluse committed
117
        return compact('intervenants');
gauthierb's avatar
gauthierb committed
118
    }
119

120

121

gauthierb's avatar
gauthierb committed
122
123
    public function voirAction()
    {
124
        $intervenant = $this->getEvent()->getParam('intervenant');
Laurent Lécluse's avatar
Laurent Lécluse committed
125
        $tab         = $this->params()->fromQuery('tab');
126

127
        if (!$intervenant) {
lecluse's avatar
lecluse committed
128
            throw new \LogicException('Intervenant introuvable');
gauthierb's avatar
gauthierb committed
129
        }
130

131
132
133
134
135
136
137
        if ($this->params()->fromQuery('menu', false) !== false) { // pour gérer uniquement l'affichage du menu
            $vh = new ViewModel();
            $vh->setTemplate('application/intervenant/menu');

            return $vh;
        }

lecluse's avatar
lecluse committed
138
        $this->addIntervenantRecent($intervenant);
139

140
        return compact('intervenant', 'tab');
141
    }
142

lecluse's avatar
lecluse committed
143
144


145
146
147
148
149
150
151
152
153
154
155
156
157
    public function definirParDefautAction()
    {
        $intervenant = $this->getEvent()->getParam('intervenant');

        $definiParDefaut = $this->getServiceIntervenant()->estDefiniParDefaut($intervenant);
        $this->getServiceIntervenant()->definirParDefaut($intervenant, !$definiParDefaut);
        $definiParDefaut = $this->getServiceIntervenant()->estDefiniParDefaut($intervenant);

        return compact('definiParDefaut');
    }



158
159
160
161
162
    public function servicesAction()
    {
        $this->em()->getFilters()->enable('historique')->init([
            \Application\Entity\Db\Service::class,
            \Application\Entity\Db\VolumeHoraire::class,
163
            \Application\Entity\Db\CheminPedagogique::class,
164
165
            \Application\Entity\Db\ServiceReferentiel::class,
            \Application\Entity\Db\VolumeHoraireReferentiel::class,
166
167
168
169
170
171
172
173
            \Application\Entity\Db\Validation::class,
        ]);
        $this->em()->getFilters()->enable('annee')->init([
            \Application\Entity\Db\ElementPedagogique::class,
        ]);

        $intervenant = $this->getEvent()->getParam('intervenant');
        /* @var $intervenant Intervenant */
Laurent Lécluse's avatar
#14367    
Laurent Lécluse committed
174
        if (!$intervenant) {
175
176
            throw new \LogicException('Intervenant non précisé ou inexistant');
        }
177

178
179
        $role = $this->getServiceContext()->getSelectedIdentityRole();

180
181
182
183
184
185
186
187
188
189
        if ($this->params()->fromQuery('menu', false) !== false) { // pour gérer uniquement l'affichage du menu
            $vh = new ViewModel();
            $vh->setTemplate('application/intervenant/menu');

            return $vh;
        }

        $typeVolumeHoraire = $this->params()->fromRoute('type-volume-horaire-code', TypeVolumeHoraire::CODE_PREVU);
        $typeVolumeHoraire = $this->getServiceTypeVolumeHoraire()->getByCode($typeVolumeHoraire);

190
191
        $this->getProcessusPlafond()->controle($intervenant, $typeVolumeHoraire);

192
        $campagneSaisie = $this->getServiceCampagneSaisie()->getBy($intervenant->getStatut()->getTypeIntervenant(), $typeVolumeHoraire);
193

194
        if (!$campagneSaisie->estOuverte()) {
195

196
197
            $role = $this->getServiceContext()->getSelectedIdentityRole();
            if ($role->getIntervenant()) {
198

199
200
201
202
203
204
                $this->flashMessenger()->addErrorMessage($campagneSaisie->getMessage($role));
            } else {
                $this->flashMessenger()->addWarningMessage($campagneSaisie->getMessage($role));
            }
        }

205
206
207
208
209
210
211
        $etatVolumeHoraire = $this->getServiceEtatVolumeHoraire()->getSaisi();

        $vm = new ViewModel();

        /* Liste des services */
        $this->getServiceLocalContext()->setIntervenant($intervenant); // passage au contexte pour le présaisir dans le formulaire de saisie
        $recherche = new Recherche($typeVolumeHoraire, $etatVolumeHoraire);
212
213
214

        if ($intervenant->getStatut()->getPeutSaisirService() && $this->isAllowed($intervenant, Privileges::ENSEIGNEMENT_VISUALISATION)) {
            $services = $this->getProcessusService()->getServices($intervenant, $recherche);
215
        } else {
216
217
            $services = false;
        }
218
219

        /* Services référentiels (si nécessaire) */
220
221
        if ($intervenant->getStatut()->getPeutSaisirReferentiel() && $this->isAllowed($intervenant, Privileges::REFERENTIEL_VISUALISATION)) {
            $servicesReferentiel = $this->getProcessusServiceReferentiel()->getServices($intervenant, $recherche);
222
        } else {
223
224
            $servicesReferentiel = false;
        }
225
226
227
228
229
230
231
232
233
234
235

        /* Totaux HETD */
        $params = $this->getEvent()->getRouteMatch()->getParams();
        $this->getEvent()->setParam('typeVolumeHoraire', $typeVolumeHoraire);
        $this->getEvent()->setParam('etatVolumeHoraire', $etatVolumeHoraire);
        $params['action'] = 'formuleTotauxHetd';
        $widget           = $this->forward()->dispatch('Application\Controller\Intervenant', $params);
        if ($widget) $vm->addChild($widget, 'formuleTotauxHetd');

        /* Clôture de saisie (si nécessaire) */
        if ($typeVolumeHoraire->isRealise() && $intervenant->getStatut()->getPeutCloturerSaisie()) {
236
            $cloture = $this->getServiceValidation()->getValidationClotureServices($intervenant);
237
        } else {
238
            $cloture = null;
239
240
        }

241
        $vm->setVariables(compact('intervenant', 'typeVolumeHoraire', 'services', 'servicesReferentiel', 'cloture', 'role'));
242
243
244
245
246
247

        return $vm;
    }



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
    public function cloturerAction()
    {
        $this->em()->getFilters()->enable('historique')->init([
            Validation::class,
        ]);

        $intervenant = $this->getEvent()->getParam('intervenant');
        /* @var $intervenant Intervenant */

        $validation = $this->getServiceValidation()->getValidationClotureServices($intervenant);

        if ($this->getRequest()->isPost()) {
            if ($validation->getId()) {
                if (!$this->isAllowed($intervenant, Privileges::CLOTURE_REOUVERTURE)) {
                    throw new \Exception("Vous n'avez pas le droit de déclôturer la saisie de services réalisés d'un intervenant");
                }
                try {
                    $this->getServiceValidation()->delete($validation);
266
                    $this->getServiceWorkflow()->calculerTableauxBord('cloture_realise', $intervenant);
267
268
                    $this->flashMessenger()->addSuccessMessage("La saisie du service réalisé a bien été réouverte", 'success');
                } catch (\Exception $e) {
269
                    $this->flashMessenger()->addErrorMessage($this->translate($e));
270
271
272
273
274
275
276
                }
            } else {
                if (!$this->isAllowed($intervenant, Privileges::CLOTURE_CLOTURE)) {
                    throw new \Exception("Vous n'avez pas le droit de clôturer la saisie de services réalisés d'un intervenant");
                }
                try {
                    $this->getServiceValidation()->save($validation);
277
                    $this->getServiceWorkflow()->calculerTableauxBord('cloture_realise', $intervenant);
278
279
                    $this->flashMessenger()->addSuccessMessage("La saisie du service réalisé a bien été clôturée", 'success');
                } catch (\Exception $e) {
280
                    $this->flashMessenger()->addErrorMessage($this->translate($e));
281
282
283
284
285
286
287
288
289
                }
            }
        }

        return new MessengerViewModel;
    }



lecluse's avatar
#2574    
lecluse committed
290
291
292
293
294
295
296
297
298
299
300
301
    public function ficheAction()
    {
        $role        = $this->getServiceContext()->getSelectedIdentityRole();
        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');

        return compact('intervenant', 'role');
    }



    public function saisirAction()
    {
302
        $intervenant  = $this->getEvent()->getParam('intervenant');
303
304
305
306
307
308
309
310
311
        $title        = "Saisie d'un intervenant";
        $form         = $this->getFormIntervenantEdition();
        $errors       = [];
        $actionDetail = $this->params()->fromRoute('action-detail');
        if ($intervenant) {
            $definiParDefaut = $this->getServiceIntervenant()->estDefiniParDefaut($intervenant);
        } else {
            $definiParDefaut = false;
        }
lecluse's avatar
#2574    
lecluse committed
312

Laurent Lécluse's avatar
Laurent Lécluse committed
313
314
        $isNew = !$intervenant;
        if (!$intervenant) {
lecluse's avatar
#2574    
lecluse committed
315
316
317
            $intervenant = $this->getServiceIntervenant()->newEntity();
        }

318
319
320
321
322
323
        if ($actionDetail == 'dupliquer') {
            $intervenant = $intervenant->dupliquer();
            $intervenant->setSource($this->getServiceSource()->getOse());
            $intervenant->setStatut($this->getServiceStatutIntervenant()->getAutres());
        }

Laurent Lécluse's avatar
Laurent Lécluse committed
324
325
326
327
        $canEdit = $this->isAllowed($intervenant, Privileges::INTERVENANT_EDITION);
        $form->setReadOnly(!$canEdit);
        $form->bind($intervenant);

328
329
        $ancienStatut = $intervenant->getStatut();

lecluse's avatar
#2574    
lecluse committed
330
331
        $request = $this->getRequest();
        if ($request->isPost()) {
Laurent Lécluse's avatar
Laurent Lécluse committed
332
333
334
335
336
            $oriData  = $form->getHydrator()->extract($intervenant);
            $postData = $request->getPost()->toArray();
            $data     = array_merge($oriData, $postData);
            $form->setData($data);
            if ((!$form->isReadOnly()) && $form->isValid()) {
lecluse's avatar
#2574    
lecluse committed
337
                try {
338
                    if ($form->get('intervenant-edition-login')->getValue() && $form->get('intervenant-edition-password')->getValue()) {
339
340
341
                        $nom           = $intervenant->getNomUsuel();
                        $prenom        = $intervenant->getPrenom();
                        $dateNaissance = $intervenant->getDateNaissance();
342
343
                        $login         = $form->get('intervenant-edition-login')->getValue();
                        $password      = $form->get('intervenant-edition-password')->getValue();
344
                        $utilisateur   = $this->getServiceUtilisateur()->creerUtilisateur($nom, $prenom, $dateNaissance, $login, $password);
345
                        $utilisateur->setCode($intervenant->getUtilisateurCode() ?: $intervenant->getCode());
346
                        $this->getServiceUtilisateur()->save($utilisateur);
347
348
349
350
                        if ($utilisateur->getCode() != $intervenant->getUtilisateurCode()) {
                            $intervenant->setUtilisateurCode($utilisateur->getCode());
                            $intervenant->setSyncUtilisateurCode(false);
                        }
351
                    }
lecluse's avatar
#2574    
lecluse committed
352
                    $this->getServiceIntervenant()->save($intervenant);
353
354
355
356
357
358
359
                    if ($intervenant->getStatut() != $ancienStatut) {
                        $dossier = $this->getServiceDossier()->getByIntervenant($intervenant);
                        if ($dossier->getId()) { // Il y a un dossier
                            $dossier->setStatut($intervenant->getStatut());
                            $this->getServiceDossier()->save($dossier); // On sauvegarde le dossier
                        }
                    }
Laurent Lécluse's avatar
Laurent Lécluse committed
360
                    $this->getServiceWorkflow()->calculerTableauxBord([], $intervenant);
lecluse's avatar
#2574    
lecluse committed
361
                    $form->get('id')->setValue($intervenant->getId()); // transmet le nouvel ID
Laurent Lécluse's avatar
Laurent Lécluse committed
362
363
364
365
366
367
368
369
                    if ($isNew) {
                        $etape = $this->getServiceWorkflow()->getEtapeCourante($intervenant);
                        if ($etape) {
                            return $this->redirect()->toUrl($etape->getUrl());
                        }
                    }

                    return $this->redirect()->toRoute('intervenant/voir', ['intervenant' => $intervenant->getId()], ['query' => ['tab' => 'edition']]);
lecluse's avatar
#2574    
lecluse committed
370
                } catch (\Exception $e) {
371
                    $errors[] = $this->translate($e);
lecluse's avatar
#2574    
lecluse committed
372
373
374
375
                }
            }
        }

376
377
        $vm = new ViewModel();
        $vm->setTemplate('application/intervenant/saisir');
378
        $vm->setVariables(compact('intervenant', 'form', 'errors', 'title', 'definiParDefaut', 'actionDetail'));
379
380
381
382
383
384

        return $vm;
    }



385
386
387
388
    public function synchronisationAction()
    {
        $intervenant = $this->getEvent()->getParam('intervenant');

389
390
391
392
393
394
395
        try {
            $isImportable = $this->getServiceIntervenant()->isImportable($intervenant);
        } catch (\Exception $e) {
            $this->flashMessenger()->addErrorMessage($this->translate($e));
            $isImportable = false;
        }
        $data = [];
396
397

        if ($isImportable) {
398
399
400
401
            $query = new Query('INTERVENANT');
            $query->setNotNull([]); // Aucune colonne ne doit être non nulle !!
            $query->setLimit(101);
            $query->setColValues(['ANNEE_ID' => $intervenant->getAnnee()->getId(), 'CODE' => $intervenant->getCode()]);
402
            $data = $this->getServiceDifferentiel()->make($query, $query::SQL_FULL, false)->fetchAll();
403
404
405
406
407
408
409
        }

        return compact('intervenant', 'isImportable', 'data');
    }



410
411
412
413
    public function synchroniserAction()
    {
        $intervenant = $this->getEvent()->getParam('intervenant');
        $this->getProcessusImport()->execMaj('INTERVENANT', 'CODE', $intervenant->getCode());
414
        $this->getServiceWorkflow()->calculerTableauxBord([], $intervenant);
415

416
        return $this->redirect()->toRoute('intervenant/voir', ['intervenant' => $intervenant->getId()], ['query' => ['tab' => 'synchronisation']]);
lecluse's avatar
#2574    
lecluse committed
417
418
419
420
    }



lecluse's avatar
lecluse committed
421
422
    public function voirHeuresCompAction()
    {
lecluse's avatar
lecluse committed
423
        $intervenant = $this->getEvent()->getParam('intervenant');
424
        /* @var $intervenant \Application\Entity\Db\Intervenant */
425

Laurent Lécluse's avatar
#14367    
Laurent Lécluse committed
426
        if (!$intervenant) {
427
428
429
            throw new \LogicException('Intervenant non précisé ou inexistant');
        }

lecluse's avatar
lecluse committed
430
        $form = $this->getFormIntervenantHeuresComp();
lecluse's avatar
lecluse committed
431

lecluse's avatar
lecluse committed
432
433
        $typeVolumeHoraire = $this->context()->typeVolumeHoraireFromQuery('type-volume-horaire', $form->get('type-volume-horaire')->getValue());
        /* @var $typeVolumeHoraire \Application\Entity\Db\TypeVolumeHoraire */
lecluse's avatar
lecluse committed
434
        if (!isset($typeVolumeHoraire)) {
lecluse's avatar
lecluse committed
435
436
437
438
439
            throw new LogicException('Type de volume horaire erroné');
        }

        $etatVolumeHoraire = $this->context()->etatVolumeHoraireFromQuery('etat-volume-horaire', $form->get('etat-volume-horaire')->getValue());
        /* @var $etatVolumeHoraire \Application\Entity\Db\EtatVolumeHoraire */
lecluse's avatar
lecluse committed
440
        if (!isset($etatVolumeHoraire)) {
lecluse's avatar
lecluse committed
441
442
443
444
445
446
447
448
            throw new LogicException('Etat de volume horaire erroné');
        }

        $form->setData([
            'type-volume-horaire' => $typeVolumeHoraire->getId(),
            'etat-volume-horaire' => $etatVolumeHoraire->getId(),
        ]);

449
450
451
452
453
        $data = $this->getServiceFormuleResultat()->getData(
            $intervenant,
            $typeVolumeHoraire,
            $etatVolumeHoraire
        );
454

455
        return compact('form', 'intervenant', 'data');
456
457
    }

lecluse's avatar
lecluse committed
458
459


lecluse's avatar
lecluse committed
460
    public function formuleTotauxHetdAction()
461
    {
lecluse's avatar
lecluse committed
462
463
        $intervenant = $this->getEvent()->getParam('intervenant');
        /* @var $intervenant Intervenant */
464
465
        $typeVolumeHoraire = $this->getEvent()->getParam('typeVolumeHoraire');
        $etatVolumeHoraire = $this->getEvent()->getParam('etatVolumeHoraire');
lecluse's avatar
lecluse committed
466
467
        $formuleResultat   = $intervenant->getUniqueFormuleResultat($typeVolumeHoraire, $etatVolumeHoraire);

lecluse's avatar
lecluse committed
468
        return compact('formuleResultat');
lecluse's avatar
lecluse committed
469
470
    }

lecluse's avatar
lecluse committed
471
472


473
474
475
476
477
    public function supprimerAction()
    {
        $intervenant = $this->getEvent()->getParam('intervenant');
        /* @var $intervenant \Application\Entity\Db\Intervenant */

478
479
        if (!$intervenant) {
            throw new \Exception('Intervenant introuvable');
lecluse's avatar
#7607    
lecluse committed
480
        }
481
        $intervenantCode = $intervenant->getCode();
lecluse's avatar
#7607    
lecluse committed
482

483
        $intSuppr = $this->getProcessusIntervenant()->suppression($intervenant);
lecluse's avatar
#7607    
lecluse committed
484

485
        if ($ids = $this->params()->fromPost('ids')) {
lecluse's avatar
#7607    
lecluse committed
486
            try {
487
488
489
490
491
492
493
494
495
                if (!empty($ids)) {
                    $res = $intSuppr->delete($ids);
                    $this->getServiceWorkflow()->calculerTableauxBord([], $intervenant);
                    if ($res) {
                        $this->flashMessenger()->addSuccessMessage('Données de l\'intervenant supprimées');
                    } else {
                        $this->flashMessenger()->addErrorMessage('Une ou plusieurs erreurs ont été rencontrées');
                    }
                }
Laurent Lécluse's avatar
#14367    
Laurent Lécluse committed
496
            } catch (\Exception $e) {
497
                $this->flashMessenger()->addErrorMessage($this->translate($e));
lecluse's avatar
#7607    
lecluse committed
498
499
            }
        }
500
        $tree = $intSuppr->getTree();
501
502
        if (!$tree) {
            $intervenant = $this->getServiceIntervenant()->getByCode($intervenantCode);
503
            if ($intervenant && $intervenant->estHistorise()) $intervenant = null;
504
        }
505

506
        return compact('intervenant', 'tree');
507
508
    }

509
510


511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
    public function historiserAction()
    {
        /* @var $intervenant \Application\Entity\Db\Intervenant */
        $intervenant = $this->getEvent()->getParam('intervenant');

        if (!$intervenant) {
            throw new \Exception('Intervenant introuvable');
        }
        $this->getServiceIntervenant()->delete($intervenant);

        return $this->redirect()->toRoute('intervenant/voir', ['intervenant' => 'code:' . $intervenant->getCode()]);
    }



    public function restaurerAction()
    {
        /* @var $intervenant \Application\Entity\Db\Intervenant */
        $intervenant = $this->getEvent()->getParam('intervenant');

        if (!$intervenant) {
            throw new \Exception('Intervenant introuvable');
        }
        $intervenant->dehistoriser();
        $this->getServiceIntervenant()->save($intervenant);
536
        $this->getServiceWorkflow()->calculerTableauxBord([], $intervenant);
537
538
539
540
541
542

        return $this->redirect()->toRoute('intervenant/voir', ['intervenant' => $intervenant->getId()]);
    }



543
544
    public function validationVolumeHoraireTypeIntervenantAction()
    {
545
        $serviceRVS = $this->getServiceRegleStructureValidation();
546
        $listeRsv   = $serviceRVS->getList();
547

548
        return compact('listeRsv');
549
550
    }

551
552


553
554
555
    public function validationVolumeHoraireTypeIntervenantSaisieAction()
    {
        $regleStructureValidation = $this->getEvent()->getParam('regleStructureValidation');
556
        $form                     = $this->getFormRegleStructureValidationSaisie();
557
        $title                    = 'Édition de la régle de validation';
558
559
560
561
562
        $form->bindRequestSave($regleStructureValidation, $this->getRequest(), function (RegleStructureValidation $rsv) {
            try {
                $this->getServiceRegleStructureValidation()->save($rsv);
                $this->flashMessenger()->addSuccessMessage('Enregistrement effectué');
            } catch (\Exception $e) {
563
564
                $message = $this->translate($e);

565
                if (false !== strpos($message, 'ORA - 00001')) {
566
                    $this->flashMessenger()->addErrorMessage("Règle non enregistrée car elle existe déjà dans OSE");
567
                } else {
568
569
                    $this->flashMessenger()->addErrorMessage($this->translate($e));
                }
570
571
572
573
            }
        });

        return compact('form', 'title');
574
575
    }

576
577


578
    /**
579
     *
580
581
     * @return array
     */
lecluse's avatar
lecluse committed
582
    protected function getIntervenantsRecents()
583
    {
lecluse's avatar
lecluse committed
584
        $container = $this->getSessionContainer();
Laurent Lécluse's avatar
Laurent Lécluse committed
585
        //$container->recents = [];
lecluse's avatar
lecluse committed
586
        if (isset($container->recents)) {
587
588
589
590
591
592
593
594
595
596
597
598
599
600
            $recents = $container->recents;
            foreach ($recents as $i => $recent) {
                if (isset($recent['code'])) {
                    $intervenant = $this->getServiceIntervenant()->getByCode($recent['code']);
                } else {
                    $intervenant = null;
                }
                if (!$intervenant) {
                    unset($recents[$i]);
                    unset($container->recents[$i]);
                }
            }

            return $recents;
lecluse's avatar
lecluse committed
601
602
        } else {
            return [];
603
604
        }
    }
605

lecluse's avatar
lecluse committed
606
607


608
    /**
609
     *
610
     * @param \Application\Entity\Db\Intervenant $intervenant
lecluse's avatar
lecluse committed
611
     *
612
613
     * @return \Application\Controller\IntervenantController
     */
lecluse's avatar
lecluse committed
614
    protected function addIntervenantRecent(Intervenant $intervenant)
615
    {
lecluse's avatar
lecluse committed
616
617
618
        $container = $this->getSessionContainer();
        if (!isset($container->recents)) {
            $container->recents = [];
619
        }
620

621
        if (count($container->recents) > 4 && !isset($container->recents[$intervenant->getCode()])) {
lecluse's avatar
lecluse committed
622
623
624
625
626
627
628
629
630
631
632
633
634
635
            $prem = (int)date('U');
            foreach ($container->recents as $i) {
                $horo = $i['__horo_ajout__'];
                if ($horo) {
                    if ($prem >= $horo) $prem = $horo;
                }
            }
            foreach ($container->recents as $index => $i) {
                $horo = $i['__horo_ajout__'];
                if ($horo == $prem) {
                    unset($container->recents[$index]);
                }
            }
        }
lecluse's avatar
lecluse committed
636

Laurent Lécluse's avatar
Laurent Lécluse committed
637
        if (!isset($container->recents[$intervenant->getCode()])) {
638
639
640
641
642
643
644
            $container->recents[$intervenant->getCode()] = [
                'civilite'         => $intervenant->getCivilite() ? $intervenant->getCivilite()->getLibelleLong() : null,
                'nom'              => $intervenant->getNomUsuel(),
                'prenom'           => $intervenant->getPrenom(),
                'date-naissance'   => $intervenant->getDateNaissance(),
                'structure'        => (string)$intervenant->getStructure(),
                'statut'           => (string)$intervenant->getStatut(),
645
646
                'code'             => $intervenant->getCode(),
                'numero-personnel' => $intervenant->getCode(),
647
648
649
                '__horo_ajout__'   => (int)date('U'),
            ];
        } else {
Laurent Lécluse's avatar
Laurent Lécluse committed
650
            if (!isset($container->recents[$intervenant->getCode()]['statut'])) {
651
652
653
654
655
656
657
658
                $container->recents[$intervenant->getCode()]['statut'] = [$container->recents[$intervenant->getCode()]['statut']];
            }
            if (is_array($container->recents[$intervenant->getCode()]['statut'])) {
                $container->recents[$intervenant->getCode()]['statut'][] = (string)$intervenant->getStatut();
            } else {
                $container->recents[$intervenant->getCode()]['statut'] = (string)$intervenant->getStatut();
            }
        }
lecluse's avatar
lecluse committed
659
660
661
662
663
664

        uasort($container->recents, function ($a, $b) {
            return $a['nom'] . ' ' . $a['prenom'] > $b['nom'] . ' ' . $b['prenom'];
        });

        return $this;
lecluse's avatar
lecluse committed
665
    }
666
}