Subversion Repositories eFlore/Applications.cel

Rev

Rev 2504 | Rev 3666 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2504 Rev 3080
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service fournissant des statistiques de l'application CEL au format texte (JSON).
4
 * Service fournissant des statistiques de l'application CEL au format texte (JSON).
5
 * Encodage en entrée : utf8
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
6
 * Encodage en sortie : utf8
7
 *
7
 *
8
 * Cas d'utilisation :
8
 * Cas d'utilisation :
9
 * /CelStatistiqueTxt/TypeDeStat : retourne les statistiques demandées
9
 * /CelStatistiqueTxt/TypeDeStat : retourne les statistiques demandées
10
 * Paramêtres :
10
 * Paramêtres :
11
 * utilisateur=courriel : retourne les statistiques d'un utilisateur donné.
11
 * utilisateur=courriel : retourne les statistiques d'un utilisateur donné.
12
 *
12
 *
13
 * @internal   Mininum PHP version : 5.2
13
 * @internal   Mininum PHP version : 5.2
14
 * @category   CEL
14
 * @category   CEL
15
 * @package    Services
15
 * @package    Services
16
 * @subpackage Statistiques
16
 * @subpackage Statistiques
17
 * @version    0.1
17
 * @version    0.1
18
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
18
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
19
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
19
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
20
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
20
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
21
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
21
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
22
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
22
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
23
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
23
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
24
 */
24
 */
25
class CelStatistiqueTxt extends Cel {
25
class CelStatistiqueTxt extends Cel {
26
 
26
 
27
	/**
27
	/**
28
	 * Méthode appelée avec une requête de type GET.
28
	 * Méthode appelée avec une requête de type GET.
29
	 */
29
	 */
30
	public function getElement($ressources) {
30
	public function getElement($ressources) {
31
		$graph = null;
31
		$graph = null;
32
		$serveur = '';
32
		$serveur = '';
33
 
33
 
34
		if (isset($ressources[0])) {
34
		if (isset($ressources[0])) {
35
			$this->analyserParametresUrl();
35
			$this->analyserParametresUrl();
36
			$stat_demande = array_shift($ressources);
36
			$stat_demande = array_shift($ressources);
37
			$methode = 'get'.$stat_demande;
37
			$methode = 'get'.$stat_demande;
38
			if (method_exists($this, $methode)) {
38
			if (method_exists($this, $methode)) {
39
				$this->ressources = $ressources;
39
				$this->ressources = $ressources;
40
				$stats = $this->$methode($ressources);
40
				$stats = $this->$methode($ressources);
41
			} else {
41
			} else {
42
				$this->messages[] = "Ce type de statistiques '$stat_demande' n'est pas disponible.";
42
				$this->messages[] = "Ce type de statistiques '$stat_demande' n'est pas disponible.";
43
			}
43
			}
44
		} else {
44
		} else {
45
			$this->messages[] = "La ressource du service CEL StatistiqueTxt doit indiquer le type de statistique. Ex. : .../CelStatistiqueTxt/Nombres";
45
			$this->messages[] = "La ressource du service CEL StatistiqueTxt doit indiquer le type de statistique. Ex. : .../CelStatistiqueTxt/Nombres";
46
		}
46
		}
47
 
47
 
48
		if (!is_null($stats)) {
48
		if (!is_null($stats)) {
49
			$this->envoyerJson($stats);
49
			$this->envoyerJson($stats);
50
		}
50
		}
51
	}
51
	}
52
 
52
 
53
	private function analyserParametresUrl() {
53
	private function analyserParametresUrl() {
54
		$this->parametres['utilisateur'] = isset($_GET['utilisateur']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['utilisateur'])) : null;
54
		$this->parametres['utilisateur'] = isset($_GET['utilisateur']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['utilisateur'])) : null;
55
		$this->parametres['num_taxon'] = isset($_GET['num_taxon']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['num_taxon'])) : null;
55
		$this->parametres['num_taxon'] = isset($_GET['num_taxon']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['num_taxon'])) : null;
56
		$this->parametres['taxon'] = isset($_GET['taxon']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['taxon'].'%')) : null;
56
		$this->parametres['taxon'] = isset($_GET['taxon']) ? Cel::db()->quote($this->verifierSecuriteParametreUrl($_GET['taxon'].'%')) : null;
57
		$this->parametres['tag'] = isset($_GET['tag']) ? $this->verifierSecuriteParametreUrl($_GET['tag']) : null;
57
		$this->parametres['tag'] = isset($_GET['tag']) ? $this->verifierSecuriteParametreUrl($_GET['tag']) : null;
58
		$this->parametres['start'] = isset($_GET['start']) ? $this->verifierSecuriteParametreUrl($_GET['start']) : null;
58
		$this->parametres['start'] = isset($_GET['start']) ? $this->verifierSecuriteParametreUrl($_GET['start']) : null;
