Subversion Repositories Applications.referentiel

Rev

Rev 163 | Rev 165 | 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".
164 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 ".
215
								"un code de présence spécifique au référentiel.",
20 jpm 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".
164 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 ".
246
								"un code de présence spécifique au référentiel.",
20 jpm 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".
164 delphine 274
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
275
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
276
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
277
								"un code de présence spécifique au référentiel.",
20 jpm 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".
164 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 ".
308
								"un code de présence spécifique au référentiel.",
20 jpm 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',
164 delphine 335
			'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur ".
336
								"du champ num_nom.",
20 jpm 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".
164 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',
164 delphine 393
			'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur ".
394
								"du champ num_nom.",
20 jpm 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".
164 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 ".
164 delphine 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".
164 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 ".
164 delphine 592
								"doit correspondre à une valeur du champ num_nom.",
20 jpm 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 ".
164 delphine 657
								"num_nom.",
20 jpm 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 ".
164 delphine 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']}",
164 delphine 975
			'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à ".
976
								"{$this->manuel['rang_genre']}.",
20 jpm 977
			'resultat' => false);
978
 
979
		// Réalisation du test
980
		$noms_erreur = array();
64 jpm 981
		foreach ($this->noms as &$nom) {
20 jpm 982
			if ($nom['cultivar'] != '') {
983
				if ($nom['rang'] < $this->manuel['rang_genre']) {
149 jpm 984
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 985
				}
986
			}
987
		}
988
 
989
		// Analyse des résultats
990
		if (count($noms_erreur) > 0) {
149 jpm 991
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 992
			$info['message']['lignes'] = $noms_erreur;
993
		} else {
994
			$info['resultat'] = true;
995
		}
64 jpm 996
		$noms_erreur = null;
20 jpm 997
 
30 jpm 998
		$this->traiterResultatTest($info);
20 jpm 999
	}
1000
 
64 jpm 1001
	private function testerGroupeCultivarSyntaxe() {
30 jpm 1002
		$info = array('nom' => 'cultivar_groupe -> syntaxe',
20 jpm 1003
			'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
163 delphine 1004
				"du code des plantes cultivées, c.-à-d. composer de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
20 jpm 1005
				"signes diacritiques et marques de ponctuations.\n".
1006
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
163 delphine 1007
				"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
20 jpm 1008
			'resultat' => false);
1009
 
1010
		// Réalisation du test
1011
		$noms_erreur = array();
64 jpm 1012
		foreach ($this->noms as &$nom) {
20 jpm 1013
			if ($nom['cultivar_groupe'] != '') {
1014
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
1015
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
1016
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1017
				}
1018
			}
1019
		}
1020
 
1021
		// Analyse des résultats
1022
		if (count($noms_erreur) > 0) {
1023
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
1024
			$info['message']['lignes'] = $noms_erreur;
1025
		} else {
1026
			$info['resultat'] = true;
1027
		}
64 jpm 1028
		$noms_erreur = null;
20 jpm 1029
 
30 jpm 1030
		$this->traiterResultatTest($info);
20 jpm 1031
	}
1032
 
64 jpm 1033
	private function testerGroupeCultivarRang() {
30 jpm 1034
		$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
164 delphine 1035
			'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou ".
1036
								"égal à {$this->manuel['rang_genre']}.",
20 jpm 1037
			'resultat' => false);
1038
 
1039
		// Réalisation du test
1040
		$noms_erreur = array();
64 jpm 1041
		foreach ($this->noms as &$nom) {
20 jpm 1042
			if ($nom['cultivar_groupe'] != '') {
1043
				if ($nom['rang'] < $this->manuel['rang_genre']) {
149 jpm 1044
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1045
				}
1046
			}
1047
		}
1048
 
1049
		// Analyse des résultats
1050
		if (count($noms_erreur) > 0) {
149 jpm 1051
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1052
			$info['message']['lignes'] = $noms_erreur;
1053
		} else {
1054
			$info['resultat'] = true;
1055
		}
64 jpm 1056
		$noms_erreur = null;
20 jpm 1057
 
30 jpm 1058
		$this->traiterResultatTest($info);
20 jpm 1059
	}
1060
 
64 jpm 1061
	private function testerEpitheteInfraSpEspaces() {
30 jpm 1062
		$info = array('nom' => 'epithete_infra_sp -> espaces en trop',
163 delphine 1063
			'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou après le nom.\n".
1064
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
20 jpm 1065
			'resultat' => false);
1066
 
1067
		// Réalisation du test
1068
		$noms_erreur = array();
64 jpm 1069
		foreach ($this->noms as &$nom) {
20 jpm 1070
			if ($nom['epithete_infra_sp'] != '') {
1071
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
1072
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1073
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1074
				}
1075
			}
1076
		}
1077
 
1078
		// Analyse des résultats
1079
		if (count($noms_erreur) > 0) {
1080
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1081
			$info['message']['lignes'] = $noms_erreur;
1082
		} else {
1083
			$info['resultat'] = true;
1084
		}
64 jpm 1085
		$noms_erreur = null;
20 jpm 1086
 
30 jpm 1087
		$this->traiterResultatTest($info);
20 jpm 1088
	}
1089
 
64 jpm 1090
	private function testerEpitheteInfraSpSyntaxe() {
30 jpm 1091
		$info = array('nom' => 'epithete_infra_sp -> syntaxe',
20 jpm 1092
			'description' => "Le champ epithete_infra_sp peut contenir :\n".
163 delphine 1093
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
164 delphine 1094
				"   Il commence par une lettre minuscule (avec ou sans tréma).\n".
1095
				"   Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
163 delphine 1096
				" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce \n".
164 delphine 1097
				"   (au moins 2) séparés entre eux par la lettre x entourée de caractères espaces.",
20 jpm 1098
			'resultat' => false);
1099
 
1100
		// Réalisation du test
1101
		$noms_erreur = array();
64 jpm 1102
		foreach ($this->noms as &$nom) {
20 jpm 1103
			if ($nom['epithete_infra_sp'] != '') {
1104
				$mots = explode(' ', $nom['epithete_infra_sp']);
1105
				foreach ($mots as $mot) {
1106
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1107
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1108
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1109
					}
1110
				}
1111
			}
1112
		}
1113
 
1114
		// Analyse des résultats
1115
		if (count($noms_erreur) > 0) {
1116
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1117
			$info['message']['lignes'] = $noms_erreur;
1118
		} else {
1119
			$info['resultat'] = true;
1120
		}
64 jpm 1121
		$noms_erreur = null;
20 jpm 1122
 
30 jpm 1123
		$this->traiterResultatTest($info);
20 jpm 1124
	}
1125
 
