Subversion Repositories Sites.obs-saisons.fr

Rev

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