User.php 6.16 KB
<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;
use Cake\Auth\DefaultPasswordHasher;

/**
 * User Entity.
 *
 * @property int $id
 * @property \Cake\I18n\Time $created
 * @property \Cake\I18n\Time $modified
 * @property string $nom
 * @property string $username
 * @property string $password
 * @property string $email
 * @property string $role
 * @property int $groupes_metier_id
 * @property int $groupes_thematique_id
 * @property int $sur_categorie_id
 * @property int $groupes_metier_id2
 * @property int $groupes_thematique_id2
 * @property int $sur_categorie_id2
 * @property \App\Model\Entity\GroupesMetier $groupes_metier
 * @property \App\Model\Entity\GroupesThematique $groupe_thematique
 * @property \App\Model\Entity\SurCategory $sur_categorie
 */
class User extends Entity
{

    /**
     * Fields that can be mass assigned using newEntity() or patchEntity().
     *
     * Note that when '*' is set to true, this allows all unspecified fields to
     * be mass assigned. For security purposes, it is advised to set '*' to false
     * (or remove it), and explicitly make individual fields accessible as needed.
     *
     * @var array
     */
    protected $_accessible = [
        '*' => true,
        'id' => false
    ];
    
    // Fonction de hachage de mot de passe (mutator/setter)
    /* CakePHP hashes passwords with bcrypt by default.
     * You can also use SHA-1 or MD5 if you’re working with an existing database, 
     * but we recommend bcrypt for all new applications
     */
    protected function _setPassword($password)
    {
        //return (new DefaultPasswordHasher())->hash($password);
        //if (strlen($password)) {
        if (strlen($password)>0) {
            $hasher = new DefaultPasswordHasher();
            return $hasher->hash($password);
        }
    }
    
    // Ce qui s'affiche quand on fait echo $entity (ou echo $this)
    // ATTENTION : nom = "Nom Prénom"
    //public function __toString() { return $this->nom; }
    public function __toString() { return $this->nom ? $this->nom : 'Nom Prénom'; }
    
    
    // (EP 20200504) - Champs virtuels

    // Nom Prénom
    //protected function _getFullname() { return $this->name.' '.$this->firstname; }
    
    /* 
     * Champs virtuels $user->is_xxx
     */
    /*
    public function isUser() { return $this->role == 'Utilisateur'; }
    public function is_resp() { return $this->role == 'Responsable'; }
    public function is_admin() { return $this->role == 'Administration'; }
    public function is_super() { return $this->role == 'Super Administrateur'; }
    */
    // $user->is_user
    protected function _getIsUser() { return $this->role == 'Utilisateur'; } //return $this->_fields['status'] == 'CREATED';
    // $user->is_resp
    protected function _getIsResp() { return $this->role == 'Responsable'; }
    // $user->is_admin
    protected function _getIsAdmin() { return $this->role == 'Administration'; }
    // $user->is_adminplus
    //protected function _getIsAdminplus() { return $this->role == 'Administration Plus'; }
    // $user->is_super
    protected function _getIsSuper() { return $this->role == 'Super Administrateur'; }

    // $user->groupe_thematique_with_resp
    protected function _getGroupeThematiqueWithResp() {
        $group_with_resp = '';
        if ($this->has('groupes_thematique')) $group_with_resp .= $this->groupes_thematique->nom;
        if ($this->is_resp_groupes_thematique) $group_with_resp .= ' (responsable)';
        return $group_with_resp;
    }
    protected function _getGroupeMetierWithResp() {
        $group_with_resp = '';
        if ($this->has('groupes_metier')) $group_with_resp .= $this->groupes_metier->nom;
        if ($this->is_resp_groupes_metier) $group_with_resp .= ' (responsable)';
        return $group_with_resp;
    }
    
    
    /* 
     * Champs virtuels $user->is_xxx_or_more
     */ 
    //public function isRespOrMore() {
    // $user->is_resp_or_more
    protected function _getIsRespOrMore() {
        return in_array($this->role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']);
    }
    // $user->is_admin_or_more
    public function _getIsAdminOrMore() {
        return in_array($this->role, ['Administration', 'Administration Plus', 'Super Administrateur']);
    }
    /*
    // $user->is_adminplus_or_more
    public function _getIsAdminplusOrMore() {
        return in_array($this->role, ['Administration Plus', 'Super Administrateur']);
    }
    */
    
    /* 
     * Champs virtuels $user->is_xxx_or_less
     */
    // $user->is_resp_or_less
    public function _getIsRespOrLess() {
        return in_array($this->role, ['Utilisateur', 'Responsable']);
    }
    // $user->is_admin_or_less
    public function _getIsAdminOrLess() {
        return in_array($this->role, ['Utilisateur', 'Responsable', 'Administration']);
    }
    /*
    // $user->is_adminplus_or_less
    public function _getIsAdminplusOrLess() {
        return in_array($this->role, ['Utilisateur', 'Responsable', 'Administration', 'Administration Plus']);
    }
    */
    
    /*
     * $user->canManageMatos($matos) : bool
     * 
     * @return true si l'utilisateur peut gérer $matos, false sinon
     * 
     * Un utilisateur peut "gérer" (éditer, supprimer) un matériel existant ssi :
     * - a) il est au moins ADMIN
     * ou
     * - b) le matériel lui "appartient" (il en est l'utilisateur ou bien il a créé sa fiche)
     * ou
     * - c) il est RESPONSABLE et est du même groupe que le matériel
     */
    public function canManageMatos(Materiel $m) {
        // a)
        if ($this->is_admin_or_more) return true;
        // b)
        if ($this->ownsMatos($m)) return true;
        // c)
        return $this->is_resp && $this->isSameGroupAsMatos($m);
        //return $this->isSameGroupAsMatos($m);
    }
    public function ownsMatos(Materiel $m) {
        return in_array($this->nom, [$m->nom_createur, $m->nom_responsable]);
    }
    public function isSameGroupAsMatos(Materiel $m) {
        $samegroup1 = $m->groupes_metier_id!=null && $m->groupes_metier_id==$this->groupes_metier_id;
        $samegroup2 = $m->groupes_thematique_id!=null && $m->groupes_thematique_id==$this->groupes_thematique_id;
        return $samegroup1 || $samegroup2;
    }
    
}