Intervenant.php 9.19 KB
Newer Older
lecluse's avatar
lecluse committed
1
2
3
4
<?php

namespace Application\Service;

5
use Application\Entity\Db\Intervenant as IntervenantEntity;
lecluse's avatar
lecluse committed
6
7
use Application\Entity\Db\Structure as StructureEntity;
use Application\Entity\Db\Periode as PeriodeEntity;
8
use Application\Entity\Db\Annee as AnneeEntity;
9
10
use Application\Entity\Db\TypeIntervenant;
use Application\Service\Traits\StatutIntervenantAwareTrait;
11
12
13
use Common\Exception\RuntimeException;
use Doctrine\ORM\QueryBuilder;
use Import\Processus\Import;
lecluse's avatar
lecluse committed
14
15
16
17
18
19
20
21

/**
 * Description of Intervenant
 *
 * @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
 */
class Intervenant extends AbstractEntityService
{
22
23
24
25
    use StatutIntervenantAwareTrait;



26
27
    /**
     * Recherche par :
28
29
     * - id source exact (numéro Harpege ou autre),
     * - ou nom usuel (et prénom),
30
     * - ou nom patronymique (et prénom).
31
     *
32
     * @param string $term
lecluse's avatar
#3357    
lecluse committed
33
     *
34
35
     * @return QueryBuilder
     */
lecluse's avatar
#3357    
lecluse committed
36
    public function finderByNomPrenomId($term, QueryBuilder $qb = null, $alias = null)
37
    {
lecluse's avatar
lecluse committed
38
39
        list($qb, $alias) = $this->initQuery($qb, $alias);

40
        $term = str_replace(' ', '', $term);
41
42

        $concatNomUsuelPrenom = new \Doctrine\ORM\Query\Expr\Func('CONVERT',
lecluse's avatar
#3357    
lecluse committed
43
44
            [$qb->expr()->concat($alias . '.nomUsuel', $alias . '.prenom'), '?3']
        );
45
        $concatNomPatroPrenom = new \Doctrine\ORM\Query\Expr\Func('CONVERT',
lecluse's avatar
#3357    
lecluse committed
46
47
            [$qb->expr()->concat($alias . '.nomPatronymique', $alias . '.prenom'), '?3']
        );
48
        $concatPrenomNomUsuel = new \Doctrine\ORM\Query\Expr\Func('CONVERT',
lecluse's avatar
#3357    
lecluse committed
49
50
            [$qb->expr()->concat($alias . '.prenom', $alias . '.nomUsuel'), '?3']
        );
51
        $concatPrenomNomPatro = new \Doctrine\ORM\Query\Expr\Func('CONVERT',
lecluse's avatar
#3357    
lecluse committed
52
53
            [$qb->expr()->concat($alias . '.prenom', $alias . '.nomPatronymique'), '?3']
        );
54

55
56
        $qb
//                ->select('i.')
lecluse's avatar
#3357    
lecluse committed
57
58
59
60
61
62
            ->where($alias . '.sourceCode = ?1')
            ->orWhere($qb->expr()->like($qb->expr()->upper($concatNomUsuelPrenom), $qb->expr()->upper('CONVERT(?2, ?3)')))
            ->orWhere($qb->expr()->like($qb->expr()->upper($concatNomPatroPrenom), $qb->expr()->upper('CONVERT(?2, ?3)')))
            ->orWhere($qb->expr()->like($qb->expr()->upper($concatPrenomNomUsuel), $qb->expr()->upper('CONVERT(?2, ?3)')))
            ->orWhere($qb->expr()->like($qb->expr()->upper($concatPrenomNomPatro), $qb->expr()->upper('CONVERT(?2, ?3)')))
            ->orderBy($alias . '.nomUsuel, ' . $alias . '.prenom');
63
64
65

        $qb->setParameters([1 => $term, 2 => "%$term%", 3 => 'US7ASCII']);

66
//        print_r($qb->getQuery()->getSQL()); var_dump($qb->getQuery()->getParameters());die;
67

68
69
        return $qb;
    }
70

lecluse's avatar
#3357    
lecluse committed
71
72


lecluse's avatar
lecluse committed
73
74
75
76
77
78
79
80
    /**
     * retourne la classe des entités
     *
     * @return string
     * @throws RuntimeException
     */
    public function getEntityClass()
    {
81
        return IntervenantEntity::class;
lecluse's avatar
lecluse committed
82
83
    }

lecluse's avatar
#3357    
lecluse committed
84
85


86
87
    /**
     *
lecluse's avatar
#3357    
lecluse committed
88
89
90
     * @param string      $sourceCode
     * @param AnneeEntity $annee
     *
91
92
     * @return IntervenantEntity
     */
lecluse's avatar
#3357    
lecluse committed
93
    public function getBySourceCode($sourceCode, AnneeEntity $annee = null)
94
95
    {
        if (null == $sourceCode) return null;
lecluse's avatar
#2955    
lecluse committed
96

lecluse's avatar
#3357    
lecluse committed
97
98
99
        if (!$annee) {
            $annee = $this->getServiceContext()->getAnnee();
        }
lecluse's avatar
#2955    
lecluse committed
100
101

        return $this->getRepo()->findOneBy(['sourceCode' => $sourceCode, 'annee' => $annee->getId()]);
102
103
    }

lecluse's avatar
#3357    
lecluse committed
104
105


lecluse's avatar
lecluse committed
106
107
108
109
110
    /**
     * Retourne l'alias d'entité courante
     *
     * @return string
     */
111
112
    public function getAlias()
    {
lecluse's avatar
lecluse committed
113
114
        return 'int';
    }
lecluse's avatar
#2955    
lecluse committed
115

lecluse's avatar
#3357    
lecluse committed
116
117


118
119
    /**
     * Finder par étape franchie dans le workflow de l'intervenant.
120
     *
lecluse's avatar
#3357    
lecluse committed
121
     * @param string       $codeEtape Ex: WfEtape::CODE_PJ_SAISIE
122
     * @param QueryBuilder $qb
lecluse's avatar
#3357    
lecluse committed
123
     *
124
125
126
     * @return QueryBuilder
     * @see \Application\Entity\Db\WfEtape
     */
lecluse's avatar
#3357    
lecluse committed
127
    public function finderByWfEtapeFranchie($codeEtape, QueryBuilder $qb = null, $alias = null)
128
    {
lecluse's avatar
lecluse committed
129
        list($qb, $alias) = $this->initQuery($qb, $alias);
130
        $qb
lecluse's avatar
#3357    
lecluse committed
131
132
133
            ->join("$alias.wfIntervenantEtape", "p", \Doctrine\ORM\Query\Expr\Join::WITH, "p.franchie = 1")
            ->join("p.etape", "e", \Doctrine\ORM\Query\Expr\Join::WITH, "e.code = :codeEtape")
            ->setParameter('codeEtape', $codeEtape);
134
135
136

        return $qb;
    }
137

lecluse's avatar
#3357    
lecluse committed
138
139


140
141
    /**
     * Finder par étape courante dans le workflow de l'intervenant.
142
     *
lecluse's avatar
#3357    
lecluse committed
143
     * @param string       $codeEtape Ex: \Application\Entity\Db\WfEtape::CODE_PIECES_JOINTES
144
     * @param QueryBuilder $qb
lecluse's avatar
#3357    
lecluse committed
145
     *
146
     * @return QueryBuilder
147
     */
lecluse's avatar
#3357    
lecluse committed
148
    public function finderByWfEtapeCourante($codeEtape, QueryBuilder $qb = null, $alias = null)
149
    {
lecluse's avatar
lecluse committed
150
        list($qb, $alias) = $this->initQuery($qb, $alias);
151
        $qb
lecluse's avatar
#3357    
lecluse committed
152
153
154
            ->join("$alias.wfIntervenantEtape", "p", \Doctrine\ORM\Query\Expr\Join::WITH, "p.courante = 1")
            ->join("p.etape", "e", \Doctrine\ORM\Query\Expr\Join::WITH, "e.code = :codeEtape")
            ->setParameter('codeEtape', $codeEtape);
155
156
157

        return $qb;
    }
158

lecluse's avatar
#3357    
lecluse committed
159
160


161
162
163
    /**
     * Ajoutant les critères permettant de ne retenir que les intervenants ayant fourni
     * une pièce justificative qui n'a pas encore été validée.
164
     *
165
     * @param QueryBuilder $qb
lecluse's avatar
#3357    
lecluse committed
166
     *
167
168
     * @return QueryBuilder
     */
lecluse's avatar
#3357    
lecluse committed
169
    public function finderByPieceJointeFournieNonValidee(QueryBuilder $qb = null, $alias = null)
170
    {
lecluse's avatar
lecluse committed
171
        list($qb, $alias) = $this->initQuery($qb, $alias);
172
        $qb
lecluse's avatar
#3357    
lecluse committed
173
174
175
176
            ->join("$alias.dossier", "d")
            ->join("d.pieceJointe", "pj")
            ->leftJoin("pj.validation", "vpj")
            ->andWhere("vpj IS NULL");
177

178
179
        return $qb;
    }
lecluse's avatar
lecluse committed
180

lecluse's avatar
#3357    
lecluse committed
181
182
183


