Subversion Repositories Sites.obs-saisons.fr

Rev

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