Subversion Repositories eFlore/Applications.moissonnage

Rev

Rev 31 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 31 Rev 34
1
<?php
1
<?php
2
 
2
 
3
 
3
 
4
/**
4
/**
5
 * Classe commune a tous les services de ce projet qui va analyser et rechercher des erreurs
5
 * Classe commune a tous les services de ce projet qui va analyser et rechercher des erreurs
6
 * sur les valeurs passees en parametres lors d'un appel a ces web services.
6
 * sur les valeurs passees en parametres lors d'un appel a ces web services.
7
 *
7
 *
8
 * Les parametres suivants sont traites :
8
 * Les parametres suivants sont traites :
9
 *   - zoom : le niveau de zoom sur la carte (API cartographique client)
9
 *   - zoom : le niveau de zoom sur la carte (API cartographique client)
10
 *     On va verifier que c'est un nombre entier compris entre une valeur minimale et une valeur maximale
10
 *     On va verifier que c'est un nombre entier compris entre une valeur minimale et une valeur maximale
11
 *
11
 *
12
 *   - bbox : rectangle dont les bords delimitent en coordonnees l'espace de recherche de donnees spatiales
12
 *   - bbox : rectangle dont les bords delimitent en coordonnees l'espace de recherche de donnees spatiales
13
 *     L'ordre des valeurs est le suivant : ouest, sud, est, nord
13
 *     L'ordre des valeurs est le suivant : ouest, sud, est, nord
14
 *     On va verifier que c'est une serie de quatre nombre decimaux delimites par des virgules
14
 *     On va verifier que c'est une serie de quatre nombre decimaux delimites par des virgules
15
 *     et compris dans l'espace representant le monde a partir du systeme de projection WGS84 (EPSG:4326)
15
 *     et compris dans l'espace representant le monde a partir du systeme de projection WGS84 (EPSG:4326)
16
 *
16
 *
-
 
17
 *   - stations : liste de points d'observations. C'est une serie de stations qui est passee en parametres
17
 *   - longitude et latitude : representent les coordonnees d'un point dans l'espace
18
 *     de cette maniere, separees entre elles par un seperateur vertical |. Chaque station est decrite
18
 *     On va verifier que ces coordonnees soient valides dans le systeme de projection utilise
19
 *     par sa source de donnees, le type de site et ses coordonnees longitude et latitude.
19
 *
20
 *
20
 *   - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres
21
 *   - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres
21
 *     son nom court que son nom complet (incluant le numero de version)
22
 *     son nom court que son nom complet (incluant le numero de version)
22
 *     On va verifier la disponibilite du referentiel pour ce service
23
 *     On va verifier la disponibilite du referentiel pour ce service
23
 *
24
 *
24
 *   - num_taxon : numero taxonomique d'une espece
25
 *   - num_taxon : numero taxonomique d'une espece
25
 *   - nn : numero nomenclatural d'une espece
26
 *   - nn : numero nomenclatural d'une espece
26
 *     On va rechercher sa presence dans les referentiels disponibles
27
 *     On va rechercher sa presence dans les referentiels disponibles
27
 *     (les informations principales sur ce taxon seront renvoyees)
28
 *     (les informations principales sur ce taxon seront renvoyees)
28
 *
29
 *
29
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
30
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
30
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
31
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
31
 *
32
 *
32
 *   - auteur : l'auteur de l'observation
33
 *   - auteur : l'auteur de l'observation
33
 *
34
 *
34
 *   - type_site : pour les observations, le type de point correspondant a la station cliquee
-
 
35
 *     (STATION ou COMMUNE). Cela indique le niveau de precision ramene aux coordonnees des observations
-
 
36
 *
-
 
37
 *   - date_debut et date_fin : intervalle de dates d'observation. On verifie que ce sont des dates valides
35
 *   - date_debut et date_fin : intervalle de dates d'observation. On verifie que ce sont des dates valides
38
 *     et que date_debut <= date_fin. Le programme peut accepter la presence d'un seul de ces deux
36
 *     et que date_debut <= date_fin. Le programme peut accepter la presence d'un seul de ces deux
39
 *     parametres : soit une date de debut, soit une date de fin
37
 *     parametres : soit une date de debut, soit une date de fin
-
 
38
 *     
-
 
39
 *   - nb_jours : valeur entiere qui indique de recuperer les observations effectuees ou transmises
-
 
40
 *     sur les derniers jours avant la date d'execution du script
40
 *
41
 *
41
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
42
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
42
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
43
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
43
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
44
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
44
 * sera generee et mise a jour.
45
 * sera generee et mise a jour.
45
 * 
46
 * 
46
 * Le resultat final de la verfication peut entrainer deux cas d'utilisation possibles. Si des messages
47
 * Le resultat final de la verfication peut entrainer deux cas d'utilisation possibles. Si des messages
47
 * d'erreurs ont ete generes durant la verification, ils sont regroupes en un seul message pour lever
48
 * d'erreurs ont ete generes durant la verification, ils sont regroupes en un seul message pour lever
48
 * une exception qui sera interpretee par la classe appelante. Dans le cas ou la verification n'a rien
49
 * une exception qui sera interpretee par la classe appelante. Dans le cas ou la verification n'a rien
49
 * rencontre d'anormal, une fonction renverra la liste des parametres valides utilisables
50
 * rencontre d'anormal, une fonction renverra la liste des parametres valides utilisables
50
 * pour des recherches de donnees pour la suite du traitement pour le service.
51
 * pour des recherches de donnees pour la suite du traitement pour le service.
51
 *
52
 *
52
 * @package framework-0.3
53
 * @package framework-0.3
53
 * @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
54
 * @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
54
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
55
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
55
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
56
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
56
 * @version $Id$
57
 * @version $Id$
57
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
58
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
58
 *
59
 *
59
 */
