Materiel.php 8.77 KB
<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;

/**
 * Materiel Entity.
 *
 * @property int $id
 * @property string $designation
 * @property int $sur_categorie_id
 * @property \App\Model\Entity\SurCategory $sur_category
 * @property int $categorie_id
 * @property \App\Model\Entity\Category $category
 * @property int $sous_categorie_id
 * @property \App\Model\Entity\SousCategory $sous_category
 * @property string $numero_laboratoire
 * @property string $description
 * @property bool $materiel_administratif
 * @property bool $materiel_technique
 * @property string $status
 * @property \Cake\I18n\Time $date_acquisition
 * @property float $prix_ht
 * @property string $eotp
 * @property string $numero_commande
 * @property string $code_comptable
 * @property string $numero_serie
 * @property int $groupes_thematique_id
 * @property \App\Model\Entity\GroupesThematique $groupes_thematique
 * @property int $groupes_metier_id
 * @property \App\Model\Entity\GroupesMetier $groupes_metier
 * @property string $numero_inventaire_organisme
 * @property string $numero_inventaire_old
 * @property \Cake\I18n\Time $date_archivage
 * @property bool $etiquette
 * @property string $lieu_detail
 * @property string $nom_responsable
 * @property string $email_responsable
 * @property string $nom_createur
 * @property string $nom_modificateur
 * @property \Cake\I18n\Time $created
 * @property \Cake\I18n\Time $modified
 * @property \Cake\I18n\Time $date_fin_garantie
 * @property int $duree_garantie
 * @property string $unite_duree_garantie
 * @property \Cake\I18n\Time $date_reception
 * @property int $organisme_id
 * @property \App\Model\Entity\Organisme $organisme
 * @property int $site_id
 * @property int $photo_id
 * @property bool $hors_service
 * @property \App\Model\Entity\Site $site
 * @property \App\Model\Entity\Document[] $documents
 * @property \App\Model\Entity\Emprunt[] $emprunts
 * @property \App\Model\Entity\Suivi[] $suivis
 * @property int $fournisseur_id
 * @property \App\Model\Entity\Fournisseur $fournisseur
 * @property bool $metrologie
 */
