Subversion Repositories Applications.referentiel

Rev

Rev 161 | Rev 164 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 jpm 1
<?php
2
// Encodage : UTF-8
3
// +-------------------------------------------------------------------------------------------------------------------+
4
/**
5
* Tests de référentiels de nomenclature et taxonomie
6
*
7
* Description : classe permettant de tester les référentiels selon le manuel technique
8
* Utilisation : php script.php tests -p bdnff -a tout
9
*
10
//Auteur original :
11
* @author       Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
* @copyright	Tela-Botanica 1999-2010
13
* @link			http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel
14
* @licence		GPL v3 & CeCILL v2
15
* @version		$Id$
16
*/
17
// +-------------------------------------------------------------------------------------------------------------------+
38 jpm 18
// TODO : supprimer l'utilisation du paramêtres 'p' et chercher les infos depuis la bdd
20 jpm 19
class Tests extends ScriptCommande {
20
 
42 jpm 21
	const SCRIPT_NOM = 'tests';
22
 
20 jpm 23
	private $projet = null;
30 jpm 24
	private $traitement = null;
20 jpm 25
 
26
	private $manuel = null;
64 jpm 27
	private $noms = null;
20 jpm 28
 
30 jpm 29
	private $resultatDao = null;
30
	private $traitementDao = null;
31
	private $tableStructureDao = null;
32
	private $referentielDao = null;
33
 
20 jpm 34
	public function executer() {
150 jpm 35
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v4.1.ini');
20 jpm 36
 
30 jpm 37
		$this->resultatDao = new ResultatDao();
38
		$this->traitementDao = new TraitementDao();
97 jpm 39
		Debug::printr('Dans le script test');
30 jpm 40
		// Récupération du dernier traitement demandé
142 delphine 41
		$this->traitement = $this->traitementDao->getDernierTraitement('tout', self::SCRIPT_NOM);
42 jpm 42
		if (isset($this->traitement)) {
142 delphine 43
			$this->projet = $this->traitement['referentiel_code']; // Récupération du nom de projet
38 jpm 44
			Debug::printr($this->traitement);
45
			// Écriture de la date de début du traitement
46
			Debug::printr('Debute:'.$this->traitementDao->debuterTraitement($this->traitement['id_traitement']));
47
 
48
			// Nettoyage des traitements obsolètes
42 jpm 49
			$traitements_obsoletes = $this->traitementDao->getTraitementsObsoletes($this->projet, self::SCRIPT_NOM);
50
			if (isset($traitements_obsoletes)) {
51
				Debug::printr('Supp. obsoletes:'.$this->traitementDao->supprimer($traitements_obsoletes));
52
			}
38 jpm 53
 
54
			// Lancement du test demandé
55
			$cmd = $this->getParam('a');
56
	    	switch ($cmd) {
57
				case 'tout' :
58
					$this->tableStructureDao = new TableStructureDao();
59
					$this->referentielDao = new ReferentielDao();
60
					Debug::printr('Départ lancement test:');
61
					$this->lancerTests();
62
					break;
63
				default :
64
					$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
65
			}
66
			// Écriture de la date de fin du traitement
67
			Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement']));
97 jpm 68
		} else {
142 delphine 69
			Debug::printr("Aucun dernier traitement trouvé pour le script '".self::SCRIPT_NOM."' !");
20 jpm 70
		}
71
    }
72
 
73
    public function lancerTests() {
74
		$donnees = array();
75
		$donnees['tests'] = array();
26 jpm 76
 
20 jpm 77
		// Récupération des données à tester
78
		$colonnes = $this->tableStructureDao->getColonnes($this->projet);
79
		$analyses = $this->tableStructureDao->getAnalyse($this->projet);
64 jpm 80
		$this->noms = $this->referentielDao->getTout($this->projet);
81
		Debug::printr('Nbre noms :'.count($this->noms));
20 jpm 82
 
83
		// Lancement des tests unitaires
64 jpm 84
		$resultats = array();
85
		$resultats[] = $this->testerNombreDeChamps($colonnes);
86
		$resultats[] = $this->testerNomDesChamps($colonnes);
87
		$resultats[] = $this->testerTypeDesChamps($colonnes);
88
		$resultats[] = $this->testerNumNomClePrimaire($colonnes);
20 jpm 89
 
64 jpm 90
		// Si la structure est bonne nous lançons les autres tests
91
		Debug::printr($resultats);
92
		if ($this->verifierResultats($resultats)) {
93
			$this->testerTailleDesChamps($colonnes, $analyses);
94
 
95
			$this->testerNumNomSuperieurAZero();
96
 
97
			$this->testerNumNomRetenuSuperieurAZero();
98
			$this->testerNumTaxSupEgalZeroUnique();
99
			$this->testerTaxSupPourTaxon();
100
			$this->testerExitenceTaxonSuperieur();
101
			$this->testerClassificationRang();
102
			$this->testerClassification();
103
 
104
			$this->testerRang();
105
 
106
			$this->testerNomCompletSupraGenerique();
107
			$this->testerNomCompletGenre();
108
			$this->testerNomCompletInfraGenre();
109
			$this->testerNomCompletEspece();
110
			$this->testerNomCompletInfraSpecifique();
111
 
112
			$this->testerNomSupraGeneriqueEspaces();
113
			$this->testerNomSupraGeneriqueSyntaxe();
114
			$this->testerNomSupraGeneriqueRang();
115
 
116
			$this->testerGenreEspaces();
117
			$this->testerGenreSyntaxe();
118
			$this->testerGenreRang();
119
 
120
			$this->testerEpitheteInfraGeneriqueEspaces();
121
			$this->testerEpitheteInfraGeneriqueSyntaxe();
122
			$this->testerEpitheteInfraGeneriqueRang();
123
 
124
			$this->testerEpitheteSpEspaces();
125
			$this->testerEpitheteSpSyntaxe();
126
			$this->testerEpitheteSpRang();
127
 
128
			$this->testerTypeEpitheteEspaces();
129
			$this->testerTypeEpitheteSyntaxe();
130
			$this->testerTypeEpitheteHybridite();
131
 
132
			$this->testerEpitheteInfraSpEspaces();
133
			$this->testerEpitheteInfraSpSyntaxe();
134
			$this->testerEpitheteInfraSpRang();
135
 
136
			$this->testerGroupeCultivarSyntaxe();
137
			$this->testerGroupeCultivarRang();
138
 
139
			$this->testerCultivarSyntaxe();
140
			$this->testerCultivarRang();
141
 
142
			$this->testerNomCommercialSyntaxe();
143
			$this->testerNomCommercialPresenceCultivar();
144
 
145
			$this->testerAuteurSyntaxe();
146
 
147
			$this->testerAnneeSyntaxe();
148
 
149
			$this->testerBiblioOrigineSyntaxe();
150
 
151
			$this->testerHomonymieSyntaxe();
152
			$this->testerHomonymieExistence();
153
 
154
			$this->testerBasionymeSyntaxe();
155
			$this->testerBasionymeExistence();
156
 
157
			$this->testerSynonymeProparteSyntaxe();
158
			$this->testerSynonymeProparteExistence();
159
 
160
			$this->testerSynonymeDouteuxSyntaxe();
158 delphine 161
			$this->testerSynonymeDouteuxNumNomRetenu();
64 jpm 162
 
163
			$this->testerSynonymeMalAppliqueSyntaxe();
164
 
165
			$this->testerSynonymeOrthographiqueSyntaxe();
166
			$this->testerSynonymeOrthographiqueExistence();
167
 
168
			$this->testerHybrideParent01Syntaxe();
169
			$this->testerHybrideParent01Existence();
170
			$this->testerHybrideParent02Syntaxe();
171
			$this->testerHybrideParent02Existence();
172
 
173
			$this->testerPresenceSyntaxe();
174
			$this->testerStatutOrigineSyntaxe();
175
			$this->testerStatutIntroductionSyntaxe();
176
			$this->testerStatutCultureSyntaxe();
146 delphine 177
			$this->testerExclureTaxRefSyntaxe();
64 jpm 178
		}
20 jpm 179
	}
64 jpm 180
	private function verifierResultats($resultats) {
181
		$ok = true;
182
		foreach ($resultats as $resultat) {
183
			if ($resultat == '0') {
184
				$ok = false;
185
				break;
186
			}
187
		}
188
		return $ok;
189
	}
20 jpm 190
 
191
	//+--------------------------------------------------------------------------------------------------------------+//
30 jpm 192
	// Enregistrement des résultats
193
	private function traiterResultatTest($info) {
64 jpm 194
		Debug::printr($info['nom']);
30 jpm 195
		if (isset($info['message'])) {
196
			if (is_array($info['message'])) {
31 jpm 197
				$info['message'] = $this->getVue('tests/squelettes/message_table', $info);
198
			} else {
199
				$info['message'] = $this->getVue('tests/squelettes/message_p', $info);
30 jpm 200
			}
201
		}
202
		$this->resultatDao->ajouter($this->traitement['id_traitement'], $info);
64 jpm 203
		$info = null;
30 jpm 204
	}
205
 
206
	//+--------------------------------------------------------------------------------------------------------------+//
20 jpm 207
	// TESTS
208
 
64 jpm 209
	private function testerStatutCultureSyntaxe() {
30 jpm 210
		$info = array('nom' => 'statut_culture -> syntaxe',
20 jpm 211
			'description' => "Le champ statut_culture peut contenir :\n".
163 delphine 212
			" - le symbole tiret «-» précédant une autre information non référencée...\n".
213
			" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
214
			" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
20 jpm 215
			"un code de présence spécifique au référentiel.",
216
			'resultat' => false);
217
 
218
		// Réalisation du test
219
		$noms_erreur = array();
64 jpm 220
		foreach ($this->noms as &$nom) {
20 jpm 221
			if ($nom['statut_culture'] != '') {
222
				if (!$this->verifierStatutCulture($nom['statut_culture'])) {
223
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
224
				}
225
			}
226
		}
227
 
228
		// Analyse des résultats
229
		if (count($noms_erreur) > 0) {
230
			$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
231
			$info['message']['lignes'] = $noms_erreur;
232
		} else {
233
			$info['resultat'] = true;
234
		}
64 jpm 235
		$noms_erreur = null;
20 jpm 236
 
30 jpm 237
		$this->traiterResultatTest($info);
20 jpm 238
	}
239
 
64 jpm 240
	private function testerStatutIntroductionSyntaxe() {
30 jpm 241
		$info = array('nom' => 'statut_introduction -> syntaxe',
20 jpm 242
			'description' => "Le champ statut_introduction peut contenir :\n".
163 delphine 243
			" - le symbole tiret «-» précédant une autre information non référencée...\n".
244
			" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
245
			" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
20 jpm 246
			"un code de présence spécifique au référentiel.",
247
			'resultat' => false);
248
 
249
		// Réalisation du test
250
		$noms_erreur = array();
64 jpm 251
		foreach ($this->noms as &$nom) {
20 jpm 252
			if ($nom['statut_introduction'] != '') {
253
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
254
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
255
				}
256
			}
257
		}
258
 
259
		// Analyse des résultats
260
		if (count($noms_erreur) > 0) {
261
			$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
262
			$info['message']['lignes'] = $noms_erreur;
263
		} else {
264
			$info['resultat'] = true;
265
		}
64 jpm 266
		$noms_erreur = null;
20 jpm 267
 
30 jpm 268
		$this->traiterResultatTest($info);
20 jpm 269
	}
