Subversion Repositories Applications.referentiel

Rev

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

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