Subversion Repositories eFlore/Applications.moissonnage

Rev

Rev 26 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 26 Rev 31
Line 20... Line 20...
20
 *   - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres
20
 *   - 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)
21
 *     son nom court que son nom complet (incluant le numero de version)
22
 *     On va verifier la disponibilite du referentiel pour ce service
22
 *     On va verifier la disponibilite du referentiel pour ce service
23
 *
23
 *
24
 *   - num_taxon : numero taxonomique d'une espece
24
 *   - num_taxon : numero taxonomique d'une espece
-
 
25
 *   - nn : numero nomenclatural d'une espece
25
 *     On va rechercher sa presence dans les referentiels disponibles
26
 *     On va rechercher sa presence dans les referentiels disponibles
26
 *     (les informations principales sur ce taxon seront renvoyees)
27
 *     (les informations principales sur ce taxon seront renvoyees)
27
 *
28
 *
28
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
29
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
29
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
30
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
30
 *
31
 *
31
 *   - auteur : l'auteur de l'observation
32
 *   - auteur : l'auteur de l'observation
32
 *
33
 *
-
 
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
-
 
38
 *     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
-
 
40
 *
33
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
41
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
34
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
42
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
35
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
43
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
36
 * sera generee et mise a jour.
44
 * sera generee et mise a jour.
37
 * 
45
 * 
Line 53... Line 61...
53
class VerificateurParametres {
61
class VerificateurParametres {
Line 54... Line 62...
54
	
62
	
55
	private $parametres = array();
63
	private $parametres = array();
56
	private $validation = null;
64
	private $validation = null;
-
 
65
	private $erreurs = array();
Line 57... Line 66...
57
	private $erreurs = array();
66
	private $dateTraitee = false;
Line 58... Line 67...
58
	
67
	
Line 91... Line 100...
91
					break;
100
					break;
92
				case 'referentiel' : $this->traiterParametreReferentiel($valeur);
101
				case 'referentiel' : $this->traiterParametreReferentiel($valeur);
93
					break;
102
					break;
94
				case 'num_taxon' : $this->traiterParametreTaxon($valeur);
103
				case 'num_taxon' : $this->traiterParametreTaxon($valeur);
95
					break;
104
					break;
-
 
105
				case 'nn' : $this->traiterParametreNomenclatural($valeur);
-
 
106
					break;
-
 
107
				case 'type_site' : $this->traiterParametreTypeSite($valeur);
-
 
108
					break;
-
 
109
				case 'nb_jours' : $this->traiterParametreNbJours($valeur);
-
 
110
					break;
-
 
111
				case 'date_debut' :
-
 
112
				case 'date_fin'  : {
-
 
113
					$dateDebut = isset($this->parametres['date_debut']) ? $this->parametres['date_debut'] : null;
-
 
114
					$dateFin = isset($this->parametres['date_fin']) ? $this->parametres['date_fin'] : null;
-
 
115
					if (!$this->dateTraitee) {
-
 
116
						$this->traiterParametresDate($dateDebut, $dateFin);
-
 
117
						$this->dateTraitee = true;
-
 
118
					}
-
 
119
					break;
-
 
120
				}
96
				// autres parametres ==> les ignorer
121
				// autres parametres ==> les ignorer
97
				default : break;
122
				default : break;
98
			}
123
			}
99
		}
124
		}
100
		$this->verifierPresenceParametreSpatial();
125
		$this->verifierPresenceParametreSpatial();
Line 205... Line 230...
205
	}
230
	}
Line 206... Line 231...
206
	
231
	
207
	private function estUnCodeDepartementValide($departement) {
232
	private function estUnCodeDepartementValide($departement) {
208
		// expression reguliere pour verifier que c'est un nombre entier a 2 ou 3 chiffres
233
		// expression reguliere pour verifier que c'est un nombre entier a 2 ou 3 chiffres
-
 
234
		$estUnDepartementValide = true;
-
 
235
		if ($departement == '2A' || $departement == '2B') {
209
		$estUnDepartementValide = true;
236
		 	$estUnDepartementValide = true;
210
		if (preg_match('/^\d{2,3}$/', $departement) != 1) {
237
		} elseif (preg_match('/^\d{2,3}$/', $departement) != 1) {
211
			$estUnDepartementValide = false;
238
			$estUnDepartementValide = false;
212
		} else {
239
		} else {
213
			if ((intval($departement) < 1 || intval($departement) > 95)
240
			if ((intval($departement) < 1 || intval($departement) > 95)
214
				&& (intval($departement) < 971 || intval($departement) > 978)) {
241
				&& (intval($departement) < 971 || intval($departement) > 978)) {
215
				$estUnDepartementValide = false;
242
				$estUnDepartementValide = false;
216
			}
243
			}
217
		}
244
		} 
218
		return $estUnDepartementValide;
245
		return $estUnDepartementValide;
Line 219... Line 246...
219
	}
246
	}
220
	
247
	
