Subversion Repositories eFlore/Applications.coel

Rev

Rev 1527 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1497 jpm 1
<?php
2
/**
3
 * Service fournissant des urls vers des images de graphiques sur les statistiques de l'application COEL.
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
6
 *
7
 * Cas d'utilisation :
8
 * /CoelStatistique/MonTypeDeStat : retourne l'url du graphique pour le type de statistique demandé
9
 *
10
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
 * @version $Id$
14
 * @copyright 2009
15
 */
16
class CoelStatistique extends Coel {
17
 
18
	private $parametres = array();
19
 
20
	/**
21
	 * Méthode appelée avec une requête de type GET.
22
	 */
23
	public function getElement($param) {
24
		$info = null;
25
 
26
		if (isset($param[0])) {
27
			$service_demande = array_shift($param);
28
			$this->parametres = $param;
29
			$methode = 'get'.$service_demande;
30
			if (method_exists($this, $methode)) {
31
				$info = $this->$methode();
32
			}
33
		} else {
34
			$this->messages[] = "Le service COEL Statistique nécessite un paramètre.";
35
		}
36
 
37
		print $info;
38
	}
39
 
40
	private function getAccueil() {
41
		$html = '<h2>Bienvenue</h2>'.
42
			'<p>Vous utilisez Coel</p>';
43
		return $html;
44
	}
45
 
46
	private function getNombreDonnees() {
47
		// Récupération des données
48
		$types = array(	array('Commentaires', 'coel_commentaire', 'ccm_id_commentaire'),
49
						array('Publications', 'coel_publication', 'cpu_id_publication'),
50
						array('Personnes', 'coel_personne', 'cp_id_personne'),
51
						array('Collections', 'coel_collection', 'cc_id_collection'),
52
						array('Structures', 'coel_structure', 'cs_id_structure'));
53
		$donnees = array();
54
		foreach ($types as $info) {
55
			list($type, $table, $champ) = $info;
56
			$donnees[$type] = $this->executerRequeteNombre($table, $champ);
57
		}
58
 
59
		// Post traitement des données de la base de données
60
		$titre = str_replace(' ', '+', 'Nombre de données');
61
		asort($donnees);
62
		$valeurs = implode(',', $donnees);
63
		arsort($donnees);
64
		$etiquettes = implode('|', array_keys($donnees));
65
 
66
		// Construire de l'url de l'image
67
		$url = 'http://chart.apis.google.com/chart?'.
68
			'cht=bhs'.
69
			'&chs=250x180'.
70
			'&chco=4D89F9'.
71
			'&chd=t:'.$valeurs.
72
			'&chds=0,'.max($donnees).
73
			'&chxt=y'.
74
			'&chxl='.'0	:|'.$etiquettes.'|'.
75
			'&chm=N ** ,000000,0,-1,10'.
76
			'&chtt='.$titre;
77
		return '<img src="'.$url.'"/>';
78
	}
79
 
80
	private function getMesDonnees() {
81
		$personne_id = (isset($this->parametres[0]) ? $this->parametres[0] : null);
82
		// Récupération des données
83
		$types = array(	'Commentaires' => '107',
84
						'Publications' => '118, 119',
85
						'Personnes' => '113, 114',
86
						'Collections' => '101, 102, 103, 104, 105, 106',
87
						'Structures' => '120, 121, 122, 123');
88
		$etats = array(	1 => 'Ajouts',
89
						2 => 'Modifications',
90
						3 => 'Suppressions');
91
		$donnees = array();
92
		foreach ($types as $type => $table_identifiants) {
93
			foreach ($etats as $etat_id => $etat_type) {
94
				$donnees[$etat_type][$type] = $this->executerRequeteNombreDansHistorique($table_identifiants, $etat_id, $personne_id);
95
			}
96
		}
97
 
98
		// Post traitement des données de la base de données
99
		$titre = str_replace(' ', '+', 'Ma participation');
100
		$max_global = array();
101
		$ensembles_donnees = array();
102
		foreach ($donnees as $ensemble_donnees) {
103
			$ensembles_donnees[] = implode(',', array_reverse($ensemble_donnees));
104
 
105
			// Gestion de l'échelle
106
			foreach ($ensemble_donnees as $type => $val) {
107
				if (!isset($max_global[$type])) {
108
					$max_global[$type] = 0;
109
				}
110
				$max_global[$type] += $val;
111
			}
112
		}
113
		$maximum = max($max_global);
114
		$moitier = round(($maximum / 2), 1);
115
		$valeurs = implode('|', $ensembles_donnees);
116
		$etiquettes = implode('|', array_keys($types));
117
		$legende = implode('|', $etats);
118
		$etiquettes_x = "0|$moitier|$maximum";
119
 
120
		// Construire de l'url de l'image
121
		$url = 'http://chart.apis.google.com/chart?'.
122
			'cht=bhs'.
123
			'&chs=300x180'.
124
			'&chbh=a,2,4'.
125
			'&chco=66B032,FABC02,FE2712'.
126
			'&chdl='.$legende.
127
			'&chdlp=b'.
128
			'&chd=t:'.$valeurs.
129
			'&chds=0,'.$maximum.
130
			'&chxt=y,x'.
131
			'&chxl='.'0:|'.$etiquettes.'|1:|'.$etiquettes_x.
132
			'&chm=N,000000,0,-1,10,1|N,000000,1,-1,10,1|N,000000,2,-1,10,1'.
133
			'&chtt='.$titre;
134
		return '<img src="'.$url.'"/>';
135
	}
136
 
137
	private function getTypeDepot() {
138
		// Récupération des données
139
		$requete = 	'SELECT cmlv_nom AS type, COUNT(cc_ce_type_depot) AS nbre '.
140
					'FROM coel_collection '.
141
					'	LEFT JOIN coel_meta_liste_valeur ON (cc_ce_type_depot = cmlv_id_valeur) '.
142
					'GROUP BY cc_ce_type_depot';
143
		try {
144
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
145
			if ($infos === false) {
146
				$this->messages[] = "La requête a retourné aucun résultat.";
147
			}
148
		} catch (PDOException $e) {
149
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
150
		}
151
 
152
		// Post traitement des données de la base de données
153
		$titre = str_replace(' ', '+', 'Type de dépôt|des collections');
154
		$donnees = array();
155
		foreach ($infos as $info) {
156
			$donnees[$info['type']] = $info['nbre'];
157
		}
158
		asort($donnees);
159
		$valeurs = implode(',', $donnees);
160
		arsort($donnees);
161
		$etiquettes = implode('|', array_keys($donnees));
162
 
163
		// Construire de l'url de l'image
164
		$url = 'http://chart.apis.google.com/chart?'.
165
			'cht=bhs'.
166
			'&chs=250x170'.
167
			'&chco=4D89F9'.
168
			'&chd=t:'.$valeurs.
169
			'&chds=0,'.(max($donnees)+5).
170
			'&chxt=y'.
171
			'&chxl='.'0	:|'.$etiquettes.'|'.
172
			'&chm=N *,000000,0,-1,10'.
173
			'&chtt='.$titre.
174
			'&chts=000000,12';
175
 
176
		// Retour du html contenant l'image
177
		return '<img src="'.$url.'"/>';
178
	}
179
 
180
	private function getNombreCollectionParStructure() {
181
		// Récupération des données
182
		$requete = 	'SELECT COUNT(cc_id_collection) AS nbre '.
183
					'FROM coel_collection '.
184
					'GROUP BY cc_ce_structure';
185
		try {
186
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
187
			if ($infos === false) {
188
				$this->messages[] = "La requête a retourné aucun résultat.";
189
			}
190
		} catch (PDOException $e) {
191
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
192
		}
193
 
194
		// Post traitement des données de la base de données
195
		$titre = str_replace(' ', '+', 'Nombre de collections|par institution');
196
		$donnees = array(	'1 collection' => 0,
197
							'2 collections' => 0,
198
							'Entre 3 et 10' => 0,
199
							'Entre 11 et 50' => 0,
200
							'Plus de 50' => 0);
201
		foreach ($infos as $info) {
202
			$nbre = $info['nbre'];
203
			if ($nbre == 1) {
204
				$donnees['1 collection']++;
205
			} else if ($nbre == 2) {
206
				$donnees['2 collections']++;
207
			} else if ($nbre >= 3 && $nbre <= 10) {
208
				$donnees['Entre 3 et 10']++;
209
			} else if ($nbre >= 11 && $nbre <= 50) {
210
				$donnees['Entre 11 et 50']++;
211
			} else if ($nbre > 50) {
212
				$donnees['Plus de 50']++;
213
			}
214
 
215
		}
216
 
217
		$donnees_tmp = $donnees;
218
		$donnees = array();
219
		foreach ($donnees_tmp as $cle => $valeur) {
220
			$donnees[$cle.' ('.$valeur.')'] = $valeur;
221
		}
222
		asort($donnees);
223
		$valeurs = implode(',', $donnees);
224
		//arsort($donnees);
225
		$etiquettes = implode('|', array_keys($donnees));
226
		//$legende = implode('|', array_keys($donnees));
227
 
228
		// Construire de l'url de l'image
229
		$url = 'http://chart.apis.google.com/chart?'.
230
			'cht=p3'.
231
			'&chs=350x150'.
232
			'&chco=4D89F9'.
233
			'&chd=t:'.$valeurs.
234
			'&chds=0,'.max($donnees).
235
			'&chl='.$etiquettes.
236
			'&chtt='.$titre.
237
			'&chts=000000,12';
238
 
239
		// Retour du html contenant l'image
240
		return '<img src="'.$url.'"/>';
241
	}
242
 
243
	private function executerRequeteNombreDansHistorique($table_identifiants, $etat, $personne_id = null) {
244
		$requete = 	"SELECT COUNT(cmhl_date_modification) AS nbre ".
245
					"FROM coel_meta_historique_ligne ".
246
					"WHERE cmhl_ce_table IN ($table_identifiants) ".
247
					"	AND cmhl_ce_etat = $etat ".
248
					(isset($personne_id) ? "	AND cmhl_ce_modifier_par = $personne_id " : '');
249
		try {
250
			$nbre = $this->bdd->query($requete)->fetchColumn();
251
			if ($nbre === false) {
252
				$this->messages[] = "La requête a retourné aucun résultat.";
253
			}
254
		} catch (PDOException $e) {
255
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
256
		}
257
		return $nbre;
258
	}
259
 
260
	private function executerRequeteNombre($table, $champ) {
261
		$requete = "SELECT COUNT($champ) AS nbre FROM $table";
262
		try {
263
			$nbre = $this->bdd->query($requete)->fetchColumn();
264
			if ($nbre === false) {
265
				$this->messages[] = "La requête a retourné aucun résultat.";
266
			}
267
		} catch (PDOException $e) {
268
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
269
		}
270
		return $nbre;
271
	}
272
}