Subversion Repositories eFlore/Applications.cel

Rev

Rev 2502 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2502 Rev 2503
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
 
184
 
185
		$requete = $this->construireRequeteNbreObsLiees();
185
		$requete = $this->construireRequeteNbreObsLiees();
186
		$info['observationsLiees'] = (int) Cel::db()->requeterValeurUnique($requete);
186
		$info['observationsLiees'] = (int) Cel::db()->requeterValeurUnique($requete);
187
 
187
 
188
		$info['moyImagesParObs'] = ($info['observationsLiees'] > 0 ? round($info['imagesLiees']/$info['observationsLiees'], 2) : '');
188
		$info['moyImagesParObs'] = ($info['observationsLiees'] > 0 ? round($info['imagesLiees']/$info['observationsLiees'], 2) : '');
189
 
189
 
190
		$requete = $this->construireRequeteNbreObsParCommune();
190
		$requete = $this->construireRequeteNbreObsParCommune();
191
		$info['communes'] = ($resultats = Cel::db()->requeter($requete)) ? count($resultats) : '' ;
191
		$info['communes'] = ($resultats = Cel::db()->requeter($requete)) ? count($resultats) : '' ;
192
		$info['observationsParCommunesMin'] = 1000;
192
		$info['observationsParCommunesMin'] = 1000;
193
		$info['observationsParCommunesMax'] = 0;
193
		$info['observationsParCommunesMax'] = 0;
194
		$info['observationsParCommunesTotal'] = 0;
194
		$info['observationsParCommunesTotal'] = 0;
195
		foreach ($resultats as $resultat) {
195
		foreach ($resultats as $resultat) {
196
			if ($resultat['nbre'] < $info['observationsParCommunesMin']) {
196
			if ($resultat['nbre'] < $info['observationsParCommunesMin']) {
197
				$info['observationsParCommunesMin'] = $resultat['nbre'];
197
				$info['observationsParCommunesMin'] = $resultat['nbre'];
198
			}
198
			}
199
			if ($resultat['nbre'] > $info['observationsParCommunesMax']) {
199
			if ($resultat['nbre'] > $info['observationsParCommunesMax']) {
200
				$info['observationsParCommunesMax'] = $resultat['nbre'];
200
				$info['observationsParCommunesMax'] = $resultat['nbre'];
201
			}
201
			}
202
			$info['observationsParCommunesTotal'] += $resultat['nbre'];
202
			$info['observationsParCommunesTotal'] += $resultat['nbre'];
203
		}
203
		}
204
		$info['observationsParCommunesMoyenne'] = ($info['communes'] > 0 ) ? round($info['observationsParCommunesTotal'] / $info['communes'], 2) : 0;
204
		$info['observationsParCommunesMoyenne'] = ($info['communes'] > 0 ) ? round($info['observationsParCommunesTotal'] / $info['communes'], 2) : 0;
205
 
205
 
206
		return $info;
206
		return $info;
207
	}
207
	}
208
 
208
 
209
	private function getNbObsPubliques() {
209
	private function getNbObsPubliques() {
210
		$requete = $this->construireRequeteNbreObsPubliques();
210
		$requete = $this->construireRequeteNbreObsPubliques();
211
		$info = (int) Cel::db()->requeterValeurUnique($requete);
211
		$info = (int) Cel::db()->requeterValeurUnique($requete);
212
		return $info;
212
		return $info;
213
	}
213
	}
214
 
214
 
215
	private function getNbImagesPubliques() {
215
	private function getNbImagesPubliques() {
216
		$requete = $this->construireRequeteNbreImgLiees(true);
216
		$requete = $this->construireRequeteNbreImgLiees(true);
217
		$info = (int) Cel::db()->requeterValeurUnique($requete);
217
		$info = (int) Cel::db()->requeterValeurUnique($requete);
218
		return $info;
218
		return $info;
219
	}
219
	}
220
 
220
 
