Commit 0ed158cdfff612801ae135ae62e7afaad767b6d5
1 parent
b36650e5
Exists in
master
and in
1 other branch
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
Showing
6 changed files
with
373 additions
and
128 deletions
Show diff stats
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>$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> | ... | ... |