Subversion Repositories Sites.obs-saisons.fr

Rev

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