Subversion Repositories Applications.referentiel

Rev

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

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