Subversion Repositories Applications.referentiel

Rev

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

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