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
CHANGES.txt
... ... @@ -15,7 +15,7 @@ CHANGEMENTS
15 15 -------
16 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 20 - Améliorations de la page qui liste les matériels (/materiels/index) :
21 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 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 86 25/07/2020 v3.7.9.72-75 (EP)
81 87 - Fiabilisation du nouveau script database/update/db-update.sh
82 88 - Try-catch avant exécution grosses requetes sql (par exemple celle pour la vue index des materiels)
... ...
README.md
... ... @@ -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 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 766 if ($GM !== null && $GM != TableRegistry::getTableLocator()->get('GroupesMetiers')->find()
767 767 ->where([
768 768 'nom =' => 'N/A'
769   - ])
770   - ->first()['id'])
  769 + ])->first()['id'])
771 770 $conditions = [
772 771 'Materiels.groupes_metier_id =' => $GM,
773 772 'Materiels.status !=' => 'ARCHIVED'
774 773 ];
775 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 776 ->where([
778 777 'nom =' => 'N/A'
779 778 ])
780   - ->first()['id'])
  779 + ->first()['id'])
781 780 $conditions = [
782 781 'Materiels.groupes_thematique_id =' => $GT,
783 782 'Materiels.status !=' => 'ARCHIVED'
784 783 ];
785 784 else
786   - $conditions = [
787   - 'Materiels.id =' => 0
788   - ];
  785 + $conditions = [ 'Materiels.id =' => 0 ];
789 786 }
790 787  
791 788 $GMV = $this->request->getQuery('GMV');
... ...
src/Controller/PagesController.php
... ... @@ -295,104 +295,10 @@ class PagesController extends AppController
295 295 $this->set(compact('lab_name'));
296 296 }
297 297  
  298 +
298 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 303 // - Page des OUTILS
398 304 if ($this->page=='tools') {
... ... @@ -415,5 +321,250 @@ class PagesController extends AppController
415 321 }
416 322  
417 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 8  
9 9 <th><?= $this->Paginator->sort('id', 'N°') ?></th>
10 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 14 <th><?= $this->Paginator->sort('emprunt_interne', 'Type') ?></th>
13 15 <th><?= $this->Paginator->sort('date_emprunt' ,'Date emprunt') ?></th>
14 16 <th><?= $this->Paginator->sort('date_retour_emprunt', 'Date retour') ?></th>
... ... @@ -30,12 +32,21 @@
30 32  
31 33 <td class="smallText"><?php echo $this->Html->link('Emprunt '.$this->Number->format($emprunt->id), ['action' => 'view', $emprunt->id])?></td>
32 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 38 <td class="smallText"><?php if (h($emprunt->emprunt_interne) == '1') { echo 'Interne'; } else { echo 'Externe'; } ?></td>
35 39 <td class="smallText"><?= h($emprunt->date_emprunt) ?></td>
36 40 <td class="smallText"><?= h($emprunt->date_retour_emprunt) ?></td>
37 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 52 </tr>
... ...
src/Template/Pages/stats.ctp
... ... @@ -20,23 +20,45 @@ for ($y=$year ; $y&gt;$year-5 ; $y--) {
20 20 $years[$y]['validated'] = 8;
21 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 34 // Parameters passed by controller
26 35 $current_year = $current_year;
27   -$years = $years;
  36 +$year_min = $year_min;
  37 +$nbyears = $nbyears;
28 38 $avg = $avg;
29 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 63 <tr>
42 64  
... ... @@ -63,22 +85,25 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
63 85 <td><?=$evol_from_avg?></td>
64 86  
65 87 <!-- TOTAL -->
66   - <td><?=echoAsBold($total, $bold)?></td>
  88 + <td><?=echoAsPctAndBold($total, null, $is_bold)?></td>
67 89  
68 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 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 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 108 </tr>
84 109 <?php
... ... @@ -104,6 +129,38 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
104 129 <center>STATISTIQUES SUR LES MATÉRIELS</center>
105 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 165 <table border=2>
109 166  
... ... @@ -118,9 +175,12 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
118 175 <th>Validés</th>
119 176 <th>En demande d'archivage</th>
120 177 <th>Archivés</th>
  178 + <th>Matériels suivis</th>
  179 + <th>Matériels empruntés</th>
121 180 </tr>
122 181 -->
123 182 <tr>
  183 +
124 184 <th> </th>
125 185  
126 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 194 <th></th>
135 195 <th></th>
136 196 -->
  197 +
  198 + <th colspan="2">Suivis et Emprunts</th>
  199 +
137 200 </tr>
  201 +
138 202 <tr>
  203 +
139 204 <th> </th>
140 205  
141 206 <th>Evol. \ N-1</th>
... ... @@ -143,16 +208,27 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
143 208 <th>Total</th>
144 209  
145 210 <th>Validés</th>
146   - <th>En demande d'archivage</th>
  211 + <th>A archiver</th>
147 212 <th>Archivés</th>
  213 +
  214 + <th>Matériels suivis</th>
  215 + <th>Matériels prêtés</th>
  216 +
148 217 </tr>
  218 +
149 219 </thead>
150 220  
151 221 <!-- LIGNES DATA -->
152 222 <tbody>
153 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 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 234 <!-- LIGNE VIDE DE SÉPARATION -->
... ... @@ -163,6 +239,8 @@ function displayStatsLine($title, $line, $bold=false, $year_prev=null, $avg=null
163 239 <td></td>
164 240 <td></td>
165 241 <td></td>
  242 + <td></td>
  243 + <td></td>
166 244 </tr>
167 245  
168 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 259 $year_prev = $y==$year_min ? null : $years[$y-1];
182 260 displayStatsLine($year_title, $val, false, $year_prev, $avg);
183 261 }
  262 +
184 263 ?>
  264 +
185 265 </tbody>
186 266  
187 267 </table>
... ...