ServiceService.php 52.1 KB
Newer Older
1
2
3
4
<?php

namespace Application\Service;

5
6
7
use Application\Entity\Db\ElementPedagogique;
use Application\Entity\Db\Etablissement;
use Application\Entity\Db\Etape;
8
use Application\Entity\Db\EtatVolumeHoraire;
9
use Application\Entity\Db\Intervenant;
lecluse's avatar
lecluse committed
10
use Application\Entity\Db\Service;
11
use Application\Entity\Db\Structure;
12
use Application\Entity\Db\TypeIntervention;
13
use Application\Entity\Db\TypeIntervenant;
14
use Application\Entity\Db\TypeVolumeHoraire;
15
use Application\Entity\NiveauEtape;
16
17
use Application\Entity\Service\Recherche;
use Application\Form\Service\RechercheHydrator;
18
use Application\Hydrator\Service\Traits\RechercheHydratorAwareTrait;
19
use Application\Provider\Privilege\Privileges;
20
21
use Application\Service\Traits\ElementPedagogiqueServiceAwareTrait;
use Application\Service\Traits\EtapeServiceAwareTrait;
22
use Application\Service\Traits\IntervenantServiceAwareTrait;
23
24
use Application\Service\Traits\LocalContextServiceAwareTrait;
use Application\Service\Traits\PeriodeServiceAwareTrait;
25
use Application\Service\Traits\StatutIntervenantServiceAwareTrait;
26
use Application\Service\Traits\StructureServiceAwareTrait;
27
use Application\Service\Traits\TypeIntervenantServiceAwareTrait;
28
use Application\Service\Traits\TypeInterventionServiceAwareTrait;
29
use Application\Service\Traits\TypeVolumeHoraireServiceAwareTrait;
30
31
use Application\Service\Traits\ValidationServiceAwareTrait;
use Application\Service\Traits\VolumeHoraireServiceAwareTrait;
32
use Application\Service\Traits\EtatVolumeHoraireServiceAwareTrait;
lecluse's avatar
#3357    
lecluse committed
33
34
use Doctrine\ORM\QueryBuilder;
use Zend\Session\Container as SessionContainer;
35

36
37
38
39
/**
 * Description of Service
 *
 * @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
lecluse's avatar
lecluse committed
40
 *
41
42
 * @method Service get($id)
 * @method Service[] getList(\Doctrine\ORM\QueryBuilder $qb = null, $alias = null)
lecluse's avatar
lecluse committed
43
 *
44
 */
