Subversion Repositories Applications.referentiel

Rev

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

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