64 jpm 1126
	private function testerEpitheteInfraSpRang() {
30 jpm 1127
		$info = array('nom' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
20 jpm 1128
			'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$this->manuel['rang_sp']}.",
1129
			'resultat' => false);
1130
 
1131
		// Réalisation du test
1132
		$noms_erreur = array();
64 jpm 1133
		foreach ($this->noms as &$nom) {
20 jpm 1134
			if ($nom['epithete_infra_sp'] != '') {
1135
				if ($nom['rang'] < $this->manuel['rang_sp']) {
149 jpm 1136
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1137
				}
1138
			}
1139
		}
1140
 
1141
		// Analyse des résultats
1142
		if (count($noms_erreur) > 0) {
149 jpm 1143
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1144
			$info['message']['lignes'] = $noms_erreur;
1145
		} else {
1146
			$info['resultat'] = true;
1147
		}
64 jpm 1148
		$noms_erreur = null;
20 jpm 1149
 
30 jpm 1150
		$this->traiterResultatTest($info);
20 jpm 1151
	}
1152
 
64 jpm 1153
	private function testerTypeEpitheteEspaces() {
30 jpm 1154
		$info = array('nom' => 'type_epithete -> espaces en trop',
20 jpm 1155
			'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
1156
			'resultat' => false);
1157
 
1158
		// Réalisation du test
1159
		$noms_erreur = array();
64 jpm 1160
		foreach ($this->noms as &$nom) {
20 jpm 1161
			if ($nom['type_epithete'] != '') {
1162
				if (preg_match('/\s+/', $nom['type_epithete'])) {
1163
					$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
1164
					$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
1165
				}
1166
			}
1167
		}
1168
 
1169
		// Analyse des résultats
1170
		if (count($noms_erreur) > 0) {
1171
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1172
			$info['message']['lignes'] = $noms_erreur;
1173
		} else {
1174
			$info['resultat'] = true;
1175
		}
1176
 
30 jpm 1177
		$this->traiterResultatTest($info);
20 jpm 1178
	}
1179
 
64 jpm 1180
	private function testerTypeEpitheteSyntaxe() {
30 jpm 1181
		$info = array('nom' => 'type_epithete -> syntaxe',
163 delphine 1182
			'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules, sans ".
1183
				" accents, et de tirets (-). Il commence par une lettre minuscule sans accent.",
20 jpm 1184
			'resultat' => false);
1185
 
1186
		// Réalisation du test
1187
		$noms_erreur = array();
64 jpm 1188
		foreach ($this->noms as &$nom) {
20 jpm 1189
			if ($nom['type_epithete'] != '') {
1190
				if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
1191
					$noms_erreur[] = array($nom['num_nom'],  $nom['type_epithete']);
1192
				}
1193
			}
1194
		}
1195
 
1196
		// Analyse des résultats
1197
		if (count($noms_erreur) > 0) {
1198
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1199
			$info['message']['lignes'] = $noms_erreur;
1200
		} else {
1201
			$info['resultat'] = true;
1202
		}
1203
 
30 jpm 1204
		$this->traiterResultatTest($info);
20 jpm 1205
	}
1206
 
64 jpm 1207
	private function testerTypeEpitheteHybridite() {
30 jpm 1208
		$info = array('nom' => 'type_epithete -> hybridité',
20 jpm 1209
			'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
1210
				" - «n-» \n".
1211
				" - «notho-» \n",
1212
			'resultat' => false);
1213
 
1214
		// Réalisation du test
1215
		$noms_erreur = array();
64 jpm 1216
		foreach ($this->noms as &$nom) {
20 jpm 1217
			if ($nom['type_epithete'] != '') {
1218
				if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
1219
					$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
1220
				}
1221
			}
1222
		}
1223
 
1224
		// Analyse des résultats
1225
		if (count($noms_erreur) > 0) {
1226
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1227
			$info['message']['lignes'] = $noms_erreur;
1228
		} else {
1229
			$info['resultat'] = true;
1230
		}
1231
 
30 jpm 1232
		$this->traiterResultatTest($info);
20 jpm 1233
	}
1234
 
1235
	private function testerNombreDeChamps($colonnes) {
30 jpm 1236
		$info = array('nom' => 'Structure -> nombre de champs',
20 jpm 1237
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
1238
			'resultat' => false);
1239
 
1240
		$nbre_colonnes = count($colonnes);
30 jpm 1241
		$info['message'] = $nbre_colonnes;
20 jpm 1242
		if ($nbre_colonnes >= 35) {
1243
			$info['resultat'] = true;
1244
		}
30 jpm 1245
		$this->traiterResultatTest($info);
64 jpm 1246
		return ($info['resultat'] ? '1' : '0');
20 jpm 1247
	}
1248
 
1249
	private function testerNomDesChamps($colonnes) {
30 jpm 1250
		$info = array('nom' => 'Structure -> noms des champs',
163 delphine 1251
			'description' => 'Les noms des champs de la table contenant le référentiel doivent être conformes à ceux '.
1252
								'définis par le manuel technique.',
20 jpm 1253
			'resultat' => false);
1254
 
1255
		$champs_attendus = explode(',', $this->manuel['champs']);
1256
		$champs_presents = array();
1257
		foreach ($colonnes as $colonne) {
1258
			$champs_presents[$colonne['Field']] = $colonne;
1259
		}
1260
 
1261
		$ok = true;
1262
		$champs_manquant = array();
1263
		foreach ($champs_attendus as $champ_attendu) {
1264
			if (!isset($champs_presents[$champ_attendu])) {
1265
				$champs_manquant[] = $champ_attendu;
1266
				$ok = false;
1267
			}
1268
		}
1269
		$info['resultat'] = $ok;
1270
		if (!$ok) {
164 delphine 1271
			$info['message'] = 'Champs manquants : '.implode(', ', $champs_manquant).'.';
20 jpm 1272
		}
1273
 
30 jpm 1274
		$this->traiterResultatTest($info);
64 jpm 1275
		return ($info['resultat'] ? '1' : '0');
20 jpm 1276
	}
1277
 
1278
	private function testerTypeDesChamps($colonnes) {
30 jpm 1279
		$info = array('nom' => 'Structure -> types des champs',
163 delphine 1280
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conformes à ceux '.
1281
								'définis par le manuel technique.',
20 jpm 1282
			'resultat' => false);
1283
 
1284
		$champs_attendus = explode(',', $this->manuel['champs_type']);
1285
		$champs_presents = array();
1286
		foreach ($colonnes as $colonne) {
1287
			$champs_presents[$colonne['Field']] = $colonne['Type'];
1288
		}
1289
 
1290
		// Recercherche des erreurs
1291
		$champs_erreur = array();
1292
		foreach ($champs_attendus as $champ_attendu) {
51 jpm 1293
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
1294
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
1295
 
20 jpm 1296
			if (isset($champs_presents[$champ_attendu_nom])) {
1297
				$champs_present_type = $champs_presents[$champ_attendu_nom];
1298
 
1299
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
1300
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
1301
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
1302
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
1303
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
1304
				}
1305
			}
1306
		}
1307
 
1308
		// Analyse des résultats
