Subversion Repositories Applications.referentiel

Rev

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

Rev 6 Rev 12
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->classerNoms($noms);
52
		$noms = $this->classerNoms($noms);
53
		
53
		
54
		// Lancement des tests unitaires
54
		// Lancement des tests unitaires
-
 
55
		/*
55
		$donnees['tests'][] = $this->testerNombreDeChamps($colonnes);
56
		$donnees['tests'][] = $this->testerNombreDeChamps($colonnes);
56
		$donnees['tests'][] = $this->testerNomDesChamps($colonnes);
57
		$donnees['tests'][] = $this->testerNomDesChamps($colonnes);
57
		$donnees['tests'][] = $this->testerTypeDesChamps($colonnes);
58
		$donnees['tests'][] = $this->testerTypeDesChamps($colonnes);
58
		$donnees['tests'][] = $this->testerTailleDesChamps($colonnes, $analyses);
59
		$donnees['tests'][] = $this->testerTailleDesChamps($colonnes, $analyses);
59
		$donnees['tests'][] = $this->testerNumNomClePrimaire($colonnes);
60
		$donnees['tests'][] = $this->testerNumNomClePrimaire($colonnes);
-
 
61
		
60
		$donnees['tests'][] = $this->testerNumNomSuperieurAZero($noms);
62
		$donnees['tests'][] = $this->testerNumNomSuperieurAZero($noms);
-
 
63
		
61
		$donnees['tests'][] = $this->testerNumNomRetenuSuperieurAZero($noms);
64
		$donnees['tests'][] = $this->testerNumNomRetenuSuperieurAZero($noms);
62
		$donnees['tests'][] = $this->testerNumTaxSupEgalZeroUnique($noms);
65
		$donnees['tests'][] = $this->testerNumTaxSupEgalZeroUnique($noms);
63
		$donnees['tests'][] = $this->testerTaxSupPourTaxon($noms);
66
		$donnees['tests'][] = $this->testerTaxSupPourTaxon($noms);
64
		$donnees['tests'][] = $this->testerExitenceTaxonSuperieur($noms);
67
		$donnees['tests'][] = $this->testerExitenceTaxonSuperieur($noms);
65
		$donnees['tests'][] = $this->testerClassificationRang($noms);		
68
		$donnees['tests'][] = $this->testerClassificationRang($noms);		
66
		$donnees['tests'][] = $this->testerClassification($noms);
69
		$donnees['tests'][] = $this->testerClassification($noms);
-
 
70
		
67
		$donnees['tests'][] = $this->testerRang($noms);
71
		$donnees['tests'][] = $this->testerRang($noms);
-
 
72
		
68
		$donnees['tests'][] = $this->testerNomCompletSupraGenerique($noms);
73
		$donnees['tests'][] = $this->testerNomCompletSupraGenerique($noms);
69
		$donnees['tests'][] = $this->testerNomCompletGenre($noms);
74
		$donnees['tests'][] = $this->testerNomCompletGenre($noms);
70
		$donnees['tests'][] = $this->testerNomCompletInfraGenre($noms);
75
		$donnees['tests'][] = $this->testerNomCompletInfraGenre($noms);
71
		$donnees['tests'][] = $this->testerNomCompletEspece($noms);
76
		$donnees['tests'][] = $this->testerNomCompletEspece($noms);
72
		$donnees['tests'][] = $this->testerNomCompletInfraSpecifique($noms);
77
		$donnees['tests'][] = $this->testerNomCompletInfraSpecifique($noms);
73
		$donnees['tests'][] = $this->testerNomSupraGeneriqueMotUnique($noms);
-
 
-
 
78
 
74
		$donnees['tests'][] = $this->testerNomSupraGeneriqueEspaces($noms);
79
		$donnees['tests'][] = $this->testerNomSupraGeneriqueEspaces($noms);
-
 
80
		$donnees['tests'][] = $this->testerNomSupraGeneriqueSyntaxe($noms);
-
 
81
		$donnees['tests'][] = $this->testerNomSupraGeneriqueRang($noms);
-
 
82
		
-
 
83
		$donnees['tests'][] = $this->testerGenreEspaces($noms);
-
 
84
		$donnees['tests'][] = $this->testerGenreSyntaxe($noms);
-
 
85
		$donnees['tests'][] = $this->testerGenreRang($noms);
-
 
86
		
-
 
87
		$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueEspaces($noms);
-
 
88
		$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueSyntaxe($noms);
-
 
89
		$donnees['tests'][] = $this->testerEpitheteInfraGeneriqueRang($noms);
-
 
90
		
-
 
91
		$donnees['tests'][] = $this->testerEpitheteSpEspaces($noms);
-
 
92
		$donnees['tests'][] = $this->testerEpitheteSpSyntaxe($noms);
-
 
93
		$donnees['tests'][] = $this->testerEpitheteSpRang($noms);
-
 
94
		
-
 
95
		$donnees['tests'][] = $this->testerTypeEpitheteEspaces($noms);
-
 
96
		$donnees['tests'][] = $this->testerTypeEpitheteSyntaxe($noms);
-
 
97
		$donnees['tests'][] = $this->testerTypeEpitheteHybridite($noms);
-
 
98
		
-
 
99
		$donnees['tests'][] = $this->testerEpitheteInfraSpEspaces($noms);
-
 
100
		$donnees['tests'][] = $this->testerEpitheteInfraSpSyntaxe($noms);
-
 
101
		$donnees['tests'][] = $this->testerEpitheteInfraSpRang($noms);
-
 
102
		*/
-
 
103
		$donnees['tests'][] = $this->testerGroupeCultivarSyntaxe($noms);
75
		
104
		
76
		//Debug::printr($this->manuel);
105
		//Debug::printr($this->manuel);
77
		$this->setSortie(self::RENDU_CORPS, $this->getVue('test', $donnees)); 
106
		$this->setSortie(self::RENDU_CORPS, $this->getVue('test', $donnees)); 
78
	}
107
	}
-
 
108
	
-
 
109
	//+--------------------------------------------------------------------------------------------------------------+//
-
 
110
	// TESTS
79
	
111
	 
-
 
112
	private function testerGroupeCultivarSyntaxe($noms) {
-
 
113
		$info = array('titre' => 'groupe_cultivar -> syntaxe',
-
 
114
			'description' => "Le champ groupe_cultivar doit contenir un nom de groupe de cultivar conforme aux règles ".
-
 
115
				"du code des plantes cultivées qui se compose de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
-
 
116
				"signes diacritiques et marques de ponctuations.\n".
-
 
117
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
-
 
118
				"Il peut contir à la fin l'abréviation «gx» pour distinguer les groupes des grex.",
-
 
119
			'resultat' => false);
-
 
120
		
80
	private function classerNoms($noms) {
121
		// Réalisation du test
81
		$noms_classes = array();
122
		$noms_erreur = array();
-
 
123
		foreach ($noms as $nom) {
-
 
124
			if ($nom['groupe_cultivar'] != '') {
-
 
125
				$mots = explode(' ', $nom['groupe_cultivar']);
-
 
126
				foreach ($mots as $mot) {
-
 
127
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpithteSp($mot))) {
82
		foreach ($noms as $nom) {
128
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
-
 
129
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
130
					}
-
 
131
				}
83
			$noms_classes[$nom['num_nom']] = $nom;
132
			}
-
 
133
		}
-
 
134
		
-
 
135
		// Analyse des résultats
-
 
136
		if (count($noms_erreur) > 0) {
-
 
137
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
-
 
138
			$info['message']['lignes'] = $noms_erreur;
-
 
139
		} else {
-
 
140
			$info['resultat'] = true;
-
 
141
		}
-
 
142
		
-
 
143
		return $info;
-
 
144
	}
-
 
145
	
-
 
146
	private function testerEpitheteInfraSpEspaces($noms) {
-
 
147
		$info = array('titre' => 'epithete_infra_sp -> espaces en trop',
-
 
148
			'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
-
 
149
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
-
 
150
			'resultat' => false);
-
 
151
		
-
 
152
		// Réalisation du test
-
 
153
		$noms_erreur = array();
-
 
154
		foreach ($noms as $nom) {
-
 
155
			if ($nom['epithete_infra_sp'] != '') {
-
 
156
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
-
 
157
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
-
 
158
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
159
				}
-
 
160
			}
-
 
161
		}
