Subversion Repositories Sites.obs-saisons.fr

Rev

Rev 246 | Rev 249 | 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';
8
 
246 aurelien 9
	private $type_mime = 'text/html';
10
 
207 aurelien 11
	/**
12
 	* Méthodes d'extractions d'informations
13
 	*/
14
 
15
	/**
16
     * Méthode appelée avec une requête de type GET.
17
     *
18
     */
19
    function getElement($param = array()) {
20
 
21
    	$type = $param[0];
22
 
23
        if ($type == '*' || is_numeric($type)) {
24
            $info = $this->getElementParDefaut($param);
25
        } else {
26
            $methode = self::PREFIXE.$type;
27
            if (method_exists($this, $methode)) {
28
                array_shift($param);
29
                $info = $this->$methode($param);
30
            } else {
31
                $this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
32
            }
33
        }
34
 
246 aurelien 35
        $this->envoyer($info,$this->type_mime);
207 aurelien 36
    }
246 aurelien 37
 
207 aurelien 38
	public function getExportObservation($start = null,$limit = null, $order_by = 'oo_date') {
227 aurelien 39
 
207 aurelien 40
		$requete_selection_observations = 'SELECT * FROM ods_observations '.
41
									' LEFT JOIN ods_individus '.
42
									' ON oi_id_individu = oo_ce_individu'.
43
									' LEFT JOIN ods_stations '.
44
									' ON oi_ce_station = os_id_station ';
45
 
46
		$requete_selection_observations .= $this->construireConditionRequete();
47
		$requete_selection_observations .= ' ORDER BY oo_date DESC';
48
 
49
		$res_selection_observations = $this->executerRequete($requete_selection_observations);
50
 
51
		return $res_selection_observations;
52
	}
53
 
54
	public function construireConditionRequete() {
55
 
235 aurelien 56
		$condition = ' WHERE oo_date != "0000-00-00" AND DAY(oo_date) != "00" AND ';
207 aurelien 57
 
58
		foreach($_GET as $cle => $valeur) {
59
 
60
			switch($cle) {
61
 
62
				case 'type_espece':
63
					$condition .= 'oi_ce_espece IN (SELECT oe_id_espece FROM ods_especes WHERE oe_ce_type = '.$this->proteger($valeur).')';
64
				break;
65
 
66
				case 'annee':
235 aurelien 67
					if($this->anneesMultiplesDemandees($valeur)) {
68
						$valeur = rtrim($valeur,',');
69
						$condition .= 'YEAR(oo_date) IN ('.$valeur.')';
70
					} else {
71
						$condition .= 'YEAR(oo_date) ';
72
						$condition .= ' = '.$this->proteger($valeur);
73
					}
207 aurelien 74
				break;
75
 
76
				case 'mois':
77
					$condition .= 'MONTH(oo_date) <= '.$this->proteger($valeur);
78
				break;
79
 
80
				case 'espece':
235 aurelien 81
					$condition .= 'oi_ce_espece IN ('.$valeur.') ';
207 aurelien 82
				break;
83
 
84
				case 'evenement':
85
					$condition .= 'oo_ce_evenement = '.$this->proteger($valeur);
86
				break;
87
 
88
				case 'departement':
89
					$condition .= 'os_ce_commune LIKE "'.$valeur.'%" ';
90
				break;
91
 
92
				case 'utilisateur':
93
					$condition .= 'oo_ce_participant = '.$this->proteger($valeur);
94
				break;
95
 
96
				default:
97
				break;
98
			}
99
 
100
			$condition .= ' AND ';
101
		}
102
 
103
		$condition = rtrim($condition,'AND ');
104
 
227 aurelien 105
		$id_demo = $this->config['appli']['id_participant_demo'];
106
		$id_admin = $this->config['appli']['id_participant_admin'];
107
 
108
		$condition .= ' AND oo_ce_participant != '.$id_demo;
109
		$condition .= ' AND oo_ce_participant != '.$id_admin;
110
 
207 aurelien 111
		return $condition;
112
	}
113
 
235 aurelien 114
	private function anneesMultiplesDemandees($annee) {
115
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
116
		// sans virgule terminale
117
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
118
		return preg_match($reg_exp, $annee);
119
	}
