Subversion Repositories eFlore/Applications.del

Rev

Rev 2016 | Rev 2018 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1818 jpm 1
<?php
2
/**
3
 * Statistiques par année sur l'utilisation de Identiplante / Pictoflora
4
 *
5
 * @see Documentation : <http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliDelStats>
6
 *
7
 * @category   DEL
8
 * @package    Services
9
 * @subpackage Statistiques
10
 * @version    0.1
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 */
18
class StatistiquesParAnnee {
19
 
20
	private $conteneur;
21
	private $contexte;
22
	private $navigation;
23
	private $bdd;
24
 
25
	private $annee = null;
26
	private $type = 'tout';
27
	private $methode = '';
28
 
29
	public function __construct(Conteneur $conteneur = null) {
30
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
31
		$this->contexte = $conteneur->getContexte();
32
		$this->navigation = $conteneur->getNavigation();
33
		$this->bdd = $this->conteneur->getBdd();
34
	}
35
 
36
	public function consulter() {
37
		$this->intitialiserParametresEtRessources();
38
		$this->verifierPreRequis();
39
 
40
		$resultat = new ResultatService();
41
		$resultat->corps = call_user_func(array($this, $this->methode));
42
		return $resultat;
43
	}
44
 
45
	private function intitialiserParametresEtRessources() {
46
		$this->type = $this->contexte->getRessource(2) != null ? $this->contexte->getRessource(2) : $this->type;
47
		$this->methode = $this->obtenirNomMethode($this->type);
48
		$this->annee =(int) $this->contexte->getQS('annee') != null ? intval($this->contexte->getQS('annee')) : null;
49
	}
50
 
51
	private function verifierPreRequis() {
52
		$erreurs = array();
53
 
54
		if ($this->annee != null && !is_int($this->annee)) {
55
			$erreurs[] = "Le paramètre 'annee' doit être un entier.";
56
		}
57
		if (method_exists($this, $this->obtenirNomMethode($this->type)) === false) {
58
			$erreurs[] = "Les stats de type '{$this->type}' n'existent pas.";
59
		}
60
		if (!empty($erreurs)) {
61
			$msg = "Erreur de configuration :\n".implode("\n", $erreurs)."\n\n".Statistiques::getDoc();
62
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
63
		}
64
	}
65
 
2011 mathias 66
	/**
67
	 * Ouh la jolie méthode magique !!
68
	 * @param unknown $mot
69
	 * @return string
70
	 */
1818 jpm 71
	private function obtenirNomMethode($mot) {
72
		$classeNom = 'get'.str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
73
		return $classeNom;
74
	}
75
 
2011 mathias 76
	/**
77
	* Prend en paramêtre un tableau de courriels et retourne après avoir intérogé un service we de l'annuaire
78
	* une tableau avec en clé le courriel et en valeur, un tableau associatif :
79
	*  - nom : le nom de l'utilisateur
80
	*  - prenom : le prénom de l'utilisateur.
81
	*  @TODO ne gère pas le pseudo, qui devrait être retourné en lieu et place des nom / prénom s'il est utilisé et renseigné
82
	* @param array $courriels un tableau de courriels pour lesquels il faut recherche le prénom et nom.
83
	*/
84
	protected function recupererUtilisateursNomPrenom(Array $courriels) {
85
		// Récupération des données au format Json
86
		$service = "utilisateur/prenom-nom-par-courriel/".implode(',', $courriels);
87
		$url = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], $service);
88
		$json = $this->getDao()->consulter($url);
89
		return (array) json_decode($json);
90
	}
91
 
2016 mathias 92
	/**
93
	 * Statistiques sur les observations
94
	 * "MPM" = moyenne par mois
95
	 * "TC" = tag à déterminer ou certitude incertaine
96
	 * - Nombre d'observations au total
97
	 * - Nombre d'obs sans identification (ou tag ou certitude)
98
	 * - Nombre d'obs sans identification
99
	 * - Nombre d'obs avec tag à déterminer ou certitude incertaine
100
	 * - Nombre d'obs avec tag à déterminer ou certitude incertaine et retenue
101
	 * - Nombre d'obs avec tag à déterminer ou certitude incertaine et avec consensus
102
	 * - Nombre d'obs avec tag à déterminer ou certitude incertaine et avec consensus mais non validées
103
	 */
104
	private function getObservations() {
1818 jpm 105
		return array(
2016 mathias 106
			'nbObsTotal' => $this->getNbObsTotal(),
107
			'nbObsTotalMPM' => $this->getNbObsTotal(true),
108
			'nbObsSansIdentOuTC' => $this->getNbObsSansIdentOuTC(),
109
			'nbObsSansIdentOuTCMPM' => $this->getNbObsSansIdentOuTC(true),
110
			'nbObsSansIdent' => $this->getNbObsSansIdent(),
111
			'nbObsSansIdentMPM' => $this->getNbObsSansIdent(true),
112
			'nbObsTC' => $this->getNbObsTC(),
113
			'nbObsTCMPM' => $this->getNbObsTC(true),
114
			'nbObsTCRetenue' => $this->getNbObsTCRetenue(),
2017 mathias 115
			'nbObsTCRetenueMPM' => $this->getNbObsTCRetenue(true),
2016 mathias 116
			'nbObsTCConsensus' => $this->getNbObsTCConsensus(),
117
			'nbObsTCConsensusMPM' => $this->getNbObsTCConsensus(true),
118
			'nbObsTCConsensusNonValide' => $this->getNbObsTCConsensusNonValide(),
119
			'nbObsTCConsensusNonValideMPM' => $this->getNbObsTCConsensusNonValide(true),
1818 jpm 120
		);
121
	}
122
 
2016 mathias 123
	/**
124
	 * Nombre d'observations au total
125
	 */
126
	private function getNbObsTotal($mpm=false) {
127
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation";
128
		if ($this->annee != null) {
129
			$requete .= ' WHERE YEAR(date_transmission) = ' . $this->annee;
130
		}
131
		if ($mpm) {
132
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
133
		}
134
		$resultat = $this->bdd->recupererTous($requete);
135
		return intval(array_pop($resultat[0]));
1818 jpm 136
	}
137
 
2016 mathias 138
	/**
139
	 * Nombre d'obs sans identification (ou tag ou certitude)
140
	 */
