Subversion Repositories Applications.referentiel

Rev

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

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