Subversion Repositories Applications.referentiel

Rev

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

Rev 161 Rev 163
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 «-» 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
			" - Cette première lettre peut être 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 «-» 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
			" - Cette première lettre peut être 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 «-» 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
			" - Cette première lettre peut être 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 «-» 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
			" - Cette première lettre peut être 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 du champ ".
336
			"num_nom.",
336
			"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 du champ ".
394
			"num_nom.",
394
			"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 à une valeur du champ ".
450
			'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
451
			"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 nombre 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
			" - un nombre ou une valeur vide.\n",
685
								" - une valeur vide,\n".
-
 
686
								" - un nombre.",
686
			'resultat' => false);
687
			'resultat' => false);
687
		
688
		
688
		// Réalisation du test
689
		// Réalisation du test
689
		$noms_erreur = array();
690
		$noms_erreur = array();
690
		foreach ($this->noms as &$nom) {
691
		foreach ($this->noms as &$nom) {
691
			if ($nom['basionyme'] != '') {
692
			if ($nom['basionyme'] != '') {
692
				if (!$this->verifierNombre($nom['basionyme'])) {
693
				if (!$this->verifierNombre($nom['basionyme'])) {
693
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
694
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
694
				}
695
				}
695
			}
696
			}
696
		}
697
		}
697
		
698
		
698
		// Analyse des résultats
699
		// Analyse des résultats
699
		if (count($noms_erreur) > 0) {
700
		if (count($noms_erreur) > 0) {
700
			$info['message']['entete'] = array('num_nom', 'basionyme erroné');
701
			$info['message']['entete'] = array('num_nom', 'basionyme erroné');
701
			$info['message']['lignes'] = $noms_erreur;
702
			$info['message']['lignes'] = $noms_erreur;
702
		} else {
703
		} else {
703
			$info['resultat'] = true;
704
			$info['resultat'] = true;
704
		}
705
		}
705
		$noms_erreur = null;
706
		$noms_erreur = null;
706
		
707
		
707
		$this->traiterResultatTest($info);
708
		$this->traiterResultatTest($info);
708
	}
709
	}
709
	
710
	
710
	private function testerHomonymieExistence() {
711
	private function testerHomonymieExistence() {
711
		$info = array('nom' => 'homonyme -> existence',
712
		$info = array('nom' => 'homonyme -> existence',
712
			'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 ".
713
			"dans le champ nom_sci.",
714
			"dans le champ nom_sci.",
714
			'resultat' => false);
715
			'resultat' => false);
715
		
716
		
716
		$noms_homonymie = $this->classerNomsParNomComplet();
717
		$noms_homonymie = $this->classerNomsParNomComplet();
717
		
718
		
718
		// Réalisation du test
719
		// Réalisation du test
719
		$noms_erreur = array();
720
		$noms_erreur = array();
720
		foreach ($this->noms as &$nom) {
721
		foreach ($this->noms as &$nom) {
721
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
722
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
722
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
723
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
723
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
724
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
724
				}
725
				}
725
			}
726
			}
726
		}
727
		}
727
		$noms_homonymie = null;
728
		$noms_homonymie = null;
728
		
729
		
729
		// Analyse des résultats
730
		// Analyse des résultats
730
		if (count($noms_erreur) > 0) {
731
		if (count($noms_erreur) > 0) {
731
			$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
732
			$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
732
			$info['message']['lignes'] = $noms_erreur;
733
			$info['message']['lignes'] = $noms_erreur;
733
		} else {
734
		} else {
734
			$info['resultat'] = true;
735
			$info['resultat'] = true;
735
		}
736
		}
736
		$noms_erreur = null;
737
		$noms_erreur = null;
737
		
738
		
738
		$this->traiterResultatTest($info);
739
		$this->traiterResultatTest($info);
739
	}
740
	}
740
	
741
	
741
	private function testerHomonymieSyntaxe() {
742
	private function testerHomonymieSyntaxe() {
742
		$info = array('nom' => 'homonyme -> syntaxe',
743
		$info = array('nom' => 'homonyme -> syntaxe',
743
			'description' => "Le champ homonyme contient :\n".
744
			'description' => "Le champ homonyme contient :\n".
744
			" - le chiffre 1 ou une valeur vide.\n",
745
				" - une valeur vide,\n".
-
 
746
				" - le chiffre 1.",
745
			'resultat' => false);
747
			'resultat' => false);
746
		
748
		
747
		// Réalisation du test
749
		// Réalisation du test
748
		$noms_erreur = array();
750
		$noms_erreur = array();
749
		foreach ($this->noms as &$nom) {
751
		foreach ($this->noms as &$nom) {
750
			if ($nom['homonyme'] != '') {
752
			if ($nom['homonyme'] != '') {
751
				if (!$this->verifierBooleen($nom['homonyme'])) {
753
				if (!$this->verifierBooleen($nom['homonyme'])) {
752
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
754
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
753
				}
755
				}
754
			}
756
			}
755
		}
757
		}
756
		
758
		
757
		// Analyse des résultats
759
		// Analyse des résultats
758
		if (count($noms_erreur) > 0) {
760
		if (count($noms_erreur) > 0) {
759
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
761
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
760
			$info['message']['lignes'] = $noms_erreur;
762
			$info['message']['lignes'] = $noms_erreur;
761
		} else {
763
		} else {
762
			$info['resultat'] = true;
764
			$info['resultat'] = true;
763
		}
765
		}
764
		$noms_erreur = null;
766
		$noms_erreur = null;
765
		
767
		
766
		$this->traiterResultatTest($info);
768
		$this->traiterResultatTest($info);
767
	}
769
	}
768
	
770
	
769
	private function testerBiblioOrigineSyntaxe() {
771
	private function testerBiblioOrigineSyntaxe() {
770
		$info = array('nom' => 'biblio_origine -> syntaxe',
772
		$info = array('nom' => 'biblio_origine -> syntaxe',
771
			'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 ".
772
			"précis qui sont dans l'ordre de gauche à droite :\n".
774
			"précis qui sont dans l'ordre de gauche à droite :\n".
773
			" - É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 ".
774
			"l'ouvrage global dans lequel la publication est parue).\n".
776
			"l'ouvrage dans lequel la publication est parue),\n".
775
			" - 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".
776
			" - 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. ".
777
			"Cette information ne doit pas contenir de caractère virgule « , ».\n".
779
			"Cette information ne doit pas contenir de caractère virgule « , »,\n".
778
			" - virgule « , »\n".
780
			" - virgule « , »,\n".
779
			" - Les 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... ".
780
			"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 ".
781
			"caractères sauf deux points « : ».\n".
783
			"caractères sauf deux points « : ».\n".
782
			" - deux points « : »\n".
784
			" - deux points « : »,\n".
783
			" - la page contenant la publication du nom ou un ensemble de page (première et dernière page de ".
785
			" - numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière ".
784
			"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 ".
785
			"dans le document la position du nom. 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.",
786
			'resultat' => false);
788
			'resultat' => false);
787
		
789
		
788
		// Réalisation du test
790
		// Réalisation du test
789
		$noms_erreur = array();
791
		$noms_erreur = array();
790
		foreach ($this->noms as &$nom) {
792
		foreach ($this->noms as &$nom) {
791
			if ($nom['biblio_origine'] != '') {
793
			if ($nom['biblio_origine'] != '') {
792
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
794
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
793
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
795
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
794
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
796
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
795
				}
797
				}
796
			}
798
			}
797
		}
799
		}
798
		
800
		
799
		// Analyse des résultats
801
		// Analyse des résultats
800
		if (count($noms_erreur) > 0) {
802
		if (count($noms_erreur) > 0) {
801
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
803
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
802
			$info['message']['lignes'] = $noms_erreur;
804
			$info['message']['lignes'] = $noms_erreur;
803
		} else {
805
		} else {
804
			$info['resultat'] = true;
806
			$info['resultat'] = true;
805
		}
807
		}
806
		$noms_erreur = null;
808
		$noms_erreur = null;
807
		
809
		
808
		$this->traiterResultatTest($info);
810
		$this->traiterResultatTest($info);
809
	}
811
	}
810
	
812
	
811
	private function testerAnneeSyntaxe() {
813
	private function testerAnneeSyntaxe() {
812
		$info = array('nom' => 'annee -> syntaxe',
814
		$info = array('nom' => 'annee -> syntaxe',
813
			'description' => "Le champ annee doit :\n".
815
			'description' => "Le champ annee doit :\n".
814
			" - contenir un nombre de 4 chiffre\n".
816
			" - contenir un nombre de 4 chiffres,\n".
815
			" - être supérieur ou égal à 1753 ",
817
			" - être supérieur ou égal à 1753.",
816
			'resultat' => false);
818
			'resultat' => false);
817
		
819
		
818
		// Réalisation du test
820
		// Réalisation du test
819
		$noms_erreur = array();
821
		$noms_erreur = array();
820
		foreach ($this->noms as &$nom) {
822
		foreach ($this->noms as &$nom) {
821
			if ($nom['annee'] != '') {
823
			if ($nom['annee'] != '') {
822
				if (!$this->verifierAnnee($nom['annee'])) {
824
				if (!$this->verifierAnnee($nom['annee'])) {
823
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
825
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
824
				}
826
				}
825
			}
827
			}
826
		}
828
		}
827
		
829
		
828
		// Analyse des résultats
830
		// Analyse des résultats
829
		if (count($noms_erreur) > 0) {
831
		if (count($noms_erreur) > 0) {
830
			$info['message']['entete'] = array('num_nom', 'annee erroné');
832
			$info['message']['entete'] = array('num_nom', 'annee erroné');
831
			$info['message']['lignes'] = $noms_erreur;
833
			$info['message']['lignes'] = $noms_erreur;
832
		} else {
834
		} else {
833
			$info['resultat'] = true;
835
			$info['resultat'] = true;
834
		}
836
		}
835
		$noms_erreur = null;
837
		$noms_erreur = null;
836
		
838
		
837
		$this->traiterResultatTest($info);
839
		$this->traiterResultatTest($info);
838
	}
840
	}
839
	
841
	
840
	private function testerAuteurSyntaxe() {
842
	private function testerAuteurSyntaxe() {
841
		$info = array('nom' => 'auteur -> syntaxe',
843
		$info = array('nom' => 'auteur -> syntaxe',
842
			'description' => "Le champ auteur doit :\n".
844
			'description' => "Le champ auteur doit :\n".
843
			" - contenir l'intitulé complet des noms de l'auteur ou des auteurs ayant publiés à 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, ".
844
    		" - ou débuter par le mot « sensu » et contient l'intitulé complet des noms de l'auteur ou des auteurs ayant publiés un nom dont la description ne correspond pas à celle de l'auteur ou des auteurs d'origine.\n".
847
			"ayant publié un nom dont la description ne correspond pas à celle de l'auteur, ou des auteurs, d'origine.\n".
845
			" - 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".
846
			" - 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".
847
			" - 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".
848
			" - 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".
849
			" - 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".
850
			" - 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, ".
851
			"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",
852
			'resultat' => false);
855
			'resultat' => false);
853
		
856
		
854
		// Réalisation du test
857
		// Réalisation du test
855
		$noms_erreur = array();
858
		$noms_erreur = array();
856
		foreach ($this->noms as &$nom) {
859
		foreach ($this->noms as &$nom) {
857
			if ($nom['auteur'] != '') {
860
			if ($nom['auteur'] != '') {
858
				if (!$this->verifierAuteur($nom['auteur'])) {
861
				if (!$this->verifierAuteur($nom['auteur'])) {
859
					$intitule_traite = $this->repererEspace($nom['auteur']);
862
					$intitule_traite = $this->repererEspace($nom['auteur']);
860
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
863
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
861
				}
864
				}
862
			}
865
			}
863
		}
866
		}
864
		
867
		
865
		// Analyse des résultats
868
		// Analyse des résultats
866
		if (count($noms_erreur) > 0) {
869
		if (count($noms_erreur) > 0) {
867
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
870
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
868
			$info['message']['lignes'] = $noms_erreur;
871
			$info['message']['lignes'] = $noms_erreur;
869
		} else {
872
		} else {
870
			$info['resultat'] = true;
873
			$info['resultat'] = true;
871
		}
874
		}
872
		$noms_erreur = null;
875
		$noms_erreur = null;
873
		
876
		
874
		$this->traiterResultatTest($info);
877
		$this->traiterResultatTest($info);
875
	}
878
	}
876
	
879
	
877
	private function testerNomCommercialSyntaxe() {
880
	private function testerNomCommercialSyntaxe() {
878
		$info = array('nom' => 'nom_commercial -> syntaxe',
881
		$info = array('nom' => 'nom_commercial -> syntaxe',
879
			'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 ".
880
				"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
883
				"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
881
				"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",
882
			'resultat' => false);
885
			'resultat' => false);
883
		
886
		
884
		// Réalisation du test
887
		// Réalisation du test
885
		$noms_erreur = array();
888
		$noms_erreur = array();
886
		foreach ($this->noms as &$nom) {
889
		foreach ($this->noms as &$nom) {
887
			if ($nom['nom_commercial'] != '') {
890
			if ($nom['nom_commercial'] != '') {
888
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
891
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
889
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
892
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
890
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
893
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
891
				}
894
				}
892
			}
895
			}
893
		}
896
		}
894
		
897
		
895
		// Analyse des résultats
898
		// Analyse des résultats
896
		if (count($noms_erreur) > 0) {
899
		if (count($noms_erreur) > 0) {
897
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
900
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
898
			$info['message']['lignes'] = $noms_erreur;
901
			$info['message']['lignes'] = $noms_erreur;
899
		} else {
902
		} else {
900
			$info['resultat'] = true;
903
			$info['resultat'] = true;
901
		}
904
		}
