Commit 1b901ee925d5f91d624bd52b29f60d24c7a71712

Authored by Etienne Pallier
1 parent 087b29e7
Exists in master and in 1 other branch dev

Refactorisation et Bugfixes

- (i) Refactorisation : Vue "index" de l'entité "Stats" désormais
générique

- (b) Bugfix : nouveau champ "resp_credit" ajouté dans BD (il avait été
oublié depuis longtemps...)
		=> du coup, ce champ n'était pas enregistré !!!
- (i) champ "budgets" désormais optionnel dans BD (il était obligatoire,
pas cool)

=> (A) Attention: Mettre à jour la BD !

v5.2.24-3.7.9
CHANGELOG
... ... @@ -435,8 +435,7 @@ Par contre, ok avec FPDF
435 435 - (pas emprunt ni suivi)
436 436  
437 437  
438   - *)
439   - champ "budgets" à rendre optionnel dans schéma BD...
  438 +
440 439  
441 440 *)
442 441 validation (=livré ET payé)
... ... @@ -479,6 +478,12 @@ Deprecated (16384): Plugin::bootstrap() is deprecated. This method will be remov
479 478 You can disable deprecation warnings by setting `Error.errorLevel` to `E_ALL & ~E_USER_DEPRECATED` in your config/app.php. [CORE/src/Core/functions.php, line 311]
480 479  
481 480  
  481 +Strict (2048): Non-static method App\Model\Table\AppTable::isValidRole() should not be called statically [APP/Model/Table/MaterielsTable.php, line 296]
  482 +
  483 +Warning (2): Cannot modify header information - headers already sent by (output started at /var/www/html/inventirap-test1/vendor/cakephp/cakephp/src/Error/Debugger.php:853) [APP/Template/Layout/default.ctp, line 43]
  484 +
  485 +
  486 +
482 487  
483 488  
484 489  
... ... @@ -502,16 +507,20 @@ Deprecated (16384): Plugin::bootstrap() is deprecated. This method will be remov
502 507  
503 508 TODO :
504 509  
  510 +
505 511 - resp_credit non modifiable ??? (sur inventirap.irap)
506 512 - (b) bugfix champ "responsable crédit" non enregistré (modif perdue) !!!
507 513 + valider fiche hyp2
508 514  
  515 +- ProjetsController minimaliste, doit juste étendre AppController avec un minimum de changement
509 516  
510 517 - projets/index generic
511 518 - emprunts/index generic
512 519 - stats/index generic
513 520 - users/index generic
514 521  
  522 +- add_or_edit() générique
  523 +
515 524 - fusionner elem/button_add_edit et MyHelper echoActionButton...
516 525 (ne garder que elem/)
517 526 - séparer elem/button_add, button_edit, button_delete, et button_tout_court (générique)
... ... @@ -521,6 +530,16 @@ TODO :
521 530  
522 531 ======= CHANGES =======
523 532  
  533 +- un champ obligatoire VIDE doit pouvoir être renseigné !
  534 +
  535 +-------
  536 +08/11/2021 v5.2.24-3.7.9
  537 + - (i) Refactorisation : Vue "index" de l'entité "Stats" désormais générique
  538 + - (b) Bugfix : nouveau champ "resp_credit" ajouté dans BD (il avait été oublié depuis longtemps...)
  539 + => du coup, ce champ n'était pas enregistré !!!
  540 + - (i) champ "budgets" désormais optionnel dans BD (il était obligatoire, pas cool)
  541 + => (A) Attention: Mettre à jour la BD !
  542 +
524 543 -------
525 544 05/11/2021 v5.2.23-3.7.9
526 545 - GROSSE REFACTORISATION => vues et actions génériques
... ...
README.md
... ... @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes :
52 52  
53 53 --------------------------------------------------------------------------------------------
54 54  
55   -Date: 05/11/2021
56   -Version: v5.2.23-3.7.9
  55 +Date: 08/11/2021
  56 +Version: v5.2.24-3.7.9
57 57  
58 58  
59 59 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
... ...
database/update/script_sql/db-update-2021-11-08.sql 0 → 100755
... ... @@ -0,0 +1,9 @@
  1 +-- use database;
  2 +
  3 +
  4 +-- Ajout champ "resp_credit" dans table "materiels"
  5 +-- Ce champ avait été oublié depuis un certain temps...
  6 +
  7 +ALTER TABLE materiels ADD resp_credit VARCHAR(50) NULL DEFAULT NULL AFTER email_responsable;
  8 +
  9 +ALTER TABLE materiels CHANGE budgets budgets VARCHAR(45) NULL DEFAULT NULL;
