Rev 2143 | Rev 2462 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Service fournissant des urls vers des images de graphiques sur les statistiques de l'application CEL.* Encodage en entrée : utf8* Encodage en sortie : utf8** Cas d'utilisation :* /CelStatistique/TypeDeGraph : retourne le graphique demandé* Paramêtres :* serveur=[0-9] : retourne le graphique demandé sur le serveur numéro 0 à 9 (voir http://code.google.com/intl/fr/apis/chart/docs/making_charts.html#enhancements )** @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @version $Id$* @copyright 2009*/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'utilisateurif (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 '<pre>'.print_r($graph,true).'</pre>';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'utilisateurif (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 '<pre>'.print_r($graph,true).'</pre>';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 '<pre>'.print_r($donnees,true).'</pre>';// 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 '<pre>'.print_r($graph,true).'</pre>';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éesforeach ($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 '<pre>'.print_r($donnees['valeurs_x'],true).'</pre>';// 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 '<pre>'.print_r($graph,true).'</pre>';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;}}?>