141
	private function getNbObsSansIdentOuTC($mpm=false) {
142
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation WHERE";
143
		if ($this->annee != null) {
144
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
145
		}
146
		$requete .= " (`mots_cles_texte` LIKE '%determiner%' OR `nom_sel_nn` = '' OR certitude IN ('aDeterminer','douteux'))";
147
		if ($mpm) {
148
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
149
		}
1818 jpm 150
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 151
		return intval(array_pop($resultat[0]));
1818 jpm 152
	}
153
 
2016 mathias 154
	/**
155
	 * Nombre d'obs sans identification
156
	 */
157
	private function getNbObsSansIdent($mpm=false) {
158
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation WHERE";
159
		if ($this->annee != null) {
160
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
161
		}
162
		$requete .= " nom_sel_nn = ''";
163
		if ($mpm) {
164
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
165
		}
166
		$resultat = $this->bdd->recupererTous($requete);
167
		return intval(array_pop($resultat[0]));
1818 jpm 168
	}
169
 
2016 mathias 170
	/**
171
	 * Nombre d'obs avec tag à déterminer ou certitude incertaine
172
	 */
173
	private function getNbObsTC($mpm=false) {
174
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation WHERE";
175
		if ($this->annee != null) {
176
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
177
		}
178
		$requete .= " (mots_cles_texte LIKE '%determiner%' OR certitude IN ('aDeterminer','douteux'))";
179
		if ($mpm) {
180
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
181
		}
1818 jpm 182
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 183
		return intval(array_pop($resultat[0]));
1818 jpm 184
	}
185
 
2016 mathias 186
	/**
187
	 * Nombre d'obs avec tag à déterminer ou certitude incertaine et retenue
188
	 */
189
	private function getNbObsTCRetenue($mpm=false) {
190
		$requete = "SELECT COUNT(*) AS nb_total FROM del_commentaire WHERE proposition_retenue = 1 AND ce_observation IN (SELECT id_observation FROM del_observation WHERE";
191
		if ($this->annee != null) {
192
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
193
		}
194
		$requete .= " (certitude IN ('aDeterminer','douteux')))";
195
		if ($mpm) {
2017 mathias 196
			// @TODO vérifier que grouper sur "date" est pertinent
197
			// date_transmission n'est pas dispo pour grouper ici :-/
198
			$requete = $this->encapsulerMPM($requete);
2016 mathias 199
		}
1818 jpm 200
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 201
		return intval(array_pop($resultat[0]));
1818 jpm 202
	}
203
 
2016 mathias 204
	/**
205
	 * Nombre d'obs avec tag à déterminer ou certitude incertaine et avec consensus
206
	 */
207
	private function getNbObsTCConsensus($mpm=false) {
208
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation WHERE";
1818 jpm 209
		if ($this->annee != null) {
2016 mathias 210
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
1818 jpm 211
		}
2016 mathias 212
		$requete .= " (mots_cles_texte LIKE '%determiner%' OR certitude IN ('aDeterminer','douteux')) AND id_observation IN"
213
			. " (SELECT ce_observation FROM del_commentaire WHERE proposition_initiale = 1"
214
			. " AND nom_sel_nn != 0"
215
			. " AND nom_sel_nn IS NOT NULL"
216
			. " AND id_commentaire IN (SELECT ce_proposition FROM del_commentaire_vote dcv";
217
		if ($this->annee != null) {
218
			$requete .= ' WHERE YEAR(date) <= ' . $this->annee;
219
		}
220
		$requete .= " GROUP BY ce_proposition HAVING SUM(CASE"
221
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
222
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
223
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
224
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
225
		. " END) >= 4))";
226
		if ($mpm) {
227
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
228
		}
1818 jpm 229
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 230
		return intval(array_pop($resultat[0]));
1818 jpm 231
	}
232
 
2016 mathias 233
	/**
234
	 * Nombre d'obs avec tag à déterminer ou certitude incertaine et avec consensus mais non validées
235
	 */
236
	private function getNbObsTCConsensusNonValide($mpm=false) {
237
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation WHERE";
238
		if ($this->annee != null) {
239
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
240
		}
241
		$requete .= " (mots_cles_texte LIKE '%determiner%' OR certitude IN ('aDeterminer','douteux')) AND id_observation IN"
242
			. " (SELECT ce_observation FROM del_commentaire WHERE proposition_initiale = 1 AND proposition_retenue = 0"
243
			. " AND nom_sel_nn != 0"
244
			. " AND nom_sel_nn IS NOT NULL"
245
			. " AND id_commentaire IN (SELECT ce_proposition FROM del_commentaire_vote dcv";
246
		if ($this->annee != null) {
247
			$requete .= ' WHERE YEAR(date) <= ' . $this->annee;
248
		}
249
		$requete .= " GROUP BY ce_proposition HAVING SUM(CASE"
250
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
251
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
252
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
253
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
254
		. " END) >= 4))";
255
		if ($mpm) {
256
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
257
		}
1818 jpm 258
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 259
		return intval(array_pop($resultat[0]));
1818 jpm 260
	}
2011 mathias 261
 
262
	/**
2013 mathias 263
	 * Statistiques sur les propositions, les commentaires et les votes
264
	 * "MPM" = moyenne par mois
265
	 * - Nombre de votes
266
	 * - Nombre de commentaires
267
	 * - Nombre d'actions par jour
268
	 * - Nombres de propositions sur toutes les obs
269
	 * - Nombres de propositions retenues sur toutes les obs
270
	 * - Nombres de propositions en consensus sur toutes les obs
271
	 * - Nombres de propositions sur les obs d'une année
272
	 * - Nombres de propositions retenues sur les obs d'une année
273
	 * - Nombres de propositions en consensus sur les obs d'une année
2011 mathias 274
	 */
