Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1818 Rev 2011
1
<?php
1
<?php
2
/**
2
/**
3
 * Statistiques par année sur l'utilisation de Identiplante / Pictoflora
3
 * Statistiques par année sur l'utilisation de Identiplante / Pictoflora
4
 *
4
 *
5
 * @see Documentation : <http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliDelStats>
5
 * @see Documentation : <http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliDelStats>
6
 *
6
 *
7
 * @category   DEL
7
 * @category   DEL
8
 * @package    Services
8
 * @package    Services
9
 * @subpackage Statistiques
9
 * @subpackage Statistiques
10
 * @version    0.1
10
 * @version    0.1
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
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>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 */
17
 */
18
class StatistiquesParAnnee {
18
class StatistiquesParAnnee {
19
 
19
 
20
	private $conteneur;
20
	private $conteneur;
21
	private $contexte;
21
	private $contexte;
22
	private $navigation;
22
	private $navigation;
23
	private $bdd;
23
	private $bdd;
24
 
24
 
25
	private $annee = null;
25
	private $annee = null;
26
	private $type = 'tout';
26
	private $type = 'tout';
27
	private $methode = '';
27
	private $methode = '';
28
 
28
 
29
	public function __construct(Conteneur $conteneur = null) {
29
	public function __construct(Conteneur $conteneur = null) {
30
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
30
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
31
		$this->contexte = $conteneur->getContexte();
31
		$this->contexte = $conteneur->getContexte();
32
		$this->navigation = $conteneur->getNavigation();
32
		$this->navigation = $conteneur->getNavigation();
33
		$this->bdd = $this->conteneur->getBdd();
33
		$this->bdd = $this->conteneur->getBdd();
34
	}
34
	}
35
 
35
 
36
	public function consulter() {
36
	public function consulter() {
37
		$this->intitialiserParametresEtRessources();
37
		$this->intitialiserParametresEtRessources();
38
		$this->verifierPreRequis();
38
		$this->verifierPreRequis();
39
 
39
 
40
		$resultat = new ResultatService();
40
		$resultat = new ResultatService();
41
		$resultat->corps = call_user_func(array($this, $this->methode));
41
		$resultat->corps = call_user_func(array($this, $this->methode));
42
		return $resultat;
42
		return $resultat;
43
	}
43
	}
44
 
44
 
45
	private function intitialiserParametresEtRessources() {
45
	private function intitialiserParametresEtRessources() {
46
		$this->type = $this->contexte->getRessource(2) != null ? $this->contexte->getRessource(2) : $this->type;
46
		$this->type = $this->contexte->getRessource(2) != null ? $this->contexte->getRessource(2) : $this->type;
47
		$this->methode = $this->obtenirNomMethode($this->type);
47
		$this->methode = $this->obtenirNomMethode($this->type);
48
		$this->annee =(int) $this->contexte->getQS('annee') != null ? intval($this->contexte->getQS('annee')) : null;
48
		$this->annee =(int) $this->contexte->getQS('annee') != null ? intval($this->contexte->getQS('annee')) : null;
49
	}
49
	}
50
 
50
 
51
	private function verifierPreRequis() {
51
	private function verifierPreRequis() {
52
		$erreurs = array();
52
		$erreurs = array();
53
 
53
 
54
		if ($this->annee != null && !is_int($this->annee)) {
54
		if ($this->annee != null && !is_int($this->annee)) {
55
			$erreurs[] = "Le paramètre 'annee' doit être un entier.";
55
			$erreurs[] = "Le paramètre 'annee' doit être un entier.";
56
		}
56
		}
57
 
-
 
58
		if (method_exists($this, $this->obtenirNomMethode($this->type)) === false) {
57
		if (method_exists($this, $this->obtenirNomMethode($this->type)) === false) {
59
			$erreurs[] = "Les stats de type '{$this->type}' n'existent pas.";
58
			$erreurs[] = "Les stats de type '{$this->type}' n'existent pas.";
60
		}
59
		}
61
 
-
 
62
		if (!empty($erreurs)) {
60
		if (!empty($erreurs)) {
63
			$msg = "Erreur de configuration :\n".implode("\n", $erreurs)."\n\n".Statistiques::getDoc();
61
			$msg = "Erreur de configuration :\n".implode("\n", $erreurs)."\n\n".Statistiques::getDoc();
64
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
62
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
65
		}
63
		}
66
	}
64
	}
-
 
65
 
-
 
66
	/**
-
 
67
	 * Ouh la jolie méthode magique !!
-
 
68
	 * @param unknown $mot
-
 
69
	 * @return string
67
 
70
	 */
68
	private function obtenirNomMethode($mot) {
71
	private function obtenirNomMethode($mot) {
69
		$classeNom = 'get'.str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
72
		$classeNom = 'get'.str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
70
		return $classeNom;
73
		return $classeNom;
71
	}
74
	}
-
 
75
 
-
 
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
	}
72
 
91
 
73
	// retourne toutes les stats pour l'année spécifiée
92
	// retourne toutes les stats pour l'année spécifiée
74
	private function getTout() {
93
	private function getTout() {
75
		$obsIdentifieesFinAnneePlus = $this->getPourcentageObsIdentifieesFinAnneePlus();
94
		$obsIdentifieesFinAnneePlus = $this->getPourcentageObsIdentifieesFinAnneePlus();
76
		$participants = $this->getParticipants();
95
		$participants = $this->getParticipants();
77
 
96
 
78
		return array(
97
		return array(
79
			'annee' => $this->annee,
98
			'annee' => $this->annee,
80
			'moyenneObsSansNomParMois' => $this->getMoyenneObsSansNomParMois(),
99
			'moyenneObsSansNomParMois' => $this->getMoyenneObsSansNomParMois(),
81
			'moyenneObsIdentifieesParMois' => $this->getMoyenneObsIdentifieesParMois(),
100
			'moyenneObsIdentifieesParMois' => $this->getMoyenneObsIdentifieesParMois(),
82
			'pourcentageObsIdentifieesEnFinDAnnee' => $this->getPourcentageObsIdentifieesFinAnnee(),
101
			'pourcentageObsIdentifieesEnFinDAnnee' => $this->getPourcentageObsIdentifieesFinAnnee(),
83
			'pourcentageObsIdentifieesEnFinDAnneePlusPlus' => $obsIdentifieesFinAnneePlus['pourcentage'],
102
			'pourcentageObsIdentifieesEnFinDAnneePlusPlus' => $obsIdentifieesFinAnneePlus['pourcentage'],
84
			'moyenneActionsParJour' => $this->getMoyenneActionsParJour(),
103
			'moyenneActionsParJour' => $this->getMoyenneActionsParJour(),
85
			'personnesEnvoyantUnePropositionParMois' => $participants['nombre']
104
			'personnesEnvoyantUnePropositionParMois' => $participants['nombre']
86
		);
105
		);
87
	}
106
	}
88
 
107
 
89
	// proxy pour le widget de stats
108
	// proxy pour le widget de stats
90
	private function getObservations() {
109
	private function getObservations() {
91
		return $this->getTout();
110
		return $this->getTout();
92
	}
111
	}
93
 
112
 
94
	// Retourne le nombre moyen d'observations non identifiées envoyées par mois, pour l'année $annee
113
	// Retourne le nombre moyen d'observations non identifiées envoyées par mois, pour l'année $annee
95
	private function getMoyenneObsSansNomParMois() {
114
	private function getMoyenneObsSansNomParMois() {
96
		$sqlTableTmp = "SELECT COUNT(*) AS compte, ".
115
		$sqlTableTmp = "SELECT COUNT(*) AS compte, ".
97
			"	CONCAT(YEAR(date_transmission),'-',MONTH(date_transmission)) AS anneemois ".
116
			"	CONCAT(YEAR(date_transmission),'-',MONTH(date_transmission)) AS anneemois ".
98
			"FROM del_observation ".
117
			"FROM del_observation ".
99
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
118
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
100
				"OR certitude = 'aDeterminer' ".
119
				"OR certitude = 'aDeterminer' ".
101
				"OR certitude = 'douteux' ".
120
				"OR certitude = 'douteux' ".
102
				// Obs n'ayant pas de nom_sel_nn (détermination non choisie parmi le référentiel)
121
				// Obs n'ayant pas de nom_sel_nn (détermination non choisie parmi le référentiel)
103
				"OR nom_sel_nn IS NULL ".
122
				"OR nom_sel_nn IS NULL ".
104
				"OR nom_sel_nn = 0 ".
123
				"OR nom_sel_nn = 0 ".
105
				"OR id_observation IN ({$this->getSqlObsSansNom()}) ".
124
				"OR id_observation IN ({$this->getSqlObsSansNom()}) ".
106
			') '.
125
			') '.
107
			(($this->annee !== null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
126
			(($this->annee !== null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
108
			'GROUP BY anneemois '.
127
			'GROUP BY anneemois '.
109
			'ORDER BY anneemois DESC ';
128
			'ORDER BY anneemois DESC ';
110
 
129
 
111
		$requete = "SELECT AVG(parMois.compte) AS moyenne FROM ($sqlTableTmp) AS parMois ".
130
		$requete = "SELECT AVG(parMois.compte) AS moyenne FROM ($sqlTableTmp) AS parMois ".
112
			' -- '.__FILE__.' : '.__LINE__;
131
			' -- '.__FILE__.' : '.__LINE__;
113
		$resultat = $this->bdd->recupererTous($requete);
132
		$resultat = $this->bdd->recupererTous($requete);
114
		return intval($resultat[0]['moyenne']);
133
		return intval($resultat[0]['moyenne']);
115
	}
134
	}
116
 
135
 
117
	private function getSqlObsSansNom() {
136
	private function getSqlObsSansNom() {
118
		$sqlObsSansNom = "SELECT DISTINCT ce_observation ".
137
		$sqlObsSansNom = "SELECT DISTINCT ce_observation ".
119
			"FROM del_commentaire ".
138
			"FROM del_commentaire ".
120
			"WHERE proposition_initiale = 1 ".
139
			"WHERE proposition_initiale = 1 ".
121
			"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ";
140
			"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ";
122
		return $sqlObsSansNom;
141
		return $sqlObsSansNom;
123
	}
142
	}
124
 
143
 
125
	// Retourne la moyenne par mois sur l'année en cours, des propositions marquées comme "retenues"
144
	// Retourne la moyenne par mois sur l'année en cours, des propositions marquées comme "retenues"
126
	// dont le dernier vote est dans l'année considérée (comptées en groupant par mois du dernier vote)
145
	// dont le dernier vote est dans l'année considérée (comptées en groupant par mois du dernier vote)
127
	private function getMoyenneObsIdentifieesParMois() {
146
	private function getMoyenneObsIdentifieesParMois() {
128
		// Compte et date du dernier vote des propositions marquées comme "retenues"
147
		// Compte et date du dernier vote des propositions marquées comme "retenues"
129
		$sqlTableTmp1 = "SELECT COUNT(*), MAX(dcv.date) AS maxdate ".
148
		$sqlTableTmp1 = "SELECT COUNT(*), MAX(dcv.date) AS maxdate ".
130
			"FROM del_commentaire AS dc ".
149
			"FROM del_commentaire AS dc ".
131
			"	LEFT JOIN del_commentaire_vote dcv ON dcv.ce_proposition = dc.id_commentaire ".
150
			"	LEFT JOIN del_commentaire_vote dcv ON dcv.ce_proposition = dc.id_commentaire ".
132
			" WHERE proposition_retenue = 1 ".
151
			" WHERE proposition_retenue = 1 ".
133
			" GROUP BY dc.id_commentaire ".
152
			" GROUP BY dc.id_commentaire ".
134
			(($this->annee !== null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '');
153
			(($this->annee !== null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '');
135
 
154
 
136
		$sqlTableTmp2 = 'SELECT COUNT(*) AS valideesparmois, '.
155
		$sqlTableTmp2 = 'SELECT COUNT(*) AS valideesparmois, '.
137
			"	CONCAT(YEAR(maxdate), '-', MONTH(maxdate)) AS anneemois ".
156
			"	CONCAT(YEAR(maxdate), '-', MONTH(maxdate)) AS anneemois ".
138
			"FROM ($sqlTableTmp1) AS temp ".
157
			"FROM ($sqlTableTmp1) AS temp ".
139
			"GROUP BY anneemois ";
158
			"GROUP BY anneemois ";
140
 
159
 
141
		$requete = "SELECT AVG(valideesparmois) AS moyenne FROM ($sqlTableTmp2) AS temp2 ".
160
		$requete = "SELECT AVG(valideesparmois) AS moyenne FROM ($sqlTableTmp2) AS temp2 ".
142
			' -- '.__FILE__.' : '.__LINE__;
161
			' -- '.__FILE__.' : '.__LINE__;
143
 
162
 
144
		$resultat = $this->bdd->recupererTous($requete);
163
		$resultat = $this->bdd->recupererTous($requete);
145
		return intval($resultat[0]['moyenne']);
164
		return intval($resultat[0]['moyenne']);
146
	}
165
	}
147
 
166
 
148
	// Version améliorée mais non optimale (prend en compte les consensus non validés)
167
	// Version améliorée mais non optimale (prend en compte les consensus non validés)
149
	// @TODO on devrait croiser les IDS pour ne pas prendre en compte les obs validées ou en
168
	// @TODO on devrait croiser les IDS pour ne pas prendre en compte les obs validées ou en
150
	// 		consensus, mais qui datent des années précédentes
169
	// 		consensus, mais qui datent des années précédentes
151
	// @ACHTUNG mache pas, dépasse les 100% (voir Wiki)
170
	// @ACHTUNG mache pas, dépasse les 100% (voir Wiki)
152
	private function getPourcentageObsIdentifieesFinAnneePlus() {
171
	private function getPourcentageObsIdentifieesFinAnneePlus() {
153
		// Obs ayant atteint un consensus cette année
172
		// Obs ayant atteint un consensus cette année
154
		$requete = "SELECT COUNT(*) AS nombre ".
173
		$requete = "SELECT COUNT(*) AS nombre ".
155
			"FROM (SELECT id_observation, id_commentaire, id_vote, nbvotes ".
174
			"FROM (SELECT id_observation, id_commentaire, id_vote, nbvotes ".
156
			"FROM (SELECT do.id_observation, dc.id_commentaire, dcv.id_vote, COUNT(dcv.id_vote) AS nbvotes ".
175
			"FROM (SELECT do.id_observation, dc.id_commentaire, dcv.id_vote, COUNT(dcv.id_vote) AS nbvotes ".
157
			"FROM del_commentaire AS dc ".
176
			"FROM del_commentaire AS dc ".
158
			"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
177
			"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
159
			"	LEFT JOIN del_commentaire_vote AS dcv ON (dc.id_commentaire = dcv.ce_proposition) ".
178
			"	LEFT JOIN del_commentaire_vote AS dcv ON (dc.id_commentaire = dcv.ce_proposition) ".
160
			"AND dcv.valeur = 1 ".
179
			"AND dcv.valeur = 1 ".
161
			"AND dc.proposition_retenue = 0 ".
180
			"AND dc.proposition_retenue = 0 ".
162
			"GROUP BY dc.id_commentaire ".
181
			"GROUP BY dc.id_commentaire ".
163
			(($this->annee != null) ? " HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
182
			(($this->annee != null) ? " HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
164
			" ) AS temp ".
183
			" ) AS temp ".
165
			"GROUP BY id_observation ".
184
			"GROUP BY id_observation ".
166
			") AS temp2 ".
185
			") AS temp2 ".
167
			' -- '.__FILE__.' : '.__LINE__;
186
			' -- '.__FILE__.' : '.__LINE__;
168
		$obsEnConsensus = $this->bdd->recupererTous($requete);
187
		$obsEnConsensus = $this->bdd->recupererTous($requete);
169
		$oc = intval($obsEnConsensus[0]['nombre']);
188
		$oc = intval($obsEnConsensus[0]['nombre']);
170
 
189
 
171
		// Obs ayant une "proposition retenue" cette année
190
		// Obs ayant une "proposition retenue" cette année
172
		$requete = "SELECT COUNT(*) AS nombre ".
191
		$requete = "SELECT COUNT(*) AS nombre ".
173
			"FROM (SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
192
			"FROM (SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
174
			"FROM del_commentaire AS dc ".
193
			"FROM del_commentaire AS dc ".
175
			"	LEFT JOIN del_commentaire_vote AS dcv ON (dcv.ce_proposition = dc.id_commentaire) ".
194
			"	LEFT JOIN del_commentaire_vote AS dcv ON (dcv.ce_proposition = dc.id_commentaire) ".
176
			"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
195
			"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
177
			"WHERE proposition_retenue = 1 ".
196
			"WHERE proposition_retenue = 1 ".
178
			(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
197
			(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
179
			"GROUP BY dc.id_commentaire ".
198
			"GROUP BY dc.id_commentaire ".
180
			(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
199
			(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
181
			") as temp ".
200
			") as temp ".
182
			' -- '.__FILE__.' : '.__LINE__;
201
			' -- '.__FILE__.' : '.__LINE__;
183
		$nbObsValidees = $this->bdd->recupererTous($requete);
202
		$nbObsValidees = $this->bdd->recupererTous($requete);
184
		$ov = intval($nbObsValidees[0]['nombre']);
203
		$ov = intval($nbObsValidees[0]['nombre']);
185
 
204
 
186
		// Nombre d'obs sans nom soumises cette année
205
		// Nombre d'obs sans nom soumises cette année
187
		$requete = "SELECT COUNT(*) AS nombre ".
206
		$requete = "SELECT COUNT(*) AS nombre ".
188
			"FROM del_observation ".
207
			"FROM del_observation ".
189
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
208
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
190
			"OR certitude = 'aDeterminer' ".
209
			"OR certitude = 'aDeterminer' ".
191
			"OR certitude = 'douteux' ".
210
			"OR certitude = 'douteux' ".
192
			"OR nom_sel_nn IS NULL ".
211
			"OR nom_sel_nn IS NULL ".
193
			"OR nom_sel_nn = 0 ".
212
			"OR nom_sel_nn = 0 ".
194
			"OR id_observation IN ({$this->getSqlObsSansNom()})".
213
			"OR id_observation IN ({$this->getSqlObsSansNom()})".
195
			') '.
214
			') '.
196
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
215
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
197
			' -- '.__FILE__.' : '.__LINE__;
216
			' -- '.__FILE__.' : '.__LINE__;
198
		$nbObsSansNom = $this->bdd->recupererTous($requete);
217
		$nbObsSansNom = $this->bdd->recupererTous($requete);
199
		$osn = intval($nbObsSansNom[0]['nombre']);
218
		$osn = intval($nbObsSansNom[0]['nombre']);
200
 
219
 
201
		return array(
220
		return array(
202
			'observationsEnConsensus' => $oc,
221
			'observationsEnConsensus' => $oc,
203
			'observationsValidees' => $ov,
222
			'observationsValidees' => $ov,
204
			'observationsSansNom' => $osn,
223
			'observationsSansNom' => $osn,
205
			'pourcentage' => ($osn == 0 ? 0 : round(((($oc + $ov) / $osn) * 100), 2))
224
			'pourcentage' => ($osn == 0 ? 0 : round(((($oc + $ov) / $osn) * 100), 2))
206
		);
225
		);
207
	}
226
	}
208
 
227
 
209
	private function getPourcentageObsIdentifieesFinAnnee() {
228
	private function getPourcentageObsIdentifieesFinAnnee() {
210
		$requete = "SELECT ( ".
229
		$requete = "SELECT ( ".
211
			"SELECT COUNT(*) FROM ( ".
230
			"SELECT COUNT(*) FROM ( ".
212
				"SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
231
				"SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
213
				"FROM del_commentaire AS dc ".
232
				"FROM del_commentaire AS dc ".
214
				"	LEFT JOIN del_commentaire_vote AS dcv ON (dcv.ce_proposition = dc.id_commentaire) ".
233
				"	LEFT JOIN del_commentaire_vote AS dcv ON (dcv.ce_proposition = dc.id_commentaire) ".
215
				"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
234
				"	LEFT JOIN del_observation AS do ON (do.id_observation = dc.ce_observation) ".
216
				"WHERE proposition_retenue = 1 ".
235
				"WHERE proposition_retenue = 1 ".
217
				(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
236
				(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
218
				"GROUP BY dc.id_commentaire ".
237
				"GROUP BY dc.id_commentaire ".
219
				(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
238
				(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
220
			") AS temp)".
239
			") AS temp)".
221
			" / ".
240
			" / ".
222
			"(SELECT COUNT(*) ".
241
			"(SELECT COUNT(*) ".
223
			"FROM del_observation ".
242
			"FROM del_observation ".
224
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
243
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
225
			"OR certitude = 'aDeterminer' ".
244
			"OR certitude = 'aDeterminer' ".
226
			"OR certitude = 'douteux' ".
245
			"OR certitude = 'douteux' ".
227
			"OR nom_sel_nn IS NULL ".
246
			"OR nom_sel_nn IS NULL ".
228
			"OR nom_sel_nn = 0 ".
247
			"OR nom_sel_nn = 0 ".
229
				"OR id_observation IN ( ".
248
				"OR id_observation IN ( ".
230
				"SELECT DISTINCT ce_observation ".
249
				"SELECT DISTINCT ce_observation ".
231
				"FROM del_commentaire ".
250
				"FROM del_commentaire ".
232
				"WHERE proposition_initiale = 1 ".
251
				"WHERE proposition_initiale = 1 ".
233
				"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ".
252
				"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ".
234
				") ".
253
				") ".
235
			") ".
254
			") ".
236
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
255
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
237
		") * 100 AS pourcentage ".
256
		") * 100 AS pourcentage ".
238
		' -- '.__FILE__.' : '.__LINE__;
257
		' -- '.__FILE__.' : '.__LINE__;
239
		$resultat = $this->bdd->recupererTous($requete);
258
		$resultat = $this->bdd->recupererTous($requete);
240
		return floatval($resultat[0]['pourcentage']);
259
		return floatval($resultat[0]['pourcentage']);
241
	}
260
	}
242
 
261
 
243
	// Retourne la moyenne sur l'année du nombre d'actions (commentaire ou vote) par jour
262
	// Retourne la moyenne sur l'année du nombre d'actions (commentaire ou vote) par jour
244
	private function getMoyenneActionsParJour() {
263
	private function getMoyenneActionsParJour() {
245
		// nombre de commentaires sur l'année
264
		// nombre de commentaires sur l'année
246
		$sqlNbreCommentaires = 'SELECT COUNT(*) FROM del_commentaire '.
265
		$sqlNbreCommentaires = 'SELECT COUNT(*) FROM del_commentaire '.
247
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
266
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
248
 
267
 
249
		// nombre de votes sur l'année
268
		// nombre de votes sur l'année
250
		$sqlNbreVotes = 'SELECT COUNT(*) FROM del_commentaire_vote '.
269
		$sqlNbreVotes = 'SELECT COUNT(*) FROM del_commentaire_vote '.
251
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
270
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
252
 
271
 
253
		// nombre de jours écoulés dans l'année*
272
		// nombre de jours écoulés dans l'année*
254
		$sqlNbreJours = "SELECT 365 * (YEAR(now()) - MIN(YEAR(date)) + 1) FROM del_commentaire_vote WHERE YEAR(date) != 0 ";
273
		$sqlNbreJours = "SELECT 365 * (YEAR(now()) - MIN(YEAR(date)) + 1) FROM del_commentaire_vote WHERE YEAR(date) != 0 ";
255
		if ($this->annee != null) {
274
		if ($this->annee != null) {
256
			$sqlNbreJours = "SELECT IF(YEAR(CURDATE()) = '{$this->annee}', DAYOFYEAR(CURDATE()), 365) ";
275
			$sqlNbreJours = "SELECT IF(YEAR(CURDATE()) = '{$this->annee}', DAYOFYEAR(CURDATE()), 365) ";
257
		}
276
		}
258
 
277
 
259
		// nombre d'actions / nombre de jours
278
		// nombre d'actions / nombre de jours
260
		$requete = "SELECT ((($sqlNbreCommentaires) + ($sqlNbreVotes)) / ($sqlNbreJours)) AS moyenne ".
279
		$requete = "SELECT ((($sqlNbreCommentaires) + ($sqlNbreVotes)) / ($sqlNbreJours)) AS moyenne ".
261
			' -- '.__FILE__.' : '.__LINE__;
280
			' -- '.__FILE__.' : '.__LINE__;
262
 
281
 
263
		$resultat = $this->bdd->recupererTous($requete);
282
		$resultat = $this->bdd->recupererTous($requete);
264
		return intval($resultat[0]['moyenne']);
283
		return intval($resultat[0]['moyenne']);
265
	}
284
	}
266
 
285
 
267
	// Retourne le nombre et la liste des personnes ayant sur l'année une moyenne de participation par mois >= 1
286
	// Retourne le nombre et la liste des personnes ayant sur l'année une moyenne de participation par mois >= 1
268
	private function getParticipants() {
287
	private function getParticipants() {
269
		// Faire la moyenne par utilisateur et par mois
288
		// Faire la moyenne par utilisateur et par mois
270
		$requete = "SELECT cal.nbmois, SUM(somme) / cal.nbmois as moyenne, ce_utilisateur, utilisateur_courriel ".
289
		$requete = "SELECT cal.nbmois, SUM(somme) / cal.nbmois as moyenne, ce_utilisateur, utilisateur_courriel ".
271
			"FROM ".
290
			"FROM ".
272
				// Compter le nombre de participations pour chaque utilisateur à chaque mois de cette année
291
				// Compter le nombre de participations pour chaque utilisateur à chaque mois de cette année
273
				"(SELECT COUNT(*) as somme, CONCAT(YEAR(date),'-',MONTH(date)) AS anneemois, ".
292
				"(SELECT COUNT(*) as somme, CONCAT(YEAR(date),'-',MONTH(date)) AS anneemois, ".
274
				"ce_utilisateur, utilisateur_courriel, id_commentaire ".
293
				"ce_utilisateur, utilisateur_courriel, id_commentaire ".
275
				"FROM del_commentaire ".
294
				"FROM del_commentaire ".
276
				"WHERE ce_proposition = '' ".
295
				"WHERE ce_proposition = '' ".
277
				"AND nom_sel_nn != '' ".
296
				"AND nom_sel_nn != '' ".
278
				"AND nom_sel_nn IS NOT NULL ".
297
				"AND nom_sel_nn IS NOT NULL ".
279
				(($this->annee != null) ? " AND YEAR(date) = '{$this->annee}' " : '').
298
				(($this->annee != null) ? " AND YEAR(date) = '{$this->annee}' " : '').
280
				"GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) AS ppm, ".
299
				"GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) AS ppm, ".
281
			// Trouver le nombre de mois différents lors desquels les utilisateurs ont participé, cette année
300
			// Trouver le nombre de mois différents lors desquels les utilisateurs ont participé, cette année
282
			// Pour l'année en cours par ex, retournera 2 si on est en février (voire un au début du mois).
301
			// Pour l'année en cours par ex, retournera 2 si on est en février (voire un au début du mois).
283
				"(SELECT COUNT(distinct CONCAT(YEAR(date),'-',MONTH(date))) AS nbmois ".
302
				"(SELECT COUNT(distinct CONCAT(YEAR(date),'-',MONTH(date))) AS nbmois ".
284
				"FROM del_commentaire ".
303
				"FROM del_commentaire ".
285
				"WHERE ce_proposition = '' ".
304
				"WHERE ce_proposition = '' ".
286
				(($this->annee != null) ? "AND YEAR(date) = '{$this->annee}' " : '').
305
				(($this->annee != null) ? "AND YEAR(date) = '{$this->annee}' " : '').
287
				"AND nom_sel_nn != '' ".
306
				"AND nom_sel_nn != '' ".
288
				"AND nom_sel_nn IS NOT NULL) AS cal ".
307
				"AND nom_sel_nn IS NOT NULL) AS cal ".
289
			"GROUP BY ce_utilisateur, utilisateur_courriel ".
308
			"GROUP BY ce_utilisateur, utilisateur_courriel ".
290
			"HAVING SUM(somme) / cal.nbmois >= 1 ".
309
			"HAVING SUM(somme) / cal.nbmois >= 1 ".
291
			"ORDER BY moyenne ".
310
			"ORDER BY moyenne ".
292
			' -- '.__FILE__.' : '.__LINE__;
311
			' -- '.__FILE__.' : '.__LINE__;
293
 
312
 
294
		$resultat = $this->bdd->recupererTous($requete);
313
		$resultat = $this->bdd->recupererTous($requete);
295
		$cpt = count($resultat);
314
		$cpt = count($resultat);
296
		$retour = array(
315
		$retour = array(
297
			'nombre' => intval($cpt),
316
			'nombre' => intval($cpt),
298
			'donnees' => $resultat
317
			'donnees' => $resultat
299
		);
318
		);
300
		return $retour;
319
		return $retour;
301
	}
320
	}
-
 
321
 
-
 
322
	/**
-
 
323
	 * Statistiques sur les propositions et les votes
-
 
324
	 * - Nombre de propositions faites (au total et sur les derniers 15 jours)
-
 
325
	 * - Nombre de propositions validées(au total et sur le dernier mois)
-
 
326
	 * - Nombres de votes (au total et sur les derniers 15 jours)
-
 
327
	 */
-
 
328
	private function getPropositions() {
-
 
329
		$nbPropositions = $this->getNbPropositions();
-
 
330
		$nbPropositionsValidees = $this->getNbPropositionsValidees();
-
 
331
		$votes = $this->getNbVotes();
-
 
332
		return array(
-
 
333
			'annee' => $this->annee,
-
 
334
			'nbPropositionsTotal' => $nbPropositions[0],
-
 
335
			'nbPropositions15J' => $nbPropositions[1],
-
 
336
			'nbPropositionsValidees' => $nbPropositionsValidees[0],
-
 
337
			'nbPropositionsValidees15J' => $nbPropositionsValidees[1],
-
 
338
			'nbVotes' => $votes[0],
-
 
339
			'nbVotes15J' => $votes[1]
-
 
340
		);
-
 
341
	}
-
 
342
 
-
 
343
	/**
-
 
344
	 * @TODO Nombre de proposition faites (au total et sur les derniers 15 jours)
-
 
345
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
-
 
346
	 * l'activité des 15 derniers jours (on met la case à null ?)
-
 
347
	 */
-
 
348
	private function getNbPropositionsTotal() {
-
 
349
		$requete = "";
-
 
350
		$resultat = $this->bdd->recupererTous($requete);
-
 
351
		return intval($resultat[0][0]);
-
 
352
	}
-
 
353
 
-
 
354
	/**
-
 
355
	 * @TODO Nombre de proposition validées (au total et sur les derniers 15 jours)
-
 
356
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
-
 
357
	 * l'activité des 15 derniers jours (on met la case à null ?)
-
 
358
	 */
-
 
359
	private function getNbPropositionsValidees() {
-
 
360
		$requete = "";
-
 
361
		$resultat = $this->bdd->recupererTous($requete);
-
 
362
		return intval($resultat[0][0]);
-
 
363
	}
-
 
364
 
-
 
365
	/**
-
 
366
	 * @TODO Nombre de votes (au total et sur les derniers 15 jours)
-
 
367
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
-
 
368
	 * l'activité des 15 derniers jours (on met la case à null ?)
-
 
369
	 */
-
 
370
	private function getNbVotes() {
-
 
371
		$requete = "";
-
 
372
		$resultat = $this->bdd->recupererTous($requete);
-
 
373
		return intval($resultat[0][0]);
-
 
374
	}
-
 
375
 
-
 
376
	/**
-
 
377
	 * Statistiques sur les utilisateurs d'Identiplante
-
 
378
	 * - Nombre total d'utilisateurs
-
 
379
	 * - Nombre d'utilisateurs réguliers
-
 
380
	 * - Nombre d'utilisateurs prenant part aux votes
-
 
381
	 * - Nombre de participants actifs pour le mois, la semaine, l'année
-
 
382
	 */
-
 
383
	private function getUtilisateursIp() {
-
 
384
		$nbUtilisateursActifs = $this->getNbUtilisateursIpActifs();
-
 
385
		return array(
-
 
386
			'annee' => $this->annee,
-
 
387
			'nbUtilisateursTotal' => $this->getNbUtilisateursIpTotal(),
-
 
388
			'nbUtilisateursReguliers' => $this->getNbUtilisateursIpReguliers(),
-
 
389
			'nbUtilisateursVotant' => $this->getNbUtilisateursIpVotant(),
-
 
390
			'nbUtilisateursActifsAnnee' => $nbUtilisateursActifs['annee'],
-
 
391
			'nbUtilisateursActifsMois' => $nbUtilisateursActifs['mois'],
-
 
392
			'nbUtilisateursActifsSemaine' => $nbUtilisateursActifs['semaine']
-
 
393
		);
-
 
394
	}
-
 
395
 
-
 
396
	/**
-
 
397
	 * @TODO Nombre total d'utilisateurs d'Identiplante
-
 
398
	 * @REFLEXION est-ce le même nombre que les utilisateurs d'Identiplante ?
-
 
399
	 */
-
 
400
	private function getNbUtilisateursIpTotal() {
-
 
401
		$requete = "";
-
 
402
		$resultat = $this->bdd->recupererTous($requete);
-
 
403
		return intval($resultat[0][0]);
-
 
404
	}
-
 
405
 
-
 
406
	/**
-
 
407
	 * @TODO Nombre d'utilisateurs réguliers d'Identiplante
-
 
408
	 * @REFLEXION quelle différence avec getNbUtilisateursIpActifs() ?
-
 
409
	 */
-
 
410
	private function getNbUtilisateursIpReguliers() {
-
 
411
		$requete = "";
-
 
412
		$resultat = $this->bdd->recupererTous($requete);
-
 
413
		return intval($resultat[0][0]);
-
 
414
	}
-
 
415
 
-
 
416
	/**
-
 
417
	 * @TODO Nombre d'utilisateurs d'Identiplante prenant part aux votes
-
 
418
	 */
-
 
419
	private function getNbUtilisateursIpVotant() {
-
 
420
		$requete = "";
-
 
421
		$resultat = $this->bdd->recupererTous($requete);
-
 
422
		return intval($resultat[0][0]);
-
 
423
	}
-
 
424
 
-
 
425
	/**
-
 
426
	 * @TODO Nombre de participants actifs à Identiplante (pour le mois, la semaine, l'année)
-
 
427
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
-
 
428
	 * l'activité du mois et de la semaine (on met la case à null ?)
-
 
429
	 */
-
 
430
	private function getNbUtilisateursIpActifs() {
-
 
431
		$requete = "";
-
 
432
		$resultat = $this->bdd->recupererTous($requete);
-
 
433
		return intval($resultat[0][0]);
-
 
434
	}
-
 
435
 
-
 
436
	/**
-
 
437
	 * @TODO Liste des utilisateurs ayant fait le plus de propositions, et
-
 
438
	 * le plus de propositions retenues (ou ayant atteint un consensus)
-
 
439
	 */
-
 
440
	private function getListeMeilleursProposeurs() {
-
 
441
		$liste = array();
-
 
442
		$requete = "";
-
 
443
		$resultat = $this->bdd->recupererTous($requete);
-
 
444
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
-
 
445
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
-
 
446
		// ...
-
 
447
 
-
 
448
		return array(
-
 
449
			'annee' => $this->annee,
-
 
450
			'listeMeilleursProposeurs' => $liste[0],
-
 
451
			'listeMeilleursProposeursAyantEteRetenus' => $liste[1]
-
 
452
		);
-
 
453
	}
-
 
454
 
-
 
455
	/**
-
 
456
	 * @TODO Liste des utilisateurs ayant fait le plus de votes, et le plus
-
 
457
	 * de votes sur des propositions retenues (ou ayant atteint un consensus)
-
 
458
	 */
-
 
459
	private function getListeMeilleursVoteurs() {
-
 
460
		$liste = array();
-
 
461
		$requete = "";
-
 
462
		$resultat = $this->bdd->recupererTous($requete);
-
 
463
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir service CEL stats)
-
 
464
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
-
 
465
		// ...
-
 
466
 
-
 
467
		return array(
-
 
468
			'annee' => $this->annee,
-
 
469
			'listeMeilleursVoteurs' => $liste[0],
-
 
470
			'listeMeilleursVoteursSurPropositionsRetenues' => $liste[1]
-
 
471
		);
-
 
472
	}
-
 
473
 
-
 
474
	/**
-
 
475
	 * @TODO Statistiques sur les images de Pictoflora
-
 
476
	 * @REFLEXION aucune idée de ce qu'on met dedans
-
 
477
	 */
-
 
478
	private function getImages() {
-
 
479
		return array(
-
 
480
			'annee' => $this->annee
-
 
481
		);
-
 
482
	}
-
 
483
 
-
 
484
	/**
-
 
485
	 * @TODO Statistiques sur les mots-clés de Pictoflora
-
 
486
	 * @REFLEXION aucune idée de ce qu'on met dedans
-
 
487
	 */
-
 
488
	private function getTags() {
-
 
489
		return array(
-
 
490
			'annee' => $this->annee
-
 
491
		);
-
 
492
	}
-
 
493
 
-
 
494
	/**
-
 
495
	 * @TODO Statistiques sur les utilisateurs de Pictoflora
-
 
496
	 * - Nombre total d'utilisateurs
-
 
497
	 * - Nombre d'utilisateurs réguliers
-
 
498
	 * - Nombre d'utilisateurs prenant part au taggage ?
-
 
499
	 * - Nombre de participants actifs pour le mois, la semaine, l'année
-
 
500
	 */
-
 
501
	private function getUtilisateursPf() {
-
 
502
		$nbUtilisateursActifs = $this->getNbUtilisateursPfActifs();
-
 
503
		return array(
-
 
504
			'annee' => $this->annee,
-
 
505
			'nbUtilisateursTotal' => $this->getNbUtilisateursPfTotal(),
-
 
506
			'nbUtilisateursReguliers' => $this->getNbUtilisateursPfReguliers(),
-
 
507
			'nbUtilisateursTaggant' => $this->getNbUtilisateursPfTaggant(),
-
 
508
			'nbUtilisateursActifsAnnee' => $nbUtilisateursActifs['annee'],
-
 
509
			'nbUtilisateursActifsMois' => $nbUtilisateursActifs['mois'],
-
 
510
			'nbUtilisateursActifsSemaine' => $nbUtilisateursActifs['semaine']
-
 
511
		);
-
 
512
	}
-
 
513
 
-
 
514
	/**
-
 
515
	 * @TODO Nombre total d'utilisateurs de Pictoflora
-
 
516
	 * @REFLEXION est-ce le même nombre que les utilisateurs d'Identiplante ?
-
 
517
	 */
-
 
518
	private function getNbUtilisateursPfTotal() {
-
 
519
		$requete = "";
-
 
520
		$resultat = $this->bdd->recupererTous($requete);
-
 
521
		return intval($resultat[0][0]);
-
 
522
	}
-
 
523
 
-
 
524
	/**
-
 
525
	 * @TODO Nombre d'utilisateurs réguliers de Pictoflora
-
 
526
	 * @REFLEXION quelle différence avec getNbUtilisateursPfActifs() ?
-
 
527
	 */
-
 
528
	private function getNbUtilisateursPfReguliers() {
-
 
529
		$requete = "";
-
 
530
		$resultat = $this->bdd->recupererTous($requete);
-
 
531
		return intval($resultat[0][0]);
-
 
532
	}
-
 
533
 
-
 
534
	/**
-
 
535
	 * @TODO Nombre d'utilisateurs de Pictoflora prenant part aux votes
-
 
536
	 */
-
 
537
	private function getNbUtilisateursPfTaggant() {
-
 
538
		$requete = "";
-
 
539
		$resultat = $this->bdd->recupererTous($requete);
-
 
540
		return intval($resultat[0][0]);
-
 
541
	}
-
 
542
 
-
 
543
	/**
-
 
544
	 * @TODO Nombre de participants à Pictoflora actifs (pour le mois, la semaine, l'année)
-
 
545
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
-
 
546
	 * l'activité du mois et de la semaine (on met la case à null ?)
-
 
547
	 */
-
 
548
	private function getNbUtilisateursPfActifs() {
-
 
549
		$requete = "";
-
 
550
		$resultat = $this->bdd->recupererTous($requete);
-
 
551
		return intval($resultat[0][0]);
-
 
552
	}
-
 
553
 
-
 
554
	/**
-
 
555
	 * @TODO Liste des mots-clés les plus fréquents
-
 
556
	 */
-
 
557
	private function getListeMeilleursTags() {
-
 
558
		$liste = array();
-
 
559
		$requete = "";
-
 
560
		$resultat = $this->bdd->recupererTous($requete);
-
 
561
		// Formater liste
-
 
562
		// ...
-
 
563
 
-
 
564
		return array(
-
 
565
			'annee' => $this->annee,
-
 
566
			'listeMeilleursTags' => $liste
-
 
567
		);
-
 
568
	}
-
 
569
 
-
 
570
	/**
-
 
571
	 * @TODO Liste des utilisateurs ayant ajouté le plus de mots-clés
-
 
572
	 */
-
 
573
	private function getListeMeilleursTagueurs() {
-
 
574
		$liste = array();
-
 
575
		$requete = "";
-
 
576
		$resultat = $this->bdd->recupererTous($requete);
-
 
577
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir service CEL stats)
-
 
578
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
-
 
579
		// ...
-
 
580
 
-
 
581
		return array(
-
 
582
			'annee' => $this->annee,
-
 
583
			'listeMeilleursTagueurs' => $liste
-
 
584
		);
-
 
585
	}
302
}
586
}
303
587