1309
		if (count($champs_erreur) > 0) {
164 delphine 1310
			$info['message'] = "Champs n'ayant pas un type conforme : ".implode(', ', $champs_erreur).'.';
20 jpm 1311
		} else {
1312
			$info['resultat'] = true;
1313
		}
1314
 
30 jpm 1315
		$this->traiterResultatTest($info);
64 jpm 1316
		return ($info['resultat'] ? '1' : '0');
20 jpm 1317
	}
1318
 
1319
	private function testerTailleDesChamps($colonnes, $analyses) {
30 jpm 1320
		$info = array('nom' => 'Structure -> champs tronqués',
163 delphine 1321
			'description' => "Evalue le risque que des données de type texte aient pu être tronquées lors de leur insertion.\n".
45 jpm 1322
				"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
1323
				"sur un problème éventuel.",
20 jpm 1324
			'resultat' => false);
1325
 
1326
		$tailles_champs_maxi = array();
1327
		foreach ($colonnes as $colonne) {
1328
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
1329
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
1330
			}
1331
		}
1332
 
1333
		$tailles_trouvees = array();
1334
		foreach ($analyses as $analyse) {
1335
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
1336
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
1337
			}
1338
		}
1339
 
1340
		$champs_erreur = array();
1341
		$champs_attendus = explode(',', $this->manuel['champs']);
1342
		foreach ($champs_attendus as $champ_attendu) {
1343
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
1344
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
1345
					$champs_erreur[] = $champ_attendu;
1346
				}
1347
			}
1348
		}
1349
 
1350
		// Analyse des résultats
1351
		if (count($champs_erreur) > 0) {
164 delphine 1352
			$info['message'] = "Champs possédant des enregistrements qui atteignent la taille maximum autorisée : ".
1353
								implode(', ', $champs_erreur).'.';
20 jpm 1354
		} else {
1355
			$info['resultat'] = true;
1356
		}
1357
 
30 jpm 1358
		$this->traiterResultatTest($info);
20 jpm 1359
	}
1360
 
1361
	private function testerNumNomClePrimaire($colonnes) {
30 jpm 1362
		$info = array('nom' => 'Structure -> num_nom est clé primaire',
20 jpm 1363
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
1364
			'resultat' => false);
1365
 
1366
		foreach ($colonnes as $colonne) {
1367
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
1368
				$info['resultat'] = true;
1369
			}
1370
		}
1371
 
30 jpm 1372
		$this->traiterResultatTest($info);
64 jpm 1373
		return ($info['resultat'] ? '1' : '0');
20 jpm 1374
	}
1375
 
64 jpm 1376
	private function testerNumNomSuperieurAZero() {
30 jpm 1377
		$info = array('nom' => 'num_nom -> supérieur à 0',
20 jpm 1378
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
1379
			'resultat' => false);
1380
 
1381
		// Réalisation du test
1382
		$noms_erreur = array();
64 jpm 1383
		foreach ($this->noms as &$nom) {
20 jpm 1384
			if ($nom['num_nom'] <= 0) {
1385
				$noms_erreur[] = $nom['num_nom'];
1386
			}
1387
		}
1388
 
1389
		// Analyse des résultats
1390
		if (count($noms_erreur) > 0) {
164 delphine 1391
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur ".
1392
								"inférieure ou égale à 0.";
20 jpm 1393
		} else {
1394
			$info['resultat'] = true;
1395
		}
1396
 
30 jpm 1397
		$this->traiterResultatTest($info);
20 jpm 1398
	}
1399
 
64 jpm 1400
	private function testerNumNomRetenuSuperieurAZero() {
30 jpm 1401
		$info = array('nom' => 'num_nom_retenu -> supérieur à 0',
42 jpm 1402
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
20 jpm 1403
			'resultat' => false);
1404
 
1405
		// Réalisation du test
1406
		$noms_erreur = array();
64 jpm 1407
		foreach ($this->noms as &$nom) {
42 jpm 1408
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
20 jpm 1409
				$noms_erreur[] = $nom['num_nom'];
1410
			}
1411
		}
1412
 
1413
		// Analyse des résultats
1414
		if (count($noms_erreur) > 0) {
164 delphine 1415
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".
1416
								implode(', ', $noms_erreur).'.';
20 jpm 1417
		} else {
1418
			$info['resultat'] = true;
1419
		}
1420
 
30 jpm 1421
		$this->traiterResultatTest($info);
20 jpm 1422
	}
1423
 
64 jpm 1424
	private function testerNumTaxSupEgalZeroUnique() {
30 jpm 1425
		$info = array('nom' => 'num_tax_sup -> égal à 0 unique',
164 delphine 1426
			'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond ".
1427
								"au premier taxon de la classification.",
20 jpm 1428
			'resultat' => false);
1429
 
1430
		// Réalisation du test
1431
		$noms_erreur = array();
64 jpm 1432
		foreach ($this->noms as &$nom) {
20 jpm 1433
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
1434
				$noms_erreur[] = $nom['num_nom'];
1435
			}
1436
		}
1437
 
1438
		// Analyse des résultats
1439
		if (count($noms_erreur) > 1) {
164 delphine 1440
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".
1441
								implode(', ', $noms_erreur).'.';
20 jpm 1442
		} else {
1443
			$info['resultat'] = true;
1444
		}
1445
 
30 jpm 1446
		$this->traiterResultatTest($info);
20 jpm 1447
	}
1448
 
64 jpm 1449
	private function testerTaxSupPourTaxon() {
30 jpm 1450
		$info = array('nom' => 'Classification -> uniquement pour les taxons',
164 delphine 1451
			'description' => "Seuls les enregistrements représentant un taxon doivent posséder une valeur dans le champ ".
1452
				"num_tax_sup.\n Si num_nom_retenu est différent de num_nom (= nom synonyme) alors num_tax_sup doit être vide.",
20 jpm 1453
			'resultat' => false);
1454
 
1455
		// Réalisation du test
1456
		$noms_erreur = array();
64 jpm 1457
		foreach ($this->noms as &$nom) {
43 jpm 1458
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
20 jpm 1459
				$noms_erreur[] = $nom['num_nom'];
1460
			}
1461
		}
1462
 
1463
		// Analyse des résultats
1464
		if (count($noms_erreur) > 0) {
164 delphine 1465
			$info['message'] = count($noms_erreur)." enregistrements ne sont pas des taxons et possèdent une ".
1466
								"valeur dans num_tax_sup : ".implode(', ', $noms_erreur).'.';
20 jpm 1467
		} else {
1468
			$info['resultat'] = true;
1469
		}
1470
 
30 jpm 1471
		$this->traiterResultatTest($info);
20 jpm 1472
	}
1473
 
64 jpm 1474
	private function testerExitenceTaxonSuperieur() {
30 jpm 1475
		$info = array('nom' => 'Classification -> existence du taxon supérieur',
164 delphine 1476
			'description' => "Chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf ".
1477
								"la racine de la classification.",
20 jpm 1478
			'resultat' => false);
1479
 
1480
		// Réalisation du test
1481
		$noms_erreur = array();
64 jpm 1482
		foreach ($this->noms as &$nom) {
20 jpm 1483
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
64 jpm 1484
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
20 jpm 1485
					$noms_erreur[] = $nom['num_nom'];
1486
				}
1487
			}