60
 */
60
 
61
 
61
class VerificateurParametres {
62
class VerificateurParametres {
62
	
63
	
63
	private $parametres = array();
64
	private $parametres = array();
64
	private $validation = null;
65
	private $validation = null;
65
	private $erreurs = array();
66
	private $erreurs = array();
66
	private $dateTraitee = false;
67
	private $dateTraitee = false;
67
	
68
	
68
	private $bboxMonde = null;
69
	private $bboxMonde = null;
69
	
70
	
70
	
71
	
71
	public function __construct($parametres) {
72
	public function __construct($parametres) {
72
		foreach ($parametres as $nomParametre => $valeur) {
73
		foreach ($parametres as $nomParametre => $valeur) {
73
			if ($nomParametre != 'source') {
-
 
74
				$this->parametres[$nomParametre] = $valeur;
74
			$this->parametres[$nomParametre] = $valeur;
75
			}
-
 
76
		}
75
		}
77
		$this->bboxMonde = array(
76
		$this->bboxMonde = array(
78
			'ouest' => floatval(Config::get('carte.limite_ouest')),
77
			'ouest' => floatval(Config::get('carte.limite_ouest')),
79
			'est'   => floatval(Config::get('carte.limite_est')),
78
			'est'   => floatval(Config::get('carte.limite_est')),
80
			'sud'   => floatval(Config::get('carte.limite_sud')),
79
			'sud'   => floatval(Config::get('carte.limite_sud')),
81
			'nord'  => floatval(Config::get('carte.limite_nord'))
80
			'nord'  => floatval(Config::get('carte.limite_nord'))
82
		);
81
		);
83
		$this->validation = new StdClass();
82
		$this->validation = new StdClass();
84
	}
83
	}
85
	
84
	
86
	public function verifierParametres() {
85
	public function verifierParametres() {
87
		foreach ($this->parametres as $nomParametre => $valeur) {
86
		foreach ($this->parametres as $nomParametre => $valeur) {
88
			switch ($nomParametre) {
87
			switch ($nomParametre) {
89
				case 'zoom' : $this->traiterParametreZoom($valeur);
88
				case 'zoom' : $this->traiterParametreZoom($valeur);
90
					break;
89
					break;
91
				case 'bbox' : $this->traiterParametreBbox($valeur);
90
				case 'bbox' : $this->traiterParametreBbox($valeur);
92
					break;
91
					break;
93
				case 'longitude' :
-
 
94
				case 'latitude'  : $this->traiterParametresCoordonnees($this->parametres['longitude'],
92
				case 'stations'  : $this->traiterParametreStations($this->parametres['stations']);
95
					$this->parametres['latitude']);
-
 
96
					break;
93
					break;
97
				case 'dept' : $this->traiterParametreDepartement($valeur);
94
				case 'dept' : $this->traiterParametreDepartement($valeur);
98
					break;
95
					break;
99
				case 'auteur' : $this->traiterParametreAuteur($valeur);
96
				case 'auteur' : $this->traiterParametreAuteur($valeur);
100
					break;
97
					break;
101
				case 'referentiel' : $this->traiterParametreReferentiel($valeur);
98
				case 'referentiel' : $this->traiterParametreReferentiel($valeur);
102
					break;
99
					break;
103
				case 'num_taxon' : $this->traiterParametreTaxon($valeur);
100
				case 'num_taxon' : $this->traiterParametreTaxon($valeur);
104
					break;
101
					break;
105
				case 'nn' : $this->traiterParametreNomenclatural($valeur);
102
				case 'nn' : $this->traiterParametreNomenclatural($valeur);
106
					break;
103
					break;
107
				case 'type_site' : $this->traiterParametreTypeSite($valeur);
104
				case 'type_site' : $this->traiterParametreTypeSite($valeur);
108
					break;
105
					break;
109
				case 'nb_jours' : $this->traiterParametreNbJours($valeur);
106
				case 'nb_jours' : $this->traiterParametreNbJours($valeur);
110
					break;
107
					break;
111
				case 'date_debut' :
108
				case 'date_debut' :
112
				case 'date_fin'  : {
109
				case 'date_fin'  : {
113
					$dateDebut = isset($this->parametres['date_debut']) ? $this->parametres['date_debut'] : null;
110
					$dateDebut = isset($this->parametres['date_debut']) ? $this->parametres['date_debut'] : null;
114
					$dateFin = isset($this->parametres['date_fin']) ? $this->parametres['date_fin'] : null;
111
					$dateFin = isset($this->parametres['date_fin']) ? $this->parametres['date_fin'] : null;
115
					if (!$this->dateTraitee) {
112
					if (!$this->dateTraitee) {
116
						$this->traiterParametresDate($dateDebut, $dateFin);
113
						$this->traiterParametresDate($dateDebut, $dateFin);
117
						$this->dateTraitee = true;
114
						$this->dateTraitee = true;
118
					}
115
					}
119
					break;
116
					break;
120
				}
117
				}
-
 
118
				case 'format' : $this->validation->format = strtolower($valeur); break;
121
				// autres parametres ==> les ignorer
119
				// autres parametres ==> les ignorer
122
				default : break;
120
				default : break;
123
			}
121
			}
124
		}
122
		}
125
		$this->verifierPresenceParametreSpatial();
123
		$this->verifierPresenceParametreSpatial();
126
	}
124
	}
127
	
125
	
128
	private function ajouterErreur($messageErreur) {
126
	private function ajouterErreur($messageErreur) {
129
		$this->erreurs[] = $messageErreur;
127
		$this->erreurs[] = $messageErreur;
130
	}
128
	}
131
	
129
	
132
	public function renvoyerResultatVerification() {
130
	public function renvoyerResultatVerification() {
133
		return $this->validation;
131
		return $this->validation;
134
	}
132
	}
135
	
133
	
136
	public function contienterreurs() {
134
	public function contienterreurs() {
137
		return count($this->erreurs);
135
		return count($this->erreurs);
138
	}
136
	}
139
	
137
	
140
	public function leverException() {
138
	public function leverException() {
141
		$messagesErreur = "Les erreurs suivantes ont été rencontrées : \n".
139
		$messagesErreur = "Les erreurs suivantes ont été rencontrées : \n".
142
			implode("\n", $this->erreurs);
140
			implode("\n", $this->erreurs);
143
		throw new Exception($messagesErreur, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
141
		throw new Exception($messagesErreur, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
144
	}
142
	}
145
	
143
	
146
	
144
	
147
	
145
	
148
	// ------------------------------------------------------------------------- //
146
	// ------------------------------------------------------------------------- //
149
	// Fonctions de verification de parametres et detection de valeurs anormales //
147
	// Fonctions de verification de parametres et detection de valeurs anormales //
150
	// ------------------------------------------------------------------------- //
148
	// ------------------------------------------------------------------------- //
151
	
149
	
152
	private function traiterParametreZoom($zoom) {
150
	private function traiterParametreZoom($zoom) {
153
		$zoom = intval($zoom);
151
		$zoom = intval($zoom);
154
		$mondeZoom = array(
152
		$mondeZoom = array(
155
				'min' => intval(Config::get('carte.zoom_minimal')),
153
				'min' => intval(Config::get('carte.zoom_minimal')),
156
				'max' => intval(Config::get('carte.zoom_maximal'))
154
				'max' => intval(Config::get('carte.zoom_maximal'))
157
		);
155
		);
158
		if ($zoom < $mondeZoom['min'] || $zoom > $mondeZoom['max']) {
156
		if ($zoom < $mondeZoom['min'] || $zoom > $mondeZoom['max']) {
159
			$message = 'Niveau de zoom non reconnu par le service. Il doit être compris entre '.
157
			$message = 'Niveau de zoom non reconnu par le service. Il doit être compris entre '.
160
				$mondeZoom['min'].' et '.$mondeZoom['max'];
158
				$mondeZoom['min'].' et '.$mondeZoom['max'];
161
			$this->ajouterErreur($message);
159
			$this->ajouterErreur($message);
162
		} else {
160
		} else {
163
			$this->validation->zoom = $zoom;
161
			$this->validation->zoom = $zoom;
164
		}
162
		}
165
	}
163
	}
166
	
164
	
-
 
165
	private function traiterParametreBbox($chaineBbox) {
-
 
166
		$listeBbox = explode('|', trim($chaineBbox));
-
 
167
		$critereBbox = array();
-
 
168
		foreach ($listeBbox as $bbox) {
-
 
169
			$bboxVerifiee = $this->verifierCoordonneesBbox($bbox);
-
 
170
			if (!is_null($bboxVerifiee)) {
-
 
171
				$critereBbox[] = $bboxVerifiee;
-
 
172
			}
-
 
173
		}
-
 
174
		$this->validation->bbox = $critereBbox;
-
 
175
	}
-
 
176
	
-
 
177
	private function verifierCoordonneesBbox($bbox) {
167
	private function traiterParametreBbox($bbox) {
178
		$bboxVerifiee = null;
168
		// verifier que la chaine de caracteres $bbox est une serie de chaque nombre decimaux
179
		// verifier que la chaine de caracteres $bbox est une serie de chaque nombre decimaux
169
		// separes entre eux par une virgule
180
		// separes entre eux par une virgule
170
		if (preg_match('/^(-?\d{1,3}(.\d+)?,){3}(-?\d{1,3}(.\d+)?)$/', $bbox) == 0) {
181
		if (preg_match('/^(-?\d{1,3}(.\d+)?,){3}(-?\d{1,3}(.\d+)?)$/', $bbox) == 0) {
171
			$message = "Format de saisie des coordonnees de la bounding box non valide.  Le service ".
182
			$message = "Format de saisie des coordonnees de la bounding box non valide.  Le service ".
172
				"n'accepte seulement qu'une serie de 4 nombre décimaux séparés par des virgules.";
183
				"n'accepte seulement qu'une serie de 4 nombre décimaux séparés par des virgules.";
173
			$this->ajouterErreur($message);
184
			$this->ajouterErreur($message);
174
		} else {
185
		} else {
175
			$coordonnees = explode(',', $bbox);
186
			$coordonnees = explode(',', $bbox);
176
			// index du tableau des coordonnees : ouest/sud/est/nord
187
			// index du tableau des coordonnees : ouest/sud/est/nord
177
			$nomsIndexBbox = array("ouest", "sud", "est", "nord");
188
			$nomsIndexBbox = array("ouest", "sud", "est", "nord");
178
			$bbox = array();
189
			$bbox = array();
179
			for ($i = 0; $i < count($coordonnees); $i ++) {
190
			for ($i = 0; $i < count($coordonnees); $i ++) {
180
				$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i];
191
				$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i];
181
			}
192
			}
182
			// verifier que les coordonnees de chaque bord de la bbox sont valides
193
			// verifier que les coordonnees de chaque bord de la bbox sont valides
183
			if ($this->estUneBboxValide($bbox)) {
194
			if ($this->estUneBboxValide($bbox)) {
184
				$this->validation->bbox = $bbox;
195
				$bboxVerifiee = $bbox;
185
			} else {
196
			} else {
186
				$message = "Certaines coordonnées de la bounding box sont situés en dehors des limites ".
197
				$message = "Certaines coordonnées de la bounding box sont situés en dehors des limites ".
187
					"de notre monde";
198
					"de notre monde";
188
				$this->ajouterErreur($message);
199
				$this->ajouterErreur($message);
189
			}
200
			}
190
		}
201
		}
-
 
202
		return $bboxVerifiee;
191
	}
203
	}
192
	
204
	
193
	private function estUneBboxValide($bbox) {
205
	private function estUneBboxValide($bbox) {
194
		$monde = $this->bboxMonde;
206
		$monde = $this->bboxMonde;
195
		return (floatval($bbox['ouest']) >= $monde['ouest']  && floatval($bbox['ouest']) <= $monde['est']
207
		return (floatval($bbox['ouest']) >= $monde['ouest']  && floatval($bbox['ouest']) <= $monde['est']
196
		&& floatval($bbox['est'])   >= $monde['ouest']  && floatval($bbox['est'])   <= $monde['est']
208
		&& floatval($bbox['est'])   >= $monde['ouest']  && floatval($bbox['est'])   <= $monde['est']
197
		&& floatval($bbox['nord'])  >= $monde['sud']    && floatval($bbox['nord'])  <= $monde['nord']
209
		&& floatval($bbox['nord'])  >= $monde['sud']    && floatval($bbox['nord'])  <= $monde['nord']
198
		&& floatval($bbox['sud'])   >= $monde['sud']    && floatval($bbox['sud'])   <= $monde['nord']);
210
		&& floatval($bbox['sud'])   >= $monde['sud']    && floatval($bbox['sud'])   <= $monde['nord']);
199
	}
211
	}
200
	
212
	
-
 
213
	private function traiterParametreStations($listeStations) {
-
 
214
		$stations = explode('|', trim($listeStations));
-
 
215
		$critereStations = array();
-
 
216
		foreach ($stations as $station) {
-
 
217
			preg_match("/([a-z]+):([a-z]+):(-?\d{1,3}.\d+),(-?\d{1,3}.\d+)/", $station, $matches);
-
 
218
			if (count($matches) < 5) {
-
 
219
				$message = "Les données transmises sur la station à interroger sont incomplètes. ".
-
 
220
					"Le format suivant doit être respecté : source:type_site:longitude:latitude";
-
 
221
				$this->ajouterErreur($message);
-
 
222
			} else {
-
 
223
				$matches = array_splice($matches, 1, count($matches));
-
 
224
				$this->verifierCoordonneesStation($matches);
-
 
225
				$this->verifierSourceStation($matches[0]);
-
 
226
				$this->verifierTypeStation($matches[1]);
-
 
227
				$critereStations[] = $matches;
-
 
228
			}
-
 
229
		}
-
 
230
		$this->validation->stations = $critereStations;
-
 
231
	}
-
 
232
	
-
 
233
	private function verifierCoordonneesStation(& $station) {
-
 
234
		$longitude = floatval($station[2]);
201
	private function traiterParametresCoordonnees($longitude, $latitude) {
235
		$latitude  = floatval($station[3]);
202
		if ($this->sontDesCoordonneesValides($longitude, $latitude)) {
236
		if ($this->sontDesCoordonneesValides($longitude, $latitude)) {
203
			$this->validation->latitude = $latitude;
237
			$station[2] = $latitude;
204
			$this->validation->longitude = $longitude;
238
			$station[3] = $longitude;
205
		} else {
239
		} else {
206
			$message = "Les coordonnees du point passées en parametres sont en dehors des limites de ".
-
 
207
				"notre monde";
240
			$message = "Les coordonnees du point passées en parametres sont en dehors des limites de notre monde";
208
			$this->ajouterErreur($message);
241
			$this->ajouterErreur($message);
209
		}
242
		}
210
	}
243
	}
211
	
244
	
212
	private function sontDesCoordonneesValides($longitude, $latitude) {
245
	private function sontDesCoordonneesValides($longitude, $latitude) {
213
		$monde = $this->bboxMonde;
246
		$monde = $this->bboxMonde;
214
		return (floatval($longitude) >= $monde['ouest'] && floatval($longitude) <= $monde['est']
247
		return (floatval($longitude) >= $monde['ouest'] && floatval($longitude) <= $monde['est']
215
			&& floatval($latitude)  >= $monde['sud']   && floatval($latitude)  <= $monde['nord']);
248
			&& floatval($latitude)  >= $monde['sud']   && floatval($latitude)  <= $monde['nord']);
216
	}
249
	}
-
 
250
	
-
 
251
	private function verifierTypeStation($typeStation) {
-
 
252
		$typeStationsValides = array('station', 'commune');
-
 
253
		if (!in_array($typeStation, $typeStationsValides)) {
-
 
254
			$message = "'$typeStation' n'est pas un type de station reconnu. Sont acceptés seulement 'station' et 'commune'.";
-
 
255
			$this->ajouterErreur($message);
-
 
256
		}
-
 
257
	}
-
 
258
	
-
 
259
	private function verifierSourceStation($source) {
-
 
260
		$sourcesARequeter = explode(',', trim($this->parametres['source']));
-
 
261
		if (!in_array($source, $sourcesARequeter)) {
-
 
262
			$message = "La source '$source' n'est pas listée dans le paramètre source de l'URL (sont disponibles ".
-
 
263
				implode(',', $sourcesARequeter).").";
-
 
264
			$this->ajouterErreur($message);
-
 
265
		}
-
 
266
	}
217
	
267
	
218
	private function traiterParametreDepartement($numeroDepartement) {
268
	private function traiterParametreDepartement($numeroDepartement) {
219
		if ($numeroDepartement != '*') {
269
		if ($numeroDepartement != '*') {
220
			$departements = explode(',', trim($numeroDepartement));
270
			$departements = explode(',', trim($numeroDepartement));
221
			foreach ($departements as $departement) {
271
			foreach ($departements as $departement) {
222
				if($this->estUnCodeDepartementValide($departement)) {
272
				if($this->estUnCodeDepartementValide($departement)) {
223
					$this->validation->departement[] = $departement;
273
					$this->validation->departement[] = $departement;
224
				} else {
274
				} else {
225
					$message = "Code de département non valide";
275
					$message = "Code de département non valide";
226
					$this->ajouterErreur($message);
276
					$this->ajouterErreur($message);
227
				}
277
				}
228
			}
278
			}
229
		}
279
		}
230
	}
280
	}
231
	
281
	
232
	private function estUnCodeDepartementValide($departement) {
282
	private function estUnCodeDepartementValide($departement) {
233
		// expression reguliere pour verifier que c'est un nombre entier a 2 ou 3 chiffres
283
		// expression reguliere pour verifier que c'est un nombre entier a 2 ou 3 chiffres
234
		$estUnDepartementValide = true;
284
		$estUnDepartementValide = true;
235
		if ($departement == '2A' || $departement == '2B') {
285
		if ($departement == '2A' || $departement == '2B') {
236
		 	$estUnDepartementValide = true;
286
		 	$estUnDepartementValide = true;
237
		} elseif (preg_match('/^\d{2,3}$/', $departement) != 1) {
287
		} elseif (preg_match('/^\d{2,3}$/', $departement) != 1) {
238
			$estUnDepartementValide = false;
288
			$estUnDepartementValide = false;
239
		} else {
289
		} else {
240
			if ((intval($departement) < 1 || intval($departement) > 95)
290
			if ((intval($departement) < 1 || intval($departement) > 95)
241
				&& (intval($departement) < 971 || intval($departement) > 978)) {
291
				&& (intval($departement) < 971 || intval($departement) > 978)) {
242
				$estUnDepartementValide = false;
292
				$estUnDepartementValide = false;
243
			}
293
			}
244
		} 
294
		} 
245
		return $estUnDepartementValide;
295
		return $estUnDepartementValide;
246
	}
296
	}
247
	
297
	
248
	private function traiterParametreAuteur($auteur) {
298
	private function traiterParametreAuteur($auteur) {
249
		if ($auteur != '*') {
299
		if ($auteur != '*') {
250
			$this->validation->auteur = trim($auteur);
300
			$this->validation->auteur = trim($auteur);
251
		}
301
		}
252
	}
302
	}
253
	
303
	
254
	private function traiterParametreTypeSite($typeSite) {
304
	private function traiterParametreTypeSite($typeSite) {
255
		$this->validation->typeSite = strtolower(trim($typeSite));
305
		$this->validation->typeSite = strtolower(trim($typeSite));
256
	}
306
	}
257
	
307
	
258
	private function traiterParametreReferentiel($referentiel)  {
308
	private function traiterParametreReferentiel($referentiel)  {
259
		if (!isset($this->validation->referentiel) && $referentiel != '*') {
309
		if (!isset($this->validation->referentiel) && $referentiel != '*') {
260
			$referentielAUtiliser = $this->affecterNomCompletReferentiel($referentiel);
310
			$referentielAUtiliser = $this->affecterNomCompletReferentiel($referentiel);
261
			if (is_null($referentielAUtiliser)) {
311
			if (is_null($referentielAUtiliser)) {
262
				$message = "Le référentiel demandé n'est pas reconnu par le service.";
312
				$message = "Le référentiel demandé n'est pas reconnu par le service.";
263
				$this->ajouterErreur($message);
313
				$this->ajouterErreur($message);
264
			} else {
314
			} else {
265
				$this->validation->referentiel = $referentielAUtiliser;
315
				$this->validation->referentiel = $referentielAUtiliser;
266
			}
316
			}
267
		}
317
		}
268
	}
318
	}
269
	
319
	
270
	private function affecterNomCompletReferentiel($referentiel) {
320
	private function affecterNomCompletReferentiel($referentiel) {
271
		$referentielAUtiliser = null;
321
		$referentielAUtiliser = null;
272
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
322
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
273
		foreach ($listeReferentiels as $nomReferentiel) {
323
		foreach ($listeReferentiels as $nomReferentiel) {
274
			$nomCourtReferentiel = current(explode('_', $nomReferentiel));
324
			$nomCourtReferentiel = current(explode('_', $nomReferentiel));
275
			if ($referentiel == $nomCourtReferentiel || $referentiel == $nomReferentiel) {
325
			if ($referentiel == $nomCourtReferentiel || $referentiel == $nomReferentiel) {
276
				$referentielAUtiliser = $nomReferentiel;
326
				$referentielAUtiliser = $nomReferentiel;
277
				break;
327
				break;
278
			}
328
			}
279
		}
329
		}
280
		return $referentielAUtiliser;
330
		return $referentielAUtiliser;
281
	}
331
	}
282
	
332
	
283
	private function traiterParametreTaxon($numeroTaxon) {
333
	private function traiterParametreTaxon($numeroTaxon) {
284
		if ($numeroTaxon != '*') {
334
		if ($numeroTaxon != '*') {
285
			$listeTaxons = explode(',', $numeroTaxon);
335
			$listeTaxons = explode(',', $numeroTaxon);
286
			foreach ($listeTaxons as $nt) {
336
			foreach ($listeTaxons as $nt) {
287
				$taxon = null;
337
				$taxon = null;
288
				if (isset($this->validation->referentiel)) {
338
				if (isset($this->validation->referentiel)) {
289
					$taxon = $this->renvoyerTaxonDansReferentiel($nt, 'nt', $this->validation->referentiel);
339
					$taxon = $this->renvoyerTaxonDansReferentiel($nt, 'nt', $this->validation->referentiel);
290
				} else {
340
				} else {
291
					$taxon = $this->rechercherTaxonDansReferentiels($nt, 'nt');
341
					$taxon = $this->rechercherTaxonDansReferentiels($nt, 'nt');
292
				}
342
				}
293
				if (is_null($taxon)) {
343
				if (is_null($taxon)) {
294
					$message = "Le numéro de taxon n'a pas permis de retrouver le taxon associé.";
344
					$message = "Le numéro de taxon n'a pas permis de retrouver le taxon associé.";
295
					$this->ajouterErreur($message);
345
					$this->ajouterErreur($message);
296
				} else {
346
				} else {
297
					$this->ajouterTaxonAListe($taxon);
347
					$this->ajouterTaxonAListe($taxon);
298
					$this->validation->referentiel = $taxon['referentiel'];
348
					$this->validation->referentiel = $taxon['referentiel'];
299
				}
349
				}
300
			}
350
			}
301
		}
351
		}
302
	}
352
	}
303
	
353
	
304
	private function traiterParametreNomenclatural($numeroNomenclatural) {
354
	private function traiterParametreNomenclatural($numeroNomenclatural) {
305
		if ($numeroNomenclatural != '*') {
355
		if ($numeroNomenclatural != '*') {
306
			$listeTaxons = explode(',', $numeroNomenclatural);
356
			$listeTaxons = explode(',', $numeroNomenclatural);
307
			foreach ($listeTaxons as $nn) {
357
			foreach ($listeTaxons as $nn) {
308
				$taxon = null;
358
				$taxon = null;
309
				if (isset($this->validation->referentiel)) {
359
				if (isset($this->validation->referentiel)) {
310
					$taxon = $this->renvoyerTaxonDansReferentiel($nn, 'nn', $this->validation->referentiel);
360
					$taxon = $this->renvoyerTaxonDansReferentiel($nn, 'nn', $this->validation->referentiel);
311
				} else {
361
				} else {
312
					$taxon = $this->rechercherTaxonDansReferentiels($nn, 'nn');
362
					$taxon = $this->rechercherTaxonDansReferentiels($nn, 'nn');
313
				}
363
				}
314
				if (is_null($taxon)) {
364
				if (is_null($taxon)) {
315
					$message = "Le numéro nomenclatural n'a pas permis de retrouver le taxon associé.";
365
					$message = "Le numéro nomenclatural n'a pas permis de retrouver le taxon associé.";
316
					$this->ajouterErreur($message);
366
					$this->ajouterErreur($message);
317
				} else {
367
				} else {
318
					$this->ajouterTaxonAListe($taxon);
368
					$this->ajouterTaxonAListe($taxon);
319
					$this->validation->referentiel = $taxon['referentiel'];
369
					$this->validation->referentiel = $taxon['referentiel'];
320
				}
370
				}
321
			}
371
			}
322
		}
372
		}
323
	}
373
	}
324
	
374
	
325
	private function rechercherTaxonDansReferentiels($numeroTaxon, $typeNumero) {
375
	private function rechercherTaxonDansReferentiels($numeroTaxon, $typeNumero) {
326
		$taxon = null;
376
		$taxon = null;
327
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
377
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
328
		foreach ($listeReferentiels as $nomReferentiel) {
378
		foreach ($listeReferentiels as $nomReferentiel) {
329
			$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel);
379
			$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel);
330
			if (!is_null($taxon)) {
380
			if (!is_null($taxon)) {
331
				break;
381
				break;
332
			}
382
			}
333
		}
383
		}
334
		return $taxon;
384
		return $taxon;
335
	}
385
	}
