Subversion Repositories eFlore/Applications.cel

Rev

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

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