Subversion Repositories eFlore/Applications.coel

Rev

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