270
 
64 jpm 271
	private function testerStatutOrigineSyntaxe() {
30 jpm 272
		$info = array('nom' => 'statut_origine -> syntaxe',
20 jpm 273
			'description' => "Le champ statut_origine peut contenir :\n".
163 delphine 274
			" - le symbole tiret «-» précédant une autre information non référencée...\n".
20 jpm 275
			" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
163 delphine 276
			" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
20 jpm 277
			"un code de présence spécifique au référentiel.",
278
			'resultat' => false);
279
 
280
		// Réalisation du test
281
		$noms_erreur = array();
64 jpm 282
		foreach ($this->noms as &$nom) {
20 jpm 283
			if ($nom['statut_origine'] != '') {
284
				if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
285
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
286
				}
287
			}
288
		}
289
 
290
		// Analyse des résultats
291
		if (count($noms_erreur) > 0) {
292
			$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
293
			$info['message']['lignes'] = $noms_erreur;
294
		} else {
295
			$info['resultat'] = true;
296
		}
64 jpm 297
		$noms_erreur = null;
20 jpm 298
 
30 jpm 299
		$this->traiterResultatTest($info);
20 jpm 300
	}
301
 
64 jpm 302
	private function testerPresenceSyntaxe() {
30 jpm 303
		$info = array('nom' => 'presence -> syntaxe',
20 jpm 304
			'description' => "Le champ presence contient soit :\n".
163 delphine 305
			" - le symbole tiret «-» précédant une autre information non référencée...\n".
306
			" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
307
			" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
20 jpm 308
			"un code de présence spécifique au référentiel.",
309
			'resultat' => false);
310
 
311
		// Réalisation du test
312
		$noms_erreur = array();
64 jpm 313
		foreach ($this->noms as &$nom) {
20 jpm 314
			if ($nom['presence'] != '') {
315
				if (!$this->verifierPresence($nom['presence'])) {
316
					$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
317
				}
318
			}
319
		}
320
 
321
		// Analyse des résultats
322
		if (count($noms_erreur) > 0) {
323
			$info['message']['entete'] = array('num_nom', 'presence erroné');
324
			$info['message']['lignes'] = $noms_erreur;
325
		} else {
326
			$info['resultat'] = true;
327
		}
64 jpm 328
		$noms_erreur = null;
20 jpm 329
 
30 jpm 330
		$this->traiterResultatTest($info);
20 jpm 331
	}
332
 
64 jpm 333
	private function testerHybrideParent02Existence() {
30 jpm 334
		$info = array('nom' => 'hybride_parent_02 -> existence',
20 jpm 335
			'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur du champ ".
336
			"num_nom.",
337
			'resultat' => false);
338
 
339
		// Réalisation du test
340
		$noms_erreur = array();
64 jpm 341
		foreach ($this->noms as &$nom) {
20 jpm 342
			if ($nom['hybride_parent_02'] != '') {
64 jpm 343
				if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
42 jpm 344
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
20 jpm 345
				}
346
			}
347
		}
348
 
349
		// Analyse des résultats
350
		if (count($noms_erreur) > 0) {
351
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
352
			$info['message']['lignes'] = $noms_erreur;
353
		} else {
354
			$info['resultat'] = true;
355
		}
64 jpm 356
		$noms_erreur = null;
20 jpm 357
 
30 jpm 358
		$this->traiterResultatTest($info);
20 jpm 359
	}
360
 
64 jpm 361
	private function testerHybrideParent02Syntaxe() {
30 jpm 362
		$info = array('nom' => 'hybride_parent_02 -> syntaxe',
20 jpm 363
			'description' => "Le champ hybride_parent_02 contient soit :\n".
163 delphine 364
			" - une valeur vide,\n".
365
			" - un nombre.",
20 jpm 366
			'resultat' => false);
367
 
368
		// Réalisation du test
369
		$noms_erreur = array();
64 jpm 370
		foreach ($this->noms as &$nom) {
20 jpm 371
			if ($nom['hybride_parent_02'] != '') {
372
				if (!$this->verifierNombre($nom['hybride_parent_02'])) {
42 jpm 373
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
20 jpm 374
				}
375
			}
376
		}
377
 
378
		// Analyse des résultats
379
		if (count($noms_erreur) > 0) {
380
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
381
			$info['message']['lignes'] = $noms_erreur;
382
		} else {
383
			$info['resultat'] = true;
384
		}
64 jpm 385
		$noms_erreur = null;
20 jpm 386
 
30 jpm 387
		$this->traiterResultatTest($info);
20 jpm 388
	}
389
 
390
 
64 jpm 391
	private function testerHybrideParent01Existence() {
30 jpm 392
		$info = array('nom' => 'hybride_parent_01 -> existence',
20 jpm 393
			'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur du champ ".
394
			"num_nom.",
395
			'resultat' => false);
396
 
397
		// Réalisation du test
398
		$noms_erreur = array();
64 jpm 399
		foreach ($this->noms as &$nom) {
20 jpm 400
			if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
64 jpm 401
				if (!isset($this->noms[$nom['hybride_parent_01']])) {
42 jpm 402
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
20 jpm 403
				}
404
			}
405
		}
406
 
407
		// Analyse des résultats
408
		if (count($noms_erreur) > 0) {
409
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
410
			$info['message']['lignes'] = $noms_erreur;
411
		} else {
412
			$info['resultat'] = true;
413
		}
64 jpm 414
		$noms_erreur = null;
20 jpm 415
 
30 jpm 416
		$this->traiterResultatTest($info);
20 jpm 417
	}
418
 
64 jpm 419
	private function testerHybrideParent01Syntaxe() {
30 jpm 420
		$info = array('nom' => 'hybride_parent_01 -> syntaxe',
20 jpm 421
			'description' => "Le champ hybride_parent_01 contient soit :\n".
163 delphine 422
			" - une valeur vide,\n".
423
			" - un nombre.",
20 jpm 424
			'resultat' => false);
425
 
426
		// Réalisation du test
427
		$noms_erreur = array();
64 jpm 428
		foreach ($this->noms as &$nom) {
20 jpm 429
			if ($nom['hybride_parent_01'] != '') {
430
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
42 jpm 431
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
20 jpm 432
				}
433
			}
434
		}
435
 
436
		// Analyse des résultats
437
		if (count($noms_erreur) > 0) {
438
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
439
			$info['message']['lignes'] = $noms_erreur;
440
		} else {
441
			$info['resultat'] = true;
442
		}
64 jpm 443
		$noms_erreur = null;
20 jpm 444
 
30 jpm 445
		$this->traiterResultatTest($info);
20 jpm 446
	}
447
 
64 jpm 448
	private function testerSynonymeOrthographiqueExistence() {
30 jpm 449
		$info = array('nom' => 'synonyme_orthographique -> existence',
163 delphine 450
			'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
451
			"à une valeur du champ num_nom.",
20 jpm 452
			'resultat' => false);
453
 
454
		// Réalisation du test
455
		$noms_erreur = array();
64 jpm 456
		foreach ($this->noms as &$nom) {
20 jpm 457
			if ($nom['synonyme_orthographique'] != '') {
64 jpm 458
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
20 jpm 459
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
460
				}
461
			}
462
		}
463
 
464
		// Analyse des résultats
465
		if (count($noms_erreur) > 0) {
466
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
467
			$info['message']['lignes'] = $noms_erreur;
468
		} else {
469
			$info['resultat'] = true;
470
		}
64 jpm 471
		$noms_erreur = null;
20 jpm 472
 
30 jpm 473
		$this->traiterResultatTest($info);
20 jpm 474
	}
475
 
64 jpm 476
	private function testerSynonymeOrthographiqueSyntaxe() {
30 jpm 477
		$info = array('nom' => 'synonyme_orthographique -> syntaxe',
20 jpm 478
			'description' => "Le champ synonyme_orthographique contient soit :\n".
163 delphine 479
			" - une valeur vide,\n".
480
			" - un nombre.",
20 jpm 481
			'resultat' => false);
482
 
483
		// Réalisation du test
484
		$noms_erreur = array();
64 jpm 485
		foreach ($this->noms as $nom) {
20 jpm 486
			if ($nom['synonyme_orthographique'] != '') {
487
				if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
488
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
489
				}
490
			}
491
		}
492
 
493
		// Analyse des résultats
494
		if (count($noms_erreur) > 0) {
495
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
496
			$info['message']['lignes'] = $noms_erreur;
497
		} else {
498
			$info['resultat'] = true;
499
		}
64 jpm 500
		$noms_erreur = null;
20 jpm 501
 
30 jpm 502
		$this->traiterResultatTest($info);
20 jpm 503
	}
504
 
64 jpm 505
	private function testerSynonymeMalAppliqueSyntaxe() {
30 jpm 506
		$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
20 jpm 507
			'description' => "Le champ synonyme_mal_applique contient soit :\n".
163 delphine 508
			" - une valeur vide,\n".
509
			" - le chiffre 1.",
20 jpm 510
			'resultat' => false);
511
 
512
		// Réalisation du test
513
		$noms_erreur = array();
64 jpm 514
		foreach ($this->noms as &$nom) {
20 jpm 515
			if ($nom['synonyme_mal_applique'] != '') {
516
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
517
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
518
				}
519
			}
520
		}
521
 
522
		// Analyse des résultats
523
		if (count($noms_erreur) > 0) {
524
			$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
525
			$info['message']['lignes'] = $noms_erreur;
526
		} else {
527
			$info['resultat'] = true;
528
		}
64 jpm 529
		$noms_erreur = null;
20 jpm 530
 
30 jpm 531
		$this->traiterResultatTest($info);
20 jpm 532
	}
533
 
158 delphine 534
 
64 jpm 535
	private function testerSynonymeDouteuxSyntaxe() {
30 jpm 536
		$info = array('nom' => 'synonyme_douteux -> syntaxe',
20 jpm 537
			'description' => "Le champ synonyme_douteux contient soit :\n".
163 delphine 538
			" - une valeur vide,\n".
539
			" - le chiffre 1.",
20 jpm 540
			'resultat' => false);
541
 
542
		// Réalisation du test
543
		$noms_erreur = array();
64 jpm 544
		foreach ($this->noms as &$nom) {
20 jpm 545
			if ($nom['synonyme_douteux'] != '') {
546
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
547
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
548
				}
549
			}
550
		}
551
 
552
		// Analyse des résultats
553
		if (count($noms_erreur) > 0) {
554
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
555
			$info['message']['lignes'] = $noms_erreur;
556
		} else {
557
			$info['resultat'] = true;
558
		}
64 jpm 559
		$noms_erreur = null;
20 jpm 560
 
30 jpm 561
		$this->traiterResultatTest($info);
20 jpm 562
	}
563
 
158 delphine 564
	private function testerSynonymeDouteuxNumNomRetenu() {
565
		$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
566
			'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
567
			'resultat' => false);
568
 
569
		// Réalisation du test
570
		$noms_erreur = array();
571
		foreach ($this->noms as &$nom) {
572
			if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
573
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
574
			}
575
		}
576
 
577
		// Analyse des résultats