-
 
162
		
-
 
163
		// Analyse des résultats
-
 
164
		if (count($noms_erreur) > 0) {
-
 
165
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
-
 
166
			$info['message']['lignes'] = $noms_erreur;
-
 
167
		} else {
-
 
168
			$info['resultat'] = true;
-
 
169
		}
-
 
170
		
-
 
171
		return $info;
-
 
172
	}
-
 
173
	
-
 
174
	private function testerEpitheteInfraSpSyntaxe($noms) {
-
 
175
		$info = array('titre' => 'epithete_infra_sp -> syntaxe',
-
 
176
			'description' => "Le champ epithete_infra_sp peut contenir :\n".
-
 
177
			 	" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
-
 
178
				"	Il commence par une lettre minuscule (avec ou sans tréma).\n". 
-
 
179
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
-
 
180
				" - 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".
-
 
181
				"	par la lettre x entourée de caractères espaces.",
-
 
182
			'resultat' => false);
-
 
183
		
-
 
184
		// Réalisation du test
-
 
185
		$noms_erreur = array();
-
 
186
		foreach ($noms as $nom) {
-
 
187
			if ($nom['epithete_infra_sp'] != '') {
-
 
188
				$mots = explode(' ', $nom['epithete_infra_sp']);
-
 
189
				foreach ($mots as $mot) {
-
 
190
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpithteSp($mot))) {
-
 
191
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
-
 
192
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
193
					}
-
 
194
				}
-
 
195
			}
-
 
196
		}
-
 
197
		
-
 
198
		// Analyse des résultats
-
 
199
		if (count($noms_erreur) > 0) {
-
 
200
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
-
 
201
			$info['message']['lignes'] = $noms_erreur;
-
 
202
		} else {
-
 
203
			$info['resultat'] = true;
-
 
204
		}
-
 
205
		
-
 
206
		return $info;
-
 
207
	}
-
 
208
	
-
 
209
	private function testerEpitheteInfraSpRang($noms) {
-
 
210
		$info = array('titre' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
-
 
211
			'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$this->manuel['rang_sp']}.",
-
 
212
			'resultat' => false);
-
 
213
		
-
 
214
		// Réalisation du test
-
 
215
		$noms_erreur = array();
-
 
216
		foreach ($noms as $nom) {
-
 
217
			if ($nom['epithete_infra_sp'] != '') {
-
 
218
				if ($nom['rang'] < $this->manuel['rang_sp']) {
-
 
219
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
-
 
220
				}
-
 
221
			}
-
 
222
		}
-
 
223
		
-
 
224
		// Analyse des résultats
-
 
225
		if (count($noms_erreur) > 0) {
-
 
226
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
-
 
227
			$info['message']['lignes'] = $noms_erreur;
-
 
228
		} else {
-
 
229
			$info['resultat'] = true;
-
 
230
		}
-
 
231
		
-
 
232
		return $info;
-
 
233
	}
-
 
234
	
-
 
235
	private function testerTypeEpitheteEspaces($noms) {
-
 
236
		$info = array('titre' => 'type_epithete -> espaces en trop',
-
 
237
			'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
-
 
238
			'resultat' => false);
-
 
239
		
-
 
240
		// Réalisation du test
-
 
241
		$noms_erreur = array();
-
 
242
		foreach ($noms as $nom) {
-
 
243
			if ($nom['type_epithete'] != '') {
-
 
244
				if (preg_match('/\s+/', $nom['type_epithete'])) {
-
 
245
					$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
-
 
246
					$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
-
 
247
				}
-
 
248
			}
-
 
249
		}
-
 
250
		
-
 
251
		// Analyse des résultats
-
 
252
		if (count($noms_erreur) > 0) {
-
 
253
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
-
 
254
			$info['message']['lignes'] = $noms_erreur;
-
 
255
		} else {
-
 
256
			$info['resultat'] = true;
-
 
257
		}
-
 
258
		
-
 
259
		return $info;
-
 
260
	}
-
 
261
	
-
 
262
	private function testerTypeEpitheteSyntaxe($noms) {
-
 
263
		$info = array('titre' => 'type_epithete -> syntaxe',
-
 
264
			'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules sans ".
-
 
265
				" accents et de tirets (-). Il commence par une lettre minuscule sans accent.",
-
 
266
			'resultat' => false);
-
 
267
		
-
 
268
		// Réalisation du test
-
 
269
		$noms_erreur = array();
-
 
270
		foreach ($noms as $nom) {
-
 
271
			if ($nom['type_epithete'] != '') {
-
 
272
				if (!preg_match('/^[a-z][-a-z]*[.]?$/', $nom['type_epithete'])) {
-
 
273
					$noms_erreur[] = array($nom['num_nom'],  $nom['type_epithete']);
-
 
274
				}
-
 
275
			}
-
 
276
		}
-
 
277
		
-
 
278
		// Analyse des résultats
-
 
279
		if (count($noms_erreur) > 0) {
-
 
280
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
-
 
281
			$info['message']['lignes'] = $noms_erreur;
-
 
282
		} else {
-
 
283
			$info['resultat'] = true;
-
 
284
		}
84
		}
285
		
-
 
286
		return $info;
-
 
287
	}
-
 
288
	
-
 
289
	private function testerTypeEpitheteHybridite($noms) {
-
 
290
		$info = array('titre' => 'type_epithete -> hybridité',
-
 
291
			'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
-
 
292
				" - «n-» \n".
-
 
293
				" - «notho-» \n",
-
 
294
			'resultat' => false);
-
 
295
		
-
 
296
		// Réalisation du test
-
 
297
		$noms_erreur = array();
-
 
298
		foreach ($noms as $nom) {
-
 
299
			if ($nom['type_epithete'] != '') {
-
 
300
				if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
-
 
301
					$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
-
 
302
				}
-
 
303
			}
-
 
304
		}
-
 
305
		
-
 
306
		// Analyse des résultats
-
 
307
		if (count($noms_erreur) > 0) {
-
 
308
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
-
 
309
			$info['message']['lignes'] = $noms_erreur;
-
 
310
		} else {
-
 
311
			$info['resultat'] = true;
-
 
312
		}
-
 
313
		
85
		return $noms_classes;
314
		return $info;
86
	}
315
	}
87
	
316
	
88
	private function testerNombreDeChamps($colonnes) {
317
	private function testerNombreDeChamps($colonnes) {
89
		$info = array('titre' => 'Structure -> nombre de champs : %s',
318
		$info = array('titre' => 'Structure -> nombre de champs : %s',
90
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
319
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
91
			'resultat' => false);
320
			'resultat' => false);
92
		
321
		
93
		$nbre_colonnes = count($colonnes);
322
		$nbre_colonnes = count($colonnes);
94
		$info['titre'] = sprintf($info['titre'], $nbre_colonnes);
323
		$info['titre'] = sprintf($info['titre'], $nbre_colonnes);
95
		if ($nbre_colonnes >= 35) {
324
		if ($nbre_colonnes >= 35) {
96
			$info['resultat'] = true;
325
			$info['resultat'] = true;
97
		}
326
		}
98
		return $info;
327
		return $info;
99
	}
328
	}
100
	
329
	