class Materiel 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
    ];
    
    // Ce qui s'affiche quand on fait echo $entity
    public function __toString() { return $this->designation; }
    
    // (EP 20200504)
    // Propriétés virtuelles (attributs virtuels de l'entité matériel)
    // A utiliser dans le controleur ainsi : $materiel->is_created
    //public function isCreated() { return $this->status == 'CREATED'; }
    //protected function _getIsCreated() { return $this->_fields['status'] == 'CREATED'; }
    protected function _getIsCreated() { return $this->status == 'CREATED'; }
    //return $this->status == 'CREATED';
    protected function _getIsValidated() { return $this->status == 'VALIDATED'; }
    //protected function _getIsValidated() { return $this->_fields['status'] == 'VALIDATED'; }
    //public function is_tobearchived() { return $this->status == 'TOBEARCHIVED'; }
    protected function _getIsTobearchived() { return $this->status == 'TOBEARCHIVED'; }
    protected function _getIsArchived() { return $this->status == 'ARCHIVED'; }
    
    // Ce matériel est utilisé ou déclaré par l'utilisateur $userfullname
    // is Owned Or Declared By User
    // fullname = "Pallier Etienne"
    //public function isUsedOrCreatedByUser($user) {
    //public function isOwnedOrDeclaredByUser($username) { 
    public function belongsToUser($userfullname) {
        return in_array($userfullname, [$this->nom_createur, $this->nom_responsable]);
    }
    
    // Ce matériel a le même groupe que l'un de ceux de l'utilisateur courant
    public function isSameGroupAsUser($user_group_metier_id, $user_group_thematique_id) {
        // Responsable groupe métier ?
        //if ($this->groupes_metier_id==null && $this->groupes_thematique_id==null) return false;
        //if ($user_group_metier_id==null && $user_group_thematique_id==null) return false;
        $samegroup1 = $this->groupes_metier_id!=null && $this->groupes_metier_id==$user_group_metier_id;
        $samegroup2 = $this->groupes_thematique_id!=null && $this->groupes_thematique_id==$user_group_thematique_id;
        return $samegroup1 || $samegroup2;
    } // isSameGroupAsUser
    
    /*
     * @return true si ce matériel peut être "géré" par l'utilisateur $u, 
     * en autorisant systématiquement à partir du role $from_role
     * (false sinon)
     *
     * Un utilisateur peut "gérer" (éditer, supprimer) un matériel existant ssi :
     * - a) il a au moins le profil $from_role (ADMIN, SUPERADMIN)
     * 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
     */
    // Par défaut, autorisé à partir du profil utilisateur ADMIN ($role)
    public function isManageableByUserOrFromRole(User $u, $from_role='admin') {
        /*
         debug("utilisateur1:");
         debug($u);
         if (is_array($u)) $u = new User($u);
         debug("utilisateur2:");
         debug($u);
         */
        // a)
        if ($from_role=='admin' && $u->is_admin_or_more) return true;
        if ($from_role=='super' && $u->is_super) return true;
        // b)
        if ($this->belongsToUser($u->nom)) return true;
        //if ($u->ownsMatos($this)) return true;
        // c)
        $res = $u->is_resp && $this->isSameGroupAsUser($u->groupes_metier_id, $u->groupe_thematique_id);
        return $res;
        //return $u->is_resp && $this->isSameGroupAsUser($u->groupes_metier_id, $u->groupe_thematique_id);
        //return $this->isSameGroupAsMatos($m);
    }
    
    //@return true si ce matériel peut être "géré" par l'utilisateur $u, false sinon
    public function isManageableByUser(User $u) { return $this->isManageableByUserOrFromRole($u, 'admin'); }
    
    // Ce matériel peut être PRÊTÉ par $u
    // ATTENTION AU SENS : On ne regarde pas si $u peut EMPRUNTER, mais s'il peut PRETER (c'est pas pareil)
    public function canBeLentByUser(User $u) { return $this->is_validated && $this->isManageableByUserOrFromRole($u, 'super'); }
    //public function isLendableByUser(User $u) { return $this->isManageableByUserFromRole($u, 'super'); }
    
    // L'utilisateur $u peut créer un "suivi" de ce matériel
    // Même conditions que pour le prêt
    public function canBeSuiviByUser(User $u) { return $this->canBeLentByUser($u); }
        //return $m->is_validated && $this->isManageableByUserOrFromRole($u, 'super'); 

    public function canDeleteSuiviByUser(User $u) { return $this->isManageableByUserOrFromRole($u, 'super'); }
    //public function canDeleteSuiviByUser(User $u) { return $this->isManageableByUserOrFromRole($u, 'admin'); }
    
    
    /* 14/1/19 bake autogenerated:
    protected $_accessible = [
        'designation' => true,
        'sur_categorie_id' => true,
        'categorie_id' => true,
        'sous_categorie_id' => true,
        'numero_laboratoire' => true,
        'description' => true,
        'materiel_administratif' => true,
        'materiel_technique' => true,
        'status' => true,
        'date_acquisition' => true,
        'prix_ht' => true,
        'eotp' => true,
        'numero_commande' => true,
        'code_comptable' => true,
        'numero_serie' => true,
        'groupes_thematique_id' => true,
        'groupes_metier_id' => true,
        'numero_inventaire_organisme' => true,
        'numero_inventaire_old' => true,
        'date_archivage' => true,
        'etiquette' => true,
        'lieu_detail' => true,
        'nom_responsable' => true,
        'email_responsable' => true,
        'gestionnaire_id' => true,
        'nom_createur' => true,
        'nom_modificateur' => true,
        'created' => true,
        'modified' => true,
        'date_reception' => true,
        'organisme_id' => true,
        'site_id' => true,
        'date_fin_garantie' => true,
        'duree_garantie' => true,
        'unite_duree_garantie' => true,
        'hors_service' => true,
        'photo_id' => true,
        'metrologie' => true,
        'fournisseur_id' => true,
        'sur_category' => true,
        'category' => true,
        'sous_category' => true,
        'groupes_thematique' => true,
        'groupes_metier' => true,
        'organisme' => true,
        'site' => true,
        'documents' => true,
        'emprunts' => true,
        'suivis' => true,
        'fournisseur' => true,
        'user' => true
    ];
    */
    
}