Subversion Repositories Applications.referentiel

Rev

Rev 45 | Rev 64 | 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) {
51 jpm 1205
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
1206
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
1207
 
20 jpm 1208
			if (isset($champs_presents[$champ_attendu_nom])) {
1209
				$champs_present_type = $champs_presents[$champ_attendu_nom];
1210
 
1211
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
1212
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
1213
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
1214
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
1215
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
1216
				}
1217
			}
1218
		}
1219
 
1220
		// Analyse des résultats
1221
		if (count($champs_erreur) > 0) {
1222
			$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
1223
		} else {
1224
			$info['resultat'] = true;
1225
		}
1226
 
30 jpm 1227
		$this->traiterResultatTest($info);
20 jpm 1228
	}
1229
 
1230
	private function testerTailleDesChamps($colonnes, $analyses) {
30 jpm 1231
		$info = array('nom' => 'Structure -> champs tronqués',
45 jpm 1232
			'description' => "Vérifie que le risque éventuel que des données de type texte insérées ".
1233
				"dans la table aient pu être tronquées lors de leur insertion.\n".
1234
				"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
1235
				"sur un problème éventuel.",
20 jpm 1236
			'resultat' => false);
1237
 
1238
		$tailles_champs_maxi = array();
1239
		foreach ($colonnes as $colonne) {
1240
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
1241
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
1242
			}
1243
		}
1244
 
1245
		$tailles_trouvees = array();
1246
		foreach ($analyses as $analyse) {
1247
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
1248
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
1249
			}
1250
		}
1251
 
1252
		$champs_erreur = array();
1253
		$champs_attendus = explode(',', $this->manuel['champs']);
1254
		foreach ($champs_attendus as $champ_attendu) {
1255
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
1256
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
1257
					$champs_erreur[] = $champ_attendu;
1258
				}
1259
			}
1260
		}
1261
 
1262
		// Analyse des résultats
1263
		if (count($champs_erreur) > 0) {
1264
			$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
1265
		} else {
1266
			$info['resultat'] = true;
1267
		}
1268
 
30 jpm 1269
		$this->traiterResultatTest($info);
20 jpm 1270
	}
1271
 
1272
	private function testerNumNomClePrimaire($colonnes) {
30 jpm 1273
		$info = array('nom' => 'Structure -> num_nom est clé primaire',
20 jpm 1274
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
1275
			'resultat' => false);
1276
 
1277
		foreach ($colonnes as $colonne) {
1278
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
1279
				$info['resultat'] = true;
1280
			}
1281
		}
1282
 
30 jpm 1283
		$this->traiterResultatTest($info);
20 jpm 1284
	}
1285
 
1286
	private function testerNumNomSuperieurAZero($noms) {
30 jpm 1287
		$info = array('nom' => 'num_nom -> supérieur à 0',
20 jpm 1288
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
1289
			'resultat' => false);
1290
 
1291
		// Réalisation du test
1292
		$noms_erreur = array();
1293
		foreach ($noms as $nom) {
1294
			if ($nom['num_nom'] <= 0) {
1295
				$noms_erreur[] = $nom['num_nom'];
1296
			}
1297
		}
1298
 
1299
		// Analyse des résultats
1300
		if (count($noms_erreur) > 0) {
1301
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
1302
		} else {
1303
			$info['resultat'] = true;
1304
		}
1305
 
30 jpm 1306
		$this->traiterResultatTest($info);
20 jpm 1307
	}
1308
 
1309
	private function testerNumNomRetenuSuperieurAZero($noms) {
30 jpm 1310
		$info = array('nom' => 'num_nom_retenu -> supérieur à 0',
42 jpm 1311
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
20 jpm 1312
			'resultat' => false);
1313
 
1314
		// Réalisation du test
1315
		$noms_erreur = array();
1316
		foreach ($noms as $nom) {
42 jpm 1317
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
20 jpm 1318
				$noms_erreur[] = $nom['num_nom'];
1319
			}
1320
		}
1321
 
1322
		// Analyse des résultats
1323
		if (count($noms_erreur) > 0) {
1324
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
1325
		} else {
1326
			$info['resultat'] = true;
1327
		}
1328
 
30 jpm 1329
		$this->traiterResultatTest($info);
20 jpm 1330
	}
1331
 
