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