Commit 0ed158cdfff612801ae135ae62e7afaad767b6d5

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

Page "Statistiques" améliorée (menu Outils, /pages/stats) (v3.7.9.76)

- nombre de matériels créés, validés, archivés, suivis, et prêtés (en
moyenne, au total, et par année)
- choix du nb de matériels à lister
@@ -15,7 +15,7 @@ CHANGEMENTS @@ -15,7 +15,7 @@ CHANGEMENTS
15 ------- 15 -------
16 25/07/2020 NEWS#2 : 16 25/07/2020 NEWS#2 :
17 17
18 -- Nouvelle page "Statistiques" depuis le menu Outils : nombre de matériels créés, validés, archivés, en moyenne, au total, et par année 18 +- Nouvelle page "Statistiques" depuis le menu Outils : nombre de matériels créés, validés, archivés, suivis, et prêtés (en moyenne, au total, et par année)
19 19
20 - Améliorations de la page qui liste les matériels (/materiels/index) : 20 - Améliorations de la page qui liste les matériels (/materiels/index) :
21 => nouveaux filtres "age" et "domaine" pour afficher les matériels par domaine (informatique, électronique, ...) ou/et par tranche d'âge (par défaut "moins de 5 ans", mais aussi 5-10 ans, 10-15 ans...) 21 => nouveaux filtres "age" et "domaine" pour afficher les matériels par domaine (informatique, électronique, ...) ou/et par tranche d'âge (par défaut "moins de 5 ans", mais aussi 5-10 ans, 10-15 ans...)
@@ -77,6 +77,12 @@ Outre ces changements, voici d'autres changements importants : @@ -77,6 +77,12 @@ Outre ces changements, voici d'autres changements importants :
77 ======= CHANGES ======= 77 ======= CHANGES =======
78 78
79 ------- 79 -------
  80 +28/07/2020 v3.7.9.76 (EP)
  81 + - Page "Statistiques" améliorée (menu Outils, /pages/stats) :
  82 + - nombre de matériels créés, validés, archivés, suivis, et prêtés (en moyenne, au total, et par année)
  83 + - choix du nb de matériels à lister
  84 +
  85 +-------
80 25/07/2020 v3.7.9.72-75 (EP) 86 25/07/2020 v3.7.9.72-75 (EP)
81 - Fiabilisation du nouveau script database/update/db-update.sh 87 - Fiabilisation du nouveau script database/update/db-update.sh
82 - Try-catch avant exécution grosses requetes sql (par exemple celle pour la vue index des materiels) 88 - Try-catch avant exécution grosses requetes sql (par exemple celle pour la vue index des materiels)
@@ -42,8 +42,8 @@ Logiciel testé et validé sur les configurations suivantes : @@ -42,8 +42,8 @@ Logiciel testé et validé sur les configurations suivantes :
42 42
43 -------------------------------------------------------------------------------------------- 43 --------------------------------------------------------------------------------------------
44 44
45 -Date: 25/07/2020  
46 -Version: 3.7.9.75 45 +Date: 28/07/2020
  46 +Version: 3.7.9.76
47 47
48 48
49 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) 49 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
src/Controller/MaterielsController.php
@@ -766,26 +766,23 @@ class MaterielsController extends AppController { @@ -766,26 +766,23 @@ class MaterielsController extends AppController {
766 if ($GM !== null && $GM != TableRegistry::getTableLocator()->get('GroupesMetiers')->find() 766 if ($GM !== null && $GM != TableRegistry::getTableLocator()->get('GroupesMetiers')->find()
767 ->where([ 767 ->where([
768 'nom =' => 'N/A' 768 'nom =' => 'N/A'
769 - ])  
770 - ->first()['id']) 769 + ])->first()['id'])
771 $conditions = [ 770 $conditions = [
772 'Materiels.groupes_metier_id =' => $GM, 771 'Materiels.groupes_metier_id =' => $GM,
773 'Materiels.status !=' => 'ARCHIVED' 772 'Materiels.status !=' => 'ARCHIVED'
774 ]; 773 ];
775 //else if ($GT !== null && $GT != TableRegistry::get('GroupesThematiques')->find() 774 //else if ($GT !== null && $GT != TableRegistry::get('GroupesThematiques')->find()
776 - else if ($GT !== null && $GT != TableRegistry::getTableLocator()->get('GroupesThematiques')->find() 775 + else if ($GT !== null && $GT != TableRegistry::getTableLocator()->get('GroupesThematiques')->find()
777 ->where([ 776 ->where([
778 'nom =' => 'N/A' 777 'nom =' => 'N/A'
779 ]) 778 ])
780 - ->first()['id']) 779 + ->first()['id'])
781 $conditions = [ 780 $conditions = [
782 'Materiels.groupes_thematique_id =' => $GT, 781 'Materiels.groupes_thematique_id =' => $GT,
783 'Materiels.status !=' => 'ARCHIVED' 782 'Materiels.status !=' => 'ARCHIVED'
784 ]; 783 ];
785 else 784 else
786 - $conditions = [  
787 - 'Materiels.id =' => 0  
788 - ]; 785 + $conditions = [ 'Materiels.id =' => 0 ];
789 } 786 }
790 787
791 $GMV = $this->request->getQuery('GMV'); 788 $GMV = $this->request->getQuery('GMV');
src/Controller/PagesController.php
@@ -295,104 +295,10 @@ class PagesController extends AppController @@ -295,104 +295,10 @@ class PagesController extends AppController
295 $this->set(compact('lab_name')); 295 $this->set(compact('lab_name'));
296 } 296 }
297 297
  298 +
