Subversion Repositories Applications.referentiel

Rev

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

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