Subversion Repositories Applications.referentiel

Rev

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

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