Subversion Repositories Applications.referentiel

Rev

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

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