Subversion Repositories Applications.referentiel

Rev

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