Rev 2462 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Service fournissant des statistiques de l'application CEL au format texte (JSON).* Encodage en entrée : utf8* Encodage en sortie : utf8** Cas d'utilisation :* /CelStatistiqueTxt/TypeDeStat : retourne les statistiques demandées* Paramêtres :* utilisateur=courriel : retourne les statistiques d'un utilisateur donné.** @internal Mininum PHP version : 5.2* @category CEL* @package Services* @subpackage Statistiques* @version 0.1* @author Mathias CHOUET <mathias@tela-botanica.org>* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Aurelien PERONNET <aurelien@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>* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>*/class CelStatistiqueTxt extends Cel {/*** Méthode appelée avec une requête de type GET.*/public function getElement($ressources) {$graph = null;$serveur = '';if (isset($ressources[0])) {$this->analyserParametresUrl();$stat_demande = array_shift($ressources);$methode = 'get'.$stat_demande;if (method_exists($this, $methode)) {$this->ressources = $ressources;$stats = $this->$methode($ressources);} else {$this->messages[] = "Ce type de statistiques '$stat_demande' n'est pas disponible.";}} else {$this->messages[] = "La ressource du service CEL StatistiqueTxt doit indiquer le type de statistique. Ex. : .../CelStatistiqueTxt/Nombres";}if (!is_null($stats)) {$this->envoyerJson($stats);}}private function analyserParametresUrl() {$this->parametres['utilisateur'] = isset($_GET['utilisateur']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['utilisateur'])) : null;$this->parametres['num_taxon'] = isset($_GET['num_taxon']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['num_taxon'])) : null;$this->parametres['taxon'] = isset($_GET['taxon']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['taxon'].'%')) : null;$this->parametres['tag'] = isset($_GET['tag']) ? $this->verifierSecuriteParametreUrl($_GET['tag']) : null;$this->parametres['start'] = isset($_GET['start']) ? $this->verifierSecuriteParametreUrl($_GET['start']) : null;$this->parametres['limit'] = isset($_GET['limit']) ? $this->verifierSecuriteParametreUrl($_GET['limit']) : null;}private function getListeUtilisateursNbrePhotos() {$liste = array();$requete = $this->construireRequeteListeUtilisateurNbrePhoto();if ($requete != null) {$resultats = Cel::db()->requeter($requete);if ($resultats != false) {foreach ($resultats as $resultat) {$liste[$resultat['courriel_utilisateur']] = $resultat['nbre'];}}}return $liste;}private function construireRequeteListeUtilisateurNbrePhoto() {$select = 'SELECT co.courriel_utilisateur, COUNT(DISTINCT ci.id_image) AS nbre ';$from = 'FROM cel_obs AS co '.' LEFT JOIN cel_images AS ci ON (co.id_observation = ci.ce_observation) ';$where = 'WHERE co.transmission = 1 ';$groupBy = 'GROUP BY co.courriel_utilisateur ';$orderBy = 'ORDER BY nbre DESC ';$limitSql = 'LIMIT 0,150 ';$zero_images = false;if (count($this->parametres) != 0) {extract($this->parametres);$filtres = array();if (isset($utilisateur)) {$filtres[] = "co.courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "nt = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}if (isset($tag)) {$tagP = Cel::db()->quote("%$tag%");$filtres[] = "ci.mots_cles_texte LIKE $tagP ";}$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');if (isset($start)) {$limitSql = str_replace('0,', "$start,", $limitSql);}if (isset($limit)) {$limitSql = str_replace('150', $limit, $limitSql);}}$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;return $requete;}private function getListeTaxonsNbrePhotos() {$requete = $this->construireRequeteListeTaxonNbrePhoto();$resultats = Cel::db()->requeter($requete);$liste = array();if ($resultats != false) {foreach ($resultats as $resultat) {$liste[$resultat['nom_ret']] = $resultat['nbre'];}}return $liste;}private function construireRequeteListeTaxonNbrePhoto() {$select = 'SELECT nom_ret, COUNT(DISTINCT ci.id_image) AS nbre ';$from = 'FROM cel_obs co '.' LEFT JOIN cel_images ci ON (co.id_observation = ci.ce_observation) ';$where = 'WHERE co.transmission = 1 '." AND nom_ret != '' ";$groupBy = 'GROUP BY nom_ret ';$orderBy = 'ORDER BY nbre DESC ';$limitSql = 'LIMIT 0,150 ';if (count($this->parametres) != 0) {extract($this->parametres);$filtres = array();if (isset($utilisateur)) {$filtres[] = "co.courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "nt = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');if (isset($start)) {$limitSql = str_replace('0,', "$start,", $limitSql);}if (isset($limit)) {$limitSql = str_replace('150', $limit, $limitSql);}}$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;return $requete;}private function getNombres() {$requete = $this->construireRequeteNbreObs();$info['observations'] = (int) Cel::db()->requeterValeurUnique($requete);$requete = $this->construireRequeteNbreObsPubliques();$info['observationsPubliques'] = (int) Cel::db()->requeterValeurUnique($requete);$requete = $this->construireRequeteNbreImg();$info['images'] =(int) Cel::db()->requeterValeurUnique($requete);$requete = $this->construireRequeteNbreImgLiees();$info['imagesLiees'] =(int) Cel::db()->requeterValeurUnique($requete);$requete = $this->construireRequeteNbreObsLiees();$info['observationsLiees'] = (int) Cel::db()->requeterValeurUnique($requete);$info['moyImagesParObs'] = ($info['observationsLiees'] > 0 ? round($info['imagesLiees']/$info['observationsLiees'], 2) : '');$requete = $this->construireRequeteNbreObsParCommune();$info['communes'] = ($resultats = Cel::db()->requeter($requete)) ? count($resultats) : '' ;$info['observationsParCommunesMin'] = 1000;$info['observationsParCommunesMax'] = 0;$info['observationsParCommunesTotal'] = 0;foreach ($resultats as $resultat) {if ($resultat['nbre'] < $info['observationsParCommunesMin']) {$info['observationsParCommunesMin'] = $resultat['nbre'];}if ($resultat['nbre'] > $info['observationsParCommunesMax']) {$info['observationsParCommunesMax'] = $resultat['nbre'];}$info['observationsParCommunesTotal'] += $resultat['nbre'];}$info['observationsParCommunesMoyenne'] = ($info['communes'] > 0 ) ? round($info['observationsParCommunesTotal'] / $info['communes'], 2) : 0;return $info;}private function getNbObsPubliques() {$requete = $this->construireRequeteNbreObsPubliques();$info = (int) Cel::db()->requeterValeurUnique($requete);return $info;}private function getNbImagesPubliques() {$requete = $this->construireRequeteNbreImgLiees();$info =(int) Cel::db()->requeterValeurUnique($requete);return $info;}private function construireRequeteNbreObs() {$requete = 'SELECT COUNT(id_observation) AS nbre '.'FROM cel_obs ';if (count($this->parametres) != 0) {$filtres = array();extract($this->parametres);if (isset($utilisateur)) {$filtres[] = "courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "num_taxon = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}$requete .= ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');}return $requete;}private function construireRequeteNbreObsPubliques() {$requete = 'SELECT COUNT(id_observation) AS nbre '.'FROM cel_obs '."WHERE transmission = 1 ";if (count($this->parametres) != 0) {$filtres = array();extract($this->parametres);if (isset($utilisateur)) {$filtres[] = "courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "num_taxon = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');}return $requete;}private function construireRequeteNbreObsParCommune() {$requete = 'SELECT COUNT(id_observation) AS nbre '.'FROM cel_obs '."WHERE zone_geo IS NOT NULL "." AND ce_zone_geo IS NOT NULL ";$groupBy = 'GROUP BY zone_geo, ce_zone_geo';if (count($this->parametres) != 0) {$filtres = array();extract($this->parametres);if (isset($utilisateur)) {$filtres[] = "courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "nt = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');}$requete .= $groupBy;return $requete;}private function construireRequeteNbreImg() {$select = 'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';$from = 'FROM cel_images ci ';if (count($this->parametres) != 0) {$filtres = array();extract($this->parametres);if (isset($utilisateur)) {$filtres[] = "courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "nt = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}if (isset($num_taxon) || isset($taxon)) {$from .= 'LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';}$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');}$requete = $select.$from.$where;return $requete;}private function construireRequeteNbreImgLiees() {$select = 'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';$from = 'FROM cel_images ci ';if (count($this->parametres) != 0) {$filtres = array();extract($this->parametres);if (isset($utilisateur)) {$filtres[] = "ci.courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "nt = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}if (isset($num_taxon) || isset($taxon)) {$from .= 'LEFT JOIN cel_obs ON (ci.ce_observation = co.id_observation) ';}$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');}$requete = $select.$from.$where;return $requete;}private function construireRequeteNbreObsLiees() {$select = 'SELECT COUNT(DISTINCT id_observation) AS nbre ';$from = 'FROM cel_images ci '.' LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';if (count($this->parametres) != 0) {$filtres = array();extract($this->parametres);if (isset($utilisateur)) {$filtres[] = "courriel_utilisateur = $utilisateur ";}if (isset($num_taxon)) {$filtres[] = "nt = $num_taxon ";}if (isset($taxon)) {$filtres[] = "nom_ret LIKE $taxon ";}$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');}$requete = $select.$from.$where;return $requete;}/*** Retourne les n principaux contributeurs depuis x jours,* en termes d'observations ajoutées, d'images ajoutées, ou les deux* Paramètres : "jours" (int), "nombre" (int), "critere" ("obs" ou "img" ou "")* @return array*/private function getGrandsContributeurs() {$nombre = 10; // les $nombre plus importants contributeurs$jours = 7; // depuis $jours jours$critere = null; // "obs", "img" ou null (les deux)if (isset($this->parametres['nombre'])) {$nombre = $this->parametres['nombre'];}if (isset($this->parametres['jours'])) {$jours = $this->parametres['jours'];}if (isset($this->parametres['critere'])) {$critere = $this->parametres['critere'];}$requete = $this->construireRequeteGrandsContributeurs($nombre, $jours, $critere);$resultats = Cel::db()->requeter($requete);$courriels = array();foreach ($resultats as $res) {$courriels[] = $res['courriel_utilisateur'];}$identites = $this->recupererUtilisateursIdentite($courriels);foreach ($resultats as &$res) {$res['intitule_utilisateur'] = $identites[$res['courriel_utilisateur']]['intitule'];unset($res['courriel_utilisateur']);unset($res['nom_utilisateur']);unset($res['prenom_utilisateur']);}$retour = array('entete' => array('nombre' => intval($nombre),'jours' => intval($jours),'critere' => $critere),'resultats' => array());$liste = array();if ($resultats != false) {foreach ($resultats as $resultat) {// essayons de faire du JSON propreif (isset($resultat['nombreImg'])) {$resultat['nombreImg'] = intval($resultat['nombreImg']);}if (isset($resultat['nombreObs'])) {$resultat['nombreObs'] = intval($resultat['nombreObs']);}if (isset($resultat['somme'])) {$resultat['somme'] = intval($resultat['somme']);}$liste[] = $resultat; // pas de clefs afin de renvoyer une "liste" JSON, qui sera interprétée en conservant l'ordre}$retour['resultats'] = $liste;}return $retour;}private function construireRequeteGrandsContributeurs($nombre = 10, $jours = 7, $critere = null) {$requete = '';switch ($critere) {case 'obs':$requete = "SELECT ce_utilisateur , prenom_utilisateur , nom_utilisateur , courriel_utilisateur , "." COUNT(*) AS nombreObs "."FROM cel_obs "."WHERE transmission = 1 "."AND TO_DAYS(NOW()) - TO_DAYS(date_transmission) <= $jours "."GROUP BY ce_utilisateur "."ORDER BY nombreObs DESC "."LIMIT $nombre ";break;case 'img':$requete = "SELECT co.ce_utilisateur , co.prenom_utilisateur , co.nom_utilisateur , "." co.courriel_utilisateur , COUNT(DISTINCT ci.id_image) AS nombreImg "."FROM cel_images ci "." RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation "."WHERE co.transmission = 1 "."AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours "."GROUP BY co.ce_utilisateur "."ORDER BY nombreImg DESC "."LIMIT $nombre ";break;default:$requete = "SELECT co.ce_utilisateur, co.prenom_utilisateur, co.nom_utilisateur, co.courriel_utilisateur, "."COUNT(DISTINCT ci.id_image) AS nombreImg, COUNT(DISTINCT co.id_observation) AS nombreObs, "."COUNT(DISTINCT ci.id_image) + COUNT(DISTINCT co.id_observation) AS somme "."FROM cel_images ci "." RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation "."WHERE co.transmission = 1 "."AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours "."GROUP BY co.ce_utilisateur "."ORDER BY somme DESC "."LIMIT $nombre ";}return $requete;}}