298 // - Page des STATISTIQUES 299 // - Page des STATISTIQUES
299 - if ($this->page=='stats') {  
300 -  
301 - // - Année en cours  
302 - $now = new \DateTime('now');  
303 - //debug($now);  
304 - // 2020 en 2020  
305 - $current_year = (int) $now->format('Y');  
306 -  
307 - $materiels = TableRegistry::getTableLocator()->get('Materiels');  
308 - //debug($all_matos->count()); //3967 300 + if ($this->page=='stats') $this->set_variables_for_page_stats();
309 301
310 - /*  
311 - $statuses = [  
312 - 'CREATED' => 'created',  
313 - 'VALIDATED' => 'date_validated',  
314 - 'ARCHIVED' => 'date_archived'  
315 - ];  
316 - */  
317 - $statuses = [ 'CREATED', 'VALIDATED', 'TOBEARCHIVED', 'ARCHIVED' ];  
318 -  
319 - // - Donées Totales  
320 - $tot = [];  
321 - /*  
322 - $tot['CREATED'] = 100;  
323 - $tot['VALIDATED'] = 70;  
324 - $tot['TOBEARCHIVED'] = 10;  
325 - $tot['ARCHIVED'] = 10;  
326 - */  
327 - foreach ($statuses as $status) {  
328 - //TODO: optimiser, à ne faire qu'une seule fois, et non pas à chaque tour de boucle:  
329 - // Tous les matos qui ont une date d'achat non nulle  
330 - $all_matos = $materiels->find()->where(['year(date_acquisition) >' => 0]);  
331 - if ($status != 'CREATED') $all_matos->where(['status' => $status]);  
332 - $tot[$status] = $all_matos->count();  
333 - }  
334 -  
335 - // - Donées Moyennes  
336 - $avg = [];  
337 - /*  
338 - $avg['CREATED'] = 10;  
339 - $avg['VALIDATED'] = 7;  
340 - $avg['TOBEARCHIVED'] = 1;  
341 - $avg['ARCHIVED'] = 1;  
342 - */  
343 - foreach ($statuses as $status) {  
344 - //TODO: optimiser, à ne faire qu'une seule fois, et non pas à chaque tour de boucle:  
345 - // Tous les matos qui ont une date d'achat non nulle  
346 - //$all_matos = $materiels->find();  
347 - $all_matos = $materiels->find()->where(['year(date_acquisition) >' => 0]);  
348 - //->groupBy('year(date_acquisition)');  
349 - if ($status != 'CREATED') $all_matos->where(['status' => $status]);  
350 - $avg[$status] = $all_matos  
351 - //->groupBy('year(date_acquisition)');  
352 - ->countBy(function($matos) {  
353 - return $matos->date_acquisition->format('Y');  
354 - })  
355 - //->toList();  
356 - //->toArray();  
357 - //->count();  
358 - ->avg();  
359 - $avg[$status] = round($avg[$status]);  
360 - }  
361 - //debug($avg);  
362 -  
363 -  
364 - // - Données par Année  
365 - $years = [];  
366 - //$year_min = $materiels->find()->min(['year(date_acquisition)']);  
367 - $matos_year_min = $materiels->find()  
368 - ->where(['year(date_acquisition) >' => 0])  
369 - ->min(function($matos) {  
370 - return $matos->date_acquisition->format('Y');  
371 - });  
372 - //$year_min = 2009;  
373 - $year_min = (int) $matos_year_min->date_acquisition->format('Y');  
374 - // TODO: Ajouter progression d'année en année (2020 = 2019 +/- 10%)  
375 - for ($y=$current_year ; $y>=$year_min ; $y--) {  
376 - //debug($y);  
377 - try {  
378 - foreach ($statuses as $status) {  
379 - //TODO: optimiser, à ne faire qu'une seule fois, et non pas à chaque tour de boucle:  
380 - $all_matos_for_year = $materiels  
381 - ->find()  
382 - ->where(['year(date_acquisition)' => $y]);  
383 - if ($status != 'CREATED') $all_matos_for_year->where(['status' => $status]);  
384 - $years[$y][$status] = $all_matos_for_year->count();  
385 - }  
386 - } catch (\PDOException $e) {  
387 - debug("Mauvais format de requete SQL (PagesController), Exception PDO générée !");  
388 - exit;  
389 - }  
390 - }  
391 - //debug($years);  
392 -  
393 - // Set all variables pour la vue  
394 - $this->set(compact('current_year', 'year_min', 'years', 'tot', 'avg'));  
395 - }  
396 302
397 // - Page des OUTILS 303 // - Page des OUTILS
398 if ($this->page=='tools') { 304 if ($this->page=='tools') {
@@ -415,5 +321,250 @@ class PagesController extends AppController @@ -415,5 +321,250 @@ class PagesController extends AppController
415 } 321 }
416 322
417 } // display() 323 } // display()
  324 +
  325 +
  326 +
  327 + private function set_variables_for_page_stats() {
  328 +
  329 + // Nb années demandées par l'utilisateur
  330 + $nbyears = $this->request->getQuery('nbyears');
  331 + // Par défaut $nbyears = 1
  332 + $nbyears = (is_numeric($nbyears) && $nbyears>0) ? abs(round($nbyears)) : 1;
  333 + //debug($nbyears);
  334 +
  335 + $materiels = TableRegistry::getTableLocator()->get('Materiels');
  336 + $suivis = TableRegistry::getTableLocator()->get('Suivis');
  337 + $prets = TableRegistry::getTableLocator()->get('Emprunts');
  338 + $associated_entities = ['suivis','prets'];
  339 + $fk = 'materiel_id';
  340 +
  341 + // Tous les matos qui ont une date d'achat non nulle
  342 + $all_matos = $materiels->find()->where(['year(date_acquisition) >' => 0]);
  343 +
  344 + // - Année en cours
  345 + $now = new \DateTime('now');
  346 + //debug($now);
  347 + // 2020 en 2020
  348 + $current_year = (int) $now->format('Y');
  349 +
  350 + // - Année min
  351 + //$year_min = $materiels->find()->min(['year(date_acquisition)']);
  352 + //$matos_year_min = $materiels->find()->where(['year(date_acquisition) >' => 0])
  353 + $matos_year_min = $all_matos->cleanCopy()
  354 + ->min(function($matos) {
  355 + return $matos->date_acquisition->format('Y');
  356 + });
  357 + $year_min = (int) $matos_year_min->date_acquisition->format('Y');
  358 +
  359 + // - Nb années au total : au moins 1
  360 + $nbyears_max = $current_year - $year_min + 1;
  361 +
  362 + // - Nb annnées à traiter (entre 1 et $nbyears_max)
  363 + // ($nbyears=null si pas passé en paramètre)
  364 + // ($nbyears='' si passé en paramètre mais sans valeur '?nbyears=')
  365 + //$nbyears = $nbyears ? abs((int)$nbyears) : $nbyears_max;
  366 + //debug($nbyears);
  367 + $nbyears = min($nbyears,$nbyears_max);
  368 + //debug($nbyears);
  369 + //debug($nbyears);
  370 + // Si on est au max (avec max>2), on enlève la 1ère et la dernière années (car a priori incomplètes)
  371 + //sif ($nbyears==$nbyears_max && $nbyears>2) $nbyears -= 2;
  372 + // Nouvelle année min
  373 + $year_min = $current_year-$nbyears + 1;
  374 +
  375 + // Nouveau $all_matos, en tronquant à $nbyears
  376 + $all_matos = $materiels->find()
  377 + ->where(['year(date_acquisition) <=' => $current_year])
  378 + ->where(['year(date_acquisition) >=' => $year_min]);
  379 + $all_matos_ids = $all_matos->cleanCopy()->select(['id']);
  380 +
  381 + /*
  382 + $statuses = [
  383 + 'CREATED' => 'created',
  384 + 'VALIDATED' => 'date_validated',
  385 + 'ARCHIVED' => 'date_archived'
  386 + ];
  387 + */
  388 + $statuses = [ 'CREATED', 'VALIDATED', 'TOBEARCHIVED', 'ARCHIVED' ];
  389 +
  390 + // - tot : Données Totales (complètes) (tronquées à $nbyears)
  391 + $tot = [];
  392 + foreach ($statuses as $status) {
  393 + $all_matos_copy = $all_matos->cleanCopy();
  394 + // Tous les matos qui ont une date d'achat non nulle
  395 + if ($status != 'CREATED') $all_matos_copy->where(['status' => $status]);
  396 + $tot[$status] = $all_matos_copy->count();
  397 + }
  398 + // Suivis et Prets
  399 + // Nb materiels qui ont des suivis (i.e. qui ont au moins 1 suivi)
  400 + foreach ($associated_entities as $e) {
  401 + //$nb_matos_suivis = $suivis->find()
  402 + $tot[$e] = $$e->find()
  403 + // materiel_id not null
  404 + ->where(["$fk >" => 0])
  405 + ->select([$fk])
  406 + ->distinct([$fk])
  407 + ->where(["$fk IN" => $all_matos_ids])
  408 + ->count();
  409 + }
  410 +
  411 + /*
  412 + // - tot2 : Données Totales Partielles (= tot sauf 1ère et dernière années)
  413 + $all_matos2 = $materiels
  414 + ->find()
  415 + ->where(['year(date_acquisition) <' => $current_year])
  416 + ->where(['year(date_acquisition) >' => $current_year-$nbyears]);
  417 + $all_matos_ids2 = $all_matos2->cleanCopy()->select(['id']);
  418 +
  419 + $tot2 = [];
  420 + foreach ($statuses as $status) {
  421 + $all_matos_copy = $all_matos2->cleanCopy();
  422 + // Tous les matos qui ont une date d'achat non nulle
  423 + if ($status != 'CREATED') $all_matos_copy->where(['status' => $status]);
  424 + $tot2[$status] = $all_matos_copy->count();
  425 + }
  426 + // Suivis et Prets
  427 + // Nb materiels qui sont suivis (i.e. qui ont au moins 1 suivi)
  428 + foreach ($associated_entities as $e) {
  429 + //$nb_matos_suivis = $suivis->find()
  430 + $tot2[$e] = $$e->find()
  431 + // materiel_id not null
  432 + ->where(["$fk >" => 0])
  433 + ->select([$fk])
  434 + ->distinct([$fk])
  435 + ->where(["$fk IN" => $all_matos_ids2])
  436 + ->count();
  437 + }
  438 + */
  439 +
  440 + // - Donées Moyennes
  441 + $avg = [];
  442 + /*
  443 + $avg['CREATED'] = 10;
  444 + $avg['VALIDATED'] = 7;
  445 + $avg['TOBEARCHIVED'] = 1;
  446 + $avg['ARCHIVED'] = 1;
  447 + */
  448 + foreach ($statuses as $status) {
  449 + $avg[$status] = round($tot[$status]/$nbyears, 1);
  450 + /*
  451 + * (EP)
  452 + * J'obtiens pas le meme resultat avec cette methode...
  453 + * Peut-être que ca compte pas les années où il n'y a rien (0)
  454 + */
  455 + /*
  456 + //$all_matos = $materiels->find();
  457 + //$all_matos = $materiels->find()->where(['year(date_acquisition) >' => 0]);
  458 + //->groupBy('year(date_acquisition)');
  459 + $all_matos_copy = $all_matos->cleanCopy();
  460 + if ($status != 'CREATED') $all_matos_copy->where(['status' => $status]);
  461 + $avg[$status] = $all_matos_copy
  462 + //->groupBy('year(date_acquisition)');
  463 + ->countBy(function($matos) {
  464 + return $matos->date_acquisition->format('Y');
  465 + })
  466 + ->avg();
  467 + //->toList();
  468 + //->toArray();
  469 + //->count();
  470 + $avg[$status] = round($avg[$status]);
  471 + */
  472 + }
  473 + // Suivis et Prets
  474 + // Nb materiels qui sont suivis (i.e. qui ont au moins 1 suivi)
  475 + foreach ($associated_entities as $e) {
  476 + $avg[$e] = round($tot[$e]/$nbyears, 1);
  477 + /*
  478 + $nb_matos_having_entity = $$e->find()
  479 + // materiel_id not null
  480 + ->where(["$fk >" => 0])
  481 + ->select([
  482 + 'year' => 'YEAR(created)'
  483 + ])
  484 + ->group('year')
  485 + ->toArray();
  486 +
  487 + //->groupBy(function($entity) {
  488 + ->group(function($entity) {
  489 + return $entity->created->format('Y');
  490 + })
  491 + ->distinct([$fk])
  492 + ->count()
  493 + ->avg();
  494 + $avg[$e] = $nb_matos_having_entity;
  495 + */
  496 + //debug($nb_matos_having_entity);
  497 + }
  498 +
  499 +
  500 + // - Données par Année
  501 + $years = [];
  502 + $all_matos = $materiels->find();
  503 + for ($y=$current_year ; $y>=$year_min ; $y--) {
  504 + //debug($y);
  505 + $all_matos_for_year = $all_matos->cleanCopy()->where(['year(date_acquisition)' => $y]);
  506 + // - statut par année
  507 + try {
  508 + foreach ($statuses as $status) {
  509 + /*
  510 + $all_matos_for_year = $materiels->find();
  511 + ->where(['year(date_acquisition)' => $y]);
  512 + $all_matos_for_year = $all_matos->cleanCopy()->where(['year(date_acquisition)' => $y]);
  513 + */
  514 + $all_matos_for_year_and_status = $all_matos_for_year->cleanCopy();
  515 + if ($status != 'CREATED') $all_matos_for_year_and_status->where(['status' => $status]);
  516 + $years[$y][$status] = $all_matos_for_year_and_status->count();
  517 + }
  518 + } catch (\PDOException $e) {
  519 + debug("Mauvais format de requete SQL (PagesController suivis), Exception PDO générée !");
  520 + exit;
  521 + }
  522 + // Suivis et Prets, par année
  523 + $all_matos_suivis_for_year = $all_matos_for_year->cleanCopy();
  524 + foreach ($associated_entities as $e)
  525 + try {
  526 + /*
  527 + * SQL equivalent : à tester...
  528 + *
  529 + * SELECT COUNT(DISTINCT(suivis.materiel_id)) FROM suivis LEFT JOIN materiels
  530 + * ON suivis.materiel_id = materiels.id
  531 + * WHERE YEAR(materiels.date_acquisition) = $y
  532 + */
  533 + //$years[$y]['suivis'] = $suivis
  534 + $years[$y][$e] = $$e
  535 + // Tous les suivis/emprunts...
  536 + ->find()
  537 + // ... et leur materiel associé...
  538 + ->leftJoinWith('Materiels')
  539 + // ... LEFT JOIN ON (suivis.materiel_id = materiels.id) ... // ou emprunts.materiel_id
  540 + //->enableAutoFields(true)
  541 + // ... (uniquement les materiels de l'année $y) ...
  542 + ->where(['year(date_acquisition)' => $y])
  543 + // ... en ne gardant qu'1 seul suivi/emprunt par materiel (meme si ce materiel en a plusieurs) ...
  544 + ->distinct(['materiel_id'])
  545 + // ... et enfin, on compte le nombre de suivis/emprunts (total pour l'année $y)
  546 + ->count();
  547 + //->toArray();
  548 + //$all_matos_for_year
  549 + //->contain(['Suivis'])
  550 + //->select(['id', 'count_suivis => count(suivis)'])
  551 + //->where(['count_suivis >' => 0])
  552 + //->count();
  553 + } catch (\PDOException $e) {
  554 + debug("Mauvais format de requete SQL (PagesController prets), Exception PDO générée !");
  555 + exit;
  556 + }
  557 + //debug($years[$y]['suivis']);
  558 + //$years[$y]['suivis'] = 3;
  559 + //$years[$y]['prets'] = 4;
  560 + } // foreach year
  561 + //debug($years);
  562 +
  563 + // Set all variables pour la vue
  564 + //$this->set(compact('current_year', 'year_min', 'tot', 'avg', 'years', 'suivis', 'prets'));
  565 + //$this->set(compact('current_year', 'year_min', 'nbyears', 'tot', 'tot2', 'avg', 'years'));
  566 + $this->set(compact('current_year', 'year_min', 'nbyears', 'tot', 'avg', 'years'));
  567 +
  568 + } // set_variables_for_page_stats()