221
	private function construireRequeteNbreObs() {
221
	private function construireRequeteNbreObs() {
222
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
222
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
223
					'FROM cel_obs ';
223
					'FROM cel_obs ';
224
 
224
 
225
		if (count($this->parametres) != 0) {
225
		if (count($this->parametres) != 0) {
226
			$filtres = array();
226
			$filtres = array();
227
			extract($this->parametres);
227
			extract($this->parametres);
228
 
228
 
229
			if (isset($utilisateur)) {
229
			if (isset($utilisateur)) {
230
				$filtres[] = "courriel_utilisateur = $utilisateur ";
230
				$filtres[] = "courriel_utilisateur = $utilisateur ";
231
			}
231
			}
232
			if (isset($num_taxon)) {
232
			if (isset($num_taxon)) {
233
				$filtres[] = "num_taxon = $num_taxon ";
233
				$filtres[] = "num_taxon = $num_taxon ";
234
			}
234
			}
235
			if (isset($taxon)) {
235
			if (isset($taxon)) {
236
				$filtres[] = "nom_ret LIKE $taxon ";
236
				$filtres[] = "nom_ret LIKE $taxon ";
237
			}
237
			}
238
 
238
 
239
			$requete .= ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
239
			$requete .= ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
240
		}
240
		}
241
 
241
 
242
		return $requete;
242
		return $requete;
243
	}
243
	}
244
 
244
 
245
	private function construireRequeteNbreObsPubliques() {
245
	private function construireRequeteNbreObsPubliques() {
246
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
246
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
247
					'FROM cel_obs '.
247
					'FROM cel_obs '.
248
					"WHERE transmission = 1 ";
248
					"WHERE transmission = 1 ";
249
 
249
 
250
		if (count($this->parametres) != 0) {
250
		if (count($this->parametres) != 0) {
251
			$filtres = array();
251
			$filtres = array();
252
			extract($this->parametres);
252
			extract($this->parametres);
253
 
253
 
254
			if (isset($utilisateur)) {
254
			if (isset($utilisateur)) {
255
				$filtres[] = "courriel_utilisateur = $utilisateur ";
255
				$filtres[] = "courriel_utilisateur = $utilisateur ";
256
			}
256
			}
257
			if (isset($num_taxon)) {
257
			if (isset($num_taxon)) {
258
				$filtres[] = "num_taxon = $num_taxon ";
258
				$filtres[] = "num_taxon = $num_taxon ";
259
			}
259
			}
260
			if (isset($taxon)) {
260
			if (isset($taxon)) {
261
				$filtres[] = "nom_ret LIKE $taxon ";
261
				$filtres[] = "nom_ret LIKE $taxon ";
262
			}
262
			}
263
 
263
 
264
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
264
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
265
		}
265
		}
266
 
266
 
267
		return $requete;
267
		return $requete;
268
	}
268
	}
269
 
269
 
270
	private function construireRequeteNbreObsParCommune() {
270
	private function construireRequeteNbreObsParCommune() {
271
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
271
		$requete = 	'SELECT COUNT(id_observation) AS nbre '.
272
					'FROM cel_obs '.
272
					'FROM cel_obs '.
273
					"WHERE zone_geo IS NOT NULL ".
273
					"WHERE zone_geo IS NOT NULL ".
274
					"	AND ce_zone_geo IS NOT NULL ";
274
					"	AND ce_zone_geo IS NOT NULL ";
275
		$groupBy = 'GROUP BY zone_geo, ce_zone_geo';
275
		$groupBy = 'GROUP BY zone_geo, ce_zone_geo';
276
 
276
 
277
		if (count($this->parametres) != 0) {
277
		if (count($this->parametres) != 0) {
278
			$filtres = array();
278
			$filtres = array();
279
			extract($this->parametres);
279
			extract($this->parametres);
280
 
280
 
281
			if (isset($utilisateur)) {
281
			if (isset($utilisateur)) {
282
				$filtres[] = "courriel_utilisateur = $utilisateur ";
282
				$filtres[] = "courriel_utilisateur = $utilisateur ";
283
			}
283
			}
284
			if (isset($num_taxon)) {
284
			if (isset($num_taxon)) {
285
				$filtres[] = "nt = $num_taxon ";
285
				$filtres[] = "nt = $num_taxon ";
286
			}
286
			}
287
			if (isset($taxon)) {
287
			if (isset($taxon)) {
288
				$filtres[] = "nom_ret LIKE $taxon ";
288
				$filtres[] = "nom_ret LIKE $taxon ";
289
			}
289
			}
290
 
290
 
291
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
291
			$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
292
		}
292
		}
293
		$requete .= $groupBy;
293
		$requete .= $groupBy;
294
 
294
 
295
		return $requete;
295
		return $requete;
296
	}
296
	}
