Subversion Repositories eFlore/Applications.coel

Rev

Rev 1540 | Rev 1560 | Go to most recent revision | Details | Compare with Previous | 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
 
1527 jpm 18
	const META_CODE_FRANCE = 2654;
19
	const META_LISTE_SIECLE = 1040;// Liste des siècles pour les collections naturalistes
20
	const META_LISTE_TYPE_HERBIER = 1083;// Liste des types de collection botanique
1497 jpm 21
	private $parametres = array();
22
 
23
	/**
24
	 * Méthode appelée avec une requête de type GET.
25
	 */
26
	public function getElement($param) {
1548 jpm 27
		$html = null;
1497 jpm 28
 
29
		if (isset($param[0])) {
30
			$service_demande = array_shift($param);
31
			$this->parametres = $param;
32
			$methode = 'get'.$service_demande;
33
			if (method_exists($this, $methode)) {
1548 jpm 34
				$html = $this->$methode();
1497 jpm 35
			}
36
		} else {
37
			$this->messages[] = "Le service COEL Statistique nécessite un paramètre.";
38
		}
39
 
1548 jpm 40
		$this->envoyerHTML($html);
1497 jpm 41
	}
42
 
43
	private function getAccueil() {
44
		$html = '<h2>Bienvenue</h2>'.
45
			'<p>Vous utilisez Coel</p>';
46
		return $html;
47
	}
48
 
49
	private function getNombreDonnees() {
50
		// Récupération des données
1548 jpm 51
		$types = array(	array('Commentaires', 'commentaire', 'ccm'),
52
						array('Publications', 'publication', 'cpu'),
53
						array('Personnes', 'personne', 'cp'),
54
						array('Collections', 'collection', 'cc'),
55
						array('Structures', 'structure', 'cs'));
1497 jpm 56
		$donnees = array();
57
		foreach ($types as $info) {
58
			list($type, $table, $champ) = $info;
59
			$donnees[$type] = $this->executerRequeteNombre($table, $champ);
60
		}
61
 
62
		// Post traitement des données de la base de données
63
		$titre = str_replace(' ', '+', 'Nombre de données');
64
		asort($donnees);
65
		$valeurs = implode(',', $donnees);
66
		arsort($donnees);
67
		$etiquettes = implode('|', array_keys($donnees));
68
 
69
		// Construire de l'url de l'image
70
		$url = 'http://chart.apis.google.com/chart?'.
71
			'cht=bhs'.
72
			'&chs=250x180'.
73
			'&chco=4D89F9'.
74
			'&chd=t:'.$valeurs.
75
			'&chds=0,'.max($donnees).
76
			'&chxt=y'.
77
			'&chxl='.'0	:|'.$etiquettes.'|'.
78
			'&chm=N ** ,000000,0,-1,10'.
79
			'&chtt='.$titre;
1548 jpm 80
 
81
		// Retour du html contenant l'image
82
		$sortie = '<img src="'.$url.'"/>';
83
		return $sortie;
1497 jpm 84
	}
1548 jpm 85
 
86
	private function executerRequeteNombre($entite, $abr) {
87
		$table = 'coel_'.$entite;
88
		$champ_id = $abr.'_id_'.$entite;
89
		$champ_projet = $abr.'_ce_projet';
90
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
91
 
92
		$requete = "SELECT COUNT($champ_id) AS nbre ".
93
			"FROM $table ".
94
			(is_null($projet_id) ? '' : "WHERE $champ_projet = $projet_id ");
95
		try {
96
			$nbre = $this->bdd->query($requete)->fetchColumn();
97
			if ($nbre === false) {
98
				$this->messages[] = "La requête a retourné aucun résultat.";
99
			}
100
		} catch (PDOException $e) {
101
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
102
		}
103
		return $nbre;
104
	}
1497 jpm 105
 