902
		$noms_erreur = null;
905
		$noms_erreur = null;
903
		
906
		
904
		$this->traiterResultatTest($info);
907
		$this->traiterResultatTest($info);
905
	}
908
	}
906
	
909
	
907
	private function testerNomCommercialPresenceCultivar() {
910
	private function testerNomCommercialPresenceCultivar() {
908
		$info = array('nom' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
911
		$info = array('nom' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
909
			'description' => "Si le champ nom_commercial contier un nom commercial alors le champ cultivar OU ".
912
			'description' => "Si le champ nom_commercial contient un nom commercial alors le champ cultivar OU ".
910
				"cultivar_groupe ne doit pas être vide.",
913
				"cultivar_groupe ne doit pas être vide.",
911
			'resultat' => false);
914
			'resultat' => false);
912
		
915
		
913
		// Réalisation du test
916
		// Réalisation du test
914
		$noms_erreur = array();
917
		$noms_erreur = array();
915
		foreach ($this->noms as &$nom) {
918
		foreach ($this->noms as &$nom) {
916
			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'] == '')) {
917
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
920
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
918
			}
921
			}
919
		}
922
		}
920
		
923
		
921
		// Analyse des résultats
924
		// Analyse des résultats
922
		if (count($noms_erreur) > 0) {
925
		if (count($noms_erreur) > 0) {
923
			$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');
924
			$info['message']['lignes'] = $noms_erreur;
927
			$info['message']['lignes'] = $noms_erreur;
925
		} else {
928
		} else {
926
			$info['resultat'] = true;
929
			$info['resultat'] = true;
927
		}
930
		}
928
		$noms_erreur = null;
931
		$noms_erreur = null;
929
		
932
		
930
		$this->traiterResultatTest($info);
933
		$this->traiterResultatTest($info);
931
	}
934
	}
932
	
935
	
933
	private function testerCultivarSyntaxe() {
936
	private function testerCultivarSyntaxe() {
934
		$info = array('nom' => 'cultivar -> syntaxe',
937
		$info = array('nom' => 'cultivar -> syntaxe',
935
			'description' => "Le champ cultivar_groupe doit contenir :\n".
938
			'description' => "Le champ cultivar_groupe doit contenir :\n".
936
				" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature des Plantes ".
939
				" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature \n".
937
				"Cultivées (CINPC) qui se compose de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
940
				"   des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques \n".
938
				"signes diacritiques et marques de ponctuations.\n".
941
				"   (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.\n".
939
				" - un nom en alphabet latin ce qui implique une translittération des noms d'alphabet cyrillique, ".
942
				" - un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet \n".
940
				"arabe, chinois...\n".
943
				"   cyrillique, arabe, chinois...\n".
941
				" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour les autres mots ".
944
				" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour \n".
942
				"importants mais pas pour les mots mineurs.\n".
945
				"   les autres mots importants mais pas pour les mots mineurs.\n".
943
				"Ne doit pas contenir :\n".
946
				"Ne doit pas contenir :\n".
944
				" - cv., convar. ou de guillemets simples (').\n",
947
				" - cv., convar. ou de guillemets simples (').\n",
945
			'resultat' => false);
948
			'resultat' => false);
946
		
949
		
947
		// Réalisation du test
950
		// Réalisation du test
948
		$noms_erreur = array();
951
		$noms_erreur = array();
949
		foreach ($this->noms as &$nom) {
952
		foreach ($this->noms as &$nom) {
950
			if ($nom['cultivar'] != '') {
953
			if ($nom['cultivar'] != '') {
951
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
954
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
952
					$epithete_traite = $this->repererEspace($nom['cultivar']);
955
					$epithete_traite = $this->repererEspace($nom['cultivar']);
953
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
956
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
954
				}
957
				}
955
			}
958
			}
956
		}
959
		}
957
		
960
		
958
		// Analyse des résultats
961
		// Analyse des résultats
959
		if (count($noms_erreur) > 0) {
962
		if (count($noms_erreur) > 0) {
960
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
963
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
961
			$info['message']['lignes'] = $noms_erreur;
964
			$info['message']['lignes'] = $noms_erreur;
962
		} else {
965
		} else {
963
			$info['resultat'] = true;
966
			$info['resultat'] = true;
964
		}
967
		}
965
		$noms_erreur = null;
968
		$noms_erreur = null;
966
		
969
		
967
		$this->traiterResultatTest($info);
970
		$this->traiterResultatTest($info);
968
	}
971
	}
969
	
972
	
970
	private function testerCultivarRang() {
973
	private function testerCultivarRang() {
971
		$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
974
		$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
972
			'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 à {$this->manuel['rang_genre']}.",
973
			'resultat' => false);
976
			'resultat' => false);
974
		
977
		
975
		// Réalisation du test
978
		// Réalisation du test
976
		$noms_erreur = array();
979
		$noms_erreur = array();
977
		foreach ($this->noms as &$nom) {
980
		foreach ($this->noms as &$nom) {
978
			if ($nom['cultivar'] != '') {
981
			if ($nom['cultivar'] != '') {
979
				if ($nom['rang'] < $this->manuel['rang_genre']) {
982
				if ($nom['rang'] < $this->manuel['rang_genre']) {
980
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
983
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
981
				}
984
				}
982
			}
985
			}
983
		}
986
		}
984
		
987
		
985
		// Analyse des résultats
988
		// Analyse des résultats
986
		if (count($noms_erreur) > 0) {
989
		if (count($noms_erreur) > 0) {
987
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
990
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
988
			$info['message']['lignes'] = $noms_erreur;
991
			$info['message']['lignes'] = $noms_erreur;
989
		} else {
992
		} else {
990
			$info['resultat'] = true;
993
			$info['resultat'] = true;
991
		}
994
		}
992
		$noms_erreur = null;
995
		$noms_erreur = null;
993
		
996
		
994
		$this->traiterResultatTest($info);
997
		$this->traiterResultatTest($info);
995
	}
998
	}
996
	
999
	
997
	private function testerGroupeCultivarSyntaxe() {
1000
	private function testerGroupeCultivarSyntaxe() {
998
		$info = array('nom' => 'cultivar_groupe -> syntaxe',
1001
		$info = array('nom' => 'cultivar_groupe -> syntaxe',
999
			'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
1002
			'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
1000
				"du code des plantes cultivées qui se compose de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
1003
				"du code des plantes cultivées, c.-à-d. composer de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
1001
				"signes diacritiques et marques de ponctuations.\n".
1004
				"signes diacritiques et marques de ponctuations.\n".
1002
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
1005
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
1003
				"Il peut contir à la fin l'abréviation «gx» pour distinguer les groupes des grex.",
1006
				"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
1004
			'resultat' => false);
1007
			'resultat' => false);
1005
		
1008
		
1006
		// Réalisation du test
1009
		// Réalisation du test
1007
		$noms_erreur = array();
1010
		$noms_erreur = array();
1008
		foreach ($this->noms as &$nom) {
1011
		foreach ($this->noms as &$nom) {
1009
			if ($nom['cultivar_groupe'] != '') {
1012
			if ($nom['cultivar_groupe'] != '') {
1010
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
1013
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
1011
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
1014
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
1012
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1015
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1013
				}
1016
				}
1014
			}
1017
			}
1015
		}
1018
		}
1016
		
1019
		
1017
		// Analyse des résultats
1020
		// Analyse des résultats
1018
		if (count($noms_erreur) > 0) {
1021
		if (count($noms_erreur) > 0) {
1019
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
1022
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
1020
			$info['message']['lignes'] = $noms_erreur;
1023
			$info['message']['lignes'] = $noms_erreur;
1021
		} else {
1024
		} else {
1022
			$info['resultat'] = true;
1025
			$info['resultat'] = true;
1023
		}
1026
		}
1024
		$noms_erreur = null;
1027
		$noms_erreur = null;
1025
		
1028
		
1026
		$this->traiterResultatTest($info);
1029
		$this->traiterResultatTest($info);
1027
	}
1030
	}
1028
	
1031
	
1029
	private function testerGroupeCultivarRang() {
1032
	private function testerGroupeCultivarRang() {
1030
		$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
1033
		$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
1031
			'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']}.",
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']}.",
1032
			'resultat' => false);
1035
			'resultat' => false);
1033
		
1036
		
1034
		// Réalisation du test
1037
		// Réalisation du test
1035
		$noms_erreur = array();
1038
		$noms_erreur = array();
1036
		foreach ($this->noms as &$nom) {
1039
		foreach ($this->noms as &$nom) {
1037
			if ($nom['cultivar_groupe'] != '') {
1040
			if ($nom['cultivar_groupe'] != '') {
1038
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1041
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1039
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1042
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1040
				}
1043
				}
1041
			}
1044
			}
1042
		}
1045
		}
1043
		
1046
		
1044
		// Analyse des résultats
1047
		// Analyse des résultats
1045
		if (count($noms_erreur) > 0) {
1048
		if (count($noms_erreur) > 0) {
1046
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1049
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1047
			$info['message']['lignes'] = $noms_erreur;
1050
			$info['message']['lignes'] = $noms_erreur;
1048
		} else {
1051
		} else {
1049
			$info['resultat'] = true;
1052
			$info['resultat'] = true;
1050
		}
1053
		}
1051
		$noms_erreur = null;
1054
		$noms_erreur = null;
1052
		
1055
		
1053
		$this->traiterResultatTest($info);
1056
		$this->traiterResultatTest($info);
1054
	}
1057
	}
1055
	
1058
	
1056
	private function testerEpitheteInfraSpEspaces() {
1059
	private function testerEpitheteInfraSpEspaces() {
1057
		$info = array('nom' => 'epithete_infra_sp -> espaces en trop',
1060
		$info = array('nom' => 'epithete_infra_sp -> espaces en trop',
1058
			'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
1061
			'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou après le nom.\n".
1059
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
1062
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
1060
			'resultat' => false);
1063
			'resultat' => false);
1061
		
1064
		
1062
		// Réalisation du test
1065
		// Réalisation du test
1063
		$noms_erreur = array();
1066
		$noms_erreur = array();
1064
		foreach ($this->noms as &$nom) {
1067
		foreach ($this->noms as &$nom) {
1065
			if ($nom['epithete_infra_sp'] != '') {
1068
			if ($nom['epithete_infra_sp'] != '') {
1066
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
1069
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
1067
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1070
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1068
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1071
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1069
				}
1072
				}
1070
			}
1073
			}
1071
		}
1074
		}
1072
		
1075
		
1073
		// Analyse des résultats
1076
		// Analyse des résultats
1074
		if (count($noms_erreur) > 0) {
1077
		if (count($noms_erreur) > 0) {
1075
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1078
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1076
			$info['message']['lignes'] = $noms_erreur;
1079
			$info['message']['lignes'] = $noms_erreur;
1077
		} else {
1080
		} else {
1078
			$info['resultat'] = true;
1081
			$info['resultat'] = true;
1079
		}
1082
		}
1080
		$noms_erreur = null;
1083
		$noms_erreur = null;
1081
		
1084
		
1082
		$this->traiterResultatTest($info);
1085
		$this->traiterResultatTest($info);
1083
	}
1086
	}
1084
	
1087
	
1085
	private function testerEpitheteInfraSpSyntaxe() {
1088
	private function testerEpitheteInfraSpSyntaxe() {
1086
		$info = array('nom' => 'epithete_infra_sp -> syntaxe',
1089
		$info = array('nom' => 'epithete_infra_sp -> syntaxe',
1087
			'description' => "Le champ epithete_infra_sp peut contenir :\n".
1090
			'description' => "Le champ epithete_infra_sp peut contenir :\n".
1088
			 	" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
1091
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
1089
				"	Il commence par une lettre minuscule (avec ou sans tréma).\n". 
1092
				"	Il commence par une lettre minuscule (avec ou sans tréma).\n". 
1090
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
1093
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
1091
				" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce (au moins 2) séparés entre eux \n".
1094
				" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce \n".
1092
				"	par la lettre x entourée de caractères espaces.",
1095
				"	(au moins 2) séparés entre eux par la lettre x entourée de caractères espaces.",
1093
			'resultat' => false);
1096
			'resultat' => false);
1094
		
1097
		
1095
		// Réalisation du test
1098
		// Réalisation du test
1096
		$noms_erreur = array();
1099
		$noms_erreur = array();
1097
		foreach ($this->noms as &$nom) {
1100
		foreach ($this->noms as &$nom) {
1098
			if ($nom['epithete_infra_sp'] != '') {
1101
			if ($nom['epithete_infra_sp'] != '') {
1099
				$mots = explode(' ', $nom['epithete_infra_sp']);
1102
				$mots = explode(' ', $nom['epithete_infra_sp']);
1100
				foreach ($mots as $mot) {
1103
				foreach ($mots as $mot) {
1101
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1104
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1102
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1105
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1103
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1106
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1104
					}
1107
					}
1105
				}
1108
				}
1106
			}
1109
			}
1107
		}
1110
		}
1108
		
1111
		
1109
		// Analyse des résultats
1112
		// Analyse des résultats
1110
		if (count($noms_erreur) > 0) {
1113
		if (count($noms_erreur) > 0) {
1111
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1114
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1112
			$info['message']['lignes'] = $noms_erreur;
1115
			$info['message']['lignes'] = $noms_erreur;
1113
		} else {
1116
		} else {
1114
			$info['resultat'] = true;
1117
			$info['resultat'] = true;
1115
		}
1118
		}
1116
		$noms_erreur = null;
1119
		$noms_erreur = null;
1117
		
1120
		
