Subversion Repositories Applications.referentiel

Rev

Rev 38 | Rev 43 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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