101
	private function testerNomDesChamps($colonnes) {
330
	private function testerNomDesChamps($colonnes) {
102
		$info = array('titre' => 'Structure -> noms des champs',
331
		$info = array('titre' => 'Structure -> noms des champs',
103
			'description' => 'Les champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
332
			'description' => 'Les champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
104
			'resultat' => false);
333
			'resultat' => false);
105
		
334
		
106
		$champs_attendus = explode(',', $this->manuel['champs']);
335
		$champs_attendus = explode(',', $this->manuel['champs']);
107
		$champs_presents = array();
336
		$champs_presents = array();
108
		foreach ($colonnes as $colonne) {
337
		foreach ($colonnes as $colonne) {
109
			$champs_presents[$colonne['Field']] = $colonne;
338
			$champs_presents[$colonne['Field']] = $colonne;
110
		}
339
		}
111
		
340
		
112
		$ok = true;
341
		$ok = true;
113
		$champs_manquant = array(); 
342
		$champs_manquant = array(); 
114
		foreach ($champs_attendus as $champ_attendu) {
343
		foreach ($champs_attendus as $champ_attendu) {
115
			if (!isset($champs_presents[$champ_attendu])) {
344
			if (!isset($champs_presents[$champ_attendu])) {
116
				$champs_manquant[] = $champ_attendu; 
345
				$champs_manquant[] = $champ_attendu; 
117
				$ok = false;
346
				$ok = false;
118
			}
347
			}
119
		}
348
		}
120
		$info['resultat'] = $ok;
349
		$info['resultat'] = $ok;
121
		if (!$ok) {
350
		if (!$ok) {
122
			$info['message'] = 'Champs manquant : '.implode(', ', $champs_manquant).'.';
351
			$info['message'] = 'Champs manquant : '.implode(', ', $champs_manquant).'.';
123
		}
352
		}
124
		
353
		
125
		return $info;
354
		return $info;
126
	}
355
	}
127
	
356
	
128
	private function testerTypeDesChamps($colonnes) {
357
	private function testerTypeDesChamps($colonnes) {
129
		$info = array('titre' => 'Structure -> types des champs',
358
		$info = array('titre' => 'Structure -> types des champs',
130
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
359
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conforme à ceux définit par le manuel technique.',
131
			'resultat' => false);
360
			'resultat' => false);
132
		
361
		
133
		$champs_attendus = explode(',', $this->manuel['champs_type']);
362
		$champs_attendus = explode(',', $this->manuel['champs_type']);
134
		$champs_presents = array();
363
		$champs_presents = array();
135
		foreach ($colonnes as $colonne) {
364
		foreach ($colonnes as $colonne) {
136
			$champs_presents[$colonne['Field']] = $colonne['Type'];
365
			$champs_presents[$colonne['Field']] = $colonne['Type'];
137
		}
366
		}
138
		
367
		
139
		// Recercherche des erreurs
368
		// Recercherche des erreurs
140
		$champs_erreur = array(); 
369
		$champs_erreur = array(); 
141
		foreach ($champs_attendus as $champ_attendu) {
370
		foreach ($champs_attendus as $champ_attendu) {
142
			list($champ_attendu_nom, $champ_attendu_type) = explode('=', trim($champ_attendu));
371
			list($champ_attendu_nom, $champ_attendu_type) = explode('=', trim($champ_attendu));
143
 
372
 
144
			if (isset($champs_presents[$champ_attendu_nom])) {
373
			if (isset($champs_presents[$champ_attendu_nom])) {
145
				$champs_present_type = $champs_presents[$champ_attendu_nom];
374
				$champs_present_type = $champs_presents[$champ_attendu_nom];
146
				
375
				
147
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
376
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
148
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
377
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
149
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) 
378
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) 
150
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
379
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
151
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
380
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
152
				}
381
				}
153
			}
382
			}
154
		}
383
		}
155
		
384
		
156
		// Analyse des résultats
385
		// Analyse des résultats
157
		if (count($champs_erreur) > 0) {
386
		if (count($champs_erreur) > 0) {
158
			$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
387
			$info['message'] = "Champs n'ayant pas un bon type : ".implode(', ', $champs_erreur).'.';
159
		} else {
388
		} else {
160
			$info['resultat'] = true;
389
			$info['resultat'] = true;
161
		}
390
		}
162
		
391
		
163
		return $info;
392
		return $info;
164
	}
393
	}
165
	
394
	
166
	private function testerTailleDesChamps($colonnes, $analyses) {
395
	private function testerTailleDesChamps($colonnes, $analyses) {
167
		$info = array('titre' => 'Structure -> champs tronqués',
396
		$info = array('titre' => 'Structure -> champs tronqués',
168
			'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.",
397
			'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.",
169
			'resultat' => false);
398
			'resultat' => false);
170
		
399
		
171
		$tailles_champs_maxi = array();
400
		$tailles_champs_maxi = array();
172
		foreach ($colonnes as $colonne) {
401
		foreach ($colonnes as $colonne) {
173
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
402
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
174
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
403
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
175
			}
404
			}
176
		}
405
		}
177
		
406
		
178
		$tailles_trouvees = array();
407
		$tailles_trouvees = array();
179
		foreach ($analyses as $analyse) {
408
		foreach ($analyses as $analyse) {
180
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
409
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
181
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
410
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
182
			}
411
			}
183
		}
412
		}
184
		
413
		
185
		$champs_erreur = array();
414
		$champs_erreur = array();
186
		$champs_attendus = explode(',', $this->manuel['champs']);
415
		$champs_attendus = explode(',', $this->manuel['champs']);
187
		foreach ($champs_attendus as $champ_attendu) {
416
		foreach ($champs_attendus as $champ_attendu) {
188
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
417
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
189
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
418
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
190
					$champs_erreur[] = $champ_attendu;
419
					$champs_erreur[] = $champ_attendu;
191
				}
420
				}
192
			}
421
			}
193
		}
422
		}
194
		
423
		
195
		// Analyse des résultats
424
		// Analyse des résultats
196
		if (count($champs_erreur) > 0) {
425
		if (count($champs_erreur) > 0) {
197
			$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
426
			$info['message'] = "Champs possédant des enregistrements avec une taille maximum : ".implode(', ', $champs_erreur).'.';
198
		} else {
427
		} else {
199
			$info['resultat'] = true;
428
			$info['resultat'] = true;
200
		}
429
		}
201
		
430
		
202
		return $info;
431
		return $info;
203
	}
432
	}
204
	
433
	
205
	private function testerNumNomClePrimaire($colonnes) {
434
	private function testerNumNomClePrimaire($colonnes) {
206
		$info = array('titre' => 'Structure -> num_nom est clé primaire',
435
		$info = array('titre' => 'Structure -> num_nom est clé primaire',
207
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
436
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
208
			'resultat' => false);
437
			'resultat' => false);
209
		
438
		
210
		foreach ($colonnes as $colonne) {
439
		foreach ($colonnes as $colonne) {
211
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
440
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
212
				$info['resultat'] = true;
441
				$info['resultat'] = true;
213
			}
442
			}
214
		}
443
		}
215
		
444
		
216
		return $info;
445
		return $info;
217
	}
446
	}
218
	
447
	
219
	private function testerNumNomSuperieurAZero($noms) {
448
	private function testerNumNomSuperieurAZero($noms) {
220
		$info = array('titre' => 'num_nom -> supérieur à 0',
449
		$info = array('titre' => 'num_nom -> supérieur à 0',
221
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
450
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
222
			'resultat' => false);
451
			'resultat' => false);
223
		
452
		
224
		// Réalisation du test
453
		// Réalisation du test
225
		$noms_erreur = array();
454
		$noms_erreur = array();
226
		foreach ($noms as $nom) {
455
		foreach ($noms as $nom) {
227
			if ($nom['num_nom'] <= 0) {
456
			if ($nom['num_nom'] <= 0) {
228
				$noms_erreur[] = $nom['num_nom'];
457
				$noms_erreur[] = $nom['num_nom'];
229
			}
458
			}
230
		}
459
		}
231
		
460
		
232
		// Analyse des résultats
461
		// Analyse des résultats
233
		if (count($noms_erreur) > 0) {
462
		if (count($noms_erreur) > 0) {
234
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
463
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur inférieure ou égale à 0.";
235
		} else {
464
		} else {
236
			$info['resultat'] = true;
465
			$info['resultat'] = true;
237
		}
466
		}
238
		
467
		
239
		return $info;
468
		return $info;
240
	}
469
	}
241
	
470
	