221
	private function traiterParametreAuteur($auteur) {
248
	private function traiterParametreAuteur($auteur) {
222
		if ($auteur != '*') {
249
		if ($auteur != '*') {
223
			$this->validation->auteur = trim($auteur);
250
			$this->validation->auteur = trim($auteur);
Line -... Line 251...
-
 
251
		}
-
 
252
	}
-
 
253
	
-
 
254
	private function traiterParametreTypeSite($typeSite) {
224
		}
255
		$this->validation->typeSite = strtolower(trim($typeSite));
225
	}
256
	}
226
	
257
	
227
	private function traiterParametreReferentiel($referentiel)  {
258
	private function traiterParametreReferentiel($referentiel)  {
228
		if (!isset($this->validation->referentiel) && $referentiel != '*') {
259
		if (!isset($this->validation->referentiel) && $referentiel != '*') {
Line 249... Line 280...
249
		return $referentielAUtiliser;
280
		return $referentielAUtiliser;
250
	}
281
	}
Line 251... Line 282...
251
	
282
	
252
	private function traiterParametreTaxon($numeroTaxon) {
283
	private function traiterParametreTaxon($numeroTaxon) {
-
 
284
		if ($numeroTaxon != '*') {
-
 
285
			$listeTaxons = explode(',', $numeroTaxon);
253
		if ($numeroTaxon != '*') {
286
			foreach ($listeTaxons as $nt) {
254
			$taxon = null;
287
				$taxon = null;
255
			if (isset($this->validation->referentiel)) {
288
				if (isset($this->validation->referentiel)) {
256
				$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $this->validation->referentiel);
289
					$taxon = $this->renvoyerTaxonDansReferentiel($nt, 'nt', $this->validation->referentiel);
-
 
290
				} else {
-
 
291
					$taxon = $this->rechercherTaxonDansReferentiels($nt, 'nt');
-
 
292
				}
257
			} else {
293
				if (is_null($taxon)) {
-
 
294
					$message = "Le numéro de taxon n'a pas permis de retrouver le taxon associé.";
-
 
295
					$this->ajouterErreur($message);
258
				// parcours de tous les referentiels jusqu'a retrouver le taxon dans sa liste
296
				} else {
-
 
297
					$this->ajouterTaxonAListe($taxon);
-
 
298
					$this->validation->referentiel = $taxon['referentiel'];
259
				$taxon = $this->rechercherTaxonDansReferentiels($numeroTaxon);
299
				}
-
 
300
			}
-
 
301
		}
260
			}
302
	}
-
 
303
	
-
 
304
	private function traiterParametreNomenclatural($numeroNomenclatural) {
-
 
305
		if ($numeroNomenclatural != '*') {
-
 
306
			$listeTaxons = explode(',', $numeroNomenclatural);
-
 
307
			foreach ($listeTaxons as $nn) {
-
 
308
				$taxon = null;
-
 
309
				if (isset($this->validation->referentiel)) {
-
 
310
					$taxon = $this->renvoyerTaxonDansReferentiel($nn, 'nn', $this->validation->referentiel);
-
 
311
				} else {
-
 
312
					$taxon = $this->rechercherTaxonDansReferentiels($nn, 'nn');
261
			
313
				}
262
			if (is_null($taxon)) {
314
				if (is_null($taxon)) {
263
				$message = "Le numéro de taxon n'a pas permis de retrouver le taxon associé.";
315
					$message = "Le numéro nomenclatural n'a pas permis de retrouver le taxon associé.";
264
				$this->ajouterErreur($message);
316
					$this->ajouterErreur($message);
265
			} else {
317
				} else {
266
				$this->validation->taxon = $taxon;
318
					$this->ajouterTaxonAListe($taxon);
-
 
319
					$this->validation->referentiel = $taxon['referentiel'];
267
				$this->validation->referentiel = $taxon['referentiel'];
320
				}
268
			}
321
			}
269
		}
322
		}
Line 270... Line 323...
270
	}
323
	}
271
	
324
	
272
	private function rechercherTaxonDansReferentiels($numeroTaxon) {
325
	private function rechercherTaxonDansReferentiels($numeroTaxon, $typeNumero) {
273
		$taxon = null;
326
		$taxon = null;
274
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
327
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
275
		foreach ($listeReferentiels as $nomReferentiel) {
328
		foreach ($listeReferentiels as $nomReferentiel) {
276
			$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $nomReferentiel);
329
			$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel);
277
			if (!is_null($taxon)) {
330
			if (!is_null($taxon)) {
278
				break;
331
				break;
279
			}
332
			}
280
		}
333
		}
Line 281... Line 334...
281
		return $taxon;
334
		return $taxon;
282
	}
335
	}
283
	
336
	
284
	private function renvoyerTaxonDansReferentiel($numeroTaxon, $nomReferentiel) {
337
	private function renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel) {
285
		$referentiel = new Referentiel($nomReferentiel);
338
		$referentiel = new Referentiel($nomReferentiel);
286
		$referentiel->chargerTaxon($numeroTaxon);
339
		$referentiel->chargerTaxon($typeNumero, $numeroTaxon);
Line -... Line 340...
-
 
340
		$taxon = $referentiel->renvoyerTaxon();
-
 
341
		return $taxon;
-
 
342
	}