106
	private function getMesDonnees() {
107
		$personne_id = (isset($this->parametres[0]) ? $this->parametres[0] : null);
108
		// Récupération des données
109
		$types = array(	'Commentaires' => '107',
110
						'Publications' => '118, 119',
111
						'Personnes' => '113, 114',
112
						'Collections' => '101, 102, 103, 104, 105, 106',
113
						'Structures' => '120, 121, 122, 123');
1548 jpm 114
		$etats = array(1 => 'Ajouts',
1497 jpm 115
						2 => 'Modifications',
116
						3 => 'Suppressions');
117
		$donnees = array();
118
		foreach ($types as $type => $table_identifiants) {
119
			foreach ($etats as $etat_id => $etat_type) {
120
				$donnees[$etat_type][$type] = $this->executerRequeteNombreDansHistorique($table_identifiants, $etat_id, $personne_id);
121
			}
122
		}
123
 
124
		// Post traitement des données de la base de données
1548 jpm 125
		$titre = str_replace(' ', '+', 'Ma participation tous projets confondus');
1497 jpm 126
		$max_global = array();
127
		$ensembles_donnees = array();
128
		foreach ($donnees as $ensemble_donnees) {
129
			$ensembles_donnees[] = implode(',', array_reverse($ensemble_donnees));
130
 
131
			// Gestion de l'échelle
132
			foreach ($ensemble_donnees as $type => $val) {
133
				if (!isset($max_global[$type])) {
134
					$max_global[$type] = 0;
135
				}
136
				$max_global[$type] += $val;
137
			}
138
		}
139
		$maximum = max($max_global);
140
		$moitier = round(($maximum / 2), 1);
141
		$valeurs = implode('|', $ensembles_donnees);
142
		$etiquettes = implode('|', array_keys($types));
143
		$legende = implode('|', $etats);
144
		$etiquettes_x = "0|$moitier|$maximum";
145
 
146
		// Construire de l'url de l'image
147
		$url = 'http://chart.apis.google.com/chart?'.
148
			'cht=bhs'.
1548 jpm 149
			'&chs=320x180'.
1497 jpm 150
			'&chbh=a,2,4'.
151
			'&chco=66B032,FABC02,FE2712'.
152
			'&chdl='.$legende.
153
			'&chdlp=b'.
154
			'&chd=t:'.$valeurs.
155
			'&chds=0,'.$maximum.
156
			'&chxt=y,x'.
157
			'&chxl='.'0:|'.$etiquettes.'|1:|'.$etiquettes_x.
158
			'&chm=N,000000,0,-1,10,1|N,000000,1,-1,10,1|N,000000,2,-1,10,1'.
159
			'&chtt='.$titre;
1548 jpm 160
 
161
		// Retour du html contenant l'image
162
		$sortie = '<img src="'.$url.'"/>';
163
		return $sortie;
1497 jpm 164
	}
165
 
1548 jpm 166
	private function executerRequeteNombreDansHistorique($table_identifiants, $etat, $personne_id = null) {
167
		$requete = 	"SELECT COUNT(cmhl_date_modification) AS nbre ".
168
					"FROM coel_meta_historique_ligne ".
169
					"WHERE cmhl_ce_table IN ($table_identifiants) ".
170
					"	AND cmhl_ce_etat = $etat ".
171
					(isset($personne_id) ? "	AND cmhl_ce_modifier_par = $personne_id " : '');
172
		try {
173
			$nbre = $this->bdd->query($requete)->fetchColumn();
174
			if ($nbre === false) {
175
				$this->messages[] = "La requête a retourné aucun résultat.";
176
			}
177
		} catch (PDOException $e) {
178
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
179
		}
180
		return $nbre;
181
	}
182
 