1118
		$this->traiterResultatTest($info);
1121
		$this->traiterResultatTest($info);
1119
	}
1122
	}
1120
	
1123
	
1121
	private function testerEpitheteInfraSpRang() {
1124
	private function testerEpitheteInfraSpRang() {
1122
		$info = array('nom' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
1125
		$info = array('nom' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
1123
			'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$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']}.",
1124
			'resultat' => false);
1127
			'resultat' => false);
1125
		
1128
		
1126
		// Réalisation du test
1129
		// Réalisation du test
1127
		$noms_erreur = array();
1130
		$noms_erreur = array();
1128
		foreach ($this->noms as &$nom) {
1131
		foreach ($this->noms as &$nom) {
1129
			if ($nom['epithete_infra_sp'] != '') {
1132
			if ($nom['epithete_infra_sp'] != '') {
1130
				if ($nom['rang'] < $this->manuel['rang_sp']) {
1133
				if ($nom['rang'] < $this->manuel['rang_sp']) {
1131
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1134
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1132
				}
1135
				}
1133
			}
1136
			}
1134
		}
1137
		}
1135
		
1138
		
1136
		// Analyse des résultats
1139
		// Analyse des résultats
1137
		if (count($noms_erreur) > 0) {
1140
		if (count($noms_erreur) > 0) {
1138
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1141
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1139
			$info['message']['lignes'] = $noms_erreur;
1142
			$info['message']['lignes'] = $noms_erreur;
1140
		} else {
1143
		} else {
1141
			$info['resultat'] = true;
1144
			$info['resultat'] = true;
1142
		}
1145
		}
1143
		$noms_erreur = null;
1146
		$noms_erreur = null;
1144
		
1147
		
1145
		$this->traiterResultatTest($info);
1148
		$this->traiterResultatTest($info);
1146
	}
1149
	}
1147
	
1150
	
1148
	private function testerTypeEpitheteEspaces() {
1151
	private function testerTypeEpitheteEspaces() {
1149
		$info = array('nom' => 'type_epithete -> espaces en trop',
1152
		$info = array('nom' => 'type_epithete -> espaces en trop',
1150
			'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
1153
			'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
1151
			'resultat' => false);
1154
			'resultat' => false);
1152
		
1155
		
1153
		// Réalisation du test
1156
		// Réalisation du test
1154
		$noms_erreur = array();
1157
		$noms_erreur = array();
1155
		foreach ($this->noms as &$nom) {
1158
		foreach ($this->noms as &$nom) {
1156
			if ($nom['type_epithete'] != '') {
1159
			if ($nom['type_epithete'] != '') {
1157
				if (preg_match('/\s+/', $nom['type_epithete'])) {
1160
				if (preg_match('/\s+/', $nom['type_epithete'])) {
1158
					$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
1161
					$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
1159
					$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
1162
					$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
1160
				}
1163
				}
1161
			}
1164
			}
1162
		}
1165
		}
1163
		
1166
		
1164
		// Analyse des résultats
1167
		// Analyse des résultats
1165
		if (count($noms_erreur) > 0) {
1168
		if (count($noms_erreur) > 0) {
1166
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1169
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1167
			$info['message']['lignes'] = $noms_erreur;
1170
			$info['message']['lignes'] = $noms_erreur;
1168
		} else {
1171
		} else {
1169
			$info['resultat'] = true;
1172
			$info['resultat'] = true;
1170
		}
1173
		}
1171
		
1174
		
1172
		$this->traiterResultatTest($info);
1175
		$this->traiterResultatTest($info);
1173
	}
1176
	}
1174
	
1177
	
1175
	private function testerTypeEpitheteSyntaxe() {
1178
	private function testerTypeEpitheteSyntaxe() {
1176
		$info = array('nom' => 'type_epithete -> syntaxe',
1179
		$info = array('nom' => 'type_epithete -> syntaxe',
1177
			'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules sans ".
1180
			'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules, sans ".
1178
				" accents et de tirets (-). Il commence par une lettre minuscule sans accent.",
1181
				" accents, et de tirets (-). Il commence par une lettre minuscule sans accent.",
1179
			'resultat' => false);
1182
			'resultat' => false);
1180
		
1183
		
1181
		// Réalisation du test
1184
		// Réalisation du test
1182
		$noms_erreur = array();
1185
		$noms_erreur = array();
1183
		foreach ($this->noms as &$nom) {
1186
		foreach ($this->noms as &$nom) {
1184
			if ($nom['type_epithete'] != '') {
1187
			if ($nom['type_epithete'] != '') {
1185
				if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
1188
				if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
1186
					$noms_erreur[] = array($nom['num_nom'],  $nom['type_epithete']);
1189
					$noms_erreur[] = array($nom['num_nom'],  $nom['type_epithete']);
1187
				}
1190
				}
1188
			}
1191
			}
1189
		}
1192
		}
1190
		
1193
		
1191
		// Analyse des résultats
1194
		// Analyse des résultats
1192
		if (count($noms_erreur) > 0) {
1195
		if (count($noms_erreur) > 0) {
1193
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1196
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1194
			$info['message']['lignes'] = $noms_erreur;
1197
			$info['message']['lignes'] = $noms_erreur;
1195
		} else {
1198
		} else {
1196
			$info['resultat'] = true;
1199
			$info['resultat'] = true;
1197
		}
1200
		}
1198
		
1201
		
1199
		$this->traiterResultatTest($info);
1202
		$this->traiterResultatTest($info);
1200
	}
1203
	}
1201
	
1204
	
1202
	private function testerTypeEpitheteHybridite() {
1205
	private function testerTypeEpitheteHybridite() {
1203
		$info = array('nom' => 'type_epithete -> hybridité',
1206
		$info = array('nom' => 'type_epithete -> hybridité',
1204
			'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
1207
			'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
1205
				" - «n-» \n".
1208
				" - «n-» \n".
1206
				" - «notho-» \n",
1209
				" - «notho-» \n",
1207
			'resultat' => false);
1210
			'resultat' => false);
1208
		
1211
		
1209
		// Réalisation du test
1212
		// Réalisation du test
1210
		$noms_erreur = array();
1213
		$noms_erreur = array();
1211
		foreach ($this->noms as &$nom) {
1214
		foreach ($this->noms as &$nom) {
1212
			if ($nom['type_epithete'] != '') {
1215
			if ($nom['type_epithete'] != '') {
1213
				if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
1216
				if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
1214
					$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
1217
					$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
1215
				}
1218
				}
1216
			}
1219
			}
1217
		}
1220
		}
1218
		
1221
		
1219
		// Analyse des résultats
1222
		// Analyse des résultats
1220
		if (count($noms_erreur) > 0) {
1223
		if (count($noms_erreur) > 0) {
1221
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1224
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
1222
			$info['message']['lignes'] = $noms_erreur;
1225
			$info['message']['lignes'] = $noms_erreur;
1223
		} else {
1226
		} else {
1224
			$info['resultat'] = true;
1227
			$info['resultat'] = true;
1225
		}
1228
		}
1226
		
1229
		
1227
		$this->traiterResultatTest($info);
1230
		$this->traiterResultatTest($info);
1228
	}
1231
	}
1229
	
1232
	
1230
	private function testerNombreDeChamps($colonnes) {
1233
	private function testerNombreDeChamps($colonnes) {
1231
		$info = array('nom' => 'Structure -> nombre de champs',
1234
		$info = array('nom' => 'Structure -> nombre de champs',
1232
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
1235
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
1233
			'resultat' => false);
1236
			'resultat' => false);
1234
		
1237
		
1235
		$nbre_colonnes = count($colonnes);
1238
		$nbre_colonnes = count($colonnes);
1236
		$info['message'] = $nbre_colonnes;
1239
		$info['message'] = $nbre_colonnes;
1237
		if ($nbre_colonnes >= 35) {
1240
		if ($nbre_colonnes >= 35) {
1238
			$info['resultat'] = true;
1241
			$info['resultat'] = true;
1239
		}
1242
		}
1240
		$this->traiterResultatTest($info);
1243
		$this->traiterResultatTest($info);
1241
		return ($info['resultat'] ? '1' : '0');
1244
		return ($info['resultat'] ? '1' : '0');
1242
	}
1245
	}
1243
	
1246
	
1244
	private function testerNomDesChamps($colonnes) {
1247
	private function testerNomDesChamps($colonnes) {
1245
		$info = array('nom' => 'Structure -> noms des champs',
1248
		$info = array('nom' => 'Structure -> noms des champs',
1246
			'description' => 'Les champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
1249
			'description' => 'Les noms des champs de la table contenant le référentiel doivent être conformes à ceux '. 
-
 
1250
								'définis par le manuel technique.',
1247
			'resultat' => false);
1251
			'resultat' => false);
1248
		
1252
		
1249
		$champs_attendus = explode(',', $this->manuel['champs']);
1253
		$champs_attendus = explode(',', $this->manuel['champs']);
1250
		$champs_presents = array();
1254
		$champs_presents = array();
1251
		foreach ($colonnes as $colonne) {
1255
		foreach ($colonnes as $colonne) {
1252
			$champs_presents[$colonne['Field']] = $colonne;
1256
			$champs_presents[$colonne['Field']] = $colonne;
1253
		}
1257
		}
1254
		
1258
		
1255
		$ok = true;
1259
		$ok = true;
1256
		$champs_manquant = array(); 
1260
		$champs_manquant = array(); 
1257
		foreach ($champs_attendus as $champ_attendu) {
1261
		foreach ($champs_attendus as $champ_attendu) {
1258
			if (!isset($champs_presents[$champ_attendu])) {
1262
			if (!isset($champs_presents[$champ_attendu])) {
1259
				$champs_manquant[] = $champ_attendu; 
1263
				$champs_manquant[] = $champ_attendu; 
1260
				$ok = false;
1264
				$ok = false;
1261
			}
1265
			}
1262
		}
1266
		}
1263
		$info['resultat'] = $ok;
1267
		$info['resultat'] = $ok;
1264
		if (!$ok) {
1268
		if (!$ok) {
1265
			$info['message'] = 'Champs manquant : '.implode(', ', $champs_manquant).'.';
1269
			$info['message'] = 'Champs manquant : '.implode(', ', $champs_manquant).'.';
1266
		}
1270
		}
1267
		
1271
		
1268
		$this->traiterResultatTest($info);
1272
		$this->traiterResultatTest($info);
1269
		return ($info['resultat'] ? '1' : '0');
1273
		return ($info['resultat'] ? '1' : '0');
1270
	}
1274
	}
1271
	
1275
	
1272
	private function testerTypeDesChamps($colonnes) {
1276
	private function testerTypeDesChamps($colonnes) {
1273
		$info = array('nom' => 'Structure -> types des champs',
1277
		$info = array('nom' => 'Structure -> types des champs',
1274
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
1278
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conformes à ceux '.
-
 
1279
								'définis par le manuel technique.',
1275
			'resultat' => false);
1280
			'resultat' => false);
1276
		
1281
		
1277
		$champs_attendus = explode(',', $this->manuel['champs_type']);
1282
		$champs_attendus = explode(',', $this->manuel['champs_type']);
1278
		$champs_presents = array();
1283
		$champs_presents = array();
1279
		foreach ($colonnes as $colonne) {
1284
		foreach ($colonnes as $colonne) {
1280
			$champs_presents[$colonne['Field']] = $colonne['Type'];
1285
			$champs_presents[$colonne['Field']] = $colonne['Type'];
1281
		}
1286
		}
1282
		
1287
		
1283
		// Recercherche des erreurs
1288
		// Recercherche des erreurs
1284
		$champs_erreur = array(); 
1289
		$champs_erreur = array(); 
1285
		foreach ($champs_attendus as $champ_attendu) {
1290
		foreach ($champs_attendus as $champ_attendu) {
1286
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
1291
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
1287
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
1292
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
1288
			
1293
			
1289
			if (isset($champs_presents[$champ_attendu_nom])) {
1294
			if (isset($champs_presents[$champ_attendu_nom])) {
1290
				$champs_present_type = $champs_presents[$champ_attendu_nom];
1295
				$champs_present_type = $champs_presents[$champ_attendu_nom];
1291
				
1296
				
1292
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
1297
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
1293
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
1298
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
1294
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) 
1299
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) 
1295
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
1300
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
1296
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
1301
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
1297
				}
1302
				}
1298
			}
1303
			}
1299
		}
1304
		}
1300
		
1305
		
1301
		// Analyse des résultats
1306
		// Analyse des résultats
1302
		if (count($champs_erreur) > 0) {
1307
		if (count($champs_erreur) > 0) {
1303
			$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
1308
			$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
1304
		} else {
1309
		} else {
1305
			$info['resultat'] = true;
1310
			$info['resultat'] = true;
1306
		}
1311
		}
1307
		
1312
		
1308
		$this->traiterResultatTest($info);
1313
		$this->traiterResultatTest($info);
1309
		return ($info['resultat'] ? '1' : '0');
1314
		return ($info['resultat'] ? '1' : '0');
1310
	}
1315
	}
1311
	
1316
	
1312
	private function testerTailleDesChamps($colonnes, $analyses) {
1317
	private function testerTailleDesChamps($colonnes, $analyses) {
1313
		$info = array('nom' => 'Structure -> champs tronqués',
1318
		$info = array('nom' => 'Structure -> champs tronqués',
1314
			'description' => "Vérifie que le risque éventuel que des données de type texte insérées ".
1319
			'description' => "Evalue le risque que des données de type texte aient pu être tronquées lors de leur insertion.\n".
1315
				"dans la table aient pu être tronquées lors de leur insertion.\n".
-
 
1316
				"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
1320
				"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
1317
				"sur un problème éventuel.",
1321
				"sur un problème éventuel.",
1318
			'resultat' => false);
1322
			'resultat' => false);
1319
		
1323
		
1320
		$tailles_champs_maxi = array();
1324
		$tailles_champs_maxi = array();
1321
		foreach ($colonnes as $colonne) {
1325
		foreach ($colonnes as $colonne) {
1322
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
1326
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
1323
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
1327
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
1324
			}
1328
			}
1325
		}
1329
		}
