Subversion Repositories Applications.referentiel

Rev

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