336
	
386
	
337
	private function renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel) {
387
	private function renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel) {
338
		$referentiel = new Referentiel($nomReferentiel);
388
		$referentiel = new Referentiel($nomReferentiel);
339
		$referentiel->chargerTaxon($typeNumero, $numeroTaxon);
389
		$referentiel->chargerTaxon($typeNumero, $numeroTaxon);
340
		$taxon = $referentiel->renvoyerTaxon();
390
		$taxon = $referentiel->renvoyerTaxon();
341
		return $taxon;
391
		return $taxon;
342
	}
392
	}
343
	
393
	
344
	private function ajouterTaxonAListe($taxon) {
394
	private function ajouterTaxonAListe($taxon) {
345
		if (!isset($this->validation->taxon)) {
395
		if (!isset($this->validation->taxon)) {
346
			$this->validation->taxon = array($taxon);
396
			$this->validation->taxon = array($taxon);
347
		} elseif (!in_array($taxon, $this->validation->taxon)) {
397
		} elseif (!in_array($taxon, $this->validation->taxon)) {
348
			$this->validation->taxon[] = $taxon;
398
			$this->validation->taxon[] = $taxon;
349
		}
399
		}
350
	}
400
	}
351
	
401
	
352
	private function traiterParametresDate($dateDebut, $dateFin) {
402
	private function traiterParametresDate($dateDebut, $dateFin) {
353
		$statutValidite = $this->verifierValiditeDate($dateDebut, 'début')
403
		$statutValidite = $this->verifierValiditeDate($dateDebut, 'début')
354
			+ $this->verifierValiditeDate($dateFin, 'fin');
404
			+ $this->verifierValiditeDate($dateFin, 'fin');
355
		if ($statutValidite == 2) {
405
		if ($statutValidite == 2) {
356
			if (!is_null($dateDebut) && !is_null($dateFin) && $dateDebut > $dateFin) {
406
			if (!is_null($dateDebut) && !is_null($dateFin) && $dateDebut > $dateFin) {
357
				$message = "Intervalle de dates incorrect : date de fin avant la date de début";
407
				$message = "Intervalle de dates incorrect : date de fin avant la date de début";
358
				$this->ajouterErreur($message);
408
				$this->ajouterErreur($message);
359
			} else {
409
			} else {
360
				$this->validation->dateDebut = $dateDebut;
410
				$this->validation->dateDebut = $dateDebut;
361
				$this->validation->dateFin   = $dateFin;
411
				$this->validation->dateFin   = $dateFin;
362
			}
412
			}
363
		}
413
		}
364
	}
414
	}
