Subversion Repositories Applications.referentiel

Rev

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

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