Subversion Repositories eFlore/Applications.coel

Rev

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