1332
	private function testerNumTaxSupEgalZeroUnique($noms) {
30 jpm 1333
		$info = array('nom' => 'num_tax_sup -> égal à 0 unique',
20 jpm 1334
			'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification.",
1335
			'resultat' => false);
1336
 
1337
		// Réalisation du test
1338
		$noms_erreur = array();
1339
		foreach ($noms as $nom) {
1340
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
1341
				$noms_erreur[] = $nom['num_nom'];
1342
			}
1343
		}
1344
 
1345
		// Analyse des résultats
1346
		if (count($noms_erreur) > 1) {
1347
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
1348
		} else {
1349
			$info['resultat'] = true;
1350
		}
1351
 
30 jpm 1352
		$this->traiterResultatTest($info);
20 jpm 1353
	}
1354
 
1355
	private function testerTaxSupPourTaxon($noms) {
30 jpm 1356
		$info = array('nom' => 'Classification -> uniquement pour les taxons',
43 jpm 1357
			'description' => "Seul les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.\n".
1358
				"Si num_nom_retenu est différent de num_nom (= nom synonyme) alors num_tax_sup doit être vide.",
20 jpm 1359
			'resultat' => false);
1360
 
1361
		// Réalisation du test
1362
		$noms_erreur = array();
1363
		foreach ($noms as $nom) {
43 jpm 1364
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
20 jpm 1365
				$noms_erreur[] = $nom['num_nom'];
1366
			}
1367
		}
1368
 
1369
		// Analyse des résultats
1370
		if (count($noms_erreur) > 0) {
1371
			$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).'.';
1372
		} else {
1373
			$info['resultat'] = true;
1374
		}
1375
 
30 jpm 1376
		$this->traiterResultatTest($info);
20 jpm 1377
	}
1378
 
1379
	private function testerExitenceTaxonSuperieur($noms) {
30 jpm 1380
		$info = array('nom' => 'Classification -> existence du taxon supérieur',
20 jpm 1381
			'description' => "Pour chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
1382
			'resultat' => false);
1383
 
1384
		// Réalisation du test
1385
		$noms_erreur = array();
1386
		foreach ($noms as $nom) {
1387
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1388
				if ($nom['num_tax_sup'] != 0 && !isset($noms[$nom['num_tax_sup']])) {
1389
					$noms_erreur[] = $nom['num_nom'];
1390
				}
1391
			}
1392
		}
1393
 
1394
		// Analyse des résultats
1395
		if (count($noms_erreur) > 0) {
1396
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
1397
		} else {
1398
			$info['resultat'] = true;
1399
		}
1400
 
30 jpm 1401
		$this->traiterResultatTest($info);
20 jpm 1402
	}
1403
 
1404
	private function testerClassificationRang($noms) {
30 jpm 1405
		$info = array('nom' => 'Classification -> taxon supérieur avec rang inférieur',
20 jpm 1406
			'description' => "Pour chaque enregistrement représentant un taxon, chaque taxon supérieur doit avoir un rang inférieur au taxon courant.",
1407
			'resultat' => false);
1408
 
1409
		// Réalisation du test
1410
		$noms_erreur = array();
1411
		foreach ($noms as $nom) {
1412
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1413
				if (isset($noms[$nom['num_tax_sup']])) {
1414
					$nom_sup = $noms[$nom['num_tax_sup']];
1415
					if ($nom_sup['rang'] > $nom['rang']) {
1416
						$noms_erreur[] = $nom['num_nom'];
1417
					}
1418
				}
1419
			}
1420
		}
1421
 
1422
		// Analyse des résultats
1423
		if (count($noms_erreur) > 0) {
1424
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
1425
		} else {
1426
			$info['resultat'] = true;
1427
		}
1428
 
30 jpm 1429
		$this->traiterResultatTest($info);
20 jpm 1430
	}
1431
 
1432
	private function testerClassification($noms) {
30 jpm 1433
		$info = array('nom' => 'Classification -> racine liée à chaque noeud',
20 jpm 1434
			'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.",
1435
			'resultat' => false);
1436
 
1437
		// Réalisation du test
1438
		$noms_erreur = array();
1439
		foreach ($noms as $nom) {
1440
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1441
				$classif_ok = $this->remonterClassif($noms, $nom);
1442
				if ($classif_ok === false) {
1443
					$noms_erreur[] = $nom['num_nom'];
1444
				}
1445
			}
1446
		}
1447
 
1448
		// Analyse des résultats
1449
		if (count($noms_erreur) > 0) {
1450
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
1451
		} else {
1452
			$info['resultat'] = true;
1453
		}
1454
 
30 jpm 1455
		$this->traiterResultatTest($info);
20 jpm 1456
	}
