Subversion Repositories eFlore/Applications.del

Rev

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

Rev 2011 Rev 2013
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
		if (method_exists($this, $this->obtenirNomMethode($this->type)) === false) {
57
		if (method_exists($this, $this->obtenirNomMethode($this->type)) === false) {
58
			$erreurs[] = "Les stats de type '{$this->type}' n'existent pas.";
58
			$erreurs[] = "Les stats de type '{$this->type}' n'existent pas.";
59
		}
59
		}
60
		if (!empty($erreurs)) {
60
		if (!empty($erreurs)) {
61
			$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();
62
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
62
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
63
		}
63
		}
64
	}
64
	}
65
 
65
 
66
	/**
66
	/**
67
	 * Ouh la jolie méthode magique !!
67
	 * Ouh la jolie méthode magique !!
68
	 * @param unknown $mot
68
	 * @param unknown $mot
69
	 * @return string
69
	 * @return string
70
	 */
70
	 */
71
	private function obtenirNomMethode($mot) {
71
	private function obtenirNomMethode($mot) {
72
		$classeNom = 'get'.str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
72
		$classeNom = 'get'.str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
73
		return $classeNom;
73
		return $classeNom;
74
	}
74
	}
75
 
75
 
76
	/**
76
	/**
77
	* Prend en paramêtre un tableau de courriels et retourne après avoir intérogé un service we de l'annuaire
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 :
78
	* une tableau avec en clé le courriel et en valeur, un tableau associatif :
79
	*  - nom : le nom de l'utilisateur
79
	*  - nom : le nom de l'utilisateur
80
	*  - prenom : le pré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é
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.
82
	* @param array $courriels un tableau de courriels pour lesquels il faut recherche le prénom et nom.
83
	*/
83
	*/
84
	protected function recupererUtilisateursNomPrenom(Array $courriels) {
84
	protected function recupererUtilisateursNomPrenom(Array $courriels) {
85
		// Récupération des données au format Json
85
		// Récupération des données au format Json
86
		$service = "utilisateur/prenom-nom-par-courriel/".implode(',', $courriels);
86
		$service = "utilisateur/prenom-nom-par-courriel/".implode(',', $courriels);
87
		$url = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], $service);
87
		$url = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], $service);
88
		$json = $this->getDao()->consulter($url);
88
		$json = $this->getDao()->consulter($url);
89
		return (array) json_decode($json);
89
		return (array) json_decode($json);
90
	}
90
	}
91
 
91
 
92
	// retourne toutes les stats pour l'année spécifiée
92
	// retourne toutes les stats pour l'année spécifiée
93
	private function getTout() {
93
	private function getTout() {
94
		$obsIdentifieesFinAnneePlus = $this->getPourcentageObsIdentifieesFinAnneePlus();
94
		$obsIdentifieesFinAnneePlus = $this->getPourcentageObsIdentifieesFinAnneePlus();
95
		$participants = $this->getParticipants();
95
		$participants = $this->getParticipants();
96
 
96
 
97
		return array(
97
		return array(
98
			'annee' => $this->annee,
98
			'annee' => $this->annee,
99
			'moyenneObsSansNomParMois' => $this->getMoyenneObsSansNomParMois(),
99
			'moyenneObsSansNomParMois' => $this->getMoyenneObsSansNomParMois(),
100
			'moyenneObsIdentifieesParMois' => $this->getMoyenneObsIdentifieesParMois(),
100
			'moyenneObsIdentifieesParMois' => $this->getMoyenneObsIdentifieesParMois(),
101
			'pourcentageObsIdentifieesEnFinDAnnee' => $this->getPourcentageObsIdentifieesFinAnnee(),
101
			'pourcentageObsIdentifieesEnFinDAnnee' => $this->getPourcentageObsIdentifieesFinAnnee(),
102
			'pourcentageObsIdentifieesEnFinDAnneePlusPlus' => $obsIdentifieesFinAnneePlus['pourcentage'],
102
			'pourcentageObsIdentifieesEnFinDAnneePlusPlus' => $obsIdentifieesFinAnneePlus['pourcentage'],
103
			'moyenneActionsParJour' => $this->getMoyenneActionsParJour(),
103
			'moyenneActionsParJour' => $this->getMoyenneActionsParJour(),
104
			'personnesEnvoyantUnePropositionParMois' => $participants['nombre']
104
			'personnesEnvoyantUnePropositionParMois' => $participants['nombre']
105
		);
105
		);
106
	}
106
	}
107
 
107
 
108
	// proxy pour le widget de stats
108
	// proxy pour le widget de stats
109
	private function getObservations() {
109
	private function getObservations() {
110
		return $this->getTout();
110
		return $this->getTout();
111
	}
111
	}
112
 
112
 
113
	// 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