297
 
297
 
298
	private function construireRequeteNbreImg() {
298
	private function construireRequeteNbreImg() {
299
		$select = 	'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
299
		$select = 	'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
300
		$from = 'FROM cel_images ci ';
300
		$from = 'FROM cel_images ci ';
301
 
301
 
302
		if (count($this->parametres) != 0) {
302
		if (count($this->parametres) != 0) {
303
			$filtres = array();
303
			$filtres = array();
304
 
304
 
305
			extract($this->parametres);
305
			extract($this->parametres);
306
 
306
 
307
			if (isset($utilisateur)) {
307
			if (isset($utilisateur)) {
308
				$filtres[] = "courriel_utilisateur = $utilisateur ";
308
				$filtres[] = "courriel_utilisateur = $utilisateur ";
309
			}
309
			}
310
			if (isset($num_taxon)) {
310
			if (isset($num_taxon)) {
311
 
311
 
312
				$filtres[] = "nt = $num_taxon ";
312
				$filtres[] = "nt = $num_taxon ";
313
			}
313
			}
314
			if (isset($taxon)) {
314
			if (isset($taxon)) {
315
				$filtres[] = "nom_ret LIKE $taxon ";
315
				$filtres[] = "nom_ret LIKE $taxon ";
316
			}
316
			}
317
			if (isset($num_taxon) || isset($taxon)) {
317
			if (isset($num_taxon) || isset($taxon)) {
318
				$from .= 'LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
318
				$from .= 'LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
319
			}
319
			}
320
 
320
 
321
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
321
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
322
		}
322
		}
323
		$requete = $select.$from.$where;
323
		$requete = $select.$from.$where;
324
 
324
 
325
		return $requete;
325
		return $requete;
326
	}
326
	}
327
 
327
 
328
	private function construireRequeteNbreImgLiees($publiquesSeulement=false) {
328
	private function construireRequeteNbreImgLiees($publiquesSeulement=false) {
329
		$select = 'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
329
		$select = 'SELECT COUNT(DISTINCT ci.id_image) AS nbre ';
330
		$from = 'FROM cel_images ci ';
330
		$from = 'FROM cel_images ci ';
331
 
331
 
332
		if (count($this->parametres) != 0) {
332
		if (count($this->parametres) != 0) {
333
			$filtres = array();
333
			$filtres = array();
334
 
334
 
335
			extract($this->parametres);
335
			extract($this->parametres);
336
 
336
 
337
			if (isset($utilisateur)) {
337
			if (isset($utilisateur)) {
338
				$filtres[] = "ci.courriel_utilisateur = $utilisateur ";
338
				$filtres[] = "ci.courriel_utilisateur = $utilisateur ";
339
			}
339
			}
340
			if (isset($num_taxon)) {
340
			if (isset($num_taxon)) {
341
				$filtres[] = "nt = $num_taxon ";
341
				$filtres[] = "nt = $num_taxon ";
342
			}
342
			}
343
			if (isset($taxon)) {
343
			if (isset($taxon)) {
344
				$filtres[] = "nom_ret LIKE $taxon ";
344
				$filtres[] = "nom_ret LIKE $taxon ";
345
			}
345
			}
346
			if ($publiquesSeulement === true) {
346
			if ($publiquesSeulement === true) {
347
				$filtres[] = "transmission = 1";
347
				$filtres[] = "ci.transmission = 1";
348
			}
348
			}
349
 
349
 
350
			if (isset($num_taxon) || isset($taxon)) {
350
			if (isset($num_taxon) || isset($taxon)) {
351
				$from .= 'LEFT JOIN cel_obs ON (ci.ce_observation = co.id_observation) ';
351
				$from .= 'LEFT JOIN cel_obs ON (ci.ce_observation = co.id_observation) ';
352
			}
352
			}
353
 
353
 
354
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
354
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
355
		}
355
		}
356
 
356
 
357
		$requete = $select.$from.$where;
357
		$requete = $select.$from.$where;
358
		return $requete;
358
		return $requete;
359
	}
359
	}