59
		$this->parametres['limit'] = isset($_GET['limit']) ? $this->verifierSecuriteParametreUrl($_GET['limit']) : null;
59
		$this->parametres['limit'] = isset($_GET['limit']) ? $this->verifierSecuriteParametreUrl($_GET['limit']) : null;
60
	}
60
	}
61
 
61
 
62
	private function getListeUtilisateursNbrePhotos() {
62
	private function getListeUtilisateursNbrePhotos() {
63
		$liste = array();
63
		$liste = array();
64
 
64
 
65
		$requete = $this->construireRequeteListeUtilisateurNbrePhoto();
65
		$requete = $this->construireRequeteListeUtilisateurNbrePhoto();
66
		if ($requete != null) {
66
		if ($requete != null) {
67
			$resultats = Cel::db()->requeter($requete);
67
			$resultats = Cel::db()->requeter($requete);
68
			if ($resultats != false) {
68
			if ($resultats != false) {
69
				foreach ($resultats as $resultat) {
69
				foreach ($resultats as $resultat) {
70
					$liste[$resultat['courriel_utilisateur']] = $resultat['nbre'];
70
					$liste[$resultat['courriel_utilisateur']] = $resultat['nbre'];
71
				}
71
				}
72
			}
72
			}
73
		}
73
		}
74
		return $liste;
74
		return $liste;
75
	}
75
	}
76
 
76
 
77
	private function construireRequeteListeUtilisateurNbrePhoto() {
77
	private function construireRequeteListeUtilisateurNbrePhoto() {
78
		$select = 	'SELECT co.courriel_utilisateur, COUNT(DISTINCT ci.id_image) AS nbre ';
78
		$select = 	'SELECT co.courriel_utilisateur, COUNT(DISTINCT ci.id_image) AS nbre ';
79
		$from = 	'FROM cel_obs AS co '.
79
		$from = 	'FROM cel_obs AS co '.
80
			'	LEFT JOIN cel_images AS ci ON (co.id_observation = ci.ce_observation) ';
80
			'	LEFT JOIN cel_images AS ci ON (co.id_observation = ci.ce_observation) ';
81
		$where = 	'WHERE co.transmission = 1 ';
81
		$where = 	'WHERE co.transmission = 1 ';
82
		$groupBy = 	'GROUP BY co.courriel_utilisateur ';
82
		$groupBy = 	'GROUP BY co.courriel_utilisateur ';
83
		$orderBy = 	'ORDER BY nbre DESC ';
83
		$orderBy = 	'ORDER BY nbre DESC ';
84
		$limitSql =	'LIMIT 0,150 ';
84
		$limitSql =	'LIMIT 0,150 ';
85
 
85
 
86
		$zero_images = false;
86
		$zero_images = false;
87
		if (count($this->parametres) != 0) {
87
		if (count($this->parametres) != 0) {
88
			extract($this->parametres);
88
			extract($this->parametres);
89
 
89
 
90
			$filtres = array();
90
			$filtres = array();
91
 
91
 
92
			if (isset($utilisateur)) {
92
			if (isset($utilisateur)) {
93
				$filtres[] = "co.courriel_utilisateur = $utilisateur ";
93
				$filtres[] = "co.courriel_utilisateur = $utilisateur ";
94
			}
94
			}
95
			if (isset($num_taxon)) {
95
			if (isset($num_taxon)) {
96
				$filtres[] = "nt = $num_taxon ";
96
				$filtres[] = "nt = $num_taxon ";
97
			}
97
			}
98
			if (isset($taxon)) {
98
			if (isset($taxon)) {
99
				$filtres[] = "nom_ret LIKE $taxon ";
99
				$filtres[] = "nom_ret LIKE $taxon ";
100
			}
100
			}
101
			if (isset($tag)) {
101
			if (isset($tag)) {
102
				$tagP = Cel::db()->quote("%$tag%");
102
				$tagP = Cel::db()->quote("%$tag%");
103
				$filtres[] = "ci.mots_cles_texte LIKE $tagP ";
103
				$filtres[] = "ci.mots_cles_texte LIKE $tagP ";
104
			}
104
			}
105
			$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
105
			$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
106
 
106
 
107
			if (isset($start)) {
107
			if (isset($start)) {
108
				$limitSql = str_replace('0,', "$start,", $limitSql);
108
				$limitSql = str_replace('0,', "$start,", $limitSql);
109
			}
109
			}
110
			if (isset($limit)) {
110
			if (isset($limit)) {
111
				$limitSql = str_replace('150', $limit, $limitSql);
111
				$limitSql = str_replace('150', $limit, $limitSql);
112
			}
112
			}
113
		}
113
		}
114
		$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;
114
		$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;
115
		return $requete;
115
		return $requete;
116
	}
116
	}
117
 
117
 