275
	private function getPropositions() {
276
		return array(
2013 mathias 277
			'nbVotes' => $this->getNbVotes(),
278
			'nbVotesMPM' => $this->getNbVotes(true),
279
			'nbMoyenActionsParJour' => $this->getNbMoyenActionsParJour(),
280
			'nbCommentaires' => $this->getNbCommentaires(),
281
			'nbCommentairesMPM' => $this->getNbCommentaires(true),
282
			'nbPropositionsToutesObs' => $this->getNbPropositionsToutesObs(),
283
			'nbPropositionsToutesObsMPM' => $this->getNbPropositionsToutesObs(true),
284
			'nbPropositionsRetenuesToutesObs' => $this->getNbPropositionsRetenuesToutesObs(),
285
			'nbPropositionsRetenuesToutesObsMPM' => $this->getNbPropositionsRetenuesToutesObs(true),
2016 mathias 286
			'nbPropositionsConsensusToutesObs' => $this->getNbPropositionsConsensusToutesObs(),
287
			'nbPropositionsConsensusToutesObsMPM' => $this->getNbPropositionsConsensusToutesObs(true),
2013 mathias 288
			'nbPropositionsObsAnnee' => $this->getNbPropositionsObsAnnee(),
289
			'nbPropositionsObsAnneeMPM' => $this->getNbPropositionsObsAnnee(true),
290
			'nbPropositionsRetenuesObsAnnee' => $this->getNbPropositionsRetenuesObsAnnee(),
291
			'nbPropositionsRetenuesObsAnneeMPM' => $this->getNbPropositionsRetenuesObsAnnee(true),
2016 mathias 292
			'nbPropositionsConsensusObsAnnee' => $this->getNbPropositionsConsensusObsAnnee(),
293
			'nbPropositionsConsensusObsAnneeMPM' => $this->getNbPropositionsConsensusObsAnnee(true),
2011 mathias 294
		);
295
	}
296
 
297
	/**
2013 mathias 298
	 * Nombre moyen d'actions par jour (commentaire, proposition, vote)
2011 mathias 299
	 */
2013 mathias 300
	private function getNbMoyenActionsParJour() {
301
		$requete = "SELECT (SELECT (SELECT count(*) FROM del_commentaire";
302
		if ($this->annee != null) {
303
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
304
		}
305
		$requete .= ") +  (SELECT count(*) FROM del_commentaire_vote";
306
		if ($this->annee != null) {
307
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
308
		}
309
		$requete .= ") +  (SELECT count(*) FROM del_commentaire";
310
		if ($this->annee != null) {
311
			$requete .= ' WHERE YEAR(date_validation) = ' . $this->annee;
312
		}
313
		$requete .= ")) / (";
314
		if ($this->annee != null) {
315
			$requete .= "SELECT IF( YEAR(CURDATE()) = " . $this->annee . ", DAYOFYEAR(CURDATE()), 365) ";
316
		} else {
317
			$requete .= "365";
318
		}
319
		$requete .= ")";
2011 mathias 320
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 321
		return intval(array_pop($resultat[0]));
2011 mathias 322
	}
323
 
324
	/**
2013 mathias 325
	 * Nombre de proposition faites sur toutes les observations
2011 mathias 326
	 */
2013 mathias 327
	private function getNbPropositionsToutesObs($mpm=false) {
328
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE";
329
		if ($this->annee != null) {
330
			$requete .= ' YEAR(date) = ' . $this->annee . " AND";
331
		}
332
		$requete .= " (`nom_sel_nn` IS NOT NULL OR `nom_sel_nn` != '') AND `proposition_initiale` = 0";
333
		if ($mpm) {
334
			$requete = $this->encapsulerMPM($requete);
335
		}
336
		$resultat = $this->bdd->recupererTous($requete);
337
		return intval(array_pop($resultat[0]));
338
	}
339
 
340
	/**
341
	 * Nombre de proposition retenues faites sur toutes les observations
342
	 */
343
	private function getNbPropositionsRetenuesToutesObs($mpm=false) {
344
		$requete = "SELECT COUNT(DISTINCT id_commentaire) AS nb_total FROM del_commentaire WHERE";
345
		if ($this->annee != null) {
346
			$requete .= ' YEAR(date) = ' . $this->annee . " AND";
347
		}
348
		$requete .= " proposition_retenue = 1";
349
		if ($mpm) {
350
			$requete = $this->encapsulerMPM($requete);
351
		}
352
		$resultat = $this->bdd->recupererTous($requete);
353
		return intval(array_pop($resultat[0]));
354
	}
355
 
356
	/**
2016 mathias 357
	 * Nombre de proposition en consensus faites sur toutes les observations
2013 mathias 358
	 */
359
	private function getNbPropositionsConsensusToutesObs($mpm=false) {
2016 mathias 360
		$requete = "SELECT COUNT(DISTINCT ce_observation) AS nb_total FROM del_commentaire dc WHERE"
361
			. " dc.proposition_retenue = 1"
362
			. " OR (dc.proposition_initiale = 1"
363
			. " AND dc.nom_sel_nn != 0"
364
			. " AND dc.nom_sel_nn IS NOT NULL"
365
			. " AND dc.id_commentaire IN"
366
				. " (SELECT ce_proposition FROM del_commentaire_vote dcv WHERE";
367
				if ($this->annee != null) {
368
					$requete .= " year(date) < " . $this->annee . " AND";
369
				}
370
				$requete .= " ce_proposition NOT IN (SELECT ce_proposition FROM del_commentaire_vote dcv";
371
				if ($this->annee != null) {
372
					$requete .= " WHERE year(date) < " . ($this->annee - 1);
373
				}
374
				$requete .= " GROUP BY ce_proposition"
375
					. " HAVING SUM(CASE"
376
						. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
377
						. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
378
						. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
379
						. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
380
					. " END) >= 4)"
381
				. " GROUP BY ce_proposition"
382
				. " HAVING SUM(CASE"
383
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
384
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
385
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
386
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
387
				. " END) >= 4"
388
			. " )"
389
		. " )";
390
		if ($mpm) {
391
			$requete = $this->encapsulerMPM($requete);
392
		}
2011 mathias 393
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 394
		return intval(array_pop($resultat[0]));
2011 mathias 395
	}
396
 
397
	/**
2013 mathias 398
	 * Nombre de proposition faites sur les observations d'une année
2011 mathias 399
	 */
2013 mathias 400
	private function getNbPropositionsObsAnnee($mpm=false) {
401
		if ($this->annee == null) {
402
			return null;
403
		}
404
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE YEAR(date) = " . $this->annee . " AND "
405
			. "(`nom_sel_nn` IS NOT NULL OR `nom_sel_nn` != '') AND `proposition_initiale` = 0 AND ce_observation in"
406
			. " (SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ")";
