Subversion Repositories eFlore/Applications.del

Rev

Rev 2013 | Rev 2017 | 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(),
115
			//'nbObsTCRetenueMPM' => $this->getNbObsTCRetenue(true),
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) {
196
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
197
		}
1818 jpm 198
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 199
		return intval(array_pop($resultat[0]));
1818 jpm 200
	}
201
 
2016 mathias 202
	/**
203
	 * Nombre d'obs avec tag à déterminer ou certitude incertaine et avec consensus
204
	 */
205
	private function getNbObsTCConsensus($mpm=false) {
206
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation WHERE";
1818 jpm 207
		if ($this->annee != null) {
2016 mathias 208
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
1818 jpm 209
		}
2016 mathias 210
		$requete .= " (mots_cles_texte LIKE '%determiner%' OR certitude IN ('aDeterminer','douteux')) AND id_observation IN"
211
			. " (SELECT ce_observation FROM del_commentaire WHERE proposition_initiale = 1"
212
			. " AND nom_sel_nn != 0"
213
			. " AND nom_sel_nn IS NOT NULL"
214
			. " AND id_commentaire IN (SELECT ce_proposition FROM del_commentaire_vote dcv";
215
		if ($this->annee != null) {
216
			$requete .= ' WHERE YEAR(date) <= ' . $this->annee;
217
		}
218
		$requete .= " GROUP BY ce_proposition HAVING SUM(CASE"
219
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
220
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
221
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
222
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
223
		. " END) >= 4))";
224
		if ($mpm) {
225
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
226
		}
1818 jpm 227
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 228
		return intval(array_pop($resultat[0]));
1818 jpm 229
	}
230
 
2016 mathias 231
	/**
232
	 * Nombre d'obs avec tag à déterminer ou certitude incertaine et avec consensus mais non validées
233
	 */
234
	private function getNbObsTCConsensusNonValide($mpm=false) {
235
		$requete = "SELECT COUNT(id_observation) AS nb_total FROM del_observation WHERE";
236
		if ($this->annee != null) {
237
			$requete .= ' YEAR(date_transmission) = ' . $this->annee . " AND";
238
		}
239
		$requete .= " (mots_cles_texte LIKE '%determiner%' OR certitude IN ('aDeterminer','douteux')) AND id_observation IN"
240
			. " (SELECT ce_observation FROM del_commentaire WHERE proposition_initiale = 1 AND proposition_retenue = 0"
241
			. " AND nom_sel_nn != 0"
242
			. " AND nom_sel_nn IS NOT NULL"
243
			. " AND id_commentaire IN (SELECT ce_proposition FROM del_commentaire_vote dcv";
244
		if ($this->annee != null) {
245
			$requete .= ' WHERE YEAR(date) <= ' . $this->annee;
246
		}
247
		$requete .= " GROUP BY ce_proposition HAVING SUM(CASE"
248
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
249
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
250
			. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
251
			. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
252
		. " END) >= 4))";
253
		if ($mpm) {
254
			$requete = $this->encapsulerMPM($requete, 'date_transmission');
255
		}
1818 jpm 256
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 257
		return intval(array_pop($resultat[0]));
1818 jpm 258
	}
2011 mathias 259
 
260
	/**
2013 mathias 261
	 * Statistiques sur les propositions, les commentaires et les votes
262
	 * "MPM" = moyenne par mois
263
	 * - Nombre de votes
264
	 * - Nombre de commentaires
265
	 * - Nombre d'actions par jour
266
	 * - Nombres de propositions sur toutes les obs
267
	 * - Nombres de propositions retenues sur toutes les obs
268
	 * - Nombres de propositions en consensus sur toutes les obs
269
	 * - Nombres de propositions sur les obs d'une année
270
	 * - Nombres de propositions retenues sur les obs d'une année
271
	 * - Nombres de propositions en consensus sur les obs d'une année
2011 mathias 272
	 */
273
	private function getPropositions() {
274
		return array(
2013 mathias 275
			'nbVotes' => $this->getNbVotes(),
276
			'nbVotesMPM' => $this->getNbVotes(true),
277
			'nbMoyenActionsParJour' => $this->getNbMoyenActionsParJour(),
278
			'nbCommentaires' => $this->getNbCommentaires(),
279
			'nbCommentairesMPM' => $this->getNbCommentaires(true),
280
			'nbPropositionsToutesObs' => $this->getNbPropositionsToutesObs(),
281
			'nbPropositionsToutesObsMPM' => $this->getNbPropositionsToutesObs(true),
282
			'nbPropositionsRetenuesToutesObs' => $this->getNbPropositionsRetenuesToutesObs(),
283
			'nbPropositionsRetenuesToutesObsMPM' => $this->getNbPropositionsRetenuesToutesObs(true),
2016 mathias 284
			'nbPropositionsConsensusToutesObs' => $this->getNbPropositionsConsensusToutesObs(),
285
			'nbPropositionsConsensusToutesObsMPM' => $this->getNbPropositionsConsensusToutesObs(true),
2013 mathias 286
			'nbPropositionsObsAnnee' => $this->getNbPropositionsObsAnnee(),
287
			'nbPropositionsObsAnneeMPM' => $this->getNbPropositionsObsAnnee(true),
288
			'nbPropositionsRetenuesObsAnnee' => $this->getNbPropositionsRetenuesObsAnnee(),
289
			'nbPropositionsRetenuesObsAnneeMPM' => $this->getNbPropositionsRetenuesObsAnnee(true),
2016 mathias 290
			'nbPropositionsConsensusObsAnnee' => $this->getNbPropositionsConsensusObsAnnee(),
291
			'nbPropositionsConsensusObsAnneeMPM' => $this->getNbPropositionsConsensusObsAnnee(true),
2011 mathias 292
		);
293
	}
