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

use Cake\ORM\Entity;
use App\Model\Table\MaterielsTable;

// Max 15 ans entre 2 dates
const MAX_DIFF_YEARS = 15;

/**
 * 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_archived
 * @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 {

    // Si DEBUG, affiche plus d'infos
    //private $DEBUG=true;
    private $DEBUG=false;
    
    /**
     * 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
    ];
    
    
    public function d($msg) {
        if ($this->DEBUG) pr($msg);
    }
    
    // Ce qui s'affiche quand on fait echo $entity
    public function __toString() { return $this->designation; }
    
    public function check_date_is_not_too_old($date_field_name) {
        $d = $this->$date_field_name;
        if (is_null($d)) return true;
        // today - 50 ans = trop vieux !
        /* Avec TZ
        $tz = new \DateTimeZone('Europe/Paris');
        $date_too_old = new \DateTime('-50 years',$tz);
        */
        // Sans TimeZone (car inutile à ce niveau je crois)
        $date_too_old = new \DateTime('-50 years');
        return $d > $date_too_old;
    }
    public function check_date_is_not_future($date_field_name) {
        $d = $this->$date_field_name;
        $today = new \DateTime('now');
        return $d <= $today;
    }
    
    // date_reception >= date_acquisition et aussi date_fin_garantie >= date_reception
    public function check_date_d2_gt_d1_but_not_too_much($d2_name,$d1_name) {
        $d2 = $this->$d2_name;
        $d1 = $this->$d1_name;
        //debug("d2:"); debug($d2);
        //debug("d1:"); debug($d1);
        // Si une des 2 dates est nulle => return true
        if (!$d2 || !$d1) return true;
        /*
        $tz = new \DateTimeZone('Europe/Paris');
        //date_default_timezone_set('Europe/Paris');
        // DateTime lit les dates au format JJ-MM-YYYY (et non pas JJ/MM/YYYY)
        //$d1 = ( new \DateTime(strtr($entity->date_acquisition,'/','-'),$tz) )->format('Ymd');
        $d1 = new \DateTime(strtr($d1,'/','-'),$tz);
        //$d1_text = $d1->format('Ymd');
        $d2 = new \DateTime(strtr($d2,'/','-'),$tz);
        */
        //$d2_text = $d2->format('Ymd');
        //$today = (new \DateTime('now',$tz))->format('Ymd');
        //$ok = ($d2_text >= $d1_text);
        if ($d2 < $d1) return false;
        // $d2 > $d1 oui mais pas trop...
        $diff = $d2->diff($d1);
        //debug($diff->y); 
        return $diff->y < MAX_DIFF_YEARS;
        //return true;
    }

    public function hasDevis() {
        //debug($this->documents);
        foreach ($this->documents as $document)
            if ($document->is_devis) return true;
        // par défaut, faux
        return false; 
    }
    
    protected function hasStatus($status) { return $this->status == $status; }

    // (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 _getIsTobeordered() { return $this->status == 'TOBEORDERED'; }
    protected function _getIsValidated() { return $this->status == 'VALIDATED'; }
    protected function _getIsValidatedOrMore() { return in_array($this->status, ['VALIDATED', 'TOBEARCHIVED', 'ARCHIVED']); }
    //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'; }

    public function getNiceStatus() { return MaterielsTable::getNiceStatus($this->status); }
    /*
    public function getNiceStatus() { 
        //if ($this->is_created) return 'À VALIDER';
        if ($this->is_created) return 'CRÉÉ - à valider';
        if ($this->is_tobeordered) return 'EN COMMANDE - à valider';
        if ($this->is_validated) return 'VALIDÉ - livré & payé';
        if ($this->is_tobearchived) return 'À SORTIR';
        //if ($this->is_archived) 
        return 'ARCHIVÉ';
    }
    */
    
    
    // Ce matériel est utilisé ou déclaré par l'utilisateur $userfullname
    // is Owned Or Declared By User
    // fullname = "Pallier Etienne" (= champ "nom" du user : $user->nom)
    //public function isUsedOrCreatedByUser($user) {
    //public function isOwnedOrDeclaredByUser($username) { 
    public function belongsToUser($userfullname) {
        //debug("userfullname is $userfullname");
        $res = in_array($userfullname, [$this->nom_createur, $this->nom_responsable]);
        //$this->d("$userfullname in [ $this->nom_createur, $this->nom_responsable ] ? ".(int)$res);
        return $res;
    }
    
    // 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->groupes_thematique_id);
        return $res;
        //return $u->is_resp && $this->isSameGroupAsUser($u->groupes_metier_id, $u->groupes_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'); }
    
    public function isDeleteableByUser(User $u) {
        // on autorise ADMIN(+) à supprimer un matos archivé
        if ($u->is_admin_or_more && $this->is_archived) return true;
        // sinon, règle par défaut
        return $this->is_created && $this->isManageableByUserOrFromRole($u, 'super'); 
    }

    // 'edit' et 'add' by copy
    public function isEditableOrCopiableByUser(User $u) {
        return $this->is_created && $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
    ];
    */
    
}