1488
		}
1489
 
1490
		// Analyse des résultats
1491
		if (count($noms_erreur) > 0) {
164 delphine 1492
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".
1493
								implode(', ', $noms_erreur).'.';
20 jpm 1494
		} else {
1495
			$info['resultat'] = true;
1496
		}
1497
 
30 jpm 1498
		$this->traiterResultatTest($info);
20 jpm 1499
	}
1500
 
64 jpm 1501
	private function testerClassificationRang() {
30 jpm 1502
		$info = array('nom' => 'Classification -> taxon supérieur avec rang inférieur',
164 delphine 1503
			'description' => "Pour chaque enregistrement représentant un taxon, le taxon supérieur doit avoir ".
1504
								"un rang inférieur au taxon courant.",
20 jpm 1505
			'resultat' => false);
1506
 
1507
		// Réalisation du test
1508
		$noms_erreur = array();
64 jpm 1509
		foreach ($this->noms as &$nom) {
20 jpm 1510
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
64 jpm 1511
				if (isset($this->noms[$nom['num_tax_sup']])) {
1512
					$nom_sup = $this->noms[$nom['num_tax_sup']];
20 jpm 1513
					if ($nom_sup['rang'] > $nom['rang']) {
1514
						$noms_erreur[] = $nom['num_nom'];
1515
					}
1516
				}
1517
			}
1518
		}
1519
 
1520
		// Analyse des résultats
1521
		if (count($noms_erreur) > 0) {
1522
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
1523
		} else {
1524
			$info['resultat'] = true;
1525
		}
1526
 
30 jpm 1527
		$this->traiterResultatTest($info);
20 jpm 1528
	}
1529
 
64 jpm 1530
	private function testerClassification() {
30 jpm 1531
		$info = array('nom' => 'Classification -> racine liée à chaque noeud',
164 delphine 1532
			'description' => "Pour chaque enregistrement, la classification doit pouvoir être remontée ".
1533
								"jusqu'à un nom unique possédant une valeur num_tax_sup de 0.",
20 jpm 1534
			'resultat' => false);
1535
 
1536
		// Réalisation du test
1537
		$noms_erreur = array();
161 jpm 1538
		$this->noms_ok = array();
64 jpm 1539
		foreach ($this->noms as &$nom) {
20 jpm 1540
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
161 jpm 1541
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1542
					$this->noms_ok[$nom['num_nom']] = true;
160 jpm 1543
				} else {
161 jpm 1544
					$this->detection_boucle_infini = array();
160 jpm 1545
					$classif_ok = $this->remonterClassif($nom);
161 jpm 1546
					unset($this->detection_boucle_infini);
1547
 
160 jpm 1548
					if ($classif_ok === false) {
1549
						$noms_erreur[] = $nom['num_nom'];
1550
					} else {
161 jpm 1551
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
160 jpm 1552
					}
161 jpm 1553
				}
20 jpm 1554
			}
1555
		}
161 jpm 1556
		unset($this->noms_ok);
20 jpm 1557
 
1558
		// Analyse des résultats
1559
		if (count($noms_erreur) > 0) {
164 delphine 1560
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".
1561
								implode(', ', $noms_erreur).'.';
20 jpm 1562
		} else {
1563
			$info['resultat'] = true;
1564
		}
1565
 
30 jpm 1566
		$this->traiterResultatTest($info);
20 jpm 1567
	}
1568
 
161 jpm 1569
	private function remonterClassif(&$nom) {
1570
		$this->detection_boucle_infini[$nom['num_nom']] = true;
160 jpm 1571
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
161 jpm 1572
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1573
				$this->noms_ok[$nom['num_nom']] = true;
64 jpm 1574
				return true;
161 jpm 1575
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
1576
				$this->noms_ok[$nom['num_nom']] = true;
1577
				return true;
64 jpm 1578
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
1579
				return false;
161 jpm 1580
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
1581
				return false;
64 jpm 1582
			} else {
161 jpm 1583
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
1584
				if ($retour === true) {
1585
					$this->noms_ok[$nom['num_tax_sup']] = true;
1586
				}
1587
				return $retour;
64 jpm 1588
			}
1589
		} else {
20 jpm 1590
			return false;
1591
		}
1592
	}
1593
 
64 jpm 1594
	private function testerRang() {
30 jpm 1595
		$info = array('nom' => 'rang',
163 delphine 1596
			'description' => "Le rang doit correspondre à une valeur numérique définie dans le manuel.",
20 jpm 1597
			'resultat' => false);
1598
 
1599
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
1600
 
1601
		// Réalisation du test
1602
		$noms_erreur = array();
64 jpm 1603
		foreach ($this->noms as &$nom) {
20 jpm 1604
			if (!isset($rangs[$nom['rang']])) {
1605
				$noms_erreur[] = $nom['num_nom'];
1606
			}
1607
		}
1608
 
1609
		// Analyse des résultats
1610
		if (count($noms_erreur) > 0) {
1611
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
1612
		} else {
1613
			$info['resultat'] = true;
1614
		}
1615
 
30 jpm 1616
		$this->traiterResultatTest($info);
20 jpm 1617
	}
1618
 
64 jpm 1619
	private function testerNomCompletSupraGenerique() {
149 jpm 1620
		$info = array('nom' => 'nom_sci -> noms supra-génériques',
164 delphine 1621
			'description' => "Si le rang est < à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur ".
1622
								"du champ nom_supra_generique. Les valeurs des champs cultivar_groupe, cultivar et ".
1623
								"nom_commercial peuvent s'y ajouter.",
20 jpm 1624
			'resultat' => false);
1625
 
1626
		// Réalisation du test
1627
		$noms_erreur = array();
64 jpm 1628
		foreach ($this->noms as &$nom) {
20 jpm 1629
			if ($nom['rang'] < $this->manuel['rang_genre']) {
1630
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1631
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
1632
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1633
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1634
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1635
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1636
				}
1637
			}
1638
		}
1639
 
1640
		// Analyse des résultats
1641
		if (count($noms_erreur) > 0) {
149 jpm 1642
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1643
			$info['message']['lignes'] = $noms_erreur;
1644
		} else {
1645
			$info['resultat'] = true;
1646
		}
1647
 
30 jpm 1648
		$this->traiterResultatTest($info);
20 jpm 1649
	}
1650
 
64 jpm 1651
	private function testerNomCompletGenre() {
149 jpm 1652
		$info = array('nom' => 'nom_sci -> noms de genres',
163 delphine 1653
			'description' => "Si le rang est = à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur du champ genre. ".
20 jpm 1654
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1655
			'resultat' => false);
1656
 
1657
		// Réalisation du test
1658
		$noms_erreur = array();
64 jpm 1659
		foreach ($this->noms as &$nom) {
20 jpm 1660
			if ($nom['rang'] == $this->manuel['rang_genre']) {
1661
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1662
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1663
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1664
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1665
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1666
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1667
				}
1668
			}
1669
		}