242
	private function testerNumNomRetenuSuperieurAZero($noms) {
471
	private function testerNumNomRetenuSuperieurAZero($noms) {
243
		$info = array('titre' => 'num_nom_retenu -> supérieur à 0',
472
		$info = array('titre' => 'num_nom_retenu -> supérieur à 0',
244
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0.",
473
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0.",
245
			'resultat' => false);
474
			'resultat' => false);
246
		
475
		
247
		// Réalisation du test
476
		// Réalisation du test
248
		$noms_erreur = array();
477
		$noms_erreur = array();
249
		foreach ($noms as $nom) {
478
		foreach ($noms as $nom) {
250
			if ($nom['num_nom_retenu'] <= 0) {
479
			if ($nom['num_nom_retenu'] <= 0) {
251
				$noms_erreur[] = $nom['num_nom'];
480
				$noms_erreur[] = $nom['num_nom'];
252
			}
481
			}
253
		}
482
		}
254
		
483
		
255
		// Analyse des résultats
484
		// Analyse des résultats
256
		if (count($noms_erreur) > 0) {
485
		if (count($noms_erreur) > 0) {
257
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
486
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".implode(', ', $noms_erreur).'.';
258
		} else {
487
		} else {
259
			$info['resultat'] = true;
488
			$info['resultat'] = true;
260
		}
489
		}
261
		
490
		
262
		return $info;
491
		return $info;
263
	}
492
	}
264
	
493
	
265
	private function testerNumTaxSupEgalZeroUnique($noms) {
494
	private function testerNumTaxSupEgalZeroUnique($noms) {
266
		$info = array('titre' => 'num_tax_sup -> égal à 0 unique',
495
		$info = array('titre' => 'num_tax_sup -> égal à 0 unique',
267
			'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification.",
496
			'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification.",
268
			'resultat' => false);
497
			'resultat' => false);
269
		
498
		
270
		// Réalisation du test
499
		// Réalisation du test
271
		$noms_erreur = array();
500
		$noms_erreur = array();
272
		foreach ($noms as $nom) {
501
		foreach ($noms as $nom) {
273
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
502
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
274
				$noms_erreur[] = $nom['num_nom'];
503
				$noms_erreur[] = $nom['num_nom'];
275
			}
504
			}
276
		}
505
		}
277
		
506
		
278
		// Analyse des résultats
507
		// Analyse des résultats
279
		if (count($noms_erreur) > 1) {
508
		if (count($noms_erreur) > 1) {
280
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
509
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".implode(', ', $noms_erreur).'.';
281
		} else {
510
		} else {
282
			$info['resultat'] = true;
511
			$info['resultat'] = true;
283
		}
512
		}
284
		
513
		
285
		return $info;
514
		return $info;
286
	}
515
	}
287
	
516
	
288
	private function testerTaxSupPourTaxon($noms) {
517
	private function testerTaxSupPourTaxon($noms) {
289
		$info = array('titre' => 'Classification -> uniquement pour les taxons',
518
		$info = array('titre' => 'Classification -> uniquement pour les taxons',
290
			'description' => "Seul les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.",
519
			'description' => "Seul les enregistrements représentant un taxon doivent posséder une valeur dans le champ num_tax_sup.",
291
			'resultat' => false);
520
			'resultat' => false);
292
		
521
		
293
		// Réalisation du test
522
		// Réalisation du test
294
		$noms_erreur = array();
523
		$noms_erreur = array();
295
		foreach ($noms as $nom) {
524
		foreach ($noms as $nom) {
296
			if ($nom['num_nom_retenu'] == $nom['num_nom'] && preg_match('/^[0-9]+$/', $nom['num_tax_sup'])) {
525
			if ($nom['num_nom_retenu'] == $nom['num_nom'] && preg_match('/^[0-9]+$/', $nom['num_tax_sup'])) {
297
				$noms_erreur[] = $nom['num_nom']; 
526
				$noms_erreur[] = $nom['num_nom']; 
298
			}
527
			}
299
		}
528
		}
300
		
529
		
301
		// Analyse des résultats
530
		// Analyse des résultats
302
		if (count($noms_erreur) > 0) {
531
		if (count($noms_erreur) > 0) {
303
			$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).'.';
532
			$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).'.';
304
		} else {
533
		} else {
305
			$info['resultat'] = true;
534
			$info['resultat'] = true;
306
		}
535
		}
307
		
536
		
308
		return $info;
537
		return $info;
309
	}
538
	}
310
	
539
	
311
	private function testerExitenceTaxonSuperieur($noms) {
540
	private function testerExitenceTaxonSuperieur($noms) {
312
		$info = array('titre' => 'Classification -> existence du taxon supérieur',
541
		$info = array('titre' => 'Classification -> existence du taxon supérieur',
313
			'description' => "Pour chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
542
			'description' => "Pour chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf la racine de la classification.",
314
			'resultat' => false);
543
			'resultat' => false);
315
		
544
		
316
		// Réalisation du test
545
		// Réalisation du test
317
		$noms_erreur = array();
546
		$noms_erreur = array();
318
		foreach ($noms as $nom) {
547
		foreach ($noms as $nom) {
319
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
548
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
320
				if ($nom['num_tax_sup'] != 0 && !isset($noms[$nom['num_tax_sup']])) {
549
				if ($nom['num_tax_sup'] != 0 && !isset($noms[$nom['num_tax_sup']])) {
321
					$noms_erreur[] = $nom['num_nom'];
550
					$noms_erreur[] = $nom['num_nom'];
322
				} 
551
				} 
323
			}
552
			}
324
		}
553
		}
325
		
554
		
326
		// Analyse des résultats
555
		// Analyse des résultats
327
		if (count($noms_erreur) > 0) {
556
		if (count($noms_erreur) > 0) {
328
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
557
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".implode(', ', $noms_erreur).'.';
329
		} else {
558
		} else {
330
			$info['resultat'] = true;
559
			$info['resultat'] = true;
331
		}
560
		}
332
		
561
		
333
		return $info;
562
		return $info;
334
	}
563
	}
335
	
564
	
336
	private function testerClassificationRang($noms) {
565
	private function testerClassificationRang($noms) {
337
		$info = array('titre' => 'Classification -> taxon supérieur avec rang inférieur',
566
		$info = array('titre' => 'Classification -> taxon supérieur avec rang inférieur',
338
			'description' => "Pour chaque enregistrement représentant un taxon, chaque taxon supérieur doit avoir un rang inférieur au taxon courant.",
567
			'description' => "Pour chaque enregistrement représentant un taxon, chaque taxon supérieur doit avoir un rang inférieur au taxon courant.",
339
			'resultat' => false);
568
			'resultat' => false);
340
		
569
		
341
		// Réalisation du test
570
		// Réalisation du test
342
		$noms_erreur = array();
571
		$noms_erreur = array();
343
		foreach ($noms as $nom) {
572
		foreach ($noms as $nom) {
344
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
573
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
345
				if (isset($noms[$nom['num_tax_sup']])) {
574
				if (isset($noms[$nom['num_tax_sup']])) {
346
					$nom_sup = $noms[$nom['num_tax_sup']];
575
					$nom_sup = $noms[$nom['num_tax_sup']];
347
					if ($nom_sup['rang'] > $nom['rang']) {
576
					if ($nom_sup['rang'] > $nom['rang']) {
348
						$noms_erreur[] = $nom['num_nom'];
577
						$noms_erreur[] = $nom['num_nom'];
349
					}
578
					}
350
				}
579
				}
351
			}
580
			}
352
		}
581
		}
353
		
582
		
354
		// Analyse des résultats
583
		// Analyse des résultats
355
		if (count($noms_erreur) > 0) {
584
		if (count($noms_erreur) > 0) {
356
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
585
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
357
		} else {
586
		} else {
358
			$info['resultat'] = true;
587
			$info['resultat'] = true;
359
		}
588
		}
360
		
589
		
361
		return $info;
590
		return $info;
362
	}
591
	}
363
	
592
	
364
	private function testerClassification($noms) {
593
	private function testerClassification($noms) {
365
		$info = array('titre' => 'Classification -> racine liée à chaque noeud',
594
		$info = array('titre' => 'Classification -> racine liée à chaque noeud',
366
			'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.",
595
			'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.",
367
			'resultat' => false);
596
			'resultat' => false);
368
		
597
		
369
		// Réalisation du test
598
		// Réalisation du test
370
		$noms_erreur = array();
599
		$noms_erreur = array();
371
		foreach ($noms as $nom) {
600
		foreach ($noms as $nom) {
372
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
601
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
373
				$classif_ok = $this->remonterClassif($noms, $nom);
602
				$classif_ok = $this->remonterClassif($noms, $nom);
374
				if ($classif_ok === false) {
603
				if ($classif_ok === false) {
375
					$noms_erreur[] = $nom['num_nom'];
604
					$noms_erreur[] = $nom['num_nom'];
376
				}
605
				}
377
			}
606
			}
378
		}
607
		}
