Subversion Repositories Sites.obs-saisons.fr

Rev

Rev 235 | Rev 248 | 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 '.
282
    								  ' ORDER BY ods_stations.os_id_station, ods_individus.oi_ce_espece ';
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
 
301
			if($stations_infos['os_ce_commune'] == "NULL") {
302
				$stations_infos['os_ce_commune'] = '';
303
			}
304
 
305
			$resultats_formates[$stations_infos['os_id_station']] = array(
306
				'station' => $stations_infos['os_nom'],
307
				'code_commune' => $stations_infos['os_ce_commune'],
308
				'nom_commune' => '',
309
				'latitude' => $stations_infos['os_latitude'],
310
				'longitude' => $stations_infos['os_longitude'],
311
				'altitude' => $stations_infos['os_altitude'],
312
				'id_participant' => $stations_infos['os_ce_participant'],
313
				'pseudo_participant' => '',
314
				'mail_participant' => ''
315
			);
316
 
317
			$infos_espece = $especes[$stations_infos['oi_ce_espece']];
318
			if($infos_espece['type'] != "") {
319
				$infos_espece['type'] = $this->obtenirValeurTripleParId($infos_espece['type']);
320
			}
321
 
322
			$resultats_formates[$stations_infos['os_id_station']]['especes'][] = $infos_espece;
323
 
324
			if(is_numeric($stations_infos['os_ce_commune'])) {
325
				$codes_insee_communes[] = $stations_infos['os_ce_commune'];
326
			}
327
		}
328
 
329
		$correspondance_codes_insee_noms = $gestionnaire_communes->obtenirTableauNomsCommunesParTableauCodesInsee($codes_insee_communes);
330
		$correspondance_id_utilisateur = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
331
 
332
		foreach($resultats_formates as &$resultat) {
333
 
334
			if(isset($correspondance_codes_insee_noms[$resultat['code_commune']]) && trim($correspondance_codes_insee_noms[$resultat['code_commune']]) != '') {
335
				$resultat['nom_commune'] = $correspondance_codes_insee_noms[$resultat['code_commune']];
336
			}
337
 
338
			$resultat['pseudo_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['name'];
339
			$resultat['mail_participant'] = $correspondance_id_utilisateur[$resultat['id_participant']]['mail'];
340
 
341
			//TODO: selection champ infos complémentaires à transmettre
342
		}
343
 
344
		return $resultats_formates;
345
    }
346
 
207 aurelien 347
	public function convertirTableauAssocVersCSV($tableau) {
348
 
349
		$csv = '';
350
		$colonnes = array_keys($tableau[0]);
351
		$csv .= implode(';',$colonnes).";\n";
352
 
353
		foreach($tableau as $elements) {
354
			$csv .= implode(';',$elements).";\n";
355
		}
356
 
357
		return $csv;
358
	}
359
 
360
	public function envoyerFichier($contenu) {
361
 
362
		$nom_fichier = "observations_export.csv";
363
		$chemin_fichier = $this->config['appli']['chemin_fichiers_temp'].'/'.$nom_fichier;
364
 
365
		file_put_contents($chemin_fichier, $contenu);
366
 
367
		$contenu = file_get_contents($chemin_fichier);
368
		$taille_fichier = filesize($chemin_fichier);
369
 
370
		unlink($chemin_fichier);
371
 
372
		ini_set('zlib.output_compression','Off');
373
 
374
		header('Pragma: public');
375
		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
376
		header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
377
 
378
		header('Content-Tranfer-Encoding: none');
379
 
380
		header('Content-Type: application/octetstream; name="'.$nom_fichier.'"');
381
		header('Content-Disposition: attachement; filename="'.$nom_fichier.'"');
382
 
383
		header('Content-Length: '.$taille_fichier);
384
 
385
		echo $contenu;
386
		exit();
387
	}
388
 
389
	private function formaterInformationPourEnvoi($tableauinfos) {
390
 
391
	}
392
}
393
?>