418 569
419 } 570 }
src/Template/Emprunts/index.ctp
@@ -8,7 +8,9 @@ @@ -8,7 +8,9 @@
8 8
9 <th><?= $this->Paginator->sort('id', 'N°') ?></th> 9 <th><?= $this->Paginator->sort('id', 'N°') ?></th>
10 <th><?= $this->Paginator->sort('materiel_id', 'Matériel') ?></th> 10 <th><?= $this->Paginator->sort('materiel_id', 'Matériel') ?></th>
11 - <th><?= $this->Paginator->sort('numero_laboratoire', 'N° interne (labo)') ?></th> 11 + <!-- (EP 202007) inutile
  12 + <th><= $this->Paginator->sort('numero_laboratoire', 'N° interne (labo)') ?></th>
  13 + -->
12 <th><?= $this->Paginator->sort('emprunt_interne', 'Type') ?></th> 14 <th><?= $this->Paginator->sort('emprunt_interne', 'Type') ?></th>
13 <th><?= $this->Paginator->sort('date_emprunt' ,'Date emprunt') ?></th> 15 <th><?= $this->Paginator->sort('date_emprunt' ,'Date emprunt') ?></th>
14 <th><?= $this->Paginator->sort('date_retour_emprunt', 'Date retour') ?></th> 16 <th><?= $this->Paginator->sort('date_retour_emprunt', 'Date retour') ?></th>
@@ -30,12 +32,21 @@ @@ -30,12 +32,21 @@
30 32
31 <td class="smallText"><?php echo $this->Html->link('Emprunt '.$this->Number->format($emprunt->id), ['action' => 'view', $emprunt->id])?></td> 33 <td class="smallText"><?php echo $this->Html->link('Emprunt '.$this->Number->format($emprunt->id), ['action' => 'view', $emprunt->id])?></td>
32 <td class="smallText"><?= $emprunt->has('materiel') ? $this->Html->link($emprunt->materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $emprunt->materiel->id]) : '' ?></td> 34 <td class="smallText"><?= $emprunt->has('materiel') ? $this->Html->link($emprunt->materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $emprunt->materiel->id]) : '' ?></td>
33 - <td class="smallText"><?= $emprunt->has('materiel') ? h($emprunt->materiel->numero_laboratoire) : '' ?></td> 35 + <!-- (EP 202007) inutile
  36 + <td class="smallText"><= $emprunt->has('materiel') ? h($emprunt->materiel->numero_laboratoire) : '' ?></td>
  37 + -->