1670
 
1671
		// Analyse des résultats
1672
		if (count($noms_erreur) > 0) {
149 jpm 1673
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1674
			$info['message']['lignes'] = $noms_erreur;
1675
		} else {
1676
			$info['resultat'] = true;
1677
		}
1678
 
30 jpm 1679
		$this->traiterResultatTest($info);
20 jpm 1680
	}
1681
 
64 jpm 1682
	private function testerNomCompletInfraGenre() {
149 jpm 1683
		$info = array('nom' => 'nom_sci -> noms infra-génériques',
163 delphine 1684
			'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']},".
1685
			" le nom_sci doit correspondre à une des formules suivantes : \n".
20 jpm 1686
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
1687
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
1688
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1689
			'resultat' => false);
1690
 
1691
		// Réalisation du test
1692
		$noms_erreur = array();
64 jpm 1693
		foreach ($this->noms as &$nom) {
20 jpm 1694
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
1695
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1696
				$nom_sci_ideal = '';
20 jpm 1697
				if ($nom['type_epithete'] == 'agg.') {
149 jpm 1698
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1699
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1700
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
20 jpm 1701
				} else {
149 jpm 1702
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1703
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
1704
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
20 jpm 1705
				}
149 jpm 1706
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1707
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1708
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1709
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1710
				}
1711
			}
1712
		}
1713
 
1714
		// Analyse des résultats
1715
		if (count($noms_erreur) > 0) {
149 jpm 1716
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1717
			$info['message']['lignes'] = $noms_erreur;
1718
		} else {
1719
			$info['resultat'] = true;
1720
		}
64 jpm 1721
		$noms_erreur = null;
20 jpm 1722
 
30 jpm 1723
		$this->traiterResultatTest($info);
20 jpm 1724
	}
1725
 
64 jpm 1726
	private function testerNomCompletEspece() {
149 jpm 1727
		$info = array('nom' => "nom_sci -> noms d'espèce",
163 delphine 1728
			'description' => "Si le rang est = à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
20 jpm 1729
				" genre + ' ' + epithete_sp \n".
1730
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1731
			'resultat' => false);
1732
 
1733
		// Réalisation du test
1734
		$noms_erreur = array();
64 jpm 1735
		foreach ($this->noms as &$nom) {
20 jpm 1736
			if ($nom['rang'] == $this->manuel['rang_sp']) {
1737
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1738
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1739
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1740
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1741
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1742
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1743
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1744
				}
1745
			}
1746
		}
1747
 
1748
		// Analyse des résultats
1749
		if (count($noms_erreur) > 0) {
149 jpm 1750
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1751
			$info['message']['lignes'] = $noms_erreur;
1752
		} else {
1753
			$info['resultat'] = true;
1754
		}
64 jpm 1755
		$noms_erreur = null;
20 jpm 1756
 
30 jpm 1757
		$this->traiterResultatTest($info);
20 jpm 1758
	}
1759
 
64 jpm 1760
	private function testerNomCompletInfraSpecifique() {
149 jpm 1761
		$info = array('nom' => 'nom_sci -> noms infra-spécifiques',
163 delphine 1762
			'description' => "Si le rang est > à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
20 jpm 1763
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".
1764
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1765
			'resultat' => false);
1766
 
1767
		// Réalisation du test
1768
		$noms_erreur = array();
64 jpm 1769
		foreach ($this->noms as &$nom) {
20 jpm 1770
			if ($nom['rang'] > $this->manuel['rang_sp']) {
1771
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
149 jpm 1772
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1773
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1774
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
1775
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
1776
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1777
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1778
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1779
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 1780
				}
1781
			}
1782
		}
1783
 
1784
		// Analyse des résultats
1785
		if (count($noms_erreur) > 0) {
149 jpm 1786
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 1787
			$info['message']['lignes'] = $noms_erreur;
1788
		} else {
1789
			$info['resultat'] = true;
1790
		}
64 jpm 1791
		$noms_erreur = null;
20 jpm 1792
 
30 jpm 1793
		$this->traiterResultatTest($info);
20 jpm 1794
	}
1795
 
64 jpm 1796
	private function testerNomSupraGeneriqueEspaces() {
30 jpm 1797
		$info = array('nom' => 'nom_supra_generique -> espaces en trop',
163 delphine 1798
			'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou après le nom.",
20 jpm 1799
			'resultat' => false);
1800
 
1801
		// Réalisation du test
1802
		$noms_erreur = array();
64 jpm 1803
		foreach ($this->noms as &$nom) {
20 jpm 1804
			if ($nom['nom_supra_generique'] != '') {
1805
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
1806
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1807
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1808
				}
1809
			}
1810
		}
1811
 
1812
		// Analyse des résultats
1813
		if (count($noms_erreur) > 0) {
1814
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1815
			$info['message']['lignes'] = $noms_erreur;
1816
		} else {
1817
			$info['resultat'] = true;
1818
		}
64 jpm 1819
		$noms_erreur = null;
20 jpm 1820
 
30 jpm 1821
		$this->traiterResultatTest($info);
20 jpm 1822
	}
1823
 
64 jpm 1824
	private function testerNomSupraGeneriqueSyntaxe() {
30 jpm 1825
		$info = array('nom' => 'nom_supra_generique -> syntaxe',
163 delphine 1826
			'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules, avec ou ".
1827
				"sans tréma (¨), et de tirets (-). \n".
20 jpm 1828
				"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
1829
			'resultat' => false);
1830
 
1831
		// Réalisation du test
1832
		$noms_erreur = array();
64 jpm 1833
		foreach ($this->noms as &$nom) {
20 jpm 1834
			if ($nom['nom_supra_generique'] != '') {
1835
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
1836
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1837
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1838
				}
1839
			}
1840
		}
1841
 
1842
		// Analyse des résultats
1843
		if (count($noms_erreur) > 0) {
1844
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1845
			$info['message']['lignes'] = $noms_erreur;
1846
		} else {
1847
			$info['resultat'] = true;
1848
		}
64 jpm 1849
		$noms_erreur = null;
20 jpm 1850
 
30 jpm 1851
		$this->traiterResultatTest($info);
20 jpm 1852
	}
1853
 
64 jpm 1854
	private function testerNomSupraGeneriqueRang() {
30 jpm 1855
		$info = array('nom' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
20 jpm 1856
			'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$this->manuel['rang_genre']}.",
1857
			'resultat' => false);
1858
 
1859
		// Réalisation du test
1860
		$noms_erreur = array();
64 jpm 1861
		foreach ($this->noms as &$nom) {
20 jpm 1862
			if ($nom['nom_supra_generique'] != '') {
1863
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
149 jpm 1864
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1865
				}
1866
			}
1867
		}
1868
 
1869
		// Analyse des résultats