379
		
608
		
380
		// Analyse des résultats
609
		// Analyse des résultats
381
		if (count($noms_erreur) > 0) {
610
		if (count($noms_erreur) > 0) {
382
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
611
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".implode(', ', $noms_erreur).'.';
383
		} else {
612
		} else {
384
			$info['resultat'] = true;
613
			$info['resultat'] = true;
385
		}
614
		}
386
		
615
		
387
		return $info;
616
		return $info;
388
	}
617
	}
389
	
618
	
390
	private function remonterClassif(&$noms, $nom) {
619
	private function remonterClassif(&$noms, $nom) {
391
		if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
620
		if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
392
			return true;
621
			return true;
393
		} else if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
622
		} else if (!isset($noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
394
			return false;
623
			return false;
395
		} else {
624
		} else {
396
			return $this->remonterClassif($noms, $noms[$nom['num_tax_sup']]);
625
			return $this->remonterClassif($noms, $noms[$nom['num_tax_sup']]);
397
		}
626
		}
398
	}
627
	}
399
	
628
	
400
	private function testerRang($noms) {
629
	private function testerRang($noms) {
401
		$info = array('titre' => 'rang',
630
		$info = array('titre' => 'rang',
402
			'description' => "Le rang doit correspondre à un valeur numérique définit dans le manuel.",
631
			'description' => "Le rang doit correspondre à un valeur numérique définit dans le manuel.",
403
			'resultat' => false);
632
			'resultat' => false);
404
		
633
		
405
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
634
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
406
		
635
		
407
		// Réalisation du test
636
		// Réalisation du test
408
		$noms_erreur = array();
637
		$noms_erreur = array();
409
		foreach ($noms as $nom) {
638
		foreach ($noms as $nom) {
410
			if (!isset($rangs[$nom['rang']])) {
639
			if (!isset($rangs[$nom['rang']])) {
411
				$noms_erreur[] = $nom['num_nom'];
640
				$noms_erreur[] = $nom['num_nom'];
412
			}
641
			}
413
		}
642
		}
414
		
643
		
415
		// Analyse des résultats
644
		// Analyse des résultats
416
		if (count($noms_erreur) > 0) {
645
		if (count($noms_erreur) > 0) {
417
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
646
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
418
		} else {
647
		} else {
419
			$info['resultat'] = true;
648
			$info['resultat'] = true;
420
		}
649
		}
421
		
650
		
422
		return $info;
651
		return $info;
423
	}
652
	}
424
	
653
	
425
	private function testerNomCompletSupraGenerique($noms) {
654
	private function testerNomCompletSupraGenerique($noms) {
426
		$info = array('titre' => 'nom_complet -> noms supra-génériques',
655
		$info = array('titre' => 'nom_complet -> noms supra-génériques',
427
			'description' => "Si le rang est < à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ nom_supra_generique. ".
656
			'description' => "Si le rang est < à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ nom_supra_generique. ".
428
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
657
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
429
			'resultat' => false);
658
			'resultat' => false);
430
		
659
		
431
		// Réalisation du test
660
		// Réalisation du test
432
		$noms_erreur = array();
661
		$noms_erreur = array();
433
		foreach ($noms as $nom) {
662
		foreach ($noms as $nom) {
434
			if ($nom['rang'] < $this->manuel['rang_genre']) {
663
			if ($nom['rang'] < $this->manuel['rang_genre']) {
435
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
664
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
436
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
665
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
437
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
666
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
438
				if ($nom['nom_complet'] != $nom_complet_ideal) {
667
				if ($nom['nom_complet'] != $nom_complet_ideal) {
439
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
668
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
440
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
669
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
441
				}
670
				}
442
			}
671
			}
443
		}
672
		}
444
		
673
		
445
		// Analyse des résultats
674
		// Analyse des résultats
446
		if (count($noms_erreur) > 0) {
675
		if (count($noms_erreur) > 0) {
447
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
676
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
448
			$info['message']['lignes'] = $noms_erreur;
677
			$info['message']['lignes'] = $noms_erreur;
449
		} else {
678
		} else {
450
			$info['resultat'] = true;
679
			$info['resultat'] = true;
451
		}
680
		}
452
		
681
		
453
		return $info;
682
		return $info;
454
	}
683
	}
455
	
684
	
456
	private function testerNomCompletGenre($noms) {
685
	private function testerNomCompletGenre($noms) {
457
		$info = array('titre' => 'nom_complet -> noms de genres',
686
		$info = array('titre' => 'nom_complet -> noms de genres',
458
			'description' => "Si le rang est = à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ genre. ".
687
			'description' => "Si le rang est = à {$this->manuel['rang_genre']} le nom_complet doit correspondre à la valeur du champ genre. ".
459
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
688
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
460
			'resultat' => false);
689
			'resultat' => false);
461
		
690
		
462
		// Réalisation du test
691
		// Réalisation du test
463
		$noms_erreur = array();
692
		$noms_erreur = array();
464
		foreach ($noms as $nom) {
693
		foreach ($noms as $nom) {
465
			if ($nom['rang'] == $this->manuel['rang_genre']) {
694
			if ($nom['rang'] == $this->manuel['rang_genre']) {
466
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
695
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
467
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
696
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
468
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
697
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
469
				if ($nom['nom_complet'] != $nom_complet_ideal) {
698
				if ($nom['nom_complet'] != $nom_complet_ideal) {
470
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
699
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
471
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
700
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
472
				}
701
				}
473
			}
702
			}
474
		}
703
		}
475
		
704
		
476
		// Analyse des résultats
705
		// Analyse des résultats
477
		if (count($noms_erreur) > 0) {
706
		if (count($noms_erreur) > 0) {
478
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
707
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
479
			$info['message']['lignes'] = $noms_erreur;
708
			$info['message']['lignes'] = $noms_erreur;
480
		} else {
709
		} else {
481
			$info['resultat'] = true;
710
			$info['resultat'] = true;
482
		}
711
		}
483
		
712
		
484
		return $info;
713
		return $info;
485
	}
714
	}
486
	
715
	
487
	private function testerNomCompletInfraGenre($noms) {
716
	private function testerNomCompletInfraGenre($noms) {
488
		$info = array('titre' => 'nom_complet -> noms infra-génériques',
717
		$info = array('titre' => 'nom_complet -> noms infra-génériques',
489
			'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']} le nom_complet doit correspondre à une des formules suivantes : \n".
718
			'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']} le nom_complet doit correspondre à une des formules suivantes : \n".
490
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
719
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
491
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
720
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
492
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
721
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
493
			'resultat' => false);
722
			'resultat' => false);
494
		
723
		
495
		// Réalisation du test
724
		// Réalisation du test
496
		$noms_erreur = array();
725
		$noms_erreur = array();
497
		foreach ($noms as $nom) {
726
		foreach ($noms as $nom) {
498
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
727
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
499
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
728
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
500
				$nom_complet_ideal = '';
729
				$nom_complet_ideal = '';
501
				if ($nom['type_epithete'] == 'agg.') {
730
				if ($nom['type_epithete'] == 'agg.') {
502
					$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
731
					$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
503
					$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
732
					$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
504
					$nom_complet_ideal .= ' '.$nom['type_epithete'];
733
					$nom_complet_ideal .= ' '.$nom['type_epithete'];
505
				} else {
734
				} else {
506
					$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
735
					$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
507
					$nom_complet_ideal .= ' '.$nom['type_epithete'];
736
					$nom_complet_ideal .= ' '.$nom['type_epithete'];
508
					$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
737
					$nom_complet_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
509
				}
738
				}
510
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
739
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
511
				if ($nom['nom_complet'] != $nom_complet_ideal) {
740
				if ($nom['nom_complet'] != $nom_complet_ideal) {
512
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
741
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
513
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
742
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
514
				}
743
				}
515
			}
744
			}
516
		}
745
		}
517
		
746
		
518
		// Analyse des résultats