34 <td class="smallText"><?php if (h($emprunt->emprunt_interne) == '1') { echo 'Interne'; } else { echo 'Externe'; } ?></td> 38 <td class="smallText"><?php if (h($emprunt->emprunt_interne) == '1') { echo 'Interne'; } else { echo 'Externe'; } ?></td>
35 <td class="smallText"><?= h($emprunt->date_emprunt) ?></td> 39 <td class="smallText"><?= h($emprunt->date_emprunt) ?></td>
36 <td class="smallText"><?= h($emprunt->date_retour_emprunt) ?></td> 40 <td class="smallText"><?= h($emprunt->date_retour_emprunt) ?></td>
37 <td class="smallText"><?= h($emprunt->nom_emprunteur) ?></td> 41 <td class="smallText"><?= h($emprunt->nom_emprunteur) ?></td>
38 - <td class="smallText"><?php if (h($emprunt->emprunt_interne) == '1') { echo h($emprunt->site->nom).' - '.h($emprunt->e_lieu_detail); } else { echo h($emprunt->laboratoire); } ?></td> 42 + <td class="smallText">
  43 + <?php
  44 + if (h($emprunt->emprunt_interne) == '1')
  45 + echo h($emprunt->site->nom).' - '.h($emprunt->e_lieu_detail);
  46 + else
  47 + echo h($emprunt->laboratoire);
  48 + ?>
  49 + </td>