294
 
295
	/**
2013 mathias 296
	 * Nombre moyen d'actions par jour (commentaire, proposition, vote)
2011 mathias 297
	 */
2013 mathias 298
	private function getNbMoyenActionsParJour() {
299
		$requete = "SELECT (SELECT (SELECT count(*) FROM del_commentaire";
300
		if ($this->annee != null) {
301
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
302
		}
303
		$requete .= ") +  (SELECT count(*) FROM del_commentaire_vote";
304
		if ($this->annee != null) {
305
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
306
		}
307
		$requete .= ") +  (SELECT count(*) FROM del_commentaire";
308
		if ($this->annee != null) {
309
			$requete .= ' WHERE YEAR(date_validation) = ' . $this->annee;
310
		}
311
		$requete .= ")) / (";
312
		if ($this->annee != null) {
313
			$requete .= "SELECT IF( YEAR(CURDATE()) = " . $this->annee . ", DAYOFYEAR(CURDATE()), 365) ";
314
		} else {
315
			$requete .= "365";
316
		}
317
		$requete .= ")";
2011 mathias 318
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 319
		return intval(array_pop($resultat[0]));
2011 mathias 320
	}
321
 
322
	/**
2013 mathias 323
	 * Nombre de proposition faites sur toutes les observations
2011 mathias 324
	 */
2013 mathias 325
	private function getNbPropositionsToutesObs($mpm=false) {
326
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE";
327
		if ($this->annee != null) {
328
			$requete .= ' YEAR(date) = ' . $this->annee . " AND";
329
		}
330
		$requete .= " (`nom_sel_nn` IS NOT NULL OR `nom_sel_nn` != '') AND `proposition_initiale` = 0";
331
		if ($mpm) {
332
			$requete = $this->encapsulerMPM($requete);
333
		}
334
		$resultat = $this->bdd->recupererTous($requete);
335
		return intval(array_pop($resultat[0]));
336
	}
337
 
338
	/**
339
	 * Nombre de proposition retenues faites sur toutes les observations
340
	 */
341
	private function getNbPropositionsRetenuesToutesObs($mpm=false) {
342
		$requete = "SELECT COUNT(DISTINCT id_commentaire) AS nb_total FROM del_commentaire WHERE";
343
		if ($this->annee != null) {
344
			$requete .= ' YEAR(date) = ' . $this->annee . " AND";
345
		}
346
		$requete .= " proposition_retenue = 1";
347
		if ($mpm) {
348
			$requete = $this->encapsulerMPM($requete);
349
		}
350
		$resultat = $this->bdd->recupererTous($requete);
351
		return intval(array_pop($resultat[0]));
352
	}
353
 
354
	/**
2016 mathias 355
	 * Nombre de proposition en consensus faites sur toutes les observations
2013 mathias 356
	 */
357
	private function getNbPropositionsConsensusToutesObs($mpm=false) {
2016 mathias 358
		$requete = "SELECT COUNT(DISTINCT ce_observation) AS nb_total FROM del_commentaire dc WHERE"
359
			. " dc.proposition_retenue = 1"
360
			. " OR (dc.proposition_initiale = 1"
361
			. " AND dc.nom_sel_nn != 0"
362
			. " AND dc.nom_sel_nn IS NOT NULL"
363
			. " AND dc.id_commentaire IN"
364
				. " (SELECT ce_proposition FROM del_commentaire_vote dcv WHERE";
365
				if ($this->annee != null) {
366
					$requete .= " year(date) < " . $this->annee . " AND";
367
				}
368
				$requete .= " ce_proposition NOT IN (SELECT ce_proposition FROM del_commentaire_vote dcv";
369
				if ($this->annee != null) {
370
					$requete .= " WHERE year(date) < " . ($this->annee - 1);
371
				}
372
				$requete .= " GROUP BY ce_proposition"
373
					. " HAVING SUM(CASE"
374
						. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
375
						. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
376
						. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
377
						. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
378
					. " END) >= 4)"
379
				. " GROUP BY ce_proposition"
380
				. " HAVING SUM(CASE"
381
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
382
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
383
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
384
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
385
				. " END) >= 4"
386
			. " )"
387
		. " )";
388
		if ($mpm) {
389
			$requete = $this->encapsulerMPM($requete);
390
		}
2011 mathias 391
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 392
		return intval(array_pop($resultat[0]));
2011 mathias 393
	}
394
 
395
	/**
2013 mathias 396
	 * Nombre de proposition faites sur les observations d'une année
2011 mathias 397
	 */