-
 
343
	
-
 
344
	private function ajouterTaxonAListe($taxon) {
-
 
345
		if (!isset($this->validation->taxon)) {
-
 
346
			$this->validation->taxon = array($taxon);
-
 
347
		} elseif (!in_array($taxon, $this->validation->taxon)) {
-
 
348
			$this->validation->taxon[] = $taxon;
-
 
349
		}
-
 
350
	}
-
 
351
	
-
 
352
	private function traiterParametresDate($dateDebut, $dateFin) {
-
 
353
		$statutValidite = $this->verifierValiditeDate($dateDebut, 'début')
-
 
354
			+ $this->verifierValiditeDate($dateFin, 'fin');
-
 
355
		if ($statutValidite == 2) {
-
 
356
			if (!is_null($dateDebut) && !is_null($dateFin) && $dateDebut > $dateFin) {
-
 
357
				$message = "Intervalle de dates incorrect : date de fin avant la date de début";
-
 
358
				$this->ajouterErreur($message);
-
 
359
			} else {
-
 
360
				$this->validation->dateDebut = $dateDebut;
-
 
361
				$this->validation->dateFin   = $dateFin;
-
 
362
			}
-
 
363
		}
-
 
364
	}
-
 
365
	
-
 
366
	private function verifierValiditeDate(& $date, $position) {
-
 
367
		$statutValidite = is_null($date) ? 1 : 0;
-
 
368
		$moisParDefaut = $position == 'début' ? 1 : 12;
-
 
369
		$jourParDefaut = $position == 'début' ? 1 : 31;
-
 
370
		if (!is_null($date)) {
-
 
371
			$split = explode("-", $date);
-
 
372
			$annee = intval($split[0]);
-
 
373
			$mois  = isset($split[1]) ? intval($split[1]) : $moisParDefaut;
-
 
374
			$jour  = isset($split[2]) ? intval($split[2]) : $jourParDefaut;
-
 
375
			if (!$this->estDateValide($jour, $mois, $annee)) {
-
 
376
				$message = "Date de {$position} saisie non valide";
-
 
377
				$this->ajouterErreur($message);
-
 
378
			} else {
-
 
379
				$date = $annee."-".(($mois<10)?"0".$mois:$mois)."-".(($jour<10)?"0".$jour:$jour);
-
 
380
				$dateDuJour = date('Y-m-d');
-
 
381
				if ($date > $dateDuJour) {
-
 
382
					$message = "La date de {$position} saisie postérieure à la date du jour : {$dateDuJour}";
-
 
383
					$this->ajouterErreur($message);
-
 
384
				} else {
-
 
385
					$statutValidite = 1;
-
 
386
				}
-
 
387
			}
-
 
388
		}
-
 
389
		return $statutValidite;
-
 
390
	}
-
 
391
	
-
 
392
	private function estDateValide($jour, $mois, $annee) {
-
 
393
		$estBissextile = (($annee % 4 == 0 && $annee % 100 != 0) || ($annee % 400 == 0));
-
 
394
		$dureeFevrier = $estBissextile ? 29 : 28;
-
 
395
		$dureeMois = array(1 => 31, 2 => $dureeFevrier, 3 => 31, 4 => 30, 5 => 31, 6 => 30, 7 => 31,
287
		$taxon = $referentiel->renvoyerTaxon();
396
			8 => 31, 9 => 30, 10 => 31, 11 => 30, 12 => 31);
288
		return $taxon;
397
		return ($annee >= 1900 && $mois >= 1 && $mois <= 12 && $jour >= 1 && $jour <= $dureeMois[$mois]); 
289
	}
398
	}
290
	
399
	
291
	private function verifierPresenceParametreSpatial() {
400
	private function verifierPresenceParametreSpatial() {
Line 298... Line 407...
298
			$message = "Aucune coordonnée n'a été saisie";
407
			$message = "Aucune coordonnée n'a été saisie";
299
			$this->ajouterErreur($message);
408
			$this->ajouterErreur($message);
300
		}
409
		}
301
	}
410
	}
Line -... Line 411...
-
 
411
	
-
 
412
	private function traiterParametreNbJours($nbJours) {
-
 
413
		// verifier que c'est un nombre entier positif (avec expression reguliere)
-
 
414
		if (preg_match('/^\d+$/', $nbJours) != 1) {
-
 
415
			$message = "La valeur passée pour le nombre de jours doit être un entier positif.";
-
 
416
			$this->ajouterErreur($message);
-
 
417
		} elseif ($nbJours > 0) {
-
 
418
			$this->validation->nbJours = intval($nbJours);
-
 
419
		}
-
 
420
	}
302
	
421
	
Line 303... Line 422...
303
}
422
}
304
 
423