360
 
360
 
361
	private function construireRequeteNbreObsLiees() {
361
	private function construireRequeteNbreObsLiees() {
362
		$select = 'SELECT COUNT(DISTINCT id_observation) AS nbre ';
362
		$select = 'SELECT COUNT(DISTINCT id_observation) AS nbre ';
363
		$from = 'FROM cel_images ci '.
363
		$from = 'FROM cel_images ci '.
364
				'	LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
364
				'	LEFT JOIN cel_obs co ON (ci.ce_observation = co.id_observation) ';
365
 
365
 
366
		if (count($this->parametres) != 0) {
366
		if (count($this->parametres) != 0) {
367
			$filtres = array();
367
			$filtres = array();
368
 
368
 
369
			extract($this->parametres);
369
			extract($this->parametres);
370
 
370
 
371
			if (isset($utilisateur)) {
371
			if (isset($utilisateur)) {
372
				$filtres[] = "courriel_utilisateur = $utilisateur ";
372
				$filtres[] = "courriel_utilisateur = $utilisateur ";
373
			}
373
			}
374
			if (isset($num_taxon)) {
374
			if (isset($num_taxon)) {
375
				$filtres[] = "nt = $num_taxon ";
375
				$filtres[] = "nt = $num_taxon ";
376
			}
376
			}
377
			if (isset($taxon)) {
377
			if (isset($taxon)) {
378
				$filtres[] = "nom_ret LIKE $taxon ";
378
				$filtres[] = "nom_ret LIKE $taxon ";
379
			}
379
			}
380
 
380
 
381
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
381
			$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
382
		}
382
		}
383
 
383
 
384
		$requete = $select.$from.$where;
384
		$requete = $select.$from.$where;
385
 
385
 
386
		return $requete;
386
		return $requete;
387
	}
387
	}
388
 
388
 
389
 
389
 
390
	/**
390
	/**
391
	 * Retourne les n principaux contributeurs depuis x jours,
391
	 * Retourne les n principaux contributeurs depuis x jours,
392
	 * en termes d'observations ajoutées, d'images ajoutées, ou les deux
392
	 * 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 "")
393
	 * Paramètres : "jours" (int), "nombre" (int), "critere" ("obs" ou "img" ou "")
394
	 * @return array
394
	 * @return array
395
	 */
395
	 */
