Subversion Repositories Sites.obs-saisons.fr

Rev

Rev 279 | Rev 282 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
207 aurelien 1
<?php
2
 
3
class OdsExport extends OdsTriple {
4
 
5
	const PREFIXE = 'get';
6
	const ABBR_LISTE_EVENEMENTS = 'evenement';
7
	const ABBR_LISTE_ESPECES = 'espece';
249 aurelien 8
	const ABBR_LISTE_MILIEUX = 'environnement';
9
 
246 aurelien 10
	private $type_mime = 'text/html';
11
 
207 aurelien 12
	/**
13
 	* Méthodes d'extractions d'informations
14
 	*/
15
 
16
	/**
17
     * Méthode appelée avec une requête de type GET.
18
     *
19
     */
20
    function getElement($param = array()) {
21
 
22
    	$type = $param[0];
23
 
24
        if ($type == '*' || is_numeric($type)) {
25
            $info = $this->getElementParDefaut($param);
26
        } else {
27
            $methode = self::PREFIXE.$type;
28
            if (method_exists($this, $methode)) {
29
                array_shift($param);
30
                $info = $this->$methode($param);
31
            } else {
32
                $this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
33
            }
34
        }
249 aurelien 35
 
270 aurelien 36
		$this->envoyer($info,$this->type_mime);
207 aurelien 37
    }
281 aurelien 38
 
270 aurelien 39
    public function getExportStationJson() {
281 aurelien 40
 
270 aurelien 41
    	$donnees = $this->getExportStation();
42
    	$donnees_formatees = $this->formaterListeStationPourExportJson($donnees);
43
 
44
    	$this->type_mime = 'application/json';
45
 
46
    	return $donnees_formatees;
47
    }
48
 
49
    public function getExportStation($start = null,$limit = null, $order_by = 'oo_date') {
50
 
279 aurelien 51
    	$id_demo = $this->config['appli']['id_participant_demo'];
52
    	$requete_selection_stations = 'SELECT * FROM ods_stations WHERE os_ce_participant != '.$this->proteger($id_demo);
270 aurelien 53
    	$res_selection_stations = $this->executerRequete($requete_selection_stations);
54
 
55
    	return $res_selection_stations;
56
    }
57
 
281 aurelien 58
    public function getExportUtilisateurCsv() {
59
 
60
    	$controle = new ControleUtilisateur($this->config);
61
    	$controle->authentifierAdmin();
62
 
63
    	$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
64
    	$utilisateurs = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
65
 
66
    	$utilisateurs_formates = array();
67
    	$premiere_annee = 2006;
68
 
69
    	$nb_obs = $this->compterObservationsParUtilisateur();
70
 
71
    	foreach ($utilisateurs as $id => $utilisateur) {
72
    		$utilisateur_formate = array(
73
	    		'id' => isset($utilisateur['uid']) ? $utilisateur['uid'] : '',
74
	    		'pseudo' => isset($utilisateur['name']) ? $utilisateur['name'] : '',
75
	    		'mail' => isset($utilisateur['mail']) ? $utilisateur['mail'] : '',
76
	    		'nom' => isset($utilisateur['profile_nom']) ? $utilisateur['profile_nom'] : '',
77
	    		'prenom' => isset($utilisateur['profile_prenom']) ? $utilisateur['profile_prenom'] : '',
78
	    		'code postal' => isset($utilisateur['profile_code_postal']) ? $utilisateur['profile_code_postal'] : '',
79
	    		'ville' => isset($utilisateur['profile_ville']) ? $utilisateur['profile_ville'] : '',
80
	    		'type' => isset($utilisateur['profile_type']) ? $utilisateur['profile_type'] : ''
81
    		);
82
 
83
    		for($i = $premiere_annee; $i <= date('Y'); $i++) {
84
    			$utilisateur_formate['annee '.$i] = isset($nb_obs[$utilisateur['uid']]) && isset($nb_obs[$utilisateur['uid']][$i]) ? $nb_obs[$utilisateur['uid']][$i] : '0';
85
    		}
86
 
87
    		$utilisateurs_formates[] = $utilisateur_formate;
88
    	}
89
 
90
    	$csv = $this->convertirTableauAssocVersCSV($utilisateurs_formates);
91
    	$this->envoyerFichier($csv, 'utilisateurs');
92
    }
93
 
94
    private function compterObservationsParUtilisateur() {
95
    	$requete = 'SELECT COUNT(*) as nb_obs, oo_ce_participant as participant, YEAR(oo_date) as annee '.
96
    			   'FROM `ods_observations` WHERE oo_date != "0000-00-00" GROUP BY oo_ce_participant, YEAR(oo_date)';
97
 
98
    	$res_selection_obs = $this->executerRequete($requete);
99
    	$stats = array();
100
    	foreach ($res_selection_obs as $obs_nb) {
101
    		$stats[$obs_nb['participant']][$obs_nb['annee']] = $obs_nb['nb_obs'];
102
    	}
103
 
104
    	return $stats;
105
    }
106
 
270 aurelien 107
    public function formaterListeStationPourExportJson($tableau_stations_infos) {
108
 
109
    	$gestionnaire_especes = new OdsEspece($this->config);
110
    	$gestionnaire_communes = new OdsCommune($this->config);
111
    	$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
112
 
113
    	$especes = $gestionnaire_especes->getToutesEspeces();
114
    	$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
115
    	$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
116
    	$utilisateurs = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
117
    	$communes = $gestionnaire_communes->obtenirCommunesLieesAStationIndexeesCodeInsee();
118
 
119
    	$resultats_formates = array();
120
    	$stats = array('total' => count($tableau_stations_infos));
121
 
122
    	foreach($tableau_stations_infos as $stations_infos) {
123
    		$commune = isset($communes[$stations_infos['os_ce_commune']]['oc_nom']) ? $communes[$stations_infos['os_ce_commune']]['oc_nom'] : '';
124
 
125
    		$id_station = $stations_infos['os_id_station'];
126
    		$resultats_formates[$id_station]['nom'] = $stations_infos['os_nom'];
127
    		$resultats_formates[$id_station]['code_commune'] = is_numeric($stations_infos['os_ce_commune']) ? substr($stations_infos['os_ce_commune'], 0, 2) : '';
128
    		$resultats_formates[$id_station]['nom_commune'] = $commune;
129
    		$resultats_formates[$id_station]['latitude'] = $stations_infos['os_latitude'];
130
    		$resultats_formates[$id_station]['longitude'] = $stations_infos['os_longitude'];
131
    		$resultats_formates[$id_station]['altitude'] = $stations_infos['os_altitude'];
132
    		$resultats_formates[$id_station]['type_participant'] = 'Particulier';
133
 
134
    		if(isset($utilisateurs[$stations_infos['os_ce_participant']])) {
135
    			$participant = $utilisateurs[$stations_infos['os_ce_participant']];
136
    			$resultats_formates[$id_station]['participant']['id'] = $participant['uid'];
137
    			$resultats_formates[$id_station]['participant']['nom'] = $participant['name'];
138
    			$resultats_formates[$id_station]['type_participant'] = isset($participant['profile_type']) ? $participant['profile_type'] : 'Particulier';
139
    		} else {
140
    			$resultats_formates[$id_station]['participant']['id'] = null;
141
    			$resultats_formates[$id_station]['participant']['nom'] = 'Anonyme';
142
    			$resultats_formates[$id_station]['type_participant'] = 'Particulier';
143
    		}
144
    		if(isset($stats[$resultats_formates[$id_station]['type_participant']])) {
145
    			$stats[$resultats_formates[$id_station]['type_participant']]++;
146
    		} else {
147
    			$stats[$resultats_formates[$id_station]['type_participant']] = 1;
148
    		}
149
    	}
271 aurelien 150
    	$resultat = array('stats' => $stats, 'stations' => $resultats_formates);
270 aurelien 151
    	return $resultat;
152
    }
249 aurelien 153
 
207 aurelien 154
	public function getExportObservation($start = null,$limit = null, $order_by = 'oo_date') {
227 aurelien 155
 
207 aurelien 156
		$requete_selection_observations = 'SELECT * FROM ods_observations '.
157
									' LEFT JOIN ods_individus '.
158
									' ON oi_id_individu = oo_ce_individu'.
159
									' LEFT JOIN ods_stations '.
263 gduche 160
									' ON oi_ce_station = os_id_station '.
161
									' LEFT JOIN ods_communes '.
162
									'ON os_ce_commune = oc_code_insee ';
207 aurelien 163
 
164
		$requete_selection_observations .= $this->construireConditionRequete();
165
		$requete_selection_observations .= ' ORDER BY oo_date DESC';
166
 
167
		$res_selection_observations = $this->executerRequete($requete_selection_observations);
168
 
169
		return $res_selection_observations;
170
	}
171
 
270 aurelien 172
	private function creerFiltreIdZoneGeo($valeurMasque) {
173
		$masque = '';
174
		$dept = $valeurMasque;
175
		$dept = sprintf('%02s', $dept);
176
		$dept = sprintf("%-'_5s", $dept);
177
		$masque = " oc_code_insee LIKE ".$this->proteger($dept);
178
		return $masque;
263 gduche 179
	}
180
 
207 aurelien 181
	public function construireConditionRequete() {
182
 
235 aurelien 183
		$condition = ' WHERE oo_date != "0000-00-00" AND DAY(oo_date) != "00" AND ';
207 aurelien 184
 
185
		foreach($_GET as $cle => $valeur) {
186
 
187
			switch($cle) {
188
 
189
				case 'type_espece':
190
					$condition .= 'oi_ce_espece IN (SELECT oe_id_espece FROM ods_especes WHERE oe_ce_type = '.$this->proteger($valeur).')';
191
				break;
192
 
193
				case 'annee':
235 aurelien 194
					if($this->anneesMultiplesDemandees($valeur)) {
195
						$valeur = rtrim($valeur,',');
196
						$condition .= 'YEAR(oo_date) IN ('.$valeur.')';
197
					} else {
198
						$condition .= 'YEAR(oo_date) ';
199
						$condition .= ' = '.$this->proteger($valeur);
200
					}
207 aurelien 201
				break;
202
 
203
				case 'mois':
204
					$condition .= 'MONTH(oo_date) <= '.$this->proteger($valeur);
205
				break;
206
 
207
				case 'espece':
235 aurelien 208
					$condition .= 'oi_ce_espece IN ('.$valeur.') ';
207 aurelien 209
				break;
210
 
211
				case 'evenement':
212
					$condition .= 'oo_ce_evenement = '.$this->proteger($valeur);
213
				break;
214
 
215
				case 'utilisateur':
216
					$condition .= 'oo_ce_participant = '.$this->proteger($valeur);
217
				break;
218
 
264 gduche 219
				case 'departement' :
263 gduche 220
					$condition .= $this->creerFiltreIdZoneGeo($valeur);
221
				break;
264 gduche 222
 
223
				case 'region' :
224
					$requete_association_region .= 'SELECT * FROM ods_triples WHERE ot_ce_parent = 36 AND ot_valeur = '.$valeur;
225
					$listeAssociationRegions = $this->executerRequete($requete_association_region);
226
					$departements = array();
227
					foreach ($listeAssociationRegions as $associationRegion) {
228
						$departements[] = $this->creerFiltreIdZoneGeo($associationRegion['ot_cle']);
229
					}
230
					$condition .= ' ('. implode(' OR ', $departements).')';
231
				break;
207 aurelien 232
				default:
233
			}
234
 
235
			$condition .= ' AND ';
236
		}
237
 
238
		$condition = rtrim($condition,'AND ');
239
 
227 aurelien 240
		$id_demo = $this->config['appli']['id_participant_demo'];
241
		$id_admin = $this->config['appli']['id_participant_admin'];
242
 
243
		$condition .= ' AND oo_ce_participant != '.$id_demo;
244
		$condition .= ' AND oo_ce_participant != '.$id_admin;
245
 
207 aurelien 246
		return $condition;
247
	}
248
 
235 aurelien 249
	private function anneesMultiplesDemandees($annee) {
250
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
251
		// sans virgule terminale
252
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
253
		return preg_match($reg_exp, $annee);
254
	}
255
 
210 aurelien 256
	public function getExportObservationPlat() {
257
 
258
		$donnees = $this->getExportObservation();
270 aurelien 259
		$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
210 aurelien 260
 
261
		return $donnees_formatees ;
262
	}
263
 
207 aurelien 264
	public function getExportObservationJson() {
265
 
266
		$donnees = $this->getExportObservation();
270 aurelien 267
		$donnees_formatees = $this->formaterListeObservationPourExportJson($donnees);
249 aurelien 268
 
246 aurelien 269
		$this->type_mime = 'application/json';
270
 
207 aurelien 271
		return $donnees_formatees;
272
	}
273
 
270 aurelien 274
	public function formaterListeObservationPourExportJson($tableau_observations_infos) {
207 aurelien 275
 
276
		$gestionnaire_especes = new OdsEspece($this->config);
277
		$gestionnaire_communes = new OdsCommune($this->config);
278
 
279
		$especes = $gestionnaire_especes->getToutesEspeces();
280
		$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
249 aurelien 281
		$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
207 aurelien 282
 
283
		$resultats_formates = array();
284
 
285
		foreach($tableau_observations_infos as $observations_infos) {
286
 
287
			$id_espece = $observations_infos['oi_ce_espece'];
278 aurelien 288
			if($id_espece == 0) {
289
				continue;
290
			}
207 aurelien 291
			$nom_espece =  $especes[$id_espece]['nom_scientifique'];
292
 
293
			$id_evenement = $observations_infos['oo_ce_evenement'];
294
			$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
295
 
296
			$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
297
 
298
			$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
299
 
300
			$id_observation = $observations_infos['oo_id_observation'];
301
			$infos_formatees = array(
302
				'date' => $date_observation_formatee,
303
				'evenenement' => $infos_evenement['nom'],
304
				'code_bbch' => $infos_evenement['numero'],
305
				'nom_scientifique' => $nom_espece,
235 aurelien 306
				'id_espece' => $id_espece,
307
				'participant' => $observations_infos['os_ce_participant']
207 aurelien 308
			);
309
 
310
			$id_station = $observations_infos['oi_ce_station'];
311
 
312
			if(!isset($resultats_formates[$id_station])) {
313
				$resultats_formates[$id_station]['station'] = $observations_infos['os_nom'];
314
				$resultats_formates[$id_station]['code_commune'] = $observations_infos['os_ce_commune'];
315
				//$resultats_formates[$id_station]['nom_commune'] = $gestionnaire_communes->obtenirNomCommuneParCodeInsee($observations_infos['os_ce_commune']);
316
				$resultats_formates[$id_station]['latitude'] = $observations_infos['os_latitude'];
317
				$resultats_formates[$id_station]['longitude'] = $observations_infos['os_longitude'];
318
				$resultats_formates[$id_station]['altitude'] = $observations_infos['os_altitude'];
278 aurelien 319
				if(isset($milieux[$observations_infos['os_ce_environnement']]['ot_valeur'])) {
320
					$resultats_formates[$id_station]['milieu'] = $milieux[$observations_infos['os_ce_environnement']]['ot_valeur'];
321
				} else {
322
					$resultats_formates[$id_station]['milieu'] = '';
323
				}
207 aurelien 324
				$resultats_formates[$id_station]['participant'] = $observations_infos['os_ce_participant'];
325
			}
326
 
327
			$resultats_formates[$id_station]['obs'][$id_observation] = $infos_formatees;
328
		}
329
 
330
		return $resultats_formates;
331
	}
332
 
210 aurelien 333
	public function getFichierExportObservationCsv() {
334
 
335
		$donnees = $this->getExportObservation();
270 aurelien 336
		$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
210 aurelien 337
		$chaine_csv = $this->convertirTableauAssocVersCSV($donnees_formatees);
207 aurelien 338
 
210 aurelien 339
		$this->envoyerFichier($chaine_csv);
207 aurelien 340
	}
341
 
270 aurelien 342
	public function formaterListeObservationPourExportCSV($tableau_observations_infos) {
207 aurelien 343
 
344
		$gestionnaire_especes = new OdsEspece($this->config);
345
		$gestionnaire_communes = new OdsCommune($this->config);
227 aurelien 346
		$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
207 aurelien 347
 
348
		$especes = $gestionnaire_especes->getToutesEspeces();
349
		$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
249 aurelien 350
		$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
207 aurelien 351
 
210 aurelien 352
		$codes_insee_communes = array();
353
 
207 aurelien 354
		$resultats_formates = array();
355
 
356
		foreach($tableau_observations_infos as $observations_infos) {
357
 
358
			$id_espece = $observations_infos['oi_ce_espece'];
359
			$nom_espece =  $especes[$id_espece]['nom_scientifique'];
360
 
361
			$id_evenement = $observations_infos['oo_ce_evenement'];
362
			$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
363
 
364
			$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
365
 
366
			$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
367
 
368
			$id_observation = $observations_infos['oo_id_observation'];
281 aurelien 369
			$milieu = isset($milieux[$observations_infos['os_ce_environnement']]['ot_valeur']) ? $milieux[$observations_infos['os_ce_environnement']]['ot_valeur'] : '';
207 aurelien 370
 
371
			$infos_formatees = array(
372
				'id_observation' => $id_observation,
373
				'date' => $date_observation_formatee,
374
				'evenenement' => $infos_evenement['nom'],
375
				'code_bbch' => $infos_evenement['numero'],
376
				'nom_scientifique' => $nom_espece,
377
				'station' => $observations_infos['os_nom'],
378
				'code_commune' => $observations_infos['os_ce_commune'],
210 aurelien 379
				'nom_commune' => '',
207 aurelien 380
				'latitude' => $observations_infos['os_latitude'],
381
				'longitude' => $observations_infos['os_longitude'],
382
				'altitude' => $observations_infos['os_altitude'],
281 aurelien 383
				'milieu' => $milieu,
227 aurelien 384
				'id_participant' => $observations_infos['os_ce_participant'],
385
				'pseudo_participant' => '',
386
				'mail_participant' => ''
207 aurelien 387
			);
388
 
389
			$resultats_formates[] = $infos_formatees;
210 aurelien 390
 
391
			if(is_numeric($observations_infos['os_ce_commune'])) {
392
				$codes_insee_communes[] = $observations_infos['os_ce_commune'];
393
			}
207 aurelien 394
		}
281 aurelien 395
 
210 aurelien 396
		$correspondance_codes_insee_noms = $gestionnaire_communes->obtenirTableauNomsCommunesParTableauCodesInsee($codes_insee_communes);
227 aurelien 397
		$correspondance_id_utilisateur = $gestionnaire_utilisateurs->getListeUtilisateurFormateeId();
210 aurelien 398
 
399
		foreach($resultats_formates as &$resultat) {
400
 
227 aurelien 401
			if(isset($correspondance_codes_insee_noms[$resultat['code_commune']]) && trim($correspondance_codes_insee_noms[$resultat['code_commune']]) != '') {
210 aurelien 402
				$resultat['nom_commune'] = $correspondance_codes_insee_noms[$resultat['code_commune']];
403
			}
227 aurelien 404
 
405
			$resultat['pseudo_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['name'];
406
			$resultat['mail_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['mail'];
210 aurelien 407
		}
408
 
207 aurelien 409
		return $resultats_formates;
410
	}
411
 
412
	public function convertirTableauAssocVersCSV($tableau) {
413
 
414
		$csv = '';
415
		$colonnes = array_keys($tableau[0]);
416
		$csv .= implode(';',$colonnes).";\n";
417
 
418
		foreach($tableau as $elements) {
281 aurelien 419
			$ligne = "";
420
			// parcours des cases de chaque ligne nécessaire car si on utilise implode
421
			// les valeurs vides ne sont pas prises et ça décale les colonnes
422
			foreach ($elements as $element) {
423
				$ligne .= '"'.$element.'";';
424
			}
425
			$csv .= $ligne."\n";
207 aurelien 426
		}
427
 
428
		return $csv;
429
	}
430
 
281 aurelien 431
	public function envoyerFichier($contenu, $nom = 'observations_export') {
207 aurelien 432
 
281 aurelien 433
		$nom_fichier = $nom.".csv";
207 aurelien 434
		$chemin_fichier = $this->config['appli']['chemin_fichiers_temp'].'/'.$nom_fichier;
435
 
436
		file_put_contents($chemin_fichier, $contenu);
437
 
438
		$contenu = file_get_contents($chemin_fichier);
439
		$taille_fichier = filesize($chemin_fichier);
440
 
441
		unlink($chemin_fichier);
442
 
443
		ini_set('zlib.output_compression','Off');
444
 
445
		header('Pragma: public');
446
		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
447
		header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
448
 
449
		header('Content-Tranfer-Encoding: none');
450
 
451
		header('Content-Type: application/octetstream; name="'.$nom_fichier.'"');
452
		header('Content-Disposition: attachement; filename="'.$nom_fichier.'"');
453
 
454
		header('Content-Length: '.$taille_fichier);
455
 
456
		echo $contenu;
457
		exit();
458
	}
459
 
460
	private function formaterInformationPourEnvoi($tableauinfos) {
461
 
462
	}
463
}
464
?>