1457
 
1458
	private function remonterClassif(&$noms, $nom) {
1459
		if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
1460
			return true;
1461
		} else if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
1462
			return false;
1463
		} else {
1464
			return $this->remonterClassif($noms, $noms[$nom['num_tax_sup']]);
1465
		}
1466
	}
1467
 
1468
	private function testerRang($noms) {
30 jpm 1469
		$info = array('nom' => 'rang',
20 jpm 1470
			'description' => "Le rang doit correspondre à un valeur numérique définit dans le manuel.",
1471
			'resultat' => false);
1472
 
1473
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
1474
 
1475
		// Réalisation du test
1476
		$noms_erreur = array();
1477
		foreach ($noms as $nom) {
1478
			if (!isset($rangs[$nom['rang']])) {
1479
				$noms_erreur[] = $nom['num_nom'];
1480
			}
1481
		}
1482
 
1483
		// Analyse des résultats
1484
		if (count($noms_erreur) > 0) {
1485
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
1486
		} else {
1487
			$info['resultat'] = true;
1488
		}
1489
 
30 jpm 1490
		$this->traiterResultatTest($info);
20 jpm 1491
	}
1492
 
1493
	private function testerNomCompletSupraGenerique($noms) {
30 jpm 1494
		$info = array('nom' => 'nom_complet -> noms supra-génériques',
20 jpm 1495
			'description' => "Si le rang est < à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ nom_supra_generique. ".
1496
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1497
			'resultat' => false);
1498
 
1499
		// Réalisation du test
1500
		$noms_erreur = array();
1501
		foreach ($noms as $nom) {
1502
			if ($nom['rang'] < $this->manuel['rang_genre']) {
1503
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1504
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
1505
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1506
				if ($nom['nom_complet'] != $nom_complet_ideal) {
1507
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
1508
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
1509
				}
1510
			}
1511
		}
1512
 
1513
		// Analyse des résultats
1514
		if (count($noms_erreur) > 0) {
1515
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
1516
			$info['message']['lignes'] = $noms_erreur;
1517
		} else {
1518
			$info['resultat'] = true;
1519
		}
1520
 
30 jpm 1521
		$this->traiterResultatTest($info);
20 jpm 1522
	}
1523
 
1524
	private function testerNomCompletGenre($noms) {
30 jpm 1525
		$info = array('nom' => 'nom_complet -> noms de genres',
20 jpm 1526
			'description' => "Si le rang est = à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ genre. ".
1527
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1528
			'resultat' => false);
1529
 
1530
		// Réalisation du test
1531
		$noms_erreur = array();
1532
		foreach ($noms as $nom) {
1533
			if ($nom['rang'] == $this->manuel['rang_genre']) {
1534
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1535
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
1536
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1537
				if ($nom['nom_complet'] != $nom_complet_ideal) {
1538
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
1539
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
1540
				}
1541
			}
1542
		}
1543
 
1544
		// Analyse des résultats
1545
		if (count($noms_erreur) > 0) {
1546
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
1547
			$info['message']['lignes'] = $noms_erreur;
1548
		} else {
1549
			$info['resultat'] = true;
1550
		}
1551
 
30 jpm 1552
		$this->traiterResultatTest($info);
20 jpm 1553
	}
1554
 
1555
	private function testerNomCompletInfraGenre($noms) {
30 jpm 1556
		$info = array('nom' => 'nom_complet -> noms infra-génériques',
20 jpm 1557
			'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']} le nom_complet doit correspondre à une des formules suivantes : \n".
1558
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
1559
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
1560
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1561
			'resultat' => false);
1562
 
1563
		// Réalisation du test
1564
		$noms_erreur = array();
1565
		foreach ($noms as $nom) {
1566
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
1567
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1568
				$nom_complet_ideal = '';
1569
				if ($nom['type_epithete'] == 'agg.') {
1570
					$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
1571
					$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1572
					$nom_complet_ideal .= ' '.$nom['type_epithete'];
1573
				} else {
1574
					$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
1575
					$nom_complet_ideal .= ' '.$nom['type_epithete'];
1576
					$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1577
				}
1578
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1579
				if ($nom['nom_complet'] != $nom_complet_ideal) {
1580
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
1581
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
1582
				}
1583
			}
1584
		}
1585
 
1586
		// Analyse des résultats
1587
		if (count($noms_erreur) > 0) {
1588
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
1589
			$info['message']['lignes'] = $noms_erreur;
1590
		} else {
1591
			$info['resultat'] = true;
1592
		}