120
 
210 aurelien 121
	public function getExportObservationPlat() {
122
 
123
		$donnees = $this->getExportObservation();
246 aurelien 124
		$donnees_formatees = $this->formaterPourExportObservationCSV($donnees);
210 aurelien 125
 
126
		return $donnees_formatees ;
127
	}
128
 
207 aurelien 129
	public function getExportObservationJson() {
130
 
131
		$donnees = $this->getExportObservation();
246 aurelien 132
		$donnees_formatees = $this->formaterPourExportObservationJson($donnees);
207 aurelien 133
 
246 aurelien 134
		$this->type_mime = 'application/json';
135
 
207 aurelien 136
		return $donnees_formatees;
137
	}
138
 
246 aurelien 139
	public function formaterPourExportObservationJson($tableau_observations_infos) {
207 aurelien 140
 
141
		$gestionnaire_especes = new OdsEspece($this->config);
142
		$gestionnaire_communes = new OdsCommune($this->config);
143
 
144
		$especes = $gestionnaire_especes->getToutesEspeces();
145
		$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
146
 
147
		$resultats_formates = array();
148
 
149
		foreach($tableau_observations_infos as $observations_infos) {
150
 
151
			$id_espece = $observations_infos['oi_ce_espece'];
152
			$nom_espece =  $especes[$id_espece]['nom_scientifique'];
153
 
154
			$id_evenement = $observations_infos['oo_ce_evenement'];
155
			$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
156
 
157
			$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
158
 
159
			$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
160
 
161
			$id_observation = $observations_infos['oo_id_observation'];
162
			$infos_formatees = array(
163
				'date' => $date_observation_formatee,
164
				'evenenement' => $infos_evenement['nom'],
165
				'code_bbch' => $infos_evenement['numero'],
166
				'nom_scientifique' => $nom_espece,
235 aurelien 167
				'id_espece' => $id_espece,
168
				'participant' => $observations_infos['os_ce_participant']
207 aurelien 169
			);
170
 
171
			$id_station = $observations_infos['oi_ce_station'];
172
 
173
			if(!isset($resultats_formates[$id_station])) {
174
				$resultats_formates[$id_station]['station'] = $observations_infos['os_nom'];
175
				$resultats_formates[$id_station]['code_commune'] = $observations_infos['os_ce_commune'];
176
				//$resultats_formates[$id_station]['nom_commune'] = $gestionnaire_communes->obtenirNomCommuneParCodeInsee($observations_infos['os_ce_commune']);
177
				$resultats_formates[$id_station]['latitude'] = $observations_infos['os_latitude'];
178
				$resultats_formates[$id_station]['longitude'] = $observations_infos['os_longitude'];
179
				$resultats_formates[$id_station]['altitude'] = $observations_infos['os_altitude'];
180
				$resultats_formates[$id_station]['milieu'] = $observations_infos['os_milieu'];
181
				$resultats_formates[$id_station]['participant'] = $observations_infos['os_ce_participant'];
182
			}
183
 
184
			$resultats_formates[$id_station]['obs'][$id_observation] = $infos_formatees;
185
		}
186
 
187
		return $resultats_formates;
188
	}
189
 
210 aurelien 190
	public function getFichierExportObservationCsv() {
191
 
192
		$donnees = $this->getExportObservation();
246 aurelien 193
		$donnees_formatees = $this->formaterPourExportObservationCSV($donnees);
210 aurelien 194
		$chaine_csv = $this->convertirTableauAssocVersCSV($donnees_formatees);
207 aurelien 195
 
210 aurelien 196
		$this->envoyerFichier($chaine_csv);
207 aurelien 197
	}
198
 