578
		if (count($noms_erreur) > 0) {
579
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
580
			$info['message']['lignes'] = $noms_erreur;
581
		} else {
582
			$info['resultat'] = true;
583
		}
584
		$noms_erreur = null;
585
		$this->traiterResultatTest($info);
586
	}
587
 
588
 
64 jpm 589
	private function testerSynonymeProparteExistence() {
30 jpm 590
		$info = array('nom' => 'synonyme_proparte -> existence',
20 jpm 591
			'description' => "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux ".
592
			"doit correspondre à une valeur du champ num_nom.",
593
			'resultat' => false);
594
 
595
		// Réalisation du test
596
		$noms_erreur = array();
64 jpm 597
		foreach ($this->noms as &$nom) {
20 jpm 598
			if ($nom['synonyme_proparte'] != '') {
599
				$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
600
				$num_nom_en_erreur = array();
601
				foreach ($num_nom_a_verifier as $num_nom) {
64 jpm 602
					if (!isset($this->noms[$num_nom])) {
20 jpm 603
						$num_nom_en_erreur[] = $num_nom;
604
					}
605
				}
606
				if (count($nbre_en_erreur) > 0) {
607
					$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
608
				}
609
			}
610
		}
611
 
612
		// Analyse des résultats
613
		if (count($noms_erreur) > 0) {
614
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
615
			$info['message']['lignes'] = $noms_erreur;
616
		} else {
617
			$info['resultat'] = true;
618
		}
64 jpm 619
		$noms_erreur = null;
20 jpm 620
 
30 jpm 621
		$this->traiterResultatTest($info);
20 jpm 622
	}
623
 
64 jpm 624
	private function testerSynonymeProparteSyntaxe() {
30 jpm 625
		$info = array('nom' => 'synonyme_proparte -> syntaxe',
20 jpm 626
			'description' => "Le champ synonyme_proparte contient soit :\n".
163 delphine 627
			" - une valeur vide,\n".
628
			" - un nombre,\n".
629
			" - une suite de nombres séparés par des virgules.",
20 jpm 630
			'resultat' => false);
631
 
632
		// Réalisation du test
633
		$noms_erreur = array();
64 jpm 634
		foreach ($this->noms as &$nom) {
20 jpm 635
			if ($nom['synonyme_proparte'] != '') {
636
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
637
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
638
				}
639
			}
640
		}
641
 
642
		// Analyse des résultats
643
		if (count($noms_erreur) > 0) {
644
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
645
			$info['message']['lignes'] = $noms_erreur;
646
		} else {
647
			$info['resultat'] = true;
648
		}
64 jpm 649
		$noms_erreur = null;
20 jpm 650
 
30 jpm 651
		$this->traiterResultatTest($info);
20 jpm 652
	}
653
 
64 jpm 654
	private function testerBasionymeExistence() {
30 jpm 655
		$info = array('nom' => 'basionyme -> existence',
20 jpm 656
			'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
657
			"num_nom.",
658
			'resultat' => false);
659
 
660
		// Réalisation du test
661
		$noms_erreur = array();
64 jpm 662
		foreach ($this->noms as &$nom) {
20 jpm 663
			if ($nom['basionyme'] != '') {
64 jpm 664
				if (!isset($this->noms[$nom['basionyme']])) {
20 jpm 665
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
666
				}
667
			}
668
		}
669
 
670
		// Analyse des résultats
671
		if (count($noms_erreur) > 0) {
672
			$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
673
			$info['message']['lignes'] = $noms_erreur;
674
		} else {
675
			$info['resultat'] = true;
676
		}
64 jpm 677
		$noms_erreur = null;
20 jpm 678
 
30 jpm 679
		$this->traiterResultatTest($info);
20 jpm 680
	}
681
 
64 jpm 682
	private function testerBasionymeSyntaxe() {
30 jpm 683
		$info = array('nom' => 'basionyme -> syntaxe',
20 jpm 684
			'description' => "Le champ basionyme contient :\n".
163 delphine 685
								" - une valeur vide,\n".
686
								" - un nombre.",
20 jpm 687
			'resultat' => false);
688
 
689
		// Réalisation du test
690
		$noms_erreur = array();
64 jpm 691
		foreach ($this->noms as &$nom) {
20 jpm 692
			if ($nom['basionyme'] != '') {
693
				if (!$this->verifierNombre($nom['basionyme'])) {
694
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
695
				}
696
			}
697
		}
698
 
699
		// Analyse des résultats
700
		if (count($noms_erreur) > 0) {
701
			$info['message']['entete'] = array('num_nom', 'basionyme erroné');
702
			$info['message']['lignes'] = $noms_erreur;
703
		} else {
704
			$info['resultat'] = true;
705
		}
64 jpm 706
		$noms_erreur = null;
20 jpm 707
 
30 jpm 708
		$this->traiterResultatTest($info);
20 jpm 709
	}
710
 
64 jpm 711
	private function testerHomonymieExistence() {
30 jpm 712
		$info = array('nom' => 'homonyme -> existence',
20 jpm 713
			'description' => "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur ".
149 jpm 714
			"dans le champ nom_sci.",
20 jpm 715
			'resultat' => false);
716
 
64 jpm 717
		$noms_homonymie = $this->classerNomsParNomComplet();
718
 
20 jpm 719
		// Réalisation du test
720
		$noms_erreur = array();
64 jpm 721
		foreach ($this->noms as &$nom) {
20 jpm 722
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
149 jpm 723
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
724
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
20 jpm 725
				}
726
			}
727
		}
64 jpm 728
		$noms_homonymie = null;
20 jpm 729
 
730
		// Analyse des résultats
731
		if (count($noms_erreur) > 0) {
732
			$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
733
			$info['message']['lignes'] = $noms_erreur;
734
		} else {
735
			$info['resultat'] = true;
736
		}
64 jpm 737
		$noms_erreur = null;
20 jpm 738
 
30 jpm 739
		$this->traiterResultatTest($info);
20 jpm 740
	}
741
 
64 jpm 742
	private function testerHomonymieSyntaxe() {
30 jpm 743
		$info = array('nom' => 'homonyme -> syntaxe',
20 jpm 744
			'description' => "Le champ homonyme contient :\n".
163 delphine 745
				" - une valeur vide,\n".
746
				" - le chiffre 1.",
20 jpm 747
			'resultat' => false);
748
 
749
		// Réalisation du test
750
		$noms_erreur = array();
64 jpm 751
		foreach ($this->noms as &$nom) {
20 jpm 752
			if ($nom['homonyme'] != '') {
753
				if (!$this->verifierBooleen($nom['homonyme'])) {
754
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
755
				}
756
			}
757
		}
758
 
759
		// Analyse des résultats
760
		if (count($noms_erreur) > 0) {
761
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
762
			$info['message']['lignes'] = $noms_erreur;
763
		} else {
764
			$info['resultat'] = true;
765
		}
64 jpm 766
		$noms_erreur = null;
20 jpm 767
 
30 jpm 768
		$this->traiterResultatTest($info);
20 jpm 769
	}
770
 
64 jpm 771
	private function testerBiblioOrigineSyntaxe() {
30 jpm 772
		$info = array('nom' => 'biblio_origine -> syntaxe',
20 jpm 773
			'description' => "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères ".
774
			"précis qui sont dans l'ordre de gauche à droite :\n".
163 delphine 775
			" - éventuellement, le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
776
			"l'ouvrage dans lequel la publication est parue),\n".
777
			" - point-virgule « ; » (si l'info précédent a été renseignée),\n".
778
			" - abréviation, ou nom, de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom. ".
779
			"Cette information ne doit pas contenir de caractère virgule « , »,\n".
780
			" - virgule « , »,\n".
781
			" - informations permettant d'identifier plus précisément le document contenant le nom... ".
782
			"(par exemple, l'éditeur, le tome, le numéro d'édition, le volume...) séparées par des virgules ou d'autres ".
20 jpm 783
			"caractères sauf deux points « : ».\n".
163 delphine 784
			" - deux points « : »,\n".
785
			" - numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière ".
786
			"pages de l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
787
			"la position du nom dans le document. Le tiret « - » doit toujours servir à séparer un ensemble.",
20 jpm 788
			'resultat' => false);
789
 
790
		// Réalisation du test
791
		$noms_erreur = array();
64 jpm 792
		foreach ($this->noms as &$nom) {
20 jpm 793
			if ($nom['biblio_origine'] != '') {
794
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
795
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
796
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
797
				}
798
			}
799
		}
800
 
801
		// Analyse des résultats
802
		if (count($noms_erreur) > 0) {
803
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
804
			$info['message']['lignes'] = $noms_erreur;
805
		} else {
806
			$info['resultat'] = true;
807
		}
64 jpm 808
		$noms_erreur = null;
20 jpm 809
 
30 jpm 810
		$this->traiterResultatTest($info);
20 jpm 811
	}
812
 
64 jpm 813
	private function testerAnneeSyntaxe() {
30 jpm 814
		$info = array('nom' => 'annee -> syntaxe',
20 jpm 815
			'description' => "Le champ annee doit :\n".
163 delphine 816
			" - contenir un nombre de 4 chiffres,\n".
817
			" - être supérieur ou égal à 1753.",
20 jpm 818
			'resultat' => false);
819
 
820
		// Réalisation du test
821
		$noms_erreur = array();
64 jpm 822
		foreach ($this->noms as &$nom) {
20 jpm 823
			if ($nom['annee'] != '') {
824
				if (!$this->verifierAnnee($nom['annee'])) {
825
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
826
				}
827
			}
828
		}
829
 
830
		// Analyse des résultats
831
		if (count($noms_erreur) > 0) {
832
			$info['message']['entete'] = array('num_nom', 'annee erroné');
833
			$info['message']['lignes'] = $noms_erreur;
834
		} else {
835
			$info['resultat'] = true;
836
		}
64 jpm 837
		$noms_erreur = null;
20 jpm 838
 
30 jpm 839
		$this->traiterResultatTest($info);
20 jpm 840
	}
841
 
64 jpm 842
	private function testerAuteurSyntaxe() {
30 jpm 843
		$info = array('nom' => 'auteur -> syntaxe',
20 jpm 844
			'description' => "Le champ auteur doit :\n".
163 delphine 845
			" - contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié à l'origine la combinaison latine courante.\n".
846
    		" - OU débuter par le mot « sensu » et contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ".
847
			"ayant publié un nom dont la description ne correspond pas à celle de l'auteur, ou des auteurs, d'origine.\n".
20 jpm 848
			" - se composer de caractères alphabétiques (A-Z, a-z), incluant les signes diacritiques, le symbole point (.), les paires de parenthèses ( () ), les apostrophes, l'esperluette (&) et l'espace ( ).\n".
849
			" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
850
			" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
851
			" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
852
			" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
853
			" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
854
			"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
855
			'resultat' => false);
856
 
857
		// Réalisation du test
858
		$noms_erreur = array();
64 jpm 859
		foreach ($this->noms as &$nom) {
20 jpm 860
			if ($nom['auteur'] != '') {
861
				if (!$this->verifierAuteur($nom['auteur'])) {
862
					$intitule_traite = $this->repererEspace($nom['auteur']);
863
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
864
				}
865
			}
866
		}
867
 
868
		// Analyse des résultats
869
		if (count($noms_erreur) > 0) {
870
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
871
			$info['message']['lignes'] = $noms_erreur;
872
		} else {
873
			$info['resultat'] = true;
874
		}
64 jpm 875
		$noms_erreur = null;
20 jpm 876
 
30 jpm 877
		$this->traiterResultatTest($info);
20 jpm 878
	}