1593
 
30 jpm 1594
		$this->traiterResultatTest($info);
20 jpm 1595
	}
1596
 
1597
	private function testerNomCompletEspece($noms) {
30 jpm 1598
		$info = array('nom' => "nom_complet -> noms d'espèce",
20 jpm 1599
			'description' => "Si le rang est = à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
1600
				" genre + ' ' + epithete_sp \n".
1601
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1602
			'resultat' => false);
1603
 
1604
		// Réalisation du test
1605
		$noms_erreur = array();
1606
		foreach ($noms as $nom) {
1607
			if ($nom['rang'] == $this->manuel['rang_sp']) {
1608
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1609
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
1610
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
1611
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1612
				if ($nom['nom_complet'] != $nom_complet_ideal) {
1613
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
1614
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
1615
				}
1616
			}
1617
		}
1618
 
1619
		// Analyse des résultats
1620
		if (count($noms_erreur) > 0) {
1621
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
1622
			$info['message']['lignes'] = $noms_erreur;
1623
		} else {
1624
			$info['resultat'] = true;
1625
		}
1626
 
30 jpm 1627
		$this->traiterResultatTest($info);
20 jpm 1628
	}
1629
 
1630
	private function testerNomCompletInfraSpecifique($noms) {
30 jpm 1631
		$info = array('nom' => 'nom_complet -> noms infra-spécifiques',
20 jpm 1632
			'description' => "Si le rang est > à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
1633
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".
1634
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1635
			'resultat' => false);
1636
 
1637
		// Réalisation du test
1638
		$noms_erreur = array();
1639
		foreach ($noms as $nom) {
1640
			if ($nom['rang'] > $this->manuel['rang_sp']) {
1641
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1642
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
1643
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
1644
				$nom_complet_ideal .= ' '.strtolower($nom['type_epithete']);
1645
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
1646
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1647
				if ($nom['nom_complet'] != $nom_complet_ideal) {
1648
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
1649
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
1650
				}
1651
			}
1652
		}
1653
 
1654
		// Analyse des résultats
1655
		if (count($noms_erreur) > 0) {
1656
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
1657
			$info['message']['lignes'] = $noms_erreur;
1658
		} else {
1659
			$info['resultat'] = true;
1660
		}
1661
 
30 jpm 1662
		$this->traiterResultatTest($info);
20 jpm 1663
	}
1664
 
1665
	private function testerNomSupraGeneriqueEspaces($noms) {
30 jpm 1666
		$info = array('nom' => 'nom_supra_generique -> espaces en trop',
20 jpm 1667
			'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou aprés le nom.",
1668
			'resultat' => false);
1669
 
1670
		// Réalisation du test
1671
		$noms_erreur = array();
1672
		foreach ($noms as $nom) {
1673
			if ($nom['nom_supra_generique'] != '') {
1674
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
1675
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1676
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1677
				}
1678
			}
1679
		}
1680
 
1681
		// Analyse des résultats
1682
		if (count($noms_erreur) > 0) {
1683
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1684
			$info['message']['lignes'] = $noms_erreur;
1685
		} else {
1686
			$info['resultat'] = true;
1687
		}
1688
 
30 jpm 1689
		$this->traiterResultatTest($info);
20 jpm 1690
	}
1691
 
1692
	private function testerNomSupraGeneriqueSyntaxe($noms) {
30 jpm 1693
		$info = array('nom' => 'nom_supra_generique -> syntaxe',
20 jpm 1694
			'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
1695
				"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
1696
			'resultat' => false);
1697
 
1698
		// Réalisation du test
1699
		$noms_erreur = array();
1700
		foreach ($noms as $nom) {
1701
			if ($nom['nom_supra_generique'] != '') {
1702
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
1703
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1704
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1705
				}
1706
			}
1707
		}
1708
 
1709
		// Analyse des résultats
1710
		if (count($noms_erreur) > 0) {
1711
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1712
			$info['message']['lignes'] = $noms_erreur;
1713
		} else {
1714
			$info['resultat'] = true;
1715
		}
1716
 
30 jpm 1717
		$this->traiterResultatTest($info);
20 jpm 1718
	}
1719
 
1720
	private function testerNomSupraGeneriqueRang($noms) {
30 jpm 1721
		$info = array('nom' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
20 jpm 1722
			'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$this->manuel['rang_genre']}.",
1723
			'resultat' => false);
1724
 
1725
		// Réalisation du test
1726
		$noms_erreur = array();
1727
		foreach ($noms as $nom) {
1728
			if ($nom['nom_supra_generique'] != '') {
1729
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
1730
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
1731
				}
1732
			}
1733
		}
