Commit 1b901ee925d5f91d624bd52b29f60d24c7a71712
1 parent
087b29e7
Exists in
master
and in
1 other branch
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
Showing
19 changed files
with
292 additions
and
235 deletions
Show diff stats
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) | ... | ... |
... | ... | @@ -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
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
src/Controller/TypeSuivisController.php
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 | ... | ... |