879
 
64 jpm 880
	private function testerNomCommercialSyntaxe() {
30 jpm 881
		$info = array('nom' => 'nom_commercial -> syntaxe',
20 jpm 882
			'description' => "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du ".
883
				"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
884
				"qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces.\n",
885
			'resultat' => false);
886
 
887
		// Réalisation du test
888
		$noms_erreur = array();
64 jpm 889
		foreach ($this->noms as &$nom) {
20 jpm 890
			if ($nom['nom_commercial'] != '') {
891
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
892
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
893
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
894
				}
895
			}
896
		}
897
 
898
		// Analyse des résultats
899
		if (count($noms_erreur) > 0) {
900
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
901
			$info['message']['lignes'] = $noms_erreur;
902
		} else {
903
			$info['resultat'] = true;
904
		}
64 jpm 905
		$noms_erreur = null;
20 jpm 906
 
30 jpm 907
		$this->traiterResultatTest($info);
20 jpm 908
	}
909
 
64 jpm 910
	private function testerNomCommercialPresenceCultivar() {
30 jpm 911
		$info = array('nom' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
163 delphine 912
			'description' => "Si le champ nom_commercial contient un nom commercial alors le champ cultivar OU ".
20 jpm 913
				"cultivar_groupe ne doit pas être vide.",
914
			'resultat' => false);
915
 
916
		// Réalisation du test
917
		$noms_erreur = array();
64 jpm 918
		foreach ($this->noms as &$nom) {
919
			if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
149 jpm 920
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
20 jpm 921
			}
922
		}
923
 
924
		// Analyse des résultats
925
		if (count($noms_erreur) > 0) {
926
			$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
927
			$info['message']['lignes'] = $noms_erreur;
928
		} else {
929
			$info['resultat'] = true;
930
		}
64 jpm 931
		$noms_erreur = null;
20 jpm 932
 
30 jpm 933
		$this->traiterResultatTest($info);
20 jpm 934
	}
935
 
64 jpm 936
	private function testerCultivarSyntaxe() {
30 jpm 937
		$info = array('nom' => 'cultivar -> syntaxe',
20 jpm 938
			'description' => "Le champ cultivar_groupe doit contenir :\n".
163 delphine 939
				" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature \n".
940
				"   des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques \n".
941
				"   (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.\n".
942
				" - un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet \n".
943
				"   cyrillique, arabe, chinois...\n".
944
				" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour \n".
945
				"   les autres mots importants mais pas pour les mots mineurs.\n".
20 jpm 946
				"Ne doit pas contenir :\n".
947
				" - cv., convar. ou de guillemets simples (').\n",
948
			'resultat' => false);
949
 
950
		// Réalisation du test
951
		$noms_erreur = array();
64 jpm 952
		foreach ($this->noms as &$nom) {
20 jpm 953
			if ($nom['cultivar'] != '') {
954
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
955
					$epithete_traite = $this->repererEspace($nom['cultivar']);
956
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
957
				}
958
			}
959
		}
960
 
961
		// Analyse des résultats
962
		if (count($noms_erreur) > 0) {
963
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
964
			$info['message']['lignes'] = $noms_erreur;
965
		} else {
966
			$info['resultat'] = true;
967
		}
64 jpm 968
		$noms_erreur = null;
20 jpm 969
 
30 jpm 970
		$this->traiterResultatTest($info);
20 jpm 971
	}
972
 
64 jpm 973
	private function testerCultivarRang() {
30 jpm 974
		$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
20 jpm 975
			'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
976
			'resultat' => false);
977
 
978
		// Réalisation du test
979
		$noms_erreur = array();
64 jpm 980
		foreach ($this->noms as &$nom) {
20 jpm 981
			if ($nom['cultivar'] != '') {
982
				if ($nom['rang'] < $this->manuel['rang_genre']) {
149 jpm 983
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 984
				}
985
			}
986
		}
987
 
988
		// Analyse des résultats
989
		if (count($noms_erreur) > 0) {
149 jpm 990
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 991
			$info['message']['lignes'] = $noms_erreur;
992
		} else {
993
			$info['resultat'] = true;
994
		}
64 jpm 995
		$noms_erreur = null;
20 jpm 996
 
30 jpm 997
		$this->traiterResultatTest($info);
20 jpm 998
	}
999
 
64 jpm 1000
	private function testerGroupeCultivarSyntaxe() {
30 jpm 1001
		$info = array('nom' => 'cultivar_groupe -> syntaxe',
20 jpm 1002
			'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
163 delphine 1003
				"du code des plantes cultivées, c.-à-d. composer de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
20 jpm 1004
				"signes diacritiques et marques de ponctuations.\n".
1005
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
163 delphine 1006
				"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
20 jpm 1007
			'resultat' => false);
1008
 
1009
		// Réalisation du test
1010
		$noms_erreur = array();
64 jpm 1011
		foreach ($this->noms as &$nom) {
20 jpm 1012
			if ($nom['cultivar_groupe'] != '') {
1013
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
1014
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
1015
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1016
				}
1017
			}
1018
		}
1019
 
1020
		// Analyse des résultats
1021
		if (count($noms_erreur) > 0) {
1022
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
1023
			$info['message']['lignes'] = $noms_erreur;
1024
		} else {
1025
			$info['resultat'] = true;
1026
		}
64 jpm 1027
		$noms_erreur = null;
20 jpm 1028
 
30 jpm 1029
		$this->traiterResultatTest($info);
20 jpm 1030
	}
1031
 
64 jpm 1032
	private function testerGroupeCultivarRang() {
30 jpm 1033
		$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
20 jpm 1034
			'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
1035
			'resultat' => false);
1036
 
1037
		// Réalisation du test
1038
		$noms_erreur = array();
64 jpm 1039
		foreach ($this->noms as &$nom) {
20 jpm 1040
			if ($nom['cultivar_groupe'] != '') {
1041
				if ($nom['rang'] < $this->manuel['rang_genre']) {
149 jpm 1042
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1043
				}
1044
			}
1045
		}
1046
 
1047
		// Analyse des résultats
1048
		if (count($noms_erreur) > 0) {
149 jpm 1049
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1050
			$info['message']['lignes'] = $noms_erreur;
1051
		} else {
1052
			$info['resultat'] = true;
1053
		}
64 jpm 1054
		$noms_erreur = null;
20 jpm 1055
 
30 jpm 1056
		$this->traiterResultatTest($info);
20 jpm 1057
	}
1058
 
64 jpm 1059
	private function testerEpitheteInfraSpEspaces() {
30 jpm 1060
		$info = array('nom' => 'epithete_infra_sp -> espaces en trop',
163 delphine 1061
			'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou après le nom.\n".
1062
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
20 jpm 1063
			'resultat' => false);
1064
 
1065
		// Réalisation du test
1066
		$noms_erreur = array();
64 jpm 1067
		foreach ($this->noms as &$nom) {
20 jpm 1068
			if ($nom['epithete_infra_sp'] != '') {
1069
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
1070
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1071
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1072
				}
1073
			}
1074
		}
1075
 
1076
		// Analyse des résultats
1077
		if (count($noms_erreur) > 0) {
1078
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1079
			$info['message']['lignes'] = $noms_erreur;
1080
		} else {
1081
			$info['resultat'] = true;
1082
		}
64 jpm 1083
		$noms_erreur = null;
20 jpm 1084
 
30 jpm 1085
		$this->traiterResultatTest($info);
20 jpm 1086
	}
1087
 
64 jpm 1088
	private function testerEpitheteInfraSpSyntaxe() {
30 jpm 1089
		$info = array('nom' => 'epithete_infra_sp -> syntaxe',
20 jpm 1090
			'description' => "Le champ epithete_infra_sp peut contenir :\n".
163 delphine 1091
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
20 jpm 1092
				"	Il commence par une lettre minuscule (avec ou sans tréma).\n".
1093
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
163 delphine 1094
				" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce \n".
1095
				"	(au moins 2) séparés entre eux par la lettre x entourée de caractères espaces.",
20 jpm 1096
			'resultat' => false);
1097
 
1098
		// Réalisation du test
1099
		$noms_erreur = array();
64 jpm 1100
		foreach ($this->noms as &$nom) {
20 jpm 1101
			if ($nom['epithete_infra_sp'] != '') {
1102
				$mots = explode(' ', $nom['epithete_infra_sp']);
1103
				foreach ($mots as $mot) {
1104
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1105
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1106
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1107
					}
1108
				}
1109
			}
1110
		}
1111
 
1112
		// Analyse des résultats
1113
		if (count($noms_erreur) > 0) {
1114
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1115
			$info['message']['lignes'] = $noms_erreur;
1116
		} else {
1117
			$info['resultat'] = true;
1118
		}
64 jpm 1119
		$noms_erreur = null;
20 jpm 1120
 
30 jpm 1121
		$this->traiterResultatTest($info);
20 jpm 1122
	}
1123
 
64 jpm 1124
	private function testerEpitheteInfraSpRang() {
30 jpm 1125
		$info = array('nom' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
20 jpm 1126
			'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$this->manuel['rang_sp']}.",
1127
			'resultat' => false);
1128
 
1129
		// Réalisation du test
1130
		$noms_erreur = array();
64 jpm 1131
		foreach ($this->noms as &$nom) {
20 jpm 1132
			if ($nom['epithete_infra_sp'] != '') {
1133
				if ($nom['rang'] < $this->manuel['rang_sp']) {
149 jpm 1134
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1135
				}
1136
			}
1137
		}
1138
 
1139
		// Analyse des résultats
1140
		if (count($noms_erreur) > 0) {
149 jpm 1141
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1142
			$info['message']['lignes'] = $noms_erreur;
1143
		} else {
1144
			$info['resultat'] = true;
1145
		}
64 jpm 1146
		$noms_erreur = null;
20 jpm 1147
 
30 jpm 1148
		$this->traiterResultatTest($info);
20 jpm 1149
	}
1150
 
64 jpm 1151
	private function testerTypeEpitheteEspaces() {
30 jpm 1152
		$info = array('nom' => 'type_epithete -> espaces en trop',
20 jpm 1153
			'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
1154
			'resultat' => false);
1155
 
1156
		// Réalisation du test
1157
		$noms_erreur = array();
64 jpm 1158
		foreach ($this->noms as &$nom) {
20 jpm 1159
			if ($nom['type_epithete'] != '') {
1160
				if (preg_match('/\s+/', $nom['type_epithete'])) {
1161
					$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
1162
					$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
1163
				}
1164
			}
1165
		}
1166
 
1167
		// Analyse des résultats
1168
		if (count($noms_erreur) > 0) {
1169
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1170
			$info['message']['lignes'] = $noms_erreur;
1171
		} else {
1172
			$info['resultat'] = true;
1173
		}
1174
 
30 jpm 1175
		$this->traiterResultatTest($info);
20 jpm 1176
	}
1177
 