407
		if ($mpm) {
408
			$requete = $this->encapsulerMPM($requete);
409
		}
410
		$resultat = $this->bdd->recupererTous($requete);
411
		return intval(array_pop($resultat[0]));
412
	}
413
 
414
	/**
415
	 * Nombre de proposition retenues faites sur les observations d'une année
416
	 */
417
	private function getNbPropositionsRetenuesObsAnnee($mpm=false) {
418
		if ($this->annee == null) {
419
			return null;
420
		}
421
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE YEAR(date) = " . $this->annee . " AND "
422
			. "`proposition_retenue` = 1 AND ce_observation in (SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ")";
423
		if ($mpm) {
424
			$requete = $this->encapsulerMPM($requete);
425
		}
426
		$resultat = $this->bdd->recupererTous($requete);
427
		return intval(array_pop($resultat[0]));
428
	}
429
 
430
	/**
2016 mathias 431
	 * Nombre de proposition en consensus faites sur les observations d'une année
2013 mathias 432
	 */
433
	private function getNbPropositionsConsensusObsAnnee($mpm=false) {
2016 mathias 434
		if ($this->annee == null) {
435
			return null;
436
		}
437
		$requete = "SELECT COUNT(DISTINCT ce_observation) AS nb_total FROM del_commentaire dc WHERE ce_observation in ("
438
			. " SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ") AND ("
439
			. " dc.proposition_retenue = 1 OR (dc.proposition_initiale = 1"
440
			. " AND dc.nom_sel_nn != 0 AND dc.nom_sel_nn IS NOT NULL AND dc.id_commentaire IN"
441
				. " (SELECT ce_proposition FROM del_commentaire_vote dcv"
442
				. " WHERE year(date) <= " . $this->annee
443
				. " GROUP BY ce_proposition"
444
				. " HAVING SUM(CASE"
445
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
446
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
447
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
448
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
449
				. " END) >= 4)"
450
			. "))";
451
		if ($mpm) {
452
			$requete = $this->encapsulerMPM($requete);
453
		}
2011 mathias 454
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 455
		return intval(array_pop($resultat[0]));
2011 mathias 456
	}
457
 
458
	/**
2013 mathias 459
	 * Nombre de votes
460
	 */
461
	private function getNbVotes($mpm=false) {
462
		$requete = "SELECT COUNT(DISTINCT `id_vote`) AS nb_total FROM del_commentaire_vote";
463
		if ($this->annee != null) {
464
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
465
		}
466
		if ($mpm) {
467
			$requete = $this->encapsulerMPM($requete);
468
		}
469
		$resultat = $this->bdd->recupererTous($requete);
470
		return intval(array_pop($resultat[0]));
471
	}
472
 
473
	/**
474
	 * Nombre de commentaires
475
	 */
476
	private function getNbCommentaires($mpm=false) {
477
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM del_commentaire WHERE `ce_proposition` != '' AND (`nom_sel` IS NULL OR `nom_sel` = '')";
478
		if ($this->annee != null) {
479
			$requete .= ' AND YEAR(date) = ' . $this->annee;
480
		}
481
		if ($mpm) {
482
			$requete = $this->encapsulerMPM($requete);
483
		}
484
		$resultat = $this->bdd->recupererTous($requete);
485
		return intval(array_pop($resultat[0]));
486
	}
487
 
488
	/**
2011 mathias 489
	 * Statistiques sur les utilisateurs d'Identiplante
2013 mathias 490
	 * "AF" = ayant fait un(e)
491
	 * "MPM" = moyenne par mois
2011 mathias 492
	 * - Nombre total d'utilisateurs
2013 mathias 493
	 * - Nombre d'utilisateurs ayant fait une proposition
2016 mathias 494
	 * - Nombre d'utilisateurs identifiés ayant fait un vote
495
	 * - Nombre d'utilisateurs anonymes ayant fait un vote
2013 mathias 496
	 * - Nombre d'utilisateurs ayant fait un commentaire
2016 mathias 497
	 * - Nombre d'utilisateurs ayant fait une action
2011 mathias 498
	 */
499
	private function getUtilisateursIp() {
500
		return array(
501
			'nbUtilisateursTotal' => $this->getNbUtilisateursIpTotal(),
2013 mathias 502
			'nbUtilisateursAFProposition' => $this->getNbUtilisateursAFProposition(),
503
			'nbUtilisateursAFCommentaire' => $this->getNbUtilisateursAFCommentaire(),
504
			'nbUtilisateursAFVote' => $this->getNbUtilisateursAFVote(),
505
			'nbUtilisateursAnonymesAFVote' => $this->getNbUtilisateursAnonymesAFVote(),
2016 mathias 506
			'nbUtilisateursAFAction' => $this->getNbUtilisateursAFAction(),
2013 mathias 507
			'nbUtilisateursAFPropositionMPM' => $this->getNbUtilisateursAFProposition(true),
508
			'nbUtilisateursAFCommentaireMPM' => $this->getNbUtilisateursAFCommentaire(true),
509
			'nbUtilisateursAFVoteMPM' => $this->getNbUtilisateursAFVote(true),
510
			'nbUtilisateursAnonymesAFVoteMPM' => $this->getNbUtilisateursAnonymesAFVote(true),
2016 mathias 511
			'nbUtilisateursAFActionMPM' => $this->getNbUtilisateursAFActionMPM()
2011 mathias 512
		);
513
	}
514
 
515
	/**
2013 mathias 516
	 * Nombre total d'utilisateurs d'Identiplante
2011 mathias 517
	 */
518
	private function getNbUtilisateursIpTotal() {
2013 mathias 519
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total  FROM del_commentaire";
520
		if ($this->annee != null) {
521
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
522
		}
2011 mathias 523
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 524
		return intval(array_pop($resultat[0]));
2011 mathias 525
	}
526
 
527
	/**
2013 mathias 528
	 * Nombre d'utilisateurs d'Identiplante ayant fait au moins une proposition
2011 mathias 529
	 */