2013 mathias 398
	private function getNbPropositionsObsAnnee($mpm=false) {
399
		if ($this->annee == null) {
400
			return null;
401
		}
402
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE YEAR(date) = " . $this->annee . " AND "
403
			. "(`nom_sel_nn` IS NOT NULL OR `nom_sel_nn` != '') AND `proposition_initiale` = 0 AND ce_observation in"
404
			. " (SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ")";
405
		if ($mpm) {
406
			$requete = $this->encapsulerMPM($requete);
407
		}
408
		$resultat = $this->bdd->recupererTous($requete);
409
		return intval(array_pop($resultat[0]));
410
	}
411
 
412
	/**
413
	 * Nombre de proposition retenues faites sur les observations d'une année
414
	 */
415
	private function getNbPropositionsRetenuesObsAnnee($mpm=false) {
416
		if ($this->annee == null) {
417
			return null;
418
		}
419
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE YEAR(date) = " . $this->annee . " AND "
420
			. "`proposition_retenue` = 1 AND ce_observation in (SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ")";
421
		if ($mpm) {
422
			$requete = $this->encapsulerMPM($requete);
423
		}
424
		$resultat = $this->bdd->recupererTous($requete);
425
		return intval(array_pop($resultat[0]));
426
	}
427
 
428
	/**
2016 mathias 429
	 * Nombre de proposition en consensus faites sur les observations d'une année
2013 mathias 430
	 */
431
	private function getNbPropositionsConsensusObsAnnee($mpm=false) {
2016 mathias 432
		if ($this->annee == null) {
433
			return null;
434
		}
435
		$requete = "SELECT COUNT(DISTINCT ce_observation) AS nb_total FROM del_commentaire dc WHERE ce_observation in ("
436
			. " SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ") AND ("
437
			. " dc.proposition_retenue = 1 OR (dc.proposition_initiale = 1"
438
			. " AND dc.nom_sel_nn != 0 AND dc.nom_sel_nn IS NOT NULL AND dc.id_commentaire IN"
439
				. " (SELECT ce_proposition FROM del_commentaire_vote dcv"
440
				. " WHERE year(date) <= " . $this->annee
441
				. " GROUP BY ce_proposition"
442
				. " HAVING SUM(CASE"
443
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN 3"
444
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' != 0 THEN -3"
445
					. " WHEN valeur = 1 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN 1"
446
					. " WHEN valeur = 0 AND dcv.ce_utilisateur REGEXP '^-?[0-9]+$' = 0 THEN -1"
447
				. " END) >= 4)"
448
			. "))";
449
		if ($mpm) {
450
			$requete = $this->encapsulerMPM($requete);
451
		}
2011 mathias 452
		$resultat = $this->bdd->recupererTous($requete);
2016 mathias 453
		return intval(array_pop($resultat[0]));
2011 mathias 454
	}
455
 
456
	/**
2013 mathias 457
	 * Nombre de votes
458
	 */
459
	private function getNbVotes($mpm=false) {
460
		$requete = "SELECT COUNT(DISTINCT `id_vote`) AS nb_total FROM del_commentaire_vote";
461
		if ($this->annee != null) {
462
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
463
		}
464
		if ($mpm) {
465
			$requete = $this->encapsulerMPM($requete);
466
		}
467
		$resultat = $this->bdd->recupererTous($requete);
468
		return intval(array_pop($resultat[0]));
469
	}
470
 
471
	/**
472
	 * Nombre de commentaires
473
	 */
474
	private function getNbCommentaires($mpm=false) {
475
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM del_commentaire WHERE `ce_proposition` != '' AND (`nom_sel` IS NULL OR `nom_sel` = '')";
476
		if ($this->annee != null) {
477
			$requete .= ' AND YEAR(date) = ' . $this->annee;
478
		}
479
		if ($mpm) {
480
			$requete = $this->encapsulerMPM($requete);
481
		}
482
		$resultat = $this->bdd->recupererTous($requete);
483
		return intval(array_pop($resultat[0]));
484
	}
485
 
486
	/**
2011 mathias 487
	 * Statistiques sur les utilisateurs d'Identiplante
2013 mathias 488
	 * "AF" = ayant fait un(e)
489
	 * "MPM" = moyenne par mois
2011 mathias 490
	 * - Nombre total d'utilisateurs
2013 mathias 491
	 * - Nombre d'utilisateurs ayant fait une proposition
2016 mathias 492
	 * - Nombre d'utilisateurs identifiés ayant fait un vote
493
	 * - Nombre d'utilisateurs anonymes ayant fait un vote
2013 mathias 494
	 * - Nombre d'utilisateurs ayant fait un commentaire
2016 mathias 495
	 * - Nombre d'utilisateurs ayant fait une action
2011 mathias 496
	 */
