RoleProvider.php 5.14 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
{
23
    use EntityManagerAwareTrait;
24
    use \Zend\ServiceManager\ServiceLocatorAwareTrait;
25

26
27
28
    /**
     * @var array
     */
29
30
    protected $config = [];

31
32
33
34
    /**
     * @var array
     */
    protected $roles;
35

lecluse's avatar
#1344    
lecluse committed
36
37
38
39
40
41
    /**
     * @var StructureEntity
     */
    protected $structureSelectionnee;


42

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

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

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

68
69
70
    protected function makeRoles()
    {
        $roles = [];
71
$roles['test'] = new Role( 'test', 'user', 'Rôle de test');
lecluse's avatar
#1344    
lecluse committed
72
        /* deprecated */
73
74
75
76
77
78
79
80
        foreach( $this->config as $classname ){
            if (class_exists( $classname )){
                $role = new $classname; /* @var $role RoleInterface */
                $roles[$role->getRoleId()] = $role;
            }else{
                throw new LogicException('La classe "'.$classname.'" déclarée dans la configuration du fournisseur de rôles n\'a pas été trouvée.');
            }
        }
lecluse's avatar
#1344    
lecluse committed
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
        /* fin de deprecated */
        
        $serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
        /* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
        $utilisateur = $serviceAuthUserContext->getDbUser();


        /* Cas spécifique du rôle intervenant */
        if ($utilisateur && $utilisateur->getIntervenant()){
            $role = new IntervenantRole;
            $role->setIntervenant( $utilisateur->getIntervenant() );
            $roles[$role->getRoleId()] = $role;
        }

        /* Rôles du personnel */
        if ($utilisateur && ($personnel = $utilisateur->getPersonnel())){
97
98
            // chargement des rôles métiers
            $qb = $this->getEntityManager()->createQueryBuilder()
lecluse's avatar
#1344    
lecluse committed
99
100
                ->from("Application\Entity\Db\Affectation", "a")
                ->select("a, r, s")
101
                ->distinct()
lecluse's avatar
#1344    
lecluse committed
102
103
104
                ->join("a.role", "r")
                ->leftJoin("a.structure", "s")
                ->andWhere('1=compriseEntre(a.histoCreation,a.histoDestruction)')
105
                ->andWhere('1=compriseEntre(r.histoCreation,r.histoDestruction)')
lecluse's avatar
#1344    
lecluse committed
106
107
                ->andWhere("a.personnel = :personnel")->setParameter(':personnel', $personnel);
            foreach ($qb->getQuery()->getResult() as $affectation) { /* @var $affectation Affectation */
lecluse's avatar
#1344    
lecluse committed
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
                 $dbRole = $affectation->getRole();

                $roleId = $dbRole->getCode();
                $roleLibelle = $dbRole->getLibelle();
                if ($structure = $affectation->getStructure()){
                    $roleId .= '-'.$structure->getSourceCode();
                    $roleLibelle .= ' ('.$structure->getLibelleCourt().')';
                }

                /** @deprecated */
                $parents = [
                    'gestionnaire-composante',
                    'responsable-recherche-labo',
                    'directeur-composante',
                    'administrateur',
                    'responsable-composante',
                    'superviseur-etablissement',
                ];
                if (in_array($dbRole->getCode(), $parents)){
                    $parent = $dbRole->getCode();
                }else{
                    $parent = 'user';
                }

                if (isset($roles[$roleId])){
                    $role = $roles[$roleId];
                }else{
                    $role = new Role( $roleId, $parent, $roleLibelle);
                }

                /* fin de deprecated */

lecluse's avatar
#1344    
lecluse committed
140
                //$role = new Role( $roleId, 'user', $roleLibelle);
lecluse's avatar
#1344    
lecluse committed
141
142
143
144
145
                $role->setDbRole( $dbRole );
                $role->setPersonnel( $personnel );

                if ($this->structureSelectionnee){
                    $role->setStructure( $this->structureSelectionnee );
146
                }else{
lecluse's avatar
#1344    
lecluse committed
147
                    $role->setStructure( $affectation->getStructure() );
148
                }
lecluse's avatar
#1344    
lecluse committed
149
150

                $roles[$roleId] = $role;
151
            }
152
        }
153
154
        return $roles;
    }
155
156
157
158
159
160
161
    
    public function setStructureSelectionnee(StructureEntity $structureSelectionnee = null)
    {
        $this->structureSelectionnee = $structureSelectionnee;
        
        return $this;
    }
162
}