2013 mathias 530
	private function getNbUtilisateursAFProposition($mpm=false) {
531
		$requete = "SELECT COUNT(DISTINCT `utilisateur_courriel`) AS nb_total FROM del_commentaire WHERE `ce_proposition` = '' AND `nom_sel` IS NOT NULL AND `nom_sel` != ''";
532
		if ($this->annee != null) {
533
			$requete .= ' AND YEAR(date) = ' . $this->annee;
534
		}
535
		if ($mpm) {
536
			$requete = $this->encapsulerMPM($requete);
537
		}
2011 mathias 538
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 539
		return intval(array_pop($resultat[0]));
2011 mathias 540
	}
541
 
542
	/**
2013 mathias 543
	 * Nombre d'utilisateurs d'Identiplante ayant fait au moins un commentaire
2011 mathias 544
	 */
2013 mathias 545
	private function getNbUtilisateursAFCommentaire($mpm=false) {
546
		$requete = "SELECT COUNT(DISTINCT `utilisateur_courriel`) AS nb_total FROM del_commentaire WHERE `ce_proposition` != '' AND (`nom_sel` IS NULL OR `nom_sel` = '')";
547
		if ($this->annee != null) {
548
			$requete .= ' AND YEAR(date) = ' . $this->annee;
549
		}
550
		if ($mpm) {
551
			$requete = $this->encapsulerMPM($requete);
552
		}
2011 mathias 553
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 554
		return intval(array_pop($resultat[0]));
2011 mathias 555
	}
556
 
557
	/**
2013 mathias 558
	 * Nombre d'utilisateurs d'Identiplante identifiés prenant part aux votes
2011 mathias 559
	 */
2013 mathias 560
	private function getNbUtilisateursAFVote($mpm=false) {
561
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_commentaire_vote WHERE ce_utilisateur REGEXP '^-?[0-9]+$'";
562
		if ($this->annee != null) {
563
			$requete .= ' AND YEAR(date) = ' . $this->annee;
564
		}
565
		if ($mpm) {
566
			$requete = $this->encapsulerMPM($requete);
567
		}
2011 mathias 568
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 569
		return intval(array_pop($resultat[0]));
2011 mathias 570
	}
571
 
572
	/**
2013 mathias 573
	 * Nombre d'utilisateurs d'Identiplante anonymes prenant part aux votes
2011 mathias 574
	 */
2013 mathias 575
	private function getNbUtilisateursAnonymesAFVote($mpm=false) {
576
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_commentaire_vote WHERE ce_utilisateur NOT REGEXP '^-?[0-9]+$'";
577
		if ($this->annee != null) {
578
			$requete .= ' AND YEAR(date) = ' . $this->annee;
579
		}
580
		if ($mpm) {
581
			$requete = $this->encapsulerMPM($requete);
582
		}
583
		$resultat = $this->bdd->recupererTous($requete);
584
		return intval(array_pop($resultat[0]));
585
	}
586
 
587
	/**
2016 mathias 588
	 * Nombre d'utilisateurs d'Identiplante ayant fait une action (commentaire, vote, proposition)
589
	 */
590
	private function getNbUtilisateursAFAction() {
591
		$requete = "SELECT COUNT(*) AS nb_total FROM (SELECT ce_utilisateur FROM del_commentaire_vote";
592
		if ($this->annee != null) {
593
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
594
		}
595
		$requete .= " UNION SELECT ce_utilisateur FROM del_commentaire";
596
		if ($this->annee != null) {
597
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
598
		}
599
		$requete .= " ) AS action";
600
		$resultat = $this->bdd->recupererTous($requete);
601
		return intval(array_pop($resultat[0]));
602
	}
603
 
604
	/**
605
	 * Moyenne par mois du nombre d'utilisateurs d'Identiplante ayant fait une action
606
	 * (commentaire, vote, proposition) -> n'est pas encapsulable par encapsulerMPM()
607
	 */
608
	private function getNbUtilisateursAFActionMPM() {
609
		$requete = "SELECT avg(nb_total) FROM (SELECT count(*) as nb_total FROM"
610
			. " (SELECT * FROM (SELECT ce_utilisateur, date FROM del_commentaire_vote";
611
		if ($this->annee != null) {
612
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
613
		}
614
		$requete .= " UNION SELECT ce_utilisateur, date FROM del_commentaire";
615
		if ($this->annee != null) {
616
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
617
		}
618
		$requete .= " ) AS action GROUP BY ce_utilisateur) AS utildate GROUP BY CONCAT(year(date),month(date))) as truc";
619
		$resultat = $this->bdd->recupererTous($requete);
620
		return intval(array_pop($resultat[0]));
621
	}
622
 
623
	/**
2013 mathias 624
	 * Liste des utilisateurs dont les propositions ont été votées positivement
625
	 */
2011 mathias 626
	private function getListeMeilleursProposeurs() {
627
		$liste = array();
2013 mathias 628
		$requete = "SELECT * FROM (SELECT utilisateur_courriel, count(prop) as nb_prop"
629
			. " FROM (SELECT `ce_proposition` as prop, COUNT(DISTINCT `id_vote`) AS nb_vote FROM del_commentaire_vote where";
630
		if ($this->annee != null) {
631
			$requete .= " year(`date`) = " . $this->annee . " AND";
632
		}
633
		$requete .= " valeur = 1 GROUP BY `ce_proposition`) AS vote, del_commentaire WHERE nb_vote > 3 AND prop = id_commentaire AND `ce_utilisateur` != 0 GROUP BY `ce_utilisateur`)"
634
			. " AS utlisateurs WHERE nb_prop > 10 ORDER BY nb_prop  DESC LIMIT 20";
2011 mathias 635
		$resultat = $this->bdd->recupererTous($requete);
636
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
637
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
638
		// ...
639
 
640
		return array(
2013 mathias 641
				'liste' => $resultat
2011 mathias 642
		);
643
	}
644
 
645
	/**
2013 mathias 646
	 * Liste des utilisateurs ayant fait le plus de votes positifs
647
	 * @TODO et le plus de votes sur des propositions retenues (ou ayant atteint un consensus)
2011 mathias 648
	 */