497
	private function getUtilisateursIp() {
498
		return array(
499
			'nbUtilisateursTotal' => $this->getNbUtilisateursIpTotal(),
2013 mathias 500
			'nbUtilisateursAFProposition' => $this->getNbUtilisateursAFProposition(),
501
			'nbUtilisateursAFCommentaire' => $this->getNbUtilisateursAFCommentaire(),
502
			'nbUtilisateursAFVote' => $this->getNbUtilisateursAFVote(),
503
			'nbUtilisateursAnonymesAFVote' => $this->getNbUtilisateursAnonymesAFVote(),
2016 mathias 504
			'nbUtilisateursAFAction' => $this->getNbUtilisateursAFAction(),
2013 mathias 505
			'nbUtilisateursAFPropositionMPM' => $this->getNbUtilisateursAFProposition(true),
506
			'nbUtilisateursAFCommentaireMPM' => $this->getNbUtilisateursAFCommentaire(true),
507
			'nbUtilisateursAFVoteMPM' => $this->getNbUtilisateursAFVote(true),
508
			'nbUtilisateursAnonymesAFVoteMPM' => $this->getNbUtilisateursAnonymesAFVote(true),
2016 mathias 509
			'nbUtilisateursAFActionMPM' => $this->getNbUtilisateursAFActionMPM()
2011 mathias 510
		);
511
	}
512
 
513
	/**
2013 mathias 514
	 * Nombre total d'utilisateurs d'Identiplante
2011 mathias 515
	 */
516
	private function getNbUtilisateursIpTotal() {
2013 mathias 517
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total  FROM del_commentaire";
518
		if ($this->annee != null) {
519
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
520
		}
2011 mathias 521
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 522
		return intval(array_pop($resultat[0]));
2011 mathias 523
	}
524
 
525
	/**
2013 mathias 526
	 * Nombre d'utilisateurs d'Identiplante ayant fait au moins une proposition
2011 mathias 527
	 */
2013 mathias 528
	private function getNbUtilisateursAFProposition($mpm=false) {
529
		$requete = "SELECT COUNT(DISTINCT `utilisateur_courriel`) AS nb_total FROM del_commentaire WHERE `ce_proposition` = '' AND `nom_sel` IS NOT NULL AND `nom_sel` != ''";
530
		if ($this->annee != null) {
531
			$requete .= ' AND YEAR(date) = ' . $this->annee;
532
		}
533
		if ($mpm) {
534
			$requete = $this->encapsulerMPM($requete);
535
		}
2011 mathias 536
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 537
		return intval(array_pop($resultat[0]));
2011 mathias 538
	}
539
 
540
	/**
2013 mathias 541
	 * Nombre d'utilisateurs d'Identiplante ayant fait au moins un commentaire
2011 mathias 542
	 */
2013 mathias 543
	private function getNbUtilisateursAFCommentaire($mpm=false) {
544
		$requete = "SELECT COUNT(DISTINCT `utilisateur_courriel`) AS nb_total FROM del_commentaire WHERE `ce_proposition` != '' AND (`nom_sel` IS NULL OR `nom_sel` = '')";
545
		if ($this->annee != null) {
546
			$requete .= ' AND YEAR(date) = ' . $this->annee;
547
		}
548
		if ($mpm) {
549
			$requete = $this->encapsulerMPM($requete);
550
		}
2011 mathias 551
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 552
		return intval(array_pop($resultat[0]));
2011 mathias 553
	}
554
 
555
	/**
2013 mathias 556
	 * Nombre d'utilisateurs d'Identiplante identifiés prenant part aux votes
2011 mathias 557
	 */
2013 mathias 558
	private function getNbUtilisateursAFVote($mpm=false) {
559
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_commentaire_vote WHERE ce_utilisateur REGEXP '^-?[0-9]+$'";
560
		if ($this->annee != null) {
561
			$requete .= ' AND YEAR(date) = ' . $this->annee;
562
		}
563
		if ($mpm) {
564
			$requete = $this->encapsulerMPM($requete);
565
		}
2011 mathias 566
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 567
		return intval(array_pop($resultat[0]));
2011 mathias 568
	}
569
 
570
	/**
2013 mathias 571
	 * Nombre d'utilisateurs d'Identiplante anonymes prenant part aux votes
2011 mathias 572
	 */
2013 mathias 573
	private function getNbUtilisateursAnonymesAFVote($mpm=false) {
574
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_commentaire_vote WHERE ce_utilisateur NOT REGEXP '^-?[0-9]+$'";
575
		if ($this->annee != null) {
576
			$requete .= ' AND YEAR(date) = ' . $this->annee;
577
		}
578
		if ($mpm) {
579
			$requete = $this->encapsulerMPM($requete);
580
		}
581
		$resultat = $this->bdd->recupererTous($requete);
582
		return intval(array_pop($resultat[0]));
583
	}
584
 
585
	/**
2016 mathias 586
	 * Nombre d'utilisateurs d'Identiplante ayant fait une action (commentaire, vote, proposition)
587
	 */
588
	private function getNbUtilisateursAFAction() {
589
		$requete = "SELECT COUNT(*) AS nb_total FROM (SELECT ce_utilisateur FROM del_commentaire_vote";
590
		if ($this->annee != null) {
591
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
592
		}
593
		$requete .= " UNION SELECT ce_utilisateur FROM del_commentaire";
594
		if ($this->annee != null) {
595
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
596
		}
597
		$requete .= " ) AS action";
598
		$resultat = $this->bdd->recupererTous($requete);
599
		return intval(array_pop($resultat[0]));
600
	}
601
 