39 50
40 51
41 </tr> 52 </tr>
src/Template/Pages/stats.ctp
@@ -20,23 +20,45 @@ for ($y=$year ; $y&gt;$year-5 ; $y--) { @@ -20,23 +20,45 @@ for ($y=$year ; $y&gt;$year-5 ; $y--) {
20 $years[$y]['validated'] = 8; 20 $years[$y]['validated'] = 8;
21 $years[$y]['archived'] = 8; 21 $years[$y]['archived'] = 8;
22 } 22 }
  23 +
  24 +$suivis = [];
  25 +$prets = [];
  26 +$suivis['tot'] = 100;
  27 +$suivis['avg'] = 10;
  28 +for ($y=$current_year ; $y>=$year_min ; $y--) $suivis[$y] = 8;
  29 +$prets = $suivis;
23 */ 30 */
24 31
  32 +
  33 +
25 // Parameters passed by controller 34 // Parameters passed by controller
26 $current_year = $current_year; 35 $current_year = $current_year;
27 -$years = $years; 36 +$year_min = $year_min;
  37 +$nbyears = $nbyears;
28 $avg = $avg; 38 $avg = $avg;
29 $tot = $tot; 39 $tot = $tot;
  40 +//$tot2 = $tot2;
  41 +$years = $years;
  42 +//debug($suivis);