649
	private function getListeMeilleursVoteurs() {
650
		$liste = array();
2013 mathias 651
		$requete = "SELECT * FROM (SELECT courriel, COUNT(DISTINCT `id_vote`) AS nombre FROM del_commentaire_vote, del_utilisateur where";
652
		if ($this->annee != null) {
653
			$requete .= " year(`date`) = " . $this->annee . " AND";
654
		}
655
		$requete .= " ce_utilisateur = id_utilisateur AND valeur = 1 GROUP BY `ce_utilisateur`) AS utilisateurs WHERE nombre > 100 ORDER BY nombre DESC LIMIT 20";
2011 mathias 656
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 657
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
2011 mathias 658
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
659
		// ...
660
 
661
		return array(
2013 mathias 662
				'liste' => $resultat
2011 mathias 663
		);
664
	}
665
 
666
	/**
2013 mathias 667
	 * Liste des utilisateurs ayant fait au moins une proposition par mois toute l'année
668
	 */
669
	private function getListeProposeursReguliers() {
670
		$liste = array();
671
		$requete = "SELECT cal.nbmois, SUM(somme) / cal.nbmois as moyenne, ce_utilisateur, utilisateur_courriel FROM (SELECT count(*) as somme,"
672
			. " CONCAT(YEAR(date),'-',MONTH(date)) as anneemois, ce_utilisateur, utilisateur_courriel, id_commentaire FROM del_commentaire"
673
			. " WHERE ce_proposition = '' AND nom_sel_nn != '' AND nom_sel_nn IS NOT NULL";
674
		if ($this->annee != null) {
675
			$requete .= " AND year(`date`) = " . $this->annee;
676
		}
677
		$requete .= "  GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) as ppm, (SELECT count(distinct CONCAT(YEAR(date),'-',MONTH(date))) as nbmois FROM del_commentaire WHERE";
678
		if ($this->annee != null) {
679
			$requete .= " year(`date`) = " . $this->annee . " AND";
680
		}
681
		$requete .= " ce_proposition = '' AND nom_sel_nn != '' AND nom_sel_nn IS NOT NULL) as cal GROUP BY ce_utilisateur, utilisateur_courriel HAVING SUM(somme) / cal.nbmois >= 1"
682
			. " ORDER BY moyenne DESC"; // @ TODO limite ?
683
		$resultat = $this->bdd->recupererTous($requete);
684
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
685
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
686
		// ...
687
 
688
		return array(
689
			'liste' => $resultat
690
		);
691
	}
692
 
693
	/**
2017 mathias 694
	 * Statistiques sur Sauvages de ma Rue (Sdmr)
695
	 * "MPM" = moyenne par mois
696
	 * - Nombre total d'observations sdmr
697
	 * - Nombre d'observations Sauvages de PACA
2011 mathias 698
	 */
2017 mathias 699
	private function getSdmr() {
700
		return array(
701
			'nbObsSdmrTotal' => $this->getNbObsSdmrTotal(),
702
			'nbObsSdmrTotalMPM' => $this->getNbObsSdmrTotal(true),
703
			'nbObsSdmrPACA' => $this->getNbObsSdmrPACA(),
704
			'nbObsSdmrPACAMPM' => $this->getNbObsSdmrPACA(true)
705
		);
706
	}
707
 
708
	/**
709
	 * Nombre total d'observations Sauvages de ma Rue
710
	 */
711
	private function getNbObsSdmrTotal($mpm=false) {
712
		$requete = "SELECT COUNT(DISTINCT ce_observation) as nb_total FROM del_commentaire WHERE";
713
		if ($this->annee != null) {
714
			$requete .= ' YEAR(date) <= ' . $this->annee . ' AND';
715
		}
716
		$requete .= " ce_observation in (SELECT id_observation FROM del_observation WHERE mots_cles_texte like '%sauvages%')";
717
		if ($mpm) {
718
			$requete = $this->encapsulerMPM($requete);
719
		}
720
		$resultat = $this->bdd->recupererTous($requete);
721
		return intval(array_pop($resultat[0]));
722
	}
723
 
724
	/**
725
	 * Nombre total d'observations Sauvages de ma Rue en PACA
726
	 */
727
	private function getNbObsSdmrPACA($mpm=false) {
728
		$requete = "SELECT COUNT(DISTINCT ce_observation) as nb_total FROM del_commentaire WHERE";
729
		if ($this->annee != null) {
730
			$requete .= ' YEAR(date) <= ' . $this->annee . ' AND';
731
		}
732
		$requete .= " ce_observation in (SELECT id_observation FROM del_observation"
733
			. " WHERE SUBSTR(ce_zone_geo, 9 , 2) IN (13,04,05,06,83,84) AND mots_cles_texte like '%sauvages%')";
734
		if ($mpm) {
735
			$requete = $this->encapsulerMPM($requete);
736
		}
737
		$resultat = $this->bdd->recupererTous($requete);
738
		return intval(array_pop($resultat[0]));
739
	}
740
 
741
	/**
742
	 * Statistiques sur les images de Pictoflora
743
	 * "MPM" = Moyenne par mois
744
	 *  - Nombre total d'images
745
	 *  - Nombre d'images ayant au moins un mot-clé
746
	 *  - Nombre d'images ayant au moins un vote
747
	 *  - Nombre d'images de l'année ayant au moins un mot-clé
748
	 *  - Nombre d'images de l'année ayant au moins un vote
749
	 */
2011 mathias 750
	private function getImages() {
751
		return array(
2017 mathias 752
			'nbImagesTotal' => $this->getNbImagesTotal(),
753
			'nbImagesTotalMPM' => $this->getNbImagesTotal(true),
754
			'nbImagesAyantTag' => $this->getNbImagesAyantTag(),
755
			'nbImagesAyantTagMPM' => $this->getNbImagesAyantTag(true),
756
			'nbImagesAyantVote' => $this->getNbImagesAyantVote(),
757
			'nbImagesAyantVoteMPM' => $this->getNbImagesAyantVote(true),
758
			'nbImagesAnneeAyantTag' => $this->getNbImagesAnneeAyantTag(),
759
			'nbImagesAnneeAyantTagMPM' => $this->getNbImagesAnneeAyantTag(true),
760
			'nbImagesAnneeAyantVote' => $this->getNbImagesAnneeAyantVote(),
761
			'nbImagesAnneeAyantVoteMPM' => $this->getNbImagesAnneeAyantVote(true),
2011 mathias 762
		);
763
	}