118
	private function getListeTaxonsNbrePhotos() {
118
	private function getListeTaxonsNbrePhotos() {
119
		$requete = $this->construireRequeteListeTaxonNbrePhoto();
119
		$requete = $this->construireRequeteListeTaxonNbrePhoto();
120
 
120
 
121
		$resultats = Cel::db()->requeter($requete);
121
		$resultats = Cel::db()->requeter($requete);
122
		$liste = array();
122
		$liste = array();
123
		if ($resultats != false) {
123
		if ($resultats != false) {
124
			foreach ($resultats as $resultat) {
124
			foreach ($resultats as $resultat) {
125
				$liste[$resultat['nom_ret']] = $resultat['nbre'];
125
				$liste[$resultat['nom_ret']] = $resultat['nbre'];
126
			}
126
			}
127
		}
127
		}
128
		return $liste;
128
		return $liste;
129
	}
129
	}
130
 
130
 
131
	private function construireRequeteListeTaxonNbrePhoto() {
131
	private function construireRequeteListeTaxonNbrePhoto() {
132
		$select = 	'SELECT nom_ret, COUNT(DISTINCT ci.id_image) AS nbre ';
132
		$select = 	'SELECT nom_ret, COUNT(DISTINCT ci.id_image) AS nbre ';
133
		$from = 	'FROM cel_obs co '.
133
		$from = 	'FROM cel_obs co '.
134
			'	LEFT JOIN cel_images ci ON (co.id_observation = ci.ce_observation) ';
134
			'	LEFT JOIN cel_images ci ON (co.id_observation = ci.ce_observation) ';
135
		$where = 	'WHERE co.transmission = 1 '.
135
		$where = 	'WHERE co.transmission = 1 '.
136
			"	AND nom_ret != '' ";
136
			"	AND nom_ret != '' ";
137
		$groupBy = 	'GROUP BY nom_ret ';
137
		$groupBy = 	'GROUP BY nom_ret ';
138
		$orderBy = 	'ORDER BY nbre DESC ';
138
		$orderBy = 	'ORDER BY nbre DESC ';
139
		$limitSql =	'LIMIT 0,150 ';
139
		$limitSql =	'LIMIT 0,150 ';
140
 
140
 
141
 
141
 
142
		if (count($this->parametres) != 0) {
142
		if (count($this->parametres) != 0) {
143
			extract($this->parametres);
143
			extract($this->parametres);
144
 
144
 
145
			$filtres = array();
145
			$filtres = array();
146
 
146
 
147
			if (isset($utilisateur)) {
147
			if (isset($utilisateur)) {
148
				$filtres[] = "co.courriel_utilisateur = $utilisateur ";
148
				$filtres[] = "co.courriel_utilisateur = $utilisateur ";
149
			}
149
			}
150
			if (isset($num_taxon)) {
150
			if (isset($num_taxon)) {
151
				$filtres[] = "nt = $num_taxon ";
151
				$filtres[] = "nt = $num_taxon ";
152
			}
152
			}
153
			if (isset($taxon)) {
153
			if (isset($taxon)) {
154
				$filtres[] = "nom_ret LIKE $taxon ";
154
				$filtres[] = "nom_ret LIKE $taxon ";
155
			}
155
			}
156
			$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
156
			$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
157
 
157
 
158
			if (isset($start)) {
158
			if (isset($start)) {
159
				$limitSql = str_replace('0,', "$start,", $limitSql);
159
				$limitSql = str_replace('0,', "$start,", $limitSql);
160
			}
160
			}
161
			if (isset($limit)) {
161
			if (isset($limit)) {
162
				$limitSql = str_replace('150', $limit, $limitSql);
162
				$limitSql = str_replace('150', $limit, $limitSql);
163
			}
163
			}
164
		}
164
		}
165
 
165
 
166
		$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;
166
		$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;
167
 
167
 
168
		return $requete;
168
		return $requete;
169
	}
169
	}
170
 
170
 