1326
		
1330
		
1327
		$tailles_trouvees = array();
1331
		$tailles_trouvees = array();
1328
		foreach ($analyses as $analyse) {
1332
		foreach ($analyses as $analyse) {
1329
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
1333
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
1330
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
1334
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
1331
			}
1335
			}
1332
		}
1336
		}
1333
		
1337
		
1334
		$champs_erreur = array();
1338
		$champs_erreur = array();
1335
		$champs_attendus = explode(',', $this->manuel['champs']);
1339
		$champs_attendus = explode(',', $this->manuel['champs']);
1336
		foreach ($champs_attendus as $champ_attendu) {
1340
		foreach ($champs_attendus as $champ_attendu) {
1337
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
1341
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
1338
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
1342
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
1339
					$champs_erreur[] = $champ_attendu;
1343
					$champs_erreur[] = $champ_attendu;
1340
				}
1344
				}
1341
			}
1345
			}
1342
		}
1346
		}
1343
		
1347
		
1344
		// Analyse des résultats
1348
		// Analyse des résultats
1345
		if (count($champs_erreur) > 0) {
1349
		if (count($champs_erreur) > 0) {
1346
			$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
1350
			$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
1347
		} else {
1351
		} else {
1348
			$info['resultat'] = true;
1352
			$info['resultat'] = true;
1349
		}
1353
		}
1350
		
1354
		
1351
		$this->traiterResultatTest($info);
1355
		$this->traiterResultatTest($info);
1352
	}
1356
	}
1353
	
1357
	
1354
	private function testerNumNomClePrimaire($colonnes) {
1358
	private function testerNumNomClePrimaire($colonnes) {
1355
		$info = array('nom' => 'Structure -> num_nom est clé primaire',
1359
		$info = array('nom' => 'Structure -> num_nom est clé primaire',
1356
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
1360
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
1357
			'resultat' => false);
1361
			'resultat' => false);
1358
		
1362
		
1359
		foreach ($colonnes as $colonne) {
1363
		foreach ($colonnes as $colonne) {
1360
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
1364
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
1361
				$info['resultat'] = true;
1365
				$info['resultat'] = true;
1362
			}
1366
			}
1363
		}
1367
		}
1364
		
1368
		
1365
		$this->traiterResultatTest($info);
1369
		$this->traiterResultatTest($info);
1366
		return ($info['resultat'] ? '1' : '0');
1370
		return ($info['resultat'] ? '1' : '0');
1367
	}
1371
	}
1368
	
1372
	
1369
	private function testerNumNomSuperieurAZero() {
1373
	private function testerNumNomSuperieurAZero() {
1370
		$info = array('nom' => 'num_nom -> supérieur à 0',
1374
		$info = array('nom' => 'num_nom -> supérieur à 0',
1371
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
1375
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
1372
			'resultat' => false);
1376
			'resultat' => false);
1373
		
1377
		
1374
		// Réalisation du test
1378
		// Réalisation du test
1375
		$noms_erreur = array();
1379
		$noms_erreur = array();
1376
		foreach ($this->noms as &$nom) {
1380
		foreach ($this->noms as &$nom) {
1377
			if ($nom['num_nom'] <= 0) {
1381
			if ($nom['num_nom'] <= 0) {
1378
				$noms_erreur[] = $nom['num_nom'];
1382
				$noms_erreur[] = $nom['num_nom'];
1379
			}
1383
			}
1380
		}
1384
		}
1381
		
1385
		
1382
		// Analyse des résultats
1386
		// Analyse des résultats
1383
		if (count($noms_erreur) > 0) {
1387
		if (count($noms_erreur) > 0) {
1384
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
1388
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
1385
		} else {
1389
		} else {
1386
			$info['resultat'] = true;
1390
			$info['resultat'] = true;
1387
		}
1391
		}
1388
		
1392
		
1389
		$this->traiterResultatTest($info);
1393
		$this->traiterResultatTest($info);
1390
	}
1394
	}
1391
	
1395
	
1392
	private function testerNumNomRetenuSuperieurAZero() {
1396
	private function testerNumNomRetenuSuperieurAZero() {
1393
		$info = array('nom' => 'num_nom_retenu -> supérieur à 0',
1397
		$info = array('nom' => 'num_nom_retenu -> supérieur à 0',
1394
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
1398
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
1395
			'resultat' => false);
1399
			'resultat' => false);
1396
		
1400
		
1397
		// Réalisation du test
1401
		// Réalisation du test
1398
		$noms_erreur = array();
1402
		$noms_erreur = array();
1399
		foreach ($this->noms as &$nom) {
1403
		foreach ($this->noms as &$nom) {
1400
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
1404
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
1401
				$noms_erreur[] = $nom['num_nom'];
1405
				$noms_erreur[] = $nom['num_nom'];
1402
			}
1406
			}
1403
		}
1407
		}
1404
		
1408
		
1405
		// Analyse des résultats
1409
		// Analyse des résultats
1406
		if (count($noms_erreur) > 0) {
1410
		if (count($noms_erreur) > 0) {
1407
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
1411
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
1408
		} else {
1412
		} else {
1409
			$info['resultat'] = true;
1413
			$info['resultat'] = true;
1410
		}
1414
		}
1411
		
1415
		
1412
		$this->traiterResultatTest($info);
1416
		$this->traiterResultatTest($info);
1413
	}
1417
	}
1414
	
1418
	
1415
	private function testerNumTaxSupEgalZeroUnique() {
1419
	private function testerNumTaxSupEgalZeroUnique() {
1416
		$info = array('nom' => 'num_tax_sup -> égal à 0 unique',
1420
		$info = array('nom' => 'num_tax_sup -> égal à 0 unique',
1417
			'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification.",
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.",
1418
			'resultat' => false);
1422
			'resultat' => false);
1419
		
1423
		
1420
		// Réalisation du test
1424
		// Réalisation du test
1421
		$noms_erreur = array();
1425
		$noms_erreur = array();
1422
		foreach ($this->noms as &$nom) {
1426
		foreach ($this->noms as &$nom) {
1423
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
1427
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
1424
				$noms_erreur[] = $nom['num_nom'];
1428
				$noms_erreur[] = $nom['num_nom'];
1425
			}
1429
			}
1426
		}
1430
		}
1427
		
1431
		
1428
		// Analyse des résultats
1432
		// Analyse des résultats
1429
		if (count($noms_erreur) > 1) {
1433
		if (count($noms_erreur) > 1) {
1430
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
1434
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
1431
		} else {
1435
		} else {
1432
			$info['resultat'] = true;
1436
			$info['resultat'] = true;
1433
		}
1437
		}
1434
		
1438
		
1435
		$this->traiterResultatTest($info);
1439
		$this->traiterResultatTest($info);
1436
	}
1440
	}
1437
	
1441
	
1438
	private function testerTaxSupPourTaxon() {
1442
	private function testerTaxSupPourTaxon() {
1439
		$info = array('nom' => 'Classification -> uniquement pour les taxons',
1443
		$info = array('nom' => 'Classification -> uniquement pour les taxons',
1440
			'description' => "Seul les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.\n".
1444
			'description' => "Seuls les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.\n".
1441
				"Si num_nom_retenu est différent de num_nom (= nom synonyme) alors num_tax_sup doit être vide.",
1445
				"Si num_nom_retenu est différent de num_nom (= nom synonyme) alors num_tax_sup doit être vide.",
1442
			'resultat' => false);
1446
			'resultat' => false);
1443
		
1447
		
1444
		// Réalisation du test
1448
		// Réalisation du test
1445
		$noms_erreur = array();
1449
		$noms_erreur = array();
1446
		foreach ($this->noms as &$nom) {
1450
		foreach ($this->noms as &$nom) {
1447
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
1451
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
1448
				$noms_erreur[] = $nom['num_nom']; 
1452
				$noms_erreur[] = $nom['num_nom']; 
1449
			}
1453
			}
1450
		}
1454
		}
1451
		
1455
		
1452
		// Analyse des résultats
1456
		// Analyse des résultats
1453
		if (count($noms_erreur) > 0) {
1457
		if (count($noms_erreur) > 0) {
1454
			$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).'.';
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).'.';
1455
		} else {
1459
		} else {
1456
			$info['resultat'] = true;
1460
			$info['resultat'] = true;
1457
		}
1461
		}
1458
		
1462
		
1459
		$this->traiterResultatTest($info);
1463
		$this->traiterResultatTest($info);
1460
	}
1464
	}
1461
	
1465
	
1462
	private function testerExitenceTaxonSuperieur() {
1466
	private function testerExitenceTaxonSuperieur() {
1463
		$info = array('nom' => 'Classification -> existence du taxon supérieur',
1467
		$info = array('nom' => 'Classification -> existence du taxon supérieur',
1464
			'description' => "Pour chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
1468
			'description' => "Chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
1465
			'resultat' => false);
1469
			'resultat' => false);
1466
		
1470
		
1467
		// Réalisation du test
1471
		// Réalisation du test
1468
		$noms_erreur = array();
1472
		$noms_erreur = array();
1469
		foreach ($this->noms as &$nom) {
1473
		foreach ($this->noms as &$nom) {
1470
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1474
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1471
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
1475
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
1472
					$noms_erreur[] = $nom['num_nom'];
1476
					$noms_erreur[] = $nom['num_nom'];
1473
				} 
1477
				} 
1474
			}
1478
			}
1475
		}
1479
		}
1476
		
1480
		
1477
		// Analyse des résultats
1481
		// Analyse des résultats
1478
		if (count($noms_erreur) > 0) {
1482
		if (count($noms_erreur) > 0) {
1479
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
1483
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
1480
		} else {
1484
		} else {
1481
			$info['resultat'] = true;
1485
			$info['resultat'] = true;
1482
		}
1486
		}
1483
		
1487
		
1484
		$this->traiterResultatTest($info);
1488
		$this->traiterResultatTest($info);
1485
	}
1489
	}
1486
	
1490
	
1487
	private function testerClassificationRang() {
1491
	private function testerClassificationRang() {
1488
		$info = array('nom' => 'Classification -> taxon supérieur avec rang inférieur',
1492
		$info = array('nom' => 'Classification -> taxon supérieur avec rang inférieur',
1489
			'description' => "Pour chaque enregistrement représentant un taxon, chaque taxon supérieur doit avoir un rang inférieur au taxon courant.",
1493
			'description' => "Pour chaque enregistrement représentant un taxon, le taxon supérieur doit avoir un rang inférieur au taxon courant.",
1490
			'resultat' => false);
1494
			'resultat' => false);
1491
		
1495
		
1492
		// Réalisation du test
1496
		// Réalisation du test
1493
		$noms_erreur = array();
1497
		$noms_erreur = array();
1494
		foreach ($this->noms as &$nom) {
1498
		foreach ($this->noms as &$nom) {
1495
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1499
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1496
				if (isset($this->noms[$nom['num_tax_sup']])) {
1500
				if (isset($this->noms[$nom['num_tax_sup']])) {
1497
					$nom_sup = $this->noms[$nom['num_tax_sup']];
1501
					$nom_sup = $this->noms[$nom['num_tax_sup']];
1498
					if ($nom_sup['rang'] > $nom['rang']) {
1502
					if ($nom_sup['rang'] > $nom['rang']) {
1499
						$noms_erreur[] = $nom['num_nom'];
1503
						$noms_erreur[] = $nom['num_nom'];
1500
					}
1504
					}
1501
				}
1505
				}
1502
			}
1506
			}
1503
		}
1507
		}
1504
		
1508
		
1505
		// Analyse des résultats
1509
		// Analyse des résultats
1506
		if (count($noms_erreur) > 0) {
1510
		if (count($noms_erreur) > 0) {
1507
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
1511
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
1508
		} else {
1512
		} else {
1509
			$info['resultat'] = true;
1513
			$info['resultat'] = true;
1510
		}
1514
		}
1511
		
1515
		
1512
		$this->traiterResultatTest($info);
1516
		$this->traiterResultatTest($info);
1513
	}
1517
	}
1514
	
1518
	
1515
	private function testerClassification() {
1519
	private function testerClassification() {
1516
		$info = array('nom' => 'Classification -> racine liée à chaque noeud',
1520
		$info = array('nom' => 'Classification -> racine liée à chaque noeud',
1517
			'description' => "Pour chaque enregistrement, la classification doit pouvoir être remonté jusqu'à un même nom unique possédant une valeur num_tax_sup de 0.",
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.",
1518
			'resultat' => false);
1522
			'resultat' => false);
1519
		
1523
		
1520
		// Réalisation du test
1524
		// Réalisation du test
1521
		$noms_erreur = array();
1525
		$noms_erreur = array();
1522
		$this->noms_ok = array();
1526
		$this->noms_ok = array();
1523
		foreach ($this->noms as &$nom) {
1527
		foreach ($this->noms as &$nom) {
1524
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1528
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1525
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1529
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1526
					$this->noms_ok[$nom['num_nom']] = true;
1530
					$this->noms_ok[$nom['num_nom']] = true;
1527
				} else {
1531
				} else {
1528
					$this->detection_boucle_infini = array();
1532
					$this->detection_boucle_infini = array();
1529
					$classif_ok = $this->remonterClassif($nom);
1533
					$classif_ok = $this->remonterClassif($nom);
1530
					unset($this->detection_boucle_infini); 
1534
					unset($this->detection_boucle_infini); 
1531
					
1535
					
1532
					if ($classif_ok === false) {
1536
					if ($classif_ok === false) {
1533
						$noms_erreur[] = $nom['num_nom'];
1537
						$noms_erreur[] = $nom['num_nom'];
1534
					} else {
1538
					} else {
1535
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
1539
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
1536
					}
1540
					}
1537
				}
1541
				}
1538
			}
1542
			}