1734
 
1735
		// Analyse des résultats
1736
		if (count($noms_erreur) > 0) {
1737
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
1738
			$info['message']['lignes'] = $noms_erreur;
1739
		} else {
1740
			$info['resultat'] = true;
1741
		}
1742
 
30 jpm 1743
		$this->traiterResultatTest($info);
20 jpm 1744
	}
1745
 
1746
	private function testerGenreEspaces($noms) {
30 jpm 1747
		$info = array('nom' => 'genre -> espaces en trop',
20 jpm 1748
			'description' => "Le champ genre ne doit pas contenir d'espace avant ou aprés le nom.\n".
1749
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
1750
			'resultat' => false);
1751
 
1752
		// Réalisation du test
1753
		$noms_erreur = array();
1754
		foreach ($noms as $nom) {
1755
			if ($nom['genre'] != '') {
1756
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
1757
					$nom_traite = $this->repererEspace($nom['genre']);
1758
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1759
				}
1760
			}
1761
		}
1762
 
1763
		// Analyse des résultats
1764
		if (count($noms_erreur) > 0) {
1765
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1766
			$info['message']['lignes'] = $noms_erreur;
1767
		} else {
1768
			$info['resultat'] = true;
1769
		}
1770
 
30 jpm 1771
		$this->traiterResultatTest($info);
20 jpm 1772
	}
1773
 
1774
	private function testerGenreSyntaxe($noms) {
30 jpm 1775
		$info = array('nom' => 'genre -> syntaxe',
20 jpm 1776
			'description' => "Le champ genre peut contenir :\n".
1777
			 	" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
1778
				"	Il commence par une lettre majuscule (avec ou sans tréma).".
1779
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
1780
				" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés entre eux \n".
1781
				"	par la lettre x entourée de caractères espaces.",
1782
			'resultat' => false);
1783
 
1784
		// Réalisation du test
1785
		$noms_erreur = array();
1786
		foreach ($noms as $nom) {
1787
			if ($nom['genre'] != '') {
1788
				$mots = explode(' ', $nom['genre']);
1789
				foreach ($mots as $mot) {
1790
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
1791
						$nom_traite = $this->repererEspace($nom['genre']);
1792
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1793
					}
1794
				}
1795
			}
1796
		}
1797
 
1798
		// Analyse des résultats
1799
		if (count($noms_erreur) > 0) {
1800
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1801
			$info['message']['lignes'] = $noms_erreur;
1802
		} else {
1803
			$info['resultat'] = true;
1804
		}
1805
 
30 jpm 1806
		$this->traiterResultatTest($info);
20 jpm 1807
	}
1808
 
1809
	private function testerGenreRang($noms) {
30 jpm 1810
		$info = array('nom' => "genre -> rang >= {$this->manuel['rang_genre']}",
20 jpm 1811
			'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
1812
			'resultat' => false);
1813
 
1814
		// Réalisation du test
1815
		$noms_erreur = array();
1816
		foreach ($noms as $nom) {
1817
			if ($nom['genre'] != '') {
1818
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1819
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
1820
				}
1821
			}
1822
		}
1823
 
1824
		// Analyse des résultats
1825
		if (count($noms_erreur) > 0) {
1826
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
1827
			$info['message']['lignes'] = $noms_erreur;
1828
		} else {
1829
			$info['resultat'] = true;
1830
		}
1831
 
30 jpm 1832
		$this->traiterResultatTest($info);
20 jpm 1833
	}
1834
 
1835
	private function testerEpitheteInfraGeneriqueSyntaxe($noms) {
30 jpm 1836
		$info = array('nom' => 'epithete_infra_generique -> syntaxe',
20 jpm 1837
			'description' => "Le champ epithete_infra_generique est composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
1838
				"La première lettre (avec ou sans tréma) doit être en majuscule.",
1839
			'resultat' => false);
1840
 
1841
		// Réalisation du test
1842
		$noms_erreur = array();
1843
		foreach ($noms as $nom) {
1844
			if ($nom['epithete_infra_generique'] != '') {
1845
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1846
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1847
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1848
				}
1849
			}
1850
		}
1851
 
1852
		// Analyse des résultats
1853
		if (count($noms_erreur) > 0) {
1854
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1855
			$info['message']['lignes'] = $noms_erreur;
1856
		} else {
1857
			$info['resultat'] = true;
1858
		}