171
	private function getNombres() {
171
	private function getNombres() {
172
 
172
 
173
		$requete = $this->construireRequeteNbreObs();
173
		$requete = $this->construireRequeteNbreObs();
174
		$info['observations'] = (int) Cel::db()->requeterValeurUnique($requete);
174
		$info['observations'] = (int) Cel::db()->requeterValeurUnique($requete);
175
 
175
 
176
		$requete = $this->construireRequeteNbreObsPubliques();
176
		$requete = $this->construireRequeteNbreObsPubliques();
177
		$info['observationsPubliques'] = (int) Cel::db()->requeterValeurUnique($requete);
177
		$info['observationsPubliques'] = (int) Cel::db()->requeterValeurUnique($requete);
178
 
178
 
179
		$requete = $this->construireRequeteNbreImg();
179
		$requete = $this->construireRequeteNbreImg();
180
		$info['images'] =(int) Cel::db()->requeterValeurUnique($requete);
180
		$info['images'] =(int) Cel::db()->requeterValeurUnique($requete);
181
 
181
 
182
		$requete = $this->construireRequeteNbreImgLiees();
182
		$requete = $this->construireRequeteNbreImgLiees();
183
		$info['imagesLiees'] =(int) Cel::db()->requeterValeurUnique($requete);
183
		$info['imagesLiees'] =(int) Cel::db()->requeterValeurUnique($requete);
-
 
184
 
-
 
185
		$requete = $this->construireRequeteNbreImgLiees(true);
-
 
186
		$info['imagesLieesPubliques'] =(int) Cel::db()->requeterValeurUnique($requete);
184
 
187
 
185
		$requete = $this->construireRequeteNbreObsLiees();
188
		$requete = $this->construireRequeteNbreObsLiees();
186
		$info['observationsLiees'] = (int) Cel::db()->requeterValeurUnique($requete);
189
		$info['observationsLiees'] = (int) Cel::db()->requeterValeurUnique($requete);
187
 
190
 
188
		$info['moyImagesParObs'] = ($info['observationsLiees'] > 0 ? round($info['imagesLiees']/$info['observationsLiees'], 2) : '');
191
		$info['moyImagesParObs'] = ($info['observationsLiees'] > 0 ? round($info['imagesLiees']/$info['observationsLiees'], 2) : '');
189
 
192
 
190
		$requete = $this->construireRequeteNbreObsParCommune();
193
		$requete = $this->construireRequeteNbreObsParCommune();
191
		$info['communes'] = ($resultats = Cel::db()->requeter($requete)) ? count($resultats) : '' ;
194
		$info['communes'] = ($resultats = Cel::db()->requeter($requete)) ? count($resultats) : '' ;
192
		$info['observationsParCommunesMin'] = 1000;
195
		$info['observationsParCommunesMin'] = 1000;
193
		$info['observationsParCommunesMax'] = 0;
196
		$info['observationsParCommunesMax'] = 0;
194
		$info['observationsParCommunesTotal'] = 0;
197
		$info['observationsParCommunesTotal'] = 0;
195
		foreach ($resultats as $resultat) {
198
		foreach ($resultats as $resultat) {
196
			if ($resultat['nbre'] < $info['observationsParCommunesMin']) {
199
			if ($resultat['nbre'] < $info['observationsParCommunesMin']) {
197
				$info['observationsParCommunesMin'] = $resultat['nbre'];
200
				$info['observationsParCommunesMin'] = $resultat['nbre'];
198
			}
201
			}
199
			if ($resultat['nbre'] > $info['observationsParCommunesMax']) {
202
			if ($resultat['nbre'] > $info['observationsParCommunesMax']) {
200
				$info['observationsParCommunesMax'] = $resultat['nbre'];
203
				$info['observationsParCommunesMax'] = $resultat['nbre'];
201
			}
204
			}
202
			$info['observationsParCommunesTotal'] += $resultat['nbre'];
205
			$info['observationsParCommunesTotal'] += $resultat['nbre'];
203
		}
206
		}
204
		$info['observationsParCommunesMoyenne'] = ($info['communes'] > 0 ) ? round($info['observationsParCommunesTotal'] / $info['communes'], 2) : 0;
207
		$info['observationsParCommunesMoyenne'] = ($info['communes'] > 0 ) ? round($info['observationsParCommunesTotal'] / $info['communes'], 2) : 0;
205
 
208
 
206
		return $info;
209
		return $info;
207
	}
210
	}
208
 
211
 
209
	private function getNbObsPubliques() {
212
	private function getNbObsPubliques() {
210
		$requete = $this->construireRequeteNbreObsPubliques();
213
		$requete = $this->construireRequeteNbreObsPubliques();
211
		$info = (int) Cel::db()->requeterValeurUnique($requete);
214
		$info = (int) Cel::db()->requeterValeurUnique($requete);
212
		return $info;
215
		return $info;
213
	}
216
	}
214
 
217
 
215
	private function getNbImagesPubliques() {
218
	private function getNbImagesPubliques() {
216
		$requete = $this->construireRequeteNbreImgLiees(true);
219
		$requete = $this->construireRequeteNbreImgLiees(true);
217
		$info = (int) Cel::db()->requeterValeurUnique($requete);
220
		$info = (int) Cel::db()->requeterValeurUnique($requete);
218
		return $info;
221
		return $info;
219
	}
222
	}
220
 
223
 
