stats.class.php 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. /**
  3. * Classe stats
  4. *
  5. * Cette classe fournit des méthodes pour calculer des statistiques générales
  6. * sur les employés, y compris les répartitions par sexe, contrat, activité,
  7. * et les entrées par année.
  8. */
  9. class stats {
  10. /**
  11. * Calcule les statistiques générales des employés.
  12. *
  13. * Cette méthode récupère les statistiques par lieu, y compris les répartitions
  14. * par sexe, contrat, activité, ainsi que les entrées par année. Elle calcule
  15. * également les statistiques globales pour tous les lieux combinés.
  16. *
  17. * @param int $_actifOnly Indique si seules les données des employés actifs doivent être prises en compte (1 par défaut).
  18. * @return array Retourne un tableau contenant les statistiques globales et par lieu.
  19. */
  20. public static function countStatistiquesGenerale(int $_actifOnly = 1){
  21. $actif = ($_actifOnly == 1) ? " AND actif = 1" : "";
  22. // Récupération des lieux distincts
  23. $lieuxQuery = db::query("SELECT DISTINCT lieu FROM " . DB_T_SALARIES);
  24. $lieuxList = db::resultset($lieuxQuery);
  25. $lieuxStats = [];
  26. $globalEntrees = [];
  27. foreach ($lieuxList as $row) {
  28. $lieu = addslashes($row['lieu']);
  29. // Statistiques par lieu
  30. $sql = "SELECT "
  31. . "SUM(IF(sexe = 'F'{$actif} AND lieu = '{$lieu}', 1, 0)) AS Femme, "
  32. . "SUM(IF(sexe = 'M'{$actif} AND lieu = '{$lieu}', 1, 0)) AS Homme, "
  33. . "SUM(IF(contrat = 1{$actif} AND lieu = '{$lieu}', 1, 0)) AS ContratOn, "
  34. . "SUM(IF(contrat = 0{$actif} AND lieu = '{$lieu}', 1, 0)) AS ContratOff, "
  35. . "SUM(IF(actif = 1 AND lieu = '{$lieu}', 1, 0)) AS ActifOn, "
  36. . "SUM(IF(actif = 0 AND lieu = '{$lieu}', 1, 0)) AS ActifOff "
  37. . "FROM " . DB_T_SALARIES;
  38. db::query($sql);
  39. $stats = db::single();
  40. $totalLieu = $stats['Femme'] + $stats['Homme'];
  41. $stats['PourcentageFemme'] = $totalLieu > 0 ? round(($stats['Femme'] / $totalLieu) * 100, 2) : 0;
  42. $stats['PourcentageHomme'] = $totalLieu > 0 ? round(($stats['Homme'] / $totalLieu) * 100, 2) : 0;
  43. // Entrées par année pour ce lieu
  44. $entrees = [];
  45. $entreeQuery = db::query("SELECT SUBSTR(jourEntree, 1, 4) AS anEntree FROM " . DB_T_SALARIES . " WHERE lieu = '{$lieu}'" . ($_actifOnly == 1 ? " AND actif = 1" : ""));
  46. foreach (db::resultset() as $value) {
  47. $an = $value["anEntree"];
  48. $entrees[$an] = isset($entrees[$an]) ? $entrees[$an] + 1 : 1;
  49. // Comptage global
  50. $globalEntrees[$an] = isset($globalEntrees[$an]) ? $globalEntrees[$an] + 1 : 1;
  51. }
  52. if (empty($entrees)) {
  53. $entrees[date("Y")] = 0;
  54. } else {
  55. ksort($entrees);
  56. }
  57. $stats['EntreesParAnnee'] = $entrees;
  58. $lieuxStats[$row['lieu']] = $stats;
  59. }
  60. // Statistiques globales
  61. $sqlGlobal = "SELECT "
  62. . "SUM(IF(sexe = 'F'{$actif}, 1, 0)) AS Femme, "
  63. . "SUM(IF(sexe = 'M'{$actif}, 1, 0)) AS Homme, "
  64. . "SUM(IF(contrat = 1{$actif}, 1, 0)) AS ContratOn, "
  65. . "SUM(IF(contrat = 0{$actif}, 1, 0)) AS ContratOff, "
  66. . "SUM(IF(actif = 1, 1, 0)) AS ActifOn, "
  67. . "SUM(IF(actif = 0, 1, 0)) AS ActifOff "
  68. . "FROM " . DB_T_SALARIES;
  69. db::query($sqlGlobal);
  70. $globalStats = db::single();
  71. $totalGlobal = $globalStats['Femme'] + $globalStats['Homme'];
  72. $globalStats['PourcentageFemme'] = $totalGlobal > 0 ? round(($globalStats['Femme'] / $totalGlobal) * 100, 2) : 0;
  73. $globalStats['PourcentageHomme'] = $totalGlobal > 0 ? round(($globalStats['Homme'] / $totalGlobal) * 100, 2) : 0;
  74. ksort($globalEntrees);
  75. $globalStats['EntreesParAnnee'] = $globalEntrees;
  76. $globalStats['Lieux'] = $lieuxStats;
  77. return $globalStats;
  78. }
  79. }