30 43
31 44
32 45
33 -function echoAsBold($elem, $bold) {  
34 - if ($bold) echo '<b>';  
35 - echo $elem;  
36 - if ($bold) echo '</b>'; 46 +function echoAsPctAndBold($nbelem, $total=null, $is_bold=false) {
  47 + if ($is_bold) echo '<b>';
  48 + if ($total !== null) {
  49 + $pct = round( ($nbelem / $total) * 100 , 1 );
  50 + $nbelem = "$pct% ($nbelem)";
  51 + //$nbelem = "$nbelem ($pct%)";
  52 + //$nbelem = "$pct%";
  53 + }
  54 + echo $nbelem;
  55 + if ($is_bold) echo '</b>';
37 } 56 }
38 57
39 -function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null) { 58 +
  59 +
  60 +//function displayStatsLine($title, $line, $suivis, $prets, $bold=false, $year_prev=null, $avg=null) {
  61 +function displayStatsLine($title, $line, $is_bold=false, $year_prev=null, $avg=null) {
40 ?> 62 ?>
41 <tr> 63 <tr>
42 64
@@ -63,22 +85,25 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null @@ -63,22 +85,25 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
63 <td><?=$evol_from_avg?></td> 85 <td><?=$evol_from_avg?></td>
64 86
65 <!-- TOTAL --> 87 <!-- TOTAL -->
66 - <td><?=echoAsBold($total, $bold)?></td> 88 + <td><?=echoAsPctAndBold($total, null, $is_bold)?></td>
67 89
68 <!-- VALIDATED --> 90 <!-- VALIDATED -->
69 - <?php  
70 - $pct_validated = round( ($line['VALIDATED'] / $total) * 100 );  
71 - ?>  
72 - <td><?=echoAsBold($line['VALIDATED']." ($pct_validated%)", $bold)?></td> 91 + <td><?=echoAsPctAndBold($line['VALIDATED'], $total, $is_bold)?></td>
73 92
74 <!-- TBA --> 93 <!-- TBA -->
75 - <td><?=echoAsBold($line['TOBEARCHIVED'], $bold)?></td>  
76 - <?php  
77 - $pct_archived = round( ($line['ARCHIVED'] / $total) * 100 );  
78 - ?>  
79 - 94 + <!--
  95 + <td><echoAsPctAndBold($line['TOBEARCHIVED'], null, $is_bold)></td>
  96 + -->
  97 + <td><?=echoAsPctAndBold($line['TOBEARCHIVED'], $total, $is_bold)?></td>
  98 +
80 <!-- ARCHIVED --> 99 <!-- ARCHIVED -->
81 - <td><?=echoAsBold($line['ARCHIVED']." ($pct_archived%)", $bold)?></td> 100 + <td><?=echoAsPctAndBold($line['ARCHIVED'], $total, $is_bold)?></td>
  101 +
  102 + <!-- SUIVIS -->
  103 + <td><?=echoAsPctAndBold($line['suivis'], $total, $is_bold)?></td>
  104 +
  105 + <!-- EMPRUNTS -->
  106 + <td><?=echoAsPctAndBold($line['prets'], $total, $is_bold)?></td>
82 107
83 </tr> 108 </tr>
84 <?php 109 <?php
@@ -104,6 +129,38 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null @@ -104,6 +129,38 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
104 <center>STATISTIQUES SUR LES MATÉRIELS</center> 129 <center>STATISTIQUES SUR LES MATÉRIELS</center>
105 </h2> 130 </h2>
106 131
  132 +<p>
  133 +<table>
  134 +<tr>
  135 +<td><b>Prendre en compte les</b></td>
  136 +<td>
  137 +<?php
  138 + echo $this->Form->create('Statistiques', [
  139 + 'type' => 'get',
  140 + ]);
  141 + //echo '<input name="s_all_2" class="search-input" type="text" id="MaterielSAll">';
  142 + echo $this->Form->control('nbyears', [
  143 + 'id' => 'nby',
  144 + //'class' => 'search-input',
  145 + 'label' => '',
  146 + //'type' => 'text',
  147 + 'default' => $nbyears
  148 + ]);
  149 + /*
  150 + echo $this->Form->submit('Chercher', [
  151 + 'name' => 'MaterielSAll',
  152 + 'id' => 'MaterielSAll',
  153 + 'style' => 'margin: 0px;'
  154 + ]);
  155 + */
  156 + echo $this->Form->end();
  157 +?>
  158 +</td>
  159 +<td><b>dernières années (<?=$current_year.'-'.$year_min?>)</b></td>
  160 +</tr>
  161 +</table>
  162 +</p>
  163 +
107 164
108 <table border=2> 165 <table border=2>
109 166
@@ -118,9 +175,12 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null @@ -118,9 +175,12 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
118 <th>Validés</th> 175 <th>Validés</th>
119 <th>En demande d'archivage</th> 176 <th>En demande d'archivage</th>
120 <th>Archivés</th> 177 <th>Archivés</th>
  178 + <th>Matériels suivis</th>
  179 + <th>Matériels empruntés</th>
121 </tr> 180 </tr>
122 --> 181 -->
123 <tr> 182 <tr>
  183 +
124 <th> </th> 184 <th> </th>
125 185
126 <th colspan="3" align="center">Matériels acquis</th> 186 <th colspan="3" align="center">Matériels acquis</th>
@@ -134,8 +194,13 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null @@ -134,8 +194,13 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
134 <th></th> 194 <th></th>
135 <th></th> 195 <th></th>
136 --> 196 -->
  197 +
  198 + <th colspan="2">Suivis et Emprunts</th>
  199 +
137 </tr> 200 </tr>
  201 +
138 <tr> 202 <tr>
  203 +
139 <th> </th> 204 <th> </th>
140 205
141 <th>Evol. \ N-1</th> 206 <th>Evol. \ N-1</th>
@@ -143,16 +208,27 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null @@ -143,16 +208,27 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
143 <th>Total</th> 208 <th>Total</th>
144 209
145 <th>Validés</th> 210 <th>Validés</th>
146 - <th>En demande d'archivage</th> 211 + <th>A archiver</th>
147 <th>Archivés</th> 212 <th>Archivés</th>
  213 +
  214 + <th>Matériels suivis</th>
  215 + <th>Matériels prêtés</th>
  216 +
148 </tr> 217 </tr>
  218 +
149 </thead> 219 </thead>
150 220
151 <!-- LIGNES DATA --> 221 <!-- LIGNES DATA -->
152 <tbody> 222 <tbody>
153 <?php 223 <?php
  224 +
  225 + displayStatsLine("Moyenne annuelle", $avg, true);
  226 + //displayStatsLine("Moyenne annuelle (sur les $nbyears dernières années)", $avg, true);
  227 + //displayStatsLine("Moyenne annuelle (sur toutes les années sauf 1ère et dernière)", $avg, true);
  228 +
154 displayStatsLine('Total Général', $tot, true); 229 displayStatsLine('Total Général', $tot, true);
155 - displayStatsLine('Moyenne par an', $avg, true); 230 + //displayStatsLine('Total Sauf 1ère et dernière années', $tot2, true);
  231 +
156 ?> 232 ?>
157 233
158 <!-- LIGNE VIDE DE SÉPARATION --> 234 <!-- LIGNE VIDE DE SÉPARATION -->
@@ -163,6 +239,8 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null @@ -163,6 +239,8 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
163 <td></td> 239 <td></td>
164 <td></td> 240 <td></td>
165 <td></td> 241 <td></td>
  242 + <td></td>
  243 + <td></td>
166 </tr> 244 </tr>
167 245
168 <!-- ANNÉE PAR ANNÉE (1 ligne par année) --> 246 <!-- ANNÉE PAR ANNÉE (1 ligne par année) -->
@@ -181,7 +259,9 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null @@ -181,7 +259,9 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
181 $year_prev = $y==$year_min ? null : $years[$y-1]; 259 $year_prev = $y==$year_min ? null : $years[$y-1];
182 displayStatsLine($year_title, $val, false, $year_prev, $avg); 260 displayStatsLine($year_title, $val, false, $year_prev, $avg);
183 } 261 }
  262 +
184 ?> 263 ?>
  264 +
185 </tbody> 265 </tbody>
186 266
187 </table> 267 </table>