Subversion Repositories Applications.referentiel

Rev

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