764
 
765
	/**
2017 mathias 766
	 * Nombre total d'images Pictoflora
2011 mathias 767
	 */
2017 mathias 768
	private function getNbImagesTotal($mpm=false) {
769
		$requete = "SELECT COUNT(*) AS nb_total FROM del_image";
770
		if ($this->annee != null) {
771
			$requete .= ' WHERE YEAR(date_transmission) = ' . $this->annee;
772
		}
773
		if ($mpm) {
774
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
775
		}
776
		$resultat = $this->bdd->recupererTous($requete);
777
		return intval(array_pop($resultat[0]));
778
	}
779
 
780
	/**
781
	 * Nombre total d'images Pictoflora ayant au moins un mot-clé
782
	 */
783
	private function getNbImagesAyantTag($mpm=false) {
784
		$requete = "SELECT COUNT(DISTINCT ce_image) AS nb_total FROM del_image_tag";
785
		if ($this->annee != null) {
786
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
787
		}
788
		if ($mpm) {
789
			$requete = $this->encapsulerMPM($requete);
790
		}
791
		$resultat = $this->bdd->recupererTous($requete);
792
		return intval(array_pop($resultat[0]));
793
	}
794
 
795
	/**
796
	 * Nombre total d'images Pictoflora ayant au moins un vote
797
	 */
798
	private function getNbImagesAyantVote($mpm=false) {
799
		$requete = "SELECT COUNT(DISTINCT ce_image) AS nb_total FROM del_image_vote";
800
		if ($this->annee != null) {
801
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
802
		}
803
		if ($mpm) {
804
			$requete = $this->encapsulerMPM($requete);
805
		}
806
		$resultat = $this->bdd->recupererTous($requete);
807
		return intval(array_pop($resultat[0]));
808
	}
809
 
810
	/**
811
	 * Nombre total d'images Pictoflora de l'année ayant au moins un mot-clé
812
	 */
813
	private function getNbImagesAnneeAyantTag($mpm=false) {
814
		if ($this->annee == null) {
815
			return null;
816
		}
817
		$requete = "SELECT COUNT(DISTINCT ce_image) AS nb_total FROM del_image_tag WHERE YEAR(date) = " . $this->annee
818
			. " AND ce_image IN (SELECT id_image FROM del_image WHERE year(date_transmission) = " . $this->annee . ")";
819
		if ($mpm) {
820
			$requete = $this->encapsulerMPM($requete);
821
		}
822
		$resultat = $this->bdd->recupererTous($requete);
823
		return intval(array_pop($resultat[0]));
824
	}
825
 
826
	/**
827
	 * Nombre total d'images Pictoflora de l'année ayant au moins un vote
828
	 */
829
	private function getNbImagesAnneeAyantVote($mpm=false) {
830
		if ($this->annee == null) {
831
			return null;
832
		}
833
		$requete = "SELECT COUNT(DISTINCT ce_image) AS nb_total FROM del_image_vote WHERE YEAR(date) = " . $this->annee
834
			. " AND ce_image IN (SELECT id_image FROM del_image WHERE year(date_transmission) = " . $this->annee . ")";
835
		if ($mpm) {
836
			$requete = $this->encapsulerMPM($requete);
837
		}
838
		$resultat = $this->bdd->recupererTous($requete);
839
		return intval(array_pop($resultat[0]));
840
	}
841
 
842
	/**
843
	 * Statistiques sur les votes et mots-clés (tags) de Pictoflora
844
	 * "MPM" = moyenne par mois
845
	 * - Nombre total de votes
846
	 * - Nombre total de mots clés
847
	 * - Nombre d'images ayant le mot-clé "defiPhoto"
848
	 */
849
	private function getTagsVotes() {
2011 mathias 850
		return array(
2017 mathias 851
			'nbTagsTotal' => $this->getNbTagsTotal(),
852
			'nbTagsTotalMPM' => $this->getNbTagsTotal(true),
853
			'nbVotesTotal' => $this->getNbVotesTotal(),
854
			'nbVotesTotalMPM' => $this->getNbVotesTotal(true),
855
			// devra être paramétré par une liste de mots-clés
856
			//'nbImagesTagDP' => $this->getNbImagesTagDP(),
857
			//'nbImagesTagDPMPM' => $this->getNbImagesTagDP(true)
2011 mathias 858
		);
859
	}
860
 
861
	/**
2017 mathias 862
	 * Nombre total de mots clés Pictoflora
2011 mathias 863
	 */
2017 mathias 864
	private function getNbTagsTotal($mpm=false) {
865
		$requete = "SELECT COUNT(*) AS nb_total FROM del_image_tag";
866
		if ($this->annee != null) {
867
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
868
		}
869
		if ($mpm) {
870
			$requete = $this->encapsulerMPM($requete);
871
		}
872
		$resultat = $this->bdd->recupererTous($requete);
873
		return intval(array_pop($resultat[0]));
874
	}
875
 
876
	/**
877
	 * Nombre total de votes Pictoflora
878
	 */
879
	private function getNbVotesTotal($mpm=false) {
880
		$requete = "SELECT COUNT(*) AS nb_total FROM del_image_vote";
881
		if ($this->annee != null) {
882
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
883
		}
884
		if ($mpm) {
885
			$requete = $this->encapsulerMPM($requete);
886
		}
887
		$resultat = $this->bdd->recupererTous($requete);
888
		return intval(array_pop($resultat[0]));
889
	}
890
 
891
	/**
892
	 * Statistiques sur les utilisateurs de Pictoflora
893
	 * "MPM" = Moyenne par mois
894
	 * "AF" = Ayant fait
895
	 * - Nombre d'utilisateurs ayant ajouté un mot-clé
896
	 * - Nombre d'utilisateurs ayant voté
897
	 * - Nombre d'utilisateurs ayant fait une action
898
	 */