1859
 
30 jpm 1860
		$this->traiterResultatTest($info);
20 jpm 1861
	}
1862
 
1863
	private function testerEpitheteInfraGeneriqueRang($noms) {
30 jpm 1864
		$info = array('nom' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
20 jpm 1865
			'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris \n".
1866
				"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
1867
			'resultat' => false);
1868
 
1869
		// Réalisation du test
1870
		$noms_erreur = array();
1871
		foreach ($noms as $nom) {
1872
			if ($nom['epithete_infra_generique'] != '') {
1873
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
1874
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
1875
				}
1876
			}
1877
		}
1878
 
1879
		// Analyse des résultats
1880
		if (count($noms_erreur) > 0) {
1881
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
1882
			$info['message']['lignes'] = $noms_erreur;
1883
		} else {
1884
			$info['resultat'] = true;
1885
		}
1886
 
30 jpm 1887
		$this->traiterResultatTest($info);
20 jpm 1888
	}
1889
 
1890
	private function testerEpitheteInfraGeneriqueEspaces($noms) {
30 jpm 1891
		$info = array('nom' => 'epithete_infra_generique -> espaces en trop',
20 jpm 1892
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou aprés sa valeur.",
1893
			'resultat' => false);
1894
 
1895
		// Réalisation du test
1896
		$noms_erreur = array();
1897
		foreach ($noms as $nom) {
1898
			if ($nom['epithete_infra_generique'] != '') {
1899
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
1900
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1901
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1902
				}
1903
			}
1904
		}
1905
 
1906
		// Analyse des résultats
1907
		if (count($noms_erreur) > 0) {
1908
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1909
			$info['message']['lignes'] = $noms_erreur;
1910
		} else {
1911
			$info['resultat'] = true;
1912
		}
1913
 
30 jpm 1914
		$this->traiterResultatTest($info);
20 jpm 1915
	}
1916
 
1917
	private function testerEpitheteSpEspaces($noms) {
30 jpm 1918
		$info = array('nom' => 'epithete_sp -> espaces en trop',
20 jpm 1919
			'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
1920
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
1921
			'resultat' => false);
1922
 
1923
		// Réalisation du test
1924
		$noms_erreur = array();
1925
		foreach ($noms as $nom) {
1926
			if ($nom['epithete_sp'] != '') {
1927
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
1928
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
1929
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1930
				}
1931
			}
1932
		}
1933
 
1934
		// Analyse des résultats
1935
		if (count($noms_erreur) > 0) {
1936
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
1937
			$info['message']['lignes'] = $noms_erreur;
1938
		} else {
1939
			$info['resultat'] = true;
1940
		}
1941
 
30 jpm 1942
		$this->traiterResultatTest($info);
20 jpm 1943
	}
1944
 
1945
	private function testerEpitheteSpSyntaxe($noms) {
30 jpm 1946
		$info = array('nom' => 'epithete_sp -> syntaxe',
20 jpm 1947
			'description' => "Le champ epithete_sp peut contenir :\n".
1948
			 	" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
1949
				"	Il commence par une lettre minuscule [a-zëï].\n".
1950
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
1951
				" - 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".
1952
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) séparés entre eux \n".
1953
				"	par la lettre x entourée de caractères espaces.",
1954
			'resultat' => false);
1955
 
1956
		// Réalisation du test
1957
		$noms_erreur = array();
1958
		foreach ($noms as $nom) {
1959
			if ($nom['epithete_sp'] != '') {
1960
				$mots = explode(' ', $nom['epithete_sp']);
1961
				foreach ($mots as $mot) {
1962
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
1963
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
1964
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1965
					}
1966
				}
1967
			}
1968
		}
1969
 
1970
		// Analyse des résultats
1971
		if (count($noms_erreur) > 0) {
1972
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
1973
			$info['message']['lignes'] = $noms_erreur;
1974
		} else {
1975
			$info['resultat'] = true;
1976
		}
1977
 
30 jpm 1978
		$this->traiterResultatTest($info);
20 jpm 1979
	}
1980
 
1981
	private function testerEpitheteSpRang($noms) {
30 jpm 1982
		$info = array('nom' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
20 jpm 1983
			'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']}.",
1984
			'resultat' => false);
1985
 
1986
		// Réalisation du test
1987
		$noms_erreur = array();