1870
		if (count($noms_erreur) > 0) {
149 jpm 1871
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1872
			$info['message']['lignes'] = $noms_erreur;
1873
		} else {
1874
			$info['resultat'] = true;
1875
		}
64 jpm 1876
		$noms_erreur = null;
20 jpm 1877
 
30 jpm 1878
		$this->traiterResultatTest($info);
20 jpm 1879
	}
1880
 
64 jpm 1881
	private function testerGenreEspaces() {
30 jpm 1882
		$info = array('nom' => 'genre -> espaces en trop',
163 delphine 1883
			'description' => "Le champ genre ne doit pas contenir d'espace avant ou après le nom.\n".
1884
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
20 jpm 1885
			'resultat' => false);
1886
 
1887
		// Réalisation du test
1888
		$noms_erreur = array();
64 jpm 1889
		foreach ($this->noms as &$nom) {
20 jpm 1890
			if ($nom['genre'] != '') {
1891
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
1892
					$nom_traite = $this->repererEspace($nom['genre']);
1893
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1894
				}
1895
			}
1896
		}
1897
 
1898
		// Analyse des résultats
1899
		if (count($noms_erreur) > 0) {
1900
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1901
			$info['message']['lignes'] = $noms_erreur;
1902
		} else {
1903
			$info['resultat'] = true;
1904
		}
64 jpm 1905
		$noms_erreur = null;
20 jpm 1906
 
30 jpm 1907
		$this->traiterResultatTest($info);
20 jpm 1908
	}
1909
 
64 jpm 1910
	private function testerGenreSyntaxe() {
30 jpm 1911
		$info = array('nom' => 'genre -> syntaxe',
20 jpm 1912
			'description' => "Le champ genre peut contenir :\n".
163 delphine 1913
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
164 delphine 1914
				"   Il commence par une lettre majuscule (avec ou sans tréma) et peut être précédé par \n".
163 delphine 1915
				"   le signe + ou la lettre x suivi d'un espace.\n".
164 delphine 1916
				" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés\n".
1917
				"   entre eux par la lettre x entourée de caractères espaces.",
20 jpm 1918
			'resultat' => false);
1919
 
1920
		// Réalisation du test
1921
		$noms_erreur = array();
64 jpm 1922
		foreach ($this->noms as &$nom) {
20 jpm 1923
			if ($nom['genre'] != '') {
1924
				$mots = explode(' ', $nom['genre']);
1925
				foreach ($mots as $mot) {
1926
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
1927
						$nom_traite = $this->repererEspace($nom['genre']);
1928
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1929
					}
1930
				}
1931
			}
1932
		}
1933
 
1934
		// Analyse des résultats
1935
		if (count($noms_erreur) > 0) {
1936
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1937
			$info['message']['lignes'] = $noms_erreur;
1938
		} else {
1939
			$info['resultat'] = true;
1940
		}
64 jpm 1941
		$noms_erreur = null;
20 jpm 1942
 
30 jpm 1943
		$this->traiterResultatTest($info);
20 jpm 1944
	}
1945
 
64 jpm 1946
	private function testerGenreRang() {
30 jpm 1947
		$info = array('nom' => "genre -> rang >= {$this->manuel['rang_genre']}",
20 jpm 1948
			'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
1949
			'resultat' => false);
1950
 
1951
		// Réalisation du test
1952
		$noms_erreur = array();
64 jpm 1953
		foreach ($this->noms as &$nom) {
20 jpm 1954
			if ($nom['genre'] != '') {
1955
				if ($nom['rang'] < $this->manuel['rang_genre']) {
149 jpm 1956
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1957
				}
1958
			}
1959
		}
1960
 
1961
		// Analyse des résultats
1962
		if (count($noms_erreur) > 0) {
149 jpm 1963
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1964
			$info['message']['lignes'] = $noms_erreur;
1965
		} else {
1966
			$info['resultat'] = true;
1967
		}
64 jpm 1968
		$noms_erreur = null;
20 jpm 1969
 
30 jpm 1970
		$this->traiterResultatTest($info);
20 jpm 1971
	}
1972
 
64 jpm 1973
	private function testerEpitheteInfraGeneriqueSyntaxe() {
30 jpm 1974
		$info = array('nom' => 'epithete_infra_generique -> syntaxe',
163 delphine 1975
			'description' => "Le champ epithete_infra_generique est composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
20 jpm 1976
				"La première lettre (avec ou sans tréma) doit être en majuscule.",
1977
			'resultat' => false);
1978
 
1979
		// Réalisation du test
1980
		$noms_erreur = array();
64 jpm 1981
		foreach ($this->noms as &$nom) {
20 jpm 1982
			if ($nom['epithete_infra_generique'] != '') {
1983
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1984
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1985
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1986
				}
1987
			}
1988
		}
1989
 
1990
		// Analyse des résultats
1991
		if (count($noms_erreur) > 0) {
1992
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1993
			$info['message']['lignes'] = $noms_erreur;
1994
		} else {
1995
			$info['resultat'] = true;
1996
		}
64 jpm 1997
		$noms_erreur = null;
20 jpm 1998
 
30 jpm 1999
		$this->traiterResultatTest($info);
20 jpm 2000
	}
2001
 
64 jpm 2002
	private function testerEpitheteInfraGeneriqueRang() {
30 jpm 2003
		$info = array('nom' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
163 delphine 2004
			'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris ".
20 jpm 2005
				"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
2006
			'resultat' => false);
2007
 
2008
		// Réalisation du test
2009
		$noms_erreur = array();
64 jpm 2010
		foreach ($this->noms as &$nom) {
20 jpm 2011
			if ($nom['epithete_infra_generique'] != '') {
2012
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
149 jpm 2013
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 2014
				}
2015
			}
2016
		}
2017
 
2018
		// Analyse des résultats
2019
		if (count($noms_erreur) > 0) {
149 jpm 2020
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 2021
			$info['message']['lignes'] = $noms_erreur;
2022
		} else {
2023
			$info['resultat'] = true;
2024
		}
64 jpm 2025
		$noms_erreur = null;
20 jpm 2026
 
30 jpm 2027
		$this->traiterResultatTest($info);
20 jpm 2028
	}
2029
 
64 jpm 2030
	private function testerEpitheteInfraGeneriqueEspaces() {
30 jpm 2031
		$info = array('nom' => 'epithete_infra_generique -> espaces en trop',
163 delphine 2032
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou après sa valeur.",
20 jpm 2033
			'resultat' => false);
2034
 
2035
		// Réalisation du test
2036
		$noms_erreur = array();
64 jpm 2037
		foreach ($this->noms as &$nom) {
20 jpm 2038
			if ($nom['epithete_infra_generique'] != '') {
2039
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
2040
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
2041
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2042
				}
2043
			}
2044
		}
2045
 
2046
		// Analyse des résultats
2047
		if (count($noms_erreur) > 0) {
2048
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
2049
			$info['message']['lignes'] = $noms_erreur;
2050
		} else {
2051
			$info['resultat'] = true;
2052
		}
