Subversion Repositories Applications.referentiel

Rev

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

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