Subversion Repositories Applications.referentiel

Rev

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