64 jpm 2053
		$noms_erreur = null;
20 jpm 2054
 
30 jpm 2055
		$this->traiterResultatTest($info);
20 jpm 2056
	}
2057
 
64 jpm 2058
	private function testerEpitheteSpEspaces() {
30 jpm 2059
		$info = array('nom' => 'epithete_sp -> espaces en trop',
163 delphine 2060
			'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou après le nom.\n".
2061
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
20 jpm 2062
			'resultat' => false);
2063
 
2064
		// Réalisation du test
2065
		$noms_erreur = array();
64 jpm 2066
		foreach ($this->noms as &$nom) {
20 jpm 2067
			if ($nom['epithete_sp'] != '') {
2068
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
2069
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2070
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2071
				}
2072
			}
2073
		}
2074
 
2075
		// Analyse des résultats
2076
		if (count($noms_erreur) > 0) {
2077
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2078
			$info['message']['lignes'] = $noms_erreur;
2079
		} else {
2080
			$info['resultat'] = true;
2081
		}
64 jpm 2082
		$noms_erreur = null;
20 jpm 2083
 
30 jpm 2084
		$this->traiterResultatTest($info);
20 jpm 2085
	}
2086
 
64 jpm 2087
	private function testerEpitheteSpSyntaxe() {
30 jpm 2088
		$info = array('nom' => 'epithete_sp -> syntaxe',
20 jpm 2089
			'description' => "Le champ epithete_sp peut contenir :\n".
2090
			 	" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
164 delphine 2091
				"   Il commence par une lettre minuscule [a-zëï].\n".
2092
				"   Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
163 delphine 2093
				" - un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9) \n".
2094
				"   ou d'un seul caractère majuscule (A-Z) \n".
2095
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) \n".
164 delphine 2096
				"   séparés entre eux par la lettre x entourée de caractères espaces.",
20 jpm 2097
			'resultat' => false);
2098
 
2099
		// Réalisation du test
2100
		$noms_erreur = array();
64 jpm 2101
		foreach ($this->noms as &$nom) {
20 jpm 2102
			if ($nom['epithete_sp'] != '') {
2103
				$mots = explode(' ', $nom['epithete_sp']);
2104
				foreach ($mots as $mot) {
2105
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
2106
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2107
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2108
					}
2109
				}
2110
			}
2111
		}
2112
 
2113
		// Analyse des résultats
2114
		if (count($noms_erreur) > 0) {
2115
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2116
			$info['message']['lignes'] = $noms_erreur;
2117
		} else {
2118
			$info['resultat'] = true;
2119
		}
64 jpm 2120
		$noms_erreur = null;
20 jpm 2121
 
30 jpm 2122
		$this->traiterResultatTest($info);
20 jpm 2123
	}
2124
 
64 jpm 2125
	private function testerEpitheteSpRang() {
30 jpm 2126
		$info = array('nom' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
20 jpm 2127
			'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']}.",
2128
			'resultat' => false);
2129
 
2130
		// Réalisation du test
2131
		$noms_erreur = array();
64 jpm 2132
		foreach ($this->noms as &$nom) {
20 jpm 2133
			if ($nom['epithete_sp'] != '') {
2134
				if ($nom['rang'] < $this->manuel['rang_sp']) {
149 jpm 2135
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 2136
				}
2137
			}
2138
		}
2139
 
2140
		// Analyse des résultats
2141
		if (count($noms_erreur) > 0) {
149 jpm 2142
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 2143
			$info['message']['lignes'] = $noms_erreur;
2144
		} else {
2145
			$info['resultat'] = true;
2146
		}
64 jpm 2147
		$noms_erreur = null;
20 jpm 2148
 
30 jpm 2149
		$this->traiterResultatTest($info);
20 jpm 2150
	}
2151
 
146 delphine 2152
 
2153
	private function testerExclureTaxRefSyntaxe() {
2154
		$info = array('nom' => 'exclure_taxref -> syntaxe',
2155
			'description' => "Le champ exclure_taxref contient soit :\n".
2156
			" - une valeur vide.\n".
2157
			" - une valeur null.\n".
2158
			" - le chiffre 0.\n".
2159
			" - le chiffre 1",
2160
			'resultat' => false);
2161
 
2162
		// Réalisation du test
2163
		$noms_erreur = array();
2164
		foreach ($this->noms as &$nom) {
2165
			if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
2166
				if (!$this->verifierBooleen($nom['exclure_taxref'])) {
2167
					$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
2168
				}
2169
			}
2170
		}
2171
 
2172
		// Analyse des résultats
2173
		if (count($noms_erreur) > 0) {
2174
			$info['message']['entete'] = array('num_nom', 'exclure_taxref erroné');
2175
			$info['message']['lignes'] = $noms_erreur;
2176
		} else {
2177
			$info['resultat'] = true;
2178
		}
2179
		$noms_erreur = null;
2180
 
2181
		$this->traiterResultatTest($info);
2182
	}
20 jpm 2183
	//+--------------------------------------------------------------------------------------------------------------+//
2184
	// MÉTHODES COMMUNES aux TESTS
2185
 
64 jpm 2186
	private function verifierPresence(&$valeur) {
20 jpm 2187
		$codes = $this->manuel['codes_presence'];
2188
		$ok = $this->verifierStatuts($valeur, $codes);
2189
		return $ok;
2190
	}
2191
 
64 jpm 2192
	private function verifierStatutOrigine(&$valeur) {
20 jpm 2193
		$codes = $this->manuel['codes_statuts_origine'];
2194
		$ok = $this->verifierStatuts($valeur, $codes);
2195
		return $ok;
2196
	}
2197
 
64 jpm 2198
	private function verifierStatutIntroduction(&$valeur) {
20 jpm 2199
		$codes = $this->manuel['codes_statuts_introduction'];
2200
		$ok = $this->verifierStatuts($valeur, $codes);
2201
		return $ok;
2202
	}
2203
 
64 jpm 2204
	private function verifierStatutCulture(&$valeur) {
20 jpm 2205
		$codes = $this->manuel['codes_statuts_culture'];
2206
		$ok = $this->verifierStatuts($valeur, $codes);
2207
		return $ok;
2208
	}
2209
 
64 jpm 2210
	private function verifierStatuts(&$valeur, &$codes) {
20 jpm 2211
		$ok = true;
2212
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
2213
			$ok = false;
2214
		}
2215
		return $ok;
2216
	}
2217
 
64 jpm 2218
	private function verifierBooleen(&$valeur) {
20 jpm 2219
		$ok = true;
2220
		if (!preg_match('/^1$/', $valeur)) {
2221
			$ok = false;
2222
		}
2223
		return $ok;
2224
	}
2225
 
64 jpm 2226
	private function verifierNombre(&$valeur) {
20 jpm 2227
		$ok = true;
2228
		if (!preg_match('/^[0-9]+$/', $valeur)) {
2229
			$ok = false;
2230
		}
2231
		return $ok;
2232
	}