1539
		}
1543
		}
1540
		unset($this->noms_ok);
1544
		unset($this->noms_ok);
1541
		
1545
		
1542
		// Analyse des résultats
1546
		// Analyse des résultats
1543
		if (count($noms_erreur) > 0) {
1547
		if (count($noms_erreur) > 0) {
1544
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
1548
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
1545
		} else {
1549
		} else {
1546
			$info['resultat'] = true;
1550
			$info['resultat'] = true;
1547
		}
1551
		}
1548
		
1552
		
1549
		$this->traiterResultatTest($info);
1553
		$this->traiterResultatTest($info);
1550
	}
1554
	}
1551
	
1555
	
1552
	private function remonterClassif(&$nom) {
1556
	private function remonterClassif(&$nom) {
1553
		$this->detection_boucle_infini[$nom['num_nom']] = true;
1557
		$this->detection_boucle_infini[$nom['num_nom']] = true;
1554
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
1558
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
1555
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1559
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1556
				$this->noms_ok[$nom['num_nom']] = true;
1560
				$this->noms_ok[$nom['num_nom']] = true;
1557
				return true;
1561
				return true;
1558
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
1562
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
1559
				$this->noms_ok[$nom['num_nom']] = true;
1563
				$this->noms_ok[$nom['num_nom']] = true;
1560
				return true;
1564
				return true;
1561
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
1565
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
1562
				return false;
1566
				return false;
1563
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
1567
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
1564
				return false;
1568
				return false;
1565
			} else {
1569
			} else {
1566
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
1570
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
1567
				if ($retour === true) {
1571
				if ($retour === true) {
1568
					$this->noms_ok[$nom['num_tax_sup']] = true;
1572
					$this->noms_ok[$nom['num_tax_sup']] = true;
1569
				}
1573
				}
1570
				return $retour;
1574
				return $retour;
1571
			}
1575
			}
1572
		} else {
1576
		} else {
1573
			return false;
1577
			return false;
1574
		}
1578
		}
1575
	}
1579
	}
1576
	
1580
	
1577
	private function testerRang() {
1581
	private function testerRang() {
1578
		$info = array('nom' => 'rang',
1582
		$info = array('nom' => 'rang',
1579
			'description' => "Le rang doit correspondre à un valeur numérique définit dans le manuel.",
1583
			'description' => "Le rang doit correspondre à une valeur numérique définie dans le manuel.",
1580
			'resultat' => false);
1584
			'resultat' => false);
1581
		
1585
		
1582
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
1586
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
1583
		
1587
		
1584
		// Réalisation du test
1588
		// Réalisation du test
1585
		$noms_erreur = array();
1589
		$noms_erreur = array();
1586
		foreach ($this->noms as &$nom) {
1590
		foreach ($this->noms as &$nom) {
1587
			if (!isset($rangs[$nom['rang']])) {
1591
			if (!isset($rangs[$nom['rang']])) {
1588
				$noms_erreur[] = $nom['num_nom'];
1592
				$noms_erreur[] = $nom['num_nom'];
1589
			}
1593
			}
1590
		}
1594
		}
1591
		
1595
		
1592
		// Analyse des résultats
1596
		// Analyse des résultats
1593
		if (count($noms_erreur) > 0) {
1597
		if (count($noms_erreur) > 0) {
1594
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
1598
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
1595
		} else {
1599
		} else {
1596
			$info['resultat'] = true;
1600
			$info['resultat'] = true;
1597
		}
1601
		}
1598
		
1602
		
1599
		$this->traiterResultatTest($info);
1603
		$this->traiterResultatTest($info);
1600
	}
1604
	}
1601
	
1605
	
1602
	private function testerNomCompletSupraGenerique() {
1606
	private function testerNomCompletSupraGenerique() {
1603
		$info = array('nom' => 'nom_sci -> noms supra-génériques',
1607
		$info = array('nom' => 'nom_sci -> noms supra-génériques',
1604
			'description' => "Si le rang est < à {$this->manuel['rang_genre']} le nom_sci doit correspondre à la valeur du champ nom_supra_generique. ".
1608
			'description' => "Si le rang est < à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur du champ nom_supra_generique. ".
1605
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1609
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1606
			'resultat' => false);
1610
			'resultat' => false);
1607
		
1611
		
1608
		// Réalisation du test
1612
		// Réalisation du test
1609
		$noms_erreur = array();
1613
		$noms_erreur = array();
1610
		foreach ($this->noms as &$nom) {
1614
		foreach ($this->noms as &$nom) {
1611
			if ($nom['rang'] < $this->manuel['rang_genre']) {
1615
			if ($nom['rang'] < $this->manuel['rang_genre']) {
1612
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1616
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1613
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
1617
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
1614
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1618
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1615
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1619
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1616
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1620
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1617
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1621
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1618
				}
1622
				}
1619
			}
1623
			}
1620
		}
1624
		}
1621
		
1625
		
1622
		// Analyse des résultats
1626
		// Analyse des résultats
1623
		if (count($noms_erreur) > 0) {
1627
		if (count($noms_erreur) > 0) {
1624
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1628
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1625
			$info['message']['lignes'] = $noms_erreur;
1629
			$info['message']['lignes'] = $noms_erreur;
1626
		} else {
1630
		} else {
1627
			$info['resultat'] = true;
1631
			$info['resultat'] = true;
1628
		}
1632
		}
1629
		
1633
		
1630
		$this->traiterResultatTest($info);
1634
		$this->traiterResultatTest($info);
1631
	}
1635
	}
1632
	
1636
	
1633
	private function testerNomCompletGenre() {
1637
	private function testerNomCompletGenre() {
1634
		$info = array('nom' => 'nom_sci -> noms de genres',
1638
		$info = array('nom' => 'nom_sci -> noms de genres',
1635
			'description' => "Si le rang est = à {$this->manuel['rang_genre']} le nom_sci doit correspondre à la valeur du champ genre. ".
1639
			'description' => "Si le rang est = à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur du champ genre. ".
1636
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1640
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1637
			'resultat' => false);
1641
			'resultat' => false);
1638
		
1642
		
1639
		// Réalisation du test
1643
		// Réalisation du test
1640
		$noms_erreur = array();
1644
		$noms_erreur = array();
1641
		foreach ($this->noms as &$nom) {
1645
		foreach ($this->noms as &$nom) {
1642
			if ($nom['rang'] == $this->manuel['rang_genre']) {
1646
			if ($nom['rang'] == $this->manuel['rang_genre']) {
1643
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1647
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1644
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1648
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1645
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1649
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1646
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1650
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1647
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1651
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1648
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1652
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1649
				}
1653
				}
1650
			}
1654
			}
1651
		}
1655
		}
1652
		
1656
		
1653
		// Analyse des résultats
1657
		// Analyse des résultats
1654
		if (count($noms_erreur) > 0) {
1658
		if (count($noms_erreur) > 0) {
1655
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1659
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1656
			$info['message']['lignes'] = $noms_erreur;
1660
			$info['message']['lignes'] = $noms_erreur;
1657
		} else {
1661
		} else {
1658
			$info['resultat'] = true;
1662
			$info['resultat'] = true;
1659
		}
1663
		}
1660
		
1664
		
1661
		$this->traiterResultatTest($info);
1665
		$this->traiterResultatTest($info);
1662
	}
1666
	}
1663
	
1667
	
1664
	private function testerNomCompletInfraGenre() {
1668
	private function testerNomCompletInfraGenre() {
1665
		$info = array('nom' => 'nom_sci -> noms infra-génériques',
1669
		$info = array('nom' => 'nom_sci -> noms infra-génériques',
1666
			'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']} le nom_sci doit correspondre à une des formules suivantes : \n".
1670
			'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".
1667
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
1672
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
1668
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
1673
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
1669
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1674
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1670
			'resultat' => false);
1675
			'resultat' => false);
1671
		
1676
		
1672
		// Réalisation du test
1677
		// Réalisation du test
1673
		$noms_erreur = array();
1678
		$noms_erreur = array();
1674
		foreach ($this->noms as &$nom) {
1679
		foreach ($this->noms as &$nom) {
1675
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
1680
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
1676
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1681
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1677
				$nom_sci_ideal = '';
1682
				$nom_sci_ideal = '';
1678
				if ($nom['type_epithete'] == 'agg.') {
1683
				if ($nom['type_epithete'] == 'agg.') {
1679
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1684
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1680
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1685
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1681
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
1686
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
1682
				} else {
1687
				} else {
1683
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1688
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1684
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
1689
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
1685
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1690
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1686
				}
1691
				}
1687
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1692
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1688
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1693
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1689
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1694
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1690
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1695
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1691
				}
1696
				}
1692
			}
1697
			}
1693
		}
1698
		}
1694
		
1699
		
1695
		// Analyse des résultats
1700
		// Analyse des résultats
1696
		if (count($noms_erreur) > 0) {
1701
		if (count($noms_erreur) > 0) {
1697
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1702
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1698
			$info['message']['lignes'] = $noms_erreur;
1703
			$info['message']['lignes'] = $noms_erreur;
1699
		} else {
1704
		} else {
1700
			$info['resultat'] = true;
1705
			$info['resultat'] = true;
1701
		}
1706
		}
1702
		$noms_erreur = null;
1707
		$noms_erreur = null;
1703
		
1708
		
1704
		$this->traiterResultatTest($info);
1709
		$this->traiterResultatTest($info);
1705
	}
1710
	}
1706
	
1711
	
1707
	private function testerNomCompletEspece() {
1712
	private function testerNomCompletEspece() {
1708
		$info = array('nom' => "nom_sci -> noms d'espèce",
1713
		$info = array('nom' => "nom_sci -> noms d'espèce",
1709
			'description' => "Si le rang est = à {$this->manuel['rang_sp']} le nom_sci doit correspondre à la formule : \n".
1714
			'description' => "Si le rang est = à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
1710
				" genre + ' ' + epithete_sp \n".
1715
				" genre + ' ' + epithete_sp \n".
1711
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1716
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1712
			'resultat' => false);
1717
			'resultat' => false);
1713
		
1718
		
1714
		// Réalisation du test
1719
		// Réalisation du test
1715
		$noms_erreur = array();
1720
		$noms_erreur = array();
1716
		foreach ($this->noms as &$nom) {
1721
		foreach ($this->noms as &$nom) {
1717
			if ($nom['rang'] == $this->manuel['rang_sp']) {
1722
			if ($nom['rang'] == $this->manuel['rang_sp']) {
1718
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1723
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1719
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1724
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1720
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1725
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1721
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1726
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1722
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1727
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1723
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1728
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1724
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1729
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1725
				}
1730
				}
1726
			}
1731
			}
1727
		}
1732
		}
1728
		
1733
		
1729
		// Analyse des résultats
1734
		// Analyse des résultats
1730
		if (count($noms_erreur) > 0) {
1735
		if (count($noms_erreur) > 0) {
1731
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1736
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1732
			$info['message']['lignes'] = $noms_erreur;
1737
			$info['message']['lignes'] = $noms_erreur;
1733
		} else {
1738
		} else {
1734
			$info['resultat'] = true;
1739
			$info['resultat'] = true;
1735
		}
1740
		}
1736
		$noms_erreur = null;
1741
		$noms_erreur = null;
1737
		
1742
		
1738
		$this->traiterResultatTest($info);
1743
		$this->traiterResultatTest($info);
1739
	}
1744
	}
1740
	
1745
	
1741
	private function testerNomCompletInfraSpecifique() {
1746
	private function testerNomCompletInfraSpecifique() {
1742
		$info = array('nom' => 'nom_sci -> noms infra-spécifiques',
1747
		$info = array('nom' => 'nom_sci -> noms infra-spécifiques',
1743
			'description' => "Si le rang est > à {$this->manuel['rang_sp']} le nom_sci doit correspondre à la formule : \n".
1748
			'description' => "Si le rang est > à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
1744
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".	
1749
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".	
1745
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1750
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1746
			'resultat' => false);
1751
			'resultat' => false);
1747
		
1752
		
1748
		// Réalisation du test
1753
		// Réalisation du test
1749
		$noms_erreur = array();
1754
		$noms_erreur = array();
1750
		foreach ($this->noms as &$nom) {
1755
		foreach ($this->noms as &$nom) {
1751
			if ($nom['rang'] > $this->manuel['rang_sp']) {
1756
			if ($nom['rang'] > $this->manuel['rang_sp']) {
1752
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1757
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1753
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1758
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1754
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1759
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1755
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
1760
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
1756
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
1761
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
1757
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1762
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1758
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1763
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1759
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1764
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1760
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1765
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1761
				}
1766
				}
1762
			}
1767
			}
1763
		}
1768
		}
1764
		
1769
		
1765
		// Analyse des résultats
1770
		// Analyse des résultats
1766
		if (count($noms_erreur) > 0) {
1771
		if (count($noms_erreur) > 0) {
1767
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1772
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1768
			$info['message']['lignes'] = $noms_erreur;
1773
			$info['message']['lignes'] = $noms_erreur;
1769
		} else {
1774
		} else {
1770
			$info['resultat'] = true;
1775
			$info['resultat'] = true;
1771
		}
1776
		}