221
	private function construireRequeteNbreObs() {
224
	private function construireRequeteNbreObs() {
222
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
225
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
223
					'FROM cel_obs ';
226
					'FROM cel_obs ';
224
 
227
 
225
		if (count($this->parametres) != 0) {
228
		if (count($this->parametres) != 0) {
226
			$filtres = array();
229
			$filtres = array();
227
			extract($this->parametres);
230
			extract($this->parametres);
228
 
231
 
229
			if (isset($utilisateur)) {
232
			if (isset($utilisateur)) {
230
				$filtres[] = "courriel_utilisateur = $utilisateur ";
233
				$filtres[] = "courriel_utilisateur = $utilisateur ";
231
			}
234
			}
232
			if (isset($num_taxon)) {
235
			if (isset($num_taxon)) {
233
				$filtres[] = "num_taxon = $num_taxon ";
236
				$filtres[] = "num_taxon = $num_taxon ";
234
			}
237
			}
235
			if (isset($taxon)) {
238
			if (isset($taxon)) {
236
				$filtres[] = "nom_ret LIKE $taxon ";
239
				$filtres[] = "nom_ret LIKE $taxon ";
237
			}
240
			}
238
 
241
 
239
			$requete .= ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
242
			$requete .= ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
240
		}
243
		}
241
 
244
 
242
		return $requete;
245
		return $requete;
243
	}
246
	}
244
 
247
 
245
	private function construireRequeteNbreObsPubliques() {
248
	private function construireRequeteNbreObsPubliques() {
246
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
249
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
247
					'FROM cel_obs '.
250
					'FROM cel_obs '.
248
					"WHERE transmission = 1 ";
251
					"WHERE transmission = 1 ";
249
 
252
 
250
		if (count($this->parametres) != 0) {
253
		if (count($this->parametres) != 0) {
251
			$filtres = array();
254
			$filtres = array();
252
			extract($this->parametres);
255
			extract($this->parametres);
253
 
256
 
254
			if (isset($utilisateur)) {
257
			if (isset($utilisateur)) {
255
				$filtres[] = "courriel_utilisateur = $utilisateur ";
258
				$filtres[] = "courriel_utilisateur = $utilisateur ";
256
			}
259
			}
257
			if (isset($num_taxon)) {
260
			if (isset($num_taxon)) {
258
				$filtres[] = "num_taxon = $num_taxon ";
261
				$filtres[] = "num_taxon = $num_taxon ";
259
			}
262
			}
260
			if (isset($taxon)) {
263
			if (isset($taxon)) {
261
				$filtres[] = "nom_ret LIKE $taxon ";
264
				$filtres[] = "nom_ret LIKE $taxon ";
262
			}
265
			}
263
 
266
 
264
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
267
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
265
		}
268
		}
266
 
269
 
267
		return $requete;
270
		return $requete;
268
	}
271
	}
269
 
272
 
270
	private function construireRequeteNbreObsParCommune() {
273
	private function construireRequeteNbreObsParCommune() {
271
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
274
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
272
					'FROM cel_obs '.
275
					'FROM cel_obs '.
273
					"WHERE zone_geo IS NOT NULL ".
276
					"WHERE zone_geo IS NOT NULL ".
274
					"	AND ce_zone_geo IS NOT NULL ";
277
					"	AND ce_zone_geo IS NOT NULL ";
275
		$groupBy = 'GROUP BY zone_geo, ce_zone_geo';
278
		$groupBy = 'GROUP BY zone_geo, ce_zone_geo';
276
 
279
 
277
		if (count($this->parametres) != 0) {
280
		if (count($this->parametres) != 0) {
278
			$filtres = array();
281
			$filtres = array();
279
			extract($this->parametres);
282
			extract($this->parametres);
280
 
283
 
281
			if (isset($utilisateur)) {
284
			if (isset($utilisateur)) {
282
				$filtres[] = "courriel_utilisateur = $utilisateur ";
285
				$filtres[] = "courriel_utilisateur = $utilisateur ";
283
			}
286
			}
284
			if (isset($num_taxon)) {
287
			if (isset($num_taxon)) {
285
				$filtres[] = "nt = $num_taxon ";
288
				$filtres[] = "nt = $num_taxon ";
286
			}
289
			}
287
			if (isset($taxon)) {
290
			if (isset($taxon)) {
288
				$filtres[] = "nom_ret LIKE $taxon ";
291
				$filtres[] = "nom_ret LIKE $taxon ";
289
			}
292
			}
290
 
293
 
291
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
294
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
292
		}
295
		}
293
		$requete .= $groupBy;
296
		$requete .= $groupBy;
294
 
297
 
295
		return $requete;
298
		return $requete;
296
	}
299
	}
297
 
300
 