1497 jpm 183
	private function getTypeDepot() {
1548 jpm 184
		// Récupération des paramêtres
185
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
186
 
1497 jpm 187
		// Récupération des données
188
		$requete = 	'SELECT cmlv_nom AS type, COUNT(cc_ce_type_depot) AS nbre '.
189
					'FROM coel_collection '.
190
					'	LEFT JOIN coel_meta_liste_valeur ON (cc_ce_type_depot = cmlv_id_valeur) '.
1548 jpm 191
					( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ").
1497 jpm 192
					'GROUP BY cc_ce_type_depot';
193
		try {
194
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
195
			if ($infos === false) {
196
				$this->messages[] = "La requête a retourné aucun résultat.";
197
			}
198
		} catch (PDOException $e) {
199
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
200
		}
201
 
202
		// Post traitement des données de la base de données
203
		$titre = str_replace(' ', '+', 'Type de dépôt|des collections');
204
		$donnees = array();
205
		foreach ($infos as $info) {
1548 jpm 206
			if ($info['type'] != '') {
207
				$cle = $info['type'];
208
			} else {
209
				$cle = 'Non renseigné';
210
			}
211
			$donnees[$cle] = $info['nbre'];
1497 jpm 212
		}
213
		asort($donnees);
214
		$valeurs = implode(',', $donnees);
215
		arsort($donnees);
216
		$etiquettes = implode('|', array_keys($donnees));
217
 
218
		// Construire de l'url de l'image
219
		$url = 'http://chart.apis.google.com/chart?'.
220
			'cht=bhs'.
221
			'&chs=250x170'.
222
			'&chco=4D89F9'.
223
			'&chd=t:'.$valeurs.
224
			'&chds=0,'.(max($donnees)+5).
225
			'&chxt=y'.
226
			'&chxl='.'0	:|'.$etiquettes.'|'.
227
			'&chm=N *,000000,0,-1,10'.
228
			'&chtt='.$titre.
229
			'&chts=000000,12';
230
 
231
		// Retour du html contenant l'image
1548 jpm 232
		$sortie = '<img src="'.$url.'"/>';
233
		return $sortie;
1497 jpm 234
	}
235
 
236
	private function getNombreCollectionParStructure() {
1527 jpm 237
		// Récupération des paramêtres
238
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
239
 
1497 jpm 240
		// Récupération des données
241
		$requete = 	'SELECT COUNT(cc_id_collection) AS nbre '.
242
					'FROM coel_collection '.
1527 jpm 243
					( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ").
244
					'GROUP BY cc_ce_structure ';
245
 
1497 jpm 246
		try {
247
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
248
			if ($infos === false) {
249
				$this->messages[] = "La requête a retourné aucun résultat.";
1527 jpm 250
			} else if (count($infos) == 0) {
251
				$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
1497 jpm 252
			}
253
		} catch (PDOException $e) {
254
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
255
		}
256
 
257
		// Post traitement des données de la base de données
258
		$titre = str_replace(' ', '+', 'Nombre de collections|par institution');
259
		$donnees = array(	'1 collection' => 0,
260
							'2 collections' => 0,
261
							'Entre 3 et 10' => 0,
262
							'Entre 11 et 50' => 0,
263
							'Plus de 50' => 0);
264
		foreach ($infos as $info) {
265
			$nbre = $info['nbre'];
266
			if ($nbre == 1) {
267
				$donnees['1 collection']++;
268
			} else if ($nbre == 2) {
269
				$donnees['2 collections']++;
270
			} else if ($nbre >= 3 && $nbre <= 10) {
271
				$donnees['Entre 3 et 10']++;
272
			} else if ($nbre >= 11 && $nbre <= 50) {
273
				$donnees['Entre 11 et 50']++;
274
			} else if ($nbre > 50) {
275
				$donnees['Plus de 50']++;
276
			}
277
 
278
		}
279
 
280
		$donnees_tmp = $donnees;
281
		$donnees = array();
282
		foreach ($donnees_tmp as $cle => $valeur) {
283
			$donnees[$cle.' ('.$valeur.')'] = $valeur;
284
		}
285
		asort($donnees);
286
		$valeurs = implode(',', $donnees);
287
		//arsort($donnees);
288
		$etiquettes = implode('|', array_keys($donnees));
289
		//$legende = implode('|', array_keys($donnees));
290
 
291
		// Construire de l'url de l'image
292
		$url = 'http://chart.apis.google.com/chart?'.
293
			'cht=p3'.
1529 jpm 294
			'&chs=350x200'.
1497 jpm 295
			'&chco=4D89F9'.
296
			'&chd=t:'.$valeurs.
297
			'&chds=0,'.max($donnees).
1529 jpm 298
			'&chdl='.$etiquettes.
1497 jpm 299
			'&chtt='.$titre.
300
			'&chts=000000,12';
301
 
302
		// Retour du html contenant l'image
1527 jpm 303
		$sortie = '<img src="'.$url.'"/>';
1548 jpm 304
		return $sortie;
1497 jpm 305
	}
306
 
1527 jpm 307
	private function getNombrePartParStructure() {
308
		// Récupération des paramêtres
309
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
310
 
311
		// Récupération des données
312
		$requete = 	'SELECT cc_ce_structure, ccb_truk_unite_base '.
313
					'FROM coel_collection_botanique '.
314
					'	LEFT JOIN coel_collection ON (ccb_id_collection = cc_id_collection) '.
315
					( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
316
 
317
		try {
318
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
319
			if ($infos === false) {
320
				$this->messages[] = "La requête a retourné aucun résultat.";
321
			} else if (count($infos) == 0) {
322
				$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
323
			}
324
		} catch (PDOException $e) {
325
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
326
		}
327
 
328
		// Post traitement des données de la base de données
329
		// Extraction du nombre de part
330
		$structures = array();
331
		foreach ($infos as $info) {
1540 jpm 332
			$structures[$info['cc_ce_structure']] = UtilTruck::extraireNbrePart($info['ccb_truk_unite_base']);
1527 jpm 333
		}
334
 
335
		// Triage par classe
336
		$donnees = array(	'0 part' => 0,
337
							'Entre 1 et 100' => 0,
338
							'Entre 101 et 1000' => 0,
339
							'Entre 1001 et 10.000' => 0,
340
							'Entre 10.001 et 100.000' => 0,
341
							'Entre 100.001 et 300.000' => 0,
342
							'Supérieur à 301.000' => 0);
343
		foreach ($structures as $nbre) {
344
			if ($nbre == 0) {
345
				$donnees['0 part']++;
346
			} else if ($nbre >= 1 && $nbre <= 100) {
347
				$donnees['Entre 1 et 100']++;
348
			} else if ($nbre >= 101 && $nbre <= 1000) {
349
				$donnees['Entre 101 et 1000']++;
350
			} else if ($nbre >= 1001 && $nbre <= 10000) {
351
				$donnees['Entre 1001 et 10.000']++;
352
			} else if ($nbre >= 10001 && $nbre <= 100000) {
353
				$donnees['Entre 10.001 et 100.000']++;
354
			} else if ($nbre >= 100001 && $nbre <= 300000) {
355
				$donnees['Entre 100.001 et 300.000']++;
356
			} else if ($nbre >= 300001) {
357
				$donnees['Supérieur à 301.000']++;
358
			}
359
		}
360
 
361
		$donnees_tmp = $donnees;
362
		$donnees = array();
363
		foreach ($donnees_tmp as $cle => $valeur) {
364
			$donnees[$cle.' ('.$valeur.')'] = $valeur;
365
		}
366
		$legende = implode('|', array_keys($donnees));
367
		asort($donnees);
368
		$valeurs = implode(',', $donnees);
369
		$titre = str_replace(' ', '+', 'Nombre de parts conservées |par institution');
370
 
371
		// Construire de l'url de l'image
372
		$url = 'http://chart.apis.google.com/chart?'.
373
			'cht=p3'.
374
			'&chs=400x225'.
375
			'&chco=4D89F9'.
376
			'&chd=t:'.$valeurs.
377
			'&chds=0,'.max($donnees).
378
			'&chdl='.$legende.
379
			'&chdlp=r,0,1,2,3,4,5'.
380
			'&chtt='.$titre.
381
			'&chts=000000,11.5'.
382
			'&chts=000000,12';
383
 
384
		// Retour du html contenant l'image
385
		$sortie = '<img src="'.$url.'"/>';
1548 jpm 386
		return $sortie;
1527 jpm 387
	}
388
 
389
	private function getNombrePartParCollection() {
390
		// Récupération des paramêtres
391
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
392
 
393
		// Récupération des données
394
		$requete = 	'SELECT ccb_truk_unite_base '.
395
					'FROM coel_collection_botanique '.
396
					( is_null($projet_id) ? '' : '	LEFT JOIN coel_collection ON (ccb_id_collection = cc_id_collection) ').
397
					( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
398
 
399
		try {
400
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
401
			if ($infos === false) {
402
				$this->messages[] = "La requête a retourné aucun résultat.";
403
			} else if (count($infos) == 0) {
404
				$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
405
				$infos == false;
406
			}
407
		} catch (PDOException $e) {
408
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
409
		}
410
 
411
		$sortie = null;
412
		if ($infos !== false) {
413
			// Post traitement des données de la base de données
414
			// Extraction du nombre de part
415
			$collections = array();
416
			foreach ($infos as $info) {
1540 jpm 417
				$collections[] = UtilTruck::extraireNbrePart($info['ccb_truk_unite_base']);
1527 jpm 418
			}
419
 
420
			// Triage par classe
421
			$donnees = array(	'0 part' => 0,
422
								'Entre 1 et 100' => 0,
423
								'Entre 101 et 1000' => 0,
424
								'Entre 1001 et 10.000' => 0,
425
								'Entre 10.001 et 100.000' => 0,
426
								'Entre 100.001 et 300.000' => 0,
427
								'Supérieur à 301.000' => 0);
428
			foreach ($collections as $nbre) {
429
				if ($nbre == 0) {
430
					$donnees['0 part']++;
431
				} else if ($nbre >= 1 && $nbre <= 100) {
432
					$donnees['Entre 1 et 100']++;
433
				} else if ($nbre >= 101 && $nbre <= 1000) {
434
					$donnees['Entre 101 et 1000']++;
435
				} else if ($nbre >= 1001 && $nbre <= 10000) {
436
					$donnees['Entre 1001 et 10.000']++;
437
				} else if ($nbre >= 10001 && $nbre <= 100000) {
438
					$donnees['Entre 10.001 et 100.000']++;
439
				} else if ($nbre >= 100001 && $nbre <= 300000) {
440
					$donnees['Entre 100.001 et 300.000']++;
441
				} else if ($nbre >= 300001) {
442
					$donnees['Supérieur à 301.000']++;
443
				}
444
			}
445
 
446
			$donnees_tmp = $donnees;
447
			$donnees = array();
448
			foreach ($donnees_tmp as $cle => $valeur) {
449
				$donnees[$cle.' ('.$valeur.')'] = $valeur;
450
			}
451
			$legende = implode('|', array_keys($donnees));
452
			asort($donnees);
453
			$valeurs = implode(',', $donnees);
454
			$titre = str_replace(' ', '+', 'Nombre de parts conservées |par collection');
455
 
456
			// Construire de l'url de l'image
457
			$url = 'http://chart.apis.google.com/chart?'.
458
				'cht=p3'.
459
				'&chs=400x225'.
460
				'&chco=4D89F9'.
461
				'&chd=t:'.$valeurs.
462
				'&chds=0,'.max($donnees).
463
				'&chdl='.$legende.
464
				'&chdlp=r,0,1,2,3,4,5'.
465
				'&chtt='.$titre.
466
				'&chts=000000,11.5'.
467
				'&chts=000000,12';
468
 
469
			// Retour du html contenant l'image
470
			$sortie = '<img src="'.$url.'"/>';
471
		}
1548 jpm 472
		return $sortie;
1527 jpm 473
	}
474
 
475
	private function getNombreCollectionParDepartement() {
476
		// Récupération des paramêtres
477
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
478
		if ($projet_id !== null) {
479
			// Récupération des données
480
			$requete = 	'SELECT cs_code_postal '.
481
						'FROM coel_collection '.
482
						'	LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) '.
483
						'WHERE cs_ce_truk_pays = '.self::META_CODE_FRANCE.' '.
484
						( is_null($projet_id) ? '' : "	AND cc_ce_projet = $projet_id ");
485
 
486
			try {
487
				$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
488
				if ($infos === false) {
489
					$this->messages[] = "La requête a retourné aucun résultat.";
490
				} else if (count($infos) == 0) {
491
					$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
492
					$infos == false;
493
				}
494
			} catch (PDOException $e) {
495
				$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
496
			}
497
 
498
			$sortie = null;
499
			if ($infos !== false) {
500
				// Post traitement des données de la base de données
501
				// Extraction du nombre de part
502
				$donnees = array();
503
				foreach ($infos as $info) {
504
					if (preg_match('/^([0-8][0-9]|9[0-5]|97[1-4]|976)/', $info['cs_code_postal'], $match)) {
505
						if (! isset($donnees[$match[1]])) {
506
							$donnees[$match[1]] = 1;
507
						} else {
508
							$donnees[$match[1]]++;
509
						}
510
					}
511
				}
512
 
513
				$donnees_tmp = $donnees;
514
				$donnees = array();
515
				foreach ($donnees_tmp as $cle => $valeur) {
516
					$donnees[$cle.' ('.$valeur.' collections)'] = $valeur;
517
				}
518
 
519
				asort($donnees);
520
				$valeurs = implode(',', $donnees);
521
				$titre = str_replace(' ', '+', 'Nombre de collections conservées |par département');
522
				$legende = implode('|', array_keys($donnees));
523
				// Construire de l'url de l'image
524
				$url = 'http://chart.apis.google.com/chart?'.
525
					'cht=p3'.
526
					'&chs=400x225'.
527
					'&chco=4D89F9'.
528
					'&chd=t:'.$valeurs.
529
					'&chds=0,'.max($donnees).
530
					'&chdl='.$legende.
531
					'&chtt='.$titre.
532
					'&chts=000000,11.5'.
533
					'&chts=000000,12';
534
 
535
				// Retour du html contenant l'image
536
				$sortie = '<img src="'.$url.'"/>';
537
			}
538
		} else {
539
			$this->messages[] = "Veuillez sélectionner un projet pour voir le graphique.";
540
		}
1548 jpm 541
		return $sortie;
1527 jpm 542
	}
543
 
544
	private function getNombreCollectionParTypeStructure() {
545
		// Récupération des paramêtres
546
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
547
 
548
		// Récupération des données
549
		$requete = 	'SELECT cmlv_prive.cmlv_nom AS type_prive, cmlv_public.cmlv_nom  AS type_public '.
550
					'FROM coel_collection '.
551
					'	LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) '.
552
					'	LEFT JOIN coel_meta_liste_valeur AS cmlv_prive ON (cs_ce_truk_type_prive = cmlv_prive.cmlv_id_valeur) '.
553
					'	LEFT JOIN coel_meta_liste_valeur AS cmlv_public ON (cs_ce_truk_type_public = cmlv_public.cmlv_id_valeur) '.
554
					( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
555
 
556
		try {
557
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
558
			if ($infos === false) {
559
				$this->messages[] = "La requête a retourné aucun résultat.";
560
			} else if (count($infos) == 0) {
561
				$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
562
				$infos == false;
563
			}
564
		} catch (PDOException $e) {
565
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
566
		}
567
		//Coel::debug($infos);
568
		$sortie = null;
569
		if ($infos !== false) {
570
			// Post traitement des données de la base de données
571
			// Extraction du nombre de part
572
			$donnees = array();
573
			foreach ($infos as $info) {
574
				if ($info['type_prive'] != '') {
575
					$cle = $info['type_prive'].' [privé]';
576
				} else if ($info['type_public'] != '') {
577
					$cle = $info['type_public'].' [public]';
1529 jpm 578
				} else {
579
					$cle = 'Non renseignées';
1527 jpm 580
				}
581
				if (! isset($donnees[$cle])) {
582
					$donnees[$cle] = 1;
583
				} else {
584
					$donnees[$cle]++;
585
				}
586
			}
587
 
588
			$donnees_tmp = $donnees;
589
			$donnees = array();
590
			foreach ($donnees_tmp as $cle => $valeur) {
591
				$donnees[$cle.' ('.$valeur.')'] = $valeur;
592
			}
593
 
594
			asort($donnees);
595
			$valeurs = implode(',', $donnees);
596
			$titre = str_replace(' ', '+', "Collections conservées |par type d'institution");
597
			$legende = implode('|', array_keys($donnees));
598
			// Construire de l'url de l'image
599
			$url = 'http://chart.apis.google.com/chart?'.
600
				'cht=p3'.
601
				'&chs=400x225'.
602
				'&chco=4D89F9'.
603
				'&chd=t:'.$valeurs.
604
				'&chds=0,'.max($donnees).
605
				'&chdl='.$legende.
606
				'&chtt='.$titre.
607
				'&chts=000000,11.5'.
608
				'&chts=000000,12';
609
 
610
			// Retour du html contenant l'image
611
			$sortie = '<img src="'.$url.'"/>';
612
		}
1548 jpm 613
		return $sortie;
1527 jpm 614
	}
615
 
616
	private function getNombreCollectionParPeriode() {
617
		// Récupération des paramêtres
618
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
619
 
620
		// Récupération des données
621
		$requete = 	'SELECT cc_truk_periode_constitution '.
622
					'FROM coel_collection '.
623
					( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
624
		try {
625
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
626
			if ($infos === false) {
627
				$this->messages[] = "La requête a retourné aucun résultat.";
628
			} else if (count($infos) == 0) {
629
				$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
630
				$infos == false;
631
			}
632
		} catch (PDOException $e) {
633
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
634
		}
635
		//Coel::debug($infos);
636
 
637
		// Récupération des métadonnées nécessaires
638
		$requete = 	'SELECT cmlv_id_valeur, cmlv_nom, cmlv_abreviation '.
639
					'FROM coel_meta_liste_valeur '.
640
					'WHERE cmlv_ce_parent = '.self::META_LISTE_SIECLE.' ';
641
		try {
642
			$metadonnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
643
			if ($metadonnees === false) {
644
				$this->messages[] = "La requête de recherche des métadonnées a retourné aucun résultat.";
645
			}
646
		} catch (PDOException $e) {
647
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
648
		}
649
 
650
		$sortie = null;
651
		if ($infos !== false) {
652
			// Traitement des métadonées
653
			$periodes = array(0 => array('nom' => 'Non renseigné', 'abr' => 0));
654
			foreach ($metadonnees as $meta) {
655
				$periodes[$meta['cmlv_id_valeur']] = array('nom' => $meta['cmlv_nom'], 'abr' => $meta['cmlv_abreviation']);
656
			}
657
 
658
			// Post traitement des données de la base de données
659
			$donnees = array();
660
			foreach ($infos as $info) {
661
				// Récupération de la période de début de constitution
662
				$truk_periodes = explode(';;', $info['cc_truk_periode_constitution']);
663
				$periode_abr_mini = 10;
664
				$periode_id_mini = 0;
665
				foreach ($truk_periodes as $periode_id) {
666
					if (! empty($periode_id)) {
667
						if ($periode_abr_mini > $periodes[$periode_id]['abr']) {
668
							$periode_abr_mini = $periodes[$periode_id]['abr'];
669
							$periode_id_mini = $periode_id;
670
						}
671
					}
672
				}
673
 
674
				// Augmentation du nombre de collection par période
675
				if (! isset($donnees[$periodes[$periode_id_mini]['nom']])) {
676
					$donnees[$periodes[$periode_id_mini]['nom']] = 1;
677
				} else {
678
					$donnees[$periodes[$periode_id_mini]['nom']]++;
679
				}
680
			}
681
 
682
			$donnees_tmp = $donnees;
683
			$donnees = array();
684
			foreach ($donnees_tmp as $cle => $valeur) {
685
				$donnees[$cle.' ('.$valeur.')'] = $valeur;
686
			}
687
 
688
			asort($donnees);
689
			$valeurs = implode(',', $donnees);
690
			$titre = str_replace(' ', '+', "Collections recensées par|siècle de constitution");
691
			$legende = implode('|', array_keys($donnees));
692
			// Construire de l'url de l'image
693
			$url = 'http://chart.apis.google.com/chart?'.
694
				'cht=p3'.
695
				'&chs=400x225'.
696
				'&chco=4D89F9'.
697
				'&chd=t:'.$valeurs.
698
				'&chds=0,'.max($donnees).
699
				'&chdl='.$legende.
700
				'&chtt='.$titre.
701
				'&chts=000000,11.5'.
702
				'&chts=000000,12';
703
 
704
			// Retour du html contenant l'image
705
			$sortie = '<img src="'.$url.'"/>';
706
		}
1548 jpm 707
		return $sortie;
1527 jpm 708
	}
709
 
710
	private function getNombreHerbierParType() {
711
		// Récupération des paramêtres
712
		$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
713
 
714
		// Récupération des données
715
		$requete = 	'SELECT ccb_ce_truk_type '.
716
					'FROM coel_collection_botanique '.
717
					( is_null($projet_id) ? '' : '	LEFT JOIN coel_collection ON (ccb_id_collection = cc_id_collection) ').
718
					( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
719
		try {
720
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
721
			if ($infos === false) {
722
				$this->messages[] = "La requête a retourné aucun résultat.";
723
			} else if (count($infos) == 0) {
724
				$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
725
				$infos == false;
726
			}
727
		} catch (PDOException $e) {
728
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
729
		}
730
		//Coel::debug($infos);
731
 
732
		// Récupération des métadonnées nécessaires
733
		$requete = 	'SELECT cmlv_id_valeur, cmlv_nom, cmlv_abreviation '.
734
					'FROM coel_meta_liste_valeur '.
735
					'WHERE cmlv_ce_parent = '.self::META_LISTE_TYPE_HERBIER.' ';
736
		try {
737
			$metadonnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
738
			if ($metadonnees === false) {
739
				$this->messages[] = "La requête de recherche des métadonnées a retourné aucun résultat.";
740
			}
741
		} catch (PDOException $e) {
742
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
743
		}
744
 
745
		$sortie = null;
746
		if ($infos !== false) {
747
			// Traitement des métadonées
748
			$types = array(0 => array('nom' => 'Non renseigné', 'abr' => 'NR'));
749
			foreach ($metadonnees as $meta) {
750
				$types[$meta['cmlv_id_valeur']] = array('nom' => $meta['cmlv_nom'], 'abr' => $meta['cmlv_abreviation']);
751
			}
752
 
753
			// Post traitement des données de la base de données
754
			$donnees = array();
755
			foreach ($infos as $info) {
756
				// Récupération du type d'herbier
757
				$type_id = ($info['ccb_ce_truk_type'] != '') ? $info['ccb_ce_truk_type'] : 0;
758
 
759
				// Augmentation du nombre de collection par période
760
				if (! isset($donnees[$types[$type_id]['nom']])) {
761
					$donnees[$types[$type_id]['nom']] = 1;
762
				} else {
763
					$donnees[$types[$type_id]['nom']]++;
764
				}
765
			}
766
 
767
			$donnees_tmp = $donnees;
768
			$donnees = array();
769
			foreach ($donnees_tmp as $cle => $valeur) {
770
				$donnees[$cle.' ('.$valeur.')'] = $valeur;
771
			}
772
 
773
			asort($donnees);
774
			$valeurs = implode(',', $donnees);
775
			$titre = str_replace(' ', '+', "Nombre d'herbier par type");
776
			$legende = implode('|', array_keys($donnees));
777
			// Construire de l'url de l'image
778
			$url = 'http://chart.apis.google.com/chart?'.
779
				'cht=p3'.
780
				'&chs=300x350'.
781
				'&chco=4D89F9'.
782
				'&chd=t:'.$valeurs.
783
				'&chds=0,'.max($donnees).
784
				'&chdl='.$legende.
785
				'&chdlp=bv'.
786
				'&chtt='.$titre.
787
				'&chts=000000,11.5'.
788
				'&chts=000000,12';
789
 
790
			// Retour du html contenant l'image
791
			$sortie = '<img src="'.$url.'"/>';
792
		}
1548 jpm 793
		return $sortie;
1527 jpm 794
	}
1497 jpm 795
}