2233
 
64 jpm 2234
	private function verifierNombreSuite(&$valeur) {
20 jpm 2235
		$ok = true;
2236
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
2237
			$ok = false;
2238
		}
2239
		return $ok;
2240
	}
2241
 
64 jpm 2242
	private function verifierTypeEpithete(&$type) {
20 jpm 2243
		$ok = false;
2244
		$rejetes = $this->manuel['type_epithete_rejetes'];
2245
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
2246
			$ok = false;
2247
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
2248
			$ok = true;
2249
		}
2250
		return $ok;
2251
	}
2252
 
64 jpm 2253
	private function verifierBiblioOrigine(&$intitule) {
20 jpm 2254
		$ok = true;
2255
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2256
			$ok = false;// Contient des espaces en trop
2257
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
2258
			$ok = false;
2259
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
2260
			$ok = false;// Contient une mauvaise suite de caractères
2261
		}
2262
		return $ok;
2263
	}
2264
 
64 jpm 2265
	private function verifierAnnee(&$annee) {
20 jpm 2266
		$ok = true;
2267
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
2268
			$ok = false;
2269
		} else if ($annee < 1753) {
2270
			$ok = false;
2271
		}
2272
		return $ok;
2273
	}
2274
 
64 jpm 2275
	private function verifierAuteur(&$intitule) {
20 jpm 2276
		$ok = true;
2277
		$acceptes = $this->manuel['auteur_acceptes'];
2278
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
2279
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2280
				$ok = false;// Contient des espaces en trop
2281
			} else {
2282
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
2283
				$mots = explode(' ', $intitule);
2284
				foreach ($mots as $position => $mot) {
2285
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2286
						$ok = false;// Mot rejeté
2287
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
2288
						continue;// Mot de l'intitulé auteur
2289
					} else {
2290
						$ok = false;
2291
					}
2292
				}
2293
			}
2294
		}
2295
		return $ok;
2296
	}
2297
 
64 jpm 2298
	private function verifierNomCommercial(&$epithete) {
20 jpm 2299
		$ok = false;
2300
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
2301
			$ok = true;
2302
		}
2303
		return $ok;
2304
	}
2305
 
64 jpm 2306
	private function verifierEpitheteCultivar(&$epithete) {
20 jpm 2307
		$ok = true;
2308
		$acceptes = $this->manuel['cultivar_acceptes'];
2309
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2310
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2311
				$ok = false;// Contient des espaces en trop
2312
			} else {
2313
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
2314
				$mots_mineurs = $this->manuel['mots_mineurs'];
2315
				$mots = explode(' ', $epithete);
2316
				foreach ($mots as $position => $mot) {
2317
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2318
						$ok = false;// Mot rejeté
2319
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2320
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2321
					} else {
2322
						$mots_tiret = explode('-', $mot);
2323
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2324
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2325
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
2326
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2327
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
2328
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2329
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2330
							} else {
2331
								$ok = false;
2332
							}
2333
						}
2334
					}
2335
				}
2336
			}
2337
		}
2338
		return $ok;
2339
	}
2340
 
64 jpm 2341
	private function verifierEpitheteGroupeCultivar(&$epithete) {
20 jpm 2342
		$ok = true;
2343
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
2344
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2345
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2346
				$ok = false;// Contient des espaces en trop
2347
			} else {
2348
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
2349
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
2350
				$mots_mineurs = $this->manuel['mots_mineurs'];
2351
				$mots = explode(' ', $epithete);
2352
				foreach ($mots as $position => $mot) {
2353
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
2354
						continue;// Mot accepté
2355
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2356
						$ok = false;// Mot rejeté
2357
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2358
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2359
					} else {
2360
						$mots_tiret = explode('-', $mot);
2361
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2362
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2363
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
2364
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2365
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
2366
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2367
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2368
							} else {
2369
								$ok = false;
2370
							}
2371
						}
2372
					}
2373
				}
2374
			}
2375
		}
2376
		return $ok;
2377
	}
2378
 
64 jpm 2379
	private function verifierEpitheteSp(&$epithete) {
20 jpm 2380
		$ok = false;
2381
		if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
2382
			$ok = true;
2383
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
2384
			$ok = true;
2385
		}
2386
		return $ok;
2387
	}
2388
 
64 jpm 2389
	private function verifierEpitheteGenre(&$epithete) {
20 jpm 2390
		$ok = false;
2391
		if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
2392
			$ok = true;
2393
		}
2394
		return $ok;
2395
	}
2396
 
64 jpm 2397
	private function formaterStyleNomGenre(&$genre) {
20 jpm 2398
		$genre_fmt = '';
2399
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
2400
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
2401
		} else {
2402
			$genre_fmt = ucfirst(strtolower($genre));
2403
		}
2404
		return $genre_fmt;
2405
	}
2406
 
149 jpm 2407
	private function repererEspace($nom_sci) {
2408
		$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
2409
		return $nom_sci;
20 jpm 2410
	}
2411
 
64 jpm 2412
	private function construireSuffixeNomPltCultivee(&$nom) {
20 jpm 2413
		$suffixe = array();
2414
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
2415
		$suffixe[] = $this->construireNomCommercial($nom);
2416
		$suffixe[] = $this->construireNomCultivar($nom);
2417
		$suffixe = array_filter($suffixe);
2418
		return implode(' ', $suffixe);
2419
	}
2420
 
64 jpm 2421
	private function construireNomCultivarGroupe(&$nom) {
20 jpm 2422
		$nom_groupe_cultivar = '';
2423
		if ($nom['cultivar_groupe'] != '') {
2424
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
2425
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
2426
			} else {
2427
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
2428
			}
2429
		}
2430
		return $nom_groupe_cultivar;
2431
	}
2432
 
64 jpm 2433
	private function construireNomCommercial(&$nom) {
20 jpm 2434
		$nom_commercial = '';
2435
		if ($nom['nom_commercial'] != '') {
2436
			$nom_commercial =  strtoupper($nom['nom_commercial']);
2437
		}
2438
		return $nom_commercial;
2439
	}
2440
 
64 jpm 2441
	private function construireNomCultivar(&$nom) {
20 jpm 2442
		$nom_cultivar = '';
2443
		if ($nom['cultivar'] != '') {
2444
			$nom_cultivar =  "'".$nom['cultivar']."'";
2445
		}
2446
		return $nom_cultivar;
2447
	}
2448
 
64 jpm 2449
	private function classerNomsParNomComplet() {
20 jpm 2450
		$noms_classes = array();
64 jpm 2451
		foreach ($this->noms as &$nom) {
149 jpm 2452
			if (!isset($noms_classes[$nom['nom_sci']])) {
2453
				$noms_classes[$nom['nom_sci']] = 1;
20 jpm 2454
			} else {
149 jpm 2455
				$noms_classes[$nom['nom_sci']]++;
20 jpm 2456
			}
2457
		}
2458
		return $noms_classes;
2459
	}
2460
 
2461
}
2462
?>