396
	private function getGrandsContributeurs() {
396
	private function getGrandsContributeurs() {
397
		$nombre = 10; // les $nombre plus importants contributeurs
397
		$nombre = 10; // les $nombre plus importants contributeurs
398
		$jours = 7; // depuis $jours jours
398
		$jours = 7; // depuis $jours jours
399
		$critere = null; // "obs", "img" ou null (les deux)
399
		$critere = null; // "obs", "img" ou null (les deux)
400
 
400
 
401
		if (isset($this->parametres['nombre'])) {
401
		if (isset($this->parametres['nombre'])) {
402
			$nombre = $this->parametres['nombre'];
402
			$nombre = $this->parametres['nombre'];
403
		}
403
		}
404
		if (isset($this->parametres['jours'])) {
404
		if (isset($this->parametres['jours'])) {
405
			$jours = $this->parametres['jours'];
405
			$jours = $this->parametres['jours'];
406
		}
406
		}
407
		if (isset($this->parametres['critere'])) {
407
		if (isset($this->parametres['critere'])) {
408
			$critere = $this->parametres['critere'];
408
			$critere = $this->parametres['critere'];
409
		}
409
		}
410
 
410
 
411
		$requete = $this->construireRequeteGrandsContributeurs($nombre, $jours, $critere);
411
		$requete = $this->construireRequeteGrandsContributeurs($nombre, $jours, $critere);
412
		$resultats = Cel::db()->requeter($requete);
412
		$resultats = Cel::db()->requeter($requete);
413
 
413
 
414
		$courriels = array();
414
		$courriels = array();
415
		foreach ($resultats as $res) {
415
		foreach ($resultats as $res) {
416
			$courriels[] = $res['courriel_utilisateur'];
416
			$courriels[] = $res['courriel_utilisateur'];
417
		}
417
		}
418
		$identites = $this->recupererUtilisateursIdentite($courriels);
418
		$identites = $this->recupererUtilisateursIdentite($courriels);
419
		foreach ($resultats as &$res) {
419
		foreach ($resultats as &$res) {
420
			$res['intitule_utilisateur'] = $identites[$res['courriel_utilisateur']]['intitule'];
420
			$res['intitule_utilisateur'] = $identites[$res['courriel_utilisateur']]['intitule'];
421
			unset($res['courriel_utilisateur']);
421
			unset($res['courriel_utilisateur']);
422
			unset($res['nom_utilisateur']);
422
			unset($res['nom_utilisateur']);
423
			unset($res['prenom_utilisateur']);
423
			unset($res['prenom_utilisateur']);
424
		}
424
		}
425
 
425
 
426
		$retour = array(
426
		$retour = array(
427
			'entete' => array(
427
			'entete' => array(
428
				'nombre' => intval($nombre),
428
				'nombre' => intval($nombre),
429
				'jours' => intval($jours),
429
				'jours' => intval($jours),
430
				'critere' => $critere
430
				'critere' => $critere
431
			),
431
			),
432
			'resultats' => array()
432
			'resultats' => array()
433
		);
433
		);
434
		$liste = array();
434
		$liste = array();
435
		if ($resultats != false) {
435
		if ($resultats != false) {
436
			foreach ($resultats as $resultat) {
436
			foreach ($resultats as $resultat) {
437
				// essayons de faire du JSON propre
437
				// essayons de faire du JSON propre
438
				if (isset($resultat['nombreImg'])) {
438
				if (isset($resultat['nombreImg'])) {
439
					$resultat['nombreImg'] = intval($resultat['nombreImg']);
439
					$resultat['nombreImg'] = intval($resultat['nombreImg']);
440
				}
440
				}
441
				if (isset($resultat['nombreObs'])) {
441
				if (isset($resultat['nombreObs'])) {
442
					$resultat['nombreObs'] = intval($resultat['nombreObs']);
442
					$resultat['nombreObs'] = intval($resultat['nombreObs']);
443
				}
443
				}
444
				if (isset($resultat['somme'])) {
444
				if (isset($resultat['somme'])) {
445
					$resultat['somme'] = intval($resultat['somme']);
445
					$resultat['somme'] = intval($resultat['somme']);
446
				}
446
				}
447
				$liste[] = $resultat; // pas de clefs afin de renvoyer une "liste" JSON, qui sera interprétée en conservant l'ordre
447
				$liste[] = $resultat; // pas de clefs afin de renvoyer une "liste" JSON, qui sera interprétée en conservant l'ordre
448
			}
448
			}
449
			$retour['resultats'] = $liste;
449
			$retour['resultats'] = $liste;
450
		}
450
		}
451
		return $retour;
451
		return $retour;
452
	}
452
	}
