* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class CelStatistique extends Cel { /** * Méthode appelée avec une requête de type GET. */ public function getElement($param) { $graph = null; $serveur = ''; if (isset($param[0])) { $graph_demande = array_shift($param); $methode = 'get'.$graph_demande; if (method_exists($this, $methode)) { $graph = $this->$methode($param); } else { $this->messages[] = "Ce type de graphique '$graph_demande' n'est pas disponible."; } } else { $this->messages[] = "Le premier paramêtre du service CEL Statistique doit correspondre au type de graphique."; } if (!is_null($graph)) { $serveur = (isset($_GET['serveur']) && preg_match('/^[0-9]$/', $_GET['serveur'])) ? $_GET['serveur'].'.' : ''; $url = "http://{$serveur}chart.apis.google.com/chart"; $contexte = stream_context_create( array('http' => array( 'method' => 'POST', 'content' => http_build_query($graph), 'header' => 'Content-Type: application/x-www-form-urlencoded'))); $image = file_get_contents($url, false, $contexte); $this->envoyer($image, 'image/png', null, false); } else { $info = 'Un problème est survenu : '.print_r($this->messages, true); $this->envoyer($info); } } private function getEvolImgLieesParMois($param) { $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : null; // Récupération des données $requete = "SELECT DATE_FORMAT(date_creation, '%Y%m') AS periode, COUNT(id_image) AS nbre ". "FROM cel_images ". "WHERE date_creation != '0000-00-00 00:00:00' ". ' AND ce_observation IS NOT NULL AND ce_observation != 0 '. ((isset($utilisateur)) ? " AND courriel_utilisateur = $utilisateur " : ''). 'GROUP BY periode '. 'ORDER BY periode '; $resulats = Cel::db()->requeter($requete); $img_totale = array(); foreach ($resulats as $info) { $img_totale[$info['periode']] = $info['nbre']; } // Trie des dates pour les étiquettes des axes $dates = array(); $annees = array(); $les_mois = array(); $pas = 1; // intervalle de mois entre deux étiquettes $periode = 0; $cumul = 0; $img_totale_cumul = array(); foreach ($img_totale as $annee_mois => $nbre) { $annee = substr($annee_mois, 0, 4); $mois = substr($annee_mois, 4, 2); $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01")); $cumul += $nbre; $img_totale_cumul[$annee_mois] = $cumul; if (!isset($dates[$annee][$mois])) { $annees[] = (!isset($dates[$annee]) ? $annee : ''); $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; // Ajouter au tableau dates tjrs à la fin $dates[$annee][$mois] = 1; } } // Post traitement des données $titre = "Évolution des images liées aux observations par mois"; $valeurs_y = implode(',', $img_totale); $valeurs_r = implode(',', $img_totale_cumul); $valeurs_max_y = max($img_totale); $valeurs_max_r = max($img_totale_cumul); $y_val_fin = $valeurs_max_y; $y_pas = 200; $r_val_fin = $valeurs_max_r; $r_pas = 1000; $etiquettes_x1 = implode('|', $les_mois); $etiquettes_x2 = implode('|', $annees); $etiquettes_y = 'Images'; // Construire de l'url de l'image $graph = array('cht' => 'lc', 'chtt' => $titre, 'chs' => '600x200', 'chco' => '007F00,99CC00', 'chd' => 't:'.$valeurs_y.'|'.$valeurs_r, 'chds' => "0,$valeurs_max_y,0,$valeurs_max_r", 'chxt' => 'y,y,x,x,r', 'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'', 'chxp' => '1,50|3,0', 'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas", 'chm' => 'N ** ,000000,0,-1,8,1.0,ht', 'chxs' => '0,007F00|4,99CC00'); return $graph; } private function getEvolImgParMois($param) { $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : null; // Récupération des données $requete = "SELECT DATE_FORMAT(date_creation, '%Y%m') AS periode, COUNT(id_image) AS nbre ". "FROM cel_images ". "WHERE date_creation != '0000-00-00 00:00:00' ". ((isset($utilisateur)) ? " AND courriel_utilisateur = $utilisateur " : ''). 'GROUP BY periode '. 'ORDER BY periode '; $resulats = Cel::db()->requeter($requete); $img_totale = array(); foreach ($resulats as $info) { $img_totale[$info['periode']] = $info['nbre']; } // Trie des dates pour les étiquettes des axes $dates = array(); $annees = array(); $les_mois = array(); $pas = 1; // intervalle de mois entre deux étiquettes $periode = 0; $cumul = 0; $img_totale_cumul = array(); foreach ($img_totale as $annee_mois => $nbre) { $annee = substr($annee_mois, 0, 4); $mois = substr($annee_mois, 4, 2); $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01")); $cumul += $nbre; $img_totale_cumul[$annee_mois] = $cumul; if (!isset($dates[$annee][$mois])) { $annees[] = (!isset($dates[$annee]) ? $annee : ''); $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; // Ajouter au tableau dates tjrs à la fin $dates[$annee][$mois] = 1; } } // Post traitement des données $titre = "Évolution du dépôt d'images par mois"; $valeurs_y = implode(',', $img_totale); $valeurs_r = implode(',', $img_totale_cumul); $valeurs_max_y = max($img_totale); $valeurs_max_r = max($img_totale_cumul); $y_val_fin = $valeurs_max_y; $y_pas = 500; $r_val_fin = $valeurs_max_r; $r_pas = 1000; $etiquettes_x1 = implode('|', $les_mois); $etiquettes_x2 = implode('|', $annees); $etiquettes_y = 'Images'; // Construire de l'url de l'image $graph = array('cht' => 'lc', 'chtt' => $titre, 'chs' => '600x200', 'chco' => '007F00,99CC00', 'chd' => 't:'.$valeurs_y.'|'.$valeurs_r, 'chds' => "0,$valeurs_max_y,0,$valeurs_max_r", 'chxt' => 'y,y,x,x,r', 'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'', 'chxp' => '1,50|3,0', 'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas", 'chm' => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,-1,8,1.0,ht', 'chxs' => '0,007F00|4,99CC00'); return $graph; } private function getEvolUtilisateurParMois($param) { // Récupération des données $requete = 'SELECT DISTINCT courriel_utilisateur , '. ' MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '. ' COUNT(id_observation) AS obs_nbre '. 'FROM cel_obs '. "WHERE date_creation != '0000-00-00 00:00:00' ". " AND courriel_utilisateur LIKE '%@%' ". 'GROUP BY courriel_utilisateur '. 'ORDER BY date_min ASC '; $resultats = Cel::db()->requeter($requete); // Trie des données et des dates pour les étiquettes des axes $dates = array(); $annees = array(); $utilisateurs = array(); $les_mois = array(); $pas = 2; // intervalle de mois entre deux étiquettes $periode = 0; foreach ($resultats as $enrg) { $annee = substr($enrg['date_min'], 0, 4); $mois = substr($enrg['date_min'], 5, 2); $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01")); if (!isset($dates[$annee][$mois])) { $annees[] = (!isset($dates[$annee]) ? $annee : ''); $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; $utilisateurs["$annee-$mois"] = 1; // Ajouter au tableau dates tjrs à la fin $dates[$annee][$mois] = 1; } else { $utilisateurs["$annee-$mois"]++; } } // Post traitement des données $titre = 'Évolution des utilisateurs par mois'; $valeurs = implode(',', $utilisateurs); $valeurs_max = max($utilisateurs); $y_val_fin = $valeurs_max; $y_pas = 5; $etiquettes_x1 = implode('|', $les_mois); $etiquettes_x2 = implode('|', $annees); $etiquettes_y = 'Utilisateurs'; // Construire de l'url de l'image $graph = array('cht' => 'lc', 'chtt' => $titre, 'chs' => '600x200', 'chco' => '0000FF',//4D89F9 'chd' => 't:'.$valeurs, 'chds' => '0,'.$valeurs_max, 'chxt' => 'y,y,x,x', 'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'', 'chxp' => '1,50|3,0', 'chxr' => "0,0,$y_val_fin,$y_pas", 'chm' => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,2::2,8,1.0,ht', 'chxs' => '0,0000FF|1,0000FF'); return $graph; } private function getEvolObsParMoisGlissant($param) { // Récupération des données $format_date = '%Y%m%d'; $where = 'date_creation > DATE_SUB(NOW(), INTERVAL 31 DAY)'; $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation', $format_date, $where); // Tri des dates pour les étiquettes des axes $dates = array(); $annees = array(); $annees_mois = array(); $jours = array(); foreach ($obs_totale as $annee_mois_jours => $nbre) { $annee = substr($annee_mois_jours, 0, 4); $mois = substr($annee_mois_jours, 4, 2); $jour = substr($annee_mois_jours, 6, 2); $annee_mois_fmt_B = strftime('%B %Y', mktime(0, 0, 0, $mois, 1, $annee)); if (!isset($dates[$annee][$mois][$jour])) { $annees_mois[] = (!isset($dates[$annee][$mois]) ? $annee_mois_fmt_B : ''); $jours[] = $jour; // Ajouter au tableau dates tjrs à la fin $dates[$annee][$mois][$jour] = 1; } } // Post traitement des données $titre = 'Évolution des observations sur un mois glissant'; $valeurs_max = max($obs_totale); $valeurs = implode(',', $obs_totale); $y_val_fin = $valeurs_max; $y_pas = round($valeurs_max / 6); $etiquettes_x1 = implode('|', $jours); $etiquettes_x2 = implode('|', $annees_mois); $etiquettes_y2 = 'Observations'; // Construire de l'url de l'image $graph = array('cht' => 'lc', 'chtt' => $titre, 'chs' => '600x200', 'chco' => '822013', 'chd' => 't:'.$valeurs, 'chds' => '0,'.$valeurs_max, 'chxt' => 'y,y,x,x', 'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2, 'chxp' => '0,0|1,50', 'chxr' => "0,0,$y_val_fin,$y_pas", 'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht', 'chxs' => '0,822013|1,822013'); return $graph; } private function getEvolObsParMois($param) { // Récupération des données $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation'); // Trie des dates pour les étiquettes des axes $dates = array(); $annees = array(); $les_mois = array(); $pas = 3; // intervalle de mois entre deux étiquettes $periode = 0; $cumul = 0; $obs_totale_cumul = array(); foreach ($obs_totale as $annee_mois => $nbre) { $annee = substr($annee_mois, 0, 4); $mois = substr($annee_mois, 4, 2); $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01")); $cumul += $nbre; $obs_totale_cumul[$annee_mois] = $cumul; if (!isset($dates[$annee][$mois])) { $annees[] = (!isset($dates[$annee]) ? $annee : ''); $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; // Ajouter au tableau dates tjrs à la fin $dates[$annee][$mois] = 1; } } // Post traitement des données $titre = 'Évolution des observations par mois'; $valeurs_y = implode(',', $obs_totale); $valeurs_r = implode(',', $obs_totale_cumul); $valeurs_max_y = max($obs_totale); $valeurs_max_r = max($obs_totale_cumul); $y_val_fin = $valeurs_max_y; $y_pas = round(($valeurs_max_y / 6), 0); $r_val_fin = $valeurs_max_r; $r_pas = round(($valeurs_max_r / 6), 0); $etiquettes_x1 = implode('|', $les_mois); $etiquettes_x2 = implode('|', $annees); $etiquettes_y2 = 'Observations'; $etiquettes_r2 = 'Cumul obs.'; // Construire de l'url de l'image $graph = array('cht' => 'lc', 'chtt' => $titre, 'chs' => '600x200', 'chco' => '822013,F1841D', 'chd' => 't:'.$valeurs_y.'|'.$valeurs_r, 'chds' => "0,$valeurs_max_y,0,$valeurs_max_r", 'chxt' => 'y,y,x,x,r,r', 'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2.'|5:|'.$etiquettes_r2.'', 'chxp' => '1,50|3,0|5,50', 'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas", 'chm' => 'N ** ,000000,0,2::2,8,1.0,ht', 'chxs' => '0,822013|1,822013|4,F1841D|5,F1841D'); return $graph; } private function getEvolObsParAn($param) { // Récupération des données $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y'); // Trie des dates pour les étiquettes des axes $dates = array(); $annees = array(); foreach ($obs_totale as $annee => $nbre) { if (!isset($dates[$annee])) { $annees[] = $annee; $dates[$annee] = 1; } } // Post traitement des données $titre = 'Évolution des observations par année'; $valeurs = implode(',', $obs_totale); $valeurs_max = max($obs_totale); $valeurs_min = min($obs_totale); $y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min); $y_val_fin = $valeurs_max; $y_pas = round(($valeurs_max / 6), 0); $etiquettes_x = implode('|', $annees);; $etiquettes_y = 'Observations'; // Construire de l'url de l'image $graph = array('cht' => 'lc', 'chtt' => $titre, 'chs' => '600x200', 'chco' => '822013', 'chd' => 't:'.$valeurs, 'chds' => "$valeurs_min,$valeurs_max", 'chxt' => 'y,y,x', 'chxl' => '1:|'.$etiquettes_y.'|2:|'.$etiquettes_x.'', 'chxp' => '0,0|1,50|2,0', 'chxr' => "0,$y_val_deb,$y_val_fin,$y_pas", 'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht', 'chxs' => '0,822013|1,822013'); return $graph; } private function getEvolObsHisto($param) { // Récupération des données $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation'); $obs_identifiee = $this->executerRequeteEvol('cel_obs', 'id_observation', "courriel_utilisateur LIKE '%@%' "); $lignes = array('total', 'obs. identifiée'); // Post traitement des données $titre = 'Évolution des observations'; $valeurs = implode(',', $obs_totale).'|'.implode(',', $obs_identifiee); $valeurs_max = max($obs_totale); $etiquettes = implode('|', array_keys($lignes)); // Construire de l'url de l'image $graph = array('cht' => 'lc', 'chtt' => $titre, 'chs' => '500x300', 'chco' => 'FF0000,00FF00', 'chd' => 't:'.$valeurs, 'chds' => "0,$valeurs_max", 'chxt' => 'y', 'chxl' => '0:|'.$etiquettes.'', 'chm' => 'N,000000,0,-1,10'); return $graph; } private function getNbreObsIdVsTest($param) { // Récupération des données $obs_totale = $this->executerRequeteNombre('cel_obs', 'id_observation'); $obs_identifiee = $this->executerRequeteNombre('cel_obs', 'id_observation', "courriel_utilisateur LIKE '%@%' "); $obs_test = $obs_totale - $obs_identifiee; $pourcent_identifiee = round(($obs_identifiee / ($obs_totale / 100)), 2).'%'; $pourcent_anonyme = round(($obs_test / ($obs_totale / 100)), 2).'%'; // Post traitement des données de la base de données $titre = "Nombre d'observations|tests vs. identifiées"; $etiquette_obs_test = "tests ($obs_test - $pourcent_anonyme)"; $etiquette_obs_id = "identifiées ($obs_identifiee - $pourcent_identifiee)"; $donnees = array($etiquette_obs_test => $obs_test, $etiquette_obs_id => $obs_identifiee); $valeurs = implode(',', $donnees); $etiquettes = implode('|', array_keys($donnees)); // Construire les paramêtres de l'url de l'image $graph = array('cht' => 'p3', 'chtt' => $titre, 'chs' => '250x200', 'chco' => 'FF0000,00FF00', 'chd' => 't:'.$valeurs, 'chds' => "0,$obs_totale", 'chdl' => $etiquettes, 'chdlp' => 'bv|r', 'chts' => '000000,12'); return $graph; } private function getNbreObsPublicVsPrivee($param) { // Récupération des données $obs_totale = $this->executerRequeteNombre('cel_obs', 'id_observation'); $obs_public = $this->executerRequeteNombre('cel_obs', 'id_observation', 'transmission = 1'); $obs_privee = $obs_totale - $obs_public; $pourcent_privee = round(($obs_privee / ($obs_totale / 100)), 2).'%'; $pourcent_public = round(($obs_public / ($obs_totale / 100)), 2).'%'; // Post traitement des données de la base de données $titre = "Nombre d'observations|publiques vs. privées"; $etiquette_obs_public = "publiques ($obs_public - $pourcent_public)"; $etiquette_obs_privee = "privées ($obs_privee - $pourcent_privee)"; $donnees = array($etiquette_obs_privee => $obs_privee, $etiquette_obs_public => $obs_public); $valeurs = implode(',', $donnees); $etiquettes = implode('|', array_keys($donnees)); // Construire les paramêtres du graph $graph = array('cht' => 'p3', 'chtt' => $titre, 'chs' => '250x200', 'chco' => 'FF0000,00FF00', 'chd' => 't:'.$valeurs, 'chds' => "0,$obs_totale", 'chdl' => $etiquettes, 'chdlp' => 'bv|r', 'chts' => '000000,12'); return $graph; } private function getNbreObsDetermineeVsInconnue($param) { // Récupération des données $obs_totale = $this->executerRequeteNombre('cel_obs', 'id_observation'); $obs_determinee = $this->executerRequeteNombre('cel_obs', 'id_observation', 'nom_sel_nn != 0'); $obs_inconnue = $obs_totale - $obs_determinee; $pourcent_determinee = round(($obs_determinee / ($obs_totale / 100)), 2).'%'; $pourcent_inconnue = round(($obs_inconnue / ($obs_totale / 100)), 2).'%'; // Post traitement des données de la base de données $titre = "Nombre d'observations|determinées vs. inconnues"; $etiquette_obs_determinee = "determinées ($obs_determinee - $pourcent_determinee)"; $etiquette_obs_inconnue = "non déterminées ($obs_inconnue - $pourcent_inconnue)"; $donnees = array($etiquette_obs_inconnue => $obs_inconnue, $etiquette_obs_determinee => $obs_determinee); $valeurs = implode(',', $donnees); $etiquettes = implode('|', array_keys($donnees)); // Construire les paramêtres du graph $graph = array('cht' => 'p3', 'chtt' => $titre, 'chs' => '250x200', 'chco' => 'FF0000,00FF00', 'chd' => 't:'.$valeurs, 'chds' => "0,$obs_totale", 'chdl' => $etiquettes, 'chdlp' => 'bv|r', 'chts' => '000000,12'); return $graph; } private function getNbreObsAvecIndicationGeo($param) { // Récupération des données $total = $this->executerRequeteNombre('cel_obs', 'id_observation'); $where_commune = $this->creerWhereIndicationGeo('zone_geo'); $obs['commune'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_commune); $where_commune_id = $this->creerWhereIndicationGeo('ce_zone_geo'); $obs['commune identifiée'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_commune_id); $where_lieudit = $this->creerWhereIndicationGeo('lieudit'); $obs['lieu-dit'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_lieudit); $where_station = $this->creerWhereIndicationGeo('station'); $obs['station'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_station); $where_milieu = $this->creerWhereIndicationGeo('milieu'); $obs['milieu'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_milieu); $where_xy = $this->creerWhereIndicationGeo('latitude').' AND '.$this->creerWhereIndicationGeo('longitude'); $obs['coordonnée'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_xy); $donnees = array(); $num = 1; foreach ($obs as $etiquette => $nbre) { $pourcent = round(($obs[$etiquette] / ($total / 100)), 1).'%'; $legende = "$num : $etiquette ($nbre - $pourcent)"; $donnees['valeurs'][] = $nbre; $donnees['etiquettes'][] = $num++; $donnees['legendes'][] = $legende; } // Post traitement des données de la base de données $titre = "Nombre d'observations|avec indications géographiques"; $valeurs = implode(',', $donnees['valeurs']); $etiquettes = implode('|', $donnees['etiquettes']); $legendes = implode('|', $donnees['legendes']); // Construire les paramêtres du graph $graph = array('cht' => 'rs', 'chtt' => $titre, 'chs' => '600x300', 'chco' => 'FFFFFF', 'chd' => 't:'.$valeurs, 'chds' => "0,$total", 'chdl' => $legendes, 'chxt' => 'x', 'chxl' => "0:|$etiquettes", //'chxp' => '1,0,20,40,60,80,100',// Grille sous forme de cible 'chm' => 'B,FF000080,0,1.0,5.0'); return $graph; } private function creerWhereIndicationGeo($champ) { $where = null; if (isset($champ)) { $where = "$champ != '000null' ". "AND $champ != '' ". "AND $champ IS NOT NULL "; } return $where; } private function getUtilisationJournaliere($param) { // Sur quel jour, voulons nous estimer l'utilisation $aujourdhui = date('Y-m-d'); if (isset($param[0]) && preg_match('/^[0-9]{4}(?:-[0-9]{2}){2}$/', $param[0])) { $aujourdhui = $param[0]; } $aujourdhui_fmt = strftime('%d %b %Y', strtotime($aujourdhui)); // Récupération des données $max_obs = array(); $max_obs[] = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y%m%d', "date_creation NOT LIKE '$aujourdhui%' ", 'date_creation'); $max_obs[] = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y%m%d', "date_modification NOT LIKE '$aujourdhui%' ", 'date_modification'); $max_obs[] = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y%m%d', "date_transmission NOT LIKE '$aujourdhui%' ", 'date_transmission'); $obs_aujourdhui = $this->executerRequeteNombre('cel_obs', 'id_observation', "(date_creation LIKE '$aujourdhui%' OR date_modification LIKE '$aujourdhui%' OR date_transmission LIKE '$aujourdhui%') "); // Cummul des obs crées, modifiées, transmises par jour $donnees = array(); foreach ($max_obs as $obs_par_jour) { foreach ($obs_par_jour as $annee_mois_jour => $nbre) { if (!isset($donnees[$annee_mois_jour])) { $donnees[$annee_mois_jour] = $nbre; } else { $donnees[$annee_mois_jour] += $nbre; } } } // Post traitement des données $valeur = $obs_aujourdhui; $valeur_max = 400; if ($valeur > $valeur_max) { $pourcentage = 100; } else { $pourcentage = round(($valeur / ($valeur_max / 100)), 0); } $etiquettes_x = $aujourdhui_fmt; $etiquettes_y = "faible|moyenne|forte"; $titre = "Intensité d'utilisation pour le $aujourdhui_fmt"; $legende = "$valeur changements"; // Construire de l'url de l'image $graph = array('cht' => 'gom', 'chtt' => $titre, 'chdl' => "$legende", 'chdlp' => 'b', 'chs' => '350x200', 'chco' => 'FFFF00,0A7318', 'chls' => '3|10', 'chma' => '0,0,0,0|300,40', 'chd' => 't:'.$pourcentage, 'chxt' => 'x,y', 'chxl' => '0:|'.$etiquettes_x.'|1:|'.$etiquettes_y.'', 'chxp' => '0,50'); return $graph; } private function getNbreObsParUtilisateur($param) { // Récupération des données $requete = 'SELECT courriel_utilisateur, COUNT(id_observation) AS nbre '. 'FROM cel_obs '. 'GROUP BY courriel_utilisateur '; $utilisateurs = Cel::db()->requeter($requete); // Création des classes d'utilisateurs $classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0); $donnees['Utilisateurs'] = $classes; $valeur_max = 0; foreach ($utilisateurs as $utilisateur) { $id = $utilisateur['courriel_utilisateur']; $nbre = $utilisateur['nbre']; // Détermination de la classe $classe = ''; if (0 < $nbre && $nbre <= 10) { $classe = '00->10'; } else if (10 < $nbre && $nbre <= 50) { $classe = '11->50'; } else if (50 < $nbre && $nbre <= 100) { $classe = '51->100'; } else if (100 < $nbre && $nbre <= 500) { $classe = '101->500'; } else if (500 < $nbre) { $classe = '500->∞'; } // Détermination du type d'utilisateur if (strstr($id, '@')) { $type = 'Utilisateurs'; // Incrémentation du tableau de données et récupration de la valeur max $donnees[$type][$classe]++; if ($donnees[$type][$classe] > $valeur_max) { $valeur_max = $donnees[$type][$classe]; } } } // Post traitement des données $titre = "Nombre d'observations par utilisateur"; $y1_val_fin = $valeur_max; $y1_pas = '100'; $valeurs = implode(',', $donnees['Utilisateurs']); $etiquettes_x1 = implode('|', array_keys($classes)); $etiquettes_x2 = 'Observations'; $etiquettes_y2 = 'Utilisateurs'; $legendes = implode('|', array_keys($donnees)); // Construire de l'url de l'image $graph = array('cht' => 'bvg', 'chtt' => $titre, 'chs' => '400x200', 'chco' => '00FF00,FF0000', 'chbh' => 'r,0.3,1', 'chd' => 't:'.$valeurs, 'chds' => "0,$valeur_max", 'chxt' => 'x,x,y,y', 'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'', 'chxp' => '1,100|3,100', 'chxr' => "2,0,$y1_val_fin,$y1_pas", 'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e'); //echo '
'.print_r($graph,true).'
'; return $graph; } private function getNbreObsParUtilisateurEtTest($param) { // Récupération des données $requete = 'SELECT courriel_utilisateur, COUNT(id_observation) AS nbre '. 'FROM cel_obs '. 'GROUP BY courriel_utilisateur '; $utilisateurs = Cel::db()->requeter($requete); // Création des classes d'utilisateurs $classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0); $donnees['Utilisateurs'] = $classes; $donnees['Tests'] = $classes; $valeur_max = 0; foreach ($utilisateurs as $utilisateur) { $id = $utilisateur['courriel_utilisateur']; $nbre = $utilisateur['nbre']; // Détermination de la classe $classe = ''; if (0 < $nbre && $nbre <= 10) { $classe = '00->10'; } else if (10 < $nbre && $nbre <= 50) { $classe = '11->50'; } else if (50 < $nbre && $nbre <= 100) { $classe = '51->100'; } else if (100 < $nbre && $nbre <= 500) { $classe = '101->500'; } else if (500 < $nbre) { $classe = '500->∞'; } // Détermination du type d'utilisateur if (strstr($id, '@')) { $type = 'Utilisateurs'; } else { $type = 'Tests'; } // Incrémentation du tableau de données et récupration de la valeur max $donnees[$type][$classe]++; if ($donnees[$type][$classe] > $valeur_max) { $valeur_max = $donnees[$type][$classe]; } } // Post traitement des données $titre = "Nombre d'observations par utilisateur et test"; $y1_val_fin = $valeur_max; $y1_pas = '100'; $valeurs = implode(',', $donnees['Utilisateurs']).'|'.implode(',', $donnees['Tests']); $etiquettes_x1 = implode('|', array_keys($classes)); $etiquettes_x2 = 'Observations'; $etiquettes_y2 = 'Utilisateurs'; $legendes = implode('|', array_keys($donnees)); // Construire de l'url de l'image $graph = array('cht' => 'bvg', 'chtt' => $titre, 'chs' => '400x200', 'chco' => '00FF00,FF0000', 'chbh' => 'r,0.3,1', 'chd' => 't:'.$valeurs, 'chds' => "0,$valeur_max", 'chxt' => 'x,x,y,y', 'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'', 'chxp' => '1,100|3,100', 'chxr' => "2,0,$y1_val_fin,$y1_pas", 'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e|N,000000,1,0::1,8,1.0,e', 'chdl' => $legendes, 'chdlp' => 'b'); //echo '
'.print_r($graph,true).'
'; return $graph; } private function getNuagePointsObsParHeureEtJourSemaine($param) { $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : false; // Récupération des données de la base $requete = 'SELECT courriel_utilisateur, DATE_FORMAT(date_creation, "%w-%H") AS periode, (ROUND(LOG10(COUNT(id_observation))) + 1) AS nbre '. 'FROM cel_obs '. 'WHERE date_creation != "0000-00-00 00:00:00" '. ' AND courriel_utilisateur '.($utilisateur ? "= $utilisateur " : 'LIKE "%@%" '). 'GROUP BY periode, courriel_utilisateur '; $infos = Cel::db()->requeter($requete); // Traitement résulat requête $observations = array(); foreach ($infos as $info) { if (isset($observations[$info['periode']])) { $observations[$info['periode']] += $info['nbre']; } else { $observations[$info['periode']] = $info['nbre']; } } // Postraitement des données // Jour de la semaine $donnees['joursSemaine'] = array(); for ($njs = 0; $njs < 7; $njs++) { $donnees['joursSemaine'][] = strftime('%A', strtotime('2010-05-'.(16+$njs))); } // Heure $donnees['heures'] = array(); for ($h = 0; $h < 24; $h++) { $heure_fmt = sprintf('%02s', $h);// Format numérique 00 $donnees['heures'][] = strftime('%H', strtotime("0000-00-00 $heure_fmt:00:00")); } // Nbre $valeur_max = max($observations); for ($njs = 0; $njs < 7; $njs++) { for ($h = 0; $h < 24; $h++) { $hfmt = sprintf('%02s', $h);// Format numérique 00 $periode = $njs.'-'.$hfmt; $donnees['valeurs_x'][] = round(($h + 1) * (100 / 24), 0); $donnees['valeurs_y'][] = round(($njs + 1) * (100 / 7), 0); $ps = 0; if (isset($observations[$periode])) { $ps = round($observations[$periode] * (100 / $valeur_max), 0); } $donnees['valeurs_ps'][] = $ps; } } //echo '
'.print_r($donnees,true).'
'; // Préparation des paramêtres du graph $titre = "Nombre de création d'observation|par heure et jour de la semaine"; $valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']); $etiquettes_x1 = '|'.implode('|', $donnees['heures']); $etiquettes_x2 = 'Heures'; $etiquettes_y1 = '|'.implode('|', $donnees['joursSemaine']); $x_axis_step_size = str_replace(',', '.', (100 / 24)); $y_axis_step_size = str_replace(',', '.', (100 / 7)); // Construction du tableau des paramêtres du graph $graph = array('cht' => 's', 'chtt' => $titre, 'chs' => '400x200', 'chco' => '00FF00', 'chd' => 't:'.$valeurs, 'chxt' => 'x,x,y', 'chxr' => "0,-1,23,1|2,-1,6,1", 'chxp' => '1,100', 'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'', 'chg' => "$x_axis_step_size,$y_axis_step_size,1,5"); //echo '
'.print_r($graph,true).'
'; return $graph; } private function getNuagePointsObsAnciennete($param) { // Récupération des données de la base $requete = 'SELECT DISTINCT courriel_utilisateur , '. ' MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '. ' COUNT(id_observation) AS obs_nbre '. 'FROM cel_obs '. "WHERE date_creation != '0000-00-00 00:00:00' ". " AND courriel_utilisateur LIKE '%@%' ". 'GROUP BY courriel_utilisateur '. 'ORDER BY date_min ASC '; $resultats = Cel::db()->requeter($requete); // Trie des données $max_obs = 0; $max_obs_log = 0; $max_anciennete = 0; $donnees = array(); foreach ($resultats as $enrg) { $tps_deb = strtotime($enrg['date_min']); $tps_fin = strtotime($enrg['date_max']); $donnee = array(); if (($tps_fin - $tps_deb) == 0) { $donnee['anciennete'] = 1; } else { $donnee['anciennete'] = round((($tps_fin - $tps_deb) / 86400), 0); } $donnee['obs'] = $enrg['obs_nbre']; $donnee['obs_log'] = log10($enrg['obs_nbre']); $donnees[] = $donnee; $max_obs_log = ($donnee['obs_log'] > $max_obs_log) ? $donnee['obs_log'] : $max_obs_log; $max_obs = ($donnee['obs'] > $max_obs) ? $donnee['obs'] : $max_obs; $max_anciennete = ($donnee['anciennete'] > $max_anciennete) ? $donnee['anciennete'] : $max_anciennete; } // Postraitement des données foreach ($donnees as $donnee) { $donnees['valeurs_x'][] = round($donnee['anciennete'] * (100 / $max_anciennete), 0); $donnees['valeurs_y'][] = round($donnee['obs_log'] * (100 / $max_obs_log), 0); $donnees['valeurs_ps'][] = 20; } // Échelle log des obs $donnees['echelle_y1'] = array(); $pas = $max_obs_log / 100 ; for ($i = 0 ; $i < 5 ; $i++) { $donnees['echelle_y1'][] = round(pow(10, (($i*20) * $pas)), 0); } $donnees['echelle_y1'][] = $max_obs; //echo '
'.print_r($donnees['valeurs_x'],true).'
'; // Préparation des paramêtres du graph $titre = "Répartition des utilisateurs en fonction|du nombre d'observations et de l'ancienneté"; $valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']); $etiquettes_x2 = 'Ancienneté en jours'; $etiquettes_y1 = implode('|', $donnees['echelle_y1']); $etiquettes_y2 = 'Observations'; $x_axis_step_size = $max_anciennete; // Construction du tableau des paramêtres du graph $graph = array('cht' => 's', 'chtt' => $titre, 'chs' => '400x200', 'chco' => '0000FF', 'chxt' => 'x,x,y,y', 'chd' => 't:'.$valeurs, 'chxr' => "0,0,$x_axis_step_size|2,0,$max_obs",//|2,0,$y_axis_step_size,$pas 'chxp' => '1,100|3,100', 'chm' => 'h,C3C3C3,0,-0.2,0.2,-1', 'chxl' => '1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'|3:|'.$etiquettes_y2.'');// //echo '
'.print_r($graph,true).'
'; return $graph; } private function executerRequeteEvol($table, $champ, $format_date = '%Y%m', $where = null, $champ_date = 'date_creation', $order_by = null, $limit = null) { $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : false; $requete = "SELECT DATE_FORMAT($champ_date, '$format_date') AS periode, COUNT($champ) AS nbre ". "FROM $table ". "WHERE $champ_date != '0000-00-00 00:00:00' ". (($utilisateur != false) ? " AND courriel_utilisateur = $utilisateur " : ''). ((is_null($where)) ? '' : " AND $where "). 'GROUP BY periode '. ((is_null($order_by)) ? '' : "ORDER BY $order_by "); ((is_null($limit)) ? '' : "LIMIT $limit "); $evolution = Cel::db()->requeter($requete); // Traitement du tableau $donnees_traitees = array(); foreach ($evolution as $info) { $donnees_traitees[$info['periode']] = $info['nbre']; } return $donnees_traitees; } private function executerRequeteNombre($table, $champ, $where = null) { $utilisateur = null; if (isset($_GET['utilisateur'])) { $utilisateur = Cel::db()->quote($_GET['utilisateur']); $where = isset($where) ? $where.' AND ' : ''; $where .= "courriel_utilisateur = $utilisateur "; } $requete = "SELECT COUNT($champ) AS nbre ". "FROM $table ". ((isset($where)) ? "WHERE $where " : ''); $nbre = Cel::db()->requeterValeurUnique($requete); return $nbre; } } ?>