365
	
415
	
366
	private function verifierValiditeDate(& $date, $position) {
416
	private function verifierValiditeDate(& $date, $position) {
367
		$statutValidite = is_null($date) ? 1 : 0;
417
		$statutValidite = is_null($date) ? 1 : 0;
368
		$moisParDefaut = $position == 'début' ? 1 : 12;
418
		$moisParDefaut = $position == 'début' ? 1 : 12;
369
		$jourParDefaut = $position == 'début' ? 1 : 31;
419
		$jourParDefaut = $position == 'début' ? 1 : 31;
370
		if (!is_null($date)) {
420
		if (!is_null($date)) {
371
			$split = explode("-", $date);
421
			$split = explode("-", $date);
372
			$annee = intval($split[0]);
422
			$annee = intval($split[0]);
373
			$mois  = isset($split[1]) ? intval($split[1]) : $moisParDefaut;
423
			$mois  = isset($split[1]) ? intval($split[1]) : $moisParDefaut;
374
			$jour  = isset($split[2]) ? intval($split[2]) : $jourParDefaut;
424
			$jour  = isset($split[2]) ? intval($split[2]) : $jourParDefaut;
375
			if (!$this->estDateValide($jour, $mois, $annee)) {
425
			if (!$this->estDateValide($jour, $mois, $annee)) {
376
				$message = "Date de {$position} saisie non valide";
426
				$message = "Date de {$position} saisie non valide";
377
				$this->ajouterErreur($message);
427
				$this->ajouterErreur($message);
378
			} else {
428
			} else {
379
				$date = $annee."-".(($mois<10)?"0".$mois:$mois)."-".(($jour<10)?"0".$jour:$jour);
429
				$date = $annee."-".(($mois<10)?"0".$mois:$mois)."-".(($jour<10)?"0".$jour:$jour);
380
				$dateDuJour = date('Y-m-d');
430
				$dateDuJour = date('Y-m-d');
381
				if ($date > $dateDuJour) {
431
				if ($date > $dateDuJour) {
382
					$message = "La date de {$position} saisie postérieure à la date du jour : {$dateDuJour}";
432
					$message = "La date de {$position} saisie postérieure à la date du jour : {$dateDuJour}";
383
					$this->ajouterErreur($message);
433
					$this->ajouterErreur($message);
384
				} else {
434
				} else {
385
					$statutValidite = 1;
435
					$statutValidite = 1;
386
				}
436
				}
387
			}
437
			}
388
		}
438
		}
389
		return $statutValidite;
439
		return $statutValidite;
390
	}
440
	}