114
	private function getMoyenneObsSansNomParMois() {
114
	private function getMoyenneObsSansNomParMois() {
115
		$sqlTableTmp = "SELECT COUNT(*) AS compte, ".
115
		$sqlTableTmp = "SELECT COUNT(*) AS compte, ".
116
			"	CONCAT(YEAR(date_transmission),'-',MONTH(date_transmission)) AS anneemois ".
116
			"	CONCAT(YEAR(date_transmission),'-',MONTH(date_transmission)) AS anneemois ".
117
			"FROM del_observation ".
117
			"FROM del_observation ".
118
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
118
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
119
				"OR certitude = 'aDeterminer' ".
119
				"OR certitude = 'aDeterminer' ".
120
				"OR certitude = 'douteux' ".
120
				"OR certitude = 'douteux' ".
121
				// 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)
122
				"OR nom_sel_nn IS NULL ".
122
				"OR nom_sel_nn IS NULL ".
123
				"OR nom_sel_nn = 0 ".
123
				"OR nom_sel_nn = 0 ".
124
				"OR id_observation IN ({$this->getSqlObsSansNom()}) ".
124
				"OR id_observation IN ({$this->getSqlObsSansNom()}) ".
125
			') '.
125
			') '.
126
			(($this->annee !== null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
126
			(($this->annee !== null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
127
			'GROUP BY anneemois '.
127
			'GROUP BY anneemois '.
128
			'ORDER BY anneemois DESC ';
128
			'ORDER BY anneemois DESC ';
129
 
129
 
130
		$requete = "SELECT AVG(parMois.compte) AS moyenne FROM ($sqlTableTmp) AS parMois ".
130
		$requete = "SELECT AVG(parMois.compte) AS moyenne FROM ($sqlTableTmp) AS parMois ".
131
			' -- '.__FILE__.' : '.__LINE__;
131
			' -- '.__FILE__.' : '.__LINE__;
132
		$resultat = $this->bdd->recupererTous($requete);
132
		$resultat = $this->bdd->recupererTous($requete);
133
		return intval($resultat[0]['moyenne']);
133
		return intval($resultat[0]['moyenne']);
134
	}
134
	}
135
 
135
 
136
	private function getSqlObsSansNom() {
136
	private function getSqlObsSansNom() {
137
		$sqlObsSansNom = "SELECT DISTINCT ce_observation ".
137
		$sqlObsSansNom = "SELECT DISTINCT ce_observation ".
138
			"FROM del_commentaire ".
138
			"FROM del_commentaire ".
139
			"WHERE proposition_initiale = 1 ".
139
			"WHERE proposition_initiale = 1 ".
140
			"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ";
140
			"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ";
141
		return $sqlObsSansNom;
141
		return $sqlObsSansNom;
142
	}
142
	}
143
 
143
 
144
	// 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"
145
	// 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)
146
	private function getMoyenneObsIdentifieesParMois() {
146
	private function getMoyenneObsIdentifieesParMois() {
147
		// 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"
148
		$sqlTableTmp1 = "SELECT COUNT(*), MAX(dcv.date) AS maxdate ".
148
		$sqlTableTmp1 = "SELECT COUNT(*), MAX(dcv.date) AS maxdate ".
149
			"FROM del_commentaire AS dc ".
149
			"FROM del_commentaire AS dc ".
150
			"	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 ".
151
			" WHERE proposition_retenue = 1 ".
151
			" WHERE proposition_retenue = 1 ".
152
			" GROUP BY dc.id_commentaire ".
152
			" GROUP BY dc.id_commentaire ".
153
			(($this->annee !== null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '');
153
			(($this->annee !== null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '');
154
 
154
 
155
		$sqlTableTmp2 = 'SELECT COUNT(*) AS valideesparmois, '.
155
		$sqlTableTmp2 = 'SELECT COUNT(*) AS valideesparmois, '.
156
			"	CONCAT(YEAR(maxdate), '-', MONTH(maxdate)) AS anneemois ".
156
			"	CONCAT(YEAR(maxdate), '-', MONTH(maxdate)) AS anneemois ".
157
			"FROM ($sqlTableTmp1) AS temp ".
157
			"FROM ($sqlTableTmp1) AS temp ".
158
			"GROUP BY anneemois ";
158
			"GROUP BY anneemois ";
159
 
159
 
160
		$requete = "SELECT AVG(valideesparmois) AS moyenne FROM ($sqlTableTmp2) AS temp2 ".
160
		$requete = "SELECT AVG(valideesparmois) AS moyenne FROM ($sqlTableTmp2) AS temp2 ".
161
			' -- '.__FILE__.' : '.__LINE__;
161
			' -- '.__FILE__.' : '.__LINE__;
162
 
162
 
163
		$resultat = $this->bdd->recupererTous($requete);
163
		$resultat = $this->bdd->recupererTous($requete);
164
		return intval($resultat[0]['moyenne']);
164
		return intval($resultat[0]['moyenne']);
165
	}
165
	}
166
 
166
 
167
	// 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)
168
	// @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
169
	// 		consensus, mais qui datent des années précédentes
169
	// 		consensus, mais qui datent des années précédentes
170
	// @ACHTUNG mache pas, dépasse les 100% (voir Wiki)
170
	// @ACHTUNG mache pas, dépasse les 100% (voir Wiki)
171
	private function getPourcentageObsIdentifieesFinAnneePlus() {
171
	private function getPourcentageObsIdentifieesFinAnneePlus() {
172
		// Obs ayant atteint un consensus cette année
172
		// Obs ayant atteint un consensus cette année
173
		$requete = "SELECT COUNT(*) AS nombre ".
173
		$requete = "SELECT COUNT(*) AS nombre ".
174
			"FROM (SELECT id_observation, id_commentaire, id_vote, nbvotes ".
174
			"FROM (SELECT id_observation, id_commentaire, id_vote, nbvotes ".
175
			"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 ".
176
			"FROM del_commentaire AS dc ".
176
			"FROM del_commentaire AS dc ".
177
			"	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) ".
178
			"	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) ".
179
			"AND dcv.valeur = 1 ".
179
			"AND dcv.valeur = 1 ".
180
			"AND dc.proposition_retenue = 0 ".
180
			"AND dc.proposition_retenue = 0 ".
181
			"GROUP BY dc.id_commentaire ".
181
			"GROUP BY dc.id_commentaire ".
182
			(($this->annee != null) ? " HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
182
			(($this->annee != null) ? " HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
183
			" ) AS temp ".
183
			" ) AS temp ".
184
			"GROUP BY id_observation ".
184
			"GROUP BY id_observation ".
185
			") AS temp2 ".
185
			") AS temp2 ".
186
			' -- '.__FILE__.' : '.__LINE__;
186
			' -- '.__FILE__.' : '.__LINE__;
187
		$obsEnConsensus = $this->bdd->recupererTous($requete);
187
		$obsEnConsensus = $this->bdd->recupererTous($requete);
188
		$oc = intval($obsEnConsensus[0]['nombre']);
188
		$oc = intval($obsEnConsensus[0]['nombre']);
189
 
189
 
190
		// Obs ayant une "proposition retenue" cette année
190
		// Obs ayant une "proposition retenue" cette année
191
		$requete = "SELECT COUNT(*) AS nombre ".
191
		$requete = "SELECT COUNT(*) AS nombre ".
192
			"FROM (SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
192
			"FROM (SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
193
			"FROM del_commentaire AS dc ".
193
			"FROM del_commentaire AS dc ".
194
			"	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) ".
195
			"	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) ".
196
			"WHERE proposition_retenue = 1 ".
196
			"WHERE proposition_retenue = 1 ".
197
			(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
197
			(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
198
			"GROUP BY dc.id_commentaire ".
198
			"GROUP BY dc.id_commentaire ".
199
			(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
199
			(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
200
			") as temp ".
200
			") as temp ".
201
			' -- '.__FILE__.' : '.__LINE__;
201
			' -- '.__FILE__.' : '.__LINE__;
202
		$nbObsValidees = $this->bdd->recupererTous($requete);
202
		$nbObsValidees = $this->bdd->recupererTous($requete);
203
		$ov = intval($nbObsValidees[0]['nombre']);
203
		$ov = intval($nbObsValidees[0]['nombre']);
204
 
204
 
205
		// Nombre d'obs sans nom soumises cette année
205
		// Nombre d'obs sans nom soumises cette année
206
		$requete = "SELECT COUNT(*) AS nombre ".
206
		$requete = "SELECT COUNT(*) AS nombre ".
207
			"FROM del_observation ".
207
			"FROM del_observation ".
208
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
208
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
209
			"OR certitude = 'aDeterminer' ".
209
			"OR certitude = 'aDeterminer' ".
210
			"OR certitude = 'douteux' ".
210
			"OR certitude = 'douteux' ".
211
			"OR nom_sel_nn IS NULL ".
211
			"OR nom_sel_nn IS NULL ".
212
			"OR nom_sel_nn = 0 ".
212
			"OR nom_sel_nn = 0 ".
213
			"OR id_observation IN ({$this->getSqlObsSansNom()})".
213
			"OR id_observation IN ({$this->getSqlObsSansNom()})".
214
			') '.
214
			') '.
215
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
215
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
216
			' -- '.__FILE__.' : '.__LINE__;
216
			' -- '.__FILE__.' : '.__LINE__;
217
		$nbObsSansNom = $this->bdd->recupererTous($requete);
217
		$nbObsSansNom = $this->bdd->recupererTous($requete);
218
		$osn = intval($nbObsSansNom[0]['nombre']);
218
		$osn = intval($nbObsSansNom[0]['nombre']);
219
 
219
 
220
		return array(
220
		return array(
221
			'observationsEnConsensus' => $oc,
221
			'observationsEnConsensus' => $oc,
222
			'observationsValidees' => $ov,
222
			'observationsValidees' => $ov,
223
			'observationsSansNom' => $osn,
223
			'observationsSansNom' => $osn,
224
			'pourcentage' => ($osn == 0 ? 0 : round(((($oc + $ov) / $osn) * 100), 2))
224
			'pourcentage' => ($osn == 0 ? 0 : round(((($oc + $ov) / $osn) * 100), 2))
225
		);
225
		);
226
	}
226
	}
227
 
227
 
228
	private function getPourcentageObsIdentifieesFinAnnee() {
228
	private function getPourcentageObsIdentifieesFinAnnee() {
229
		$requete = "SELECT ( ".
229
		$requete = "SELECT ( ".
230
			"SELECT COUNT(*) FROM ( ".
230
			"SELECT COUNT(*) FROM ( ".
231
				"SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
231
				"SELECT COUNT(DISTINCT id_observation), MAX(dcv.date) AS maxdate ".
232
				"FROM del_commentaire AS dc ".
232
				"FROM del_commentaire AS dc ".
233
				"	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) ".
234
				"	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) ".
235
				"WHERE proposition_retenue = 1 ".
235
				"WHERE proposition_retenue = 1 ".
236
				(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
236
				(($this->annee != null) ? "AND YEAR(do.date_transmission) = '{$this->annee}' " : '').
237
				"GROUP BY dc.id_commentaire ".
237
				"GROUP BY dc.id_commentaire ".
238
				(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
238
				(($this->annee != null) ? "HAVING MAX(YEAR(dcv.date)) = '{$this->annee}' " : '').
239
			") AS temp)".
239
			") AS temp)".
240
			" / ".
240
			" / ".
241
			"(SELECT COUNT(*) ".
241
			"(SELECT COUNT(*) ".
242
			"FROM del_observation ".
242
			"FROM del_observation ".
243
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
243
			"WHERE (mots_cles_texte LIKE '%aDeterminer%' ".
244
			"OR certitude = 'aDeterminer' ".
244
			"OR certitude = 'aDeterminer' ".
245
			"OR certitude = 'douteux' ".
245
			"OR certitude = 'douteux' ".
246
			"OR nom_sel_nn IS NULL ".
246
			"OR nom_sel_nn IS NULL ".
247
			"OR nom_sel_nn = 0 ".
247
			"OR nom_sel_nn = 0 ".
248
				"OR id_observation IN ( ".
248
				"OR id_observation IN ( ".
249
				"SELECT DISTINCT ce_observation ".
249
				"SELECT DISTINCT ce_observation ".
250
				"FROM del_commentaire ".
250
				"FROM del_commentaire ".
251
				"WHERE proposition_initiale = 1 ".
251
				"WHERE proposition_initiale = 1 ".
252
				"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ".
252
				"AND (nom_sel_nn IS NULL OR nom_sel_nn = '') ".
253
				") ".
253
				") ".
254
			") ".
254
			") ".
255
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
255
			(($this->annee != null) ? "AND YEAR(date_transmission) = '{$this->annee}' " : '').
256
		") * 100 AS pourcentage ".
256
		") * 100 AS pourcentage ".
257
		' -- '.__FILE__.' : '.__LINE__;
257
		' -- '.__FILE__.' : '.__LINE__;
258
		$resultat = $this->bdd->recupererTous($requete);
258
		$resultat = $this->bdd->recupererTous($requete);
259
		return floatval($resultat[0]['pourcentage']);
259
		return floatval($resultat[0]['pourcentage']);
260
	}
260
	}
261
 
261
 
262
	// 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
263
	private function getMoyenneActionsParJour() {
263
	private function getMoyenneActionsParJour() {
264
		// nombre de commentaires sur l'année
264
		// nombre de commentaires sur l'année
265
		$sqlNbreCommentaires = 'SELECT COUNT(*) FROM del_commentaire '.
265
		$sqlNbreCommentaires = 'SELECT COUNT(*) FROM del_commentaire '.
266
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
266
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
267
 
267
 
268
		// nombre de votes sur l'année
268
		// nombre de votes sur l'année
269
		$sqlNbreVotes = 'SELECT COUNT(*) FROM del_commentaire_vote '.
269
		$sqlNbreVotes = 'SELECT COUNT(*) FROM del_commentaire_vote '.
270
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
270
			($this->annee != null ? "WHERE YEAR(date) = '{$this->annee}' " : '');
271
 
271
 
272
		// nombre de jours écoulés dans l'année*
272
		// nombre de jours écoulés dans l'année*
273
		$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 ";
274
		if ($this->annee != null) {
274
		if ($this->annee != null) {
275
			$sqlNbreJours = "SELECT IF(YEAR(CURDATE()) = '{$this->annee}', DAYOFYEAR(CURDATE()), 365) ";
275
			$sqlNbreJours = "SELECT IF(YEAR(CURDATE()) = '{$this->annee}', DAYOFYEAR(CURDATE()), 365) ";
276
		}
276
		}
277
 
277
 
278
		// nombre d'actions / nombre de jours
278
		// nombre d'actions / nombre de jours
279
		$requete = "SELECT ((($sqlNbreCommentaires) + ($sqlNbreVotes)) / ($sqlNbreJours)) AS moyenne ".
279
		$requete = "SELECT ((($sqlNbreCommentaires) + ($sqlNbreVotes)) / ($sqlNbreJours)) AS moyenne ".
280
			' -- '.__FILE__.' : '.__LINE__;
280
			' -- '.__FILE__.' : '.__LINE__;
281
 
281
 
282
		$resultat = $this->bdd->recupererTous($requete);
282
		$resultat = $this->bdd->recupererTous($requete);
283
		return intval($resultat[0]['moyenne']);
283
		return intval($resultat[0]['moyenne']);
284
	}
284
	}
285
 
285
 
286
	// 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
287
	private function getParticipants() {
287
	private function getParticipants() {
288
		// Faire la moyenne par utilisateur et par mois
288
		// Faire la moyenne par utilisateur et par mois
289
		$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 ".
290
			"FROM ".
290
			"FROM ".
291
				// 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
292
				"(SELECT COUNT(*) as somme, CONCAT(YEAR(date),'-',MONTH(date)) AS anneemois, ".
292
				"(SELECT COUNT(*) as somme, CONCAT(YEAR(date),'-',MONTH(date)) AS anneemois, ".
293
				"ce_utilisateur, utilisateur_courriel, id_commentaire ".
293
				"ce_utilisateur, utilisateur_courriel, id_commentaire ".
294
				"FROM del_commentaire ".
294
				"FROM del_commentaire ".
295
				"WHERE ce_proposition = '' ".
295
				"WHERE ce_proposition = '' ".
296
				"AND nom_sel_nn != '' ".
296
				"AND nom_sel_nn != '' ".
297
				"AND nom_sel_nn IS NOT NULL ".
297
				"AND nom_sel_nn IS NOT NULL ".
298
				(($this->annee != null) ? " AND YEAR(date) = '{$this->annee}' " : '').
298
				(($this->annee != null) ? " AND YEAR(date) = '{$this->annee}' " : '').
299
				"GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) AS ppm, ".
299
				"GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) AS ppm, ".
300
			// 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
301
			// 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).
302
				"(SELECT COUNT(distinct CONCAT(YEAR(date),'-',MONTH(date))) AS nbmois ".
302
				"(SELECT COUNT(distinct CONCAT(YEAR(date),'-',MONTH(date))) AS nbmois ".
303
				"FROM del_commentaire ".
303
				"FROM del_commentaire ".
304
				"WHERE ce_proposition = '' ".
304
				"WHERE ce_proposition = '' ".
305
				(($this->annee != null) ? "AND YEAR(date) = '{$this->annee}' " : '').
305
				(($this->annee != null) ? "AND YEAR(date) = '{$this->annee}' " : '').
306
				"AND nom_sel_nn != '' ".
306
				"AND nom_sel_nn != '' ".
307
				"AND nom_sel_nn IS NOT NULL) AS cal ".
307
				"AND nom_sel_nn IS NOT NULL) AS cal ".
308
			"GROUP BY ce_utilisateur, utilisateur_courriel ".
308
			"GROUP BY ce_utilisateur, utilisateur_courriel ".
309
			"HAVING SUM(somme) / cal.nbmois >= 1 ".
309
			"HAVING SUM(somme) / cal.nbmois >= 1 ".
310
			"ORDER BY moyenne ".
310
			"ORDER BY moyenne ".
311
			' -- '.__FILE__.' : '.__LINE__;
311
			' -- '.__FILE__.' : '.__LINE__;
312
 
312
 
313
		$resultat = $this->bdd->recupererTous($requete);
313
		$resultat = $this->bdd->recupererTous($requete);
314
		$cpt = count($resultat);
314
		$cpt = count($resultat);
315
		$retour = array(
315
		$retour = array(
316
			'nombre' => intval($cpt),
316
			'nombre' => intval($cpt),
317
			'donnees' => $resultat
317
			'donnees' => $resultat
318
		);
318
		);
319
		return $retour;
319
		return $retour;
320
	}
320
	}
321
 
321
 
322
	/**
322
	/**
323
	 * Statistiques sur les propositions et les votes
323
	 * Statistiques sur les propositions, les commentaires et les votes
-
 
324
	 * "MPM" = moyenne par mois
-
 
325
	 * - Nombre de votes
-
 
326
	 * - Nombre de commentaires
-
 
327
	 * - Nombre d'actions par jour
-
 
328
	 * - Nombres de propositions sur toutes les obs
324
	 * - Nombre de propositions faites (au total et sur les derniers 15 jours)
329
	 * - Nombres de propositions retenues sur toutes les obs
325
	 * - Nombre de propositions validées(au total et sur le dernier mois)
330
	 * - Nombres de propositions en consensus sur toutes les obs
-
 
331
	 * - Nombres de propositions sur les obs d'une année
326
	 * - Nombres de votes (au total et sur les derniers 15 jours)
332
	 * - Nombres de propositions retenues sur les obs d'une année
-
 
333
	 * - Nombres de propositions en consensus sur les obs d'une année
327
	 */
334
	 */
328
	private function getPropositions() {
335
	private function getPropositions() {
329
		$nbPropositions = $this->getNbPropositions();
-
 
330
		$nbPropositionsValidees = $this->getNbPropositionsValidees();
-
 
331
		$votes = $this->getNbVotes();
-
 
332
		return array(
336
		return array(
333
			'annee' => $this->annee,
337
			'nbVotes' => $this->getNbVotes(),
-
 
338
			'nbVotesMPM' => $this->getNbVotes(true),
-
 
339
			'nbMoyenActionsParJour' => $this->getNbMoyenActionsParJour(),
-
 
340
			'nbCommentaires' => $this->getNbCommentaires(),
-
 
341
			'nbCommentairesMPM' => $this->getNbCommentaires(true),
334
			'nbPropositionsTotal' => $nbPropositions[0],
342
			'nbPropositionsToutesObs' => $this->getNbPropositionsToutesObs(),
335
			'nbPropositions15J' => $nbPropositions[1],
343
			'nbPropositionsToutesObsMPM' => $this->getNbPropositionsToutesObs(true),
-
 
344
			'nbPropositionsRetenuesToutesObs' => $this->getNbPropositionsRetenuesToutesObs(),
-
 
345
			'nbPropositionsRetenuesToutesObsMPM' => $this->getNbPropositionsRetenuesToutesObs(true),
-
 
346
			'nbPropositionsConsensusToutesObs' => null, //$this->getNbPropositionsConsensusToutesObs(),
-
 
347
			'nbPropositionsConsensusToutesObsMPM' => null, //$this->getNbPropositionsConsensusToutesObs(true),
336
			'nbPropositionsValidees' => $nbPropositionsValidees[0],
348
			'nbPropositionsObsAnnee' => $this->getNbPropositionsObsAnnee(),
337
			'nbPropositionsValidees15J' => $nbPropositionsValidees[1],
349
			'nbPropositionsObsAnneeMPM' => $this->getNbPropositionsObsAnnee(true),
338
			'nbVotes' => $votes[0],
350
			'nbPropositionsRetenuesObsAnnee' => $this->getNbPropositionsRetenuesObsAnnee(),
339
			'nbVotes15J' => $votes[1]
351
			'nbPropositionsRetenuesObsAnneeMPM' => $this->getNbPropositionsRetenuesObsAnnee(true),
-
 
352
			'nbPropositionsConsensusObsAnnee' => null, //$this->getNbPropositionsConsensusObsAnnee(),
-
 
353
			'nbPropositionsConsensusObsAnneeMPM' => null //$this->getNbPropositionsConsensusObsAnnee(true),
340
		);
354
		);
341
	}
355
	}
342
 
356
 
343
	/**
357
	/**
344
	 * @TODO Nombre de proposition faites (au total et sur les derniers 15 jours)
358
	 * Nombre moyen d'actions par jour (commentaire, proposition, vote)
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
	 */
359
	 */
348
	private function getNbPropositionsTotal() {
360
	private function getNbMoyenActionsParJour() {
-
 
361
		$requete = "SELECT (SELECT (SELECT count(*) FROM del_commentaire";
-
 
362
		if ($this->annee != null) {
-
 
363
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
-
 
364
		}
-
 
365
		$requete .= ") +  (SELECT count(*) FROM del_commentaire_vote";
-
 
366
		if ($this->annee != null) {
-
 
367
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
-
 
368
		}
-
 
369
		$requete .= ") +  (SELECT count(*) FROM del_commentaire";
-
 
370
		if ($this->annee != null) {
-
 
371
			$requete .= ' WHERE YEAR(date_validation) = ' . $this->annee;
-
 
372
		}
-
 
373
		$requete .= ")) / (";
-
 
374
		if ($this->annee != null) {
-
 
375
			$requete .= "SELECT IF( YEAR(CURDATE()) = " . $this->annee . ", DAYOFYEAR(CURDATE()), 365) ";
-
 
376
		} else {
-
 
377
			$requete .= "365";
-
 
378
		}
349
		$requete = "";
379
		$requete .= ")";
350
		$resultat = $this->bdd->recupererTous($requete);
380
		$resultat = $this->bdd->recupererTous($requete);
351
		return intval($resultat[0][0]);
381
		return intval(array_pop($resultat[0]));
352
	}
382
	}
353
 
383
 
354
	/**
384
	/**
355
	 * @TODO Nombre de proposition validées (au total et sur les derniers 15 jours)
385
	 * Nombre de proposition faites sur toutes les observations
-
 
386
	 */
-
 
387
	private function getNbPropositionsToutesObs($mpm=false) {
-
 
388
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE";
-
 
389
		if ($this->annee != null) {
-
 
390
			$requete .= ' YEAR(date) = ' . $this->annee . " AND";
-
 
391
		}
356
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
392
		$requete .= " (`nom_sel_nn` IS NOT NULL OR `nom_sel_nn` != '') AND `proposition_initiale` = 0";
-
 
393
		if ($mpm) {
-
 
394
			$requete = $this->encapsulerMPM($requete);
-
 
395
		}
-
 
396
		$resultat = $this->bdd->recupererTous($requete);
-
 
397
		return intval(array_pop($resultat[0]));
-
 
398
	}
-
 
399
 
-
 
400
	/**
357
	 * l'activité des 15 derniers jours (on met la case à null ?)
401
	 * Nombre de proposition retenues faites sur toutes les observations
358
	 */
402
	 */
359
	private function getNbPropositionsValidees() {
403
	private function getNbPropositionsRetenuesToutesObs($mpm=false) {
-
 
404
		$requete = "SELECT COUNT(DISTINCT id_commentaire) AS nb_total FROM del_commentaire WHERE";
-
 
405
		if ($this->annee != null) {
-
 
406
			$requete .= ' YEAR(date) = ' . $this->annee . " AND";
-
 
407
		}
-
 
408
		$requete .= " proposition_retenue = 1";
-
 
409
		if ($mpm) {
-
 
410
			$requete = $this->encapsulerMPM($requete);
-
 
411
		}
-
 
412
		$resultat = $this->bdd->recupererTous($requete);
-
 
413
		return intval(array_pop($resultat[0]));
-
 
414
	}
-
 
415
 
-
 
416
	/**
-
 
417
	 * @TODO Nombre de proposition en consensus faites sur toutes les observations
-
 
418
	 */
-
 
419
	private function getNbPropositionsConsensusToutesObs($mpm=false) {
360
		$requete = "";
420
		$requete = "";
361
		$resultat = $this->bdd->recupererTous($requete);
421
		$resultat = $this->bdd->recupererTous($requete);
362
		return intval($resultat[0][0]);
422
		return intval($resultat[0][0]);
363
	}
423
	}
364
 
424
 
365
	/**
425
	/**
366
	 * @TODO Nombre de votes (au total et sur les derniers 15 jours)
426
	 * Nombre de proposition faites sur les observations d'une année
-
 
427
	 */
-
 
428
	private function getNbPropositionsObsAnnee($mpm=false) {
-
 
429
		if ($this->annee == null) {
-
 
430
			return null;
-
 
431
		}
-
 
432
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE YEAR(date) = " . $this->annee . " AND "
-
 
433
			. "(`nom_sel_nn` IS NOT NULL OR `nom_sel_nn` != '') AND `proposition_initiale` = 0 AND ce_observation in"
-
 
434
			. " (SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ")";
-
 
435
		if ($mpm) {
-
 
436
			$requete = $this->encapsulerMPM($requete);
-
 
437
		}
-
 
438
		$resultat = $this->bdd->recupererTous($requete);
-
 
439
		return intval(array_pop($resultat[0]));
-
 
440
	}
-
 
441
 
-
 
442
	/**
367
	 * @REFLEXION retourner un array ? Si on demande une année spécifique, comment calculer
443
	 * Nombre de proposition retenues faites sur les observations d'une année
-
 
444
	 */
-
 
445
	private function getNbPropositionsRetenuesObsAnnee($mpm=false) {
-
 
446
		if ($this->annee == null) {
-
 
447
			return null;
-
 
448
		}
-
 
449
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM `del_commentaire` WHERE YEAR(date) = " . $this->annee . " AND "
-
 
450
			. "`proposition_retenue` = 1 AND ce_observation in (SELECT `id_observation` FROM `del_observation` WHERE year(date_transmission) = " . $this->annee . ")";
-
 
451
		if ($mpm) {
-
 
452
			$requete = $this->encapsulerMPM($requete);
-
 
453
		}
-
 
454
		$resultat = $this->bdd->recupererTous($requete);
-
 
455
		return intval(array_pop($resultat[0]));
-
 
456
	}
-
 
457
 
-
 
458
	/**
368
	 * l'activité des 15 derniers jours (on met la case à null ?)
459
	 * @TODO Nombre de proposition en consensus faites sur les observations d'une année
369
	 */
460
	 */
370
	private function getNbVotes() {
461
	private function getNbPropositionsConsensusObsAnnee($mpm=false) {
371
		$requete = "";
462
		$requete = "";
372
		$resultat = $this->bdd->recupererTous($requete);
463
		$resultat = $this->bdd->recupererTous($requete);
373
		return intval($resultat[0][0]);
464
		return intval($resultat[0][0]);
374
	}
465
	}
375
 
466
 
376
	/**
467
	/**
-
 
468
	 * Nombre de votes
-
 
469
	 */
-
 
470
	private function getNbVotes($mpm=false) {
-
 
471
		$requete = "SELECT COUNT(DISTINCT `id_vote`) AS nb_total FROM del_commentaire_vote";
-
 
472
		if ($this->annee != null) {
-
 
473
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
-
 
474
		}
-
 
475
		if ($mpm) {
-
 
476
			$requete = $this->encapsulerMPM($requete);
-
 
477
		}
-
 
478
		$resultat = $this->bdd->recupererTous($requete);
-
 
479
		return intval(array_pop($resultat[0]));
-
 
480
	}
-
 
481
 
-
 
482
	/**
-
 
483
	 * Nombre de commentaires
-
 
484
	 */
-
 
485
	private function getNbCommentaires($mpm=false) {
-
 
486
		$requete = "SELECT COUNT(DISTINCT `id_commentaire`) AS nb_total FROM del_commentaire WHERE `ce_proposition` != '' AND (`nom_sel` IS NULL OR `nom_sel` = '')";
-
 
487
		if ($this->annee != null) {
-
 
488
			$requete .= ' AND YEAR(date) = ' . $this->annee;
-
 
489
		}
-
 
490
		if ($mpm) {
-
 
491
			$requete = $this->encapsulerMPM($requete);
-
 
492
		}
-
 
493
		$resultat = $this->bdd->recupererTous($requete);
-
 
494
		return intval(array_pop($resultat[0]));
-
 
495
	}
-
 
496
 
-
 
497
	/**
377
	 * Statistiques sur les utilisateurs d'Identiplante
498
	 * Statistiques sur les utilisateurs d'Identiplante
-
 
499
	 * "AF" = ayant fait un(e)
-
 
500
	 * "MPM" = moyenne par mois
378
	 * - Nombre total d'utilisateurs
501
	 * - Nombre total d'utilisateurs
379
	 * - Nombre d'utilisateurs réguliers
502
	 * - Nombre d'utilisateurs ayant fait une proposition
380
	 * - Nombre d'utilisateurs prenant part aux votes
503
	 * - Nombre d'utilisateurs ayant fait un vote
381
	 * - Nombre de participants actifs pour le mois, la semaine, l'année
504
	 * - Nombre d'utilisateurs ayant fait un commentaire
382
	 */
505
	 */
383
	private function getUtilisateursIp() {
506
	private function getUtilisateursIp() {
384
		$nbUtilisateursActifs = $this->getNbUtilisateursIpActifs();
-
 
385
		return array(
507
		return array(
386
			'annee' => $this->annee,
-
 
387
			'nbUtilisateursTotal' => $this->getNbUtilisateursIpTotal(),
508
			'nbUtilisateursTotal' => $this->getNbUtilisateursIpTotal(),
-
 
509
			'nbUtilisateursAFProposition' => $this->getNbUtilisateursAFProposition(),
388
			'nbUtilisateursReguliers' => $this->getNbUtilisateursIpReguliers(),
510
			'nbUtilisateursAFCommentaire' => $this->getNbUtilisateursAFCommentaire(),
389
			'nbUtilisateursVotant' => $this->getNbUtilisateursIpVotant(),
511
			'nbUtilisateursAFVote' => $this->getNbUtilisateursAFVote(),
390
			'nbUtilisateursActifsAnnee' => $nbUtilisateursActifs['annee'],
512
			'nbUtilisateursAnonymesAFVote' => $this->getNbUtilisateursAnonymesAFVote(),
-
 
513
			'nbUtilisateursAFPropositionMPM' => $this->getNbUtilisateursAFProposition(true),
-
 
514
			'nbUtilisateursAFCommentaireMPM' => $this->getNbUtilisateursAFCommentaire(true),
391
			'nbUtilisateursActifsMois' => $nbUtilisateursActifs['mois'],
515
			'nbUtilisateursAFVoteMPM' => $this->getNbUtilisateursAFVote(true),
392
			'nbUtilisateursActifsSemaine' => $nbUtilisateursActifs['semaine']
516
			'nbUtilisateursAnonymesAFVoteMPM' => $this->getNbUtilisateursAnonymesAFVote(true),
393
		);
517
		);
394
	}
518
	}
395
 
519
 
396
	/**
520
	/**
397
	 * @TODO Nombre total d'utilisateurs d'Identiplante
521
	 * Nombre total d'utilisateurs d'Identiplante
398
	 * @REFLEXION est-ce le même nombre que les utilisateurs d'Identiplante ?
-
 
399
	 */
522
	 */
400
	private function getNbUtilisateursIpTotal() {
523
	private function getNbUtilisateursIpTotal() {
-
 
524
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total  FROM del_commentaire";
401
		$requete = "";
525
		if ($this->annee != null) {
-
 
526
			$requete .= ' WHERE YEAR(date) = ' . $this->annee;
-
 
527
		}
402
		$resultat = $this->bdd->recupererTous($requete);
528
		$resultat = $this->bdd->recupererTous($requete);
403
		return intval($resultat[0][0]);
529
		return intval(array_pop($resultat[0]));
404
	}
530
	}
405
 
531
 
406
	/**
532
	/**
407
	 * @TODO Nombre d'utilisateurs réguliers d'Identiplante
533
	 * Nombre d'utilisateurs d'Identiplante ayant fait au moins une proposition
408
	 * @REFLEXION quelle différence avec getNbUtilisateursIpActifs() ?
-
 
409
	 */
534
	 */
410
	private function getNbUtilisateursIpReguliers() {
535
	private function getNbUtilisateursAFProposition($mpm=false) {
-
 
536
		$requete = "SELECT COUNT(DISTINCT `utilisateur_courriel`) AS nb_total FROM del_commentaire WHERE `ce_proposition` = '' AND `nom_sel` IS NOT NULL AND `nom_sel` != ''";
-
 
537
		if ($this->annee != null) {
-
 
538
			$requete .= ' AND YEAR(date) = ' . $this->annee;
-
 
539
		}
411
		$requete = "";
540
		if ($mpm) {
-
 
541
			$requete = $this->encapsulerMPM($requete);
-
 
542
		}
412
		$resultat = $this->bdd->recupererTous($requete);
543
		$resultat = $this->bdd->recupererTous($requete);
413
		return intval($resultat[0][0]);
544
		return intval(array_pop($resultat[0]));
414
	}
545
	}
415
 
546
 
416
	/**
547
	/**
417
	 * @TODO Nombre d'utilisateurs d'Identiplante prenant part aux votes
548
	 * Nombre d'utilisateurs d'Identiplante ayant fait au moins un commentaire
418
	 */
549
	 */
419
	private function getNbUtilisateursIpVotant() {
550
	private function getNbUtilisateursAFCommentaire($mpm=false) {
-
 
551
		$requete = "SELECT COUNT(DISTINCT `utilisateur_courriel`) AS nb_total FROM del_commentaire WHERE `ce_proposition` != '' AND (`nom_sel` IS NULL OR `nom_sel` = '')";
-
 
552
		if ($this->annee != null) {
-
 
553
			$requete .= ' AND YEAR(date) = ' . $this->annee;
-
 
554
		}
420
		$requete = "";
555
		if ($mpm) {
-
 
556
			$requete = $this->encapsulerMPM($requete);
-
 
557
		}
421
		$resultat = $this->bdd->recupererTous($requete);
558
		$resultat = $this->bdd->recupererTous($requete);
422
		return intval($resultat[0][0]);
559
		return intval(array_pop($resultat[0]));
423
	}
560
	}
424
 
561
 
425
	/**
562
	/**
426
	 * @TODO Nombre de participants actifs à Identiplante (pour le mois, la semaine, l'année)
563
	 * Nombre d'utilisateurs d'Identiplante identifiés prenant part aux votes
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
	 */
564
	 */
430
	private function getNbUtilisateursIpActifs() {
565
	private function getNbUtilisateursAFVote($mpm=false) {
-
 
566
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_commentaire_vote WHERE ce_utilisateur REGEXP '^-?[0-9]+$'";
-
 
567
		if ($this->annee != null) {
-
 
568
			$requete .= ' AND YEAR(date) = ' . $this->annee;
-
 
569
		}
431
		$requete = "";
570
		if ($mpm) {
-
 
571
			$requete = $this->encapsulerMPM($requete);
-
 
572
		}
432
		$resultat = $this->bdd->recupererTous($requete);
573
		$resultat = $this->bdd->recupererTous($requete);
433
		return intval($resultat[0][0]);
574
		return intval(array_pop($resultat[0]));
-
 
575
	}
-
 
576
 
-
 
577
	/**
-
 
578
	 * Nombre d'utilisateurs d'Identiplante anonymes prenant part aux votes
-
 
579
	 */
-
 
580
	private function getNbUtilisateursAnonymesAFVote($mpm=false) {
-
 
581
		$requete = "SELECT COUNT(DISTINCT ce_utilisateur) AS nb_total FROM del_commentaire_vote WHERE ce_utilisateur NOT REGEXP '^-?[0-9]+$'";
-
 
582
		if ($this->annee != null) {
-
 
583
			$requete .= ' AND YEAR(date) = ' . $this->annee;
-
 
584
		}
-
 
585
		if ($mpm) {
-
 
586
			$requete = $this->encapsulerMPM($requete);
-
 
587
		}
-
 
588
		$resultat = $this->bdd->recupererTous($requete);
-
 
589
		return intval(array_pop($resultat[0]));
434
	}
590
	}
435
 
591
 
436
	/**
592
	/**
437
	 * @TODO Liste des utilisateurs ayant fait le plus de propositions, et
593
	 * Liste des utilisateurs dont les propositions ont été votées positivement
438
	 * le plus de propositions retenues (ou ayant atteint un consensus)
-
 
439
	 */
594
	 */
440
	private function getListeMeilleursProposeurs() {
595
	private function getListeMeilleursProposeurs() {
441
		$liste = array();
596
		$liste = array();
-
 
597
		$requete = "SELECT * FROM (SELECT utilisateur_courriel, count(prop) as nb_prop"
-
 
598
			. " FROM (SELECT `ce_proposition` as prop, COUNT(DISTINCT `id_vote`) AS nb_vote FROM del_commentaire_vote where";
442
		$requete = "";
599
		if ($this->annee != null) {
-
 
600
			$requete .= " year(`date`) = " . $this->annee . " AND";
-
 
601
		}
-
 
602
		$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`)"
-
 
603
			. " AS utlisateurs WHERE nb_prop > 10 ORDER BY nb_prop  DESC LIMIT 20";
443
		$resultat = $this->bdd->recupererTous($requete);
604
		$resultat = $this->bdd->recupererTous($requete);
444
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
605
		// 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 ?
606
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
446
		// ...
607
		// ...
447
 
608
 
448
		return array(
609
		return array(
449
			'annee' => $this->annee,
610
				'liste' => $resultat
450
			'listeMeilleursProposeurs' => $liste[0],
-
 
451
			'listeMeilleursProposeursAyantEteRetenus' => $liste[1]
-
 
452
		);
611
		);
453
	}
612
	}
454
 
613
 
455
	/**
614
	/**
456
	 * @TODO Liste des utilisateurs ayant fait le plus de votes, et le plus
615
	 * Liste des utilisateurs ayant fait le plus de votes positifs
457
	 * de votes sur des propositions retenues (ou ayant atteint un consensus)
616
	 * @TODO et le plus de votes sur des propositions retenues (ou ayant atteint un consensus)
458
	 */
617
	 */
459
	private function getListeMeilleursVoteurs() {
618
	private function getListeMeilleursVoteurs() {
460
		$liste = array();
619
		$liste = array();
-
 
620
		$requete = "SELECT * FROM (SELECT courriel, COUNT(DISTINCT `id_vote`) AS nombre FROM del_commentaire_vote, del_utilisateur where";
461
		$requete = "";
621
		if ($this->annee != null) {
-
 
622
			$requete .= " year(`date`) = " . $this->annee . " AND";
-
 
623
		}
-
 
624
		$requete .= " ce_utilisateur = id_utilisateur AND valeur = 1 GROUP BY `ce_utilisateur`) AS utilisateurs WHERE nombre > 100 ORDER BY nombre DESC LIMIT 20";
462
		$resultat = $this->bdd->recupererTous($requete);
625
		$resultat = $this->bdd->recupererTous($requete);
463
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir service CEL stats)
626
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
464
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
627
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
465
		// ...
628
		// ...
466
 
629
 
467
		return array(
630
		return array(
468
			'annee' => $this->annee,
631
				'liste' => $resultat
-
 
632
		);
-
 
633
	}
-
 
634
 
-
 
635
	/**
-
 
636
	 * Liste des utilisateurs ayant fait au moins une proposition par mois toute l'année
-
 
637
	 */
-
 
638
	private function getListeProposeursReguliers() {
-
 
639
		$liste = array();
-
 
640
		$requete = "SELECT cal.nbmois, SUM(somme) / cal.nbmois as moyenne, ce_utilisateur, utilisateur_courriel FROM (SELECT count(*) as somme,"
-
 
641
			. " CONCAT(YEAR(date),'-',MONTH(date)) as anneemois, ce_utilisateur, utilisateur_courriel, id_commentaire FROM del_commentaire"
-
 
642
			. " WHERE ce_proposition = '' AND nom_sel_nn != '' AND nom_sel_nn IS NOT NULL";
-
 
643
		if ($this->annee != null) {
469
			'listeMeilleursVoteurs' => $liste[0],
644
			$requete .= " AND year(`date`) = " . $this->annee;
-
 
645
		}
-
 
646
		$requete .= "  GROUP BY anneemois, ce_utilisateur, utilisateur_courriel) as ppm, (SELECT count(distinct CONCAT(YEAR(date),'-',MONTH(date))) as nbmois FROM del_commentaire WHERE";
-
 
647
		if ($this->annee != null) {
470
			'listeMeilleursVoteursSurPropositionsRetenues' => $liste[1]
648
			$requete .= " year(`date`) = " . $this->annee . " AND";
-
 
649
		}
-
 
650
		$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"
-
 
651
			. " ORDER BY moyenne DESC"; // @ TODO limite ?
-
 
652
		$resultat = $this->bdd->recupererTous($requete);
-
 
653
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir widget CEL stats)
-
 
654
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
-
 
655
		// ...
-
 
656
 
-
 
657
		return array(
-
 
658
			'liste' => $resultat
471
		);
659
		);
472
	}
660
	}
473
 
661
 
474
	/**
662
	/**
475
	 * @TODO Statistiques sur les images de Pictoflora
663
	 * @TODO Statistiques sur les images de Pictoflora
476
	 * @REFLEXION aucune idée de ce qu'on met dedans
664
	 * @REFLEXION aucune idée de ce qu'on met dedans
477
	 */
665
	 */
478
	private function getImages() {
666
	private function getImages() {
479
		return array(
667
		return array(
480
			'annee' => $this->annee
668
			'annee' => $this->annee
481
		);
669
		);
482
	}
670
	}
483
 
671
 
484
	/**
672
	/**
485
	 * @TODO Statistiques sur les mots-clés de Pictoflora
673
	 * @TODO Statistiques sur les mots-clés de Pictoflora
486
	 * @REFLEXION aucune idée de ce qu'on met dedans
674
	 * @REFLEXION aucune idée de ce qu'on met dedans
487
	 */
675
	 */
488
	private function getTags() {
676
	private function getTags() {
489
		return array(
677
		return array(
490
			'annee' => $this->annee
678
			'annee' => $this->annee
491
		);
679
		);
492
	}
680
	}
493
 
681
 
494
	/**
682
	/**
495
	 * @TODO Statistiques sur les utilisateurs de Pictoflora
683
	 * @TODO Statistiques sur les utilisateurs de Pictoflora
496
	 * - Nombre total d'utilisateurs
684
	 * - Nombre total d'utilisateurs
497
	 * - Nombre d'utilisateurs réguliers
685
	 * - Nombre d'utilisateurs réguliers
498
	 * - Nombre d'utilisateurs prenant part au taggage ?
686
	 * - Nombre d'utilisateurs prenant part au taggage ?
499
	 * - Nombre de participants actifs pour le mois, la semaine, l'année
687
	 * - Nombre de participants actifs pour le mois, la semaine, l'année
500
	 */
688
	 */
501
	private function getUtilisateursPf() {
689
	private function getUtilisateursPf() {
502
		$nbUtilisateursActifs = $this->getNbUtilisateursPfActifs();
690
		$nbUtilisateursActifs = $this->getNbUtilisateursPfActifs();
503
		return array(
691
		return array(
504
			'annee' => $this->annee,
692
			'annee' => $this->annee,
505
			'nbUtilisateursTotal' => $this->getNbUtilisateursPfTotal(),
693
			'nbUtilisateursTotal' => $this->getNbUtilisateursPfTotal(),
506
			'nbUtilisateursReguliers' => $this->getNbUtilisateursPfReguliers(),
694
			'nbUtilisateursReguliers' => $this->getNbUtilisateursPfReguliers(),
507
			'nbUtilisateursTaggant' => $this->getNbUtilisateursPfTaggant(),
695
			'nbUtilisateursTaggant' => $this->getNbUtilisateursPfTaggant(),
508
			'nbUtilisateursActifsAnnee' => $nbUtilisateursActifs['annee'],
696
			'nbUtilisateursActifsAnnee' => $nbUtilisateursActifs['annee'],
509
			'nbUtilisateursActifsMois' => $nbUtilisateursActifs['mois'],
697
			'nbUtilisateursActifsMois' => $nbUtilisateursActifs['mois'],
510
			'nbUtilisateursActifsSemaine' => $nbUtilisateursActifs['semaine']
698
			'nbUtilisateursActifsSemaine' => $nbUtilisateursActifs['semaine']
511
		);
699
		);
512
	}
700
	}
513
 
701
 
514
	/**
702
	/**
515
	 * @TODO Nombre total d'utilisateurs de Pictoflora
703
	 * @TODO Nombre total d'utilisateurs de Pictoflora
516
	 * @REFLEXION est-ce le même nombre que les utilisateurs d'Identiplante ?
704
	 * @REFLEXION est-ce le même nombre que les utilisateurs d'Identiplante ?
517
	 */
705
	 */
518
	private function getNbUtilisateursPfTotal() {
706
	private function getNbUtilisateursPfTotal() {
519
		$requete = "";
707
		$requete = "";
520
		$resultat = $this->bdd->recupererTous($requete);
708
		$resultat = $this->bdd->recupererTous($requete);
521
		return intval($resultat[0][0]);
709
		return intval($resultat[0][0]);
522
	}
710
	}
523
 
711
 
524
	/**
712
	/**
525
	 * @TODO Nombre d'utilisateurs réguliers de Pictoflora
713
	 * @TODO Nombre d'utilisateurs réguliers de Pictoflora
526
	 * @REFLEXION quelle différence avec getNbUtilisateursPfActifs() ?
714
	 * @REFLEXION quelle différence avec getNbUtilisateursPfActifs() ?
527
	 */
715
	 */
528
	private function getNbUtilisateursPfReguliers() {
716
	private function getNbUtilisateursPfReguliers() {
529
		$requete = "";
717
		$requete = "";
530
		$resultat = $this->bdd->recupererTous($requete);
718
		$resultat = $this->bdd->recupererTous($requete);
531
		return intval($resultat[0][0]);
719
		return intval($resultat[0][0]);
532
	}
720
	}
533
 
721
 
534
	/**
722
	/**
535
	 * @TODO Nombre d'utilisateurs de Pictoflora prenant part aux votes
723
	 * @TODO Nombre d'utilisateurs de Pictoflora prenant part aux votes
536
	 */
724
	 */
537
	private function getNbUtilisateursPfTaggant() {
725
	private function getNbUtilisateursPfTaggant() {
538
		$requete = "";
726
		$requete = "";
539
		$resultat = $this->bdd->recupererTous($requete);
727
		$resultat = $this->bdd->recupererTous($requete);
540
		return intval($resultat[0][0]);
728
		return intval($resultat[0][0]);
541
	}
729
	}
542
 
730
 
543
	/**
731
	/**
544
	 * @TODO Nombre de participants à Pictoflora actifs (pour le mois, la semaine, l'année)
732
	 * @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
733
	 * @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 ?)
734
	 * l'activité du mois et de la semaine (on met la case à null ?)
547
	 */
735
	 */
548
	private function getNbUtilisateursPfActifs() {
736
	private function getNbUtilisateursPfActifs() {
549
		$requete = "";
737
		$requete = "";
550
		$resultat = $this->bdd->recupererTous($requete);
738
		$resultat = $this->bdd->recupererTous($requete);
551
		return intval($resultat[0][0]);
739
		return intval($resultat[0][0]);
552
	}
740
	}
553
 
741
 
554
	/**
742
	/**
555
	 * @TODO Liste des mots-clés les plus fréquents
743
	 * @TODO Liste des mots-clés les plus fréquents
556
	 */
744
	 */
557
	private function getListeMeilleursTags() {
745
	private function getListeMeilleursTags() {
558
		$liste = array();
746
		$liste = array();
559
		$requete = "";
747
		$requete = "";
560
		$resultat = $this->bdd->recupererTous($requete);
748
		$resultat = $this->bdd->recupererTous($requete);
561
		// Formater liste
749
		// Formater liste
562
		// ...
750
		// ...
563
 
751
 
564
		return array(
752
		return array(
565
			'annee' => $this->annee,
753
			'annee' => $this->annee,
566
			'listeMeilleursTags' => $liste
754
			'listeMeilleursTags' => $liste
567
		);
755
		);
568
	}
756
	}
569
 
757
 
570
	/**
758
	/**
571
	 * @TODO Liste des utilisateurs ayant ajouté le plus de mots-clés
759
	 * @TODO Liste des utilisateurs ayant ajouté le plus de mots-clés
572
	 */
760
	 */
573
	private function getListeMeilleursTagueurs() {
761
	private function getListeMeilleursTagueurs() {
574
		$liste = array();
762
		$liste = array();
575
		$requete = "";
763
		$requete = "";
576
		$resultat = $this->bdd->recupererTous($requete);
764
		$resultat = $this->bdd->recupererTous($requete);
577
		// Formater liste (récupérer les pseudos des gens dans l'annuaire etc. => voir service CEL stats)
765
		// 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 ?
766
		// => faut-il le faire ici ou dans le widget ? :-/ plutôt ici non ?
579
		// ...
767
		// ...
580
 
768
 
581
		return array(
769
		return array(
582
			'annee' => $this->annee,
770
			'annee' => $this->annee,
583
			'listeMeilleursTagueurs' => $liste
771
			'listeMeilleursTagueurs' => $liste
584
		);
772
		);
585
	}
773
	}
-
 
774
 
-
 
775
	/**
-
 
776
	 * Encapsule une reqûete de comptage dans un autre morceau de requête
-
 
777
	 * afin de calculer la moyenne par mois
-
 
778
	 * @param string $requete count() qui doit renvoyer une colonne 'nb_total'
-
 
779
	 */
-
 
780
	protected function encapsulerMPM($requete) {
-
 
781
		$requeteEncapsulee = "SELECT AVG(nb_total) as moyenne FROM ("
-
 
782
			. $requete
-
 
783
			. " GROUP BY CONCAT(year(date),month(date)) ) AS nombre";
-
 
784
		return $requeteEncapsulee;
-
 
785
	}
586
}
786
}
587
787