64 jpm 1178
	private function testerTypeEpitheteSyntaxe() {
30 jpm 1179
		$info = array('nom' => 'type_epithete -> syntaxe',
163 delphine 1180
			'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules, sans ".
1181
				" accents, et de tirets (-). Il commence par une lettre minuscule sans accent.",
20 jpm 1182
			'resultat' => false);
1183
 
1184
		// Réalisation du test
1185
		$noms_erreur = array();
64 jpm 1186
		foreach ($this->noms as &$nom) {
20 jpm 1187
			if ($nom['type_epithete'] != '') {
1188
				if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
1189
					$noms_erreur[] = array($nom['num_nom'],  $nom['type_epithete']);
1190
				}
1191
			}
1192
		}
1193
 
1194
		// Analyse des résultats
1195
		if (count($noms_erreur) > 0) {
1196
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1197
			$info['message']['lignes'] = $noms_erreur;
1198
		} else {
1199
			$info['resultat'] = true;
1200
		}
1201
 
30 jpm 1202
		$this->traiterResultatTest($info);
20 jpm 1203
	}
1204
 
64 jpm 1205
	private function testerTypeEpitheteHybridite() {
30 jpm 1206
		$info = array('nom' => 'type_epithete -> hybridité',
20 jpm 1207
			'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
1208
				" - «n-» \n".
1209
				" - «notho-» \n",
1210
			'resultat' => false);
1211
 
1212
		// Réalisation du test
1213
		$noms_erreur = array();
64 jpm 1214
		foreach ($this->noms as &$nom) {
20 jpm 1215
			if ($nom['type_epithete'] != '') {
1216
				if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
1217
					$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
1218
				}
1219
			}
1220
		}
1221
 
1222
		// Analyse des résultats
1223
		if (count($noms_erreur) > 0) {
1224
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1225
			$info['message']['lignes'] = $noms_erreur;
1226
		} else {
1227
			$info['resultat'] = true;
1228
		}
1229
 
30 jpm 1230
		$this->traiterResultatTest($info);
20 jpm 1231
	}
1232
 
1233
	private function testerNombreDeChamps($colonnes) {
30 jpm 1234
		$info = array('nom' => 'Structure -> nombre de champs',
20 jpm 1235
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
1236
			'resultat' => false);
1237
 
1238
		$nbre_colonnes = count($colonnes);
30 jpm 1239
		$info['message'] = $nbre_colonnes;
20 jpm 1240
		if ($nbre_colonnes >= 35) {
1241
			$info['resultat'] = true;
1242
		}
30 jpm 1243
		$this->traiterResultatTest($info);
64 jpm 1244
		return ($info['resultat'] ? '1' : '0');
20 jpm 1245
	}
1246
 
1247
	private function testerNomDesChamps($colonnes) {
30 jpm 1248
		$info = array('nom' => 'Structure -> noms des champs',
163 delphine 1249
			'description' => 'Les noms des champs de la table contenant le référentiel doivent être conformes à ceux '.
1250
								'définis par le manuel technique.',
20 jpm 1251
			'resultat' => false);
1252
 
1253
		$champs_attendus = explode(',', $this->manuel['champs']);
1254
		$champs_presents = array();
1255
		foreach ($colonnes as $colonne) {
1256
			$champs_presents[$colonne['Field']] = $colonne;
1257
		}
1258
 
1259
		$ok = true;
1260
		$champs_manquant = array();
1261
		foreach ($champs_attendus as $champ_attendu) {
1262
			if (!isset($champs_presents[$champ_attendu])) {
1263
				$champs_manquant[] = $champ_attendu;
1264
				$ok = false;
1265
			}
1266
		}
1267
		$info['resultat'] = $ok;
1268
		if (!$ok) {
1269
			$info['message'] = 'Champs manquant : '.implode(', ', $champs_manquant).'.';
1270
		}
1271
 
30 jpm 1272
		$this->traiterResultatTest($info);
64 jpm 1273
		return ($info['resultat'] ? '1' : '0');
20 jpm 1274
	}
1275
 
1276
	private function testerTypeDesChamps($colonnes) {
30 jpm 1277
		$info = array('nom' => 'Structure -> types des champs',
163 delphine 1278
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conformes à ceux '.
1279
								'définis par le manuel technique.',
20 jpm 1280
			'resultat' => false);
1281
 
1282
		$champs_attendus = explode(',', $this->manuel['champs_type']);
1283
		$champs_presents = array();
1284
		foreach ($colonnes as $colonne) {
1285
			$champs_presents[$colonne['Field']] = $colonne['Type'];
1286
		}
1287
 
1288
		// Recercherche des erreurs
1289
		$champs_erreur = array();
1290
		foreach ($champs_attendus as $champ_attendu) {
51 jpm 1291
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
1292
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
1293
 
20 jpm 1294
			if (isset($champs_presents[$champ_attendu_nom])) {
1295
				$champs_present_type = $champs_presents[$champ_attendu_nom];
1296
 
1297
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
1298
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
1299
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
1300
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
1301
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
1302
				}
1303
			}
1304
		}
1305
 
1306
		// Analyse des résultats
1307
		if (count($champs_erreur) > 0) {
1308
			$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
1309
		} else {
1310
			$info['resultat'] = true;
1311
		}
1312
 
30 jpm 1313
		$this->traiterResultatTest($info);
64 jpm 1314
		return ($info['resultat'] ? '1' : '0');
20 jpm 1315
	}
1316
 
1317
	private function testerTailleDesChamps($colonnes, $analyses) {
30 jpm 1318
		$info = array('nom' => 'Structure -> champs tronqués',
163 delphine 1319
			'description' => "Evalue le risque que des données de type texte aient pu être tronquées lors de leur insertion.\n".
45 jpm 1320
				"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
1321
				"sur un problème éventuel.",
20 jpm 1322
			'resultat' => false);
1323
 
1324
		$tailles_champs_maxi = array();
1325
		foreach ($colonnes as $colonne) {
1326
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
1327
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
1328
			}
1329
		}
1330
 
1331
		$tailles_trouvees = array();
1332
		foreach ($analyses as $analyse) {
1333
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
1334
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
1335
			}
1336
		}
1337
 
1338
		$champs_erreur = array();
1339
		$champs_attendus = explode(',', $this->manuel['champs']);
1340
		foreach ($champs_attendus as $champ_attendu) {
1341
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
1342
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
1343
					$champs_erreur[] = $champ_attendu;
1344
				}
1345
			}
1346
		}
1347
 
1348
		// Analyse des résultats
1349
		if (count($champs_erreur) > 0) {
1350
			$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
1351
		} else {
1352
			$info['resultat'] = true;
1353
		}
1354
 
30 jpm 1355
		$this->traiterResultatTest($info);
20 jpm 1356
	}
1357
 
1358
	private function testerNumNomClePrimaire($colonnes) {
30 jpm 1359
		$info = array('nom' => 'Structure -> num_nom est clé primaire',
20 jpm 1360
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
1361
			'resultat' => false);
1362
 
1363
		foreach ($colonnes as $colonne) {
1364
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
1365
				$info['resultat'] = true;
1366
			}
1367
		}
1368
 
30 jpm 1369
		$this->traiterResultatTest($info);
64 jpm 1370
		return ($info['resultat'] ? '1' : '0');
20 jpm 1371
	}
1372
 
64 jpm 1373
	private function testerNumNomSuperieurAZero() {
30 jpm 1374
		$info = array('nom' => 'num_nom -> supérieur à 0',
20 jpm 1375
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
1376
			'resultat' => false);
1377
 
1378
		// Réalisation du test
1379
		$noms_erreur = array();
64 jpm 1380
		foreach ($this->noms as &$nom) {
20 jpm 1381
			if ($nom['num_nom'] <= 0) {
1382
				$noms_erreur[] = $nom['num_nom'];
1383
			}
1384
		}
1385
 
1386
		// Analyse des résultats
1387
		if (count($noms_erreur) > 0) {
1388
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
1389
		} else {
1390
			$info['resultat'] = true;
1391
		}
1392
 
30 jpm 1393
		$this->traiterResultatTest($info);
20 jpm 1394
	}
1395
 
64 jpm 1396
	private function testerNumNomRetenuSuperieurAZero() {
30 jpm 1397
		$info = array('nom' => 'num_nom_retenu -> supérieur à 0',
42 jpm 1398
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
20 jpm 1399
			'resultat' => false);
1400
 
1401
		// Réalisation du test
1402
		$noms_erreur = array();
64 jpm 1403
		foreach ($this->noms as &$nom) {
42 jpm 1404
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
20 jpm 1405
				$noms_erreur[] = $nom['num_nom'];
1406
			}
1407
		}
1408
 
1409
		// Analyse des résultats
1410
		if (count($noms_erreur) > 0) {
1411
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
1412
		} else {
1413
			$info['resultat'] = true;
1414
		}
1415
 
30 jpm 1416
		$this->traiterResultatTest($info);
20 jpm 1417
	}
1418
 
64 jpm 1419
	private function testerNumTaxSupEgalZeroUnique() {
30 jpm 1420
		$info = array('nom' => 'num_tax_sup -> égal à 0 unique',
20 jpm 1421
			'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification.",
1422
			'resultat' => false);
1423
 
1424
		// Réalisation du test
1425
		$noms_erreur = array();
64 jpm 1426
		foreach ($this->noms as &$nom) {
20 jpm 1427
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
1428
				$noms_erreur[] = $nom['num_nom'];
1429
			}
1430
		}
1431
 
1432
		// Analyse des résultats
1433
		if (count($noms_erreur) > 1) {
1434
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
1435
		} else {
1436
			$info['resultat'] = true;
1437
		}
1438
 
30 jpm 1439
		$this->traiterResultatTest($info);
20 jpm 1440
	}
1441
 
64 jpm 1442
	private function testerTaxSupPourTaxon() {
30 jpm 1443
		$info = array('nom' => 'Classification -> uniquement pour les taxons',
163 delphine 1444
			'description' => "Seuls les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.\n".
43 jpm 1445
				"Si num_nom_retenu est différent de num_nom (= nom synonyme) alors num_tax_sup doit être vide.",
20 jpm 1446
			'resultat' => false);
1447
 
1448
		// Réalisation du test
1449
		$noms_erreur = array();
64 jpm 1450
		foreach ($this->noms as &$nom) {
43 jpm 1451
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
20 jpm 1452
				$noms_erreur[] = $nom['num_nom'];
1453
			}
1454
		}
1455
 
1456
		// Analyse des résultats
1457
		if (count($noms_erreur) > 0) {
1458
			$info['message'] = count($noms_erreur)." enregistrements qui n'est pas un taxon et qui possède une valeur dans num_tax_sup : ".implode(', ', $noms_erreur).'.';
1459
		} else {
1460
			$info['resultat'] = true;
1461
		}
1462
 
30 jpm 1463
		$this->traiterResultatTest($info);
20 jpm 1464
	}
1465
 
64 jpm 1466
	private function testerExitenceTaxonSuperieur() {
30 jpm 1467
		$info = array('nom' => 'Classification -> existence du taxon supérieur',
163 delphine 1468
			'description' => "Chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
20 jpm 1469
			'resultat' => false);
1470
 
1471
		// Réalisation du test
1472
		$noms_erreur = array();
64 jpm 1473
		foreach ($this->noms as &$nom) {
20 jpm 1474
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
64 jpm 1475
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
20 jpm 1476
					$noms_erreur[] = $nom['num_nom'];
1477
				}
1478
			}