1988
		foreach ($noms as $nom) {
1989
			if ($nom['epithete_sp'] != '') {
1990
				if ($nom['rang'] < $this->manuel['rang_sp']) {
1991
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
1992
				}
1993
			}
1994
		}
1995
 
1996
		// Analyse des résultats
1997
		if (count($noms_erreur) > 0) {
1998
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
1999
			$info['message']['lignes'] = $noms_erreur;
2000
		} else {
2001
			$info['resultat'] = true;
2002
		}
2003
 
30 jpm 2004
		$this->traiterResultatTest($info);
20 jpm 2005
	}
2006
 
2007
	//+--------------------------------------------------------------------------------------------------------------+//
2008
	// MÉTHODES COMMUNES aux TESTS
2009
 
2010
	private function verifierPresence($valeur) {
2011
		$codes = $this->manuel['codes_presence'];
2012
		$ok = $this->verifierStatuts($valeur, $codes);
2013
		return $ok;
2014
	}
2015
 
2016
	private function verifierStatutOrigine($valeur) {
2017
		$codes = $this->manuel['codes_statuts_origine'];
2018
		$ok = $this->verifierStatuts($valeur, $codes);
2019
		return $ok;
2020
	}
2021
 
2022
	private function verifierStatutIntroduction($valeur) {
2023
		$codes = $this->manuel['codes_statuts_introduction'];
2024
		$ok = $this->verifierStatuts($valeur, $codes);
2025
		return $ok;
2026
	}
2027
 
2028
	private function verifierStatutCulture($valeur) {
2029
		$codes = $this->manuel['codes_statuts_culture'];
2030
		$ok = $this->verifierStatuts($valeur, $codes);
2031
		return $ok;
2032
	}
2033
 
2034
	private function verifierStatuts($valeur, $codes) {
2035
		$ok = true;
2036
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
2037
			$ok = false;
2038
		}
2039
		return $ok;
2040
	}
2041
 
2042
	private function verifierBooleen($valeur) {
2043
		$ok = true;
2044
		if (!preg_match('/^1$/', $valeur)) {
2045
			$ok = false;
2046
		}
2047
		return $ok;
2048
	}
2049
 
2050
	private function verifierNombre($valeur) {
2051
		$ok = true;
2052
		if (!preg_match('/^[0-9]+$/', $valeur)) {
2053
			$ok = false;
2054
		}
2055
		return $ok;
2056
	}
2057
 
2058
	private function verifierNombreSuite($valeur) {
2059
		$ok = true;
2060
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
2061
			$ok = false;
2062
		}
2063
		return $ok;
2064
	}
2065
 
2066
	private function verifierTypeEpithete($type) {
2067
		$ok = false;
2068
		$rejetes = $this->manuel['type_epithete_rejetes'];
2069
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
2070
			$ok = false;
2071
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
2072
			$ok = true;
2073
		}
2074
		return $ok;
2075
	}
2076
 
2077
	private function verifierBiblioOrigine($intitule) {
2078
		$ok = true;
2079
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2080
			$ok = false;// Contient des espaces en trop
2081
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
2082
			$ok = false;
2083
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
2084
			$ok = false;// Contient une mauvaise suite de caractères
2085
		}
2086
		return $ok;
2087
	}
2088
 
2089
	private function verifierAnnee($annee) {
2090
		$ok = true;
2091
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
2092
			$ok = false;
2093
		} else if ($annee < 1753) {
2094
			$ok = false;
2095
		}
2096
		return $ok;
2097
	}
2098
 
2099
	private function verifierAuteur($intitule) {
2100
		$ok = true;
2101
		$acceptes = $this->manuel['auteur_acceptes'];
2102
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
2103
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2104
				$ok = false;// Contient des espaces en trop
2105
			} else {
2106
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
2107
				$mots = explode(' ', $intitule);
2108
				foreach ($mots as $position => $mot) {
2109
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2110
						$ok = false;// Mot rejeté
2111
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
2112
						continue;// Mot de l'intitulé auteur
2113
					} else {
2114
						$ok = false;
2115
					}
2116
				}
2117
			}
2118
		}
2119
		return $ok;
2120
	}
2121
 
2122
	private function verifierNomCommercial($epithete) {
2123
		$ok = false;
2124
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
2125
			$ok = true;
2126
		}
2127
		return $ok;
2128
	}
2129
 