298
	private function construireRequeteNbreImg() {
301
	private function construireRequeteNbreImg() {
299
		$select = 	'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
302
		$select = 	'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
300
		$from = 'FROM cel_images ci ';
303
		$from = 'FROM cel_images ci ';
301
 
304
 
302
		if (count($this->parametres) != 0) {
305
		if (count($this->parametres) != 0) {
303
			$filtres = array();
306
			$filtres = array();
304
 
307
 
305
			extract($this->parametres);
308
			extract($this->parametres);
306
 
309
 
307
			if (isset($utilisateur)) {
310
			if (isset($utilisateur)) {
308
				$filtres[] = "courriel_utilisateur = $utilisateur ";
311
				$filtres[] = "courriel_utilisateur = $utilisateur ";
309
			}
312
			}
310
			if (isset($num_taxon)) {
313
			if (isset($num_taxon)) {
311
 
314
 
312
				$filtres[] = "nt = $num_taxon ";
315
				$filtres[] = "nt = $num_taxon ";
313
			}
316
			}
314
			if (isset($taxon)) {
317
			if (isset($taxon)) {
315
				$filtres[] = "nom_ret LIKE $taxon ";
318
				$filtres[] = "nom_ret LIKE $taxon ";
316
			}
319
			}
317
			if (isset($num_taxon) || isset($taxon)) {
320
			if (isset($num_taxon) || isset($taxon)) {
318
				$from .= 'LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
321
				$from .= 'LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
319
			}
322
			}
320
 
323
 
321
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
324
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
322
		}
325
		}
323
		$requete = $select.$from.$where;
326
		$requete = $select.$from.$where;
324
 
327
 
325
		return $requete;
328
		return $requete;
326
	}
329
	}
327
 
330
 
328
	private function construireRequeteNbreImgLiees($publiquesSeulement=false) {
331
	private function construireRequeteNbreImgLiees($publiquesSeulement=false) {
329
		$select = 'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
332
		$select = 'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
330
		$from = 'FROM cel_images ci ';
333
		$from = 'FROM cel_images ci ';
331
 
334
 
332
		if (count($this->parametres) != 0) {
335
		if (count($this->parametres) != 0) {
333
			$filtres = array();
336
			$filtres = array();
334
 
337
 
335
			extract($this->parametres);
338
			extract($this->parametres);
336
 
339
 
337
			if (isset($utilisateur)) {
340
			if (isset($utilisateur)) {
338
				$filtres[] = "ci.courriel_utilisateur = $utilisateur ";
341
				$filtres[] = "ci.courriel_utilisateur = $utilisateur ";
339
			}
342
			}
340
			if (isset($num_taxon)) {
343
			if (isset($num_taxon)) {
341
				$filtres[] = "nt = $num_taxon ";
344
				$filtres[] = "nt = $num_taxon ";
342
			}
345
			}
343
			if (isset($taxon)) {
346
			if (isset($taxon)) {
344
				$filtres[] = "nom_ret LIKE $taxon ";
347
				$filtres[] = "nom_ret LIKE $taxon ";
345
			}
348
			}
346
			if ($publiquesSeulement === true) {
349
			if ($publiquesSeulement === true) {
347
				$filtres[] = "ci.transmission = 1";
350
				$filtres[] = "ci.transmission = 1";
348
			}
351
			}
349
 
352
 
350
			if (isset($num_taxon) || isset($taxon)) {
353
			if (isset($num_taxon) || isset($taxon)) {
351
				$from .= 'LEFT JOIN cel_obs ON (ci.ce_observation = co.id_observation) ';
354
				$from .= 'LEFT JOIN cel_obs ON (ci.ce_observation = co.id_observation) ';
352
			}
355
			}
353
 
356
 
354
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
357
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
355
		}
358
		}
356
 
359
 
357
		$requete = $select.$from.$where;
360
		$requete = $select.$from.$where;
358
		return $requete;
361
		return $requete;
359
	}
362
	}
360
 
363
 
361
	private function construireRequeteNbreObsLiees() {
364
	private function construireRequeteNbreObsLiees() {
362
		$select = 'SELECT COUNT(DISTINCT id_observation) AS nbre ';
365
		$select = 'SELECT COUNT(DISTINCT id_observation) AS nbre ';
363
		$from = 'FROM cel_images ci '.
366
		$from = 'FROM cel_images ci '.
364
				'	LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
367
				'	LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
365
 
368
 
366
		if (count($this->parametres) != 0) {
369
		if (count($this->parametres) != 0) {
367
			$filtres = array();
370
			$filtres = array();
368
 
371
 
369
			extract($this->parametres);
372
			extract($this->parametres);
370
 
373
 
371
			if (isset($utilisateur)) {
374
			if (isset($utilisateur)) {
372
				$filtres[] = "courriel_utilisateur = $utilisateur ";
375
				$filtres[] = "courriel_utilisateur = $utilisateur ";
373
			}
376
			}
374
			if (isset($num_taxon)) {
377
			if (isset($num_taxon)) {
375
				$filtres[] = "nt = $num_taxon ";
378
				$filtres[] = "nt = $num_taxon ";
376
			}
379
			}
377
			if (isset($taxon)) {
380
			if (isset($taxon)) {
378
				$filtres[] = "nom_ret LIKE $taxon ";
381
				$filtres[] = "nom_ret LIKE $taxon ";
379
			}
382
			}
380
 
383
 
381
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
384
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
382
		}
385
		}
383
 
386
 
384
		$requete = $select.$from.$where;
387
		$requete = $select.$from.$where;
385
 
388
 
386
		return $requete;
389
		return $requete;
387
	}
390
	}
