diff --git a/README.md b/README.md index d25e15b..a5f6df5 100644 --- a/README.md +++ b/README.md @@ -44,22 +44,19 @@ Logiciel testé et validé sur les configurations suivantes : VERSION ACTUELLE -Date: 03/07/2020 -Version: 3.7.9.55 +Date: 07/07/2020 +Version: 3.7.9.56 Author: EP Commentaire: - - Fichier LICENSE (AGPL) - - Conditions d'utilisation à accepter lors de l'installation - - script ./INSTALLATION - - Mode "nolimit" dans la config ("Superadmin a tous les droits", depuis menu Tools) - - Ajout d'un "alias" pour décrire chaque action de chaque controleur - - - Amélioration page /pages/acls - - Tests génériques automatiques pour (presque) toutes les actions de (presque) tous les controleurs principaux (Materiels, Suivis, Emprunts, Users) mais aussi du controleur "quelconque" SurCategories (pour vérifier que ça marche aussi !!!) - - Dans ces tests génériques, on teste non seulement qu'une action s'exécute seulement quand elle y est autorisée, mais aussi qu'elle s'exécute correctement (au moins pour les actions CRUD : add,edit,delete...) - - Le nombre total de tests (en ajoutant ces tests automatiques) monte à 220 !! - - ... - + - Materiel : technique ou/et inventoriable => trop compliqué et inutile => en fait c’est un OUX (exclusif) + => simplifier en ne gardant qu'UNE SEULE case à cocher qui s'appelle "materiel technique". + => Si cette case n'est pas cochée, le prix doit alors être supérieur à 1000E + => par contre, on garde quand même le champ ds la BD au cas où. + - Colorisation selon statut du matériel : + CREATED => bleu + VALIDATED => vert + TBA => orange + ARCHIVED => rouge IMPORTANT : - Pour connaitre la version actuelle, taper "./VERSION" @@ -97,8 +94,13 @@ La liste ci-dessous est aussi en ligne ici : https://tinyurl.com/labinvent#headi ----------------------------------------------------------------------------------------------------------- VERSION ACTUELLE -06/07/2020 v3.7.9.54 (EP) +06/07/2020 v3.7.9.54-55 (EP) - Bugfix test SurCategories : marche maintenant sur php5 et php7 + - Fichier LICENSE (AGPL) + - Conditions d'utilisation à accepter lors de l'installation + - script ./INSTALLATION + - Mode "nolimit" dans la config ("Superadmin a tous les droits", depuis menu Tools) + - Ajout d'un "alias" pour décrire chaque action de chaque controleur 03/07/2020 v3.7.9.53 (EP) - Bugfix Emprunts calcul sur les dates pourri : on utilise maintenant FrozenDate et FrozenTime de cakephp au lieu de DateTime de php diff --git a/src/Model/Table/MaterielsTable.php b/src/Model/Table/MaterielsTable.php index 6d89388..a06fee7 100755 --- a/src/Model/Table/MaterielsTable.php +++ b/src/Model/Table/MaterielsTable.php @@ -293,10 +293,7 @@ class MaterielsTable extends AppTable return $validator; } - public function checkStatus($check) - { - return ($check !== null && in_array($check, $this->ALL_STATUS)); - } + public function checkStatus($check) { return ($check !== null && in_array($check, $this->ALL_STATUS)); } /** * Returns a rules checker object that will be used for validating @@ -308,15 +305,19 @@ class MaterielsTable extends AppTable */ public function buildRules(RulesChecker $rules) { - $configuration = TableRegistry::get('Configurations')->find() + //$configuration = TableRegistry::get('Configurations')->find() + /* + $configuration = TableRegistry::getTableLocator()->get('Configurations')->find() ->where([ 'id =' => 1 ])->first(); - + */ + $this->config = TableRegistry::getTableLocator()->get('Configurations')->get(1); /* * CONTROLE de la cohérence des champs materiel_administratif et materiel_technique */ + /* $checkAtLeastOneChecked = function ($entity) { return ($entity->materiel_administratif || $entity->materiel_technique); }; @@ -337,19 +338,24 @@ class MaterielsTable extends AppTable ->first(); return ! ($entity->prix_ht !== null && $entity->prix_ht < $configuration->prix_inventaire_administratif && $entity->materiel_administratif); }; + */ // return if checked as "administratif" price MUST be set $checkPriceIfIsAdministratif = function ($entity) { - if ($entity->materiel_administratif) - return ($entity->prix_ht !== null); + //if ($entity->materiel_administratif) + if (! $entity->materiel_technique) + return ($entity->prix_ht >= $this->config->prix_inventaire_administratif); // 1000€ pour l'IRAP + //return ($entity->prix_ht !== null); return true; }; + /* $rules->add($checkAtLeastOneChecked, [ 'errorField' => 'materiel_administratif', 'message' => 'Le matériel est obligatoirement inventoriable ou technique.' ]); $rules->add($checkAtLeastOneChecked, [ 'errorField' => 'materiel_technique', - 'message' => 'Le matériel est obligatoirement inventoriable ou technique.' + //'message' => 'Le matériel est obligatoirement inventoriable ou technique.' + 'message' => "Si le matériel n'est pas technique, son prix doit obligatoirement être supérieur à 1000€" ]); $rules->add($checkIfIsAdministratifWhenShouldBe, [ 'errorField' => 'materiel_administratif', @@ -359,9 +365,16 @@ class MaterielsTable extends AppTable 'errorField' => 'materiel_administratif', 'message' => 'Le matériel vaut moins de ' . $configuration->prix_inventaire_administratif . '€ HT, il n\'est donc pas inventoriable.' ]); + */ $rules->add($checkPriceIfIsAdministratif, [ 'errorField' => 'prix_ht', - 'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix' + //'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix' + 'message' => "Si le matériel n'est pas technique, son prix doit obligatoirement être supérieur à 1000€ (inventoriable)" + ]); + $rules->add($checkPriceIfIsAdministratif, [ + 'errorField' => 'materiel_technique', + //'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix' + 'message' => "Si le matériel n'est pas technique, son prix doit obligatoirement être supérieur à 1000€ (inventoriable)" ]); $rules->add($rules->isUnique([ diff --git a/src/Template/Materiels/add_edit.ctp b/src/Template/Materiels/add_edit.ctp index 94e7626..d2e8934 100644 --- a/src/Template/Materiels/add_edit.ctp +++ b/src/Template/Materiels/add_edit.ctp @@ -451,7 +451,7 @@ if (isset($cpMateriel)) { // - Technique et/ou Inventoriable ? echo $this->Form->control('materiel_technique', [ - 'label' => 'Technique', + 'label' => "Technique (pas pour l'inventaire officiel)", // ADD only //'default' => $Mat_technique 'default' => $materiel->materiel_technique, @@ -459,6 +459,7 @@ if (isset($cpMateriel)) { 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_technique', $myReadonlyFields) ]); echo "\n"; + /* echo $this->Form->control('materiel_administratif', [ 'label' => 'Inventoriable (>' . $configuration->prix_inventaire_administratif . '€)', // ADD only @@ -467,6 +468,7 @@ if (isset($cpMateriel)) { // EDIT only 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_administratif', $myReadonlyFields) ]); + */ // - Metrologie //if ($configuration->metrologie == '1') { diff --git a/src/Template/Materiels/index.ctp b/src/Template/Materiels/index.ctp index feeb07a..6a26613 100644 --- a/src/Template/Materiels/index.ctp +++ b/src/Template/Materiels/index.ctp @@ -21,7 +21,7 @@ $materiels = $materiels; $configuration = $configuration; // Uniquement quand un statut est sélectionné (pour filtrer) -if (isset($SELECTED_STATUS)) $SELECTED_STATUS = $SELECTED_STATUS; +$SELECTED_STATUS = isset($SELECTED_STATUS) ? $SELECTED_STATUS : null; // TODO: yena plein d'autres // ... @@ -57,34 +57,33 @@ $displayElement = $displayElement; $dateProchainControleVerif = $dateProchainControleVerif; $echoActionButton = $echoActionButton; -?> +// @TODO : get from Configurations +$METRO=false; -
Couleur : bleu=créé ; vert=validé ; orange=à sortir ; rouge=archivé (couleur date rouge = fin garantie)
"; +}; + + + +$displayActionButtonsForMateriel = function($materiel, $username, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, $controller, $html) { + + // TODO: Dans l'idéal, ces variables doivent etre définies par le controleur et passées à la vue + // (sous forme d'un tableau contenant ces droits pour CHAQUE materiel) + // Car la vue doit être la moins "intelligente" possible, la plus simple possible + $IS_CREATED = ($materiel->status == 'CREATED'); + $IS_VALIDATED = ($materiel->status == 'VALIDATED'); + $IS_TOBEARCHIVED = ($materiel->status == 'TOBEARCHIVED'); + $IS_ARCHIVED = ($materiel->status == 'ARCHIVED'); + /* + * Couleurs en fonction du statut du matos + * + */ + // CREATED => bleu + if ($IS_CREATED) $color = 'blue'; + // VALIDATED => vert + if ($IS_VALIDATED) $color = 'green'; + // TBA => orange + if ($IS_TOBEARCHIVED) $color = 'orange'; + // ARCHIVED => rouge + if ($IS_ARCHIVED) $color = 'red'; + $color = "style='color: $color'"; + + $USER_IS_CREATOR_OR_OWNER = in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]); + $USER_IS_SAME_GROUP_AS_MATERIEL = ( + ( isset($priviledgedUser->groupes_metier_id) && $priviledgedUser->groupes_metier_id!=$idGmNa && $materiel->groupes_metier_id==$priviledgedUser->groupes_metier_id ) + || + ( isset($priviledgedUser->groupes_thematique_id) && $priviledgedUser->groupes_thematique_id!=$idGtNa && $materiel->groupes_thematique_id==$priviledgedUser->groupes_thematique_id ) + ); + $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL = $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL; + $CONTEXT1 = $USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL; + + // Détermination des autorisations pour tous les boutons "éditer", "supprimer", "valider", ... + $id = $materiel->id; + + $CAN_EDIT = $controller->isAuthorizedAction('edit', $id); + //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL); + //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER); + + $CAN_DELETE = $controller->isAuthorizedAction('delete', $id); + //$CAN_DELETE = $CAN_EDIT; + + /* + $CAN_VALIDATE_OR_INVALIDATE = $USER_IS_ADMIN_OR_MORE || ( ($materiel->materiel_administratif == 0) && $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL ); + $CAN_VALIDATE = $IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; + $CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; + $CAN_TBA = $IS_VALIDATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)); + $CAN_ARCHIVE = $IS_TOBEARCHIVED && $CAN_VALIDATE_OR_INVALIDATE; + */ + $CAN_INVALIDATE = $controller->isAuthorizedAction('statusCreated', $id); + $CAN_VALIDATE = $controller->isAuthorizedAction('statusValidated', $id); + $CAN_TBA = $controller->isAuthorizedAction('statusTobearchived', $id); + $CAN_ARCHIVE = $controller->isAuthorizedAction('statusArchived', $id); + + echo ''; +echo $this->Html->link(' Nouveau Matériel', [ + 'action' => 'add' +], [ + 'title' => 'Ajouter un matériel', + 'escape' => false ]); -?> -
= __('') ?> | = $this->Paginator->sort('designation','Désignation') ?> | = $this->Paginator->sort('numero_laboratoire', 'N° interne (labo)') ?> | @@ -217,171 +478,45 @@ if ($nbMateriels > 0) { // Pour changer la couleur du nom du matos si la garantie est passée $time = Time::now(); // On récupère la date et l'heure actuelles $today = new date("$time->year-$time->month-$time->day"); // On extrait la date pour la vérification de fin de garantie - $today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231 + //$today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231 + $today = $today->format('Ymd'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231 // BOUCLE SUR CHAQUE MATERIEL, ligne par ligne //$mc = new MaterielsController(); foreach ($materiels as $materiel) : - // TODO: Dans l'idéal, ces variables doivent etre définies par le controleur et passées à la vue - // (sous forme d'un tableau contenant ces droits pour CHAQUE materiel) - // Car la vue doit être la moins "intelligente" possible, la plus simple possible - $IS_CREATED = ($materiel->status == 'CREATED'); - $IS_VALIDATED = ($materiel->status == 'VALIDATED'); - $IS_TOBEARCHIVED = ($materiel->status == 'TOBEARCHIVED'); - $IS_ARCHIVED = ($materiel->status == 'ARCHIVED'); - $USER_IS_CREATOR_OR_OWNER = in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]); - $USER_IS_SAME_GROUP_AS_MATERIEL = ( - ( isset($priviledgedUser->groupes_metier_id) && $priviledgedUser->groupes_metier_id!=$idGmNa && $materiel->groupes_metier_id==$priviledgedUser->groupes_metier_id ) - || - ( isset($priviledgedUser->groupes_thematique_id) && $priviledgedUser->groupes_thematique_id!=$idGtNa && $materiel->groupes_thematique_id==$priviledgedUser->groupes_thematique_id ) - ); - $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL = $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL; - $CONTEXT1 = $USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL; - - // Détermination des autorisations pour tous les boutons "éditer", "supprimer", "valider", ... - $id = $materiel->id; - - $CAN_EDIT = $controller->isAuthorizedAction('edit', $id); - //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL); - //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER); - - $CAN_DELETE = $controller->isAuthorizedAction('delete', $id); - //$CAN_DELETE = $CAN_EDIT; - - /* - $CAN_VALIDATE_OR_INVALIDATE = $USER_IS_ADMIN_OR_MORE || ( ($materiel->materiel_administratif == 0) && $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL ); - $CAN_VALIDATE = $IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; - $CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; - $CAN_TBA = $IS_VALIDATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)); - $CAN_ARCHIVE = $IS_TOBEARCHIVED && $CAN_VALIDATE_OR_INVALIDATE; - */ - $CAN_INVALIDATE = $controller->isAuthorizedAction('statusCreated', $id); - $CAN_VALIDATE = $controller->isAuthorizedAction('statusValidated', $id); - $CAN_TBA = $controller->isAuthorizedAction('statusTobearchived', $id); - $CAN_ARCHIVE = $controller->isAuthorizedAction('statusArchived', $id); - // Date fin garantie ? - + $date_color = ''; if ($materiel->date_fin_garantie !== NULL) { + //debug("today $today"); $timeFin = new time($materiel->date_fin_garantie); $dateFin = new date("$timeFin->year-$timeFin->month-$timeFin->day"); - $dateFin = $dateFin->format('Ydm'); + //$dateFin = $dateFin->format('Ydm'); + $dateFin = $dateFin->format('Ymd'); + //debug("datefin $dateFin"); + if ($today>=$dateFin) $date_color = 'style="color: #FF0000"'; + //debug("couleur $date_color"); } - if ($materiel->date_fin_garantie !== NULL) - $styleLien = ($today >= $dateFin) ? 'style="color: #FF0000"' : ''; - else - $styleLien = ''; ?> - -||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
' . $this->Form->checkbox($materiel->id, [ 'style' => 'margin: 3px', 'id' => $materiel->id ]) . ' | '; } - ?> - - -- status, [ - 'CREATED', - // (EP 17/5/19) ben non, on peut pas si c'est validé !!! - //'VALIDATED' - ]) - && - ( - $USER_IS_ADMIN_OR_MORE - || - $USER_IS_CREATOR_OR_OWNER - || - ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL) - ) - ) - */ - if ($CAN_EDIT) echo $this->Html->link(__(''), ['action' => 'edit', $materiel->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]); - - // 2) VALIDER/TBA/ARCHIVER icon - /* - if ( - $USER_IS_ADMIN - || - ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL) - ) { - */ - //if ($materiel->status=='CREATED' && !$USER_IS_RESPONSABLE) { - if ($CAN_VALIDATE) - echo $this->Html->link('', [ - 'action' => 'statusValidated', - $materiel->id - ], [ - 'title' => 'Valider', - 'style' => 'margin: 0 2px', - 'escape' => false, - 'confirm' => 'Êtes-vous sur de vouloir valider ' . $materiel->designation . ' ?' - ]); - - //else if (h($materiel->status) == 'VALIDATED') { - if ($CAN_TBA) - echo $this->Html->link('', [ - 'action' => 'statusTobearchived', - $materiel->id - ], [ - 'title' => 'Demander la sortie de l\'inventaire', - 'style' => 'margin: 0 2px', - 'escape' => false, - 'confirm' => 'Êtes-vous sur de vouloir faire une demande d\'archive ' . $materiel->designation . ' ?' - ]); - - //else if ($materiel->status=='TOBEARCHIVED' && !$USER_IS_RESPONSABLE) - if ($CAN_ARCHIVE) - echo $this->Html->link('', [ - 'action' => 'statusArchived', - $materiel->id - ], [ - 'title' => 'Sortir de l\'inventaire', - 'style' => 'margin: 0 2px', - 'escape' => false, - 'confirm' => 'Êtes-vous sur de vouloir archiver ' . $materiel->designation . ' ?' - ]); - - // 3) DELETE icon - /* - if (h($materiel->status) == 'CREATED') { - if ( - $USER_IS_ADMIN_OR_MORE - || - $USER_IS_CREATOR_OR_OWNER - || - ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL) - ) - */ - if ($CAN_DELETE) - echo $this->Html->link(__(''), [ - 'action' => 'delete', - $materiel->id - ], [ - 'title' => 'Supprimer', - 'style' => 'margin: 0 2px', - 'escape' => false, - 'confirm' => __('Êtes-vous sur de vouloir supprimer {0} ?', $materiel->designation) - ]); + // + $color = $displayActionButtonsForMateriel($materiel, $username, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, $controller, $this->Html); ?> - | - + -= $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id],[$styleLien]) : '' ?> | += $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id],[$color]) : '' ?> | = h($materiel->numero_laboratoire) ?> | = ($materiel->hors_service) ? 'HS' : '' ?> | = $materiel->has('category') ? h($materiel->category->nom) : '' ?> | @@ -409,21 +544,21 @@ if ($nbMateriels > 0) { break; } ?> -= $statut ?> | +>= $statut ?> | -= h($materiel->date_acquisition) ?> | -= h($materiel->etiquette)=='1' ? 'Y':'N' ?> | +>= h($materiel->date_acquisition) ?> | += h($materiel->etiquette)=='1' ? 'Y':'N' ?> | - '. (h($materiel->metrologie)=='1' ? 'Y':'N').''; - ?> + '. (h($materiel->metrologie)=='1' ? 'Y':'N').''; + ?>