391
	
441
	
392
	private function estDateValide($jour, $mois, $annee) {
442
	private function estDateValide($jour, $mois, $annee) {
393
		$estBissextile = (($annee % 4 == 0 && $annee % 100 != 0) || ($annee % 400 == 0));
443
		$estBissextile = (($annee % 4 == 0 && $annee % 100 != 0) || ($annee % 400 == 0));
394
		$dureeFevrier = $estBissextile ? 29 : 28;
444
		$dureeFevrier = $estBissextile ? 29 : 28;
395
		$dureeMois = array(1 => 31, 2 => $dureeFevrier, 3 => 31, 4 => 30, 5 => 31, 6 => 30, 7 => 31,
445
		$dureeMois = array(1 => 31, 2 => $dureeFevrier, 3 => 31, 4 => 30, 5 => 31, 6 => 30, 7 => 31,
396
			8 => 31, 9 => 30, 10 => 31, 11 => 30, 12 => 31);
446
			8 => 31, 9 => 30, 10 => 31, 11 => 30, 12 => 31);
397
		return ($annee >= 1900 && $mois >= 1 && $mois <= 12 && $jour >= 1 && $jour <= $dureeMois[$mois]); 
447
		return ($annee >= 1900 && $mois >= 1 && $mois <= 12 && $jour >= 1 && $jour <= $dureeMois[$mois]); 
398
	}
448
	}