246 aurelien 199
	public function formaterPourExportObservationCSV($tableau_observations_infos) {
207 aurelien 200
 
201
		$gestionnaire_especes = new OdsEspece($this->config);
202
		$gestionnaire_communes = new OdsCommune($this->config);
227 aurelien 203
		$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
207 aurelien 204
 
205
		$especes = $gestionnaire_especes->getToutesEspeces();
206
		$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
207
 
210 aurelien 208
		$codes_insee_communes = array();
209
 
207 aurelien 210
		$resultats_formates = array();
211
 
212
		foreach($tableau_observations_infos as $observations_infos) {
213
 
214
			$id_espece = $observations_infos['oi_ce_espece'];
215
			$nom_espece =  $especes[$id_espece]['nom_scientifique'];
216
 
217
			$id_evenement = $observations_infos['oo_ce_evenement'];
218
			$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
219
 
220
			$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
221
 
222
			$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
223
 
224
			$id_observation = $observations_infos['oo_id_observation'];
225
 
226
			$infos_formatees = array(
227
				'id_observation' => $id_observation,
228
				'date' => $date_observation_formatee,
229
				'evenenement' => $infos_evenement['nom'],
230
				'code_bbch' => $infos_evenement['numero'],
231
				'nom_scientifique' => $nom_espece,
232
				'station' => $observations_infos['os_nom'],
233
				'code_commune' => $observations_infos['os_ce_commune'],
210 aurelien 234
				'nom_commune' => '',
207 aurelien 235
				'latitude' => $observations_infos['os_latitude'],
236
				'longitude' => $observations_infos['os_longitude'],
237
				'altitude' => $observations_infos['os_altitude'],
238
				'milieu' => $observations_infos['os_milieu'],
227 aurelien 239
				'id_participant' => $observations_infos['os_ce_participant'],
240
				'pseudo_participant' => '',
241
				'mail_participant' => ''
207 aurelien 242
			);
243
 
244
			$resultats_formates[] = $infos_formatees;
210 aurelien 245
 
246
			if(is_numeric($observations_infos['os_ce_commune'])) {
247
				$codes_insee_communes[] = $observations_infos['os_ce_commune'];
248
			}
207 aurelien 249
		}
250
 
210 aurelien 251
		$correspondance_codes_insee_noms = $gestionnaire_communes->obtenirTableauNomsCommunesParTableauCodesInsee($codes_insee_communes);
227 aurelien 252
		$correspondance_id_utilisateur = $gestionnaire_utilisateurs->getListeUtilisateurFormateeId();
210 aurelien 253
 
254
		foreach($resultats_formates as &$resultat) {
255
 
227 aurelien 256
			if(isset($correspondance_codes_insee_noms[$resultat['code_commune']]) && trim($correspondance_codes_insee_noms[$resultat['code_commune']]) != '') {
210 aurelien 257
				$resultat['nom_commune'] = $correspondance_codes_insee_noms[$resultat['code_commune']];
258
			}
227 aurelien 259
 
260
			$resultat['pseudo_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['name'];
261
			$resultat['mail_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['mail'];
210 aurelien 262
		}
263
 
207 aurelien 264
		return $resultats_formates;
265
	}
266
 
246 aurelien 267
	public function getExportStationJson() {
268
 
269
    	$donnees = $this->getExportStation();
270
    	$donnees_formatees = $this->formaterPourExportStationJson($donnees);
271
 
272
    	$this->type_mime = 'application/json';
273
 
274
    	return $donnees_formatees;
275
    }
276
 
277
    public function getExportStation() {
278
 
279
    	$requete_selection_stations = 'SELECT * FROM ods_stations '.
280
    								  ' LEFT JOIN ods_individus '.
281
    								  ' ON ods_individus.oi_ce_station = ods_stations.os_id_station '.
248 aurelien 282
    								  ' ORDER BY ods_stations.os_id_station, ods_individus.oi_ce_espece';
246 aurelien 283
 
284
 		$res_selection_stations = $this->executerRequete($requete_selection_stations);
285
 
286
 		return $res_selection_stations;
287
    }
288
 
289
    public function formaterPourExportStationJson($tableau_stations_infos) {
290
 
291
    	$gestionnaire_especes = new OdsEspece($this->config);
292
		$gestionnaire_communes = new OdsCommune($this->config);
293
		$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
294
 
295
		$especes = $gestionnaire_especes->getToutesEspeces();
296
 
297
		$resultats_formates = array();
298
 
299
		foreach($tableau_stations_infos as &$stations_infos) {
300
 
248 aurelien 301
			if(!isset($resultats_formates[$stations_infos['os_id_station']])) {
302
				if($stations_infos['os_ce_commune'] == "NULL") {
303
					$stations_infos['os_ce_commune'] = '';
304
				}
305
 
306
				$resultats_formates[$stations_infos['os_id_station']] = array(
307
					'station' => $stations_infos['os_nom'],
308
					'code_commune' => $stations_infos['os_ce_commune'],
309
					'nom_commune' => '',
310
					'latitude' => $stations_infos['os_latitude'],
311
					'longitude' => $stations_infos['os_longitude'],
312
					'altitude' => $stations_infos['os_altitude'],
313
					'id_participant' => $stations_infos['os_ce_participant'],
314
					'pseudo_participant' => '',
315
					'mail_participant' => '',
316
					'especes' => array()
317
				);
318
 
319
				if(is_numeric($stations_infos['os_ce_commune'])) {
320
					$codes_insee_communes[] = $stations_infos['os_ce_commune'];
321
				}
246 aurelien 322
			}
323
 
324
			$infos_espece = $especes[$stations_infos['oi_ce_espece']];
325
 
248 aurelien 326
			if($infos_espece != null) {
327
 
328
				if($infos_espece['type'] != "") {
329
					$infos_espece['type'] = $this->obtenirValeurTripleParId($infos_espece['type']);
330
				}
331
 
332
				$resultats_formates[$stations_infos['os_id_station']]['especes'][$infos_espece['id_espece']] = $infos_espece;
246 aurelien 333
			}
334
		}
335
 
336
		$correspondance_codes_insee_noms = $gestionnaire_communes->obtenirTableauNomsCommunesParTableauCodesInsee($codes_insee_communes);
337
		$correspondance_id_utilisateur = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
338
 
339
		foreach($resultats_formates as &$resultat) {
340
 
341
			if(isset($correspondance_codes_insee_noms[$resultat['code_commune']]) && trim($correspondance_codes_insee_noms[$resultat['code_commune']]) != '') {
342
				$resultat['nom_commune'] = $correspondance_codes_insee_noms[$resultat['code_commune']];
343
			}
344
 
345
			$resultat['pseudo_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['name'];
346
			$resultat['mail_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['mail'];
347
 
248 aurelien 348
			$types = array("Particulier" ,"Établissement scolaire", "Association" ,"Professionnel", "Autre","Inconnu");
349
 
350
			if(isset($correspondance_id_utilisateur[$resultat['id_participant']]['profile_type'])) {
351
				$resultat['type_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['profile_type'];
352
			} else {
353
				$resultat['type_participant'] = "Inconnu";
354
			}
246 aurelien 355
		}
356
 
357
		return $resultats_formates;
358
    }
359
 
207 aurelien 360
	public function convertirTableauAssocVersCSV($tableau) {
361
 
362
		$csv = '';
363
		$colonnes = array_keys($tableau[0]);
364
		$csv .= implode(';',$colonnes).";\n";
365
 
366
		foreach($tableau as $elements) {
367
			$csv .= implode(';',$elements).";\n";
368
		}
369
 
370
		return $csv;
371
	}
372
 
373
	public function envoyerFichier($contenu) {
374
 
375
		$nom_fichier = "observations_export.csv";
376
		$chemin_fichier = $this->config['appli']['chemin_fichiers_temp'].'/'.$nom_fichier;
377
 
378
		file_put_contents($chemin_fichier, $contenu);
379
 
380
		$contenu = file_get_contents($chemin_fichier);
381
		$taille_fichier = filesize($chemin_fichier);
382
 
383
		unlink($chemin_fichier);
384
 
385
		ini_set('zlib.output_compression','Off');
386
 
387
		header('Pragma: public');
388
		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
389
		header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
390
 
391
		header('Content-Tranfer-Encoding: none');
392
 
393
		header('Content-Type: application/octetstream; name="'.$nom_fichier.'"');
394
		header('Content-Disposition: attachement; filename="'.$nom_fichier.'"');
395
 
396
		header('Content-Length: '.$taille_fichier);
397
 
398
		echo $contenu;
399
		exit();
400
	}
401
 
402
	private function formaterInformationPourEnvoi($tableauinfos) {
403
 
404
	}
405
}
406
?>