... ...
src/Controller/AppController.php
... ... @@ -2142,7 +2142,13 @@ class AppController extends Controller
2142 2142 * @return \Cake\Network\Response|null
2143 2143 * TODO: à terminer...
2144 2144 */
2145   - public function index_generic($entity_plural, $fields_names=[], $contained_controllers=null)
  2145 + public function index_generic(
  2146 + $entity_plural,
  2147 + $fields_names=[], $contained_controllers=null,
  2148 + $HAS_ADD_BUTTON=true,
  2149 + $HAS_EDIT_DEL_BUTTONS=true ,
  2150 + $sortBy = null
  2151 + )
2146 2152 {
2147 2153 $controller_name = $this->getName();
2148 2154 //debug($controller_name);
... ... @@ -2153,6 +2159,9 @@ class AppController extends Controller
2153 2159 ];
2154 2160 //$categories = $this->paginate($this->Categories);
2155 2161 $entities = $this->paginate($this->$controller_name);
  2162 + if ($sortBy) $entities = $entities->sortBy($sortBy);
  2163 + // 'order' => array('Tapplicant.AppID' => 'desc'),
  2164 + // $this->Paginator->sort('Hobby.name', 'Hobby');
2156 2165  
2157 2166 // nb entités par page
2158 2167 //debug(count($entities));
... ... @@ -2162,7 +2171,11 @@ class AppController extends Controller
2162 2171  
2163 2172 $CAN_ADD = $this->isAuthorizedActionForCurrentUser('add');
2164 2173  
2165   - $this->set(compact('CAN_ADD', 'entities', 'entity_plural', 'fields_names'));
  2174 + $this->set(compact(
  2175 + 'CAN_ADD',
  2176 + 'entities', 'entity_plural', 'fields_names',
  2177 + 'HAS_EDIT_DEL_BUTTONS', 'HAS_ADD_BUTTON'
  2178 + ));
