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,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) |
README.md
@@ -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>$year-5 ; $y--) { | @@ -20,23 +20,45 @@ for ($y=$year ; $y>$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> |