2130
	private function verifierEpitheteCultivar($epithete) {
2131
		$ok = true;
2132
		$acceptes = $this->manuel['cultivar_acceptes'];
2133
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2134
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2135
				$ok = false;// Contient des espaces en trop
2136
			} else {
2137
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
2138
				$mots_mineurs = $this->manuel['mots_mineurs'];
2139
				$mots = explode(' ', $epithete);
2140
				foreach ($mots as $position => $mot) {
2141
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2142
						$ok = false;// Mot rejeté
2143
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2144
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2145
					} else {
2146
						$mots_tiret = explode('-', $mot);
2147
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2148
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2149
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
2150
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2151
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
2152
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2153
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2154
							} else {
2155
								$ok = false;
2156
							}
2157
						}
2158
					}
2159
				}
2160
			}
2161
		}
2162
		return $ok;
2163
	}
2164
 
2165
	private function verifierEpitheteGroupeCultivar($epithete) {
2166
		$ok = true;
2167
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
2168
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2169
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2170
				$ok = false;// Contient des espaces en trop
2171
			} else {
2172
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
2173
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
2174
				$mots_mineurs = $this->manuel['mots_mineurs'];
2175
				$mots = explode(' ', $epithete);
2176
				foreach ($mots as $position => $mot) {
2177
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
2178
						continue;// Mot accepté
2179
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2180
						$ok = false;// Mot rejeté
2181
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2182
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2183
					} else {
2184
						$mots_tiret = explode('-', $mot);
2185
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2186
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2187
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
2188
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2189
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
2190
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2191
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2192
							} else {
2193
								$ok = false;
2194
							}
2195
						}
2196
					}
2197
				}
2198
			}
2199
		}
2200
		return $ok;
2201
	}
2202
 
2203
	private function verifierEpitheteSp($epithete) {
2204
		$ok = false;
2205
		if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
2206
			$ok = true;
2207
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
2208
			$ok = true;
2209
		}
2210
		return $ok;
2211
	}
2212
 
2213
	private function verifierEpitheteGenre($epithete) {
2214
		$ok = false;
2215
		if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
2216
			$ok = true;
2217
		}
2218
		return $ok;
2219
	}
2220
 
2221
	private function formaterStyleNomGenre($genre) {
2222
		$genre_fmt = '';
2223
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
2224
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
2225
		} else {
2226
			$genre_fmt = ucfirst(strtolower($genre));
2227
		}
2228
		return $genre_fmt;
2229
	}
2230
 
2231
	private function repererEspace($nom_complet) {
2232
		$nom_complet = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_complet);
2233
		return $nom_complet;
2234
	}
2235
 
2236
	private function construireSuffixeNomPltCultivee($nom) {
2237
		$suffixe = array();
2238
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
2239
		$suffixe[] = $this->construireNomCommercial($nom);
2240
		$suffixe[] = $this->construireNomCultivar($nom);
2241
		$suffixe = array_filter($suffixe);
2242
		return implode(' ', $suffixe);
2243
	}
2244
 
2245
	private function construireNomCultivarGroupe($nom) {
2246
		$nom_groupe_cultivar = '';
2247
		if ($nom['cultivar_groupe'] != '') {
2248
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
2249
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
2250
			} else {
2251
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
2252
			}
2253
		}
2254
		return $nom_groupe_cultivar;
2255
	}
2256
 
2257
	private function construireNomCommercial($nom) {
2258
		$nom_commercial = '';
2259
		if ($nom['nom_commercial'] != '') {
2260
			$nom_commercial =  strtoupper($nom['nom_commercial']);
2261
		}
2262
		return $nom_commercial;
2263
	}
2264
 
2265
	private function construireNomCultivar($nom) {
2266
		$nom_cultivar = '';
2267
		if ($nom['cultivar'] != '') {
2268
			$nom_cultivar =  "'".$nom['cultivar']."'";
2269
		}
2270
		return $nom_cultivar;
2271
	}
2272
 
2273
	private function classerNomsParNumNom($noms) {
2274
		$noms_classes = array();
2275
		foreach ($noms as $nom) {
2276
			$noms_classes[$nom['num_nom']] = $nom;
2277
		}
2278
		return $noms_classes;
2279
	}
2280
 
2281
	private function classerNomsParNomComplet($noms) {
2282
		$noms_classes = array();
2283
		foreach ($noms as $nom) {
2284
			if (!isset($noms_classes[$nom['nom_complet']])) {
2285
				$noms_classes[$nom['nom_complet']] = 1;
2286
			} else {
2287
				$noms_classes[$nom['nom_complet']]++;
2288
			}
2289
		}
2290
		return $noms_classes;
2291
	}
2292
 
2293
}
2294
?>