2166 2179  
2167 2180 // Pas bien..., mais pratique :
2168 2181 // on passe le controleur à la vue index pour qu'elle
... ...
src/Controller/CategoriesController.php
... ... @@ -106,6 +106,7 @@ class CategoriesController extends AppController
106 106 'catégories',
107 107 [
108 108 //'nom'=>['nice_name'=>'Nom'],
  109 + 'nom'=>[],
109 110 'sur_categorie_id'=>['nice_name'=>'Domaine', 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'],
110 111 ],
111 112 ['SurCategories']
... ...
src/Controller/OrganismesController.php
... ... @@ -72,12 +72,11 @@ class OrganismesController extends AppController
72 72 public function index()
73 73 {
74 74 $this->index_generic(
75   - 'organismes'
76   - /*
  75 + 'organismes',
77 76 [
78   - 'nom'=>['nice_name'=>'Nom'],
  77 + //@'nom'=>['nice_name'=>'Nom'],
  78 + 'nom'=>[],
79 79 ]
80   - */
81 80 );
82 81  
83 82 /*
... ...
src/Controller/ProjetsController.php
... ... @@ -31,8 +31,8 @@ class ProjetsController extends AppController {
31 31 */
32 32  
33 33 protected function getRealControllerNameForAlias($alias_name) {
34   - if ($alias_name == 'ChefSciences') return 'Users';
35   - if ($alias_name == 'ChefProjets') return 'Users';
  34 + if ( in_array($alias_name, ['ChefSciences','ChefProjets']) ) return 'Users';
  35 + //if ($alias_name == 'ChefProjets') return 'Users';
36 36 return $alias_name;
37 37 }
38 38  
... ... @@ -43,6 +43,30 @@ class ProjetsController extends AppController {
43 43 */
44 44 public function index()
45 45 {
  46 + /*
  47 + $this->index_generic(
  48 + 'projets',
  49 + [
  50 + //'nom'=>['nice_name'=>'Nom'],
  51 + //'sur_categorie_id'=>['nice_name'=>'Domaine', 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'],
  52 + 'groupes_thematique_id'=>[
  53 + 'nice_name'=>'Groupe thématique',
  54 + 'contained_entity_name'=>'groupes_thematique',
  55 + 'controller_name'=>'GroupesThematiques',
  56 + 'sort_name' => 'GroupesThematiques.nom'
  57 + ],
  58 + 'user_id'=>[
  59 + 'nice_name'=>'Responsable Scientifique',
  60 + 'contained_entity_name'=>'chef_science',
  61 + 'controller_name'=>'ChefSciences',
  62 + 'sort_name' => 'ChefSciences.nom'
  63 + ],
  64 + ],
  65 + ['GroupesThematiques', 'ChefSciences', 'ChefProjets']
  66 + );
  67 + return;
  68 + */
  69 +
46 70 // https://book.cakephp.org/3/fr/controllers/components/pagination.html
47 71 $this->paginate = [
48 72 //'contain' => ['GroupesThematiques', 'Pis', 'Pms']
... ... @@ -70,9 +94,12 @@ class ProjetsController extends AppController {
70 94  
71 95 // Si on est sur l'instance de l'IRAP (InventIrap)
72 96 // on affiche l'url vers la page des Groupes métiers sur le site web de l'IRAP
  97 + /*
73 98 $lab_website_urls = ($this->confLabinvent->labNameShort != 'IRAP') ?
74 99 []
75   - :
  100 + :
  101 + */
  102 + $lab_website_urls =
76 103 [
77 104 'Projets Instrumentaux' => 'https://www.irap.omp.eu/sedoo-project-tag/projets_instrumentaux',
78 105 'Projets Scientifiques' => 'https://www.irap.omp.eu/sedoo-project-tag/projets-scientifiques',
... ...
src/Controller/SitesController.php
... ... @@ -61,7 +61,8 @@ class SitesController extends AppController
61 61 {
62 62  
63 63 $this->index_generic(
64   - 'sites'
  64 + 'sites',
  65 + ['nom'=>[]]
65 66 );
66 67  
67 68 /*
... ...
src/Controller/SousCategoriesController.php
... ... @@ -98,6 +98,7 @@ class SousCategoriesController extends AppController
98 98 'sous-catégories',
99 99 [
100 100 //'nom'=>['nice_name'=>'Nom'],
  101 + 'nom'=>[],
101 102 'categorie_id'=>['nice_name'=>'Catégorie', 'contained_entity_name'=>'category', 'controller_name'=>'Categories'],
102 103 ],
103 104 ['Categories']
... ...
src/Controller/StatsController.php
... ... @@ -12,6 +12,8 @@ use App\Controller\AppController;
12 12 */
13 13 class StatsController extends AppController
14 14 {
  15 +
  16 +
15 17 /**
16 18 * Index method
17 19 *
... ... @@ -19,12 +21,45 @@ class StatsController extends AppController
19 21 */
20 22 public function index()
21 23 {
  24 +
  25 + // Moyenne générale pour le nombre de connexions et le temps de connexion
  26 +
  27 + $connex_nb_tot = 0;
  28 + $connex_dur_tot_tot = 0;
  29 + $stats = $this->Stats->find();
  30 + foreach ($stats as $stat) {
  31 + $connex_nb_tot += $stat->connex_nb;
  32 + $connex_dur_tot_tot += $stat->connex_dur_tot;
  33 + }
  34 + $connex_nb_year_avg = $connex_nb_tot / $stats->count();
  35 + $connex_dur_tot_avg = round($connex_dur_tot_tot / $connex_nb_tot);
  36 + $this->set(compact('connex_nb_year_avg', 'connex_dur_tot_avg'));
  37 +
  38 + $this->index_generic(
  39 + 'statistiques de connexion',
  40 + [
  41 + 'year'=>['nice_name'=>'Année'],
  42 + 'user_id'=>['nice_name'=>'Utilisateur', 'contained_entity_name'=>'user', 'controller_name'=>'Users'],
  43 + 'last_login_time' => [],
  44 + 'last_connex_dur'=>['nice_name'=>'Last connexion duration (h)', 'f'=>'getHourMnSecForDuration'],
  45 + 'last_logout_time'=>[],
  46 + 'connex_dur_tot'=>['nice_name'=>"Temps connexion cumulé (h)", 'f'=>'getHourMnSecForDuration'],
  47 + 'connex_nb'=>['nice_name'=>"Nb connexions"],
  48 + 'connexDurAvg'=>['nice_name'=>"Durée connexion moyenne (sur année)", 'f'=>'getHourMnSecForDuration']
  49 + ],
  50 + ['Users'],
  51 + false, false,
  52 + 'last_login_time'
  53 + );
  54 +
  55 + /*
22 56 $this->paginate = [
23 57 'contain' => ['Users']
24 58 ];
25 59 $stats = $this->paginate($this->Stats)->sortBy('last_login_time');
26 60  
27 61 $this->set(compact('stats'));
  62 + */
28 63 }
29 64  
30 65 /**
... ...
src/Controller/SurCategoriesController.php
... ... @@ -172,6 +172,7 @@ class SurCategoriesController extends AppController
172 172 $this->index_generic(
173 173 'domaines',
174 174 [
  175 + 'nom'=>[],
175 176 //'nom'=>['nice_name'=>'Nom'],
176 177 //'sur_categorie_id'=>['nice_name'=>'Domaine', 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'],
177 178 ]
... ...
src/Controller/TypeDocumentsController.php
... ... @@ -83,7 +83,8 @@ class TypeDocumentsController extends AppController
83 83 public function index()
84 84 {
85 85 $this->index_generic(
86   - 'types de documents'
  86 + 'types de documents',
  87 + ['nom'=>[]]
87 88 );
88 89  
89 90 /*
... ...
src/Controller/TypeSuivisController.php
... ... @@ -79,6 +79,7 @@ class TypeSuivisController extends AppController
79 79 $this->index_generic(
80 80 'types de suivis',
81 81 [
  82 + 'nom'=>[],
82 83 'is_regular'=>['nice_name'=>'Régulier ?'],
83 84 'is_metro'=>['nice_name'=>'Métrologie ?'],
84 85 ]
... ...
src/Model/Entity/Stat.php
... ... @@ -33,4 +33,11 @@ class Stat extends Entity
33 33 'connex_dur' => true,
34 34 'user' => true
35 35 ];
  36 +
  37 +
  38 + // Propriété virtuelle : champ généré par calcul
  39 + // $e->connexDurAvg
  40 + protected function _getConnexDurAvg() {
  41 + return (int)($this->connex_dur_tot / $this->connex_nb);
  42 + }
36 43 }
... ...
src/Model/Table/AppTable.php
... ... @@ -20,7 +20,7 @@ class AppTable extends Table
20 20 // accents + - _ / () . , \s (=space)
21 21 private $chaine = "a-zA-Z0-9éèàùâêôîïôûç%().,\/\s\+\-_'";
22 22  
23   - public function isValidRole($role) { return in_array($role, self::ROLES); }
  23 + public static function isValidRole($role) { return in_array($role, self::ROLES); }
24 24  
25 25 // Check prix > 0
26 26 public function checkPriceIsPositive($prix_ht) {
... ...
src/Template/Common/index_gen.ctp
... ... @@ -21,22 +21,41 @@ $nb_entities = $nb_entities;
21 21 $entities = $entities;
22 22 $entity_plural = $entity_plural;
23 23 $fields_names = $fields_names;
  24 +$HAS_ADD_BUTTON = $HAS_ADD_BUTTON;
  25 +$HAS_EDIT_DEL_BUTTONS = $HAS_EDIT_DEL_BUTTONS;
24 26  
  27 +/*
25 28 // Ajout du champ "nom" automatique
26   -$new_fields_names['nom'] = ['nice_name'=>'Nom'];
27 29 foreach ($fields_names as $f=>$infos) $new_fields_names[$f] = $infos;
28 30 $fields_names = $new_fields_names;
  31 +// Si champ 'nom', ajout auto du nice name
  32 +debug($fields_names);
  33 +if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom'];
  34 +*/
29 35 //debug($fields_names);
30 36  
  37 +//<div class="stats index large-9 medium-8 columns content">
31 38 ?>
32 39  
  40 +
  41 +
  42 +
33 43 <div class="entities index">
34 44  
35   - <?php echo "<h2><i class='icon-list'></i> Liste des $entity_plural ($nb_entities)</h2>";
36   - if ($CAN_ADD) echo $this->element('button_add');
37   - ?>
  45 + <?php
  46 + echo "<h2><i class='icon-list'></i> Liste des $entity_plural ($nb_entities)</h2>";
  47 +
  48 + if ($this->fetch('list_header')): ?>
  49 + <div class="list_header">
  50 + <?= $this->fetch('list_header') ?>
  51 + </div>
  52 + <?php
  53 + endif;
  54 +
  55 + if ($HAS_ADD_BUTTON && $CAN_ADD) echo $this->element('button_add');
38 56  
39   -
  57 + //<table cellpadding="0" cellspacing="0"
  58 + ?>
40 59 <table style="border-collapse: separate; border-spacing: 0;width: 270px;">
41 60  
42 61 <!-- EN-TETES -->
... ... @@ -50,7 +69,8 @@ $fields_names = $new_fields_names;
50 69 //foreach ($fields_names as $fname=>$fnicename) echo "<th>".$this->Paginator->sort($fname, $fnicename)."</th>";
51 70 //foreach ($fields_names as $fname=>$infos) {
52 71 foreach ($fields_names as $fname=>$infos) {
53   - echo "<th>".$this->Paginator->sort($fname, $infos['nice_name'])."</th>";
  72 + $nice_name = isset($infos['nice_name']) ? $infos['nice_name'] : $fname;
  73 + echo "<th>".$this->Paginator->sort($fname, ucfirst($nice_name))."</th>";
54 74 }
55 75 ?>
56 76  
... ... @@ -67,6 +87,7 @@ $fields_names = $new_fields_names;
67 87 -->
68 88 <td class="actions" style="padding: 6px 0; text-align: left;">
69 89 <?php
  90 + if ($HAS_EDIT_DEL_BUTTONS) {
70 91 //debug(compact('id','CAN_EDIT','CAN_DELETE'));
71 92 $id = $e->id;
72 93 //$CAN_EDIT = in_array($role, ['Administration', 'Super Administrateur']);
... ... @@ -76,6 +97,7 @@ $fields_names = $new_fields_names;
76 97 $style_num=1;
77 98 $WITH_DIV = false;
78 99 echo $this->element('buttons_edit_del', compact('id','CAN_EDIT','CAN_DELETE', 'style_num', 'WITH_DIV'));
  100 + }
79 101 ?>
80 102 </td>
81 103  
... ... @@ -85,12 +107,27 @@ $fields_names = $new_fields_names;
85 107 <td class="smallText"><= $e->has('sur_category') ? $this->Html->link($e->sur_category->nom, ['controller' => 'SurCategories', 'action' => 'view', $e->sur_category->id]) : '' ?></td>
86 108 -->
87 109 <?php
88   - foreach ($e->toArray() as $fname=>$fval) {
89   - if (! in_array($fname, array_keys($fields_names)) ) continue;
  110 + $entity = $e->toArray();
  111 + //debug($entity);
  112 + //foreach ($e->toArray() as $fname=>$fval) {
  113 + foreach ($fields_names as $fname=>$infos) {
  114 + // $fval est soit un champ physique soit un champ virtuel (calculé par le Model)
  115 + $fval = isset($entity[$fname]) ? $entity[$fname] : $e->connexDurAvg;
  116 + //debug($fname);
  117 + //if (! in_array($fname, array_keys($fields_names)) ) continue;
  118 + //debug($fname);
90 119 //<td class="smallText"><?= $this->Html->link($e->nom, ['action' => 'view', $e->id]) ></td>
91 120 echo "<td class='smallText'>";
92   - // - Si c'est le champ "nom", on l'affiche comme un lien
93   - if ($fname == 'nom')
  121 + // - S'il y a une fonction de transformation à appliquer, ben... on l'applique
  122 + //var_dump($fname);
  123 + if ( isset($fields_names[$fname]['f']) ) {
  124 + $f = $fields_names[$fname]['f'];
  125 + //debug($f); debug($fval); exit;
  126 + //var_dump("Y");
  127 + echo $this->MyHelper->$f($fval);
  128 + }
  129 + // - Si c'est le champ "nom", on l'affiche comme un lien
  130 + elseif ($fname == 'nom')
94 131 echo $this->Html->link($fval, ['action' => 'view', $e->id]);
95 132 // - Si le champ est boolean => on affiche oui/non
96 133 elseif ( (substr($fname,0,3)=='is_') && ($fval===false || $fval===true) )
... ... @@ -129,11 +166,13 @@ $fields_names = $new_fields_names;
129 166 */
130 167 }
131 168 echo "</td>";
132   - }
  169 + } // foreach entity fields
133 170 ?>
134 171  
135 172 </tr>
136   - <?php endforeach; ?>
  173 + <?php
  174 + //break;
  175 + endforeach; // foreach entities ?>
137 176 </tbody>
138 177  
139 178 </table>
... ...
src/Template/Materiels/add_edit.ctp
... ... @@ -405,39 +405,68 @@ if (isset($cpMateriel)) {
405 405 ]);
406 406 */
407 407  
408   -
409   - // - Description
410   - echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'description');
  408 + // - Technique et/ou Inventoriable ?
  409 + echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'materiel_technique', "Technique (pas pour l'inventaire officiel)");
411 410 /*
412   - $f = 'description';
413   - echo $this->Form->control($f, [
414   - 'label' => 'Description',
415   - // ADD only
416   - //'default' => $Description
417   - /////'default' => $materiel->description,
418   - // EDIT only
419   - 'disabled' => $IS_ADD ? false : $isReadonlyField($f, $readonlyFields)
420   - ]);
421   - */
  411 + echo $this->Form->control('materiel_technique', [
  412 + 'label' => "Technique (pas pour l'inventaire officiel)",
  413 + // ADD only
  414 + //'default' => $Mat_technique
  415 + /////////'default' => $materiel->materiel_technique,
  416 + // EDIT only
  417 + 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_technique', $readonlyFields)
  418 + ]);
  419 + */
  420 + echo "\n";
  421 + /*
  422 + echo $this->Form->control('materiel_administratif', [
  423 + 'label' => 'Inventoriable (>' . $configuration->prix_inventaire_administratif . '€)',
  424 + // ADD only
  425 + //'default' => $Mat_administratif
  426 + 'default' => $materiel->materiel_administratif,
  427 + // EDIT only
  428 + 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_administratif', $readonlyFields)
  429 + ]);
  430 + */
  431 +
  432 + // - Etiquette posée ?
  433 + if ($CAN_PRINT_LABEL && $USER_IS_RESPONSABLE_OR_MORE) {
  434 + /*
  435 + * }
  436 + * if (in_array($role, [
  437 + * 'Responsable',
  438 + * 'Administration',
  439 + * 'Administration Plus',
  440 + * 'Super Administrateur'
  441 + * ])) {
  442 + */
  443 + echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'etiquette', "Étiquette posée");
  444 + /*
  445 + echo $this->Form->control('etiquette', [
  446 + 'label' => 'Etiquette posée',
  447 + // EDIT only
  448 + 'disabled' => $IS_ADD ? false : $isReadonlyField('etiquette', $readonlyFields)
  449 + ]);
  450 + */
  451 + }
422 452  
423 453 // - materiel HS ?
424   - if ($IS_EDIT &&
425   - (
426   - $USER_IS_ADMIN_OR_MORE
427   - ||
428   - $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER
429   - ||
430   - $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL
431   - )
432   - )
433   - echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'hors_service', 'hors service');
  454 + if ($IS_EDIT &&
  455 + (
  456 + $USER_IS_ADMIN_OR_MORE
  457 + ||
  458 + $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER
  459 + ||
  460 + $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL
  461 + )
  462 + ) echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'hors_service', 'hors service');
434 463 /*
435   - $f = 'hors_service';
436   - echo $this->Form->control($f, [
437   - 'label' => 'hors service',
438   - 'disabled' => $IS_ADD ? false : $isReadonlyField($f, $readonlyFields)
439   - ]);
440   - */
  464 + $f = 'hors_service';
  465 + echo $this->Form->control($f, [
  466 + 'label' => 'hors service',
  467 + 'disabled' => $IS_ADD ? false : $isReadonlyField($f, $readonlyFields)
  468 + ]);
  469 + */
441 470 /*
442 471 * if (in_array($role, [
443 472 * 'Administration',
... ... @@ -449,6 +478,23 @@ if (isset($cpMateriel)) {
449 478 * ]))) || ($role == 'Responsable' && ($materiel->groupes_metier_id == $priviledgedUser->groupes_metier_id ||
450 479 * $materiel->groupes_thematique_id == $priviledgedUser->groupes_thematique_id))) {
451 480 */
  481 +
  482 +
  483 +
  484 + // - Description
  485 + echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'description');
  486 + /*
  487 + $f = 'description';
  488 + echo $this->Form->control($f, [
  489 + 'label' => 'Description',
  490 + // ADD only
  491 + //'default' => $Description
  492 + /////'default' => $materiel->description,
  493 + // EDIT only
  494 + 'disabled' => $IS_ADD ? false : $isReadonlyField($f, $readonlyFields)
  495 + ]);
  496 + */
  497 +
452 498 ?>
453 499  
454 500  
... ... @@ -606,30 +652,6 @@ if (isset($cpMateriel)) {
606 652 echo "</fieldset></div>"; // 'domaine_categ_souscateg'
607 653  
608 654  
609   - // - Technique et/ou Inventoriable ?
610   - echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'materiel_technique', "Technique (pas pour l'inventaire officiel)");
611   - /*
612   - echo $this->Form->control('materiel_technique', [
613   - 'label' => "Technique (pas pour l'inventaire officiel)",
614   - // ADD only
615   - //'default' => $Mat_technique
616   - /////////'default' => $materiel->materiel_technique,
617   - // EDIT only
618   - 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_technique', $readonlyFields)
619   - ]);
620   - */
621   - echo "\n";
622   - /*
623   - echo $this->Form->control('materiel_administratif', [
624   - 'label' => 'Inventoriable (>' . $configuration->prix_inventaire_administratif . '€)',
625   - // ADD only
626   - //'default' => $Mat_administratif
627   - 'default' => $materiel->materiel_administratif,
628   - // EDIT only
629   - 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_administratif', $readonlyFields)
630   - ]);
631   - */
632   -
633 655 // - Metrologie
634 656 //if ($configuration->metrologie == '1') {
635 657 if ($configuration->metrologie) {
... ... @@ -645,27 +667,8 @@ if (isset($cpMateriel)) {
645 667 */
646 668 echo "</div>";
647 669 }
  670 +
648 671  
649   - // - Etiquette posée ?
650   - if ($CAN_PRINT_LABEL && $USER_IS_RESPONSABLE_OR_MORE) {
651   - /*
652   - * }
653   - * if (in_array($role, [
654   - * 'Responsable',
655   - * 'Administration',
656   - * 'Administration Plus',
657   - * 'Super Administrateur'
658   - * ])) {
659   - */
660   - echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'etiquette', "Étiquette posée");
661   - /*
662   - echo $this->Form->control('etiquette', [
663   - 'label' => 'Etiquette posée',
664   - // EDIT only
665   - 'disabled' => $IS_ADD ? false : $isReadonlyField('etiquette', $readonlyFields)
666   - ]);
667   - */
668   - }
669 672  
670 673 // - Site
671 674 echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'site_id', null, 'N/A');
... ... @@ -928,6 +931,7 @@ if (isset($cpMateriel)) {
928 931  
929 932 // - Nom Responsable du crédit
930 933 echo $this->MyHelper->control($IS_ADD, $readonlyFields, 'resp_credit', "Responsable du crédit (par défaut l'acheteur)");
  934 +
931 935 /*
932 936 $f = 'resp_credit';
933 937 echo $this->Form->control($f, [
... ...
src/Template/Stats/index.ctp
1 1 <?php
2   -/**
3   - * @var \App\View\AppView $this
4   - * @var \App\Model\Entity\Stat[]|\Cake\Collection\CollectionInterface $stats
5   - */
6 2  
7   -// Variables passées par le controleur
8   -$stats = $stats;
  3 +// Create the list_header block.
  4 +$this->start('list_header');
9 5  
  6 + //TODO: corriger ce calcul qui est faux (il faut ramener au nombre de mois effectifs de toutes les années incomplètes, assez compliqué...)
  7 + echo '<br>';
  8 + echo "<b>Nombre moyen de connexions d'un utilisateur par an (sur tous les utilisateurs et toutes les années) (approximatif si années incomplètes) : </b>";
  9 + echo round($connex_nb_year_avg, 0);
  10 +
  11 + //TODO: corriger ce calcul qui est faux (il faut ramener au nombre de mois effectifs de toutes les années incomplètes, assez compliqué...)
  12 + /*
  13 + echo '<br>';
  14 + echo "<b>Nombre moyen de connexions d'un utilisateur par mois (sur tous les utilisateurs et toutes les années) : </b>";
  15 + echo round($connex_nb_year_avg/12, 1);
  16 + */
  17 + echo '<br>';
  18 + echo "<b>Temps de connexion moyen d'un utilisateur (sur tous les utilisateurs et toutes les années) : </b>";
  19 + echo $this->MyHelper->getHourMnSecForDuration($connex_dur_tot_avg);
  20 + echo "<br>";echo "<br>";
10 21  
11   -function getHourMnSecForDuration($duration_sec) {
12   - //debug($duration_sec);
13   - // PHP7 only (intdiv)
14   - //$h = intdiv($duration_sec,3600);
15   - // PHP5 !!!
16   - $h = (int)($duration_sec/3600);
17   - $m = (int)( ($duration_sec - $h*3600) / 60 );
18   - $s = $duration_sec - $h*3600 - $m*60;
19   - return [$h,$m,$s];
20   -}
  22 +$this->end();
21 23  
22 24  
23   -// Moyenne générale pour le nombre de connexions et le temps de connexion
24 25  
25   -$connex_nb_tot = 0;
26   -$connex_dur_tot_tot = 0;
27   -foreach ($stats as $stat) {
28   - $connex_nb_tot += $stat->connex_nb;
29   - $connex_dur_tot_tot += $stat->connex_dur_tot;
30   -}
31   -$connex_nb_year_avg = $connex_nb_tot / $stats->count();
32   -$connex_dur_tot_avg = round($connex_dur_tot_tot / $connex_nb_tot);
33   -//$connex_dur_tot_avg = intdiv($connex_dur_tot_tot , $connex_nb_tot);
34   -//echo $connex_dur_tot_avg;
35   -list($h,$m,$s) = getHourMnSecForDuration($connex_dur_tot_avg);
36   -
37   -//TODO: corriger ce calcul qui est faux (il faut ramener au nombre de mois effectifs de toutes les années incomplètes, assez compliqué...)
38   -echo '<br>';
39   -echo "<b>Nombre moyen de connexions d'un utilisateur par an (sur tous les utilisateurs et toutes les années) (approximatif si années incomplètes) : </b>";
40   -echo round($connex_nb_year_avg, 0);
41   -
42   -//TODO: corriger ce calcul qui est faux (il faut ramener au nombre de mois effectifs de toutes les années incomplètes, assez compliqué...)
43   -/*
44   -echo '<br>';
45   -echo "<b>Nombre moyen de connexions d'un utilisateur par mois (sur tous les utilisateurs et toutes les années) : </b>";
46   -echo round($connex_nb_year_avg/12, 1);
47   -*/
48   -
49   -echo '<br>';
50   -echo "<b>Temps de connexion moyen d'un utilisateur (sur tous les utilisateurs et toutes les années) : </b>";
51   -echo "$h h $m mn $s sec";
52   -echo "<br>";echo "<br>";
53   -
54   -
55   -?>
56   -<!--
57   -<nav class="large-3 medium-4 columns" id="actions-sidebar">
58   - <ul class="side-nav">
59   - <li class="heading"><?= __('Actions') ?></li>
60   - <li><?= $this->Html->link(__('New Stat'), ['action' => 'add']) ?></li>
61   - <li><?= $this->Html->link(__('List Users'), ['controller' => 'Users', 'action' => 'index']) ?></li>
62   - <li><?= $this->Html->link(__('New User'), ['controller' => 'Users', 'action' => 'add']) ?></li>
63   - </ul>
64   -</nav>
65   --->
66   -<div class="stats index large-9 medium-8 columns content">
67   - <h3><?= __('Stats') ?></h3>
68   - <table cellpadding="0" cellspacing="0">
69   - <thead>
70   - <tr>
71   - <th scope="col"><?= $this->Paginator->sort('year') ?></th>
72   - <th scope="col"><?= $this->Paginator->sort('user_id') ?></th>
73   - <th scope="col"><?= $this->Paginator->sort('last_login_time') ?></th>
74   - <th scope="col"><?= $this->Paginator->sort('last_connex_dur', 'Last connexion (mn)') ?></th>
75   - <th scope="col"><?= $this->Paginator->sort('last_logout_time') ?></th>
76   - <th scope="col"><?= $this->Paginator->sort('connex_dur_tot', "Temps connexion cumulé (mn)") ?></th>
77   - <th scope="col"><?= $this->Paginator->sort('connex_nb', "Nb connexions") ?></th>
78   - <th scope="col"><?= "Durée connexion moyenne (sur année)" ?></th>
79   - <!--
80   - <th scope="col" class="actions"><?= __('Actions') ?></th>
81   - -->
82   - </tr>
83   - </thead>
84   - <tbody>
85   - <?php foreach ($stats as $stat): ?>
86   - <tr>
87   - <td><?= h($stat->year) ?></td>
88   - <td><?= $stat->has('user') ? $this->Html->link($stat->user->nom, ['controller' => 'Users', 'action' => 'view', $stat->user->id]) : '' ?></td>
89   - <td><?= h($stat->last_login_time) ?></td>
90   -
91   - <?php
92   - list($h,$m,$s) = getHourMnSecForDuration($stat->last_connex_dur);
93   - ?>
94   - <td><?="$h h $m mn $s sec"?></td>
95   - <!--
96   - <td><= h($stat->last_connex_dur) ?></td>
97   - -->
98   -
99   - <td><?= h($stat->last_logout_time) ?></td>
100   -
101   - <?php
102   - list($h,$m,$s) = getHourMnSecForDuration($stat->connex_dur_tot);
103   - ?>
104   - <td><?="$h h $m mn $s sec"?></td>
105   - <!--
106   - <td><= $this->Number->format($stat->connex_dur_tot) ?></td>
107   - -->
108   -
109   - <td><?= $this->Number->format($stat->connex_nb) ?></td>
110   -
111   - <?php
112   - // PHP7 only
113   - //$connex_dur_avg = intdiv($stat->connex_dur_tot , $stat->connex_nb);
114   - // PHP5
115   - $connex_dur_avg = (int)($stat->connex_dur_tot / $stat->connex_nb);
116   - list($h,$m,$s) = getHourMnSecForDuration($connex_dur_avg);
117   - ?>
118   - <td><?="$h h $m mn $s sec"?></td>
119   -
120   - <!--
121   - <td class="actions">
122   - <?= $this->Html->link(__('View'), ['action' => 'view', $stat->year,$stat->user_id]) ?>
123   - <?= $this->Html->link(__('Edit'), ['action' => 'edit', $stat->year,$stat->user_id]) ?>
124   - <?= $this->Form->postLink(__('Delete'), ['action' => 'delete', $stat->year,$stat->user_id], ['confirm' => __('Are you sure you want to delete # {0}?', $stat->year)]) ?>
125   - </td>
126   - -->
127   - </tr>
128   - <?php endforeach; ?>
129   - </tbody>
130   - </table>
131   - <div class="paginator">
132   - <ul class="pagination">
133   - <?= $this->Paginator->first('<< ' . __('first')) ?>
134   - <?= $this->Paginator->prev('< ' . __('previous')) ?>
135   - <?= $this->Paginator->numbers() ?>
136   - <?= $this->Paginator->next(__('next') . ' >') ?>
137   - <?= $this->Paginator->last(__('last') . ' >>') ?>
138   - </ul>
139   - <p><?= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?></p>
140   - </div>
141   -</div>
  26 +$this->extend('/Common/index_gen');
  27 +//$this->extend('index.orig');
142 28 \ No newline at end of file
... ...
src/View/Helper/MyHelperHelper.php
... ... @@ -15,6 +15,19 @@ class MyHelperHelper extends Helper {
15 15 public function initialize(array $config) {
16 16 //debug($config);
17 17 }
  18 +
  19 +
  20 + function getHourMnSecForDuration($duration_sec) {
  21 + //debug($duration_sec);
  22 + // PHP7 only (intdiv)
  23 + //$h = intdiv($duration_sec,3600);
  24 + // PHP5 !!!
  25 + $h = (int)($duration_sec/3600);
  26 + $m = (int)( ($duration_sec - $h*3600) / 60 );
  27 + $s = $duration_sec - $h*3600 - $m*60;
  28 + //return [$h,$m,$s];
  29 + return "$h h $m mn $s sec";
  30 + }
18 31  
19 32  
20 33 // (EP) Fonction utilisée dans la vue Materiels/add_or_edit
... ...