747
		// Analyse des résultats
519
		if (count($noms_erreur) > 0) {
748
		if (count($noms_erreur) > 0) {
520
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
749
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
521
			$info['message']['lignes'] = $noms_erreur;
750
			$info['message']['lignes'] = $noms_erreur;
522
		} else {
751
		} else {
523
			$info['resultat'] = true;
752
			$info['resultat'] = true;
524
		}
753
		}
525
		
754
		
526
		return $info;
755
		return $info;
527
	}
756
	}
528
	
757
	
529
	private function testerNomCompletEspece($noms) {
758
	private function testerNomCompletEspece($noms) {
530
		$info = array('titre' => "nom_complet -> noms d'espèce",
759
		$info = array('titre' => "nom_complet -> noms d'espèce",
531
			'description' => "Si le rang est = à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
760
			'description' => "Si le rang est = à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
532
				" genre + ' ' + epithete_sp \n".
761
				" genre + ' ' + epithete_sp \n".
533
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
762
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
534
			'resultat' => false);
763
			'resultat' => false);
535
		
764
		
536
		// Réalisation du test
765
		// Réalisation du test
537
		$noms_erreur = array();
766
		$noms_erreur = array();
538
		foreach ($noms as $nom) {
767
		foreach ($noms as $nom) {
539
			if ($nom['rang'] == $this->manuel['rang_sp']) {
768
			if ($nom['rang'] == $this->manuel['rang_sp']) {
540
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
769
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
541
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
770
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
542
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
771
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
543
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
772
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
544
				if ($nom['nom_complet'] != $nom_complet_ideal) {
773
				if ($nom['nom_complet'] != $nom_complet_ideal) {
545
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
774
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
546
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
775
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
547
				}
776
				}
548
			}
777
			}
549
		}
778
		}
550
		
779
		
551
		// Analyse des résultats
780
		// Analyse des résultats
552
		if (count($noms_erreur) > 0) {
781
		if (count($noms_erreur) > 0) {
553
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
782
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
554
			$info['message']['lignes'] = $noms_erreur;
783
			$info['message']['lignes'] = $noms_erreur;
555
		} else {
784
		} else {
556
			$info['resultat'] = true;
785
			$info['resultat'] = true;
557
		}
786
		}
558
		
787
		
559
		return $info;
788
		return $info;
560
	}
789
	}
561
	
790
	
562
	private function testerNomCompletInfraSpecifique($noms) {
791
	private function testerNomCompletInfraSpecifique($noms) {
563
		$info = array('titre' => 'nom_complet -> noms infra-spécifiques',
792
		$info = array('titre' => 'nom_complet -> noms infra-spécifiques',
564
			'description' => "Si le rang est > à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
793
			'description' => "Si le rang est > à {$this->manuel['rang_sp']} le nom_complet doit correspondre à la formule : \n".
565
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".	
794
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".	
566
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
795
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
567
			'resultat' => false);
796
			'resultat' => false);
568
		
797
		
569
		// Réalisation du test
798
		// Réalisation du test
570
		$noms_erreur = array();
799
		$noms_erreur = array();
571
		foreach ($noms as $nom) {
800
		foreach ($noms as $nom) {
572
			if ($nom['rang'] > $this->manuel['rang_sp']) {
801
			if ($nom['rang'] > $this->manuel['rang_sp']) {
573
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
802
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
574
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
803
				$nom_complet_ideal = $this->formaterStyleNomGenre($nom['genre']);
575
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
804
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_sp']);
576
				$nom_complet_ideal .= ' '.strtolower($nom['type_epithete']);
805
				$nom_complet_ideal .= ' '.strtolower($nom['type_epithete']);
577
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
806
				$nom_complet_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
578
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
807
				$nom_complet_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
579
				if ($nom['nom_complet'] != $nom_complet_ideal) {
808
				if ($nom['nom_complet'] != $nom_complet_ideal) {
580
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
809
					$nom_complet_traite = $this->repererEspace($nom['nom_complet']);
581
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
810
					$noms_erreur[] = array($nom['num_nom'], $nom_complet_traite, $nom_complet_ideal);
582
				}
811
				}
583
			}
812
			}
584
		}
813
		}
585
		
814
		
586
		// Analyse des résultats
815
		// Analyse des résultats
587
		if (count($noms_erreur) > 0) {
816
		if (count($noms_erreur) > 0) {
588
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
817
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'nom_complet corrigé');
589
			$info['message']['lignes'] = $noms_erreur;
818
			$info['message']['lignes'] = $noms_erreur;
590
		} else {
819
		} else {
591
			$info['resultat'] = true;
820
			$info['resultat'] = true;
592
		}
821
		}
593
		
822
		
594
		return $info;
823
		return $info;
595
	}
824
	}
596
	
825
	
597
	private function testerNomSupraGeneriqueMotUnique($noms) {
826
	private function testerNomSupraGeneriqueEspaces($noms) {
598
		$info = array('titre' => 'nom_supra_generique -> plusieurs mots',
827
		$info = array('titre' => 'nom_supra_generique -> espaces en trop',
599
			'description' => "Le champ nom_supra_generique doit contenir un seul mot.",
828
			'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou aprés le nom.",
600
			'resultat' => false);
829
			'resultat' => false);
601
		
830
		
602
		// Réalisation du test
831
		// Réalisation du test
603
		$noms_erreur = array();
832
		$noms_erreur = array();
604
		foreach ($noms as $nom) {
833
		foreach ($noms as $nom) {
605
			if ($nom['nom_supra_generique'] != '') {
834
			if ($nom['nom_supra_generique'] != '') {
606
				$mots = explode(' ', trim($nom['nom_supra_generique']));
835
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
607
				if (count($mots) > 1) {
-
 
608
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
836
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
609
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
837
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
610
				}
838
				}
611
			}
839
			}
612
		}
840
		}
613
		
841
		
614
		// Analyse des résultats
842
		// Analyse des résultats
615
		if (count($noms_erreur) > 0) {
843
		if (count($noms_erreur) > 0) {
616
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
844
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
617
			$info['message']['lignes'] = $noms_erreur;
845
			$info['message']['lignes'] = $noms_erreur;
618
		} else {
846
		} else {
619
			$info['resultat'] = true;
847
			$info['resultat'] = true;
620
		}
848
		}
621
		
849
		
622
		return $info;
850
		return $info;
623
	}
851
	}
624
	
852
	
625
	private function testerNomSupraGeneriqueEspaces($noms) {
853
	private function testerNomSupraGeneriqueSyntaxe($noms) {
626
		$info = array('titre' => 'nom_supra_generique -> espaces en trop',
854
		$info = array('titre' => 'nom_supra_generique -> syntaxe',
-
 
855
			'description' => "Le champ nom_supra_generique contient un mot composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
627
			'description' => "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou aprés le nom.",
856
				"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
628
			'resultat' => false);
857
			'resultat' => false);
629
		
858
		
630
		// Réalisation du test
859
		// Réalisation du test
631
		$noms_erreur = array();
860
		$noms_erreur = array();
632
		foreach ($noms as $nom) {
861
		foreach ($noms as $nom) {
633
			if ($nom['nom_supra_generique'] != '') {
862
			if ($nom['nom_supra_generique'] != '') {
634
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
863
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
635
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
864
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
636
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
865
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
637
				}
866
				}
638
			}
867
			}
639
		}
868
		}
640
		
869
		
641
		// Analyse des résultats
870
		// Analyse des résultats
642
		if (count($noms_erreur) > 0) {
871
		if (count($noms_erreur) > 0) {
643
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
872
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
644
			$info['message']['lignes'] = $noms_erreur;
873
			$info['message']['lignes'] = $noms_erreur;
645
		} else {
874
		} else {
646
			$info['resultat'] = true;
875
			$info['resultat'] = true;
647
		}
876
		}
648
		
877
		
649
		return $info;
878
		return $info;
650
	}
879
	}
-
 
880
	
-
 