1479
		}
1480
 
1481
		// Analyse des résultats
1482
		if (count($noms_erreur) > 0) {
1483
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
1484
		} else {
1485
			$info['resultat'] = true;
1486
		}
1487
 
30 jpm 1488
		$this->traiterResultatTest($info);
20 jpm 1489
	}
1490
 
64 jpm 1491
	private function testerClassificationRang() {
30 jpm 1492
		$info = array('nom' => 'Classification -> taxon supérieur avec rang inférieur',
163 delphine 1493
			'description' => "Pour chaque enregistrement représentant un taxon, le taxon supérieur doit avoir un rang inférieur au taxon courant.",
20 jpm 1494
			'resultat' => false);
1495
 
1496
		// Réalisation du test
1497
		$noms_erreur = array();
64 jpm 1498
		foreach ($this->noms as &$nom) {
20 jpm 1499
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
64 jpm 1500
				if (isset($this->noms[$nom['num_tax_sup']])) {
1501
					$nom_sup = $this->noms[$nom['num_tax_sup']];
20 jpm 1502
					if ($nom_sup['rang'] > $nom['rang']) {
1503
						$noms_erreur[] = $nom['num_nom'];
1504
					}
1505
				}
1506
			}
1507
		}
1508
 
1509
		// Analyse des résultats
1510
		if (count($noms_erreur) > 0) {
1511
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
1512
		} else {
1513
			$info['resultat'] = true;
1514
		}
1515
 
30 jpm 1516
		$this->traiterResultatTest($info);
20 jpm 1517
	}
1518
 
64 jpm 1519
	private function testerClassification() {
30 jpm 1520
		$info = array('nom' => 'Classification -> racine liée à chaque noeud',
163 delphine 1521
			'description' => "Pour chaque enregistrement, la classification doit pouvoir être remontée jusqu'à un nom unique possédant une valeur num_tax_sup de 0.",
20 jpm 1522
			'resultat' => false);
1523
 
1524
		// Réalisation du test
1525
		$noms_erreur = array();
161 jpm 1526
		$this->noms_ok = array();
64 jpm 1527
		foreach ($this->noms as &$nom) {
20 jpm 1528
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
161 jpm 1529
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1530
					$this->noms_ok[$nom['num_nom']] = true;
160 jpm 1531
				} else {
161 jpm 1532
					$this->detection_boucle_infini = array();
160 jpm 1533
					$classif_ok = $this->remonterClassif($nom);
161 jpm 1534
					unset($this->detection_boucle_infini);
1535
 
160 jpm 1536
					if ($classif_ok === false) {
1537
						$noms_erreur[] = $nom['num_nom'];
1538
					} else {
161 jpm 1539
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
160 jpm 1540
					}
161 jpm 1541
				}
20 jpm 1542
			}
1543
		}
161 jpm 1544
		unset($this->noms_ok);
20 jpm 1545
 
1546
		// Analyse des résultats
1547
		if (count($noms_erreur) > 0) {
1548
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
1549
		} else {
1550
			$info['resultat'] = true;
1551
		}
1552
 
30 jpm 1553
		$this->traiterResultatTest($info);
20 jpm 1554
	}
1555
 
161 jpm 1556
	private function remonterClassif(&$nom) {
1557
		$this->detection_boucle_infini[$nom['num_nom']] = true;
160 jpm 1558
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
161 jpm 1559
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1560
				$this->noms_ok[$nom['num_nom']] = true;
64 jpm 1561
				return true;
161 jpm 1562
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
1563
				$this->noms_ok[$nom['num_nom']] = true;
1564
				return true;
64 jpm 1565
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
1566
				return false;
161 jpm 1567
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
1568
				return false;
64 jpm 1569
			} else {
161 jpm 1570
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
1571
				if ($retour === true) {
1572
					$this->noms_ok[$nom['num_tax_sup']] = true;
1573
				}
1574
				return $retour;
64 jpm 1575
			}
1576
		} else {
20 jpm 1577
			return false;
1578
		}
1579
	}
1580
 
64 jpm 1581
	private function testerRang() {
30 jpm 1582
		$info = array('nom' => 'rang',
163 delphine 1583
			'description' => "Le rang doit correspondre à une valeur numérique définie dans le manuel.",
20 jpm 1584
			'resultat' => false);
1585
 
1586
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
1587
 
1588
		// Réalisation du test
1589
		$noms_erreur = array();
64 jpm 1590
		foreach ($this->noms as &$nom) {
20 jpm 1591
			if (!isset($rangs[$nom['rang']])) {
1592
				$noms_erreur[] = $nom['num_nom'];
1593
			}
1594
		}
1595
 
1596
		// Analyse des résultats
1597
		if (count($noms_erreur) > 0) {
1598
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
1599
		} else {
1600
			$info['resultat'] = true;
1601
		}
1602
 
30 jpm 1603
		$this->traiterResultatTest($info);
20 jpm 1604
	}
1605
 
64 jpm 1606
	private function testerNomCompletSupraGenerique() {
149 jpm 1607
		$info = array('nom' => 'nom_sci -> noms supra-génériques',
163 delphine 1608
			'description' => "Si le rang est < à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur du champ nom_supra_generique. ".
20 jpm 1609
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1610
			'resultat' => false);
1611
 
1612
		// Réalisation du test
1613
		$noms_erreur = array();
64 jpm 1614
		foreach ($this->noms as &$nom) {
20 jpm 1615
			if ($nom['rang'] < $this->manuel['rang_genre']) {
1616
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1617
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
1618
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1619
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1620
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1621
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1622
				}
1623
			}
1624
		}
1625
 
1626
		// Analyse des résultats
1627
		if (count($noms_erreur) > 0) {
149 jpm 1628
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1629
			$info['message']['lignes'] = $noms_erreur;
1630
		} else {
1631
			$info['resultat'] = true;
1632
		}
1633
 
30 jpm 1634
		$this->traiterResultatTest($info);
20 jpm 1635
	}
1636
 
64 jpm 1637
	private function testerNomCompletGenre() {
149 jpm 1638
		$info = array('nom' => 'nom_sci -> noms de genres',
163 delphine 1639
			'description' => "Si le rang est = à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur du champ genre. ".
20 jpm 1640
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1641
			'resultat' => false);
1642
 
1643
		// Réalisation du test
1644
		$noms_erreur = array();
64 jpm 1645
		foreach ($this->noms as &$nom) {
20 jpm 1646
			if ($nom['rang'] == $this->manuel['rang_genre']) {
1647
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1648
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1649
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1650
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1651
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1652
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1653
				}
1654
			}
1655
		}
1656
 
1657
		// Analyse des résultats
1658
		if (count($noms_erreur) > 0) {
149 jpm 1659
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1660
			$info['message']['lignes'] = $noms_erreur;
1661
		} else {
1662
			$info['resultat'] = true;
1663
		}
1664
 
30 jpm 1665
		$this->traiterResultatTest($info);
20 jpm 1666
	}
1667
 
64 jpm 1668
	private function testerNomCompletInfraGenre() {
149 jpm 1669
		$info = array('nom' => 'nom_sci -> noms infra-génériques',
163 delphine 1670
			'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']},".
1671
			" le nom_sci doit correspondre à une des formules suivantes : \n".
20 jpm 1672
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
1673
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
1674
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1675
			'resultat' => false);
1676
 
1677
		// Réalisation du test
1678
		$noms_erreur = array();
64 jpm 1679
		foreach ($this->noms as &$nom) {
20 jpm 1680
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
1681
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1682
				$nom_sci_ideal = '';
20 jpm 1683
				if ($nom['type_epithete'] == 'agg.') {
149 jpm 1684
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1685
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1686
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
20 jpm 1687
				} else {
149 jpm 1688
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1689
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
1690
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
20 jpm 1691
				}
149 jpm 1692
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1693
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1694
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1695
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1696
				}
1697
			}
1698
		}
1699
 
1700
		// Analyse des résultats
1701
		if (count($noms_erreur) > 0) {
149 jpm 1702
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1703
			$info['message']['lignes'] = $noms_erreur;
1704
		} else {
1705
			$info['resultat'] = true;
1706
		}
64 jpm 1707
		$noms_erreur = null;
20 jpm 1708
 
30 jpm 1709
		$this->traiterResultatTest($info);
20 jpm 1710
	}
1711
 
64 jpm 1712
	private function testerNomCompletEspece() {
149 jpm 1713
		$info = array('nom' => "nom_sci -> noms d'espèce",
163 delphine 1714
			'description' => "Si le rang est = à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
20 jpm 1715
				" genre + ' ' + epithete_sp \n".
1716
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1717
			'resultat' => false);
1718
 
1719
		// Réalisation du test
1720
		$noms_erreur = array();
64 jpm 1721
		foreach ($this->noms as &$nom) {
20 jpm 1722
			if ($nom['rang'] == $this->manuel['rang_sp']) {
1723
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1724
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1725
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1726
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1727
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1728
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1729
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1730
				}
1731
			}
1732
		}
1733
 
1734
		// Analyse des résultats
1735
		if (count($noms_erreur) > 0) {
149 jpm 1736
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1737
			$info['message']['lignes'] = $noms_erreur;
1738
		} else {
1739
			$info['resultat'] = true;
1740
		}
64 jpm 1741
		$noms_erreur = null;
20 jpm 1742
 
30 jpm 1743
		$this->traiterResultatTest($info);
20 jpm 1744
	}
1745
 
64 jpm 1746
	private function testerNomCompletInfraSpecifique() {
149 jpm 1747
		$info = array('nom' => 'nom_sci -> noms infra-spécifiques',
163 delphine 1748
			'description' => "Si le rang est > à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
20 jpm 1749
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".
1750
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1751
			'resultat' => false);
1752
 
1753
		// Réalisation du test
1754
		$noms_erreur = array();
64 jpm 1755
		foreach ($this->noms as &$nom) {
20 jpm 1756
			if ($nom['rang'] > $this->manuel['rang_sp']) {
1757
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1758
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1759
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1760
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
1761
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
1762
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1763
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1764
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1765
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1766
				}
1767
			}
1768
		}
1769
 
1770
		// Analyse des résultats
1771
		if (count($noms_erreur) > 0) {
149 jpm 1772
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1773
			$info['message']['lignes'] = $noms_erreur;
1774
		} else {
1775
			$info['resultat'] = true;
1776
		}
64 jpm 1777
		$noms_erreur = null;
20 jpm 1778
 
30 jpm 1779
		$this->traiterResultatTest($info);
20 jpm 1780
	}
1781
 
64 jpm 1782
	private function testerNomSupraGeneriqueEspaces() {
30 jpm 1783
		$info = array('nom' => 'nom_supra_generique -> espaces en trop',
163 delphine 1784
			'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou après le nom.",
20 jpm 1785
			'resultat' => false);
1786
 
1787
		// Réalisation du test
1788
		$noms_erreur = array();
64 jpm 1789
		foreach ($this->noms as &$nom) {
20 jpm 1790
			if ($nom['nom_supra_generique'] != '') {
1791
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
1792
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1793
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1794
				}
1795
			}
1796
		}
1797
 
1798
		// Analyse des résultats
1799
		if (count($noms_erreur) > 0) {
1800
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1801
			$info['message']['lignes'] = $noms_erreur;
1802
		} else {
1803
			$info['resultat'] = true;
1804
		}