    public function finderByMiseEnPaiement(StructureEntity $structure = null, PeriodeEntity $periode = null, QueryBuilder $qb = null, $alias = null)
lecluse's avatar
lecluse committed
184
185
186
187
188
189
190
191
192
193
    {
        $serviceMIS = $this->getServiceLocator()->get('applicationMiseEnPaiementIntervenantStructure');
        /* @var $serviceMIS MiseEnPaiementIntervenantStructure */

        $serviceMiseEnPaiement = $this->getServiceLocator()->get('applicationMiseEnPaiement');
        /* @var $serviceMiseEnPaiement MiseEnPaiement */

        $serviceStructure = $this->getServiceLocator()->get('applicationStructure');
        /* @var $serviceStructure Structure */

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

lecluse's avatar
#3357    
lecluse committed
196
197
        $this->join($serviceMIS, $qb, 'miseEnPaiementIntervenantStructure', false, $alias);
        $serviceMIS->join($serviceMiseEnPaiement, $qb, 'miseEnPaiement');
lecluse's avatar
lecluse committed
198

lecluse's avatar
#3357    
lecluse committed
199
200
        if ($structure) {
            $serviceMIS->finderByStructure($structure, $qb);
lecluse's avatar
lecluse committed
201
        }
lecluse's avatar
#3357    
lecluse committed
202
203
        if ($periode) {
            $serviceMIS->finderByPeriode($periode, $qb);
lecluse's avatar
lecluse committed
204
205
206
207
208
        }

        return $qb;
    }

lecluse's avatar
#3357    
lecluse committed
209
210


211
    /**
212
     * Importe un intervenant si besoin.
213
     *
214
     * @param string $sourceCode Code source
lecluse's avatar
#3357    
lecluse committed
215
     *
216
217
218
219
220
     * @return IntervenantEntity
     * @throws RuntimeException Intervenant déjà importé ou introuvable après import
     */
    public function importer($sourceCode)
    {
221
        if ($intervenant = $this->getBySourceCode($sourceCode)) {
222
            return $intervenant;
223
        }
224

lecluse's avatar
#3357    
lecluse committed
225
226
        $import = $this->getServiceLocator()->get('importProcessusImport');
        /* @var $import Import */
227
228
        $import->intervenant($sourceCode);

lecluse's avatar
lecluse committed
229
230
        $repo = $this->getEntityManager()->getRepository($this->getEntityClass());

231
        if (!($intervenant = $repo->findOneBySourceCode($sourceCode))) {
lecluse's avatar
lecluse committed
232
            throw new RuntimeException("Vous n'êtes pas autorisé à vous connecter à OSE avec ce compte. Vous vous prions de vous rapprocher de votre composante pour en obtenir un valide.");
233
        }
234

235
236
        return $intervenant;
    }
lecluse's avatar
lecluse committed
237

lecluse's avatar
#3357    
lecluse committed
238
239


lecluse's avatar
lecluse committed
240
241
242
243
    /**
     * Retourne la liste des intervenants
     *
     * @param QueryBuilder|null $queryBuilder
lecluse's avatar
#3357    
lecluse committed
244
245
     * @param string|null       $alias
     *
lecluse's avatar
lecluse committed
246
247
     * @return \Application\Entity\Db\Intervenant[]
     */
lecluse's avatar
#3357    
lecluse committed
248
    public function getList(QueryBuilder $qb = null, $alias = null)
lecluse's avatar
lecluse committed
249
    {
lecluse's avatar
#3357    
lecluse committed
250
        list($qb, $alias) = $this->initQuery($qb, $alias);
lecluse's avatar
lecluse committed
251
        $qb->addOrderBy("$alias.nomUsuel, $alias.prenom");
lecluse's avatar
#3357    
lecluse committed
252

lecluse's avatar
lecluse committed
253
254
255
        return parent::getList($qb, $alias);
    }

lecluse's avatar
#3357    
lecluse committed
256
257


258
259
    /**
     * Recherche d'intervenant par le "source code" et l'année.
lecluse's avatar
#3357    
lecluse committed
260
     *
261
262
263
264
     * @param string            $sourceCode Code de l'intervenant dans la source de données (ex: numéro Harpege)
     * @param AnneeEntity       $annee      Année concernée
     * @param QueryBuilder|null $queryBuilder
     * @param string|null       $alias
lecluse's avatar
#3357    
lecluse committed
265
     *
266
267
     * @return QueryBuilder
     */
268
    public function finderBySourceCodeAndAnnee($sourceCode, AnneeEntity $annee, QueryBuilder $qb = null, $alias = null)
269
    {
270
        list($qb, $alias) = $this->initQuery($qb, $alias);
271
        $qb
lecluse's avatar
#3357    
lecluse committed
272
273
274
            ->andWhere("$alias.sourceCode = :code AND $alias.annee = :annee")
            ->setParameter('code', $sourceCode)
            ->setParameter('annee', $annee);
275
276
277

        return $qb;
    }
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299



    /**
     * Filtre par le type d'intervenant
     *
     * @param TypeIntervenant   $typeIntervenant Type de l'intervenant
     * @param QueryBuilder|null $queryBuilder
     * @param string|null       $alias
     *
     * @return QueryBuilder
     */
    public function finderByType(TypeIntervenant $typeIntervenant, QueryBuilder $qb = null, $alias = null)
    {
        list($qb, $alias) = $this->initQuery($qb, $alias);
        $sStatut = $this->getServiceStatutIntervenant();

        $this->join($sStatut, $qb, 'statut', false, $alias);
        $sStatut->finderByTypeIntervenant($typeIntervenant, $qb);

        return $qb;
    }
300
}