453
 
453
 
454
	private function construireRequeteGrandsContributeurs($nombre = 10, $jours = 7, $critere = null) {
454
	private function construireRequeteGrandsContributeurs($nombre = 10, $jours = 7, $critere = null) {
455
		$requete = '';
455
		$requete = '';
456
		switch ($critere) {
456
		switch ($critere) {
457
			case 'obs':
457
			case 'obs':
458
				$requete = "SELECT ce_utilisateur , prenom_utilisateur , nom_utilisateur , courriel_utilisateur , ".
458
				$requete = "SELECT ce_utilisateur , prenom_utilisateur , nom_utilisateur , courriel_utilisateur , ".
459
					"	COUNT(*) AS nombreObs ".
459
					"	COUNT(*) AS nombreObs ".
460
					"FROM cel_obs ".
460
					"FROM cel_obs ".
461
					"WHERE transmission = 1 ".
461
					"WHERE transmission = 1 ".
462
					"AND TO_DAYS(NOW()) - TO_DAYS(date_transmission) <= $jours ".
462
					"AND TO_DAYS(NOW()) - TO_DAYS(date_transmission) <= $jours ".
463
					"GROUP BY ce_utilisateur ".
463
					"GROUP BY ce_utilisateur ".
464
					"ORDER BY nombreObs DESC ".
464
					"ORDER BY nombreObs DESC ".
465
					"LIMIT $nombre ";
465
					"LIMIT $nombre ";
466
				break;
466
				break;
467
			case 'img':
467
			case 'img':
468
				$requete = "SELECT co.ce_utilisateur , co.prenom_utilisateur , co.nom_utilisateur , ".
468
				$requete = "SELECT co.ce_utilisateur , co.prenom_utilisateur , co.nom_utilisateur , ".
469
					"	co.courriel_utilisateur , COUNT(DISTINCT ci.id_image) AS nombreImg ".
469
					"	co.courriel_utilisateur , COUNT(DISTINCT ci.id_image) AS nombreImg ".
470
					"FROM cel_images ci ".
470
					"FROM cel_images ci ".
471
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
471
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
472
					"WHERE co.transmission = 1 ".
472
					"WHERE co.transmission = 1 ".
473
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
473
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
474
					"GROUP BY co.ce_utilisateur ".
474
					"GROUP BY co.ce_utilisateur ".
475
					"ORDER BY nombreImg DESC ".
475
					"ORDER BY nombreImg DESC ".
476
					"LIMIT $nombre ";
476
					"LIMIT $nombre ";
477
				break;
477
				break;
478
			default:
478
			default:
479
				$requete = "SELECT co.ce_utilisateur, co.prenom_utilisateur, co.nom_utilisateur, co.courriel_utilisateur, ".
479
				$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, ".
480
					"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 ".
481
					"COUNT(DISTINCT ci.id_image) + COUNT(DISTINCT co.id_observation) AS somme ".
482
					"FROM cel_images ci ".
482
					"FROM cel_images ci ".
483
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
483
					"	RIGHT JOIN cel_obs co ON ci.ce_observation = co.id_observation ".
484
					"WHERE co.transmission = 1 ".
484
					"WHERE co.transmission = 1 ".
485
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
485
					"AND TO_DAYS(NOW()) - TO_DAYS(co.date_transmission) <= $jours ".
486
					"GROUP BY co.ce_utilisateur ".
486
					"GROUP BY co.ce_utilisateur ".
487
					"ORDER BY somme DESC ".
487
					"ORDER BY somme DESC ".
488
					"LIMIT $nombre ";
488
					"LIMIT $nombre ";
489
		}
489
		}
490
		return $requete;
490
		return $requete;
491
	}
491
	}
492
}
492
}