64 jpm 1805
		$noms_erreur = null;
20 jpm 1806
 
30 jpm 1807
		$this->traiterResultatTest($info);
20 jpm 1808
	}
1809
 
64 jpm 1810
	private function testerNomSupraGeneriqueSyntaxe() {
30 jpm 1811
		$info = array('nom' => 'nom_supra_generique -> syntaxe',
163 delphine 1812
			'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules, avec ou ".
1813
				"sans tréma (¨), et de tirets (-). \n".
20 jpm 1814
				"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
1815
			'resultat' => false);
1816
 
1817
		// Réalisation du test
1818
		$noms_erreur = array();
64 jpm 1819
		foreach ($this->noms as &$nom) {
20 jpm 1820
			if ($nom['nom_supra_generique'] != '') {
1821
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
1822
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1823
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1824
				}
1825
			}
1826
		}
1827
 
1828
		// Analyse des résultats
1829
		if (count($noms_erreur) > 0) {
1830
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1831
			$info['message']['lignes'] = $noms_erreur;
1832
		} else {
1833
			$info['resultat'] = true;
1834
		}
64 jpm 1835
		$noms_erreur = null;
20 jpm 1836
 
30 jpm 1837
		$this->traiterResultatTest($info);
20 jpm 1838
	}
1839
 
64 jpm 1840
	private function testerNomSupraGeneriqueRang() {
30 jpm 1841
		$info = array('nom' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
20 jpm 1842
			'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$this->manuel['rang_genre']}.",
1843
			'resultat' => false);
1844
 
1845
		// Réalisation du test
1846
		$noms_erreur = array();
64 jpm 1847
		foreach ($this->noms as &$nom) {
20 jpm 1848
			if ($nom['nom_supra_generique'] != '') {
1849
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
149 jpm 1850
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1851
				}
1852
			}
1853
		}
1854
 
1855
		// Analyse des résultats
1856
		if (count($noms_erreur) > 0) {
149 jpm 1857
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1858
			$info['message']['lignes'] = $noms_erreur;
1859
		} else {
1860
			$info['resultat'] = true;
1861
		}
64 jpm 1862
		$noms_erreur = null;
20 jpm 1863
 
30 jpm 1864
		$this->traiterResultatTest($info);
20 jpm 1865
	}
1866
 
64 jpm 1867
	private function testerGenreEspaces() {
30 jpm 1868
		$info = array('nom' => 'genre -> espaces en trop',
163 delphine 1869
			'description' => "Le champ genre ne doit pas contenir d'espace avant ou après le nom.\n".
1870
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
20 jpm 1871
			'resultat' => false);
1872
 
1873
		// Réalisation du test
1874
		$noms_erreur = array();
64 jpm 1875
		foreach ($this->noms as &$nom) {
20 jpm 1876
			if ($nom['genre'] != '') {
1877
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
1878
					$nom_traite = $this->repererEspace($nom['genre']);
1879
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1880
				}
1881
			}
1882
		}
1883
 
1884
		// Analyse des résultats
1885
		if (count($noms_erreur) > 0) {
1886
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1887
			$info['message']['lignes'] = $noms_erreur;
1888
		} else {
1889
			$info['resultat'] = true;
1890
		}
64 jpm 1891
		$noms_erreur = null;
20 jpm 1892
 
30 jpm 1893
		$this->traiterResultatTest($info);
20 jpm 1894
	}
1895
 
64 jpm 1896
	private function testerGenreSyntaxe() {
30 jpm 1897
		$info = array('nom' => 'genre -> syntaxe',
20 jpm 1898
			'description' => "Le champ genre peut contenir :\n".
163 delphine 1899
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
1900
				"	Il commence par une lettre majuscule (avec ou sans tréma) et peut être précédé par \n".
1901
				"   le signe + ou la lettre x suivi d'un espace.\n".
1902
				" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés\n ".
1903
				"	entre eux par la lettre x entourée de caractères espaces.",
20 jpm 1904
			'resultat' => false);
1905
 
1906
		// Réalisation du test
1907
		$noms_erreur = array();
64 jpm 1908
		foreach ($this->noms as &$nom) {
20 jpm 1909
			if ($nom['genre'] != '') {
1910
				$mots = explode(' ', $nom['genre']);
1911
				foreach ($mots as $mot) {
1912
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
1913
						$nom_traite = $this->repererEspace($nom['genre']);
1914
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1915
					}
1916
				}
1917
			}
1918
		}
1919
 
1920
		// Analyse des résultats
1921
		if (count($noms_erreur) > 0) {
1922
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1923
			$info['message']['lignes'] = $noms_erreur;
1924
		} else {
1925
			$info['resultat'] = true;
1926
		}
64 jpm 1927
		$noms_erreur = null;
20 jpm 1928
 
30 jpm 1929
		$this->traiterResultatTest($info);
20 jpm 1930
	}
1931
 
64 jpm 1932
	private function testerGenreRang() {
30 jpm 1933
		$info = array('nom' => "genre -> rang >= {$this->manuel['rang_genre']}",
20 jpm 1934
			'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
1935
			'resultat' => false);
1936
 
1937
		// Réalisation du test
1938
		$noms_erreur = array();
64 jpm 1939
		foreach ($this->noms as &$nom) {
20 jpm 1940
			if ($nom['genre'] != '') {
1941
				if ($nom['rang'] < $this->manuel['rang_genre']) {
149 jpm 1942
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1943
				}
1944
			}
1945
		}
1946
 
1947
		// Analyse des résultats
1948
		if (count($noms_erreur) > 0) {
149 jpm 1949
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1950
			$info['message']['lignes'] = $noms_erreur;
1951
		} else {
1952
			$info['resultat'] = true;
1953
		}
64 jpm 1954
		$noms_erreur = null;
20 jpm 1955
 
30 jpm 1956
		$this->traiterResultatTest($info);
20 jpm 1957
	}
1958
 
64 jpm 1959
	private function testerEpitheteInfraGeneriqueSyntaxe() {
30 jpm 1960
		$info = array('nom' => 'epithete_infra_generique -> syntaxe',
163 delphine 1961
			'description' => "Le champ epithete_infra_generique est composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
20 jpm 1962
				"La première lettre (avec ou sans tréma) doit être en majuscule.",
1963
			'resultat' => false);
1964
 
1965
		// Réalisation du test
1966
		$noms_erreur = array();
64 jpm 1967
		foreach ($this->noms as &$nom) {
20 jpm 1968
			if ($nom['epithete_infra_generique'] != '') {
1969
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1970
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1971
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1972
				}
1973
			}
1974
		}
1975
 
1976
		// Analyse des résultats
1977
		if (count($noms_erreur) > 0) {
1978
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1979
			$info['message']['lignes'] = $noms_erreur;
1980
		} else {
1981
			$info['resultat'] = true;
1982
		}
64 jpm 1983
		$noms_erreur = null;
20 jpm 1984
 
30 jpm 1985
		$this->traiterResultatTest($info);
20 jpm 1986
	}
1987
 
64 jpm 1988
	private function testerEpitheteInfraGeneriqueRang() {
30 jpm 1989
		$info = array('nom' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
163 delphine 1990
			'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris ".
20 jpm 1991
				"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
1992
			'resultat' => false);
1993
 
1994
		// Réalisation du test
1995
		$noms_erreur = array();
64 jpm 1996
		foreach ($this->noms as &$nom) {
20 jpm 1997
			if ($nom['epithete_infra_generique'] != '') {
1998
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
149 jpm 1999
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 2000
				}
2001
			}
2002
		}
2003
 
2004
		// Analyse des résultats
2005
		if (count($noms_erreur) > 0) {
149 jpm 2006
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 2007
			$info['message']['lignes'] = $noms_erreur;
2008
		} else {
2009
			$info['resultat'] = true;
2010
		}
64 jpm 2011
		$noms_erreur = null;
20 jpm 2012
 
30 jpm 2013
		$this->traiterResultatTest($info);
20 jpm 2014
	}
2015
 
64 jpm 2016
	private function testerEpitheteInfraGeneriqueEspaces() {
30 jpm 2017
		$info = array('nom' => 'epithete_infra_generique -> espaces en trop',
163 delphine 2018
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou après sa valeur.",
20 jpm 2019
			'resultat' => false);
2020
 
2021
		// Réalisation du test
2022
		$noms_erreur = array();
64 jpm 2023
		foreach ($this->noms as &$nom) {
20 jpm 2024
			if ($nom['epithete_infra_generique'] != '') {
2025
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
2026
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
2027
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2028
				}
2029
			}
2030
		}
2031
 
2032
		// Analyse des résultats
2033
		if (count($noms_erreur) > 0) {
2034
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
2035
			$info['message']['lignes'] = $noms_erreur;
2036
		} else {
2037
			$info['resultat'] = true;
2038
		}
64 jpm 2039
		$noms_erreur = null;
20 jpm 2040
 
30 jpm 2041
		$this->traiterResultatTest($info);
20 jpm 2042
	}
2043
 
64 jpm 2044
	private function testerEpitheteSpEspaces() {
30 jpm 2045
		$info = array('nom' => 'epithete_sp -> espaces en trop',
163 delphine 2046
			'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou après le nom.\n".
2047
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
20 jpm 2048
			'resultat' => false);
2049
 
2050
		// Réalisation du test
2051
		$noms_erreur = array();
64 jpm 2052
		foreach ($this->noms as &$nom) {
20 jpm 2053
			if ($nom['epithete_sp'] != '') {
2054
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
2055
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2056
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2057
				}
2058
			}
2059
		}
2060
 
2061
		// Analyse des résultats
2062
		if (count($noms_erreur) > 0) {
2063
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2064
			$info['message']['lignes'] = $noms_erreur;
2065
		} else {
2066
			$info['resultat'] = true;
2067
		}
64 jpm 2068
		$noms_erreur = null;
20 jpm 2069
 
30 jpm 2070
		$this->traiterResultatTest($info);
20 jpm 2071
	}
2072
 
64 jpm 2073
	private function testerEpitheteSpSyntaxe() {
30 jpm 2074
		$info = array('nom' => 'epithete_sp -> syntaxe',
20 jpm 2075
			'description' => "Le champ epithete_sp peut contenir :\n".
2076
			 	" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
2077
				"	Il commence par une lettre minuscule [a-zëï].\n".
2078
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
163 delphine 2079
				" - un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9) \n".
2080
				"   ou d'un seul caractère majuscule (A-Z) \n".
2081
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) \n".
2082
				"	séparés entre eux par la lettre x entourée de caractères espaces.",
20 jpm 2083
			'resultat' => false);
2084
 
2085
		// Réalisation du test
2086
		$noms_erreur = array();
64 jpm 2087
		foreach ($this->noms as &$nom) {
20 jpm 2088
			if ($nom['epithete_sp'] != '') {
2089
				$mots = explode(' ', $nom['epithete_sp']);
2090
				foreach ($mots as $mot) {
2091
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
2092
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2093
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2094
					}
2095
				}
2096
			}
2097
		}
2098
 
2099
		// Analyse des résultats
2100
		if (count($noms_erreur) > 0) {
2101
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2102
			$info['message']['lignes'] = $noms_erreur;
2103
		} else {
2104
			$info['resultat'] = true;
2105
		}
