Subversion Repositories Applications.referentiel

Rev

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

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