881
	private function testerNomSupraGeneriqueRang($noms) {
-
 
882
		$info = array('titre' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
-
 
883
			'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$this->manuel['rang_genre']}.",
-
 
884
			'resultat' => false);
-
 
885
		
-
 
886
		// Réalisation du test
-
 
887
		$noms_erreur = array();
-
 
888
		foreach ($noms as $nom) {
-
 
889
			if ($nom['nom_supra_generique'] != '') {
-
 
890
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
-
 
891
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
-
 
892
				}
-
 
893
			}
-
 
894
		}
-
 
895
		
-
 
896
		// Analyse des résultats
-
 
897
		if (count($noms_erreur) > 0) {
-
 
898
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
-
 
899
			$info['message']['lignes'] = $noms_erreur;
-
 
900
		} else {
-
 
901
			$info['resultat'] = true;
-
 
902
		}
-
 
903
		
-
 
904
		return $info;
-
 
905
	}
-
 
906
	
-
 
907
	private function testerGenreEspaces($noms) {
-
 
908
		$info = array('titre' => 'genre -> espaces en trop',
-
 
909
			'description' => "Le champ genre ne doit pas contenir d'espace avant ou aprés le nom.\n".
-
 
910
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
-
 
911
			'resultat' => false);
-
 
912
		
-
 
913
		// Réalisation du test
-
 
914
		$noms_erreur = array();
-
 
915
		foreach ($noms as $nom) {
-
 
916
			if ($nom['genre'] != '') {
-
 
917
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
-
 
918
					$nom_traite = $this->repererEspace($nom['genre']);
-
 
919
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
-
 
920
				}
-
 
921
			}
-
 
922
		}
-
 
923
		
-
 
924
		// Analyse des résultats
-
 
925
		if (count($noms_erreur) > 0) {
-
 
926
			$info['message']['entete'] = array('num_nom', 'genre erroné');
-
 
927
			$info['message']['lignes'] = $noms_erreur;
-
 
928
		} else {
-
 
929
			$info['resultat'] = true;
-
 
930
		}
-
 
931
		
-
 
932
		return $info;
-
 
933
	}
-
 
934
	
-
 
935
	private function testerGenreSyntaxe($noms) {
-
 
936
		$info = array('titre' => 'genre -> syntaxe',
-
 
937
			'description' => "Le champ genre peut contenir :\n".
-
 
938
			 	" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
-
 
939
				"	Il commence par une lettre majuscule (avec ou sans tréma).". 
-
 
940
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
-
 
941
				" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés entre eux \n".
-
 
942
				"	par la lettre x entourée de caractères espaces.",
-
 
943
			'resultat' => false);
-
 
944
		
-
 
945
		// Réalisation du test
-
 
946
		$noms_erreur = array();
-
 
947
		foreach ($noms as $nom) {
-
 
948
			if ($nom['genre'] != '') {
-
 
949
				$mots = explode(' ', $nom['genre']);
-
 
950
				foreach ($mots as $mot) {
-
 
951
					if (!(preg_match('/^[+x]$/', $mot) || preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $mot))) {
-
 
952
						$nom_traite = $this->repererEspace($nom['genre']);
-
 
953
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
-
 
954
					}
-
 
955
				}
-
 
956
			}
-
 
957
		}
-
 
958
		
-
 
959
		// Analyse des résultats
-
 
960
		if (count($noms_erreur) > 0) {
-
 
961
			$info['message']['entete'] = array('num_nom', 'genre erroné');
-
 
962
			$info['message']['lignes'] = $noms_erreur;
-
 
963
		} else {
-
 
964
			$info['resultat'] = true;
-
 
965
		}
-
 
966
		
-
 
967
		return $info;
-
 
968
	}
-
 
969
	
-
 
970
	private function testerGenreRang($noms) {
-
 
971
		$info = array('titre' => "genre -> rang >= {$this->manuel['rang_genre']}",
-
 
972
			'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
-
 
973
			'resultat' => false);
-
 
974
		
-
 
975
		// Réalisation du test
-
 
976
		$noms_erreur = array();
-
 
977
		foreach ($noms as $nom) {
-
 
978
			if ($nom['genre'] != '') {
-
 
979
				if ($nom['rang'] < $this->manuel['rang_genre']) {
-
 
980
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
-
 
981
				}
-
 
982
			}
-
 
983
		}
-
 
984
		
-
 
985
		// Analyse des résultats
-
 
986
		if (count($noms_erreur) > 0) {
-
 
987
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
-
 
988
			$info['message']['lignes'] = $noms_erreur;
-
 
989
		} else {
-
 
990
			$info['resultat'] = true;
-
 
991
		}
-
 
992
		
-
 
993
		return $info;
-
 
994
	}
-
 
995
		
-
 
996
	private function testerEpitheteInfraGeneriqueSyntaxe($noms) {
-
 
997
		$info = array('titre' => 'epithete_infra_generique -> syntaxe',
-
 
998
			'description' => "Le champ epithete_infra_generique est composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
-
 
999
				"La première lettre (avec ou sans tréma) doit être en majuscule.",
-
 
1000
			'resultat' => false);
-
 
1001
		
-
 
1002
		// Réalisation du test
-
 
1003
		$noms_erreur = array();
-
 
1004
		foreach ($noms as $nom) {
-
 
1005
			if ($nom['epithete_infra_generique'] != '') {
-
 
1006
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
-
 
1007
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
-
 
1008
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
1009
				}
-
 
1010
			}
-
 
1011
		}
-
 
1012
		
-
 
1013
		// Analyse des résultats
-
 
1014
		if (count($noms_erreur) > 0) {
-
 
1015
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
-
 
1016
			$info['message']['lignes'] = $noms_erreur;
-
 
1017
		} else {
-
 
1018
			$info['resultat'] = true;
-
 
1019
		}
-
 
1020
		
-
 
1021
		return $info;
-
 
1022
	}
-
 
1023
	
-
 
1024
	private function testerEpitheteInfraGeneriqueRang($noms) {
-
 
1025
		$info = array('titre' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
-
 
1026
			'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris \n".
-
 
1027
				"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
-
 
1028
			'resultat' => false);
-
 
1029
		
-
 
1030
		// Réalisation du test
-
 
1031
		$noms_erreur = array();
-
 
1032
		foreach ($noms as $nom) {
-
 
1033
			if ($nom['epithete_infra_generique'] != '') {
-
 
1034
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
-
 
1035
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
-
 
1036
				}
-
 
1037
			}
-
 
1038
		}
-
 
1039
		
-
 
1040
		// Analyse des résultats
-
 
1041
		if (count($noms_erreur) > 0) {
-
 
1042
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
-
 
1043
			$info['message']['lignes'] = $noms_erreur;
-
 
1044
		} else {
-
 
1045
			$info['resultat'] = true;
-
 
1046
		}
-
 
1047
		
-
 
1048
		return $info;
-
 
1049
	}
-
 
1050
	
-
 
1051
	private function testerEpitheteInfraGeneriqueEspaces($noms) {
-
 
1052
		$info = array('titre' => 'epithete_infra_generique -> espaces en trop',
-
 
1053
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou aprés sa valeur.",
-
 
1054
			'resultat' => false);
-
 
1055
		
-
 
1056
		// Réalisation du test
-
 
1057
		$noms_erreur = array();
-
 
1058
		foreach ($noms as $nom) {
-
 
1059
			if ($nom['epithete_infra_generique'] != '') {
-
 
1060
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
-
 
1061
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
-
 
1062
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
1063
				}
-
 
1064
			}
-
 
1065
		}
-
 
1066
		
-
 
1067
		// Analyse des résultats
-
 
1068
		if (count($noms_erreur) > 0) {
-
 
1069
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
-
 
1070
			$info['message']['lignes'] = $noms_erreur;
-
 
1071
		} else {
-
 
1072
			$info['resultat'] = true;
-
 
1073
		}
-
 
1074
		
-
 
1075
		return $info;
-
 
1076
	}
-
 
1077
	
-
 
1078
	private function testerEpitheteSpEspaces($noms) {
-
 
1079
		$info = array('titre' => 'epithete_sp -> espaces en trop',
-
 
1080
			'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou aprés le nom.\n".
-
 
1081
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas y avoir plusieurs espaces consécutifs.",
-
 
1082
			'resultat' => false);
-
 
1083
		
-
 
1084
		// Réalisation du test
-
 
1085
		$noms_erreur = array();
-
 
1086
		foreach ($noms as $nom) {
-
 
1087
			if ($nom['epithete_sp'] != '') {
-
 
1088
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
-
 
1089
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
-
 
1090
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
1091
				}
-
 
1092
			}
-
 
1093
		}