388
 
391
 
389
 
392
 
390
	/**
393
	/**
391
	 * Retourne les n principaux contributeurs depuis x jours,
394
	 * Retourne les n principaux contributeurs depuis x jours,
392
	 * en termes d'observations ajoutées, d'images ajoutées, ou les deux
395
	 * en termes d'observations ajoutées, d'images ajoutées, ou les deux
393
	 * Paramètres : "jours" (int), "nombre" (int), "critere" ("obs" ou "img" ou "")
396
	 * Paramètres : "jours" (int), "nombre" (int), "critere" ("obs" ou "img" ou "")
394
	 * @return array
397
	 * @return array
395
	 */
398
	 */
396
	private function getGrandsContributeurs() {
399
	private function getGrandsContributeurs() {
397
		$nombre = 10; // les $nombre plus importants contributeurs
400
		$nombre = 10; // les $nombre plus importants contributeurs
398
		$jours = 7; // depuis $jours jours
401
		$jours = 7; // depuis $jours jours
399
		$critere = null; // "obs", "img" ou null (les deux)
402
		$critere = null; // "obs", "img" ou null (les deux)
400
 
403
 
401
		if (isset($this->parametres['nombre'])) {
404
		if (isset($this->parametres['nombre'])) {
402
			$nombre = $this->parametres['nombre'];
405
			$nombre = $this->parametres['nombre'];
403
		}
406
		}
404
		if (isset($this->parametres['jours'])) {
407
		if (isset($this->parametres['jours'])) {
405
			$jours = $this->parametres['jours'];
408
			$jours = $this->parametres['jours'];
406
		}
409
		}
407
		if (isset($this->parametres['critere'])) {
410
		if (isset($this->parametres['critere'])) {
408
			$critere = $this->parametres['critere'];
411
			$critere = $this->parametres['critere'];
409
		}
412
		}
410
 
413
 
411
		$requete = $this->construireRequeteGrandsContributeurs($nombre, $jours, $critere);
414
		$requete = $this->construireRequeteGrandsContributeurs($nombre, $jours, $critere);
412
		$resultats = Cel::db()->requeter($requete);
415
		$resultats = Cel::db()->requeter($requete);
413
 
416
 
414
		$courriels = array();
417
		$courriels = array();
415
		foreach ($resultats as $res) {
418
		foreach ($resultats as $res) {
416
			$courriels[] = $res['courriel_utilisateur'];
419
			$courriels[] = $res['courriel_utilisateur'];
417
		}
420
		}
418
		$identites = $this->recupererUtilisateursIdentite($courriels);
421
		$identites = $this->recupererUtilisateursIdentite($courriels);
419
		foreach ($resultats as &$res) {
422
		foreach ($resultats as &$res) {
420
			$res['intitule_utilisateur'] = $identites[$res['courriel_utilisateur']]['intitule'];
423
			$res['intitule_utilisateur'] = $identites[$res['courriel_utilisateur']]['intitule'];
421
			unset($res['courriel_utilisateur']);
424
			unset($res['courriel_utilisateur']);
422
			unset($res['nom_utilisateur']);
425
			unset($res['nom_utilisateur']);
423
			unset($res['prenom_utilisateur']);
426
			unset($res['prenom_utilisateur']);
424
		}
427
		}
425
 
428
 
426
		$retour = array(
429
		$retour = array(
427
			'entete' => array(
430
			'entete' => array(
428
				'nombre' => intval($nombre),
431
				'nombre' => intval($nombre),
429
				'jours' => intval($jours),
432
				'jours' => intval($jours),
430
				'critere' => $critere
433
				'critere' => $critere
431
			),
434
			),
432
			'resultats' => array()
435
			'resultats' => array()
433
		);
436
		);
434
		$liste = array();
437
		$liste = array();
435
		if ($resultats != false) {
438
		if ($resultats != false) {
436
			foreach ($resultats as $resultat) {
439
			foreach ($resultats as $resultat) {
437
				// essayons de faire du JSON propre
440
				// essayons de faire du JSON propre
438
				if (isset($resultat['nombreImg'])) {
441
				if (isset($resultat['nombreImg'])) {
439
					$resultat['nombreImg'] = intval($resultat['nombreImg']);
442
					$resultat['nombreImg'] = intval($resultat['nombreImg']);
440
				}
443
				}
441
				if (isset($resultat['nombreObs'])) {
444
				if (isset($resultat['nombreObs'])) {
442
					$resultat['nombreObs'] = intval($resultat['nombreObs']);
445
					$resultat['nombreObs'] = intval($resultat['nombreObs']);
443
				}
446
				}
444
				if (isset($resultat['somme'])) {
447
				if (isset($resultat['somme'])) {
445
					$resultat['somme'] = intval($resultat['somme']);
448
					$resultat['somme'] = intval($resultat['somme']);
446
				}
449
				}
447
				$liste[] = $resultat; // pas de clefs afin de renvoyer une "liste" JSON, qui sera interprétée en conservant l'ordre
450
				$liste[] = $resultat; // pas de clefs afin de renvoyer une "liste" JSON, qui sera interprétée en conservant l'ordre
448
			}
451
			}
449
			$retour['resultats'] = $liste;
452
			$retour['resultats'] = $liste;
450
		}
453
		}
451
		return $retour;
454
		return $retour;
452
	}
455
	}