1772
		$noms_erreur = null;
1777
		$noms_erreur = null;
1773
		
1778
		
1774
		$this->traiterResultatTest($info);
1779
		$this->traiterResultatTest($info);
1775
	}
1780
	}
1776
	
1781
	
1777
	private function testerNomSupraGeneriqueEspaces() {
1782
	private function testerNomSupraGeneriqueEspaces() {
1778
		$info = array('nom' => 'nom_supra_generique -> espaces en trop',
1783
		$info = array('nom' => 'nom_supra_generique -> espaces en trop',
1779
			'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou aprés le nom.",
1784
			'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou après le nom.",
1780
			'resultat' => false);
1785
			'resultat' => false);
1781
		
1786
		
1782
		// Réalisation du test
1787
		// Réalisation du test
1783
		$noms_erreur = array();
1788
		$noms_erreur = array();
1784
		foreach ($this->noms as &$nom) {
1789
		foreach ($this->noms as &$nom) {
1785
			if ($nom['nom_supra_generique'] != '') {
1790
			if ($nom['nom_supra_generique'] != '') {
1786
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
1791
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
1787
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1792
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1788
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1793
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1789
				}
1794
				}
1790
			}
1795
			}
1791
		}
1796
		}
1792
		
1797
		
1793
		// Analyse des résultats
1798
		// Analyse des résultats
1794
		if (count($noms_erreur) > 0) {
1799
		if (count($noms_erreur) > 0) {
1795
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1800
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1796
			$info['message']['lignes'] = $noms_erreur;
1801
			$info['message']['lignes'] = $noms_erreur;
1797
		} else {
1802
		} else {
1798
			$info['resultat'] = true;
1803
			$info['resultat'] = true;
1799
		}
1804
		}
1800
		$noms_erreur = null;
1805
		$noms_erreur = null;
1801
		
1806
		
1802
		$this->traiterResultatTest($info);
1807
		$this->traiterResultatTest($info);
1803
	}
1808
	}
1804
	
1809
	
1805
	private function testerNomSupraGeneriqueSyntaxe() {
1810
	private function testerNomSupraGeneriqueSyntaxe() {
1806
		$info = array('nom' => 'nom_supra_generique -> syntaxe',
1811
		$info = array('nom' => 'nom_supra_generique -> syntaxe',
1807
			'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
1812
			'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules, avec ou ".
-
 
1813
				"sans tréma (¨), et de tirets (-). \n".
1808
				"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
1814
				"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
1809
			'resultat' => false);
1815
			'resultat' => false);
1810
		
1816
		
1811
		// Réalisation du test
1817
		// Réalisation du test
1812
		$noms_erreur = array();
1818
		$noms_erreur = array();
1813
		foreach ($this->noms as &$nom) {
1819
		foreach ($this->noms as &$nom) {
1814
			if ($nom['nom_supra_generique'] != '') {
1820
			if ($nom['nom_supra_generique'] != '') {
1815
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
1821
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
1816
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1822
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
1817
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1823
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
1818
				}
1824
				}
1819
			}
1825
			}
1820
		}
1826
		}
1821
		
1827
		
1822
		// Analyse des résultats
1828
		// Analyse des résultats
1823
		if (count($noms_erreur) > 0) {
1829
		if (count($noms_erreur) > 0) {
1824
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1830
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
1825
			$info['message']['lignes'] = $noms_erreur;
1831
			$info['message']['lignes'] = $noms_erreur;
1826
		} else {
1832
		} else {
1827
			$info['resultat'] = true;
1833
			$info['resultat'] = true;
1828
		}
1834
		}
1829
		$noms_erreur = null;
1835
		$noms_erreur = null;
1830
		
1836
		
1831
		$this->traiterResultatTest($info);
1837
		$this->traiterResultatTest($info);
1832
	}
1838
	}
1833
	
1839
	
1834
	private function testerNomSupraGeneriqueRang() {
1840
	private function testerNomSupraGeneriqueRang() {
1835
		$info = array('nom' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
1841
		$info = array('nom' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
1836
			'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$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']}.",
1837
			'resultat' => false);
1843
			'resultat' => false);
1838
		
1844
		
1839
		// Réalisation du test
1845
		// Réalisation du test
1840
		$noms_erreur = array();
1846
		$noms_erreur = array();
1841
		foreach ($this->noms as &$nom) {
1847
		foreach ($this->noms as &$nom) {
1842
			if ($nom['nom_supra_generique'] != '') {
1848
			if ($nom['nom_supra_generique'] != '') {
1843
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
1849
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
1844
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1850
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1845
				}
1851
				}
1846
			}
1852
			}
1847
		}
1853
		}
1848
		
1854
		
1849
		// Analyse des résultats
1855
		// Analyse des résultats
1850
		if (count($noms_erreur) > 0) {
1856
		if (count($noms_erreur) > 0) {
1851
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1857
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1852
			$info['message']['lignes'] = $noms_erreur;
1858
			$info['message']['lignes'] = $noms_erreur;
1853
		} else {
1859
		} else {
1854
			$info['resultat'] = true;
1860
			$info['resultat'] = true;
1855
		}
1861
		}
1856
		$noms_erreur = null;
1862
		$noms_erreur = null;
1857
		
1863
		
1858
		$this->traiterResultatTest($info);
1864
		$this->traiterResultatTest($info);
1859
	}
1865
	}
1860
	
1866
	
1861
	private function testerGenreEspaces() {
1867
	private function testerGenreEspaces() {
1862
		$info = array('nom' => 'genre -> espaces en trop',
1868
		$info = array('nom' => 'genre -> espaces en trop',
1863
			'description' => "Le champ genre ne doit pas contenir d'espace avant ou aprés le nom.\n".
1869
			'description' => "Le champ genre ne doit pas contenir d'espace avant ou après le nom.\n".
1864
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
1870
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
1865
			'resultat' => false);
1871
			'resultat' => false);
1866
		
1872
		
1867
		// Réalisation du test
1873
		// Réalisation du test
1868
		$noms_erreur = array();
1874
		$noms_erreur = array();
1869
		foreach ($this->noms as &$nom) {
1875
		foreach ($this->noms as &$nom) {
1870
			if ($nom['genre'] != '') {
1876
			if ($nom['genre'] != '') {
1871
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
1877
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
1872
					$nom_traite = $this->repererEspace($nom['genre']);
1878
					$nom_traite = $this->repererEspace($nom['genre']);
1873
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1879
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1874
				}
1880
				}
1875
			}
1881
			}
1876
		}
1882
		}
1877
		
1883
		
1878
		// Analyse des résultats
1884
		// Analyse des résultats
1879
		if (count($noms_erreur) > 0) {
1885
		if (count($noms_erreur) > 0) {
1880
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1886
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1881
			$info['message']['lignes'] = $noms_erreur;
1887
			$info['message']['lignes'] = $noms_erreur;
1882
		} else {
1888
		} else {
1883
			$info['resultat'] = true;
1889
			$info['resultat'] = true;
1884
		}
1890
		}
1885
		$noms_erreur = null;
1891
		$noms_erreur = null;
1886
		
1892
		
1887
		$this->traiterResultatTest($info);
1893
		$this->traiterResultatTest($info);
1888
	}
1894
	}
1889
	
1895
	
1890
	private function testerGenreSyntaxe() {
1896
	private function testerGenreSyntaxe() {
1891
		$info = array('nom' => 'genre -> syntaxe',
1897
		$info = array('nom' => 'genre -> syntaxe',
1892
			'description' => "Le champ genre peut contenir :\n".
1898
			'description' => "Le champ genre peut contenir :\n".
1893
			 	" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
1899
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
1894
				"	Il commence par une lettre majuscule (avec ou sans tréma).". 
1900
				"	Il commence par une lettre majuscule (avec ou sans tréma) et peut être précédé par \n".
1895
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
1901
				"   le signe + ou la lettre x suivi d'un espace.\n".
1896
				" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés entre eux \n".
1902
				" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés\n ".
1897
				"	par la lettre x entourée de caractères espaces.",
1903
				"	entre eux par la lettre x entourée de caractères espaces.",
1898
			'resultat' => false);
1904
			'resultat' => false);
1899
		
1905
		
1900
		// Réalisation du test
1906
		// Réalisation du test
1901
		$noms_erreur = array();
1907
		$noms_erreur = array();
1902
		foreach ($this->noms as &$nom) {
1908
		foreach ($this->noms as &$nom) {
1903
			if ($nom['genre'] != '') {
1909
			if ($nom['genre'] != '') {
1904
				$mots = explode(' ', $nom['genre']);
1910
				$mots = explode(' ', $nom['genre']);
1905
				foreach ($mots as $mot) {
1911
				foreach ($mots as $mot) {
1906
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
1912
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
1907
						$nom_traite = $this->repererEspace($nom['genre']);
1913
						$nom_traite = $this->repererEspace($nom['genre']);
1908
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1914
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1909
					}
1915
					}
1910
				}
1916
				}
1911
			}
1917
			}
1912
		}
1918
		}
1913
		
1919
		
1914
		// Analyse des résultats
1920
		// Analyse des résultats
1915
		if (count($noms_erreur) > 0) {
1921
		if (count($noms_erreur) > 0) {
1916
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1922
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1917
			$info['message']['lignes'] = $noms_erreur;
1923
			$info['message']['lignes'] = $noms_erreur;
1918
		} else {
1924
		} else {
1919
			$info['resultat'] = true;
1925
			$info['resultat'] = true;
1920
		}
1926
		}
1921
		$noms_erreur = null;
1927
		$noms_erreur = null;
1922
		
1928
		
1923
		$this->traiterResultatTest($info);
1929
		$this->traiterResultatTest($info);
1924
	}
1930
	}
1925
	
1931
	
1926
	private function testerGenreRang() {
1932
	private function testerGenreRang() {
1927
		$info = array('nom' => "genre -> rang >= {$this->manuel['rang_genre']}",
1933
		$info = array('nom' => "genre -> rang >= {$this->manuel['rang_genre']}",
1928
			'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$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']}.",
1929
			'resultat' => false);
1935
			'resultat' => false);
1930
		
1936
		
1931
		// Réalisation du test
1937
		// Réalisation du test
1932
		$noms_erreur = array();
1938
		$noms_erreur = array();
1933
		foreach ($this->noms as &$nom) {
1939
		foreach ($this->noms as &$nom) {
1934
			if ($nom['genre'] != '') {
1940
			if ($nom['genre'] != '') {
1935
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1941
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1936
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1942
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1937
				}
1943
				}
1938
			}
1944
			}
1939
		}
1945
		}
1940
		
1946
		
1941
		// Analyse des résultats
1947
		// Analyse des résultats
1942
		if (count($noms_erreur) > 0) {
1948
		if (count($noms_erreur) > 0) {
1943
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1949
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1944
			$info['message']['lignes'] = $noms_erreur;
1950
			$info['message']['lignes'] = $noms_erreur;
1945
		} else {
1951
		} else {
1946
			$info['resultat'] = true;
1952
			$info['resultat'] = true;
1947
		}
1953
		}
1948
		$noms_erreur = null;
1954
		$noms_erreur = null;
1949
		
1955
		
1950
		$this->traiterResultatTest($info);
1956
		$this->traiterResultatTest($info);
1951
	}
1957
	}
1952
		
1958
		
1953
	private function testerEpitheteInfraGeneriqueSyntaxe() {
1959
	private function testerEpitheteInfraGeneriqueSyntaxe() {
1954
		$info = array('nom' => 'epithete_infra_generique -> syntaxe',
1960
		$info = array('nom' => 'epithete_infra_generique -> syntaxe',
1955
			'description' => "Le champ epithete_infra_generique est composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
1961
			'description' => "Le champ epithete_infra_generique est composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
1956
				"La première lettre (avec ou sans tréma) doit être en majuscule.",
1962
				"La première lettre (avec ou sans tréma) doit être en majuscule.",
1957
			'resultat' => false);
1963
			'resultat' => false);
1958
		
1964
		
1959
		// Réalisation du test
1965
		// Réalisation du test
1960
		$noms_erreur = array();
1966
		$noms_erreur = array();
1961
		foreach ($this->noms as &$nom) {
1967
		foreach ($this->noms as &$nom) {
1962
			if ($nom['epithete_infra_generique'] != '') {
1968
			if ($nom['epithete_infra_generique'] != '') {
1963
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1969
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1964
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1970
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1965
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1971
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1966
				}
1972
				}
1967
			}
1973
			}
1968
		}
1974
		}
1969
		
1975
		
1970
		// Analyse des résultats
1976
		// Analyse des résultats
1971
		if (count($noms_erreur) > 0) {
1977
		if (count($noms_erreur) > 0) {
1972
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1978
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1973
			$info['message']['lignes'] = $noms_erreur;
1979
			$info['message']['lignes'] = $noms_erreur;
1974
		} else {
1980
		} else {
1975
			$info['resultat'] = true;
1981
			$info['resultat'] = true;
1976
		}
1982
		}
1977
		$noms_erreur = null;
1983
		$noms_erreur = null;
1978
		
1984
		
1979
		$this->traiterResultatTest($info);
1985
		$this->traiterResultatTest($info);
1980
	}
1986
	}
1981
	
1987
	
