RoleProvider.php 7.45 KB
Newer Older
1
2
3
4
<?php

namespace Application\Provider\Role;

lecluse's avatar
#1344    
lecluse committed
5
use Application\Entity\Db\Affectation;
6
use Application\Entity\Db\Structure as StructureEntity;
7
use BjyAuthorize\Provider\Role\ProviderInterface;
8
use UnicaenApp\Exception\LogicException;
9
10
use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait;
11
use Zend\Permissions\Acl\Role\RoleInterface;
lecluse's avatar
#1344    
lecluse committed
12
13
use Application\Acl\Role;
use Application\Acl\IntervenantRole;
14
15

/**
16
 * Fournisseur des rôles utilisateurs de l'application :
17
18
19
 * - ceux définis dans la configuration du fournisseur
 *
 *  * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
20
 */
21
class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
22
{
lecluse's avatar
#1344    
lecluse committed
23
24
    use EntityManagerAwareTrait,
        \Zend\ServiceManager\ServiceLocatorAwareTrait,
lecluse's avatar
lecluse committed
25
26
        \Application\Service\Traits\StatutIntervenantAwareTrait,
        \Application\Traits\SessionContainerTrait
lecluse's avatar
#1344    
lecluse committed
27
    ;
28

29
30
31
    /**
     * @var array
     */
32
33
    protected $config = [];

34
35
36
37
    /**
     * @var array
     */
    protected $roles;
38

lecluse's avatar
#1344    
lecluse committed
39
40
41
42
43
44
    /**
     * @var StructureEntity
     */
    protected $structureSelectionnee;


45

46
    /**
47
     * Constructeur.
48
49
     * @param array $config
     */
50
    public function __construct( $config = [] )
51
    {
52
        $this->config = $config;
53
    }
54
55
56
57
58
59

    public function init()
    {
        $this->getEntityManager()->getFilters()->enable('historique');
    }

60
    /**
61
     * @return RoleInterface[]
62
63
64
     */
    public function getRoles()
    {
65
        if (null === $this->roles) {
66
67
68
69
            $this->roles = $this->makeRoles();
        }
        return $this->roles;
    }
70

71
72
73
    protected function makeRoles()
    {
        $roles = [];
lecluse's avatar
#1344    
lecluse committed
74
75
76
77
78
79
80
        $r = new Role();                                        $roles[$r->getRoleId()] = $r;
        $r = new \Application\Acl\ComposanteRole();             $roles[$r->getRoleId()] = $r;
        $r = new \Application\Acl\DrhRole();                    $roles[$r->getRoleId()] = $r;
        $r = new \Application\Acl\EtablissementRole();          $roles[$r->getRoleId()] = $r;
        $r = new \Application\Acl\IntervenantRole();            $roles[$r->getRoleId()] = $r;
        $r = new \Application\Acl\IntervenantExterieurRole();   $roles[$r->getRoleId()] = $r;
        $r = new \Application\Acl\IntervenantPermanentRole();   $roles[$r->getRoleId()] = $r;
lecluse's avatar
#1344    
lecluse committed
81

lecluse's avatar
#1344    
lecluse committed
82
83
84
85
86
87
        $serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
        /* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
        $utilisateur = $serviceAuthUserContext->getDbUser();


        /* Rôles du personnel */
lecluse's avatar
#1344    
lecluse committed
88
89
90
91
92
93
94
95
96
97
98
99
100
101
        $personnel = null;
        if ($utilisateur) $personnel = $utilisateur->getPersonnel();

        // chargement des rôles métiers
        $qb = $this->getEntityManager()->createQueryBuilder()
            ->from("Application\Entity\Db\Role", "r")
            ->select("r, a, s")
            ->distinct()
            ->leftJoin("r.affectation", "a", \Doctrine\ORM\Query\Expr\Join::WITH, '1=compriseEntre(a.histoCreation,a.histoDestruction) AND a.personnel = :personnel')
            ->leftJoin("a.structure", "s")
            ->andWhere('1=compriseEntre(r.histoCreation,r.histoDestruction)')
            ->setParameter(':personnel', $personnel);

        foreach ($qb->getQuery()->getResult() as $dbRole) { /* @var $dbRole \Application\Entity\Db\Role */
lecluse's avatar
#1344    
lecluse committed
102
            $roleId = $dbRole->getRoleId();
lecluse's avatar
#1344    
lecluse committed
103
104
105
106
107
108

            $roleClass = 'Application\Acl\Role';
            $parent = 'user';
            /** @deprecated */
            if ($roleId == 'gestionnaire-composante')   { $roleClass = 'Application\Acl\GestionnaireComposanteRole'; $parent='composante';}
            if ($roleId == 'directeur-composante')      { $roleClass = 'Application\Acl\DirecteurComposanteRole';    $parent='composante';}
lecluse's avatar
v1.5.3    
lecluse committed
109
            if ($roleId == 'administrateur')            { $roleClass = 'Application\Acl\AdministrateurRole';                              }
lecluse's avatar
#1344    
lecluse committed
110
            if ($roleId == 'responsable-composante')    { $roleClass = 'Application\Acl\ResponsableComposanteRole';  $parent='composante';}
111
            if ($roleId == 'superviseur-etablissement') { $roleClass = 'Application\Acl\EtablissementRole';          $parent='etablissement';}
lecluse's avatar
v1.5.3    
lecluse committed
112
            if ($roleId == 'gestionnaire-drh')          { $roleClass = 'Application\Acl\DrhRole';                                         }
lecluse's avatar
#1344    
lecluse committed
113
114
115
116
117
            /* FIN de deprecated */

            $role = new $roleClass( $roleId, $parent, $dbRole->getLibelle() );
            $role->setPersonnel($personnel);

118
119
120
121
122
            // Si le rôle est de périmètre établissement, alors il se peut que l'on veuille zoomer sur une composante en particulier...
            if ($this->structureSelectionnee && $dbRole->getPerimetre()->isEtablissement()){
                $role->setStructure( $this->structureSelectionnee );
            }

lecluse's avatar
#1344    
lecluse committed
123
124
125
126
            $roles[$roleId] = $role;

            $affectations = $dbRole->getAffectation();
            foreach( $affectations as $affectation ){ /* @var $affectation Affectation */
lecluse's avatar
#1344    
lecluse committed
127
                if ($structure = $affectation->getStructure()){
lecluse's avatar
#1344    
lecluse committed
128
129
130
131
132
133
134
135
                    $affRoleId = $roleId.'-'.$structure->getSourceCode();
                    if (! isset($roles[$affRoleId])){
                        $affRoleLibelle = $dbRole->getLibelle().' ('.$structure->getLibelleCourt().')';
                        $affRole = new $roleClass( $affRoleId, $roleId, $affRoleLibelle );
                        $affRole->setPersonnel( $personnel );
                        $affRole->setStructure( $structure );
                        $roles[$affRoleId] = $affRole;
                    }
lecluse's avatar
#1344    
lecluse committed
136
                }
137
            }
138
        }
lecluse's avatar
#1344    
lecluse committed
139
140
141


        // Chargement des rôles par statut d'intervenant
lecluse's avatar
lecluse committed
142
143
144
145
        $si = $this->getStatutsInfo();
        foreach( $si as $statut ){
            $roleClass = $statut['role-class'];
            $role = new $roleClass( $statut['role-id'], $statut['parent'], $roles[$statut['parent']]->getRoleName() );
lecluse's avatar
#1344    
lecluse committed
146
147

            if ($utilisateur && $intervenant = $utilisateur->getIntervenant()){
lecluse's avatar
lecluse committed
148
                if ($intervenant->getStatut()->getId() == $statut['statut-id']){
lecluse's avatar
#1344    
lecluse committed
149
150
151
                    $role->setIntervenant( $intervenant );
                }
            }
lecluse's avatar
lecluse committed
152
            $roles[$statut['role-id']] = $role;
lecluse's avatar
#1344    
lecluse committed
153
154
        }

155
156
        return $roles;
    }
lecluse's avatar
#1344    
lecluse committed
157

lecluse's avatar
lecluse committed
158
159
    public function getStatutsInfo()
    {
lecluse's avatar
lecluse committed
160
161
        $session = $this->getSessionContainer();
        if (! isset($session->statutsInfo)){
lecluse's avatar
lecluse committed
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
            $si = [];
            $statuts = $this->getServiceStatutIntervenant()->getList();
            foreach( $statuts as $statut ){
                /** @deprecated */
                if ($statut->getTypeIntervenant()->getCode() === \Application\Entity\Db\TypeIntervenant::CODE_PERMANENT){
                    $parent = \Application\Acl\IntervenantPermanentRole::ROLE_ID;
                    $roleClass = 'Application\Acl\IntervenantPermanentRole';
                }else{
                    $parent = \Application\Acl\IntervenantExterieurRole::ROLE_ID;
                    $roleClass = 'Application\Acl\IntervenantExterieurRole';
                }
                $si[] = [
                    'statut-id' => $statut->getId(),
                    'role-id' => $statut->getRoleId(),
                    'parent' => $parent,
                    'role-class' => $roleClass,
                ];

lecluse's avatar
lecluse committed
180
181
182
183
            }
            $session->statutsInfo = $si;
        }
        return $session->statutsInfo;
lecluse's avatar
lecluse committed
184
185
    }

186
187
188
189
190
191
    public function setStructureSelectionnee(StructureEntity $structureSelectionnee = null)
    {
        $this->structureSelectionnee = $structureSelectionnee;
        
        return $this;
    }
192
}