399
	
449
	
400
	private function verifierPresenceParametreSpatial() {
450
	private function verifierPresenceParametreSpatial() {
401
		$presenceParametreSpatial = false;
451
		$presenceParametreSpatial = false;
402
		if (isset($this->parametres['bbox'])
452
		if (isset($this->parametres['bbox'])
403
			|| (isset($this->parametres['longitude']) && isset($this->parametres['latitude']))) {
453
			|| (isset($this->parametres['stations']))) {
404
			$presenceParametreSpatial = true;
454
			$presenceParametreSpatial = true;
405
		}
455
		}
406
		if ($presenceParametreSpatial == false) {
456
		if ($presenceParametreSpatial == false) {
407
			$message = "Aucune coordonnée n'a été saisie";
457
			$message = "Aucune coordonnée n'a été saisie";
408
			$this->ajouterErreur($message);
458
			$this->ajouterErreur($message);
409
		}
459
		}
410
	}
460
	}
411
	
461
	
412
	private function traiterParametreNbJours($nbJours) {
462
	private function traiterParametreNbJours($nbJours) {
413
		// verifier que c'est un nombre entier positif (avec expression reguliere)
463
		// verifier que c'est un nombre entier positif (avec expression reguliere)
414
		if (preg_match('/^\d+$/', $nbJours) != 1) {
464
		if (preg_match('/^\d+$/', $nbJours) != 1) {
415
			$message = "La valeur passée pour le nombre de jours doit être un entier positif.";
465
			$message = "La valeur passée pour le nombre de jours doit être un entier positif.";
416
			$this->ajouterErreur($message);
466
			$this->ajouterErreur($message);
417
		} elseif ($nbJours > 0) {
467
		} elseif ($nbJours > 0) {
418
			$this->validation->nbJours = intval($nbJours);
468
			$this->validation->nbJours = intval($nbJours);
419
		}
469
		}
420
	}
470
	}
421
	
471
	
422
}
472
}
423
 
473
 
424
?>
474
?>