45
class ServiceService extends AbstractEntityService
46
{
47
48
    use ElementPedagogiqueServiceAwareTrait;
    use EtapeServiceAwareTrait;
49
    use IntervenantServiceAwareTrait;
50
    use StructureServiceAwareTrait;
51
    use TypeInterventionServiceAwareTrait;
52
53
    use EtatVolumeHoraireServiceAwareTrait;
    use TypeVolumeHoraireServiceAwareTrait;
54
    use VolumeHoraireServiceAwareTrait;
55
    use TypeIntervenantServiceAwareTrait;
56
57
    use PeriodeServiceAwareTrait;
    use LocalContextServiceAwareTrait;
58
    use RechercheHydratorAwareTrait;
59
    use ValidationServiceAwareTrait;
60
    use StatutIntervenantServiceAwareTrait;
61

62
63
64
65
66
67
68
69
70
71
72
73
    /**
     *
     * @var SessionContainer
     */
    private $rechercheSessionContainer;

    /**
     *
     * @var Recherche
     */
    private $recherche;

lecluse's avatar
#3357    
lecluse committed
74
75


76
    /**
77
     * retourne la classe des entités
78
     *
79
80
     * @return string
     * @throws RuntimeException
81
     */
82
    public function getEntityClass()
83
    {
84
        return Service::class;
85
86
    }

lecluse's avatar
#3357    
lecluse committed
87
88


89
    /**
90
     * Retourne l'alias d'entité courante
91
     *
92
     * @return string
93
     */
94
95
    public function getAlias()
    {
96
        return 's';
97
98
    }

lecluse's avatar
#3357    
lecluse committed
99
100


101
102
103
    /**
     * Retourne une nouvelle entité de la classe donnée
     *
104
     * @return Service
105
106
107
108
     */
    public function newEntity()
    {
        $entity = parent::newEntity();
109
110

        $role = $this->getServiceContext()->getSelectedIdentityRole();
111
112
        if ($intervenant = $role->getIntervenant()) {
            $entity->setIntervenant($intervenant);
113
        }
lecluse's avatar
#3357    
lecluse committed
114

115
116
117
        return $entity;
    }

118

lecluse's avatar
#3357    
lecluse committed
119

120
121
122
123
124
125
126
    /**
     *
     * @return SessionContainer
     */
    protected function getRechercheSessionContainer()
    {
        if (null === $this->rechercheSessionContainer) {
lecluse's avatar
#3357    
lecluse committed
127
            $this->rechercheSessionContainer = new SessionContainer(get_class($this) . '_Recherche');
128
        }
lecluse's avatar
#3357    
lecluse committed
129

130
131
132
        return $this->rechercheSessionContainer;
    }

lecluse's avatar
#3357    
lecluse committed
133
134


135
136
137
138
139
140
141
    /**
     * Les paramètres de recherche sont également remplis à l'aide du contexte local
     *
     * @return Recherche
     */
    public function loadRecherche()
    {
lecluse's avatar
#3357    
lecluse committed
142
        if (null === $this->recherche) {
143
            $this->recherche = new Recherche;
lecluse's avatar
#3357    
lecluse committed
144
145
            $session         = $this->getRechercheSessionContainer();
            if ($session->offsetExists('data')) {
146
                $this->getHydratorServiceRecherche()->hydrate($session->data, $this->recherche);
147
148
149
            }
        }

lecluse's avatar
#3357    
lecluse committed
150
        if (!$this->recherche->getTypeVolumeHoraire()) {
151
            $this->recherche->setTypeVolumeHoraire($this->getServiceTypeVolumeHoraire()->getPrevu());
152
153
        }

lecluse's avatar
#3357    
lecluse committed
154
        if (!$this->recherche->getEtatVolumeHoraire()) {
155
            $this->recherche->setEtatVolumeHoraire($this->getServiceEtatVolumeHoraire()->getSaisi());
156
157
        }

158
        $localContext = $this->getServiceLocalContext();
lecluse's avatar
lecluse committed
159

lecluse's avatar
#3357    
lecluse committed
160
161
162
163
164
165
        $this->recherche->setIntervenant($localContext->getIntervenant());
        $this->recherche->setStructureEns($localContext->getStructure());
        $this->recherche->setNiveauEtape($localContext->getNiveau());
        $this->recherche->setEtape($localContext->getEtape());
        $this->recherche->setElementPedagogique($localContext->getElementPedagogique());

166
167
168
        return $this->recherche;
    }

lecluse's avatar
#3357    
lecluse committed
169
170


171
172
173
174
    /**
     * Les paramètres de recherche sont également sauvegardés dans le contexte local
     *
     * @param Recherche $recherche
lecluse's avatar
#3357    
lecluse committed
175
     *
176
177
     * @return self
     */
lecluse's avatar
#3357    
lecluse committed
178
    public function saveRecherche(Recherche $recherche)
179
    {
lecluse's avatar
#3357    
lecluse committed
180
        if ($recherche !== $this->recherche) {
181
182
            $this->recherche = $recherche;
        }
183
        $data          = $this->getHydratorServiceRecherche()->extract($recherche);
lecluse's avatar
#3357    
lecluse committed
184
        $session       = $this->getRechercheSessionContainer();
185
186
        $session->data = $data;

187
        $localContext = $this->getServiceLocalContext();
lecluse's avatar
lecluse committed
188

lecluse's avatar
#3357    
lecluse committed
189
190
191
192
193
194
        $localContext->setIntervenant($recherche->getIntervenant());
        $localContext->setStructure($recherche->getStructureEns());
        $localContext->setNiveau($recherche->getNiveauEtape());
        $localContext->setEtape($recherche->getEtape());
        $localContext->setElementPedagogique($recherche->getElementPedagogique());

195
196
197
198
        return $this;
    }


lecluse's avatar
#3357    
lecluse committed
199
200
201
202

    /**
     * Retourne un service unique selon ses critères précis
     *
203
204
205
     * @param Intervenant              $intervenant
     * @param ElementPedagogique $elementPedagogique
     * @param Etablissement      $etablissement
lecluse's avatar
#3357    
lecluse committed
206
     *
207
     * @return null|Service
lecluse's avatar
#3357    
lecluse committed
208
209
     */
    public function getBy(
210
        Intervenant $intervenant,
lecluse's avatar
#3357    
lecluse committed
211
        $elementPedagogique,
212
        Etablissement $etablissement
lecluse's avatar
#3357    
lecluse committed
213
214
    )
    {
lecluse's avatar
#3357    
lecluse committed
215
        $result = $this->getRepo()->findBy([
lecluse's avatar
#3357    
lecluse committed
216
217
218
219
            'intervenant'        => $intervenant,
            'elementPedagogique' => $elementPedagogique,
            'etablissement'      => $etablissement,
        ]);
lecluse's avatar
#3357    
lecluse committed
220

lecluse's avatar
#2575    
lecluse committed
221
222
223
        if (count($result) > 1) {
            foreach ($result as $sr) {
                /* @var $sr \Application\Entity\Db\Service */
lecluse's avatar
#3357    
lecluse committed
224
225
                if ($sr->estNonHistorise()) return $sr;
            }
lecluse's avatar
#2575    
lecluse committed
226

227
            return $result[0]; // sinon retourne le premier trouvé...
lecluse's avatar
#2575    
lecluse committed
228
        } elseif (isset($result[0])) {
lecluse's avatar
#3357    
lecluse committed
229
            return $result[0];
lecluse's avatar
#2575    
lecluse committed
230
        } else {
lecluse's avatar
#3357    
lecluse committed
231
232
            return null;
        }
lecluse's avatar
#3357    
lecluse committed
233
234
235
236
    }



237
    /**
238
     * Sauvegarde une entité
239
     *
240
     * @param Service $entity
lecluse's avatar
#3357    
lecluse committed
241
     *
lecluse's avatar
#2575    
lecluse committed
242
     * @throws Exception
243
     * @return Service
244
     */
245
    public function save($entity)
246
    {
247
248
        $tvhs = [];

249
        $this->getEntityManager()->getConnection()->beginTransaction();
lecluse's avatar
#3357    
lecluse committed
250
        try {
251
252
            $role = $this->getServiceContext()->getSelectedIdentityRole();

lecluse's avatar
#3357    
lecluse committed
253
254
            if (!$entity->getEtablissement()) {
                $entity->setEtablissement($this->getServiceContext()->getEtablissement());
255
256
257
                if (!$entity->getEtablissement()){
                    throw new \LogicException('L\'établissement n\'est pas renseigné dans les paramétrages généraux de OSE');
                }
258
            }
259
260
            if (!$entity->getIntervenant() && $intervenant = $role->getIntervenant()) {
                $entity->setIntervenant($intervenant);
261
            }
262
            if (!$this->getAuthorize()->isAllowed($entity, Privileges::ENSEIGNEMENT_EDITION)) {
263
264
                throw new \BjyAuthorize\Exception\UnAuthorizedException('Saisie interdite');
            }
lecluse's avatar
#1429    
lecluse committed
265
266

            $serviceAllreadyExists = null;
lecluse's avatar
#3357    
lecluse committed
267
            if (!$entity->getId()) { // uniquement pour les nouveaux services!!
lecluse's avatar
lecluse committed
268
269
270
271
272
                $serviceAllreadyExists = $this->getBy(
                    $entity->getIntervenant(),
                    $entity->getElementPedagogique(),
                    $entity->getEtablissement()
                );
lecluse's avatar
#1429    
lecluse committed
273
            }
lecluse's avatar
#3357    
lecluse committed
274
            if ($serviceAllreadyExists) {
lecluse's avatar
#1429    
lecluse committed
275
                $result = $serviceAllreadyExists;
lecluse's avatar
#3357    
lecluse committed
276
            } else {
277
                if ($entity->hasChanged()) {
278
279
                    $result = parent::save($entity);
                    $entity->setChanged(false);
280
                } else {
281
282
                    $result = $entity;
                }
lecluse's avatar
#1429    
lecluse committed
283
284
            }

285
            /* Sauvegarde automatique des volumes horaires associés */
286
            $serviceVolumeHoraire = $this->getServiceVolumeHoraire();
lecluse's avatar
#3357    
lecluse committed
287
            foreach ($entity->getVolumeHoraire() as $volumeHoraire) {
288
                /* @var $volumeHoraire \Application\Entity\Db\Volumehoraire */
289
                $tvhs[] = $volumeHoraire->getTypeVolumeHoraire();
lecluse's avatar
#1429    
lecluse committed
290
                if ($result !== $entity) $volumeHoraire->setService($result);
lecluse's avatar
#3357    
lecluse committed
291
                if ($volumeHoraire->getRemove()) {
292
                    $serviceVolumeHoraire->delete($volumeHoraire);
lecluse's avatar
#3357    
lecluse committed
293
                } else {
lecluse's avatar
#2575    
lecluse committed
294
                    $serviceVolumeHoraire->save($volumeHoraire, false); // pas de contrôle de plafond sur le VH ! ! !
295
                }
296
            }
297
            $this->getEntityManager()->getConnection()->commit();
lecluse's avatar
#3357    
lecluse committed
298
        } catch (Exception $e) {
299
300
            $this->getEntityManager()->getConnection()->rollBack();
            throw $e;
301
        }
302

303
        return $result;
304
305
    }

lecluse's avatar
#3357    
lecluse committed
306
307


lecluse's avatar
lecluse committed
308
309
310
311
    /**
     * Supprime (historise par défaut) le service spécifié.
     *
     * @param Service $entity Entité à détruire
312
     * @param bool    $softDelete
lecluse's avatar
lecluse committed
313
314
315
316
317
     *
     * @return self
     */
    public function delete($entity, $softDelete = true)
    {
lecluse's avatar
#7607    
lecluse committed
318
319
320
321
322
323
324
        if ($softDelete) {
            $vhListe = $entity->getVolumeHoraireListe();
            foreach ($vhListe->getPeriodes() as $periode) {
                $lc = $vhListe->getChild()->setPeriode($periode);
                foreach ($lc->getTypesIntervention() as $typeIntervention) {
                    $lc->getChild()->setTypeIntervention($typeIntervention)->setHeures(0);
                }
lecluse's avatar
lecluse committed
325
326
327
328
329
330
331
            }
        }
        //$vhListe->setHeures(0); // aucune heure (SI une heure est validée alors un nouveau VHR sera créé!!

        $vhl = $entity->getVolumeHoraire();

        $delete = true;
332
        /** @var VolumeHoraireService $volumeHoraire */
lecluse's avatar
lecluse committed
333
        foreach ($vhl as $volumeHoraire) {
lecluse's avatar
#7607    
lecluse committed
334
            if ($volumeHoraire->getRemove() || !$volumeHoraire->estNonHistorise()) {
lecluse's avatar
lecluse committed
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
                $this->getServiceVolumeHoraire()->delete($volumeHoraire, $softDelete);
                $vhl->removeElement($volumeHoraire);
            } else {
                $delete = false;
                $this->getServiceVolumeHoraire()->save($volumeHoraire);
            }
        }

        if ($delete) {
            parent::delete($entity, $softDelete);
        }

        return $this;
    }



352
    /**
353
     * Retourne la liste des services selon l'étape donnée
354
     *
355
     * @param Etape       $etape
356
     * @param QueryBuilder|null $queryBuilder
lecluse's avatar
#3357    
lecluse committed
357
     *
358
359
     * @return QueryBuilder
     */
360
    public function finderByEtape(Etape $etape, QueryBuilder $qb = null, $alias = null)
361
    {
362
        $serviceElement = $this->getServiceElementPedagogique();
363

lecluse's avatar
#3357    
lecluse committed
364
365
        list($qb, $alias) = $this->initQuery($qb, $alias);
        $this->leftJoin($serviceElement, $qb, 'elementPedagogique');
366
        $serviceElement->finderByEtape($etape, $qb);
lecluse's avatar
#3357    
lecluse committed
367

368
369
370
        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
371
372


lecluse's avatar
lecluse committed
373
374
375
    /**
     * Retourne la liste des services selon l'étape donnée
     *
376
     * @param Etape       $etape
lecluse's avatar
lecluse committed
377
     * @param QueryBuilder|null $queryBuilder
lecluse's avatar
#3357    
lecluse committed
378
     *
lecluse's avatar
lecluse committed
379
380
     * @return QueryBuilder
     */
381
    public function finderByNiveauEtape(NiveauEtape $niveauEtape, QueryBuilder $qb = null, $alias = null)
lecluse's avatar
lecluse committed
382
    {
lecluse's avatar
#3357    
lecluse committed
383
384
        list($qb, $alias) = $this->initQuery($qb, $alias);
        if ($niveauEtape && $niveauEtape->getId() !== '-') {
385
            $serviceElement = $this->getServiceElementPedagogique();
386
            $serviceEtape   = $this->getServiceEtape();
lecluse's avatar
#3357    
lecluse committed
387
388
389

            $this->leftJoin($serviceElement, $qb, 'elementPedagogique');
            $serviceElement->join($serviceEtape, $qb, 'etape');
lecluse's avatar
lecluse committed
390
391
            $serviceEtape->finderByNiveau($niveauEtape, $qb);
        }
lecluse's avatar
#3357    
lecluse committed
392

lecluse's avatar
lecluse committed
393
394
395
        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
396
397


lecluse's avatar
lecluse committed
398
399
    /**
     *
400
     * @param TypeVolumeHoraire $typeVolumeHoraire
401
402
     * @param QueryBuilder      $qb
     * @param string            $alias
lecluse's avatar
#3357    
lecluse committed
403
     *
lecluse's avatar
lecluse committed
404
405
     * @return QueryBuilder
     */
406
    public function finderByTypeVolumeHoraire(TypeVolumeHoraire $typeVolumeHoraire, QueryBuilder $qb = null, $alias = null)
lecluse's avatar
lecluse committed
407
    {
lecluse's avatar
#3357    
lecluse committed
408
409
        list($qb, $alias) = $this->initQuery($qb, $alias);
        if ($typeVolumeHoraire) {
410
            $serviceVolumeHoraire = $this->getServiceVolumeHoraire();
lecluse's avatar
lecluse committed
411

lecluse's avatar
#3357    
lecluse committed
412
413
            $this->join($serviceVolumeHoraire, $qb, 'volumeHoraire');
            $serviceVolumeHoraire->finderByTypeVolumeHoraire($typeVolumeHoraire, $qb);
lecluse's avatar
lecluse committed
414
        }
lecluse's avatar
#3357    
lecluse committed
415

lecluse's avatar
lecluse committed
416
417
418
        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
419
420


lecluse's avatar
lecluse committed
421
422
    /**
     *
423
     * @param EtatVolumeHoraire $etatVolumeHoraire
424
425
     * @param QueryBuilder      $qb
     * @param string            $alias
lecluse's avatar
#3357    
lecluse committed
426
     *
lecluse's avatar
lecluse committed
427
428
     * @return QueryBuilder
     */
429
    public function finderByEtatVolumeHoraire(EtatVolumeHoraire $etatVolumeHoraire, QueryBuilder $qb = null, $alias = null)
lecluse's avatar
lecluse committed
430
    {
lecluse's avatar
#3357    
lecluse committed
431
432
        list($qb, $alias) = $this->initQuery($qb, $alias);
        if ($etatVolumeHoraire) {
433
            $serviceVolumeHoraire = $this->getServiceVolumeHoraire();
lecluse's avatar
lecluse committed
434

lecluse's avatar
#3357    
lecluse committed
435
436
            $this->join($serviceVolumeHoraire, $qb, 'volumeHoraire');
            $serviceVolumeHoraire->finderByEtatVolumeHoraire($etatVolumeHoraire, $qb);
lecluse's avatar
lecluse committed
437
        }
lecluse's avatar
#3357    
lecluse committed
438

lecluse's avatar
lecluse committed
439
440
441
        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
442
443


444
445
    /**
     * Retourne le query builder permettant de rechercher les services prévisionnels
446
     * selon la composante spécifiée.
lecluse's avatar
#3357    
lecluse committed
447
     *
448
     * Càd les services prévisionnels satisfaisant au moins l'un des critères suivants :
449
450
     * - la structure d'enseignement (champ 'structure_ens') est la structure spécifiée;
     * - la structure d'affectation (champ 'structure_aff')  est la structure spécifiée;
451
     *
452
     * @param Structure         $structure
453
     * @param QueryBuilder|null $queryBuilder
lecluse's avatar
#3357    
lecluse committed
454
     *
455
456
     * @return QueryBuilder
     */
457
    public function finderByComposante(Structure $structure, QueryBuilder $qb = null, $alias = null)
458
    {
lecluse's avatar
#3357    
lecluse committed
459
        list($qb, $alias) = $this->initQuery($qb, $alias);
460

lecluse's avatar
#3357    
lecluse committed
461
462
463
        $serviceStructure          = $this->getServiceStructure();
        $serviceIntervenant        = $this->getServiceIntervenant();
        $serviceElementPedagogique = $this->getServiceElementPedagogique();
lecluse's avatar
lecluse committed
464
        $serviceStatutIntervenant  = $this->getServiceStatutIntervenant();
lecluse's avatar
#3357    
lecluse committed
465
        $iAlias                    = $serviceIntervenant->getAlias();
lecluse's avatar
lecluse committed
466
        $sAlias                    = $serviceStatutIntervenant->getAlias();
467

lecluse's avatar
#3357    
lecluse committed
468
        $this->join($serviceIntervenant, $qb, 'intervenant', false, $alias);
469
        $serviceIntervenant->join($serviceStatutIntervenant, $qb, 'statut', false);
lecluse's avatar
#3357    
lecluse committed
470
471
        $this->leftJoin($serviceElementPedagogique, $qb, 'elementPedagogique', false, $alias);
        $serviceElementPedagogique->leftJoin($serviceStructure, $qb, 'structure', false, null, 's_ens');
472

lecluse's avatar
lecluse committed
473
        $filter = "(($sAlias.typeIntervenant = :typeIntervenantPermanent AND $iAlias.structure = :composante) OR s_ens = :composante)";
474
        $qb->andWhere($filter)->setParameter('composante', $structure);
475
        $qb->setParameter('typeIntervenantPermanent', $this->getServiceTypeIntervenant()->getPermanent());
476

477
478
479
        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
480
481


482
    /**
483
     * Utile pour la recherche de services
484
     *
485
     * @param Structure         $structure
486
     * @param QueryBuilder|null $queryBuilder
lecluse's avatar
#3357    
lecluse committed
487
     *
488
489
     * @return QueryBuilder
     */
490
    public function finderByStructureAff(Structure $structure, QueryBuilder $qb = null, $alias = null)
491
    {
lecluse's avatar
#3357    
lecluse committed
492
        list($qb, $alias) = $this->initQuery($qb, $alias);
493
494
495

        $serviceIntervenant = $this->getServiceIntervenant();

lecluse's avatar
#3357    
lecluse committed
496
497
        $this->join($serviceIntervenant, $qb, 'intervenant', false, $alias);
        $serviceIntervenant->finderByStructure($structure, $qb);
lecluse's avatar
lecluse committed
498
        $serviceIntervenant->finderByType($this->getServiceTypeIntervenant()->getPermanent(), $qb);
lecluse's avatar
#3357    
lecluse committed
499

500
501
502
        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
503
504


505
506
507
    /**
     * Utile pour la recherche de services
     *
508
     * @param Structure         $structure
509
510
511
512
     * @param QueryBuilder|null $queryBuilder
     *
     * @return QueryBuilder
     */
513
    public function finderByStructureEns(Structure $structure, QueryBuilder $qb = null, $alias = null)
514
515
516
517
518
519
520
521
522
523
524
525
    {
        list($qb, $alias) = $this->initQuery($qb, $alias);

        $serviceElementPedagogique = $this->getServiceElementPedagogique();
        $this->join($serviceElementPedagogique, $qb, 'elementPedagogique', false, $alias);
        $serviceElementPedagogique->finderByStructure($structure, $qb);

        return $qb;
    }



526
    /**
527
     * Filtre la liste des services selon lecontexte courant
lecluse's avatar
#3357    
lecluse committed
528
     *
529
     * @param QueryBuilder|null $qb
lecluse's avatar
#3357    
lecluse committed
530
531
     * @param string|null       $alias
     *
532
     * @return QueryBuilder
533
     */
lecluse's avatar
#3357    
lecluse committed
534
    public function finderByContext(QueryBuilder $qb = null, $alias = null)
535
    {
536
        $role = $this->getServiceContext()->getSelectedIdentityRole();
537

lecluse's avatar
#3357    
lecluse committed
538
        list($qb, $alias) = $this->initQuery($qb, $alias);
539

lecluse's avatar
#3357    
lecluse committed
540
541
        $this->join($this->getServiceIntervenant(), $qb, 'intervenant', false, $alias);
        $this->getServiceIntervenant()->finderByAnnee($this->getServiceContext()->getAnnee(), $qb);
542

543
544
        if ($intervenant = $role->getIntervenant()) { // Si c'est un intervenant
            $this->finderByIntervenant($intervenant, $qb, $alias);
545
        }
546

547
        return $qb;
548
549
    }

lecluse's avatar
#3357    
lecluse committed
550

551

552
553
554
    /**
     * Retourne la liste des services selon l'étape donnée
     *
555
556
     * @param TypeIntervenant   $typeIntervenant
     * @param QueryBuilder|null $queryBuilder
557
558
559
     *
     * @return QueryBuilder
     */
560
    public function finderByTypeIntervenant(TypeIntervenant $typeIntervenant = null, QueryBuilder $qb = null, $alias = null)
561
562
563
564
565
566
567
568
569
570
    {
        list($qb, $alias) = $this->initQuery($qb, $alias);
        if ($typeIntervenant) {
            $this->join($this->getServiceIntervenant(), $qb, 'intervenant', false, $alias);
            $this->getServiceIntervenant()->finderByType($typeIntervenant, $qb);
        }

        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
571

572

lecluse's avatar
#3357    
lecluse committed
573
574
575
576
    /**
     * Prend les services d'un intervenant, année n-1, et reporte ces services (et les volumes horaires associés)
     * sur l'année n
     *
577
     * @param Intervenant $intervenant
lecluse's avatar
#3357    
lecluse committed
578
579
     *
     */
580
    public function setPrevusFromPrevus(Intervenant $intervenant)
lecluse's avatar
#3357    
lecluse committed
581
    {
582
        $old               = $this->getPrevusFromPrevusData($intervenant);
lecluse's avatar
#2575    
lecluse committed
583
        $typeVolumeHoraire = $this->getServiceTypeVolumeHoraire()->getPrevu();
lecluse's avatar
#3357    
lecluse committed
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606

        // Enregistrement des services trouvés dans la nouvelle année
        foreach ($old as $o) {
            $service = $o['service'];
            if (!$service) {
                $service = $this->newEntity();
                $service->setIntervenant($intervenant);
                $service->setElementPedagogique($o['element-pedagogique']);
                $service->setEtablissement($o['etablissement']);
            }
            foreach ($o['heures'] as $heures) {
                $volumeHoraire = $this->getServiceVolumeHoraire()->newEntity();
                //@formatter:off
                $volumeHoraire->setTypeVolumeHoraire( $heures['type-volume-horaire'] );
                $volumeHoraire->setPeriode          ( $heures['periode']             );
                $volumeHoraire->setTypeIntervention ( $heures['type-intervention']   );
                $volumeHoraire->setHeures           ( $heures['heures']              );
                //@formatter:on
                $volumeHoraire->setService($service);
                $service->addVolumeHoraire($volumeHoraire);
            }
            $service->setHistoDestructeur(null); // restauration du service si besoin!!
            $service->setHistoDestruction(null);
lecluse's avatar
lecluse committed
607
            $service->setTypeVolumeHoraire($typeVolumeHoraire);
lecluse's avatar
#2575    
lecluse committed
608
609
            $this->save($service, false);
        }
lecluse's avatar
#3357    
lecluse committed
610
611
612
613
    }



614
    public function getPrevusFromPrevusData(Intervenant $intervenant)
lecluse's avatar
#3357    
lecluse committed
615
616
    {
        $tvhPrevu  = $this->getServiceTypeVolumeHoraire()->getPrevu();
lecluse's avatar
#3357    
lecluse committed
617
        $evhValide = $this->getServiceEtatVolumeHoraire()->getValide();
lecluse's avatar
#3357    
lecluse committed
618
619
620

        $intervenantPrec = $this->getServiceIntervenant()->getBySourceCode(
            $intervenant->getSourceCode(),
621
622
            $this->getServiceContext()->getAnneePrecedente(),
            false
lecluse's avatar
#3357    
lecluse committed
623
624
625
626
627
628
        );

        $sVolumeHoraire = $this->getServiceVolumeHoraire();

        $qb = $this->select(['id', 'elementPedagogique', 'etablissement']);
        //@formatter:off
629
630
        $this->join(    EtablissementService::class,                     $qb, 'etablissement',           true);//['id', 'sourceCode']);
        $this->leftJoin(ElementPedagogiqueService::class,                $qb, 'elementPedagogique',      true);//['id', 'sourceCode']);
lecluse's avatar
#3357    
lecluse committed
631
        $this->leftJoin($sVolumeHoraire,                                $qb, 'volumeHoraire',           true);//['id', 'periode', 'typeIntervention', 'heures']);
632
633
        $sVolumeHoraire->leftJoin(PeriodeService::class,                 $qb, 'periode',                 true);//['id']);
        $sVolumeHoraire->leftJoin(TypeInterventionService::class,        $qb, 'typeIntervention',        true);//['id']);
lecluse's avatar
#3357    
lecluse committed
634
635
636
637
638
639
640
641
642
643
644
645
646
647
        //@formatter:on

        $this->finderByHistorique($qb);
        $this->finderByIntervenant($intervenantPrec, $qb);
        $sVolumeHoraire->finderByHistorique($qb);
        $sVolumeHoraire->finderByTypeVolumeHoraire($tvhPrevu, $qb);
        $sVolumeHoraire->finderByEtatVolumeHoraire($evhValide, $qb);

        $s = $this->getList($qb);

        $old = [];
        foreach ($s as $service) {

            /* @var $service \Application\Entity\Db\Service */
lecluse's avatar
lecluse committed
648
            $service->setTypeVolumeHoraire($tvhPrevu);
lecluse's avatar
#3357    
lecluse committed
649
650
651
652
653
            $oldElement = $service->getElementPedagogique();
            $newElement = $oldElement ? $this->getServiceElementPedagogique()->getBySourceCode(
                $oldElement->getSourceCode(),
                $this->getServiceContext()->getAnnee()
            ) : null;
lecluse's avatar
#3823    
lecluse committed
654

lecluse's avatar
#2575    
lecluse committed
655
            if ($newElement && !$newElement->estNonHistorise()) {
lecluse's avatar
#3823    
lecluse committed
656
657
658
                $newElement = null; // s'il n'est pas actif alors on ne reporte pas
            }

lecluse's avatar
#3357    
lecluse committed
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
            $newPeriode = $newElement ? $newElement->getPeriode() : null;

            if (empty($oldElement) || !empty($newElement)) {
                $o  = [
                    'element-pedagogique' => $newElement,
                    'etablissement'       => $service->getEtablissement(),
                    'heures'              => [],
                ];
                $id = $newElement ? $newElement->getSourceCode() : '';
                $id .= '-';
                $id .= $service->getEtablissement()->getSourceCode();

                $vhl = $service->getVolumeHoraireListe();

                $periodes          = $vhl->getPeriodes();
                $typesIntervention = $vhl->getTypesIntervention();
                foreach ($periodes as $periode) {
lecluse's avatar
#2575    
lecluse committed
676
                    /* @var $periode \Application\Entity\Db\Periode */
lecluse's avatar
#3357    
lecluse committed
677
678
                    if (empty($newPeriode) || $periode === $newPeriode) { // pas de mauvaise période!!!
                        foreach ($typesIntervention as $typeIntervention) {
679
                            /* @var $typeIntervention TypeInterventionService */
lecluse's avatar
#3357    
lecluse committed
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
                            $heures = $vhl->setPeriode($periode)->setTypeIntervention($typeIntervention)->getHeures();
                            if ($heures > 0) {
                                $o['heures'][] = [
                                    'periode'             => $periode,
                                    'type-intervention'   => $typeIntervention,
                                    'type-volume-horaire' => $tvhPrevu,
                                    'heures'              => $heures,
                                ];
                            }
                        }
                    }
                }

                if (!empty($o['heures'])) {
                    $newService = $this->getBy($intervenant, $newElement, $service->getEtablissement());
695
                    if ($newService) {
lecluse's avatar
lecluse committed
696
697
                        $newService->setTypeVolumeHoraire($tvhPrevu);
                    }
lecluse's avatar
#3357    
lecluse committed
698
                    if ($newService && $newService->estNonHistorise()) {
lecluse's avatar
lecluse committed
699
                        $newHeures = $newService->getVolumeHoraireListe()->getHeures();
lecluse's avatar
#3357    
lecluse committed
700
701
702
703
704
705
706
707
708
709
                    } else {
                        $newHeures = 0;
                    }
                    if ($newHeures == 0) { // on n'insère pas le service si des heures ont déjà été saisies!!
                        $o['service'] = $newService;
                        $old[$id]     = $o;
                    }
                }
            }
        }
lecluse's avatar
#2575    
lecluse committed
710

lecluse's avatar
#3357    
lecluse committed
711
712
713
714
715
        return $old;
    }



716
    public function setRealisesFromPrevus(Service $service)
717
718
    {
        $prevus = $service
lecluse's avatar
#3357    
lecluse committed
719
720
721
            ->getVolumeHoraireListe()->getChild()
            ->setTypeVolumeHoraire($this->getServiceTypeVolumeHoraire()->getPrevu())
            ->setEtatVolumeHoraire($this->getServiceEtatVolumeHoraire()->getValide());
722
723

        $realises = $service
lecluse's avatar
#3357    
lecluse committed
724
725
726
            ->getVolumeHoraireListe()->getChild()
            ->setTypeVolumeHoraire($this->getServiceTypeVolumeHoraire()->getRealise())
            ->setEtatVolumeHoraire($this->getServiceEtatVolumeHoraire()->getSaisi());
727

728
        $typesIntervention = $prevus->getTypesIntervention() + $realises->getTypesIntervention();
lecluse's avatar
#3357    
lecluse committed
729
        $periodes          = $prevus->getPeriodes() + $realises->getPeriodes();
730

lecluse's avatar
#3357    
lecluse committed
731
        foreach ($periodes as $periode) {
732
733
            $prevus->setPeriode($periode);
            $realises->setPeriode($periode);
lecluse's avatar
#3357    
lecluse committed
734
            foreach ($typesIntervention as $typeIntervention) {
735
736
                $prevus->setTypeIntervention($typeIntervention);
                $realises->setTypeIntervention($typeIntervention);
737

lecluse's avatar
#3357    
lecluse committed
738
                $realises->setHeures($prevus->getHeures());
739
            }
740
        }
741
        $this->save($service);
742
743
    }

lecluse's avatar
#3357    
lecluse committed
744
745


lecluse's avatar
lecluse committed
746
747
748
749
    /**
     * Retourne les données du TBL des services en fonction des critères de recherche transmis
     *
     * @param Recherche $recherche
lecluse's avatar
#3357    
lecluse committed
750
     *
lecluse's avatar
lecluse committed
751
752
     * @return array
     */
lecluse's avatar
#3357    
lecluse committed
753
    public function getTableauBord(Recherche $recherche, array $options = [])
lecluse's avatar
lecluse committed
754
    {
755
        // initialisation
lecluse's avatar
#3357    
lecluse committed
756
757
758
759
760
761
762
        $defaultOptions    = [
            'tri'              => 'intervenant',   // [intervenant, hetd]
            'columns'          => [],              // Liste des colonnes utiles, hors colonnes liées aux types d'intervention!!
            'ignored-columns'  => [],              // Liste des colonnes à ne pas récupérer, hors colonnes liées aux types d'intervention!!
            'isoler-non-payes' => true,            // boolean
            'regroupement'     => 'service',       // [service, intervenant]
            'composante'       => null,            // Composante qui en fait la demande
763
        ];
lecluse's avatar
#3357    
lecluse committed
764
765
766
767
        $options           = array_merge($defaultOptions, $options);
        $annee             = $this->getServiceContext()->getAnnee();
        $data              = [];
        $shown             = [];
lecluse's avatar
lecluse committed
768
        $typesIntervention = [];
lecluse's avatar
#3357    
lecluse committed
769
770
        $invertTi          = [];
        $numericColunms    = [
771
772
            'service-statutaire',
            'service-du-modifie',
773
774
            'heures-non-payees',
            'heures-ref',
775
776
777
            'service-fi',
            'service-fa',
            'service-fc',
778
            'service-referentiel',
779
780
781
            'heures-compl-fi',
            'heures-compl-fa',
            'heures-compl-fc',
782
            'heures-compl-fc-majorees',
783
784
785
            'heures-compl-referentiel',
            'total',
            'solde',
786
        ];
787
        $dateColumns       = [
788
789
790
791
            'service-date-modification',
            'intervenant-date-naissance',
            'date-cloture-service-realise',
        ];
lecluse's avatar
#3357    
lecluse committed
792
        $addableColumns    = [
793
794
795
            '__total__',
            'heures-non-payees',
            'heures-ref',
796
797
798
            'service-fi',
            'service-fa',
            'service-fc',
799
            'service-referentiel',
800
801
802
            'heures-compl-fi',
            'heures-compl-fa',
            'heures-compl-fc',
803
            'heures-compl-fc-majorees',
804
805
            'heures-compl-referentiel',
            'total',
806
        ];
807
808

        // requêtage
lecluse's avatar
lecluse committed
809
        $conditions = [
lecluse's avatar
#3357    
lecluse committed
810
            'annee_id = ' . $annee->getId(),
lecluse's avatar
lecluse committed
811
        ];
lecluse's avatar
#3357    
lecluse committed
812
813
814
815
        if ($c1 = $recherche->getTypeVolumeHoraire()) $conditions['type_volume_horaire_id'] = '(type_volume_horaire_id = -1 OR type_volume_horaire_id = ' . $c1->getId() . ')';
        if ($c2 = $recherche->getEtatVolumeHoraire()) $conditions['etat_volume_horaire_id'] = '(etat_volume_horaire_id = -1 OR etat_volume_horaire_id = ' . $c2->getId() . ')';
        if ($c3 = $recherche->getTypeIntervenant()) $conditions['type_intervenant_id'] = '(type_intervenant_id = -1 OR type_intervenant_id = ' . $c3->getId() . ')';
        if ($c4 = $recherche->getIntervenant()) $conditions['intervenant_id'] = '(intervenant_id = -1 OR intervenant_id = ' . $c4->getId() . ')';
lecluse's avatar
lecluse committed
816
        //if ($c5 = $recherche->getNiveauFormation()    ) $conditions['niveau_formation_id']    = '(niveau_formation_id = -1 OR niveau_formation_id = '    . $c5->getId().')';
lecluse's avatar
#3357    
lecluse committed
817
818
819
820
        if ($c6 = $recherche->getEtape()) $conditions['etape_id'] = '(etape_id = -1 OR etape_id = ' . $c6->getId() . ')';
        if ($c7 = $recherche->getElementPedagogique()) $conditions['element_pedagogique_id'] = '(element_pedagogique_id = -1 OR element_pedagogique_id = ' . $c7->getId() . ')';
        if ($c8 = $recherche->getStructureAff()) $conditions['structure_aff_id'] = '(structure_aff_id = -1 OR structure_aff_id = ' . $c8->getId() . ')';
        if ($c9 = $recherche->getStructureEns()) $conditions['structure_ens_id'] = '(structure_ens_id = -1 OR structure_ens_id = ' . $c9->getId() . ')';
lecluse's avatar
lecluse committed
821

822
        if ($options['composante'] instanceof Structure) {
lecluse's avatar
#3357    
lecluse committed
823
            $id                       = (int)$options['composante']->getId();
824
825
826
            $conditions['composante'] = "(structure_aff_id = -1 OR structure_aff_id = $id OR structure_ens_id = -1 OR structure_ens_id = $id)";
        }

lecluse's avatar
#3357    
lecluse committed
827
828
829
        switch ($options['tri']) {
            case 'intervenant':
                $orderBy = 'INTERVENANT_NOM, SERVICE_STRUCTURE_AFF_LIBELLE, SERVICE_STRUCTURE_ENS_LIBELLE, ETAPE_LIBELLE, ELEMENT_LIBELLE';
830
            break;
lecluse's avatar
#3357    
lecluse committed
831
            case 'hetd':
lecluse's avatar
v1.6.4    
lecluse committed
832
                $orderBy = 'SOLDE, INTERVENANT_NOM, SERVICE_STRUCTURE_AFF_LIBELLE, SERVICE_STRUCTURE_ENS_LIBELLE, ETAPE_LIBELLE, ELEMENT_LIBELLE';
833
            break;
lecluse's avatar
#3357    
lecluse committed
834
835
            default:
                $orderBy = 'INTERVENANT_NOM, SERVICE_STRUCTURE_AFF_LIBELLE, SERVICE_STRUCTURE_ENS_LIBELLE, ETAPE_LIBELLE, ELEMENT_LIBELLE';
836
            break;
837
838
        }

839
        $sql  = 'SELECT * FROM V_EXPORT_SERVICE WHERE ' . implode(' AND ', $conditions) . ' '
lecluse's avatar
#3357    
lecluse committed
840
            . 'ORDER BY ' . $orderBy;
lecluse's avatar
lecluse committed
841
        $stmt = $this->getEntityManager()->getConnection()->executeQuery($sql);
842

843
844
        $dateExtraction = new \DateTime();

845
        // récupération des données
lecluse's avatar