602
	/**
603
	 * Moyenne par mois du nombre d'utilisateurs d'Identiplante ayant fait une action
604
	 * (commentaire, vote, proposition) -> n'est pas encapsulable par encapsulerMPM()
605
	 */
606
	private function getNbUtilisateursAFActionMPM() {
607
		$requete = "SELECT avg(nb_total) FROM (SELECT count(*) as nb_total FROM"
608
			. " (SELECT * FROM (SELECT ce_utilisateur, date FROM del_commentaire_vote";
609
		if ($this->annee != null) {
610
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
611
		}
612
		$requete .= " UNION SELECT ce_utilisateur, date FROM del_commentaire";
613
		if ($this->annee != null) {
614
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
615
		}
616
		$requete .= " ) AS action GROUP BY ce_utilisateur) AS utildate GROUP BY CONCAT(year(date),month(date))) as truc";
617
		$resultat = $this->bdd->recupererTous($requete);
618
		return intval(array_pop($resultat[0]));
619
	}
620
 
621
	/**
2013 mathias 622
	 * Liste des utilisateurs dont les propositions ont été votées positivement
623
	 */
2011 mathias 624
	private function getListeMeilleursProposeurs() {
625
		$liste = array();
2013 mathias 626
		$requete = "SELECT * FROM (SELECT utilisateur_courriel, count(prop) as nb_prop"
627
			. " FROM (SELECT `ce_proposition` as prop, COUNT(DISTINCT `id_vote`) AS nb_vote FROM del_commentaire_vote where";
628
		if ($this->annee != null) {
629
			$requete .= " year(`date`) = " . $this->annee . " AND";
630
		}
631
		$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`)"
632
			. " AS utlisateurs WHERE nb_prop > 10 ORDER BY nb_prop  DESC LIMIT 20";
2011 mathias 633
		$resultat = $this->bdd->recupererTous($requete);
634
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
635
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
636
		// ...
637
 
638
		return array(
2013 mathias 639
				'liste' => $resultat
2011 mathias 640
		);
641
	}
642
 
643
	/**
2013 mathias 644
	 * Liste des utilisateurs ayant fait le plus de votes positifs
645
	 * @TODO et le plus de votes sur des propositions retenues (ou ayant atteint un consensus)
2011 mathias 646
	 */
647
	private function getListeMeilleursVoteurs() {
648
		$liste = array();
2013 mathias 649
		$requete = "SELECT * FROM (SELECT courriel, COUNT(DISTINCT `id_vote`) AS nombre FROM del_commentaire_vote, del_utilisateur where";
650
		if ($this->annee != null) {
651
			$requete .= " year(`date`) = " . $this->annee . " AND";
652
		}
653
		$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 654
		$resultat = $this->bdd->recupererTous($requete);
2013 mathias 655
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
2011 mathias 656
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
657
		// ...
658
 
659
		return array(
2013 mathias 660
				'liste' => $resultat
2011 mathias 661
		);
662
	}
663
 
664
	/**
2013 mathias 665
	 * Liste des utilisateurs ayant fait au moins une proposition par mois toute l'année
666
	 */
667
	private function getListeProposeursReguliers() {
668
		$liste = array();
669
		$requete = "SELECT cal.nbmois, SUM(somme) / cal.nbmois as moyenne, ce_utilisateur, utilisateur_courriel FROM (SELECT count(*) as somme,"
670
			. " CONCAT(YEAR(date),'-',MONTH(date)) as anneemois, ce_utilisateur, utilisateur_courriel, id_commentaire FROM del_commentaire"
671
			. " WHERE ce_proposition = '' AND nom_sel_nn != '' AND nom_sel_nn IS NOT NULL";
672
		if ($this->annee != null) {
673
			$requete .= " AND year(`date`) = " . $this->annee;
674
		}
675
		$requete .= "  GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) as ppm, (SELECT count(distinct CONCAT(YEAR(date),'-',MONTH(date))) as nbmois FROM del_commentaire WHERE";
676
		if ($this->annee != null) {
677
			$requete .= " year(`date`) = " . $this->annee . " AND";
678
		}
679
		$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"
680
			. " ORDER BY moyenne DESC"; // @ TODO limite ?
681
		$resultat = $this->bdd->recupererTous($requete);
682
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
683
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
684
		// ...
685
 
686
		return array(
687
			'liste' => $resultat
688
		);
689
	}
690
 
691
	/**
2011 mathias 692
	 * @TODO Statistiques sur les images de Pictoflora
693
	 * @REFLEXION aucune idée de ce qu'on met dedans
694
	 */
695
	private function getImages() {
696
		return array(
697
			'annee' => $this->annee
698
		);
699
	}
700
 
701
	/**
702
	 * @TODO Statistiques sur les mots-clés de Pictoflora
703
	 * @REFLEXION aucune idée de ce qu'on met dedans
704
	 */
705
	private function getTags() {
706
		return array(
707
			'annee' => $this->annee
708
		);
709
	}
710
 
711
	/**
712
	 * @TODO Statistiques sur les utilisateurs de Pictoflora
713
	 * - Nombre total d'utilisateurs
714
	 * - Nombre d'utilisateurs réguliers
715
	 * - Nombre d'utilisateurs prenant part au taggage ?
716
	 * - Nombre de participants actifs pour le mois, la semaine, l'année
717
	 */
718
	private function getUtilisateursPf() {
719
		$nbUtilisateursActifs = $this->getNbUtilisateursPfActifs();
720
		return array(
721
			'annee' => $this->annee,
722
			'nbUtilisateursTotal' => $this->getNbUtilisateursPfTotal(),
723
			'nbUtilisateursReguliers' => $this->getNbUtilisateursPfReguliers(),
724
			'nbUtilisateursTaggant' => $this->getNbUtilisateursPfTaggant(),
725
			'nbUtilisateursActifsAnnee' => $nbUtilisateursActifs['annee'],
726
			'nbUtilisateursActifsMois' => $nbUtilisateursActifs['mois'],
727
			'nbUtilisateursActifsSemaine' => $nbUtilisateursActifs['semaine']
728
		);
729
	}
730
 
731
	/**
732
	 * @TODO Nombre total d'utilisateurs de Pictoflora
733
	 * @REFLEXION est-ce le même nombre que les utilisateurs d'Identiplante ?
734
	 */
735
	private function getNbUtilisateursPfTotal() {
736
		$requete = "";
737
		$resultat = $this->bdd->recupererTous($requete);
738
		return intval($resultat[0][0]);
739
	}
740
 
741
	/**
742
	 * @TODO Nombre d'utilisateurs réguliers de Pictoflora
743
	 * @REFLEXION quelle différence avec getNbUtilisateursPfActifs() ?
744
	 */
745
	private function getNbUtilisateursPfReguliers() {
746
		$requete = "";
747
		$resultat = $this->bdd->recupererTous($requete);
748
		return intval($resultat[0][0]);
749
	}
750
 
751
	/**
752
	 * @TODO Nombre d'utilisateurs de Pictoflora prenant part aux votes
753
	 */
754
	private function getNbUtilisateursPfTaggant() {
755
		$requete = "";
756
		$resultat = $this->bdd->recupererTous($requete);
757
		return intval($resultat[0][0]);
758
	}
759
 
760
	/**
761
	 * @TODO Nombre de participants à Pictoflora actifs (pour le mois, la semaine, l'année)
762
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
763
	 * l'activité du mois et de la semaine (on met la case à null ?)
764
	 */
765
	private function getNbUtilisateursPfActifs() {
766
		$requete = "";
767
		$resultat = $this->bdd->recupererTous($requete);
768
		return intval($resultat[0][0]);
769
	}
770
 
771
	/**
772
	 * @TODO Liste des mots-clés les plus fréquents
773
	 */
774
	private function getListeMeilleursTags() {
775
		$liste = array();
776
		$requete = "";
777
		$resultat = $this->bdd->recupererTous($requete);
778
		// Formater liste
779
		// ...
780
 
781
		return array(
782
			'annee' => $this->annee,
783
			'listeMeilleursTags' => $liste
784
		);
785
	}
786
 
787
	/**
788
	 * @TODO Liste des utilisateurs ayant ajouté le plus de mots-clés
789
	 */
790
	private function getListeMeilleursTagueurs() {
791
		$liste = array();
792
		$requete = "";
793
		$resultat = $this->bdd->recupererTous($requete);
794
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir service CEL stats)
795
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
796
		// ...
797
 
798
		return array(
799
			'annee' => $this->annee,
800
			'listeMeilleursTagueurs' => $liste
801
		);
802
	}
2013 mathias 803
 
804
	/**
805
	 * Encapsule une reqûete de comptage dans un autre morceau de requête
806
	 * afin de calculer la moyenne par mois
807
	 * @param string $requete count() qui doit renvoyer une colonne 'nb_total'
808
	 */
2016 mathias 809
	protected function encapsulerMPM($requete, $colonne="date") {
2013 mathias 810
		$requeteEncapsulee = "SELECT AVG(nb_total) as moyenne FROM ("
811
			. $requete
2016 mathias 812
			. " GROUP BY CONCAT(year($colonne),month($colonne)) ) AS nombre";
2013 mathias 813
		return $requeteEncapsulee;
814
	}
2016 mathias 815
 
816
	/* ---------------- OBSOLETE -------------
817
 
818
	// Retourne le nombre moyen d'observations non identifiées envoyées par mois, pour l'année $annee
819
	private function getMoyenneObsSansNomParMois() {
820
	$sqlTableTmp = "SELECT COUNT(*) AS compte, ".
821
	"	CONCAT(YEAR(date_transmission),'-',MONTH(date_transmission)) AS anneemois ".
822
	"FROM del_observation ".
823
	"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
824
	"OR certitude = 'aDeterminer' ".
825
	"OR certitude = 'douteux' ".
826
	// Obs n'ayant pas de nom_sel_nn (détermination non choisie parmi le référentiel)
827
	"OR nom_sel_nn IS NULL ".
828
	"OR nom_sel_nn = 0 ".
829
	"OR id_observation IN ({$this->getSqlObsSansNom()}) ".
830
	') '.
831
	(($this->annee !== null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
832
	'GROUP BY anneemois '.
833
	'ORDER BY anneemois DESC ';
834
 
835
	$requete = "SELECT AVG(parMois.compte) AS moyenne FROM ($sqlTableTmp) AS parMois ".
836
	' -- '.__FILE__.' : '.__LINE__;
837
	$resultat = $this->bdd->recupererTous($requete);
838
	return intval($resultat[0]['moyenne']);
839
	}
840
 
841
	private function getSqlObsSansNom() {
842
	$sqlObsSansNom = "SELECT DISTINCT ce_observation ".
843
	"FROM del_commentaire ".
844
	"WHERE proposition_initiale = 1 ".
845
	"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ";
846
	return $sqlObsSansNom;
847
	}
848
 
849
	// Retourne la moyenne par mois sur l'année en cours, des propositions marquées comme "retenues"
850
	// dont le dernier vote est dans l'année considérée (comptées en groupant par mois du dernier vote)
851
	private function getMoyenneObsIdentifieesParMois() {
852
	// Compte et date du dernier vote des propositions marquées comme "retenues"
853
	$sqlTableTmp1 = "SELECT COUNT(*), MAX(dcv.date) AS maxdate ".
854
	"FROM del_commentaire AS dc ".
855
	"	LEFT JOIN del_commentaire_vote dcv ON dcv.ce_proposition = dc.id_commentaire ".
856
	" WHERE proposition_retenue = 1 ".
857
	" GROUP BY dc.id_commentaire ".
858
	(($this->annee !== null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '');
859
 
860
	$sqlTableTmp2 = 'SELECT COUNT(*) AS valideesparmois, '.
861
	"	CONCAT(YEAR(maxdate), '-', MONTH(maxdate)) AS anneemois ".
862
	"FROM ($sqlTableTmp1) AS temp ".
863
	"GROUP BY anneemois ";
864
 
865
	$requete = "SELECT AVG(valideesparmois) AS moyenne FROM ($sqlTableTmp2) AS temp2 ".
866
	' -- '.__FILE__.' : '.__LINE__;
867
 
868
	$resultat = $this->bdd->recupererTous($requete);
869
	return intval($resultat[0]['moyenne']);
870
	}
871
 
872
	// Version améliorée mais non optimale (prend en compte les consensus non validés)
873
	// @TODO on devrait croiser les IDS pour ne pas prendre en compte les obs validées ou en
874
	// 		consensus, mais qui datent des années précédentes
875
	// @ACHTUNG mache pas, dépasse les 100% (voir Wiki)
876
	private function getPourcentageObsIdentifieesFinAnneePlus() {
877
	// Obs ayant atteint un consensus cette année
878
	$requete = "SELECT COUNT(*) AS nombre ".
879
	"FROM (SELECT id_observation, id_commentaire, id_vote, nbvotes ".
880
	"FROM (SELECT do.id_observation, dc.id_commentaire, dcv.id_vote, COUNT(dcv.id_vote) AS nbvotes ".
881
	"FROM del_commentaire AS dc ".
882
	"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
883
	"	LEFT JOIN del_commentaire_vote AS dcv ON (dc.id_commentaire = dcv.ce_proposition) ".
884
	"AND dcv.valeur = 1 ".
885
	"AND dc.proposition_retenue = 0 ".
886
	"GROUP BY dc.id_commentaire ".
887
	(($this->annee != null) ? " HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
888
	" ) AS temp ".
889
	"GROUP BY id_observation ".
890
	") AS temp2 ".
891
	' -- '.__FILE__.' : '.__LINE__;
892
	$obsEnConsensus = $this->bdd->recupererTous($requete);
893
	$oc = intval($obsEnConsensus[0]['nombre']);
894
 
895
	// Obs ayant une "proposition retenue" cette année
896
	$requete = "SELECT COUNT(*) AS nombre ".
897
	"FROM (SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
898
	"FROM del_commentaire AS dc ".
899
	"	LEFT JOIN del_commentaire_vote AS dcv ON (dcv.ce_proposition = dc.id_commentaire) ".
900
	"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
901
	"WHERE proposition_retenue = 1 ".
902
	(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
903
	"GROUP BY dc.id_commentaire ".
904
	(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
905
	") as temp ".
906
	' -- '.__FILE__.' : '.__LINE__;
907
	$nbObsValidees = $this->bdd->recupererTous($requete);
908
	$ov = intval($nbObsValidees[0]['nombre']);
909
 
910
	// Nombre d'obs sans nom soumises cette année
911
	$requete = "SELECT COUNT(*) AS nombre ".
912
	"FROM del_observation ".
913
	"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
914
	"OR certitude = 'aDeterminer' ".
915
	"OR certitude = 'douteux' ".
916
	"OR nom_sel_nn IS NULL ".
917
	"OR nom_sel_nn = 0 ".
918
	"OR id_observation IN ({$this->getSqlObsSansNom()})".
919
	') '.
920
	(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
921
	' -- '.__FILE__.' : '.__LINE__;
922
	$nbObsSansNom = $this->bdd->recupererTous($requete);
923
	$osn = intval($nbObsSansNom[0]['nombre']);
924
 
925
	return array(
926
	'observationsEnConsensus' => $oc,
927
	'observationsValidees' => $ov,
928
	'observationsSansNom' => $osn,
929
	'pourcentage' => ($osn == 0 ? 0 : round(((($oc + $ov) / $osn) * 100), 2))
930
	);
931
	}
932
 
933
	private function getPourcentageObsIdentifieesFinAnnee() {
934
	$requete = "SELECT ( ".
935
	"SELECT COUNT(*) FROM ( ".
936
	"SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
937
	"FROM del_commentaire AS dc ".
938
	"	LEFT JOIN del_commentaire_vote AS dcv ON (dcv.ce_proposition = dc.id_commentaire) ".
939
	"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
940
	"WHERE proposition_retenue = 1 ".
941
	(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
942
	"GROUP BY dc.id_commentaire ".
943
	(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
944
	") AS temp)".
945
	" / ".
946
	"(SELECT COUNT(*) ".
947
	"FROM del_observation ".
948
	"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
949
	"OR certitude = 'aDeterminer' ".
950
	"OR certitude = 'douteux' ".
951
	"OR nom_sel_nn IS NULL ".
952
	"OR nom_sel_nn = 0 ".
953
	"OR id_observation IN ( ".
954
	"SELECT DISTINCT ce_observation ".
955
	"FROM del_commentaire ".
956
	"WHERE proposition_initiale = 1 ".
957
	"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ".
958
	") ".
959
	") ".
960
	(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
961
	") * 100 AS pourcentage ".
962
	' -- '.__FILE__.' : '.__LINE__;
963
	$resultat = $this->bdd->recupererTous($requete);
964
	return floatval($resultat[0]['pourcentage']);
965
	}
966
 
967
	// Retourne la moyenne sur l'année du nombre d'actions (commentaire ou vote) par jour
968
	private function getMoyenneActionsParJour() {
969
	// nombre de commentaires sur l'année
970
	$sqlNbreCommentaires = 'SELECT COUNT(*) FROM del_commentaire '.
971
	($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
972
 
973
	// nombre de votes sur l'année
974
	$sqlNbreVotes = 'SELECT COUNT(*) FROM del_commentaire_vote '.
975
	($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
976
 
977
	// nombre de jours écoulés dans l'année*
978
	$sqlNbreJours = "SELECT 365 * (YEAR(now()) - MIN(YEAR(date)) + 1) FROM del_commentaire_vote WHERE YEAR(date) != 0 ";
979
	if ($this->annee != null) {
980
	$sqlNbreJours = "SELECT IF(YEAR(CURDATE()) = '{$this->annee}', DAYOFYEAR(CURDATE()), 365) ";
981
	}
982
 
983
	// nombre d'actions / nombre de jours
984
	$requete = "SELECT ((($sqlNbreCommentaires) + ($sqlNbreVotes)) / ($sqlNbreJours)) AS moyenne ".
985
	' -- '.__FILE__.' : '.__LINE__;
986
 
987
	$resultat = $this->bdd->recupererTous($requete);
988
	return intval($resultat[0]['moyenne']);
989
	}
990
 
991
	// Retourne le nombre et la liste des personnes ayant sur l'année une moyenne de participation par mois >= 1
992
	private function getParticipants() {
993
	// Faire la moyenne par utilisateur et par mois
994
	$requete = "SELECT cal.nbmois, SUM(somme) / cal.nbmois as moyenne, ce_utilisateur, utilisateur_courriel ".
995
	"FROM ".
996
	// Compter le nombre de participations pour chaque utilisateur à chaque mois de cette année
997
	"(SELECT COUNT(*) as somme, CONCAT(YEAR(date),'-',MONTH(date)) AS anneemois, ".
998
	"ce_utilisateur, utilisateur_courriel, id_commentaire ".
999
	"FROM del_commentaire ".
1000
	"WHERE ce_proposition = '' ".
1001
	"AND nom_sel_nn != '' ".
1002
	"AND nom_sel_nn IS NOT NULL ".
1003
	(($this->annee != null) ? " AND YEAR(date) = '{$this->annee}' " : '').
1004
	"GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) AS ppm, ".
1005
	// Trouver le nombre de mois différents lors desquels les utilisateurs ont participé, cette année
1006
	// Pour l'année en cours par ex, retournera 2 si on est en février (voire un au début du mois).
1007
	"(SELECT COUNT(distinct CONCAT(YEAR(date),'-',MONTH(date))) AS nbmois ".
1008
	"FROM del_commentaire ".
1009
	"WHERE ce_proposition = '' ".
1010
	(($this->annee != null) ? "AND YEAR(date) = '{$this->annee}' " : '').
1011
	"AND nom_sel_nn != '' ".
1012
	"AND nom_sel_nn IS NOT NULL) AS cal ".
1013
	"GROUP BY ce_utilisateur, utilisateur_courriel ".
1014
	"HAVING SUM(somme) / cal.nbmois >= 1 ".
1015
	"ORDER BY moyenne ".
1016
	' -- '.__FILE__.' : '.__LINE__;
1017
 
1018
	$resultat = $this->bdd->recupererTous($requete);
1019
	$cpt = count($resultat);
1020
	$retour = array(
1021
	'nombre' => intval($cpt),
1022
	'donnees' => $resultat
1023
	);
1024
	return $retour;
1025
	}
1026
 
1027
	--------------- FIN OBSOLETE -------------- */
1818 jpm 1028
}