2011 mathias 899
	private function getUtilisateursPf() {
900
		return array(
2017 mathias 901
			'nbUtilisateursAFTag' => $this->getNbUtilisateursPfAFTag(),
902
			'nbUtilisateursAFTagMPM' => $this->getNbUtilisateursPfAFTag(true),
903
			'nbUtilisateursAFVote' => $this->getNbUtilisateursPfAFVote(),
904
			'nbUtilisateursAFVoteMPM' => $this->getNbUtilisateursPfAFVote(true),
905
			'nbUtilisateursAFAction' => $this->getNbUtilisateursPfAFAction(),
906
			'nbUtilisateursAFActionMPM' => $this->getNbUtilisateursPfAFActionMPM()
2011 mathias 907
		);
908
	}
909
 
910
	/**
2017 mathias 911
	 * Nombre d'utilisateurs ayant ajouté un mot-clé
2011 mathias 912
	 */
2017 mathias 913
	private function getNbUtilisateursPfAFTag($mpm=false) {
914
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_image_tag";
915
		if ($this->annee != null) {
916
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
917
		}
918
		if ($mpm) {
919
			$requete = $this->encapsulerMPM($requete);
920
		}
2011 mathias 921
		$resultat = $this->bdd->recupererTous($requete);
2017 mathias 922
		return intval(array_pop($resultat[0]));
2011 mathias 923
	}
924
 
925
	/**
2017 mathias 926
	 * Nombre d'utilisateurs ayant fait un vote
2011 mathias 927
	 */
2017 mathias 928
	private function getNbUtilisateursPfAFVote($mpm=false) {
929
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_image_vote";
930
		if ($this->annee != null) {
931
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
932
		}
933
		if ($mpm) {
934
			$requete = $this->encapsulerMPM($requete);
935
		}
2011 mathias 936
		$resultat = $this->bdd->recupererTous($requete);
2017 mathias 937
		return intval(array_pop($resultat[0]));
2011 mathias 938
	}
939
 
940
	/**
2017 mathias 941
	 * Nombre d'utilisateurs ayant fait une action
2011 mathias 942
	 */
2017 mathias 943
	private function getNbUtilisateursPfAFAction() {
944
		$requete = "SELECT COUNT(*) AS nb_total FROM (SELECT ce_utilisateur FROM del_image_tag";
945
		if ($this->annee != null) {
946
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
947
		}
948
		$requete .= " UNION SELECT ce_utilisateur FROM del_image_vote";
949
		if ($this->annee != null) {
950
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
951
		}
952
		$requete .= ") AS action";
2011 mathias 953
		$resultat = $this->bdd->recupererTous($requete);
2017 mathias 954
		return intval(array_pop($resultat[0]));
2011 mathias 955
	}
956
 
957
	/**
2017 mathias 958
	 * Moyenne par mois du nombre d'utilisateurs ayant fait une action
959
	 * -> n'est pas encapsulable par encapsulerMPM()
2011 mathias 960
	 */
2017 mathias 961
	private function getNbUtilisateursPfAFActionMPM() {
962
		$requete = "SELECT avg(nb_total) FROM (SELECT COUNT(*) AS nb_total FROM (SELECT * FROM (SELECT ce_utilisateur, date FROM del_image_tag";
963
		if ($this->annee != null) {
964
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
965
		}
966
		$requete .= " UNION SELECT ce_utilisateur, date FROM del_image_vote";
967
		if ($this->annee != null) {
968
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
969
		}
970
		$requete .= ") AS action GROUP BY ce_utilisateur) AS utildate GROUP BY CONCAT(year(date),month(date))) as truc";
2011 mathias 971
		$resultat = $this->bdd->recupererTous($requete);
2017 mathias 972
		return intval(array_pop($resultat[0]));
2011 mathias 973
	}
974
 
975
	/**
2017 mathias 976
	 * Liste des mots-clés les plus fréquents
2011 mathias 977
	 */
978
	private function getListeMeilleursTags() {
979
		$liste = array();
2017 mathias 980
		$requete = "SELECT count(*) as occurrences, tag FROM del_image_tag";
981
		if ($this->annee != null) {
982
			$requete .= " WHERE YEAR(date) = " . $this->annee;
983
		}
984
		$requete .= " GROUP BY tag ORDER BY occurrences DESC LIMIT 20";
2011 mathias 985
		$resultat = $this->bdd->recupererTous($requete);
986
		return array(
2017 mathias 987
				'liste' => $resultat
2011 mathias 988
		);
989
	}
990
 
991
	/**
992
	 * @TODO Liste des utilisateurs ayant ajouté le plus de mots-clés
993
	 */
994
	private function getListeMeilleursTagueurs() {
2017 mathias 995
		$resultat = array();
996
		/*$requete = "SELECT * FROM (SELECT utilisateur_courriel, count(prop) as nb_prop"
997
			. " FROM (SELECT `ce_proposition` as prop, COUNT(DISTINCT `id_vote`) AS nb_vote FROM del_commentaire_vote where";
998
		if ($this->annee != null) {
999
			$requete .= " year(`date`) = " . $this->annee . " AND";
1000
		}
1001
		$requete .= " valeur = 1 GROUP BY `ce_proposition`) AS vote, del_commentaire WHERE nb_vote > 3 AND prop = id_commentaire AND `ce_utilisateur` != 0 GROUP BY `ce_utilisateur`)"
1002
			. " AS utlisateurs WHERE nb_prop > 10 ORDER BY nb_prop  DESC LIMIT 20";
2011 mathias 1003
		$resultat = $this->bdd->recupererTous($requete);
2017 mathias 1004
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
2011 mathias 1005
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
1006
		// ...
2017 mathias 1007
		 */
2011 mathias 1008
 
1009
		return array(
2017 mathias 1010
				'liste' => $resultat
2011 mathias 1011
		);
1012
	}
2013 mathias 1013
 
1014
	/**
1015
	 * Encapsule une reqûete de comptage dans un autre morceau de requête
1016
	 * afin de calculer la moyenne par mois
1017
	 * @param string $requete count() qui doit renvoyer une colonne 'nb_total'
1018
	 */
2016 mathias 1019
	protected function encapsulerMPM($requete, $colonne="date") {
2013 mathias 1020
		$requeteEncapsulee = "SELECT AVG(nb_total) as moyenne FROM ("
1021
			. $requete
2016 mathias 1022
			. " GROUP BY CONCAT(year($colonne),month($colonne)) ) AS nombre";
2013 mathias 1023
		return $requeteEncapsulee;
1024
	}
1818 jpm 1025
}