64 jpm 2106
		$noms_erreur = null;
20 jpm 2107
 
30 jpm 2108
		$this->traiterResultatTest($info);
20 jpm 2109
	}
2110
 
64 jpm 2111
	private function testerEpitheteSpRang() {
30 jpm 2112
		$info = array('nom' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
20 jpm 2113
			'description' => "Si le champ epithete_sp n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_sp']}.",
2114
			'resultat' => false);
2115
 
2116
		// Réalisation du test
2117
		$noms_erreur = array();
64 jpm 2118
		foreach ($this->noms as &$nom) {
20 jpm 2119
			if ($nom['epithete_sp'] != '') {
2120
				if ($nom['rang'] < $this->manuel['rang_sp']) {
149 jpm 2121
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 2122
				}
2123
			}
2124
		}
2125
 
2126
		// Analyse des résultats
2127
		if (count($noms_erreur) > 0) {
149 jpm 2128
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 2129
			$info['message']['lignes'] = $noms_erreur;
2130
		} else {
2131
			$info['resultat'] = true;
2132
		}
64 jpm 2133
		$noms_erreur = null;
20 jpm 2134
 
30 jpm 2135
		$this->traiterResultatTest($info);
20 jpm 2136
	}
2137
 
146 delphine 2138
 
2139
	private function testerExclureTaxRefSyntaxe() {
2140
		$info = array('nom' => 'exclure_taxref -> syntaxe',
2141
			'description' => "Le champ exclure_taxref contient soit :\n".
2142
			" - une valeur vide.\n".
2143
			" - une valeur null.\n".
2144
			" - le chiffre 0.\n".
2145
			" - le chiffre 1",
2146
			'resultat' => false);
2147
 
2148
		// Réalisation du test
2149
		$noms_erreur = array();
2150
		foreach ($this->noms as &$nom) {
2151
			if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
2152
				if (!$this->verifierBooleen($nom['exclure_taxref'])) {
2153
					$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
2154
				}
2155
			}
2156
		}
2157
 
2158
		// Analyse des résultats
2159
		if (count($noms_erreur) > 0) {
2160
			$info['message']['entete'] = array('num_nom', 'exclure_taxref erroné');
2161
			$info['message']['lignes'] = $noms_erreur;
2162
		} else {
2163
			$info['resultat'] = true;
2164
		}
2165
		$noms_erreur = null;
2166
 
2167
		$this->traiterResultatTest($info);
2168
	}
20 jpm 2169
	//+--------------------------------------------------------------------------------------------------------------+//
2170
	// MÉTHODES COMMUNES aux TESTS
2171
 
64 jpm 2172
	private function verifierPresence(&$valeur) {
20 jpm 2173
		$codes = $this->manuel['codes_presence'];
2174
		$ok = $this->verifierStatuts($valeur, $codes);
2175
		return $ok;
2176
	}
2177
 
64 jpm 2178
	private function verifierStatutOrigine(&$valeur) {
20 jpm 2179
		$codes = $this->manuel['codes_statuts_origine'];
2180
		$ok = $this->verifierStatuts($valeur, $codes);
2181
		return $ok;
2182
	}
2183
 
64 jpm 2184
	private function verifierStatutIntroduction(&$valeur) {
20 jpm 2185
		$codes = $this->manuel['codes_statuts_introduction'];
2186
		$ok = $this->verifierStatuts($valeur, $codes);
2187
		return $ok;
2188
	}
2189
 
64 jpm 2190
	private function verifierStatutCulture(&$valeur) {
20 jpm 2191
		$codes = $this->manuel['codes_statuts_culture'];
2192
		$ok = $this->verifierStatuts($valeur, $codes);
2193
		return $ok;
2194
	}
2195
 
64 jpm 2196
	private function verifierStatuts(&$valeur, &$codes) {
20 jpm 2197
		$ok = true;
2198
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
2199
			$ok = false;
2200
		}
2201
		return $ok;
2202
	}
2203
 
64 jpm 2204
	private function verifierBooleen(&$valeur) {
20 jpm 2205
		$ok = true;
2206
		if (!preg_match('/^1$/', $valeur)) {
2207
			$ok = false;
2208
		}
2209
		return $ok;
2210
	}
2211
 
64 jpm 2212
	private function verifierNombre(&$valeur) {
20 jpm 2213
		$ok = true;
2214
		if (!preg_match('/^[0-9]+$/', $valeur)) {
2215
			$ok = false;
2216
		}
2217
		return $ok;
2218
	}
2219
 
64 jpm 2220
	private function verifierNombreSuite(&$valeur) {
20 jpm 2221
		$ok = true;
2222
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
2223
			$ok = false;
2224
		}
2225
		return $ok;
2226
	}
2227
 
64 jpm 2228
	private function verifierTypeEpithete(&$type) {
20 jpm 2229
		$ok = false;
2230
		$rejetes = $this->manuel['type_epithete_rejetes'];
2231
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
2232
			$ok = false;
2233
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
2234
			$ok = true;
2235
		}
2236
		return $ok;
2237
	}
2238
 
64 jpm 2239
	private function verifierBiblioOrigine(&$intitule) {
20 jpm 2240
		$ok = true;
2241
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2242
			$ok = false;// Contient des espaces en trop
2243
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
2244
			$ok = false;
2245
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
2246
			$ok = false;// Contient une mauvaise suite de caractères
2247
		}
2248
		return $ok;
2249
	}
2250
 
64 jpm 2251
	private function verifierAnnee(&$annee) {
20 jpm 2252
		$ok = true;
2253
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
2254
			$ok = false;
2255
		} else if ($annee < 1753) {
2256
			$ok = false;
2257
		}
2258
		return $ok;
2259
	}
2260
 
64 jpm 2261
	private function verifierAuteur(&$intitule) {
20 jpm 2262
		$ok = true;
2263
		$acceptes = $this->manuel['auteur_acceptes'];
2264
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
2265
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2266
				$ok = false;// Contient des espaces en trop
2267
			} else {
2268
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
2269
				$mots = explode(' ', $intitule);
2270
				foreach ($mots as $position => $mot) {
2271
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2272
						$ok = false;// Mot rejeté
2273
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
2274
						continue;// Mot de l'intitulé auteur
2275
					} else {
2276
						$ok = false;
2277
					}
2278
				}
2279
			}
2280
		}
2281
		return $ok;
2282
	}
2283
 
64 jpm 2284
	private function verifierNomCommercial(&$epithete) {
20 jpm 2285
		$ok = false;
2286
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
2287
			$ok = true;
2288
		}
2289
		return $ok;
2290
	}
2291
 
64 jpm 2292
	private function verifierEpitheteCultivar(&$epithete) {
20 jpm 2293
		$ok = true;
2294
		$acceptes = $this->manuel['cultivar_acceptes'];
2295
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2296
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2297
				$ok = false;// Contient des espaces en trop
2298
			} else {
2299
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
2300
				$mots_mineurs = $this->manuel['mots_mineurs'];
2301
				$mots = explode(' ', $epithete);
2302
				foreach ($mots as $position => $mot) {
2303
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2304
						$ok = false;// Mot rejeté
2305
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2306
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2307
					} else {
2308
						$mots_tiret = explode('-', $mot);
2309
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2310
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2311
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
2312
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2313
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
2314
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2315
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2316
							} else {
2317
								$ok = false;
2318
							}
2319
						}
2320
					}
2321
				}
2322
			}
2323
		}
2324
		return $ok;
2325
	}
2326
 
64 jpm 2327
	private function verifierEpitheteGroupeCultivar(&$epithete) {
20 jpm 2328
		$ok = true;
2329
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
2330
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2331
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2332
				$ok = false;// Contient des espaces en trop
2333
			} else {
2334
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
2335
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
2336
				$mots_mineurs = $this->manuel['mots_mineurs'];
2337
				$mots = explode(' ', $epithete);
2338
				foreach ($mots as $position => $mot) {
2339
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
2340
						continue;// Mot accepté
2341
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2342
						$ok = false;// Mot rejeté
2343
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2344
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2345
					} else {
2346
						$mots_tiret = explode('-', $mot);
2347
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2348
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2349
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
2350
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2351
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
2352
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2353
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2354
							} else {
2355
								$ok = false;
2356
							}
2357
						}
2358
					}
2359
				}
2360
			}
2361
		}
2362
		return $ok;
2363
	}
2364
 
64 jpm 2365
	private function verifierEpitheteSp(&$epithete) {
20 jpm 2366
		$ok = false;
2367
		if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
2368
			$ok = true;
2369
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
2370
			$ok = true;
2371
		}
2372
		return $ok;
2373
	}
2374
 
64 jpm 2375
	private function verifierEpitheteGenre(&$epithete) {
20 jpm 2376
		$ok = false;
2377
		if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
2378
			$ok = true;
2379
		}
2380
		return $ok;
2381
	}
2382
 
64 jpm 2383
	private function formaterStyleNomGenre(&$genre) {
20 jpm 2384
		$genre_fmt = '';
2385
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
2386
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
2387
		} else {
2388
			$genre_fmt = ucfirst(strtolower($genre));
2389
		}
2390
		return $genre_fmt;
2391
	}
2392
 
149 jpm 2393
	private function repererEspace($nom_sci) {
2394
		$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
2395
		return $nom_sci;
20 jpm 2396
	}
2397
 
64 jpm 2398
	private function construireSuffixeNomPltCultivee(&$nom) {
20 jpm 2399
		$suffixe = array();
2400
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
2401
		$suffixe[] = $this->construireNomCommercial($nom);
2402
		$suffixe[] = $this->construireNomCultivar($nom);
2403
		$suffixe = array_filter($suffixe);
2404
		return implode(' ', $suffixe);
2405
	}
2406
 
64 jpm 2407
	private function construireNomCultivarGroupe(&$nom) {
20 jpm 2408
		$nom_groupe_cultivar = '';
2409
		if ($nom['cultivar_groupe'] != '') {
2410
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
2411
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
2412
			} else {
2413
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
2414
			}
2415
		}
2416
		return $nom_groupe_cultivar;
2417
	}
2418
 
64 jpm 2419
	private function construireNomCommercial(&$nom) {
20 jpm 2420
		$nom_commercial = '';
2421
		if ($nom['nom_commercial'] != '') {
2422
			$nom_commercial =  strtoupper($nom['nom_commercial']);
2423
		}
2424
		return $nom_commercial;
2425
	}
2426
 
64 jpm 2427
	private function construireNomCultivar(&$nom) {
20 jpm 2428
		$nom_cultivar = '';
2429
		if ($nom['cultivar'] != '') {
2430
			$nom_cultivar =  "'".$nom['cultivar']."'";
2431
		}
2432
		return $nom_cultivar;
2433
	}
2434
 
64 jpm 2435
	private function classerNomsParNomComplet() {
20 jpm 2436
		$noms_classes = array();
64 jpm 2437
		foreach ($this->noms as &$nom) {
149 jpm 2438
			if (!isset($noms_classes[$nom['nom_sci']])) {
2439
				$noms_classes[$nom['nom_sci']] = 1;
20 jpm 2440
			} else {
149 jpm 2441
				$noms_classes[$nom['nom_sci']]++;
20 jpm 2442
			}
2443
		}
2444
		return $noms_classes;
2445
	}
2446
 
2447
}
2448
?>