RoleProvider.php 5.58 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 = [];
lecluse's avatar
#1344    
lecluse committed
71
72
73
74
75
76
77
        $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
78
79
80
81
82
83
84
85
86
87
88
89
90
        
        $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 */
lecluse's avatar
#1344    
lecluse committed
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
        $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 */
            $roleId = $dbRole->getCode();

            $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';}
            if ($roleId == 'administrateur')            { $roleClass = 'Application\Acl\AdministrateurRole';}
            if ($roleId == 'responsable-composante')    { $roleClass = 'Application\Acl\ResponsableComposanteRole';  $parent='composante';}
            if ($roleId == 'superviseur-etablissement') { $roleClass = 'Application\Acl\EtablissementRole'; }
            if ($roleId == 'gestionnaire-drh')          { $roleClass = 'Application\Acl\DrhRole'; }
            /* FIN de deprecated */

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

            $roles[$roleId] = $role;

            $affectations = $dbRole->getAffectation();
            foreach( $affectations as $affectation ){ /* @var $affectation Affectation */
lecluse's avatar
#1344    
lecluse committed
126
                if ($structure = $affectation->getStructure()){
lecluse's avatar
#1344    
lecluse committed
127
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->setDbRole( $dbRole );
                        $affRole->setPersonnel( $personnel );
                        $affRole->setStructure( $structure );
                        $roles[$affRoleId] = $affRole;
                    }
lecluse's avatar
#1344    
lecluse committed
136
                }
137
            }
138
        }
139
140
        return $roles;
    }
lecluse's avatar
#1344    
lecluse committed
141

142
143
144
145
146
147
    public function setStructureSelectionnee(StructureEntity $structureSelectionnee = null)
    {
        $this->structureSelectionnee = $structureSelectionnee;
        
        return $this;
    }
148
}