-
 
1094
		
-
 
1095
		// Analyse des résultats
-
 
1096
		if (count($noms_erreur) > 0) {
-
 
1097
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
-
 
1098
			$info['message']['lignes'] = $noms_erreur;
-
 
1099
		} else {
-
 
1100
			$info['resultat'] = true;
-
 
1101
		}
-
 
1102
		
-
 
1103
		return $info;
-
 
1104
	}
-
 
1105
	
-
 
1106
	private function testerEpitheteSpSyntaxe($noms) {
-
 
1107
		$info = array('titre' => 'epithete_sp -> syntaxe',
-
 
1108
			'description' => "Le champ epithete_sp peut contenir :\n".
-
 
1109
			 	" - un mot unique composé de lettres minuscules avec ou sans tréma (¨) et de tirets (-). \n".
-
 
1110
				"	Il commence par une lettre minuscule (avec ou sans tréma).\n". 
-
 
1111
				"	Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
-
 
1112
				" - 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".
-
 
1113
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) séparés entre eux \n".
-
 
1114
				"	par la lettre x entourée de caractères espaces.",
-
 
1115
			'resultat' => false);
-
 
1116
		
-
 
1117
		// Réalisation du test
-
 
1118
		$noms_erreur = array();
-
 
1119
		foreach ($noms as $nom) {
-
 
1120
			if ($nom['epithete_sp'] != '') {
-
 
1121
				$mots = explode(' ', $nom['epithete_sp']);
-
 
1122
				foreach ($mots as $mot) {
-
 
1123
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpithteSp($mot))) {
-
 
1124
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
-
 
1125
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
1126
					}
-
 
1127
				}
-
 
1128
			}
-
 
1129
		}
-
 
1130
		
-
 
1131
		// Analyse des résultats
-
 
1132
		if (count($noms_erreur) > 0) {
-
 
1133
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
-
 
1134
			$info['message']['lignes'] = $noms_erreur;
-
 
1135
		} else {
-
 
1136
			$info['resultat'] = true;
-
 
1137
		}
-
 
1138
		
-
 
1139
		return $info;
-
 
1140
	}
-
 
1141
	
-
 
1142
	private function testerEpitheteSpRang($noms) {
-
 
1143
		$info = array('titre' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
-
 
1144
			'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']}.",
-
 
1145
			'resultat' => false);
-
 
1146
		
-
 
1147
		// Réalisation du test
-
 
1148
		$noms_erreur = array();
-
 
1149
		foreach ($noms as $nom) {
-
 
1150
			if ($nom['epithete_sp'] != '') {
-
 
1151
				if ($nom['rang'] < $this->manuel['rang_sp']) {
-
 
1152
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_complet'], $nom['rang']);
-
 
1153
				}
-
 
1154
			}
-
 
1155
		}
-
 
1156
		
-
 
1157
		// Analyse des résultats
-
 
1158
		if (count($noms_erreur) > 0) {
-
 
1159
			$info['message']['entete'] = array('num_nom', 'nom_complet', 'rang erroné');
-
 
1160
			$info['message']['lignes'] = $noms_erreur;
-
 
1161
		} else {
-
 
1162
			$info['resultat'] = true;
-
 
1163
		}
-
 
1164
		
-
 
1165
		return $info;
-
 
1166
	}
-
 
1167
	
-
 
1168
	//+--------------------------------------------------------------------------------------------------------------+//
-
 
1169
	// MÉTHODES COMMUNES aux TESTS
-
 
1170
	
-
 
1171
	private function verifierTypeEpithete($type) {
-
 
1172
		$ok = true;
-
 
1173
		if (!preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
-
 
1174
			$ok = false;
-
 
1175
		}
-
 
1176
		return $ok;
-
 
1177
	}
-
 
1178
	
-
 
1179
	private function verifierEpithteSp($epithete) {
-
 
1180
		$ok = false;
-
 
1181
		if (preg_match('/^[a-zäëḧïöẗüẅẍÿ][-a-zäëḧïöẗüẅẍÿ]+$/', $epithete)) {
-
 
1182
			$ok = true;
-
 
1183
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
-
 
1184
			$ok = true;
-
 
1185
		}
-
 
1186
		return $ok;
-
 
1187
	}
651
	
1188
	
652
	private function formaterStyleNomGenre($genre) {
1189
	private function formaterStyleNomGenre($genre) {
653
		$genre_fmt = '';
1190
		$genre_fmt = '';
654
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
1191
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
655
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
1192
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
656
		} else {
1193
		} else {
657
			$genre_fmt = ucfirst(strtolower($genre));
1194
			$genre_fmt = ucfirst(strtolower($genre));
658
		}
1195
		}
659
		return $genre_fmt;
1196
		return $genre_fmt;
660
	}
1197
	}
661
	
1198
	
662
	private function repererEspace($nom_complet) {
1199
	private function repererEspace($nom_complet) {
663
		$nom_complet = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_complet);
1200
		$nom_complet = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_complet);
664
		return $nom_complet;
1201
		return $nom_complet;
665
	}
1202
	}
666
	
1203
	
667
	private function construireSuffixeNomPltCultivee($nom) {
1204
	private function construireSuffixeNomPltCultivee($nom) {
668
		$suffixe = array();
1205
		$suffixe = array();
669
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
1206
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
670
		$suffixe[] = $this->construireNomCommercial($nom);
1207
		$suffixe[] = $this->construireNomCommercial($nom);
671
		$suffixe[] = $this->construireNomCultivar($nom);
1208
		$suffixe[] = $this->construireNomCultivar($nom);
672
		$suffixe = array_filter($suffixe);
1209
		$suffixe = array_filter($suffixe);
673
		return implode(' ', $suffixe);
1210
		return implode(' ', $suffixe);
674
	}
1211
	}
675
	
1212
	
676
	private function construireNomCultivarGroupe($nom) {
1213
	private function construireNomCultivarGroupe($nom) {
677
		$nom_groupe_cultivar = '';
1214
		$nom_groupe_cultivar = '';
678
		if ($nom['cultivar_groupe'] != '') {
1215
		if ($nom['cultivar_groupe'] != '') {
679
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
1216
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
680
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
1217
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
681
			} else {
1218
			} else {
682
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
1219
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
683
			}
1220
			}
684
		}
1221
		}
685
		return $nom_groupe_cultivar;
1222
		return $nom_groupe_cultivar;
686
	}
1223
	}
687
	
1224
	
688
	private function construireNomCommercial($nom) {
1225
	private function construireNomCommercial($nom) {
689
		$nom_commercial = '';
1226
		$nom_commercial = '';
690
		if ($nom['nom_commercial'] != '') {
1227
		if ($nom['nom_commercial'] != '') {
691
			$nom_commercial =  strtoupper($nom['nom_commercial']);
1228
			$nom_commercial =  strtoupper($nom['nom_commercial']);
692
		}
1229
		}
693
		return $nom_commercial;
1230
		return $nom_commercial;
694
	}
1231
	}
695
	
1232
	
696
	private function construireNomCultivar($nom) {
1233
	private function construireNomCultivar($nom) {
697
		$nom_cultivar = '';
1234
		$nom_cultivar = '';
698
		if ($nom['cultivar'] != '') {
1235
		if ($nom['cultivar'] != '') {
699
			$nom_cultivar =  "'".$nom['cultivar']."'";
1236
			$nom_cultivar =  "'".$nom['cultivar']."'";
700
		}
1237
		}
701
		return $nom_cultivar;
1238
		return $nom_cultivar;
702
	}
1239
	}
-
 
1240
	
-
 
1241
	private function classerNoms($noms) {
-
 
1242
		$noms_classes = array();
-
 
1243
		foreach ($noms as $nom) {
-
 
1244
			$noms_classes[$nom['num_nom']] = $nom;
-
 
1245
		}
-
 
1246
		return $noms_classes;
703
	
1247
	}
704
}
1248
}
705
?>
1249
?>