1982
	private function testerEpitheteInfraGeneriqueRang() {
1988
	private function testerEpitheteInfraGeneriqueRang() {
1983
		$info = array('nom' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
1989
		$info = array('nom' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
1984
			'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris \n".
1990
			'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris ".
1985
				"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
1991
				"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
1986
			'resultat' => false);
1992
			'resultat' => false);
1987
		
1993
		
1988
		// Réalisation du test
1994
		// Réalisation du test
1989
		$noms_erreur = array();
1995
		$noms_erreur = array();
1990
		foreach ($this->noms as &$nom) {
1996
		foreach ($this->noms as &$nom) {
1991
			if ($nom['epithete_infra_generique'] != '') {
1997
			if ($nom['epithete_infra_generique'] != '') {
1992
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
1998
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
1993
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1999
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1994
				}
2000
				}
1995
			}
2001
			}
1996
		}
2002
		}
1997
		
2003
		
1998
		// Analyse des résultats
2004
		// Analyse des résultats
1999
		if (count($noms_erreur) > 0) {
2005
		if (count($noms_erreur) > 0) {
2000
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
2006
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
2001
			$info['message']['lignes'] = $noms_erreur;
2007
			$info['message']['lignes'] = $noms_erreur;
2002
		} else {
2008
		} else {
2003
			$info['resultat'] = true;
2009
			$info['resultat'] = true;
2004
		}
2010
		}
2005
		$noms_erreur = null;
2011
		$noms_erreur = null;
2006
		
2012
		
2007
		$this->traiterResultatTest($info);
2013
		$this->traiterResultatTest($info);
2008
	}
2014
	}
2009
	
2015
	
2010
	private function testerEpitheteInfraGeneriqueEspaces() {
2016
	private function testerEpitheteInfraGeneriqueEspaces() {
2011
		$info = array('nom' => 'epithete_infra_generique -> espaces en trop',
2017
		$info = array('nom' => 'epithete_infra_generique -> espaces en trop',
2012
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou aprés sa valeur.",
2018
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou après sa valeur.",
2013
			'resultat' => false);
2019
			'resultat' => false);
2014
		
2020
		
2015
		// Réalisation du test
2021
		// Réalisation du test
2016
		$noms_erreur = array();
2022
		$noms_erreur = array();
2017
		foreach ($this->noms as &$nom) {
2023
		foreach ($this->noms as &$nom) {
2018
			if ($nom['epithete_infra_generique'] != '') {
2024
			if ($nom['epithete_infra_generique'] != '') {
2019
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
2025
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
2020
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
2026
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
2021
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2027
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2022
				}
2028
				}
2023
			}
2029
			}
2024
		}
2030
		}
2025
		
2031
		
2026
		// Analyse des résultats
2032
		// Analyse des résultats
2027
		if (count($noms_erreur) > 0) {
2033
		if (count($noms_erreur) > 0) {
2028
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
2034
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
2029
			$info['message']['lignes'] = $noms_erreur;
2035
			$info['message']['lignes'] = $noms_erreur;
2030
		} else {
2036
		} else {
2031
			$info['resultat'] = true;
2037
			$info['resultat'] = true;
2032
		}
2038
		}
2033
		$noms_erreur = null;
2039
		$noms_erreur = null;
2034
		
2040
		
2035
		$this->traiterResultatTest($info);
2041
		$this->traiterResultatTest($info);
2036
	}
2042
	}
2037
	
2043
	
2038
	private function testerEpitheteSpEspaces() {
2044
	private function testerEpitheteSpEspaces() {
2039
		$info = array('nom' => 'epithete_sp -> espaces en trop',
2045
		$info = array('nom' => 'epithete_sp -> espaces en trop',
2040
			'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
2046
			'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou après le nom.\n".
2041
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
2047
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
2042
			'resultat' => false);
2048
			'resultat' => false);
2043
		
2049
		
2044
		// Réalisation du test
2050
		// Réalisation du test
2045
		$noms_erreur = array();
2051
		$noms_erreur = array();
2046
		foreach ($this->noms as &$nom) {
2052
		foreach ($this->noms as &$nom) {
2047
			if ($nom['epithete_sp'] != '') {
2053
			if ($nom['epithete_sp'] != '') {
2048
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
2054
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
2049
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2055
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2050
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2056
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2051
				}
2057
				}
2052
			}
2058
			}
2053
		}
2059
		}
2054
		
2060
		
2055
		// Analyse des résultats
2061
		// Analyse des résultats
2056
		if (count($noms_erreur) > 0) {
2062
		if (count($noms_erreur) > 0) {
2057
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2063
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2058
			$info['message']['lignes'] = $noms_erreur;
2064
			$info['message']['lignes'] = $noms_erreur;
2059
		} else {
2065
		} else {
2060
			$info['resultat'] = true;
2066
			$info['resultat'] = true;
2061
		}
2067
		}
2062
		$noms_erreur = null;
2068
		$noms_erreur = null;
2063
		
2069
		
2064
		$this->traiterResultatTest($info);
2070
		$this->traiterResultatTest($info);
2065
	}
2071
	}
2066
	
2072
	
2067
	private function testerEpitheteSpSyntaxe() {
2073
	private function testerEpitheteSpSyntaxe() {
2068
		$info = array('nom' => 'epithete_sp -> syntaxe',
2074
		$info = array('nom' => 'epithete_sp -> syntaxe',
2069
			'description' => "Le champ epithete_sp peut contenir :\n".
2075
			'description' => "Le champ epithete_sp peut contenir :\n".
2070
			 	" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
2076
			 	" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
2071
				"	Il commence par une lettre minuscule [a-zëï].\n". 
2077
				"	Il commence par une lettre minuscule [a-zëï].\n". 
2072
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
2078
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
2073
				" - un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9) ou d'un seul caractère majuscule (A-Z) \n".
2079
				" - 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".
2074
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) séparés entre eux \n".
2081
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) \n".
2075
				"	par la lettre x entourée de caractères espaces.",
2082
				"	séparés entre eux par la lettre x entourée de caractères espaces.",
2076
			'resultat' => false);
2083
			'resultat' => false);
2077
		
2084
		
2078
		// Réalisation du test
2085
		// Réalisation du test
2079
		$noms_erreur = array();
2086
		$noms_erreur = array();
2080
		foreach ($this->noms as &$nom) {
2087
		foreach ($this->noms as &$nom) {
2081
			if ($nom['epithete_sp'] != '') {
2088
			if ($nom['epithete_sp'] != '') {
2082
				$mots = explode(' ', $nom['epithete_sp']);
2089
				$mots = explode(' ', $nom['epithete_sp']);
2083
				foreach ($mots as $mot) {
2090
				foreach ($mots as $mot) {
2084
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
2091
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
2085
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2092
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2086
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2093
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2087
					}
2094
					}
2088
				}
2095
				}
2089
			}
2096
			}
2090
		}
2097
		}
2091
		
2098
		
2092
		// Analyse des résultats
2099
		// Analyse des résultats
2093
		if (count($noms_erreur) > 0) {
2100
		if (count($noms_erreur) > 0) {
2094
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2101
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2095
			$info['message']['lignes'] = $noms_erreur;
2102
			$info['message']['lignes'] = $noms_erreur;
2096
		} else {
2103
		} else {
2097
			$info['resultat'] = true;
2104
			$info['resultat'] = true;
2098
		}
2105
		}
2099
		$noms_erreur = null;
2106
		$noms_erreur = null;
2100
		
2107
		
2101
		$this->traiterResultatTest($info);
2108
		$this->traiterResultatTest($info);
2102
	}
2109
	}
2103
	
2110
	
2104
	private function testerEpitheteSpRang() {
2111
	private function testerEpitheteSpRang() {
2105
		$info = array('nom' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
2112
		$info = array('nom' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
2106
			'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']}.",
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']}.",
2107
			'resultat' => false);
2114
			'resultat' => false);
2108
		
2115
		
2109
		// Réalisation du test
2116
		// Réalisation du test
2110
		$noms_erreur = array();
2117
		$noms_erreur = array();
2111
		foreach ($this->noms as &$nom) {
2118
		foreach ($this->noms as &$nom) {
2112
			if ($nom['epithete_sp'] != '') {
2119
			if ($nom['epithete_sp'] != '') {
2113
				if ($nom['rang'] < $this->manuel['rang_sp']) {
2120
				if ($nom['rang'] < $this->manuel['rang_sp']) {
2114
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
2121
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
2115
				}
2122
				}
2116
			}
2123
			}
2117
		}
2124
		}
2118
		
2125
		
2119
		// Analyse des résultats
2126
		// Analyse des résultats
2120
		if (count($noms_erreur) > 0) {
2127
		if (count($noms_erreur) > 0) {
2121
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
2128
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
2122
			$info['message']['lignes'] = $noms_erreur;
2129
			$info['message']['lignes'] = $noms_erreur;
2123
		} else {
2130
		} else {
2124
			$info['resultat'] = true;
2131
			$info['resultat'] = true;
2125
		}
2132
		}
2126
		$noms_erreur = null;
2133
		$noms_erreur = null;
2127
		
2134
		
2128
		$this->traiterResultatTest($info);
2135
		$this->traiterResultatTest($info);
2129
	}
2136
	}
2130
	
2137
	
2131
	
2138
	
2132
	private function testerExclureTaxRefSyntaxe() {
2139
	private function testerExclureTaxRefSyntaxe() {
2133
		$info = array('nom' => 'exclure_taxref -> syntaxe',
2140
		$info = array('nom' => 'exclure_taxref -> syntaxe',
2134
			'description' => "Le champ exclure_taxref contient soit :\n".
2141
			'description' => "Le champ exclure_taxref contient soit :\n".
2135
			" - une valeur vide.\n".
2142
			" - une valeur vide.\n".
2136
			" - une valeur null.\n".
2143
			" - une valeur null.\n".
2137
			" - le chiffre 0.\n".
2144
			" - le chiffre 0.\n".
2138
			" - le chiffre 1",
2145
			" - le chiffre 1",
2139
			'resultat' => false);
2146
			'resultat' => false);
2140
		
2147
		
2141
		// Réalisation du test
2148
		// Réalisation du test
2142
		$noms_erreur = array();
2149
		$noms_erreur = array();
2143
		foreach ($this->noms as &$nom) {
2150
		foreach ($this->noms as &$nom) {
2144
			if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
2151
			if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
2145
				if (!$this->verifierBooleen($nom['exclure_taxref'])) {
2152
				if (!$this->verifierBooleen($nom['exclure_taxref'])) {
2146
					$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
2153
					$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
2147
				}
2154
				}
2148
			}
2155
			}
2149
		}
2156
		}
2150
		
2157
		
2151
		// Analyse des résultats
2158
		// Analyse des résultats
2152
		if (count($noms_erreur) > 0) {
2159
		if (count($noms_erreur) > 0) {
2153
			$info['message']['entete'] = array('num_nom', 'exclure_taxref erroné');
2160
			$info['message']['entete'] = array('num_nom', 'exclure_taxref erroné');
2154
			$info['message']['lignes'] = $noms_erreur;
2161
			$info['message']['lignes'] = $noms_erreur;
2155
		} else {
2162
		} else {
2156
			$info['resultat'] = true;
2163
			$info['resultat'] = true;
2157
		}
2164
		}
2158
		$noms_erreur = null;
2165
		$noms_erreur = null;
2159
		
2166
		
2160
		$this->traiterResultatTest($info);
2167
		$this->traiterResultatTest($info);
2161
	}
2168
	}
2162
	//+--------------------------------------------------------------------------------------------------------------+//
2169
	//+--------------------------------------------------------------------------------------------------------------+//
2163
	// MÉTHODES COMMUNES aux TESTS
2170
	// MÉTHODES COMMUNES aux TESTS
2164
	
2171
	
2165
	private function verifierPresence(&$valeur) {
2172
	private function verifierPresence(&$valeur) {
2166
		$codes = $this->manuel['codes_presence'];
2173
		$codes = $this->manuel['codes_presence'];
2167
		$ok = $this->verifierStatuts($valeur, $codes);
2174
		$ok = $this->verifierStatuts($valeur, $codes);
2168
		return $ok;
2175
		return $ok;
2169
	}
2176
	}
2170
	
2177
	
2171
	private function verifierStatutOrigine(&$valeur) {
2178
	private function verifierStatutOrigine(&$valeur) {
2172
		$codes = $this->manuel['codes_statuts_origine'];
2179
		$codes = $this->manuel['codes_statuts_origine'];
2173
		$ok = $this->verifierStatuts($valeur, $codes);
2180
		$ok = $this->verifierStatuts($valeur, $codes);
2174
		return $ok;
2181
		return $ok;
2175
	}
2182
	}
2176
	
2183
	
2177
	private function verifierStatutIntroduction(&$valeur) {
2184
	private function verifierStatutIntroduction(&$valeur) {
2178
		$codes = $this->manuel['codes_statuts_introduction'];
2185
		$codes = $this->manuel['codes_statuts_introduction'];
2179
		$ok = $this->verifierStatuts($valeur, $codes);
2186
		$ok = $this->verifierStatuts($valeur, $codes);
2180
		return $ok;
2187
		return $ok;
2181
	}
2188
	}
2182
	
2189
	
2183
	private function verifierStatutCulture(&$valeur) {
2190
	private function verifierStatutCulture(&$valeur) {
2184
		$codes = $this->manuel['codes_statuts_culture'];
2191
		$codes = $this->manuel['codes_statuts_culture'];
2185
		$ok = $this->verifierStatuts($valeur, $codes);
2192
		$ok = $this->verifierStatuts($valeur, $codes);
2186
		return $ok;
2193
		return $ok;
2187
	}
2194
	}
2188
	
2195
	
2189
	private function verifierStatuts(&$valeur, &$codes) {
2196
	private function verifierStatuts(&$valeur, &$codes) {
2190
		$ok = true;
2197
		$ok = true;
2191
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
2198
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
2192
			$ok = false;
2199
			$ok = false;
2193
		}
2200
		}
