* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ 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_export_total AS co '. ' LEFT JOIN cel_images_export 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_export_total co '. ' LEFT JOIN cel_images_export 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->construireRequeteNbreImgLiees(true); $info['imagesLieesPubliques'] =(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(true); $info = (int) Cel::db()->requeterValeurUnique($requete); return $info; } private function construireRequeteNbreObs() { $requete = 'SELECT COUNT(*) AS nbre '. 'FROM cel_export_total '; if (count($this->parametres) != 0) { $filtres = array(); extract($this->parametres); if (isset($utilisateur)) { $filtres[] = "courriel_utilisateur = $utilisateur "; } if (isset($num_taxon)) { $filtres[] = "nom_ret_nn = $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(*) AS nbre '. 'FROM cel_export_total '. "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[] = "nom_ret_nn = $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_export_total '. "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_export 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_export_total 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($publiquesSeulement=false) { $select = 'SELECT COUNT(DISTINCT ci.id_image) AS nbre '; $from = 'FROM cel_images_export 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 ($publiquesSeulement === true) { $filtres[] = "ci.transmission = 1"; } if (isset($num_taxon) || isset($taxon)) { $from .= 'LEFT JOIN cel_export_total 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_export ci '. ' LEFT JOIN cel_export_total 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 propre if (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_export_total ". "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_export ci ". " RIGHT JOIN cel_export_total 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_export ci ". " RIGHT JOIN cel_export_total 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; } }