Subversion Repositories Sites.obs-saisons.fr

Rev

Rev 330 | 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 {
320 aurelien 4
 
207 aurelien 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';
320 aurelien 11
 
207 aurelien 12
	/**
13
 	* Méthodes d'extractions d'informations
14
 	*/
320 aurelien 15
 
207 aurelien 16
	/**
17
     * Méthode appelée avec une requête de type GET.
18
     *
19
     */
20
    function getElement($param = array()) {
320 aurelien 21
 
207 aurelien 22
    	$type = $param[0];
320 aurelien 23
 
207 aurelien 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
    }
320 aurelien 38
 
270 aurelien 39
    public function getExportStationJson() {
320 aurelien 40
 
270 aurelien 41
    	$donnees = $this->getExportStation();
42
    	$donnees_formatees = $this->formaterListeStationPourExportJson($donnees);
320 aurelien 43
 
270 aurelien 44
    	$this->type_mime = 'application/json';
320 aurelien 45
 
270 aurelien 46
    	return $donnees_formatees;
47
    }
320 aurelien 48
 
330 aurelien 49
		public function getExportEvolutionPhenologiqueJson() {
50
 
51
				$evenements = explode(',', $_GET['evenements']);
52
				$condition_evenements = '';
53
				$sous_condition_evenements = [];
54
				foreach($evenements as $evenement) {
55
					$sous_condition_evenements[] = 'oo_ce_evenement = '.$this->proteger($evenement);
56
				}
57
				$condition_evenements .= '('.implode(' OR ', $sous_condition_evenements).')';
58
				$condition_espece = 'oi_ce_espece = '.$this->proteger($_GET['espece']);
59
 
60
				$formule_moyenne_date = 'FROM_UNIXTIME(AVG(UNIX_TIMESTAMP((oo_date))))';
61
 
62
				$requete = 'SELECT '.$formule_moyenne_date.' as date_moyenne, oo_ce_evenement FROM ods_observations oo '.
63
										'LEFT JOIN ods_individus oi ON oi_id_individu = oo_ce_individu '.
64
										'INNER JOIN ods_especes oe ON oe.oe_espece_active = 1 '.
65
										'AND oe.oe_id_espece = oi_ce_espece '.
66
										'WHERE oo_date != "0000-00-00" AND DAY(oo_date) != "00" '.
67
										'AND '.$condition_espece.' '.
68
										'AND '.$condition_evenements.' '.
69
										'AND oo_ce_participant != "4" AND oo_ce_participant != 1 AND oo_absence_evenement = "0" '.
70
										'GROUP BY YEAR(oo_date), oo_ce_evenement '.
71
										'ORDER BY oo_date DESC';
72
 
73
				$donnees = $this->executerRequete($requete);
74
 
75
				$donnees_formatees = [];
76
				foreach($donnees as $donnee) {
77
					$stade = $donnee['oo_ce_evenement'];
78
					if(empty($donnees_formatees[$stade])) {
79
						$donnees_formatees[$stade] = ['x' => [], 'y' => []];
80
					}
81
 
82
					$date_time = strtotime($donnee['date_moyenne']);
83
					// on ramène grossièrement la date de l'année à une valeur numérique
84
					// ex: le 15 janvier devient 1.5
85
					$nb_jours_dans_mois = date(' t ', strtotime($date_time));
86
					$jour_mois_num = (date('d', $date_time)/$nb_jours_dans_mois)+date('m', $date_time);
87
 
88
					$donnees_formatees[$stade]['x'][] = $donnee['date_moyenne'];
89
					$donnees_formatees[$stade]['y'][] = $jour_mois_num;
90
					$donnees_formatees[$stade]['text'][] = date('d/m/Y', strtotime($donnee['date_moyenne']));
91
				}
92
 
93
				$this->type_mime = 'application/json';
94
 
95
				return $donnees_formatees;
96
		}
97
 
98
		public function getExportPhasesPhenologiquesJson() {
99
 
100
			$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
101
			$evenements_a_regrouper = [];
102
 
103
			foreach($evenements as $evenement) {
104
				$nom_evenement = $evenement['ot_cle'];
105
				$nom_evenement_tab = explode('_', $nom_evenement);
106
 
107
				// évènement à plusieurs stades (evenement_floraison_stade_11 par exemple)
108
				if(count($nom_evenement_tab) == 4) {
109
					// on fait pointer la clé de l'évènement vers sont groupe (dans l'exemple floraison)
110
					$evenements_a_regrouper[$evenement['ot_id_triple']] = $nom_evenement_tab[1];
111
				} else {
112
					// sinon ce sont des evènements à un seul stade (comme premiere_apparition)
113
					// auquel cas on supprime juste le suffixe evenement_
114
					$evenements_a_regrouper[$evenement['ot_id_triple']] = str_replace('evenement_', '',$nom_evenement);
115
				}
116
			}
117
 
118
			$requete = 'SELECT oo_date, oo_ce_evenement FROM ods_observations oo '.
119
									'LEFT JOIN ods_individus oi ON oi_id_individu = oo_ce_individu '.
120
									'INNER JOIN ods_especes oe ON oe.oe_espece_active = 1 '.
332 aurelien 121
									'AND oe.oe_id_espece = oi_ce_espece ';
122
 
123
									// si on indique zéro on peut obtenir toutes les années
124
									if(isset($_GET['annee']) && $_GET['annee'] != 0) {
125
										$requete .= 'AND YEAR(oo_date) = '.$this->proteger($_GET['annee']).' ';
126
									}
127
 
128
									$requete .= 'WHERE oo_date != "0000-00-00" AND DAY(oo_date) != "00" '.
330 aurelien 129
									'AND oi_ce_espece = '.$this->proteger($_GET['espece']).' '.
130
									'AND oo_ce_participant != "4" AND oo_ce_participant != 1 AND oo_absence_evenement = "0" '.
131
									'ORDER BY oo_date DESC';
132
 
133
			$donnees = $this->executerRequete($requete);
134
 
135
			$donnees_formatees = [];
136
			// Regroupement d'évenements allant ensemble (ex.: début et fin de floraison)
137
			foreach($donnees as $donnee) {
138
				$cle_groupe_evenements = $evenements_a_regrouper[$donnee['oo_ce_evenement']];
139
				if(empty($donnees_formatees[$cle_groupe_evenements])) {
140
					$donnees_formatees[$cle_groupe_evenements] = [];
141
				}
142
 
143
				$date_time = strtotime($donnee['oo_date']);
144
				// on ramène la date de l'année à une valeur numérique
145
				// ex: le 15 janvier devient 1.5 pour pouvoir afficher ça plus simplement
146
				// sur le graphique d'arrivée qui n'aura à travailler qu'avec des nombres
147
				$nb_jours_dans_mois = date(' t ', strtotime($date_time));
148
				$jour_mois_num = (date('d', $date_time)/$nb_jours_dans_mois)+date('m', $date_time);
149
				// on garde 7 chiffres après la virgule car côté client on a besoin de s'assurer d'une largeur
150
				// suffisante lors du calcul de la légende de chaque point.
151
				// En fait la largeur du nombre détermine la largeur de son conteneur affiché lorsdu hover sur le point,
152
				// or il est nécessaire de remplacer cette légende lors de l'affichage (qui contient un nombre) par une vraie date.
332 aurelien 153
				// ceci est une limitation plot.ly (côté client) qui n'offre pas de fonction de formatage
330 aurelien 154
				$jour_mois_num = number_format($jour_mois_num, 7);
155
 
156
				$donnees_formatees[$cle_groupe_evenements]['x'][] = $jour_mois_num;
157
				$donnees_formatees[$cle_groupe_evenements]['text'][] = date('d/m/Y', strtotime($donnee['oo_date']));
158
 
159
 
160
				$donnees_formatees[$cle_groupe_evenements]['text_index']["'".$jour_mois_num."'"] = date('d/m/Y', strtotime($donnee['oo_date']));
161
			}
162
 
163
			$this->type_mime = 'application/json';
164
 
165
			return $donnees_formatees;
166
		}
167
 
270 aurelien 168
    public function getExportStation($start = null,$limit = null, $order_by = 'oo_date') {
320 aurelien 169
 
279 aurelien 170
    	$id_demo = $this->config['appli']['id_participant_demo'];
320 aurelien 171
    	$requete_selection_stations = 'SELECT * FROM ods_stations WHERE os_ce_participant != '.$this->proteger($id_demo);
270 aurelien 172
    	$res_selection_stations = $this->executerRequete($requete_selection_stations);
320 aurelien 173
 
270 aurelien 174
    	return $res_selection_stations;
175
    }
320 aurelien 176
 
281 aurelien 177
    public function getExportUtilisateurCsv() {
320 aurelien 178
 
281 aurelien 179
    	$controle = new ControleUtilisateur($this->config);
180
    	$controle->authentifierAdmin();
320 aurelien 181
 
281 aurelien 182
    	$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
183
    	$utilisateurs = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
320 aurelien 184
 
281 aurelien 185
    	$utilisateurs_formates = array();
186
    	$premiere_annee = 2006;
320 aurelien 187
 
281 aurelien 188
    	$nb_obs = $this->compterObservationsParUtilisateur();
282 aurelien 189
    	$annees = array();
320 aurelien 190
 
281 aurelien 191
    	foreach ($utilisateurs as $id => $utilisateur) {
192
    		$utilisateur_formate = array(
193
	    		'id' => isset($utilisateur['uid']) ? $utilisateur['uid'] : '',
194
	    		'pseudo' => isset($utilisateur['name']) ? $utilisateur['name'] : '',
195
	    		'mail' => isset($utilisateur['mail']) ? $utilisateur['mail'] : '',
196
	    		'nom' => isset($utilisateur['profile_nom']) ? $utilisateur['profile_nom'] : '',
197
	    		'prenom' => isset($utilisateur['profile_prenom']) ? $utilisateur['profile_prenom'] : '',
198
	    		'code postal' => isset($utilisateur['profile_code_postal']) ? $utilisateur['profile_code_postal'] : '',
199
	    		'ville' => isset($utilisateur['profile_ville']) ? $utilisateur['profile_ville'] : '',
282 aurelien 200
	    		'type' => isset($utilisateur['profile_type']) ? $utilisateur['profile_type'] : '',
201
	    		'date inscription' => isset($utilisateur['created']) ? date('d/m/Y', $utilisateur['created']) : '',
281 aurelien 202
    		);
320 aurelien 203
 
281 aurelien 204
    		for($i = $premiere_annee; $i <= date('Y'); $i++) {
282 aurelien 205
    			$annees['annee '.$i] += isset($nb_obs[$utilisateur['uid']]) && isset($nb_obs[$utilisateur['uid']][$i]) ? $nb_obs[$utilisateur['uid']][$i] : '0';
281 aurelien 206
    			$utilisateur_formate['annee '.$i] = isset($nb_obs[$utilisateur['uid']]) && isset($nb_obs[$utilisateur['uid']][$i]) ? $nb_obs[$utilisateur['uid']][$i] : '0';
207
    		}
320 aurelien 208
 
281 aurelien 209
    		$utilisateurs_formates[] = $utilisateur_formate;
210
    	}
320 aurelien 211
 
282 aurelien 212
    	$ligne_total_obs = array(
213
    		'id' => '',
214
    		'pseudo' => '',
215
    		'mail' => '',
216
    		'nom' => '',
217
    		'prenom' => '',
218
    		'code postal' => '',
219
    		'ville' => '',
220
    		'type' => '',
221
    		'date inscription' => ''
222
    	);
223
    	$ligne_total_obs = array_merge($ligne_total_obs, $annees);
224
    	$utilisateurs_formates[] = $ligne_total_obs;
281 aurelien 225
    	$csv = $this->convertirTableauAssocVersCSV($utilisateurs_formates);
226
    	$this->envoyerFichier($csv, 'utilisateurs');
227
    }
320 aurelien 228
 
281 aurelien 229
    private function compterObservationsParUtilisateur() {
230
    	$requete = 'SELECT COUNT(*) as nb_obs, oo_ce_participant as participant, YEAR(oo_date) as annee '.
231
    			   'FROM `ods_observations` WHERE oo_date != "0000-00-00" GROUP BY oo_ce_participant, YEAR(oo_date)';
320 aurelien 232
 
281 aurelien 233
    	$res_selection_obs = $this->executerRequete($requete);
234
    	$stats = array();
235
    	foreach ($res_selection_obs as $obs_nb) {
236
    		$stats[$obs_nb['participant']][$obs_nb['annee']] = $obs_nb['nb_obs'];
237
    	}
320 aurelien 238
 
281 aurelien 239
    	return $stats;
240
    }
320 aurelien 241
 
270 aurelien 242
    public function formaterListeStationPourExportJson($tableau_stations_infos) {
320 aurelien 243
 
270 aurelien 244
    	$gestionnaire_especes = new OdsEspece($this->config);
245
    	$gestionnaire_communes = new OdsCommune($this->config);
246
    	$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
320 aurelien 247
 
270 aurelien 248
    	$especes = $gestionnaire_especes->getToutesEspeces();
249
    	$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
250
    	$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
251
    	$utilisateurs = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
252
    	$communes = $gestionnaire_communes->obtenirCommunesLieesAStationIndexeesCodeInsee();
320 aurelien 253
 
270 aurelien 254
    	$resultats_formates = array();
255
    	$stats = array('total' => count($tableau_stations_infos));
320 aurelien 256
 
257
    	foreach($tableau_stations_infos as $stations_infos) {
270 aurelien 258
    		$commune = isset($communes[$stations_infos['os_ce_commune']]['oc_nom']) ? $communes[$stations_infos['os_ce_commune']]['oc_nom'] : '';
320 aurelien 259
 
270 aurelien 260
    		$id_station = $stations_infos['os_id_station'];
261
    		$resultats_formates[$id_station]['nom'] = $stations_infos['os_nom'];
262
    		$resultats_formates[$id_station]['code_commune'] = is_numeric($stations_infos['os_ce_commune']) ? substr($stations_infos['os_ce_commune'], 0, 2) : '';
263
    		$resultats_formates[$id_station]['nom_commune'] = $commune;
264
    		$resultats_formates[$id_station]['latitude'] = $stations_infos['os_latitude'];
265
    		$resultats_formates[$id_station]['longitude'] = $stations_infos['os_longitude'];
266
    		$resultats_formates[$id_station]['altitude'] = $stations_infos['os_altitude'];
267
    		$resultats_formates[$id_station]['type_participant'] = 'Particulier';
320 aurelien 268
 
270 aurelien 269
    		if(isset($utilisateurs[$stations_infos['os_ce_participant']])) {
270
    			$participant = $utilisateurs[$stations_infos['os_ce_participant']];
271
    			$resultats_formates[$id_station]['participant']['id'] = $participant['uid'];
272
    			$resultats_formates[$id_station]['participant']['nom'] = $participant['name'];
273
    			$resultats_formates[$id_station]['type_participant'] = isset($participant['profile_type']) ? $participant['profile_type'] : 'Particulier';
274
    		} else {
275
    			$resultats_formates[$id_station]['participant']['id'] = null;
276
    			$resultats_formates[$id_station]['participant']['nom'] = 'Anonyme';
277
    			$resultats_formates[$id_station]['type_participant'] = 'Particulier';
278
    		}
279
    		if(isset($stats[$resultats_formates[$id_station]['type_participant']])) {
280
    			$stats[$resultats_formates[$id_station]['type_participant']]++;
281
    		} else {
282
    			$stats[$resultats_formates[$id_station]['type_participant']] = 1;
283
    		}
284
    	}
320 aurelien 285
    	$resultat = array('stats' => $stats, 'stations' => $resultats_formates);
270 aurelien 286
    	return $resultat;
287
    }
320 aurelien 288
 
207 aurelien 289
	public function getExportObservation($start = null,$limit = null, $order_by = 'oo_date') {
320 aurelien 290
 
284 aurelien 291
		$requete_selection_observations = 'SELECT oo.*, oi.*, os.*, oc.* FROM ods_observations oo'.
320 aurelien 292
									' LEFT JOIN ods_individus oi'.
207 aurelien 293
									' ON oi_id_individu = oo_ce_individu'.
284 aurelien 294
									' INNER JOIN ods_especes oe'.
295
									' ON oe.oe_espece_active = 1 '.
296
									' AND oe.oe_id_espece = oi_ce_espece '.
297
									' LEFT JOIN ods_stations os'.
263 gduche 298
									' ON oi_ce_station = os_id_station '.
284 aurelien 299
									' LEFT JOIN ods_communes oc'.
300
									' ON os_ce_commune = oc_code_insee ';
301
 
207 aurelien 302
		$requete_selection_observations .= $this->construireConditionRequete();
303
		$requete_selection_observations .= ' ORDER BY oo_date DESC';
284 aurelien 304
 
207 aurelien 305
		$res_selection_observations = $this->executerRequete($requete_selection_observations);
284 aurelien 306
 
207 aurelien 307
		return $res_selection_observations;
308
	}
320 aurelien 309
 
270 aurelien 310
	private function creerFiltreIdZoneGeo($valeurMasque) {
311
		$masque = '';
312
		$dept = $valeurMasque;
313
		$dept = sprintf('%02s', $dept);
314
		$dept = sprintf("%-'_5s", $dept);
315
		$masque = " oc_code_insee LIKE ".$this->proteger($dept);
316
		return $masque;
263 gduche 317
	}
320 aurelien 318
 
207 aurelien 319
	public function construireConditionRequete() {
320 aurelien 320
 
235 aurelien 321
		$condition = ' WHERE oo_date != "0000-00-00" AND DAY(oo_date) != "00" AND ';
320 aurelien 322
 
207 aurelien 323
		foreach($_GET as $cle => $valeur) {
320 aurelien 324
 
207 aurelien 325
			switch($cle) {
320 aurelien 326
 
207 aurelien 327
				case 'type_espece':
328
					$condition .= 'oi_ce_espece IN (SELECT oe_id_espece FROM ods_especes WHERE oe_ce_type = '.$this->proteger($valeur).')';
329
				break;
320 aurelien 330
 
207 aurelien 331
				case 'annee':
235 aurelien 332
					if($this->anneesMultiplesDemandees($valeur)) {
333
						$valeur = rtrim($valeur,',');
320 aurelien 334
						$condition .= 'YEAR(oo_date) IN ('.$valeur.')';
235 aurelien 335
					} else {
336
						$condition .= 'YEAR(oo_date) ';
337
						$condition .= ' = '.$this->proteger($valeur);
338
					}
207 aurelien 339
				break;
320 aurelien 340
 
207 aurelien 341
				case 'mois':
342
					$condition .= 'MONTH(oo_date) <= '.$this->proteger($valeur);
343
				break;
320 aurelien 344
 
207 aurelien 345
				case 'espece':
235 aurelien 346
					$condition .= 'oi_ce_espece IN ('.$valeur.') ';
207 aurelien 347
				break;
320 aurelien 348
 
207 aurelien 349
				case 'evenement':
350
					$condition .= 'oo_ce_evenement = '.$this->proteger($valeur);
351
				break;
320 aurelien 352
 
330 aurelien 353
				case 'evenements':
354
					//$condition .= 'oo_ce_evenement IN ('.$this->proteger($valeur).')';
355
					$evenements = explode(',', $valeur);
356
					$sous_condition_evenements = [];
357
					foreach($evenements as $evenement) {
358
						$sous_condition_evenements[] = 'oo_ce_evenement = '.$this->proteger($evenement);
359
					}
360
					$condition .= '('.implode(' OR ', $sous_condition_evenements).')';
361
				break;
362
 
207 aurelien 363
				case 'utilisateur':
320 aurelien 364
					$condition .= 'oo_ce_participant = '.$this->proteger($valeur);
207 aurelien 365
				break;
320 aurelien 366
 
264 gduche 367
				case 'departement' :
263 gduche 368
					$condition .= $this->creerFiltreIdZoneGeo($valeur);
369
				break;
320 aurelien 370
 
264 gduche 371
				case 'region' :
327 aurelien 372
					$requete_association_region = 'SELECT * FROM ods_triples WHERE ot_ce_parent = 36 AND ot_valeur = '.$valeur;
264 gduche 373
					$listeAssociationRegions = $this->executerRequete($requete_association_region);
374
					$departements = array();
375
					foreach ($listeAssociationRegions as $associationRegion) {
376
						$departements[] = $this->creerFiltreIdZoneGeo($associationRegion['ot_cle']);
377
					}
378
					$condition .= ' ('. implode(' OR ', $departements).')';
379
				break;
207 aurelien 380
			}
320 aurelien 381
 
207 aurelien 382
			$condition .= ' AND ';
383
		}
320 aurelien 384
 
207 aurelien 385
		$condition = rtrim($condition,'AND ');
320 aurelien 386
 
227 aurelien 387
		$id_demo = $this->config['appli']['id_participant_demo'];
388
		$id_admin = $this->config['appli']['id_participant_admin'];
320 aurelien 389
 
227 aurelien 390
		$condition .= ' AND oo_ce_participant != '.$id_demo;
391
		$condition .= ' AND oo_ce_participant != '.$id_admin;
320 aurelien 392
 
324 aurelien 393
		// par défaut les observations d'absence d'évènement ne sont pas incluses
394
		// sauf si on le demande explicitement
395
		if(empty($_GET['inclure-absences']) || $_GET['inclure-absences'] == 0) {
396
			$condition .= ' AND oo_absence_evenement = 0';
397
		}
398
 
207 aurelien 399
		return $condition;
400
	}
320 aurelien 401
 
235 aurelien 402
	private function anneesMultiplesDemandees($annee) {
403
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
404
		// sans virgule terminale
405
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
406
		return preg_match($reg_exp, $annee);
407
	}
320 aurelien 408
 
210 aurelien 409
	public function getExportObservationPlat() {
324 aurelien 410
		// dans le csv les observations d'absence sont inclues par contre
411
		$_GET['inclure-absences'] = 1;
210 aurelien 412
		$donnees = $this->getExportObservation();
320 aurelien 413
		$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
414
 
210 aurelien 415
		return $donnees_formatees ;
416
	}
320 aurelien 417
 
207 aurelien 418
	public function getExportObservationJson() {
320 aurelien 419
 
207 aurelien 420
		$donnees = $this->getExportObservation();
270 aurelien 421
		$donnees_formatees = $this->formaterListeObservationPourExportJson($donnees);
249 aurelien 422
 
246 aurelien 423
		$this->type_mime = 'application/json';
320 aurelien 424
 
207 aurelien 425
		return $donnees_formatees;
426
	}
320 aurelien 427
 
270 aurelien 428
	public function formaterListeObservationPourExportJson($tableau_observations_infos) {
320 aurelien 429
 
207 aurelien 430
		$gestionnaire_especes = new OdsEspece($this->config);
431
		$gestionnaire_communes = new OdsCommune($this->config);
320 aurelien 432
 
207 aurelien 433
		$especes = $gestionnaire_especes->getToutesEspeces();
434
		$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
249 aurelien 435
		$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
320 aurelien 436
 
207 aurelien 437
		$resultats_formates = array();
320 aurelien 438
 
207 aurelien 439
		foreach($tableau_observations_infos as $observations_infos) {
320 aurelien 440
 
207 aurelien 441
			$id_espece = $observations_infos['oi_ce_espece'];
278 aurelien 442
			if($id_espece == 0) {
443
				continue;
444
			}
207 aurelien 445
			$nom_espece =  $especes[$id_espece]['nom_scientifique'];
320 aurelien 446
 
207 aurelien 447
			$id_evenement = $observations_infos['oo_ce_evenement'];
448
			$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
320 aurelien 449
 
207 aurelien 450
			$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
320 aurelien 451
 
207 aurelien 452
			$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
320 aurelien 453
 
207 aurelien 454
			$id_observation = $observations_infos['oo_id_observation'];
455
			$infos_formatees = array(
456
				'date' => $date_observation_formatee,
457
				'evenenement' => $infos_evenement['nom'],
458
				'code_bbch' => $infos_evenement['numero'],
459
				'nom_scientifique' => $nom_espece,
235 aurelien 460
				'id_espece' => $id_espece,
461
				'participant' => $observations_infos['os_ce_participant']
207 aurelien 462
			);
320 aurelien 463
 
207 aurelien 464
			$id_station = $observations_infos['oi_ce_station'];
320 aurelien 465
 
207 aurelien 466
			if(!isset($resultats_formates[$id_station])) {
467
				$resultats_formates[$id_station]['station'] = $observations_infos['os_nom'];
468
				$resultats_formates[$id_station]['code_commune'] = $observations_infos['os_ce_commune'];
469
				//$resultats_formates[$id_station]['nom_commune'] = $gestionnaire_communes->obtenirNomCommuneParCodeInsee($observations_infos['os_ce_commune']);
470
				$resultats_formates[$id_station]['latitude'] = $observations_infos['os_latitude'];
471
				$resultats_formates[$id_station]['longitude'] = $observations_infos['os_longitude'];
472
				$resultats_formates[$id_station]['altitude'] = $observations_infos['os_altitude'];
278 aurelien 473
				if(isset($milieux[$observations_infos['os_ce_environnement']]['ot_valeur'])) {
474
					$resultats_formates[$id_station]['milieu'] = $milieux[$observations_infos['os_ce_environnement']]['ot_valeur'];
475
				} else {
476
					$resultats_formates[$id_station]['milieu'] = '';
477
				}
207 aurelien 478
				$resultats_formates[$id_station]['participant'] = $observations_infos['os_ce_participant'];
479
			}
320 aurelien 480
 
207 aurelien 481
			$resultats_formates[$id_station]['obs'][$id_observation] = $infos_formatees;
482
		}
320 aurelien 483
 
207 aurelien 484
		return $resultats_formates;
485
	}
320 aurelien 486
 
210 aurelien 487
	public function getFichierExportObservationCsv() {
324 aurelien 488
		// dans le csv les observations d'absence sont inclues par contre
489
		$_GET['inclure-absences'] = 1;
210 aurelien 490
		$donnees = $this->getExportObservation();
320 aurelien 491
		$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
210 aurelien 492
		$chaine_csv = $this->convertirTableauAssocVersCSV($donnees_formatees);
320 aurelien 493
 
210 aurelien 494
		$this->envoyerFichier($chaine_csv);
207 aurelien 495
	}
320 aurelien 496
 
270 aurelien 497
	public function formaterListeObservationPourExportCSV($tableau_observations_infos) {
320 aurelien 498
 
207 aurelien 499
		$gestionnaire_especes = new OdsEspece($this->config);
500
		$gestionnaire_communes = new OdsCommune($this->config);
227 aurelien 501
		$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
320 aurelien 502
 
207 aurelien 503
		$especes = $gestionnaire_especes->getToutesEspeces();
504
		$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
249 aurelien 505
		$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
320 aurelien 506
 
210 aurelien 507
		$codes_insee_communes = array();
320 aurelien 508
 
207 aurelien 509
		$resultats_formates = array();
510
		foreach($tableau_observations_infos as $observations_infos) {
320 aurelien 511
 
207 aurelien 512
			$id_espece = $observations_infos['oi_ce_espece'];
513
			$nom_espece =  $especes[$id_espece]['nom_scientifique'];
320 aurelien 514
 
207 aurelien 515
			$id_evenement = $observations_infos['oo_ce_evenement'];
516
			$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
320 aurelien 517
 
207 aurelien 518
			$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
320 aurelien 519
 
207 aurelien 520
			$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
320 aurelien 521
 
207 aurelien 522
			$id_observation = $observations_infos['oo_id_observation'];
281 aurelien 523
			$milieu = isset($milieux[$observations_infos['os_ce_environnement']]['ot_valeur']) ? $milieux[$observations_infos['os_ce_environnement']]['ot_valeur'] : '';
320 aurelien 524
 
207 aurelien 525
			$infos_formatees = array(
526
				'id_observation' => $id_observation,
320 aurelien 527
				'id_individu' => $observations_infos['oo_ce_individu'],
324 aurelien 528
				'commentaire_individu' => $observations_infos['oi_commentaire'],
529
				'presence_evenement' => $observations_infos['oo_absence_evenement'] == 1 ? 'Absence' : 'Présence',
207 aurelien 530
				'date' => $date_observation_formatee,
531
				'evenenement' => $infos_evenement['nom'],
532
				'code_bbch' => $infos_evenement['numero'],
533
				'nom_scientifique' => $nom_espece,
534
				'station' => $observations_infos['os_nom'],
535
				'code_commune' => $observations_infos['os_ce_commune'],
210 aurelien 536
				'nom_commune' => '',
207 aurelien 537
				'latitude' => $observations_infos['os_latitude'],
538
				'longitude' => $observations_infos['os_longitude'],
539
				'altitude' => $observations_infos['os_altitude'],
281 aurelien 540
				'milieu' => $milieu,
227 aurelien 541
				'id_participant' => $observations_infos['os_ce_participant'],
542
				'pseudo_participant' => '',
543
				'mail_participant' => ''
207 aurelien 544
			);
320 aurelien 545
 
207 aurelien 546
			$resultats_formates[] = $infos_formatees;
320 aurelien 547
 
210 aurelien 548
			if(is_numeric($observations_infos['os_ce_commune'])) {
549
				$codes_insee_communes[] = $observations_infos['os_ce_commune'];
550
			}
207 aurelien 551
		}
281 aurelien 552
 
210 aurelien 553
		$correspondance_codes_insee_noms = $gestionnaire_communes->obtenirTableauNomsCommunesParTableauCodesInsee($codes_insee_communes);
227 aurelien 554
		$correspondance_id_utilisateur = $gestionnaire_utilisateurs->getListeUtilisateurFormateeId();
320 aurelien 555
 
210 aurelien 556
		foreach($resultats_formates as &$resultat) {
320 aurelien 557
 
558
			if(isset($correspondance_codes_insee_noms[$resultat['code_commune']]) && trim($correspondance_codes_insee_noms[$resultat['code_commune']]) != '') {
210 aurelien 559
				$resultat['nom_commune'] = $correspondance_codes_insee_noms[$resultat['code_commune']];
560
			}
320 aurelien 561
 
315 mathias 562
			$resultat['pseudo_participant'] = isset($correspondance_id_utilisateur[$resultat['id_participant']]) ? $correspondance_id_utilisateur[$resultat['id_participant']]['name'] : '';
563
			$resultat['mail_participant'] = isset($correspondance_id_utilisateur[$resultat['id_participant']]) ? $correspondance_id_utilisateur[$resultat['id_participant']]['mail'] : '';
210 aurelien 564
		}
320 aurelien 565
 
207 aurelien 566
		return $resultats_formates;
567
	}
320 aurelien 568
 
207 aurelien 569
	public function convertirTableauAssocVersCSV($tableau) {
320 aurelien 570
 
207 aurelien 571
		$csv = '';
572
		$colonnes = array_keys($tableau[0]);
573
		$csv .= implode(';',$colonnes).";\n";
320 aurelien 574
 
207 aurelien 575
		foreach($tableau as $elements) {
281 aurelien 576
			$ligne = "";
577
			// parcours des cases de chaque ligne nécessaire car si on utilise implode
578
			// les valeurs vides ne sont pas prises et ça décale les colonnes
579
			foreach ($elements as $element) {
580
				$ligne .= '"'.$element.'";';
581
			}
582
			$csv .= $ligne."\n";
207 aurelien 583
		}
320 aurelien 584
 
207 aurelien 585
		return $csv;
586
	}
320 aurelien 587
 
281 aurelien 588
	public function envoyerFichier($contenu, $nom = 'observations_export') {
320 aurelien 589
 
281 aurelien 590
		$nom_fichier = $nom.".csv";
207 aurelien 591
		$chemin_fichier = $this->config['appli']['chemin_fichiers_temp'].'/'.$nom_fichier;
320 aurelien 592
 
593
		file_put_contents($chemin_fichier, $contenu);
594
 
207 aurelien 595
		$contenu = file_get_contents($chemin_fichier);
596
		$taille_fichier = filesize($chemin_fichier);
320 aurelien 597
 
207 aurelien 598
		unlink($chemin_fichier);
320 aurelien 599
 
207 aurelien 600
		ini_set('zlib.output_compression','Off');
320 aurelien 601
 
207 aurelien 602
		header('Pragma: public');
603
		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
604
		header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
320 aurelien 605
 
207 aurelien 606
		header('Content-Tranfer-Encoding: none');
320 aurelien 607
 
207 aurelien 608
		header('Content-Type: application/octetstream; name="'.$nom_fichier.'"');
609
		header('Content-Disposition: attachement; filename="'.$nom_fichier.'"');
320 aurelien 610
 
207 aurelien 611
		header('Content-Length: '.$taille_fichier);
320 aurelien 612
 
207 aurelien 613
		echo $contenu;
614
		exit();
615
	}
320 aurelien 616
 
207 aurelien 617
	private function formaterInformationPourEnvoi($tableauinfos) {
618
 
619
	}
620
}
315 mathias 621
?>