2194
		return $ok;
2201
		return $ok;
2195
	}
2202
	}
2196
	
2203
	
2197
	private function verifierBooleen(&$valeur) {
2204
	private function verifierBooleen(&$valeur) {
2198
		$ok = true;
2205
		$ok = true;
2199
		if (!preg_match('/^1$/', $valeur)) {
2206
		if (!preg_match('/^1$/', $valeur)) {
2200
			$ok = false;
2207
			$ok = false;
2201
		}
2208
		}
2202
		return $ok;
2209
		return $ok;
2203
	}
2210
	}
2204
	
2211
	
2205
	private function verifierNombre(&$valeur) {
2212
	private function verifierNombre(&$valeur) {
2206
		$ok = true;
2213
		$ok = true;
2207
		if (!preg_match('/^[0-9]+$/', $valeur)) {
2214
		if (!preg_match('/^[0-9]+$/', $valeur)) {
2208
			$ok = false;
2215
			$ok = false;
2209
		}
2216
		}
2210
		return $ok;
2217
		return $ok;
2211
	}
2218
	}
2212
	
2219
	
2213
	private function verifierNombreSuite(&$valeur) {
2220
	private function verifierNombreSuite(&$valeur) {
2214
		$ok = true;
2221
		$ok = true;
2215
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
2222
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
2216
			$ok = false;
2223
			$ok = false;
2217
		}
2224
		}
2218
		return $ok;
2225
		return $ok;
2219
	}
2226
	}
2220
	
2227
	
2221
	private function verifierTypeEpithete(&$type) {
2228
	private function verifierTypeEpithete(&$type) {
2222
		$ok = false;
2229
		$ok = false;
2223
		$rejetes = $this->manuel['type_epithete_rejetes'];
2230
		$rejetes = $this->manuel['type_epithete_rejetes'];
2224
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
2231
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
2225
			$ok = false;
2232
			$ok = false;
2226
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
2233
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
2227
			$ok = true;
2234
			$ok = true;
2228
		}
2235
		}
2229
		return $ok;
2236
		return $ok;
2230
	}
2237
	}
2231
	
2238
	
2232
	private function verifierBiblioOrigine(&$intitule) {
2239
	private function verifierBiblioOrigine(&$intitule) {
2233
		$ok = true;
2240
		$ok = true;
2234
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2241
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2235
			$ok = false;// Contient des espaces en trop
2242
			$ok = false;// Contient des espaces en trop
2236
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
2243
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
2237
			$ok = false;
2244
			$ok = false;
2238
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
2245
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
2239
			$ok = false;// Contient une mauvaise suite de caractères
2246
			$ok = false;// Contient une mauvaise suite de caractères
2240
		}
2247
		}
2241
		return $ok;
2248
		return $ok;
2242
	}
2249
	}
2243
	
2250
	
2244
	private function verifierAnnee(&$annee) {
2251
	private function verifierAnnee(&$annee) {
2245
		$ok = true;
2252
		$ok = true;
2246
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
2253
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
2247
			$ok = false;
2254
			$ok = false;
2248
		} else if ($annee < 1753) {
2255
		} else if ($annee < 1753) {
2249
			$ok = false;
2256
			$ok = false;
2250
		}
2257
		}
2251
		return $ok;
2258
		return $ok;
2252
	}
2259
	}
2253
	
2260
	
2254
	private function verifierAuteur(&$intitule) {
2261
	private function verifierAuteur(&$intitule) {
2255
		$ok = true;
2262
		$ok = true;
2256
		$acceptes = $this->manuel['auteur_acceptes'];
2263
		$acceptes = $this->manuel['auteur_acceptes'];
2257
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
2264
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
2258
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2265
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2259
				$ok = false;// Contient des espaces en trop
2266
				$ok = false;// Contient des espaces en trop
2260
			} else {
2267
			} else {
2261
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
2268
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
2262
				$mots = explode(' ', $intitule);
2269
				$mots = explode(' ', $intitule);
2263
				foreach ($mots as $position => $mot) {
2270
				foreach ($mots as $position => $mot) {
2264
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2271
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2265
						$ok = false;// Mot rejeté
2272
						$ok = false;// Mot rejeté
2266
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
2273
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
2267
						continue;// Mot de l'intitulé auteur
2274
						continue;// Mot de l'intitulé auteur
2268
					} else {
2275
					} else {
2269
						$ok = false;
2276
						$ok = false;
2270
					}
2277
					}
2271
				}
2278
				}
2272
			}
2279
			}
2273
		}
2280
		}
2274
		return $ok;
2281
		return $ok;
2275
	}
2282
	}
2276
	
2283
	
2277
	private function verifierNomCommercial(&$epithete) {
2284
	private function verifierNomCommercial(&$epithete) {
2278
		$ok = false;
2285
		$ok = false;
2279
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
2286
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
2280
			$ok = true;
2287
			$ok = true;
2281
		}
2288
		}
2282
		return $ok;
2289
		return $ok;
2283
	}
2290
	}
2284
	
2291
	
2285
	private function verifierEpitheteCultivar(&$epithete) {
2292
	private function verifierEpitheteCultivar(&$epithete) {
2286
		$ok = true;
2293
		$ok = true;
2287
		$acceptes = $this->manuel['cultivar_acceptes'];
2294
		$acceptes = $this->manuel['cultivar_acceptes'];
2288
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2295
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2289
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2296
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2290
				$ok = false;// Contient des espaces en trop
2297
				$ok = false;// Contient des espaces en trop
2291
			} else {
2298
			} else {
2292
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
2299
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
2293
				$mots_mineurs = $this->manuel['mots_mineurs'];
2300
				$mots_mineurs = $this->manuel['mots_mineurs'];
2294
				$mots = explode(' ', $epithete);
2301
				$mots = explode(' ', $epithete);
2295
				foreach ($mots as $position => $mot) {
2302
				foreach ($mots as $position => $mot) {
2296
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2303
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2297
						$ok = false;// Mot rejeté
2304
						$ok = false;// Mot rejeté
2298
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2305
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2299
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2306
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2300
					} else {
2307
					} else {
2301
						$mots_tiret = explode('-', $mot);
2308
						$mots_tiret = explode('-', $mot);
2302
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2309
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2303
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2310
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2304
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
2311
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
2305
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2312
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2306
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
2313
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
2307
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2314
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2308
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2315
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2309
							} else {
2316
							} else {
2310
								$ok = false;
2317
								$ok = false;
2311
							}
2318
							}
2312
						}
2319
						}
2313
					}
2320
					}
2314
				}
2321
				}
2315
			}
2322
			}
2316
		}
2323
		}
2317
		return $ok;
2324
		return $ok;
2318
	}
2325
	}
2319
	
2326
	
2320
	private function verifierEpitheteGroupeCultivar(&$epithete) {
2327
	private function verifierEpitheteGroupeCultivar(&$epithete) {
2321
		$ok = true;
2328
		$ok = true;
2322
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
2329
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
2323
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2330
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2324
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2331
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2325
				$ok = false;// Contient des espaces en trop
2332
				$ok = false;// Contient des espaces en trop
2326
			} else {
2333
			} else {
2327
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
2334
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
2328
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
2335
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
2329
				$mots_mineurs = $this->manuel['mots_mineurs'];
2336
				$mots_mineurs = $this->manuel['mots_mineurs'];
2330
				$mots = explode(' ', $epithete);
2337
				$mots = explode(' ', $epithete);
2331
				foreach ($mots as $position => $mot) {
2338
				foreach ($mots as $position => $mot) {
2332
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
2339
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
2333
						continue;// Mot accepté
2340
						continue;// Mot accepté
2334
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2341
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2335
						$ok = false;// Mot rejeté
2342
						$ok = false;// Mot rejeté
2336
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2343
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2337
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2344
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2338
					} else {
2345
					} else {
2339
						$mots_tiret = explode('-', $mot);
2346
						$mots_tiret = explode('-', $mot);
2340
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2347
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2341
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2348
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2342
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
2349
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
2343
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2350
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2344
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
2351
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
2345
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2352
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2346
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2353
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2347
							} else {
2354
							} else {
2348
								$ok = false;
2355
								$ok = false;
2349
							}
2356
							}
2350
						}
2357
						}
2351
					}
2358
					}
2352
				}
2359
				}
2353
			}
2360
			}
2354
		}
2361
		}
2355
		return $ok;
2362
		return $ok;
2356
	}
2363
	}
2357
	
2364
	
2358
	private function verifierEpitheteSp(&$epithete) {
2365
	private function verifierEpitheteSp(&$epithete) {
2359
		$ok = false;
2366
		$ok = false;
2360
		if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
2367
		if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
2361
			$ok = true;
2368
			$ok = true;
2362
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
2369
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
2363
			$ok = true;
2370
			$ok = true;
2364
		}
2371
		}
2365
		return $ok;
2372
		return $ok;
2366
	}
2373
	}
2367
	
2374
	
2368
	private function verifierEpitheteGenre(&$epithete) {
2375
	private function verifierEpitheteGenre(&$epithete) {
2369
		$ok = false;
2376
		$ok = false;
2370
		if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
2377
		if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
2371
			$ok = true;
2378
			$ok = true;
2372
		}
2379
		}
2373
		return $ok;
2380
		return $ok;
2374
	}
2381
	}
2375
	
2382
	
2376
	private function formaterStyleNomGenre(&$genre) {
2383
	private function formaterStyleNomGenre(&$genre) {
2377
		$genre_fmt = '';
2384
		$genre_fmt = '';
2378
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
2385
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
2379
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
2386
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
2380
		} else {
2387
		} else {
2381
			$genre_fmt = ucfirst(strtolower($genre));
2388
			$genre_fmt = ucfirst(strtolower($genre));
2382
		}
2389
		}
2383
		return $genre_fmt;
2390
		return $genre_fmt;
2384
	}
2391
	}
2385
	
2392
	
2386
	private function repererEspace($nom_sci) {
2393
	private function repererEspace($nom_sci) {
2387
		$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
2394
		$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
2388
		return $nom_sci;
2395
		return $nom_sci;
2389
	}
2396
	}
2390
	
2397
	
2391
	private function construireSuffixeNomPltCultivee(&$nom) {
2398
	private function construireSuffixeNomPltCultivee(&$nom) {
2392
		$suffixe = array();
2399
		$suffixe = array();
2393
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
2400
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
2394
		$suffixe[] = $this->construireNomCommercial($nom);
2401
		$suffixe[] = $this->construireNomCommercial($nom);
2395
		$suffixe[] = $this->construireNomCultivar($nom);
2402
		$suffixe[] = $this->construireNomCultivar($nom);
2396
		$suffixe = array_filter($suffixe);
2403
		$suffixe = array_filter($suffixe);
2397
		return implode(' ', $suffixe);
2404
		return implode(' ', $suffixe);
2398
	}
2405
	}
2399
	
2406
	
2400
	private function construireNomCultivarGroupe(&$nom) {
2407
	private function construireNomCultivarGroupe(&$nom) {
2401
		$nom_groupe_cultivar = '';
2408
		$nom_groupe_cultivar = '';
2402
		if ($nom['cultivar_groupe'] != '') {
2409
		if ($nom['cultivar_groupe'] != '') {
2403
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
2410
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
2404
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
2411
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
2405
			} else {
2412
			} else {
2406
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
2413
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
2407
			}
2414
			}
2408
		}
2415
		}
2409
		return $nom_groupe_cultivar;
2416
		return $nom_groupe_cultivar;
2410
	}
2417
	}
2411
	
2418
	
2412
	private function construireNomCommercial(&$nom) {
2419
	private function construireNomCommercial(&$nom) {
2413
		$nom_commercial = '';
2420
		$nom_commercial = '';
2414
		if ($nom['nom_commercial'] != '') {
2421
		if ($nom['nom_commercial'] != '') {
2415
			$nom_commercial =  strtoupper($nom['nom_commercial']);
2422
			$nom_commercial =  strtoupper($nom['nom_commercial']);
2416
		}
2423
		}
2417
		return $nom_commercial;
2424
		return $nom_commercial;
2418
	}
2425
	}
2419
	
2426
	
2420
	private function construireNomCultivar(&$nom) {
2427
	private function construireNomCultivar(&$nom) {
2421
		$nom_cultivar = '';
2428
		$nom_cultivar = '';
2422
		if ($nom['cultivar'] != '') {
2429
		if ($nom['cultivar'] != '') {
2423
			$nom_cultivar =  "'".$nom['cultivar']."'";
2430
			$nom_cultivar =  "'".$nom['cultivar']."'";
2424
		}
2431
		}
2425
		return $nom_cultivar;
2432
		return $nom_cultivar;
2426
	}
2433
	}
2427
	
2434
	
2428
	private function classerNomsParNomComplet() {
2435
	private function classerNomsParNomComplet() {
2429
		$noms_classes = array();
2436
		$noms_classes = array();
2430
		foreach ($this->noms as &$nom) {
2437
		foreach ($this->noms as &$nom) {
2431
			if (!isset($noms_classes[$nom['nom_sci']])) {
2438
			if (!isset($noms_classes[$nom['nom_sci']])) {
2432
				$noms_classes[$nom['nom_sci']] = 1;
2439
				$noms_classes[$nom['nom_sci']] = 1;
2433
			} else {
2440
			} else {
2434
				$noms_classes[$nom['nom_sci']]++;
2441
				$noms_classes[$nom['nom_sci']]++;
2435
			}
2442
			}
2436
		}
2443
		}
2437
		return $noms_classes;
2444
		return $noms_classes;
2438
	}
2445
	}
2439
 
2446
 
2440
}
2447
}
2441
?>
2448
?>