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