453
 
456
 
454
	private function construireRequeteGrandsContributeurs($nombre = 10, $jours = 7, $critere = null) {
457
	private function construireRequeteGrandsContributeurs($nombre = 10, $jours = 7, $critere = null) {
455
		$requete = '';
458
		$requete = '';
456
		switch ($critere) {
459
		switch ($critere) {
457
			case 'obs':
460
			case 'obs':
458
				$requete = "SELECT ce_utilisateur , prenom_utilisateur , nom_utilisateur , courriel_utilisateur , ".
461
				$requete = "SELECT ce_utilisateur , prenom_utilisateur , nom_utilisateur , courriel_utilisateur , ".
459
					"	COUNT(*) AS nombreObs ".
462
					"	COUNT(*) AS nombreObs ".
460
					"FROM cel_obs ".
463
					"FROM cel_obs ".
461
					"WHERE transmission = 1 ".
464
					"WHERE transmission = 1 ".
462
					"AND TO_DAYS(NOW()) - TO_DAYS(date_transmission) <= $jours ".
465
					"AND TO_DAYS(NOW()) - TO_DAYS(date_transmission) <= $jours ".
463
					"GROUP BY ce_utilisateur ".
466
					"GROUP BY ce_utilisateur ".
464
					"ORDER BY nombreObs DESC ".
467
					"ORDER BY nombreObs DESC ".
465
					"LIMIT $nombre ";
468
					"LIMIT $nombre ";
466
				break;
469
				break;
467
			case 'img':
470
			case 'img':
468
				$requete = "SELECT co.ce_utilisateur , co.prenom_utilisateur , co.nom_utilisateur , ".
471
				$requete = "SELECT co.ce_utilisateur , co.prenom_utilisateur , co.nom_utilisateur , ".
469
					"	co.courriel_utilisateur , COUNT(DISTINCT ci.id_image) AS nombreImg ".
472
					"	co.courriel_utilisateur , COUNT(DISTINCT ci.id_image) AS nombreImg ".
470
					"FROM cel_images ci ".
473
					"FROM cel_images ci ".
471
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
474
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
472
					"WHERE co.transmission = 1 ".
475
					"WHERE co.transmission = 1 ".
473
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
476
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
474
					"GROUP BY co.ce_utilisateur ".
477
					"GROUP BY co.ce_utilisateur ".
475
					"ORDER BY nombreImg DESC ".
478
					"ORDER BY nombreImg DESC ".
476
					"LIMIT $nombre ";
479
					"LIMIT $nombre ";
477
				break;
480
				break;
478
			default:
481
			default:
479
				$requete = "SELECT co.ce_utilisateur, co.prenom_utilisateur, co.nom_utilisateur, co.courriel_utilisateur, ".
482
				$requete = "SELECT co.ce_utilisateur, co.prenom_utilisateur, co.nom_utilisateur, co.courriel_utilisateur, ".
480
					"COUNT(DISTINCT ci.id_image) AS nombreImg, COUNT(DISTINCT co.id_observation) AS nombreObs, ".
483
					"COUNT(DISTINCT ci.id_image) AS nombreImg, COUNT(DISTINCT co.id_observation) AS nombreObs, ".
481
					"COUNT(DISTINCT ci.id_image) + COUNT(DISTINCT co.id_observation) AS somme ".
484
					"COUNT(DISTINCT ci.id_image) + COUNT(DISTINCT co.id_observation) AS somme ".
482
					"FROM cel_images ci ".
485
					"FROM cel_images ci ".
483
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
486
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
484
					"WHERE co.transmission = 1 ".
487
					"WHERE co.transmission = 1 ".
485
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
488
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
486
					"GROUP BY co.ce_utilisateur ".
489
					"GROUP BY co.ce_utilisateur ".
487
					"ORDER BY somme DESC ".
490
					"ORDER BY somme DESC ".
488
					"LIMIT $nombre ";
491
					"LIMIT $nombre ";
489
		}
492
		}
490
		return $requete;
493
		return $requete;
491
	}
494
	}
492
}
495
}