Subversion Repositories Applications.referentiel

Rev

Rev 167 | Rev 173 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 167 Rev 171
Line 22... Line 22...
22
	
22
	
23
	private $projet = null;
23
	private $projet = null;
Line 24... Line 24...
24
	private $traitement = null;
24
	private $traitement = null;
-
 
25
	
25
	
26
	private $manuel = null;
26
	private $manuel = null;
27
	private $tests = null;
27
	private $colonnes = null;
28
	private $colonnes = null;
Line 28... Line 29...
28
	private $analyses = null;
29
	private $analyses = null;
Line 33... Line 34...
33
	private $tableStructureDao = null;
34
	private $tableStructureDao = null;
34
	private $referentielDao = null;
35
	private $referentielDao = null;
Line 35... Line 36...
35
	
36
	
36
	public function executer() {
37
	public function executer() {
-
 
38
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v4.1.ini');
Line 37... Line 39...
37
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v4.1.ini');
39
		$this->tests = parse_ini_file($this->getModuleChemin().DS.'configurations'.DS.'tests.ini', true);
38
		
40
		
39
		$this->resultatDao = new ResultatDao();
41
		$this->resultatDao = new ResultatDao();
40
		$this->traitementDao = new TraitementDao();
42
		$this->traitementDao = new TraitementDao();
Line 212... Line 214...
212
	}
214
	}
Line 213... Line 215...
213
	
215
	
214
	//+--------------------------------------------------------------------------------------------------------------+//
216
	//+--------------------------------------------------------------------------------------------------------------+//
Line 215... Line -...
215
	// TESTS
-
 
216
	
-
 
217
	private function testerStatutCultureSyntaxe() {
-
 
218
		$info = array('nom' => 'statut_culture -> syntaxe',
-
 
219
			'description' => "Le champ statut_culture peut contenir :\n".
-
 
220
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
-
 
221
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
-
 
222
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
-
 
223
								"un code de présence spécifique au référentiel.",
217
	// TESTS
224
			'resultat' => false);
218
	
225
		
219
	/**
226
		// Réalisation du test
220
	 * Test #01
227
		$noms_erreur = array();
221
	 */
228
		foreach ($this->noms as &$nom) {
-
 
229
			if ($nom['statut_culture'] != '') {
-
 
230
				if (!$this->verifierStatutCulture($nom['statut_culture'])) {
-
 
231
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
-
 
232
				}
-
 
Line 233... Line 222...
233
			}
222
	private function testerNombreDeChamps($colonnes) {
234
		}
-
 
235
		
-
 
236
		// Analyse des résultats
223
		$info = $this->getInfosTest(1);
237
		if (count($noms_erreur) > 0) {
224
		
238
			$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
225
		$nbre_colonnes = count($colonnes);
239
			$info['message']['lignes'] = $noms_erreur;
226
		$info['message'] = $nbre_colonnes;
240
		} else {
-
 
241
			$info['resultat'] = true;
-
 
242
		}
227
		if ($nbre_colonnes >= 35) {
-
 
228
			$info['resultat'] = true;
243
		$noms_erreur = null;
229
		}
Line -... Line 230...
-
 
230
		$this->traiterResultatTest($info);
-
 
231
		return ($info['resultat'] ? '1' : '0');
-
 
232
	}
244
		
233
	
245
		$this->traiterResultatTest($info);
-
 
246
	}
-
 
247
	
-
 
248
	private function testerStatutIntroductionSyntaxe() {
-
 
249
		$info = array('nom' => 'statut_introduction -> syntaxe',
-
 
250
			'description' => "Le champ statut_introduction peut contenir :\n".
-
 
251
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
234
	/**
Line 252... Line 235...
252
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
235
	 * Test #02
253
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
236
	 */
254
								"un code de présence spécifique au référentiel.",
237
	private function testerNomDesChamps($colonnes) {
255
			'resultat' => false);
238
		$info = $this->getInfosTest(2);
256
		
-
 
257
		// Réalisation du test
-
 
258
		$noms_erreur = array();
239
		
-
 
240
		$champs_attendus = explode(',', $this->manuel['champs']);
-
 
241
		$champs_presents = array();
-
 
242
		foreach ($colonnes as $colonne) {
-
 
243
			$champs_presents[$colonne['Field']] = $colonne;
-
 
244
		}
-
 
245
		
-
 
246
		$ok = true;
259
		foreach ($this->noms as &$nom) {
247
		$champs_manquant = array(); 
260
			if ($nom['statut_introduction'] != '') {
248
		foreach ($champs_attendus as $champ_attendu) {
261
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
-
 
262
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
-
 
263
				}
-
 
264
			}
-
 
265
		}
249
			if (!isset($champs_presents[$champ_attendu])) {
266
		
250
				$champs_manquant[] = $champ_attendu; 
267
		// Analyse des résultats
251
				$ok = false;
268
		if (count($noms_erreur) > 0) {
252
			}
269
			$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
-
 
Line 270... Line 253...
270
			$info['message']['lignes'] = $noms_erreur;
253
		}
-
 
254
		$info['resultat'] = $ok;
271
		} else {
255
		if (!$ok) {
Line -... Line 256...
-
 
256
			$info['message'] = sprintf($info['message'], implode(', ', $champs_manquant));
-
 
257
		}
-
 
258
		
272
			$info['resultat'] = true;
259
		$this->traiterResultatTest($info);
273
		}
-
 
274
		$noms_erreur = null;
-
 
275
		
-
 
276
		$this->traiterResultatTest($info);
-
 
277
	}
-
 
278
	
-
 
279
	private function testerStatutOrigineSyntaxe() {
260
		return ($info['resultat'] ? '1' : '0');
Line -... Line 261...
-
 
261
	}
-
 
262
	
-
 
263
	/**
-
 
264
	 * Test #03
-
 
265
	 */
-
 
266
	private function testerTypeDesChamps($colonnes) {
280
		$info = array('nom' => 'statut_origine -> syntaxe',
267
		$info = $this->getInfosTest(3);
281
			'description' => "Le champ statut_origine peut contenir :\n".
268
		
282
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
269
		$champs_attendus = explode(',', $this->manuel['champs_type']);
-
 
270
		$champs_presents = array();
-
 
271
		foreach ($colonnes as $colonne) {
-
 
272
			$champs_presents[$colonne['Field']] = $colonne['Type'];
283
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
273
		}
284
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
274
		
-
 
275
		// Recercherche des erreurs
-
 
276
		$champs_erreur = array(); 
-
 
277
		foreach ($champs_attendus as $champ_attendu) {
-
 
278
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
-
 
279
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
285
								"un code de présence spécifique au référentiel.",
280
			
286
			'resultat' => false);
281
			if (isset($champs_presents[$champ_attendu_nom])) {
287
		
282
				$champs_present_type = $champs_presents[$champ_attendu_nom];
288
		// Réalisation du test
283
				
Line 289... Line 284...
289
		$noms_erreur = array();
284
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
290
		foreach ($this->noms as &$nom) {
285
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
291
			if ($nom['statut_origine'] != '') {
-
 
292
				if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
286
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) 
293
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
287
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
294
				}
288
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
295
			}
289
				}
296
		}
-
 
Line 297... Line 290...
297
		
290
			}
-
 
291
		}
298
		// Analyse des résultats
292
		
Line 299... Line -...
299
		if (count($noms_erreur) > 0) {
-
 
300
			$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
-
 
301
			$info['message']['lignes'] = $noms_erreur;
-
 
302
		} else {
-
 
303
			$info['resultat'] = true;
-
 
304
		}
-
 
305
		$noms_erreur = null;
-
 
306
		
-
 
307
		$this->traiterResultatTest($info);
293
		// Analyse des résultats
308
	}
294
		if (count($champs_erreur) > 0) {
309
	
295
			$info['message'] = sprintf($info['message'], implode(', ', $champs_erreur));
310
	private function testerPresenceSyntaxe() {
296
		} else {
311
		$info = array('nom' => 'presence -> syntaxe',
297
			$info['resultat'] = true;
312
			'description' => "Le champ presence contient soit :\n".
-
 
313
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
-
 
314
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
-
 
315
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
-
 
316
								"un code de présence spécifique au référentiel.",
-
 
Line 317... Line -...
317
			'resultat' => false);
-
 
318
		
298
		}
319
		// Réalisation du test
299
		
320
		$noms_erreur = array();
-
 
321
		foreach ($this->noms as &$nom) {
-
 
322
			if ($nom['presence'] != '') {
300
		$this->traiterResultatTest($info);
323
				if (!$this->verifierPresence($nom['presence'])) {
301
		return ($info['resultat'] ? '1' : '0');
324
					$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
302
	}
Line 325... Line 303...
325
				}
303
	
-
 
304
	/**
326
			}
305
	 * Test #04
Line 327... Line -...
327
		}
-
 
328
		
-
 
329
		// Analyse des résultats
-
 
330
		if (count($noms_erreur) > 0) {
-
 
331
			$info['message']['entete'] = array('num_nom', 'presence erroné');
-
 
Line -... Line 306...
-
 
306
	 */
-
 
307
	private function testerNumNomClePrimaire($colonnes) {
-
 
308
		$info = $this->getInfosTest(4);
-
 
309
		
332
			$info['message']['lignes'] = $noms_erreur;
310
		foreach ($colonnes as $colonne) {
-
 
311
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
333
		} else {
312
				$info['resultat'] = true;
334
			$info['resultat'] = true;
313
			}
335
		}
-
 
336
		$noms_erreur = null;
314
		}
337
		
315
		
338
		$this->traiterResultatTest($info);
-
 
339
	}
316
		$this->traiterResultatTest($info);
340
	
317
		return ($info['resultat'] ? '1' : '0');
Line 341... Line 318...
341
	private function testerHybrideParent02Existence() {
318
	}
342
		$info = array('nom' => 'hybride_parent_02 -> existence',
319
	
343
			'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur ".
320
	
344
								"du champ num_nom.",
321
	/**
345
			'resultat' => false);
-
 
346
		
-
 
347
		// Réalisation du test
322
	 * Test #05
348
		$noms_erreur = array();
-
 
349
		foreach ($this->noms as &$nom) {
-
 
350
			if ($nom['hybride_parent_02'] != '') {
-
 
351
				if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
323
	 */
Line 352... Line -...
352
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
-
 
353
				}
-
 
354
			}
-
 
355
		}
-
 
356
		
-
 
357
		// Analyse des résultats
324
	private function testerTailleDesChamps($colonnes, $analyses) {
358
		if (count($noms_erreur) > 0) {
-
 
359
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
-
 
360
			$info['message']['lignes'] = $noms_erreur;
325
		$info = $this->getInfosTest(5);
361
		} else {
326
		
362
			$info['resultat'] = true;
327
		$tailles_champs_maxi = array();
363
		}
328
		foreach ($colonnes as $colonne) {
364
		$noms_erreur = null;
329
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
365
		
330
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
366
		$this->traiterResultatTest($info);
331
			}
367
	}
332
		}
Line 368... Line 333...
368
	
333
		
369
	private function testerHybrideParent02Syntaxe() {
334
		$tailles_trouvees = array();
370
		$info = array('nom' => 'hybride_parent_02 -> syntaxe',
-
 
371
			'description' => "Le champ hybride_parent_02 contient soit :\n".
335
		foreach ($analyses as $analyse) {
372
								" - une valeur vide,\n".
336
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
373
								" - un nombre.",
337
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
374
			'resultat' => false);
338
			}
375
		
-
 
Line 376... Line 339...
376
		// Réalisation du test
339
		}
377
		$noms_erreur = array();
340
		
Line -... Line 341...
-
 
341
		$champs_erreur = array();
-
 
342
		$champs_attendus = explode(',', $this->manuel['champs']);
378
		foreach ($this->noms as &$nom) {
343
		foreach ($champs_attendus as $champ_attendu) {
379
			if ($nom['hybride_parent_02'] != '') {
344
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
380
				if (!$this->verifierNombre($nom['hybride_parent_02'])) {
-
 
381
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
-
 
382
				}
-
 
383
			}
345
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
Line 384... Line 346...
384
		}
346
					$champs_erreur[] = $champ_attendu;
385
		
347
				}
386
		// Analyse des résultats
348
			}
387
		if (count($noms_erreur) > 0) {
-
 
388
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
349
		}
389
			$info['message']['lignes'] = $noms_erreur;
350
		
390
		} else {
-
 
391
			$info['resultat'] = true;
351
		// Analyse des résultats
392
		}
352
		if (count($champs_erreur) > 0) {
Line 393... Line 353...
393
		$noms_erreur = null;
353
			$info['message'] = sprintf($info['message'], implode(', ', $champs_erreur));
394
		
354
		} else {
395
		$this->traiterResultatTest($info);
-
 
396
	}
355
			$info['resultat'] = true;
397
	
356
		}
398
	
357
		
399
	private function testerHybrideParent01Existence() {
358
		$this->traiterResultatTest($info);
400
		$info = array('nom' => 'hybride_parent_01 -> existence',
-
 
Line 401... Line 359...
401
			'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur ".
359
	}
402
								"du champ num_nom.",
360
		
Line -... Line 361...
-
 
361
	/**
-
 
362
	 * Test #06
-
 
363
	 */
403
			'resultat' => false);
364
	private function testerNumNomSuperieurAZero() {
404
		
-
 
405
		// Réalisation du test
-
 
406
		$noms_erreur = array();
-
 
407
		foreach ($this->noms as &$nom) {
-
 
408
			if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
365
		$info = $this->getInfosTest(6);
Line 409... Line 366...
409
				if (!isset($this->noms[$nom['hybride_parent_01']])) {
366
		
410
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
367
		// Réalisation du test
411
				}
368
		$noms_erreur = array();
412
			}
369
		foreach ($this->noms as &$nom) {
413
		}
370
			if ($nom['num_nom'] <= 0) {
414
		
-
 
415
		// Analyse des résultats
-
 
416
		if (count($noms_erreur) > 0) {
371
				$noms_erreur[] = $nom['num_nom'];
417
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
372
			}
Line 418... Line 373...
418
			$info['message']['lignes'] = $noms_erreur;
373
		}
419
		} else {
374
		
420
			$info['resultat'] = true;
375
		// Analyse des résultats
421
		}
-
 
422
		$noms_erreur = null;
376
		if (count($noms_erreur) > 0) {
423
		
377
			$info['message'] = sprintf($info['message'], count($noms_erreur));
424
		$this->traiterResultatTest($info);
378
		} else {
425
	}
-
 
Line 426... Line 379...
426
	
379
			$info['resultat'] = true;
427
	private function testerHybrideParent01Syntaxe() {
380
		}
Line -... Line 381...
-
 
381
		
-
 
382
		$this->traiterResultatTest($info);
-
 
383
	}
428
		$info = array('nom' => 'hybride_parent_01 -> syntaxe',
384
	
429
			'description' => "Le champ hybride_parent_01 contient soit :\n".
-
 
430
								" - une valeur vide,\n".
-
 
431
								" - un nombre.",
-
 
432
			'resultat' => false);
385
	/**
Line 433... Line 386...
433
		
386
	 * Test #07
434
		// Réalisation du test
387
	 */
435
		$noms_erreur = array();
388
	private function testerNumNomRetenuSuperieurAZero() {
436
		foreach ($this->noms as &$nom) {
-
 
437
			if ($nom['hybride_parent_01'] != '') {
389
		$info = $this->getInfosTest(7);
438
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
390
		
439
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
-
 
440
				}
391
		// Réalisation du test
441
			}
392
		$noms_erreur = array();
Line 442... Line 393...
442
		}
393
		foreach ($this->noms as &$nom) {
443
		
394
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
444
		// Analyse des résultats
395
				$noms_erreur[] = $nom['num_nom'];
445
		if (count($noms_erreur) > 0) {
-
 
446
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
396
			}
447
			$info['message']['lignes'] = $noms_erreur;
397
		}
448
		} else {
398
		
449
			$info['resultat'] = true;
-
 
Line 450... Line 399...
450
		}
399
		// Analyse des résultats
451
		$noms_erreur = null;
400
		if (count($noms_erreur) > 0) {
Line -... Line 401...
-
 
401
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
-
 
402
		} else {
-
 
403
			$info['resultat'] = true;
452
		
404
		}
453
		$this->traiterResultatTest($info);
-
 
454
	}
-
 
455
	
-
 
456
	private function testerSynonymeOrthographiqueExistence() {
-
 
457
		$info = array('nom' => 'synonyme_orthographique -> existence',
405
		
Line 458... Line 406...
458
			'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
406
		$this->traiterResultatTest($info);
459
								"à une valeur du champ num_nom.",
407
	}
460
			'resultat' => false);
408
	
461
		
409
	/**
462
		// Réalisation du test
-
 
463
		$noms_erreur = array();
410
	 * Test #08
464
		foreach ($this->noms as &$nom) {
-
 
465
			if ($nom['synonyme_orthographique'] != '') {
411
	 */
466
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
412
	private function testerNumTaxSupEgalZeroUnique() {
Line 467... Line 413...
467
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
413
		$info = $this->getInfosTest(8);
468
				}
414
		
469
			}
415
		// Réalisation du test
470
		}
-
 
471
		
416
		$noms_erreur = array();
472
		// Analyse des résultats
417
		foreach ($this->noms as &$nom) {
473
		if (count($noms_erreur) > 0) {
418
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
474
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
-
 
Line 475... Line 419...
475
			$info['message']['lignes'] = $noms_erreur;
419
				$noms_erreur[] = $nom['num_nom'];
476
		} else {
420
			}
Line -... Line 421...
-
 
421
		}
-
 
422
		
-
 
423
		// Analyse des résultats
477
			$info['resultat'] = true;
424
		if (count($noms_erreur) > 1) {
478
		}
-
 
479
		$noms_erreur = null;
-
 
480
		
-
 
481
		$this->traiterResultatTest($info);
-
 
482
	}
425
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
Line 483... Line 426...
483
	
426
		} else {
484
	private function testerSynonymeOrthographiqueSyntaxe() {
427
			$info['resultat'] = true;
485
		$info = array('nom' => 'synonyme_orthographique -> syntaxe',
428
		}
486
			'description' => "Le champ synonyme_orthographique contient soit :\n".
429
		
487
								" - une valeur vide,\n".
430
		$this->traiterResultatTest($info);
488
								" - un nombre.",
431
	}
489
			'resultat' => false);
432
	
490
		
433
	/**
491
		// Réalisation du test
434
	 * Test #09
Line 492... Line 435...
492
		$noms_erreur = array();
435
	 */
493
		foreach ($this->noms as $nom) {
436
	private function testerTaxSupPourTaxon() {
494
			if ($nom['synonyme_orthographique'] != '') {
437
		$info = $this->getInfosTest(9);
495
				if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
-
 
496
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
438
		
497
				}
439
		// Réalisation du test
498
			}
440
		$noms_erreur = array();
499
		}
-
 
Line 500... Line 441...
500
		
441
		foreach ($this->noms as &$nom) {
501
		// Analyse des résultats
442
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
Line -... Line 443...
-
 
443
				$noms_erreur[] = $nom['num_nom']; 
-
 
444
			}
502
		if (count($noms_erreur) > 0) {
445
		}
503
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
446
		
504
			$info['message']['lignes'] = $noms_erreur;
-
 
505
		} else {
-
 
506
			$info['resultat'] = true;
-
 
507
		}
-
 
508
		$noms_erreur = null;
447
		// Analyse des résultats
Line 509... Line 448...
509
		
448
		if (count($noms_erreur) > 0) {
510
		$this->traiterResultatTest($info);
449
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
511
	}
450
		} else {
512
	
451
			$info['resultat'] = true;
513
	private function testerSynonymeMalAppliqueSyntaxe() {
452
		}
-
 
453
		
-
 
454
		$this->traiterResultatTest($info);
-
 
455
	}
-
 
456
	
514
		$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
457
	/**
-
 
458
	 * Test #10
-
 
459
	 */
515
			'description' => "Le champ synonyme_mal_applique contient soit :\n".
460
	private function testerExitenceTaxonSuperieur() {
516
			" - une valeur vide,\n".
461
		$info = $this->getInfosTest(10);
517
			" - le chiffre 1.",
462
		
Line 518... Line 463...
518
			'resultat' => false);
463
		// Réalisation du test
519
		
464
		$noms_erreur = array();
520
		// Réalisation du test
465
		foreach ($this->noms as &$nom) {
521
		$noms_erreur = array();
-
 
522
		foreach ($this->noms as &$nom) {
466
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
523
			if ($nom['synonyme_mal_applique'] != '') {
467
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
524
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
468
					$noms_erreur[] = $nom['num_nom'];
525
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
-
 
Line 526... Line 469...
526
				}
469
				} 
527
			}
470
			}
Line -... Line 471...
-
 
471
		}
-
 
472
		
-
 
473
		// Analyse des résultats
528
		}
474
		if (count($noms_erreur) > 0) {
529
		
-
 
530
		// Analyse des résultats
-
 
531
		if (count($noms_erreur) > 0) {
475
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
Line 532... Line 476...
532
			$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
476
		} else {
533
			$info['message']['lignes'] = $noms_erreur;
477
			$info['resultat'] = true;
-
 
478
		}
534
		} else {
479
		
535
			$info['resultat'] = true;
480
		$this->traiterResultatTest($info);
-
 
481
	}
-
 
482
	
-
 
483
	/**
-
 
484
	 * Test #11
-
 
485
	 */
-
 
486
	private function testerClassificationRang() {
-
 
487
		$info = $this->getInfosTest(11);
-
 
488
		
536
		}
489
		// Réalisation du test
-
 
490
		$noms_erreur = array();
-
 
491
		foreach ($this->noms as &$nom) {
537
		$noms_erreur = null;
492
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
538
		
493
				if (isset($this->noms[$nom['num_tax_sup']])) {
-
 
494
					$nom_sup = $this->noms[$nom['num_tax_sup']];
-
 
495
					if ($nom_sup['rang'] >= $nom['rang']) {
-
 
496
						// Prise en compte de l'exception des clades
Line 539... Line 497...
539
		$this->traiterResultatTest($info);
497
						if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
540
	}
498
							$noms_erreur[] = $nom['num_nom'];
541
	
499
						}
542
	
-
 
543
	private function testerSynonymeDouteuxSyntaxe() {
500
					}
544
		$info = array('nom' => 'synonyme_douteux -> syntaxe',
501
				}
545
			'description' => "Le champ synonyme_douteux contient soit :\n".
502
			}
546
			" - une valeur vide,\n".
-
 
-
 
503
		}
547
			" - le chiffre 1.",
504
		
548
			'resultat' => false);
505
		// Analyse des résultats
Line 549... Line -...
549
		
-
 
550
		// Réalisation du test
506
		if (count($noms_erreur) > 0) {
551
		$noms_erreur = array();
507
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
552
		foreach ($this->noms as &$nom) {
-
 
553
			if ($nom['synonyme_douteux'] != '') {
508
		} else {
554
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
509
			$info['resultat'] = true;
555
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
-
 
556
				}
510
		}
557
			}
511
		
558
		}
512
		$this->traiterResultatTest($info);
559
		
513
	}
560
		// Analyse des résultats
-
 
561
		if (count($noms_erreur) > 0) {
514
	
562
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
515
	/**
563
			$info['message']['lignes'] = $noms_erreur;
516
	 * Test #12
564
		} else {
517
	 */
565
			$info['resultat'] = true;
518
	private function testerClassification() {
566
		}
519
		$info = $this->getInfosTest(12);
-
 
520
		
567
		$noms_erreur = null;
521
		// Réalisation du test
568
		
522
		$noms_erreur = array();
569
		$this->traiterResultatTest($info);
-
 
570
	}
523
		$this->noms_ok = array();
-
 
524
		foreach ($this->noms as &$nom) {
571
	
525
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
572
	private function testerSynonymeDouteuxNumNomRetenu() {
-
 
573
		$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
-
 
574
			'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
-
 
575
			'resultat' => false);
-
 
576
		
-
 
577
		// Réalisation du test
526
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
578
		$noms_erreur = array();
527
					$this->noms_ok[$nom['num_nom']] = true;
579
		foreach ($this->noms as &$nom) {
528
				} else {
580
			if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
-
 
581
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
-
 
582
			}
-
 
583
		}
529
					$this->detection_boucle_infini = array();
Line -... Line 530...
-
 
530
					$classif_ok = $this->remonterClassif($nom);
-
 
531
					unset($this->detection_boucle_infini); 
-
 
532
					
584
		
533
					if ($classif_ok === false) {
585
		// Analyse des résultats
534
						$noms_erreur[] = $nom['num_nom'];
586
		if (count($noms_erreur) > 0) {
-
 
587
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
-
 
588
			$info['message']['lignes'] = $noms_erreur;
-
 
-
 
535
					} else {
589
		} else {
536
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
590
			$info['resultat'] = true;
-
 
Line 591... Line 537...
591
		}
537
					}
592
		$noms_erreur = null;
538
				}
593
		$this->traiterResultatTest($info);
539
			}
594
	}
540
		}
595
	
-
 
596
	
541
		unset($this->noms_ok);
597
	private function testerSynonymeProparteExistence() {
-
 
598
		$info = array('nom' => 'synonyme_proparte -> existence',
542
		
599
			'description' => "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux ".
543
		// Analyse des résultats
Line 600... Line 544...
600
								"doit correspondre à une valeur du champ num_nom.",
544
		if (count($noms_erreur) > 0) {
601
			'resultat' => false);
545
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
602
		
546
		} else {
603
		// Réalisation du test
-
 
604
		$noms_erreur = array();
547
			$info['resultat'] = true;
605
		foreach ($this->noms as &$nom) {
548
		}
606
			if ($nom['synonyme_proparte'] != '') {
549
		
607
				$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
-
 
Line 608... Line 550...
608
				$num_nom_en_erreur = array();
550
		$this->traiterResultatTest($info);
609
				foreach ($num_nom_a_verifier as $num_nom) {
551
	}
Line -... Line 552...
-
 
552
	
-
 
553
	private function remonterClassif(&$nom) {
-
 
554
		$this->detection_boucle_infini[$nom['num_nom']] = true;
610
					if (!isset($this->noms[$num_nom])) {
555
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
611
						$num_nom_en_erreur[] = $num_nom;
556
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
612
					}
557
				$this->noms_ok[$nom['num_nom']] = true;
613
				}
-
 
614
				if (count($nbre_en_erreur) > 0) {
-
 
Line 615... Line 558...
615
					$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
558
				return true;
616
				}
559
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
617
			}
560
				$this->noms_ok[$nom['num_nom']] = true;
618
		}
561
				return true;
-
 
562
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
-
 
563
				return false;
-
 
564
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
619
		
565
				return false;
-
 
566
			} else {
620
		// Analyse des résultats
567
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
621
		if (count($noms_erreur) > 0) {
568
				if ($retour === true) {
622
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
569
					$this->noms_ok[$nom['num_tax_sup']] = true;
623
			$info['message']['lignes'] = $noms_erreur;
570
				}
Line 624... Line 571...
624
		} else {
571
				return $retour;
625
			$info['resultat'] = true;
572
			}
626
		}
573
		} else {
627
		$noms_erreur = null;
574
			return false;
628
		
575
		}
629
		$this->traiterResultatTest($info);
576
	}
630
	}
577
	
631
	
-
 
Line 632... Line 578...
632
	private function testerSynonymeProparteSyntaxe() {
578
	/**
633
		$info = array('nom' => 'synonyme_proparte -> syntaxe',
579
	 * Test #13
Line -... Line 580...
-
 
580
	 */
-
 
581
	private function testerRang() {
-
 
582
		$info = $this->getInfosTest(13);
634
			'description' => "Le champ synonyme_proparte contient soit :\n".
583
		
635
			" - une valeur vide,\n".
584
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
636
			" - un nombre,\n".
585
		
637
			" - une suite de nombres séparés par des virgules.",
-
 
638
			'resultat' => false);
-
 
639
		
-
 
Line 640... Line 586...
640
		// Réalisation du test
586
		// Réalisation du test
641
		$noms_erreur = array();
587
		$noms_erreur = array();
642
		foreach ($this->noms as &$nom) {
588
		foreach ($this->noms as &$nom) {
-
 
589
			if (!isset($rangs[$nom['rang']])) {
-
 
590
				$noms_erreur[] = $nom['num_nom'];
-
 
591
			}
-
 
592
		}
643
			if ($nom['synonyme_proparte'] != '') {
593
		
644
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
594
		// Analyse des résultats
645
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
595
		if (count($noms_erreur) > 0) {
646
				}
596
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
647
			}
597
		} else {
648
		}
598
			$info['resultat'] = true;
Line 649... Line 599...
649
		
599
		}
650
		// Analyse des résultats
600
		
651
		if (count($noms_erreur) > 0) {
601
		$this->traiterResultatTest($info);
652
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
602
	}
653
			$info['message']['lignes'] = $noms_erreur;
603
	
654
		} else {
604
	/**
655
			$info['resultat'] = true;
605
	 * Test #14
656
		}
-
 
Line 657... Line 606...
657
		$noms_erreur = null;
606
	 */
658
		
607
	private function testerNomCompletSupraGenerique() {
Line -... Line 608...
-
 
608
		$info = $this->getInfosTest(14);
-
 
609
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
-
 
610
		
659
		$this->traiterResultatTest($info);
611
		// Réalisation du test
660
	}
612
		$noms_erreur = array();
661
	
613
		foreach ($this->noms as &$nom) {
662
	private function testerBasionymeExistence() {
-
 
663
		$info = array('nom' => 'basionyme -> existence',
-
 
664
			'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
-
 
665
								"num_nom.",
-
 
Line 666... Line 614...
666
			'resultat' => false);
614
			if ($nom['rang'] < $this->manuel['rang_genre']) {
667
		
615
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
668
		// Réalisation du test
616
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
-
 
617
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
-
 
618
				if ($nom['nom_sci'] != $nom_sci_ideal) {
-
 
619
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
-
 
620
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
-
 
621
				}
-
 
622
			}
669
		$noms_erreur = array();
623
		}
-
 
624
		
-
 
625
		// Analyse des résultats
-
 
626
		if (count($noms_erreur) > 0) {
-
 
627
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
-
 
628
			$info['message']['lignes'] = $noms_erreur;
-
 
629
		} else {
670
		foreach ($this->noms as &$nom) {
630
			$info['resultat'] = true;
-
 
631
		}
671
			if ($nom['basionyme'] != '') {
632
		
672
				if (!isset($this->noms[$nom['basionyme']])) {
633
		$this->traiterResultatTest($info);
673
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
634
	}
674
				}
635
	
675
			}
-
 
Line 676... Line 636...
676
		}
636
	/**
677
		
637
	 * Test #15
678
		// Analyse des résultats
638
	 */
679
		if (count($noms_erreur) > 0) {
639
	private function testerNomCompletGenre() {
680
			$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
640
		$info = $this->getInfosTest(15);
681
			$info['message']['lignes'] = $noms_erreur;
641
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
682
		} else {
642
		
683
			$info['resultat'] = true;
643
		// Réalisation du test
Line 684... Line 644...
684
		}
644
		$noms_erreur = array();
685
		$noms_erreur = null;
645
		foreach ($this->noms as &$nom) {
Line -... Line 646...
-
 
646
			if ($nom['rang'] == $this->manuel['rang_genre']) {
-
 
647
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
-
 
648
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
686
		
649
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
687
		$this->traiterResultatTest($info);
650
				if ($nom['nom_sci'] != $nom_sci_ideal) {
688
	}
651
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
689
	
-
 
690
	private function testerBasionymeSyntaxe() {
-
 
691
		$info = array('nom' => 'basionyme -> syntaxe',
-
 
Line 692... Line 652...
692
			'description' => "Le champ basionyme contient :\n".
652
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
693
								" - une valeur vide,\n".
653
				}
694
								" - un nombre.",
654
			}
-
 
655
		}
-
 
656
		
-
 
657
		// Analyse des résultats
-
 
658
		if (count($noms_erreur) > 0) {
-
 
659
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
695
			'resultat' => false);
660
			$info['message']['lignes'] = $noms_erreur;
696
		
661
		} else {
697
		// Réalisation du test
662
			$info['resultat'] = true;
698
		$noms_erreur = array();
663
		}
699
		foreach ($this->noms as &$nom) {
664
		
700
			if ($nom['basionyme'] != '') {
665
		$this->traiterResultatTest($info);
Line 701... Line 666...
701
				if (!$this->verifierNombre($nom['basionyme'])) {
666
	}
702
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
667
	
703
				}
668
	/**
704
			}
669
	 * Test #16
705
		}
670
	 */
706
		
671
	private function testerNomCompletInfraGenre() {
707
		// Analyse des résultats
672
		$info = $this->getInfosTest(16);
708
		if (count($noms_erreur) > 0) {
673
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
Line 709... Line 674...
709
			$info['message']['entete'] = array('num_nom', 'basionyme erroné');
674
		
710
			$info['message']['lignes'] = $noms_erreur;
675
		// Réalisation du test
Line 711... Line -...
711
		} else {
-
 
712
			$info['resultat'] = true;
-
 
713
		}
-
 
714
		$noms_erreur = null;
-
 
715
		
-
 
716
		$this->traiterResultatTest($info);
-
 
717
	}
-
 
718
	
-
 
719
	private function testerHomonymieExistence() {
-
 
-
 
676
		$noms_erreur = array();
720
		$info = array('nom' => 'homonyme -> existence',
677
		foreach ($this->noms as &$nom) {
721
			'description' => "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur ".
-
 
722
								"dans le champ nom_sci.",
-
 
-
 
678
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
723
			'resultat' => false);
679
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
724
		
680
				$nom_sci_ideal = '';
725
		$noms_homonymie = $this->classerNomsParNomComplet();
681
				if ($nom['type_epithete'] == 'agg.') {
726
		
-
 
727
		// Réalisation du test
-
 
728
		$noms_erreur = array();
-
 
Line 729... Line 682...
729
		foreach ($this->noms as &$nom) {
682
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
730
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
683
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
731
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
684
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
732
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
685
				} else {
-
 
686
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
733
				}
687
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
-
 
688
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
-
 
689
				}
-
 
690
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
-
 
691
				if ($nom['nom_sci'] != $nom_sci_ideal) {
-
 
692
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
734
			}
693
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
735
		}
694
				}
736
		$noms_homonymie = null;
695
			}
737
		
696
		}
738
		// Analyse des résultats
697
		
Line 739... Line 698...
739
		if (count($noms_erreur) > 0) {
698
		// Analyse des résultats
740
			$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
699
		if (count($noms_erreur) > 0) {
741
			$info['message']['lignes'] = $noms_erreur;
700
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
742
		} else {
701
			$info['message']['lignes'] = $noms_erreur;
743
			$info['resultat'] = true;
702
		} else {
744
		}
703
			$info['resultat'] = true;
745
		$noms_erreur = null;
704
		}
746
		
705
		$noms_erreur = null;
Line 747... Line 706...
747
		$this->traiterResultatTest($info);
706
		
748
	}
707
		$this->traiterResultatTest($info);
Line -... Line 708...
-
 
708
	}
-
 
709
	
-
 
710
	/**
749
	
711
	 * Test #17
750
	private function testerHomonymieSyntaxe() {
712
	 */
751
		$info = array('nom' => 'homonyme -> syntaxe',
-
 
752
			'description' => "Le champ homonyme contient :\n".
-
 
753
				" - une valeur vide,\n".
-
 
754
				" - le chiffre 1.",
-
 
Line 755... Line 713...
755
			'resultat' => false);
713
	private function testerNomCompletEspece() {
756
		
714
		$info = $this->getInfosTest(17);
757
		// Réalisation du test
715
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
758
		$noms_erreur = array();
716
		
-
 
717
		// Réalisation du test
759
		foreach ($this->noms as &$nom) {
718
		$noms_erreur = array();
760
			if ($nom['homonyme'] != '') {
719
		foreach ($this->noms as &$nom) {
761
				if (!$this->verifierBooleen($nom['homonyme'])) {
720
			if ($nom['rang'] == $this->manuel['rang_sp']) {
762
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
721
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
763
				}
722
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
Line 764... Line 723...
764
			}
723
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
765
		}
724
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
766
		
725
				if ($nom['nom_sci'] != $nom_sci_ideal) {
767
		// Analyse des résultats
726
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
768
		if (count($noms_erreur) > 0) {
727
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
769
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
728
				}
770
			$info['message']['lignes'] = $noms_erreur;
729
			}
771
		} else {
730
		}
Line 772... Line 731...
772
			$info['resultat'] = true;
731
		
773
		}
732
		// Analyse des résultats
Line -... Line 733...
-
 
733
		if (count($noms_erreur) > 0) {
-
 
734
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
-
 
735
			$info['message']['lignes'] = $noms_erreur;
774
		$noms_erreur = null;
736
		} else {
775
		
737
			$info['resultat'] = true;
776
		$this->traiterResultatTest($info);
-
 
777
	}
-
 
778
	
-
 
779
	private function testerBiblioOrigineSyntaxe() {
-
 
780
		$info = array('nom' => 'biblio_origine -> syntaxe',
-
 
781
			'description' => "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères ".
-
 
782
			"précis qui sont dans l'ordre de gauche à droite :\n".
-
 
783
			" - éventuellement, le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
-
 
784
			"l'ouvrage dans lequel la publication est parue),\n".
-
 
785
			" - point-virgule « ; » (si l'info précédent a été renseignée),\n".
-
 
786
			" - abréviation, ou nom, de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom. ".
-
 
787
			"Cette information ne doit pas contenir de caractère virgule « , »,\n".
-
 
Line 788... Line 738...
788
			" - virgule « , »,\n".
738
		}
789
			" - informations permettant d'identifier plus précisément le document contenant le nom... ".
739
		$noms_erreur = null;
790
			"(par exemple, l'éditeur, le tome, le numéro d'édition, le volume...) séparées par des virgules ou d'autres ".
740
		
791
			"caractères sauf deux points « : ».\n".
741
		$this->traiterResultatTest($info);
792
			" - deux points « : »,\n".
742
	}
793
			" - numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière ".
743
	
794
			"pages de l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
744
	/**
795
			"la position du nom dans le document. Le tiret « - » doit toujours servir à séparer un ensemble.",
745
	 * Test #18
796
			'resultat' => false);
746
	 */
797
		
747
	private function testerNomCompletInfraSpecifique() {
Line 798... Line 748...
798
		// Réalisation du test
748
		$info = $this->getInfosTest(18);
799
		$noms_erreur = array();
749
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
800
		foreach ($this->noms as &$nom) {
750
		
801
			if ($nom['biblio_origine'] != '') {
751
		// Réalisation du test
802
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
752
		$noms_erreur = array();
803
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
753
		foreach ($this->noms as &$nom) {
804
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
754
			if ($nom['rang'] > $this->manuel['rang_sp']) {
805
				}
755
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
Line 806... Line 756...
806
			}
756
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
807
		}
757
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
Line -... Line 758...
-
 
758
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
-
 
759
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
-
 
760
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
808
		
761
				if ($nom['nom_sci'] != $nom_sci_ideal) {
809
		// Analyse des résultats
762
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
810
		if (count($noms_erreur) > 0) {
-
 
811
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
763
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
812
			$info['message']['lignes'] = $noms_erreur;
764
				}
813
		} else {
-
 
Line 814... Line 765...
814
			$info['resultat'] = true;
765
			}
815
		}
766
		}
816
		$noms_erreur = null;
767
		
817
		
768
		// Analyse des résultats
818
		$this->traiterResultatTest($info);
769
		if (count($noms_erreur) > 0) {
819
	}
-
 
820
	
770
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
821
	private function testerAnneeSyntaxe() {
771
			$info['message']['lignes'] = $noms_erreur;
822
		$info = array('nom' => 'annee -> syntaxe',
772
		} else {
823
			'description' => "Le champ annee doit :\n".
773
			$info['resultat'] = true;
Line 824... Line 774...
824
			" - contenir un nombre de 4 chiffres,\n".
774
		}
825
			" - être supérieur ou égal à 1753.",
775
		$noms_erreur = null;
826
			'resultat' => false);
776
		
827
		
777
		$this->traiterResultatTest($info);
828
		// Réalisation du test
778
	}
829
		$noms_erreur = array();
779
	
830
		foreach ($this->noms as &$nom) {
780
	/**
831
			if ($nom['annee'] != '') {
781
	 * Test #19
Line 832... Line 782...
832
				if (!$this->verifierAnnee($nom['annee'])) {
782
	 */
833
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
783
	private function testerNomSupraGeneriqueEspaces() {
Line -... Line 784...
-
 
784
		$info = $this->getInfosTest(19);
-
 
785
		
-
 
786
		// Réalisation du test
834
				}
787
		$noms_erreur = array();
835
			}
-
 
836
		}
-
 
837
		
-
 
838
		// Analyse des résultats
788
		foreach ($this->noms as &$nom) {
Line 839... Line 789...
839
		if (count($noms_erreur) > 0) {
789
			if ($nom['nom_supra_generique'] != '') {
840
			$info['message']['entete'] = array('num_nom', 'annee erroné');
790
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
841
			$info['message']['lignes'] = $noms_erreur;
791
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
-
 
792
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
842
		} else {
793
				}
-
 
794
			}
843
			$info['resultat'] = true;
795
		}
-
 
796
		
844
		}
797
		// Analyse des résultats
845
		$noms_erreur = null;
798
		if (count($noms_erreur) > 0) {
Line 846... Line 799...
846
		
799
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
847
		$this->traiterResultatTest($info);
800
			$info['message']['lignes'] = $noms_erreur;
848
	}
801
		} else {
849
	
802
			$info['resultat'] = true;
850
	private function testerAuteurSyntaxe() {
803
		}
851
		$info = array('nom' => 'auteur -> syntaxe',
804
		$noms_erreur = null;
852
			'description' => "Le champ auteur doit :\n".
805
		
853
			" - contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié à l'origine la combinaison latine courante.\n".
806
		$this->traiterResultatTest($info);
Line 854... Line 807...
854
    		" - OU débuter par le mot « sensu » et contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ".
807
	}
855
			"ayant publié un nom dont la description ne correspond pas à celle de l'auteur, ou des auteurs, d'origine.\n".
808
	
Line -... Line 809...
-
 
809
	/**
-
 
810
	 * Test #20
-
 
811
	 */
856
			" - se composer de caractères alphabétiques (A-Z, a-z), incluant les signes diacritiques, le symbole point (.), les paires de parenthèses ( () ), les apostrophes, l'esperluette (&) et l'espace ( ).\n".
812
	private function testerNomSupraGeneriqueSyntaxe() {
857
			" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
813
		$info = $this->getInfosTest(20);
858
			" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
-
 
859
			" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
-
 
860
			" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
-
 
861
			" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
-
 
862
			"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
-
 
863
			'resultat' => false);
-
 
864
		
-
 
865
		// Réalisation du test
-
 
866
		$noms_erreur = array();
-
 
867
		foreach ($this->noms as &$nom) {
-
 
868
			if ($nom['auteur'] != '') {
-
 
Line 869... Line 814...
869
				if (!$this->verifierAuteur($nom['auteur'])) {
814
		
870
					$intitule_traite = $this->repererEspace($nom['auteur']);
815
		// Réalisation du test
871
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
816
		$noms_erreur = array();
872
				}
817
		foreach ($this->noms as &$nom) {
-
 
818
			if ($nom['nom_supra_generique'] != '') {
-
 
819
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
873
			}
820
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
874
		}
821
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
875
		
822
				}
-
 
823
			}
876
		// Analyse des résultats
824
		}
877
		if (count($noms_erreur) > 0) {
825
		
878
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
826
		// Analyse des résultats
Line 879... Line 827...
879
			$info['message']['lignes'] = $noms_erreur;
827
		if (count($noms_erreur) > 0) {
880
		} else {
828
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
881
			$info['resultat'] = true;
829
			$info['message']['lignes'] = $noms_erreur;
882
		}
830
		} else {
883
		$noms_erreur = null;
831
			$info['resultat'] = true;
884
		
832
		}
885
		$this->traiterResultatTest($info);
833
		$noms_erreur = null;
886
	}
834
		
Line 887... Line 835...
887
	
835
		$this->traiterResultatTest($info);
888
	private function testerNomCommercialSyntaxe() {
836
	}
Line -... Line 837...
-
 
837
	
-
 
838
	/**
-
 
839
	 * Test #21
889
		$info = array('nom' => 'nom_commercial -> syntaxe',
840
	 */
890
			'description' => "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du ".
841
	private function testerNomSupraGeneriqueRang() {
891
				"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
842
		$info = $this->getInfosTest(21);
892
				"qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces.\n",
843
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
893
			'resultat' => false);
-
 
Line 894... Line 844...
894
		
844
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
895
		// Réalisation du test
845
		
896
		$noms_erreur = array();
846
		// Réalisation du test
897
		foreach ($this->noms as &$nom) {
847
		$noms_erreur = array();
898
			if ($nom['nom_commercial'] != '') {
848
		foreach ($this->noms as &$nom) {
899
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
849
			if ($nom['nom_supra_generique'] != '') {
900
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
850
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
901
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
851
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
902
				}
852
				}
Line 1004... Line 954...
1004
		$noms_erreur = null;
954
		$noms_erreur = null;
Line 1005... Line 955...
1005
		
955
		
1006
		$this->traiterResultatTest($info);
956
		$this->traiterResultatTest($info);
Line -... Line 957...
-
 
957
	}
-
 
958
		
-
 
959
	/**
1007
	}
960
	 * Test #25
1008
	
961
	 */
1009
	private function testerGroupeCultivarSyntaxe() {
-
 
1010
		$info = array('nom' => 'cultivar_groupe -> syntaxe',
-
 
1011
			'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
-
 
1012
				"du code des plantes cultivées, c.-à-d. composer de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
-
 
1013
				"signes diacritiques et marques de ponctuations.\n".
-
 
1014
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
-
 
Line 1015... Line 962...
1015
				"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
962
	private function testerEpitheteInfraGeneriqueSyntaxe() {
1016
			'resultat' => false);
963
		$info = $this->getInfosTest(25);
1017
		
964
		
1018
		// Réalisation du test
965
		// Réalisation du test
1019
		$noms_erreur = array();
966
		$noms_erreur = array();
1020
		foreach ($this->noms as &$nom) {
967
		foreach ($this->noms as &$nom) {
1021
			if ($nom['cultivar_groupe'] != '') {
968
			if ($nom['epithete_infra_generique'] != '') {
1022
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
969
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1023
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
970
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1024
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
971
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
Line 1025... Line 972...
1025
				}
972
				}
1026
			}
973
			}
1027
		}
974
		}
1028
		
975
		
1029
		// Analyse des résultats
976
		// Analyse des résultats
1030
		if (count($noms_erreur) > 0) {
977
		if (count($noms_erreur) > 0) {
1031
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
978
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1032
			$info['message']['lignes'] = $noms_erreur;
979
			$info['message']['lignes'] = $noms_erreur;
Line 1033... Line 980...
1033
		} else {
980
		} else {
1034
			$info['resultat'] = true;
981
			$info['resultat'] = true;
Line -... Line 982...
-
 
982
		}
-
 
983
		$noms_erreur = null;
-
 
984
		
1035
		}
985
		$this->traiterResultatTest($info);
1036
		$noms_erreur = null;
986
	}
1037
		
987
	
1038
		$this->traiterResultatTest($info);
988
	/**
1039
	}
-
 
Line 1040... Line 989...
1040
	
989
	 * Test #26
1041
	private function testerGroupeCultivarRang() {
990
	 */
1042
		$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
991
	private function testerEpitheteInfraGeneriqueRang() {
1043
			'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou ".
992
		$info = $this->getInfosTest(26);
1044
								"égal à {$this->manuel['rang_genre']}.",
993
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
1045
			'resultat' => false);
994
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
1046
		
995
		
1047
		// Réalisation du test
996
		// Réalisation du test
1048
		$noms_erreur = array();
997
		$noms_erreur = array();
Line 1064... Line 1013...
1064
		$noms_erreur = null;
1013
		$noms_erreur = null;
Line 1065... Line 1014...
1065
		
1014
		
1066
		$this->traiterResultatTest($info);
1015
		$this->traiterResultatTest($info);
Line -... Line 1016...
-
 
1016
	}
-
 
1017
	
-
 
1018
	/**
1067
	}
1019
	 * Test #27
1068
	
-
 
1069
	private function testerEpitheteInfraSpEspaces() {
-
 
1070
		$info = array('nom' => 'epithete_infra_sp -> espaces en trop',
-
 
1071
			'description' => "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou après le nom.\n".
1020
	 */
Line 1072... Line 1021...
1072
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
1021
	private function testerEpitheteInfraGeneriqueEspaces() {
1073
			'resultat' => false);
1022
		$info = $this->getInfosTest(27);
1074
		
1023
		
1075
		// Réalisation du test
1024
		// Réalisation du test
1076
		$noms_erreur = array();
1025
		$noms_erreur = array();
1077
		foreach ($this->noms as &$nom) {
1026
		foreach ($this->noms as &$nom) {
1078
			if ($nom['epithete_infra_sp'] != '') {
1027
			if ($nom['epithete_infra_generique'] != '') {
1079
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
1028
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
1080
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1029
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1081
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1030
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
Line 1082... Line 1031...
1082
				}
1031
				}
1083
			}
1032
			}
1084
		}
1033
		}
1085
		
1034
		
1086
		// Analyse des résultats
1035
		// Analyse des résultats
1087
		if (count($noms_erreur) > 0) {
1036
		if (count($noms_erreur) > 0) {
1088
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1037
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1089
			$info['message']['lignes'] = $noms_erreur;
1038
			$info['message']['lignes'] = $noms_erreur;
Line 1090... Line 1039...
1090
		} else {
1039
		} else {
1091
			$info['resultat'] = true;
1040
			$info['resultat'] = true;
Line -... Line 1041...
-
 
1041
		}
-
 
1042
		$noms_erreur = null;
-
 
1043
		
1092
		}
1044
		$this->traiterResultatTest($info);
1093
		$noms_erreur = null;
1045
	}
1094
		
-
 
1095
		$this->traiterResultatTest($info);
-
 
1096
	}
-
 
1097
	
-
 
1098
	private function testerEpitheteInfraSpSyntaxe() {
-
 
1099
		$info = array('nom' => 'epithete_infra_sp -> syntaxe',
-
 
1100
			'description' => "Le champ epithete_infra_sp peut contenir :\n".
-
 
Line 1101... Line 1046...
1101
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
1046
	
1102
				"   Il commence par une lettre minuscule (avec ou sans tréma).\n". 
1047
	/**
1103
				"   Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
1048
	 * Test #28
1104
				" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce \n".
1049
	 */
-
 
1050
	private function testerEpitheteSpEspaces() {
-
 
1051
		$info = $this->getInfosTest(28);
-
 
1052
		
-
 
1053
		// Réalisation du test
-
 
1054
		$noms_erreur = array();
-
 
1055
		foreach ($this->noms as &$nom) {
-
 
1056
			if ($nom['epithete_sp'] != '') {
-
 
1057
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
-
 
1058
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
-
 
1059
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
1060
				}
-
 
1061
			}
-
 
1062
		}
-
 
1063
		
-
 
1064
		// Analyse des résultats
-
 
1065
		if (count($noms_erreur) > 0) {
-
 
1066
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
-
 
1067
			$info['message']['lignes'] = $noms_erreur;
-
 
1068
		} else {
-
 
1069
			$info['resultat'] = true;
-
 
1070
		}
-
 
1071
		$noms_erreur = null;
-
 
1072
		
-
 
1073
		$this->traiterResultatTest($info);
-
 
1074
	}
-
 
1075
	
-
 
1076
	/**
-
 
1077
	 * Test #29
-
 
1078
	 */
1105
				"   (au moins 2) séparés entre eux par la lettre x entourée de caractères espaces.",
1079
	private function testerEpitheteSpSyntaxe() {
1106
			'resultat' => false);
1080
		$info = $this->getInfosTest(29);
1107
		
1081
		
1108
		// Réalisation du test
1082
		// Réalisation du test
1109
		$noms_erreur = array();
1083
		$noms_erreur = array();
1110
		foreach ($this->noms as &$nom) {
1084
		foreach ($this->noms as &$nom) {
1111
			if ($nom['epithete_infra_sp'] != '') {
1085
			if ($nom['epithete_sp'] != '') {
1112
				$mots = explode(' ', $nom['epithete_infra_sp']);
1086
				$mots = explode(' ', $nom['epithete_sp']);
1113
				foreach ($mots as $mot) {
1087
				foreach ($mots as $mot) {
Line 1114... Line 1088...
1114
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1088
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
1115
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1089
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
1116
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1090
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1117
					}
1091
					}
1118
				}
1092
				}
1119
			}
1093
			}
1120
		}
1094
		}
1121
		
1095
		
Line 1122... Line 1096...
1122
		// Analyse des résultats
1096
		// Analyse des résultats
1123
		if (count($noms_erreur) > 0) {
1097
		if (count($noms_erreur) > 0) {
Line -... Line 1098...
-
 
1098
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
-
 
1099
			$info['message']['lignes'] = $noms_erreur;
-
 
1100
		} else {
1124
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1101
			$info['resultat'] = true;
-
 
1102
		}
1125
			$info['message']['lignes'] = $noms_erreur;
1103
		$noms_erreur = null;
1126
		} else {
1104
		
1127
			$info['resultat'] = true;
-
 
Line 1128... Line 1105...
1128
		}
1105
		$this->traiterResultatTest($info);
1129
		$noms_erreur = null;
1106
	}
1130
		
1107
	
1131
		$this->traiterResultatTest($info);
1108
	/**
1132
	}
1109
	 * Test #30
1133
	
1110
	 */
1134
	private function testerEpitheteInfraSpRang() {
1111
	private function testerEpitheteSpRang() {
1135
		$info = array('nom' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
1112
		$info = $this->getInfosTest(30);
1136
			'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$this->manuel['rang_sp']}.",
1113
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_sp']);
Line 1156... Line 1133...
1156
		$noms_erreur = null;
1133
		$noms_erreur = null;
Line 1157... Line 1134...
1157
		
1134
		
1158
		$this->traiterResultatTest($info);
1135
		$this->traiterResultatTest($info);
Line -... Line 1136...
-
 
1136
	}
-
 
1137
	
-
 
1138
	/**
1159
	}
1139
	 * Test #31
1160
	
-
 
1161
	private function testerTypeEpitheteEspaces() {
-
 
1162
		$info = array('nom' => 'type_epithete -> espaces en trop',
1140
	 */
Line 1163... Line 1141...
1163
			'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
1141
	private function testerTypeEpitheteEspaces() {
1164
			'resultat' => false);
1142
		$info = $this->getInfosTest(31);
1165
		
1143
		
1166
		// Réalisation du test
1144
		// Réalisation du test
Line 1183... Line 1161...
1183
		}
1161
		}
Line 1184... Line 1162...
1184
		
1162
		
1185
		$this->traiterResultatTest($info);
1163
		$this->traiterResultatTest($info);
Line -... Line 1164...
-
 
1164
	}
-
 
1165
	
-
 
1166
	/**
1186
	}
1167
	 * Test #32
1187
	
1168
	 */
1188
	private function testerTypeEpitheteSyntaxe() {
-
 
1189
		$info = array('nom' => 'type_epithete -> syntaxe',
-
 
1190
			'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules, sans ".
-
 
Line 1191... Line 1169...
1191
				" accents, et de tirets (-). Il commence par une lettre minuscule sans accent.",
1169
	private function testerTypeEpitheteSyntaxe() {
1192
			'resultat' => false);
1170
		$info = $this->getInfosTest(32);
1193
		
1171
		
1194
		// Réalisation du test
1172
		// Réalisation du test
Line 1210... Line 1188...
1210
		}
1188
		}
Line 1211... Line 1189...
1211
		
1189
		
1212
		$this->traiterResultatTest($info);
1190
		$this->traiterResultatTest($info);
Line -... Line 1191...
-
 
1191
	}
-
 
1192
	
-
 
1193
	/**
1213
	}
1194
	 * Test #33
1214
	
-
 
1215
	private function testerTypeEpitheteHybridite() {
-
 
1216
		$info = array('nom' => 'type_epithete -> hybridité',
-
 
1217
			'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
-
 
1218
				" - «n-» \n".
1195
	 */
Line 1219... Line 1196...
1219
				" - «notho-» \n",
1196
	private function testerTypeEpitheteHybridite() {
1220
			'resultat' => false);
1197
		$info = $this->getInfosTest(33);
1221
		
1198
		
1222
		// Réalisation du test
1199
		// Réalisation du test
Line 1238... Line 1215...
1238
		}
1215
		}
Line 1239... Line 1216...
1239
		
1216
		
1240
		$this->traiterResultatTest($info);
1217
		$this->traiterResultatTest($info);
Line -... Line 1218...
-
 
1218
	}
-
 
1219
	
-
 
1220
	/**
1241
	}
1221
	 * Test #34
1242
	
-
 
1243
	private function testerNombreDeChamps($colonnes) {
-
 
1244
		$info = array('nom' => 'Structure -> nombre de champs',
1222
	 */
Line 1245... Line 1223...
1245
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
1223
	private function testerEpitheteInfraSpEspaces() {
1246
			'resultat' => false);
1224
		$info = $this->getInfosTest(34);
1247
		
1225
		
1248
		$nbre_colonnes = count($colonnes);
1226
		// Réalisation du test
-
 
1227
		$noms_erreur = array();
-
 
1228
		foreach ($this->noms as &$nom) {
-
 
1229
			if ($nom['epithete_infra_sp'] != '') {
1249
		$info['message'] = $nbre_colonnes;
1230
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
1250
		if ($nbre_colonnes >= 35) {
-
 
1251
			$info['resultat'] = true;
-
 
1252
		}
1231
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1253
		$this->traiterResultatTest($info);
-
 
1254
		return ($info['resultat'] ? '1' : '0');
-
 
1255
	}
-
 
1256
	
-
 
1257
	private function testerNomDesChamps($colonnes) {
-
 
1258
		$info = array('nom' => 'Structure -> noms des champs',
-
 
1259
			'description' => 'Les noms des champs de la table contenant le référentiel doivent être conformes à ceux '. 
-
 
1260
								'définis par le manuel technique.',
-
 
1261
			'resultat' => false);
-
 
1262
		
-
 
1263
		$champs_attendus = explode(',', $this->manuel['champs']);
-
 
1264
		$champs_presents = array();
1232
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
Line 1265... Line -...
1265
		foreach ($colonnes as $colonne) {
-
 
1266
			$champs_presents[$colonne['Field']] = $colonne;
1233
				}
1267
		}
1234
			}
1268
		
1235
		}
1269
		$ok = true;
1236
		
1270
		$champs_manquant = array(); 
1237
		// Analyse des résultats
1271
		foreach ($champs_attendus as $champ_attendu) {
-
 
1272
			if (!isset($champs_presents[$champ_attendu])) {
-
 
1273
				$champs_manquant[] = $champ_attendu; 
1238
		if (count($noms_erreur) > 0) {
1274
				$ok = false;
-
 
1275
			}
-
 
1276
		}
1239
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
-
 
1240
			$info['message']['lignes'] = $noms_erreur;
Line 1277... Line 1241...
1277
		$info['resultat'] = $ok;
1241
		} else {
1278
		if (!$ok) {
-
 
1279
			$info['message'] = 'Champs manquants : '.implode(', ', $champs_manquant).'.';
1242
			$info['resultat'] = true;
Line -... Line 1243...
-
 
1243
		}
-
 
1244
		$noms_erreur = null;
-
 
1245
		
1280
		}
1246
		$this->traiterResultatTest($info);
1281
		
-
 
1282
		$this->traiterResultatTest($info);
-
 
1283
		return ($info['resultat'] ? '1' : '0');
-
 
1284
	}
1247
	}
Line 1285... Line 1248...
1285
	
1248
	
1286
	private function testerTypeDesChamps($colonnes) {
1249
	/**
1287
		$info = array('nom' => 'Structure -> types des champs',
1250
	 * Test #35
-
 
1251
	 */
-
 
1252
	private function testerEpitheteInfraSpSyntaxe() {
-
 
1253
		$info = $this->getInfosTest(35);
-
 
1254
		
-
 
1255
		// Réalisation du test
1288
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conformes à ceux '.
1256
		$noms_erreur = array();
1289
								'définis par le manuel technique.',
1257
		foreach ($this->noms as &$nom) {
1290
			'resultat' => false);
-
 
1291
		
-
 
1292
		$champs_attendus = explode(',', $this->manuel['champs_type']);
-
 
1293
		$champs_presents = array();
-
 
1294
		foreach ($colonnes as $colonne) {
-
 
1295
			$champs_presents[$colonne['Field']] = $colonne['Type'];
-
 
1296
		}
-
 
1297
		
-
 
1298
		// Recercherche des erreurs
-
 
1299
		$champs_erreur = array(); 
-
 
1300
		foreach ($champs_attendus as $champ_attendu) {
-
 
1301
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
-
 
1302
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
-
 
1303
			
-
 
1304
			if (isset($champs_presents[$champ_attendu_nom])) {
-
 
1305
				$champs_present_type = $champs_presents[$champ_attendu_nom];
1258
			if ($nom['epithete_infra_sp'] != '') {
1306
				
1259
				$mots = explode(' ', $nom['epithete_infra_sp']);
1307
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
1260
				foreach ($mots as $mot) {
Line 1308... Line 1261...
1308
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
1261
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1309
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) 
1262
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1310
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
1263
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
1264
					}
1311
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
1265
				}
1312
				}
1266
			}
1313
			}
1267
		}
-
 
1268
		
Line 1314... Line 1269...
1314
		}
1269
		// Analyse des résultats
1315
		
-
 
1316
		// Analyse des résultats
1270
		if (count($noms_erreur) > 0) {
Line -... Line 1271...
-
 
1271
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
-
 
1272
			$info['message']['lignes'] = $noms_erreur;
-
 
1273
		} else {
1317
		if (count($champs_erreur) > 0) {
1274
			$info['resultat'] = true;
1318
			$info['message'] = "Champs n'ayant pas un type conforme : ".implode(', ', $champs_erreur).'.';
1275
		}
1319
		} else {
1276
		$noms_erreur = null;
1320
			$info['resultat'] = true;
1277
		
1321
		}
-
 
1322
		
-
 
Line -... Line 1278...
-
 
1278
		$this->traiterResultatTest($info);
1323
		$this->traiterResultatTest($info);
1279
	}
1324
		return ($info['resultat'] ? '1' : '0');
1280
	
-
 
1281
	/**
1325
	}
1282
	 * Test #36
1326
	
1283
	 */
-
 
1284
	private function testerEpitheteInfraSpRang() {
1327
	private function testerTailleDesChamps($colonnes, $analyses) {
1285
		$info = $this->getInfosTest(36);
1328
		$info = array('nom' => 'Structure -> champs tronqués',
1286
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_sp']);
Line 1329... Line 1287...
1329
			'description' => "Evalue le risque que des données de type texte aient pu être tronquées lors de leur insertion.\n".
1287
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
1330
				"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
1288
		
1331
				"sur un problème éventuel.",
1289
		// Réalisation du test
1332
			'resultat' => false);
1290
		$noms_erreur = array();
-
 
1291
		foreach ($this->noms as &$nom) {
-
 
1292
			if ($nom['epithete_infra_sp'] != '') {
1333
		
1293
				if ($nom['rang'] < $this->manuel['rang_sp']) {
-
 
1294
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
-
 
1295
				}
-
 
1296
			}
1334
		$tailles_champs_maxi = array();
1297
		}
Line -... Line 1298...
-
 
1298
		
-
 
1299
		// Analyse des résultats
-
 
1300
		if (count($noms_erreur) > 0) {
-
 
1301
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
-
 
1302
			$info['message']['lignes'] = $noms_erreur;
-
 
1303
		} else {
-
 
1304
			$info['resultat'] = true;
1335
		foreach ($colonnes as $colonne) {
1305
		}
-
 
1306
		$noms_erreur = null;
-
 
1307
		
1336
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
1308
		$this->traiterResultatTest($info);
1337
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
1309
	}
1338
			}
1310
	
1339
		}
1311
private function testerStatutCultureSyntaxe() {
1340
		
1312
		$info = array('nom' => 'statut_culture -> syntaxe',
1341
		$tailles_trouvees = array();
1313
			'description' => "Le champ statut_culture peut contenir :\n".
1342
		foreach ($analyses as $analyse) {
1314
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
1343
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
1315
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
Line 1344... Line 1316...
1344
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
1316
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
1345
			}
1317
								"un code de présence spécifique au référentiel.",
1346
		}
1318
			'resultat' => false);
1347
		
1319
		
1348
		$champs_erreur = array();
1320
		// Réalisation du test
1349
		$champs_attendus = explode(',', $this->manuel['champs']);
1321
		$noms_erreur = array();
1350
		foreach ($champs_attendus as $champ_attendu) {
1322
		foreach ($this->noms as &$nom) {
-
 
1323
			if ($nom['statut_culture'] != '') {
Line 1351... Line 1324...
1351
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
1324
				if (!$this->verifierStatutCulture($nom['statut_culture'])) {
1352
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
1325
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
Line 1353... Line 1326...
1353
					$champs_erreur[] = $champ_attendu;
1326
				}
1354
				}
1327
			}
1355
			}
1328
		}
-
 
1329
		
-
 
1330
		// Analyse des résultats
-
 
1331
		if (count($noms_erreur) > 0) {
-
 
1332
			$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
1356
		}
1333
			$info['message']['lignes'] = $noms_erreur;
Line -... Line 1334...
-
 
1334
		} else {
-
 
1335
			$info['resultat'] = true;
1357
		
1336
		}
1358
		// Analyse des résultats
1337
		$noms_erreur = null;
-
 
1338
		
1359
		if (count($champs_erreur) > 0) {
1339
		$this->traiterResultatTest($info);
-
 
1340
	}
1360
			$info['message'] = "Champs possédant des enregistrements qui atteignent la taille maximum autorisée : ".
1341
	
1361
								implode(', ', $champs_erreur).'.';
1342
	private function testerStatutIntroductionSyntaxe() {
Line -... Line 1343...
-
 
1343
		$info = array('nom' => 'statut_introduction -> syntaxe',
-
 
1344
			'description' => "Le champ statut_introduction peut contenir :\n".
-
 
1345
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
-
 
1346
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
-
 
1347
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
-
 
1348
								"un code de présence spécifique au référentiel.",
-
 
1349
			'resultat' => false);
-
 
1350
		
-
 
1351
		// Réalisation du test
1362
		} else {
1352
		$noms_erreur = array();
1363
			$info['resultat'] = true;
-
 
1364
		}
1353
		foreach ($this->noms as &$nom) {
Line 1365... Line 1354...
1365
		
1354
			if ($nom['statut_introduction'] != '') {
1366
		$this->traiterResultatTest($info);
1355
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
1367
	}
1356
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
-
 
1357
				}
-
 
1358
			}
-
 
1359
		}
-
 
1360
		
1368
	
1361
		// Analyse des résultats
Line 1369... Line 1362...
1369
	private function testerNumNomClePrimaire($colonnes) {
1362
		if (count($noms_erreur) > 0) {
1370
		$info = array('nom' => 'Structure -> num_nom est clé primaire',
1363
			$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
1371
			'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
1364
			$info['message']['lignes'] = $noms_erreur;
1372
			'resultat' => false);
1365
		} else {
-
 
1366
			$info['resultat'] = true;
1373
		
1367
		}
-
 
1368
		$noms_erreur = null;
1374
		foreach ($colonnes as $colonne) {
1369
		
1375
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
1370
		$this->traiterResultatTest($info);
Line 1376... Line 1371...
1376
				$info['resultat'] = true;
1371
	}
1377
			}
1372
	
1378
		}
1373
	private function testerStatutOrigineSyntaxe() {
1379
		
1374
		$info = array('nom' => 'statut_origine -> syntaxe',
1380
		$this->traiterResultatTest($info);
1375
			'description' => "Le champ statut_origine peut contenir :\n".
1381
		return ($info['resultat'] ? '1' : '0');
1376
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
1382
	}
1377
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
-
 
1378
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
Line 1383... Line 1379...
1383
	
1379
								"un code de présence spécifique au référentiel.",
1384
	private function testerNumNomSuperieurAZero() {
1380
			'resultat' => false);
Line 1385... Line 1381...
1385
		$info = array('nom' => 'num_nom -> supérieur à 0',
1381
		
1386
			'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
1382
		// Réalisation du test
1387
			'resultat' => false);
1383
		$noms_erreur = array();
-
 
1384
		foreach ($this->noms as &$nom) {
-
 
1385
			if ($nom['statut_origine'] != '') {
-
 
1386
				if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
-
 
1387
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
1388
		
1388
				}
Line 1389... Line 1389...
1389
		// Réalisation du test
1389
			}
1390
		$noms_erreur = array();
1390
		}
1391
		foreach ($this->noms as &$nom) {
1391
		
-
 
1392
		// Analyse des résultats
1392
			if ($nom['num_nom'] <= 0) {
1393
		if (count($noms_erreur) > 0) {
1393
				$noms_erreur[] = $nom['num_nom'];
1394
			$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
-
 
1395
			$info['message']['lignes'] = $noms_erreur;
1394
			}
1396
		} else {
1395
		}
1397
			$info['resultat'] = true;
Line 1396... Line 1398...
1396
		
1398
		}
1397
		// Analyse des résultats
1399
		$noms_erreur = null;
1398
		if (count($noms_erreur) > 0) {
1400
		
1399
			$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur ".
1401
		$this->traiterResultatTest($info);
1400
								"inférieure ou égale à 0.";
1402
	}
1401
		} else {
1403
	
1402
			$info['resultat'] = true;
1404
	private function testerPresenceSyntaxe() {
-
 
1405
		$info = array('nom' => 'presence -> syntaxe',
Line 1403... Line 1406...
1403
		}
1406
			'description' => "Le champ presence contient soit :\n".
1404
		
1407
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
Line 1405... Line 1408...
1405
		$this->traiterResultatTest($info);
1408
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
1406
	}
1409
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
1407
	
1410
								"un code de présence spécifique au référentiel.",
1408
	private function testerNumNomRetenuSuperieurAZero() {
1411
			'resultat' => false);
1409
		$info = array('nom' => 'num_nom_retenu -> supérieur à 0',
1412
		
Line 1410... Line 1413...
1410
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
1413
		// Réalisation du test
1411
			'resultat' => false);
1414
		$noms_erreur = array();
1412
		
1415
		foreach ($this->noms as &$nom) {
1413
		// Réalisation du test
1416
			if ($nom['presence'] != '') {
-
 
1417
				if (!$this->verifierPresence($nom['presence'])) {
1414
		$noms_erreur = array();
1418
					$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
-
 
1419
				}
1415
		foreach ($this->noms as &$nom) {
1420
			}
1416
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
1421
		}
Line 1417... Line 1422...
1417
				$noms_erreur[] = $nom['num_nom'];
1422
		
1418
			}
1423
		// Analyse des résultats
1419
		}
1424
		if (count($noms_erreur) > 0) {
1420
		
1425
			$info['message']['entete'] = array('num_nom', 'presence erroné');
1421
		// Analyse des résultats
1426
			$info['message']['lignes'] = $noms_erreur;
1422
		if (count($noms_erreur) > 0) {
1427
		} else {
1423
			$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".
1428
			$info['resultat'] = true;
-
 
1429
		}
Line 1424... Line 1430...
1424
								implode(', ', $noms_erreur).'.';
1430
		$noms_erreur = null;
1425
		} else {
1431
		
Line 1426... Line 1432...
1426
			$info['resultat'] = true;
1432
		$this->traiterResultatTest($info);
1427
		}
1433
	}
1428
		
1434
	
1429
		$this->traiterResultatTest($info);
1435
	private function testerHybrideParent02Existence() {
-
 
1436
		$info = array('nom' => 'hybride_parent_02 -> existence',
1430
	}
1437
			'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur ".
Line 1431... Line 1438...
1431
	
1438
								"du champ num_nom.",
1432
	private function testerNumTaxSupEgalZeroUnique() {
1439
			'resultat' => false);
1433
		$info = array('nom' => 'num_tax_sup -> égal à 0 unique',
1440
		
1434
			'description' => "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond ".
1441
		// Réalisation du test
1435
								"au premier taxon de la classification.",
1442
		$noms_erreur = array();
-
 
1443
		foreach ($this->noms as &$nom) {
-
 
1444
			if ($nom['hybride_parent_02'] != '') {
1436
			'resultat' => false);
1445
				if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
1437
		
1446
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
Line 1438... Line 1447...
1438
		// Réalisation du test
1447
				}
1439
		$noms_erreur = array();
1448
			}
1440
		foreach ($this->noms as &$nom) {
1449
		}
1441
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
1450
		
1442
				$noms_erreur[] = $nom['num_nom'];
1451
		// Analyse des résultats
1443
			}
1452
		if (count($noms_erreur) > 0) {
1444
		}
1453
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
-
 
1454
			$info['message']['lignes'] = $noms_erreur;
Line 1445... Line 1455...
1445
		
1455
		} else {
1446
		// Analyse des résultats
1456
			$info['resultat'] = true;
Line -... Line 1457...
-
 
1457
		}
1447
		if (count($noms_erreur) > 1) {
1458
		$noms_erreur = null;
1448
			$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".
1459
		
1449
								implode(', ', $noms_erreur).'.';
1460
		$this->traiterResultatTest($info);
1450
		} else {
1461
	}
1451
			$info['resultat'] = true;
1462
	
Line 1452... Line 1463...
1452
		}
1463
	private function testerHybrideParent02Syntaxe() {
1453
		
1464
		$info = array('nom' => 'hybride_parent_02 -> syntaxe',
1454
		$this->traiterResultatTest($info);
1465
			'description' => "Le champ hybride_parent_02 contient soit :\n".
1455
	}
1466
								" - une valeur vide,\n".
1456
	
1467
								" - un nombre.",
1457
	private function testerTaxSupPourTaxon() {
1468
			'resultat' => false);
1458
		$info = array('nom' => 'Classification -> uniquement pour les taxons',
1469
		
1459
			'description' => "Seuls les enregistrements représentant un taxon doivent posséder une valeur dans le champ ".
1470
		// Réalisation du test
1460
				"num_tax_sup.\n Si num_nom_retenu est différent de num_nom (= nom synonyme) alors num_tax_sup doit être vide.",
1471
		$noms_erreur = array();
Line 1461... Line 1472...
1461
			'resultat' => false);
1472
		foreach ($this->noms as &$nom) {
1462
		
1473
			if ($nom['hybride_parent_02'] != '') {
1463
		// Réalisation du test
1474
				if (!$this->verifierNombre($nom['hybride_parent_02'])) {
1464
		$noms_erreur = array();
1475
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
1465
		foreach ($this->noms as &$nom) {
1476
				}
1466
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
1477
			}
1467
				$noms_erreur[] = $nom['num_nom']; 
1478
		}
-
 
1479
		
Line 1468... Line 1480...
1468
			}
1480
		// Analyse des résultats
1469
		}
1481
		if (count($noms_erreur) > 0) {
Line 1470... Line 1482...
1470
		
1482
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
1471
		// Analyse des résultats
1483
			$info['message']['lignes'] = $noms_erreur;
1472
		if (count($noms_erreur) > 0) {
1484
		} else {
1473
			$info['message'] = count($noms_erreur)." enregistrements ne sont pas des taxons et possèdent une ".
1485
			$info['resultat'] = true;
-
 
1486
		}
1474
								"valeur dans num_tax_sup : ".implode(', ', $noms_erreur).'.';
1487
		$noms_erreur = null;
Line 1475... Line 1488...
1475
		} else {
1488
		
1476
			$info['resultat'] = true;
1489
		$this->traiterResultatTest($info);
1477
		}
1490
	}
1478
		
1491
	
1479
		$this->traiterResultatTest($info);
1492
	
1480
	}
1493
	private function testerHybrideParent01Existence() {
1481
	
-
 
1482
	private function testerExitenceTaxonSuperieur() {
-
 
1483
		$info = array('nom' => 'Classification -> existence du taxon supérieur',
-
 
1484
			'description' => "Chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf ".
-
 
1485
								"la racine de la classification.",
-
 
1486
			'resultat' => false);
-
 
1487
		
1494
		$info = array('nom' => 'hybride_parent_01 -> existence',
1488
		// Réalisation du test
1495
			'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur ".
1489
		$noms_erreur = array();
1496
								"du champ num_nom.",
Line 1490... Line 1497...
1490
		foreach ($this->noms as &$nom) {
1497
			'resultat' => false);
1491
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
1498
		
1492
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
1499
		// Réalisation du test
-
 
1500
		$noms_erreur = array();
1493
					$noms_erreur[] = $nom['num_nom'];
1501
		foreach ($this->noms as &$nom) {
1494
				} 
1502
			if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
1495
			}
1503
				if (!isset($this->noms[$nom['hybride_parent_01']])) {
-
 
1504
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
Line 1496... Line 1505...
1496
		}
1505
				}
1497
		
1506
			}
Line 1498... Line 1507...
1498
		// Analyse des résultats
1507
		}
1499
		if (count($noms_erreur) > 0) {
1508
		
1500
			$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".
1509
		// Analyse des résultats
1501
								implode(', ', $noms_erreur).'.';
1510
		if (count($noms_erreur) > 0) {
1502
		} else {
1511
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
Line 1503... Line 1512...
1503
			$info['resultat'] = true;
1512
			$info['message']['lignes'] = $noms_erreur;
1504
		}
1513
		} else {
1505
		
-
 
1506
		$this->traiterResultatTest($info);
1514
			$info['resultat'] = true;
1507
	}
1515
		}
1508
	
1516
		$noms_erreur = null;
1509
	private function testerClassificationRang() {
-
 
1510
		$info = array('nom' => 'Classification -> taxon supérieur avec rang inférieur',
-
 
1511
			'description' => "Pour chaque enregistrement représentant un taxon, le taxon supérieur doit avoir ".
-
 
1512
								"un rang inférieur au taxon courant (à l'exception des noms ayant le rang de Clade).",
-
 
1513
			'resultat' => false);
-
 
1514
		
-
 
1515
		// Réalisation du test
-
 
1516
		$noms_erreur = array();
1517
		
1517
		foreach ($this->noms as &$nom) {
-
 
1518
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
-
 
1519
				if (isset($this->noms[$nom['num_tax_sup']])) {
-
 
1520
					$nom_sup = $this->noms[$nom['num_tax_sup']];
1518
		$this->traiterResultatTest($info);
1521
					if ($nom_sup['rang'] >= $nom['rang']) {
1519
	}
1522
						// Prise en compte de l'exception des clades
1520
	
1523
						if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
-
 
Line 1524... Line 1521...
1524
							$noms_erreur[] = $nom['num_nom'];
1521
	private function testerHybrideParent01Syntaxe() {
1525
						}
1522
		$info = array('nom' => 'hybride_parent_01 -> syntaxe',
1526
					}
1523
			'description' => "Le champ hybride_parent_01 contient soit :\n".
1527
				}
1524
								" - une valeur vide,\n".
1528
			}
1525
								" - un nombre.",
1529
		}
1526
			'resultat' => false);
1530
		
1527
		
-
 
1528
		// Réalisation du test
Line 1531... Line 1529...
1531
		// Analyse des résultats
1529
		$noms_erreur = array();
1532
		if (count($noms_erreur) > 0) {
1530
		foreach ($this->noms as &$nom) {
Line 1533... Line 1531...
1533
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
1531
			if ($nom['hybride_parent_01'] != '') {
1534
		} else {
1532
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
1535
			$info['resultat'] = true;
-
 
1536
		}
1533
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
1537
		
1534
				}
1538
		$this->traiterResultatTest($info);
1535
			}
1539
	}
-
 
1540
	
-
 
1541
	private function testerClassification() {
1536
		}
1542
		$info = array('nom' => 'Classification -> racine liée à chaque noeud',
-
 
-
 
1537
		
1543
			'description' => "Pour chaque enregistrement, la classification doit pouvoir être remontée ".
1538
		// Analyse des résultats
1544
								"jusqu'à un nom unique possédant une valeur num_tax_sup de 0.",
-
 
1545
			'resultat' => false);
1539
		if (count($noms_erreur) > 0) {
1546
		
1540
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
1547
		// Réalisation du test
1541
			$info['message']['lignes'] = $noms_erreur;
1548
		$noms_erreur = array();
1542
		} else {
1549
		$this->noms_ok = array();
1543
			$info['resultat'] = true;
1550
		foreach ($this->noms as &$nom) {
1544
		}
1551
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
-
 
1552
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1545
		$noms_erreur = null;
-
 
1546
		
-
 
1547
		$this->traiterResultatTest($info);
-
 
1548
	}
-
 
1549
	
-
 
1550
	private function testerSynonymeOrthographiqueExistence() {
-
 
1551
		$info = array('nom' => 'synonyme_orthographique -> existence',
1553
					$this->noms_ok[$nom['num_nom']] = true;
1552
			'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
1554
				} else {
1553
								"à une valeur du champ num_nom.",
1555
					$this->detection_boucle_infini = array();
1554
			'resultat' => false);
-
 
1555
		
-
 
1556
		// Réalisation du test
-
 
1557
		$noms_erreur = array();
1556
					$classif_ok = $this->remonterClassif($nom);
1558
		foreach ($this->noms as &$nom) {
Line 1557... Line 1559...
1557
					unset($this->detection_boucle_infini); 
1559
			if ($nom['synonyme_orthographique'] != '') {
1558
					
1560
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
1559
					if ($classif_ok === false) {
1561
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
-
 
1562
				}
-
 
1563
			}
1560
						$noms_erreur[] = $nom['num_nom'];
1564
		}
Line 1561... Line -...
1561
					} else {
-
 
1562
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
-
 
1563
					}
1565
		
1564
				}
1566
		// Analyse des résultats
1565
			}
1567
		if (count($noms_erreur) > 0) {
1566
		}
1568
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
-
 
1569
			$info['message']['lignes'] = $noms_erreur;
1567
		unset($this->noms_ok);
1570
		} else {
-
 
1571
			$info['resultat'] = true;
1568
		
1572
		}
1569
		// Analyse des résultats
1573
		$noms_erreur = null;
Line 1570... Line 1574...
1570
		if (count($noms_erreur) > 0) {
1574
		
1571
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".
1575
		$this->traiterResultatTest($info);
1572
								implode(', ', $noms_erreur).'.';
1576
	}
-
 
1577
	
1573
		} else {
1578
	private function testerSynonymeOrthographiqueSyntaxe() {
1574
			$info['resultat'] = true;
1579
		$info = array('nom' => 'synonyme_orthographique -> syntaxe',
1575
		}
1580
			'description' => "Le champ synonyme_orthographique contient soit :\n".
-
 
1581
								" - une valeur vide,\n".
Line 1576... Line 1582...
1576
		
1582
								" - un nombre.",
1577
		$this->traiterResultatTest($info);
1583
			'resultat' => false);
Line -... Line 1584...
-
 
1584
		
1578
	}
1585
		// Réalisation du test
1579
	
1586
		$noms_erreur = array();
1580
	private function remonterClassif(&$nom) {
1587
		foreach ($this->noms as $nom) {
1581
		$this->detection_boucle_infini[$nom['num_nom']] = true;
1588
			if ($nom['synonyme_orthographique'] != '') {
1582
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
1589
				if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
1583
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
1590
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
Line 1584... Line 1591...
1584
				$this->noms_ok[$nom['num_nom']] = true;
1591
				}
1585
				return true;
1592
			}
1586
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
1593
		}
1587
				$this->noms_ok[$nom['num_nom']] = true;
-
 
1588
				return true;
-
 
1589
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
-
 
1590
				return false;
-
 
1591
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
1594
		
1592
				return false;
1595
		// Analyse des résultats
1593
			} else {
1596
		if (count($noms_erreur) > 0) {
1594
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
1597
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
1595
				if ($retour === true) {
1598
			$info['message']['lignes'] = $noms_erreur;
1596
					$this->noms_ok[$nom['num_tax_sup']] = true;
1599
		} else {
Line 1597... Line 1600...
1597
				}
1600
			$info['resultat'] = true;
1598
				return $retour;
1601
		}
1599
			}
1602
		$noms_erreur = null;
1600
		} else {
1603
		
1601
			return false;
1604
		$this->traiterResultatTest($info);
1602
		}
1605
	}
1603
	}
1606
	
-
 
1607
	private function testerSynonymeMalAppliqueSyntaxe() {
Line 1604... Line 1608...
1604
	
1608
		$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
1605
	private function testerRang() {
1609
			'description' => "Le champ synonyme_mal_applique contient soit :\n".
Line 1606... Line 1610...
1606
		$info = array('nom' => 'rang',
1610
			" - une valeur vide,\n".
1607
			'description' => "Le rang doit correspondre à une valeur numérique définie dans le manuel.",
1611
			" - le chiffre 1.",
1608
			'resultat' => false);
1612
			'resultat' => false);
1609
		
-
 
1610
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
1613
		
Line 1611... Line 1614...
1611
		
1614
		// Réalisation du test
1612
		// Réalisation du test
1615
		$noms_erreur = array();
1613
		$noms_erreur = array();
1616
		foreach ($this->noms as &$nom) {
1614
		foreach ($this->noms as &$nom) {
1617
			if ($nom['synonyme_mal_applique'] != '') {
1615
			if (!isset($rangs[$nom['rang']])) {
-
 
1616
				$noms_erreur[] = $nom['num_nom'];
-
 
1617
			}
-
 
1618
		}
-
 
1619
		
-
 
1620
		// Analyse des résultats
1618
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
1621
		if (count($noms_erreur) > 0) {
-
 
1622
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
1619
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
1623
		} else {
1620
				}
Line 1624... Line 1621...
1624
			$info['resultat'] = true;
1621
			}
1625
		}
1622
		}
1626
		
1623
		
1627
		$this->traiterResultatTest($info);
1624
		// Analyse des résultats
1628
	}
1625
		if (count($noms_erreur) > 0) {
1629
	
1626
			$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
1630
	private function testerNomCompletSupraGenerique() {
1627
			$info['message']['lignes'] = $noms_erreur;
1631
		$info = array('nom' => 'nom_sci -> noms supra-génériques',
-
 
-
 
1628
		} else {
1632
			'description' => "Si le rang est < à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur ".
1629
			$info['resultat'] = true;
1633
								"du champ nom_supra_generique. Les valeurs des champs cultivar_groupe, cultivar et ".
1630
		}
Line -... Line 1631...
-
 
1631
		$noms_erreur = null;
1634
								"nom_commercial peuvent s'y ajouter.",
1632
		
1635
			'resultat' => false);
1633
		$this->traiterResultatTest($info);
1636
		
1634
	}
1637
		// Réalisation du test
1635
	
1638
		$noms_erreur = array();
-
 
1639
		foreach ($this->noms as &$nom) {
-
 
1640
			if ($nom['rang'] < $this->manuel['rang_genre']) {
-
 
1641
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1636
	
Line 1642... Line 1637...
1642
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
1637
	private function testerSynonymeDouteuxSyntaxe() {
1643
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1638
		$info = array('nom' => 'synonyme_douteux -> syntaxe',
1644
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1639
			'description' => "Le champ synonyme_douteux contient soit :\n".
1645
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1640
			" - une valeur vide,\n".
1646
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1641
			" - le chiffre 1.",
1647
				}
1642
			'resultat' => false);
1648
			}
1643
		
1649
		}
-
 
1650
		
-
 
1651
		// Analyse des résultats
1644
		// Réalisation du test
1652
		if (count($noms_erreur) > 0) {
-
 
1653
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
-
 
1654
			$info['message']['lignes'] = $noms_erreur;
1645
		$noms_erreur = array();
1655
		} else {
-
 
1656
			$info['resultat'] = true;
1646
		foreach ($this->noms as &$nom) {
1657
		}
-
 
-
 
1647
			if ($nom['synonyme_douteux'] != '') {
1658
		
1648
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
1659
		$this->traiterResultatTest($info);
-
 
1660
	}
1649
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
1661
	
1650
				}
1662
	private function testerNomCompletGenre() {
1651
			}
1663
		$info = array('nom' => 'nom_sci -> noms de genres',
1652
		}
Line 1664... Line 1653...
1664
			'description' => "Si le rang est = à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur du champ genre. ".
1653
		
1665
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1654
		// Analyse des résultats
1666
			'resultat' => false);
1655
		if (count($noms_erreur) > 0) {
1667
		
1656
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
1668
		// Réalisation du test
1657
			$info['message']['lignes'] = $noms_erreur;
1669
		$noms_erreur = array();
1658
		} else {
1670
		foreach ($this->noms as &$nom) {
1659
			$info['resultat'] = true;
1671
			if ($nom['rang'] == $this->manuel['rang_genre']) {
1660
		}
Line 1672... Line 1661...
1672
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1661
		$noms_erreur = null;
1673
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1662
		
Line 1674... Line 1663...
1674
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1663
		$this->traiterResultatTest($info);
1675
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1664
	}
1676
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1665
	
1677
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1666
	private function testerSynonymeDouteuxNumNomRetenu() {
-
 
1667
		$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
1678
				}
1668
			'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
1679
			}
1669
			'resultat' => false);
Line 1680... Line 1670...
1680
		}
1670
		
1681
		
1671
		// Réalisation du test
1682
		// Analyse des résultats
1672
		$noms_erreur = array();
1683
		if (count($noms_erreur) > 0) {
1673
		foreach ($this->noms as &$nom) {
1684
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
-
 
1685
			$info['message']['lignes'] = $noms_erreur;
1674
			if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
1686
		} else {
-
 
1687
			$info['resultat'] = true;
-
 
1688
		}
-
 
1689
		
-
 
1690
		$this->traiterResultatTest($info);
1675
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
1691
	}
1676
			}
1692
	
1677
		}
1693
	private function testerNomCompletInfraGenre() {
1678
		
Line 1694... Line 1679...
1694
		$info = array('nom' => 'nom_sci -> noms infra-génériques',
1679
		// Analyse des résultats
1695
			'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']},".
1680
		if (count($noms_erreur) > 0) {
1696
			" le nom_sci doit correspondre à une des formules suivantes : \n".
1681
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
1697
			" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
1682
			$info['message']['lignes'] = $noms_erreur;
1698
			" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
1683
		} else {
1699
			"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1684
			$info['resultat'] = true;
1700
			'resultat' => false);
1685
		}
1701
		
1686
		$noms_erreur = null;
Line 1702... Line 1687...
1702
		// Réalisation du test
1687
		$this->traiterResultatTest($info);
1703
		$noms_erreur = array();
1688
	}
Line 1704... Line 1689...
1704
		foreach ($this->noms as &$nom) {
1689
	
1705
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
1690
	
1706
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1691
	private function testerSynonymeProparteExistence() {
1707
				$nom_sci_ideal = '';
-
 
1708
				if ($nom['type_epithete'] == 'agg.') {
1692
		$info = array('nom' => 'synonyme_proparte -> existence',
1709
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1693
			'description' => "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux ".
Line 1710... Line 1694...
1710
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1694
								"doit correspondre à une valeur du champ num_nom.",
1711
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
1695
			'resultat' => false);
1712
				} else {
1696
		
1713
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1697
		// Réalisation du test
1714
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
-
 
1715
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
-
 
1716
				}
-
 
1717
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
-
 
1718
				if ($nom['nom_sci'] != $nom_sci_ideal) {
-
 
1719
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
-
 
1720
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1698
		$noms_erreur = array();
1721
				}
-
 
1722
			}
1699
		foreach ($this->noms as &$nom) {
1723
		}
1700
			if ($nom['synonyme_proparte'] != '') {
1724
		
1701
				$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
1725
		// Analyse des résultats
1702
				$num_nom_en_erreur = array();
Line 1726... Line 1703...
1726
		if (count($noms_erreur) > 0) {
1703
				foreach ($num_nom_a_verifier as $num_nom) {
1727
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1704
					if (!isset($this->noms[$num_nom])) {
1728
			$info['message']['lignes'] = $noms_erreur;
1705
						$num_nom_en_erreur[] = $num_nom;
1729
		} else {
1706
					}
1730
			$info['resultat'] = true;
1707
				}
1731
		}
1708
				if (count($nbre_en_erreur) > 0) {
1732
		$noms_erreur = null;
1709
					$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
1733
		
1710
				}
Line 1734... Line 1711...
1734
		$this->traiterResultatTest($info);
1711
			}
1735
	}
1712
		}
Line 1736... Line 1713...
1736
	
1713
		
1737
	private function testerNomCompletEspece() {
1714
		// Analyse des résultats
1738
		$info = array('nom' => "nom_sci -> noms d'espèce",
1715
		if (count($noms_erreur) > 0) {
-
 
1716
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
-
 
1717
			$info['message']['lignes'] = $noms_erreur;
1739
			'description' => "Si le rang est = à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
1718
		} else {
Line 1740... Line 1719...
1740
				" genre + ' ' + epithete_sp \n".
1719
			$info['resultat'] = true;
1741
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1720
		}
1742
			'resultat' => false);
1721
		$noms_erreur = null;
1743
		
1722
		
1744
		// Réalisation du test
-
 
1745
		$noms_erreur = array();
1723
		$this->traiterResultatTest($info);
1746
		foreach ($this->noms as &$nom) {
1724
	}
1747
			if ($nom['rang'] == $this->manuel['rang_sp']) {
1725
	
1748
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1726
	private function testerSynonymeProparteSyntaxe() {
1749
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1727
		$info = array('nom' => 'synonyme_proparte -> syntaxe',
Line 1750... Line 1728...
1750
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1728
			'description' => "Le champ synonyme_proparte contient soit :\n".
1751
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1729
			" - une valeur vide,\n".
1752
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1730
			" - un nombre,\n".
1753
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1731
			" - une suite de nombres séparés par des virgules.",
1754
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1732
			'resultat' => false);
1755
				}
1733
		
1756
			}
1734
		// Réalisation du test
1757
		}
1735
		$noms_erreur = array();
Line 1758... Line 1736...
1758
		
1736
		foreach ($this->noms as &$nom) {
1759
		// Analyse des résultats
1737
			if ($nom['synonyme_proparte'] != '') {
Line -... Line 1738...
-
 
1738
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
-
 
1739
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
-
 
1740
				}
1760
		if (count($noms_erreur) > 0) {
1741
			}
1761
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1742
		}
1762
			$info['message']['lignes'] = $noms_erreur;
1743
		
-
 
1744
		// Analyse des résultats
1763
		} else {
1745
		if (count($noms_erreur) > 0) {
-
 
1746
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
1764
			$info['resultat'] = true;
1747
			$info['message']['lignes'] = $noms_erreur;
1765
		}
1748
		} else {
Line 1766... Line 1749...
1766
		$noms_erreur = null;
1749
			$info['resultat'] = true;
1767
		
1750
		}
1768
		$this->traiterResultatTest($info);
1751
		$noms_erreur = null;
1769
	}
1752
		
1770
	
1753
		$this->traiterResultatTest($info);
1771
	private function testerNomCompletInfraSpecifique() {
1754
	}
1772
		$info = array('nom' => 'nom_sci -> noms infra-spécifiques',
1755
	
1773
			'description' => "Si le rang est > à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
1756
	private function testerBasionymeExistence() {
1774
				" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".	
1757
		$info = array('nom' => 'basionyme -> existence',
1775
				"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
1758
			'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
Line 1776... Line 1759...
1776
			'resultat' => false);
1759
								"num_nom.",
1777
		
1760
			'resultat' => false);
1778
		// Réalisation du test
1761
		
1779
		$noms_erreur = array();
1762
		// Réalisation du test
1780
		foreach ($this->noms as &$nom) {
1763
		$noms_erreur = array();
1781
			if ($nom['rang'] > $this->manuel['rang_sp']) {
1764
		foreach ($this->noms as &$nom) {
1782
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1765
			if ($nom['basionyme'] != '') {
1783
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1766
				if (!isset($this->noms[$nom['basionyme']])) {
Line 1784... Line 1767...
1784
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1767
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
1785
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
1768
				}
Line -... Line 1769...
-
 
1769
			}
-
 
1770
		}
-
 
1771
		
1786
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
1772
		// Analyse des résultats
1787
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1773
		if (count($noms_erreur) > 0) {
1788
				if ($nom['nom_sci'] != $nom_sci_ideal) {
1774
			$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
-
 
1775
			$info['message']['lignes'] = $noms_erreur;
1789
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1776
		} else {
Line 1790... Line 1777...
1790
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1777
			$info['resultat'] = true;
1791
				}
1778
		}
1792
			}
1779
		$noms_erreur = null;
1793
		}
1780
		
1794
		
1781
		$this->traiterResultatTest($info);
1795
		// Analyse des résultats
1782
	}
1796
		if (count($noms_erreur) > 0) {
1783
	
1797
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1784
	private function testerBasionymeSyntaxe() {
1798
			$info['message']['lignes'] = $noms_erreur;
1785
		$info = array('nom' => 'basionyme -> syntaxe',
Line 1887... Line 1874...
1887
		$noms_erreur = null;
1874
		$noms_erreur = null;
Line 1888... Line 1875...
1888
		
1875
		
1889
		$this->traiterResultatTest($info);
1876
		$this->traiterResultatTest($info);
Line -... Line 1877...
-
 
1877
	}
-
 
1878
	
-
 
1879
	/**
1890
	}
1880
	 * Test #39
1891
	
1881
	 */
1892
	private function testerGenreEspaces() {
1882
	private function testerCultivarSyntaxe() {
-
 
1883
		$info = array('nom' => 'cultivar -> syntaxe',
1893
		$info = array('nom' => 'genre -> espaces en trop',
1884
			'description' => "Le champ cultivar_groupe doit contenir :\n".
-
 
1885
				" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature \n".
-
 
1886
				"   des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques \n".
-
 
1887
				"   (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.\n".
-
 
1888
				" - un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet \n".
-
 
1889
				"   cyrillique, arabe, chinois...\n".
-
 
1890
				" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour \n".
-
 
1891
				"   les autres mots importants mais pas pour les mots mineurs.\n".
1894
			'description' => "Le champ genre ne doit pas contenir d'espace avant ou après le nom.\n".
1892
				"Ne doit pas contenir :\n".
Line 1895... Line 1893...
1895
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
1893
				" - cv., convar. ou de guillemets simples (').\n",
1896
			'resultat' => false);
1894
			'resultat' => false);
1897
		
1895
		
1898
		// Réalisation du test
1896
		// Réalisation du test
1899
		$noms_erreur = array();
1897
		$noms_erreur = array();
1900
		foreach ($this->noms as &$nom) {
1898
		foreach ($this->noms as &$nom) {
1901
			if ($nom['genre'] != '') {
1899
			if ($nom['cultivar'] != '') {
1902
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
1900
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
1903
					$nom_traite = $this->repererEspace($nom['genre']);
1901
					$epithete_traite = $this->repererEspace($nom['cultivar']);
1904
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1902
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
Line 1905... Line 1903...
1905
				}
1903
				}
1906
			}
1904
			}
1907
		}
1905
		}
1908
		
1906
		
1909
		// Analyse des résultats
1907
		// Analyse des résultats
1910
		if (count($noms_erreur) > 0) {
1908
		if (count($noms_erreur) > 0) {
1911
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1909
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
1912
			$info['message']['lignes'] = $noms_erreur;
1910
			$info['message']['lignes'] = $noms_erreur;
Line 1913... Line 1911...
1913
		} else {
1911
		} else {
1914
			$info['resultat'] = true;
1912
			$info['resultat'] = true;
Line -... Line 1913...
-
 
1913
		}
-
 
1914
		$noms_erreur = null;
-
 
1915
		
1915
		}
1916
		$this->traiterResultatTest($info);
1916
		$noms_erreur = null;
1917
	}
1917
		
-
 
1918
		$this->traiterResultatTest($info);
-
 
1919
	}
1918
	
1920
	
1919
	/**
1921
	private function testerGenreSyntaxe() {
-
 
1922
		$info = array('nom' => 'genre -> syntaxe',
-
 
1923
			'description' => "Le champ genre peut contenir :\n".
1920
	 * Test #40
Line 1924... Line 1921...
1924
			 	" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
1921
	 */
1925
				"   Il commence par une lettre majuscule (avec ou sans tréma) et peut être précédé par \n".
1922
	private function testerCultivarRang() {
1926
				"   le signe + ou la lettre x suivi d'un espace.\n".
1923
		$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
1927
				" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés\n".
1924
			'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à ". 
1928
				"   entre eux par la lettre x entourée de caractères espaces.",
-
 
1929
			'resultat' => false);
-
 
1930
		
-
 
1931
		// Réalisation du test
1925
								"{$this->manuel['rang_genre']}.",
1932
		$noms_erreur = array();
1926
			'resultat' => false);
1933
		foreach ($this->noms as &$nom) {
-
 
1934
			if ($nom['genre'] != '') {
1927
		
1935
				$mots = explode(' ', $nom['genre']);
1928
		// Réalisation du test
1936
				foreach ($mots as $mot) {
1929
		$noms_erreur = array();
Line 1937... Line 1930...
1937
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
1930
		foreach ($this->noms as &$nom) {
1938
						$nom_traite = $this->repererEspace($nom['genre']);
1931
			if ($nom['cultivar'] != '') {
1939
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
1932
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1940
					}
1933
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1941
				}
1934
				}
1942
			}
1935
			}
1943
		}
1936
		}
1944
		
1937
		
Line 1945... Line 1938...
1945
		// Analyse des résultats
1938
		// Analyse des résultats
1946
		if (count($noms_erreur) > 0) {
1939
		if (count($noms_erreur) > 0) {
Line -... Line 1940...
-
 
1940
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
-
 
1941
			$info['message']['lignes'] = $noms_erreur;
-
 
1942
		} else {
1947
			$info['message']['entete'] = array('num_nom', 'genre erroné');
1943
			$info['resultat'] = true;
1948
			$info['message']['lignes'] = $noms_erreur;
1944
		}
1949
		} else {
1945
		$noms_erreur = null;
-
 
1946
		
-
 
1947
		$this->traiterResultatTest($info);
1950
			$info['resultat'] = true;
1948
	}
Line 1951... Line 1949...
1951
		}
1949
	
1952
		$noms_erreur = null;
1950
	/**
1953
		
1951
	 * Test #41
1954
		$this->traiterResultatTest($info);
1952
	 */
1955
	}
1953
	private function testerNomCommercialSyntaxe() {
-
 
1954
		$info = array('nom' => 'nom_commercial -> syntaxe',
1956
	
1955
			'description' => "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du ".
1957
	private function testerGenreRang() {
1956
				"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
1958
		$info = array('nom' => "genre -> rang >= {$this->manuel['rang_genre']}",
1957
				"qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces.\n",
1959
			'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
1958
			'resultat' => false);
Line 1960... Line 1959...
1960
			'resultat' => false);
1959
		
1961
		
1960
		// Réalisation du test
1962
		// Réalisation du test
1961
		$noms_erreur = array();
1963
		$noms_erreur = array();
1962
		foreach ($this->noms as &$nom) {
1964
		foreach ($this->noms as &$nom) {
1963
			if ($nom['nom_commercial'] != '') {
1965
			if ($nom['genre'] != '') {
1964
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
1966
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1965
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
1967
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1966
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
Line 1968... Line 1967...
1968
				}
1967
				}
1969
			}
1968
			}
Line -... Line 1969...
-
 
1969
		}
-
 
1970
		
-
 
1971
		// Analyse des résultats
1970
		}
1972
		if (count($noms_erreur) > 0) {
1971
		
1973
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
1972
		// Analyse des résultats
1974
			$info['message']['lignes'] = $noms_erreur;
1973
		if (count($noms_erreur) > 0) {
1975
		} else {
1974
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1976
			$info['resultat'] = true;
Line 1975... Line 1977...
1975
			$info['message']['lignes'] = $noms_erreur;
1977
		}
1976
		} else {
1978
		$noms_erreur = null;
1977
			$info['resultat'] = true;
1979
		
1978
		}
-
 
1979
		$noms_erreur = null;
1980
		$this->traiterResultatTest($info);
1980
		
-
 
1981
		$this->traiterResultatTest($info);
1981
	}
1982
	}
-
 
1983
		
1982
	
1984
	private function testerEpitheteInfraGeneriqueSyntaxe() {
1983
	/**
Line 1985... Line 1984...
1985
		$info = array('nom' => 'epithete_infra_generique -> syntaxe',
1984
	 * Test #42
1986
			'description' => "Le champ epithete_infra_generique est composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
1985
	 */
1987
				"La première lettre (avec ou sans tréma) doit être en majuscule.",
1986
	private function testerNomCommercialPresenceCultivar() {
1988
			'resultat' => false);
1987
		$info = array('nom' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
1989
		
1988
			'description' => "Si le champ nom_commercial contient un nom commercial alors le champ cultivar OU ".
1990
		// Réalisation du test
1989
				"cultivar_groupe ne doit pas être vide.",
1991
		$noms_erreur = array();
1990
			'resultat' => false);
1992
		foreach ($this->noms as &$nom) {
1991
		
Line 1993... Line 1992...
1993
			if ($nom['epithete_infra_generique'] != '') {
1992
		// Réalisation du test
1994
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1993
		$noms_erreur = array();
Line -... Line 1994...
-
 
1994
		foreach ($this->noms as &$nom) {
-
 
1995
			if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
-
 
1996
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
1995
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1997
			}
-
 
1998
		}
-
 
1999
		
1996
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2000
		// Analyse des résultats
-
 
2001
		if (count($noms_erreur) > 0) {
1997
				}
2002
			$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
-
 
2003
			$info['message']['lignes'] = $noms_erreur;
-
 
2004
		} else {
-
 
2005
			$info['resultat'] = true;
-
 
2006
		}
-
 
2007
		$noms_erreur = null;
-
 
2008
		
1998
			}
2009
		$this->traiterResultatTest($info);
1999
		}
2010
	}
Line 2000... Line 2011...
2000
		
2011
	
2001
		// Analyse des résultats
2012
	/**
2002
		if (count($noms_erreur) > 0) {
2013
	 * Test #43
2003
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
2014
	 */
-
 
2015
	private function testerAuteurSyntaxe() {
2004
			$info['message']['lignes'] = $noms_erreur;
2016
		$info = array('nom' => 'auteur -> syntaxe',
2005
		} else {
2017
			'description' => "Le champ auteur doit :\n".
2006
			$info['resultat'] = true;
2018
			" - contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié à l'origine la combinaison latine courante.\n".
2007
		}
2019
    		" - OU débuter par le mot « sensu » et contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ".
2008
		$noms_erreur = null;
2020
			"ayant publié un nom dont la description ne correspond pas à celle de l'auteur, ou des auteurs, d'origine.\n".
Line 2009... Line 2021...
2009
		
2021
			" - se composer de caractères alphabétiques (A-Z, a-z), incluant les signes diacritiques, le symbole point (.), les paires de parenthèses ( () ), les apostrophes, l'esperluette (&) et l'espace ( ).\n".
2010
		$this->traiterResultatTest($info);
2022
			" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
2011
	}
2023
			" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
2012
	
2024
			" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
2013
	private function testerEpitheteInfraGeneriqueRang() {
2025
			" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
2014
		$info = array('nom' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
2026
			" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
2015
			'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris ".
2027
			"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
2016
				"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
2028
			'resultat' => false);
Line 2017... Line 2029...
2017
			'resultat' => false);
2029
		
2018
		
2030
		// Réalisation du test
Line -... Line 2031...
-
 
2031
		$noms_erreur = array();
-
 
2032
		foreach ($this->noms as &$nom) {
-
 
2033
			if ($nom['auteur'] != '') {
2019
		// Réalisation du test
2034
				if (!$this->verifierAuteur($nom['auteur'])) {
2020
		$noms_erreur = array();
2035
					$intitule_traite = $this->repererEspace($nom['auteur']);
2021
		foreach ($this->noms as &$nom) {
2036
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
-
 
2037
				}
-
 
2038
			}
2022
			if ($nom['epithete_infra_generique'] != '') {
2039
		}
Line 2023... Line 2040...
2023
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
2040
		
2024
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
2041
		// Analyse des résultats
2025
				}
2042
		if (count($noms_erreur) > 0) {
2026
			}
2043
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
2027
		}
-
 
2028
		
2044
			$info['message']['lignes'] = $noms_erreur;
2029
		// Analyse des résultats
2045
		} else {
2030
		if (count($noms_erreur) > 0) {
2046
			$info['resultat'] = true;
2031
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
2047
		}
2032
			$info['message']['lignes'] = $noms_erreur;
2048
		$noms_erreur = null;
Line 2033... Line 2049...
2033
		} else {
2049
		
2034
			$info['resultat'] = true;
2050
		$this->traiterResultatTest($info);
2035
		}
2051
	}
2036
		$noms_erreur = null;
2052
	
2037
		
2053
	/**
2038
		$this->traiterResultatTest($info);
2054
	 * Test #44
2039
	}
2055
	 */
2040
	
2056
	private function testerAnneeSyntaxe() {
Line 2041... Line 2057...
2041
	private function testerEpitheteInfraGeneriqueEspaces() {
2057
		$info = array('nom' => 'annee -> syntaxe',
2042
		$info = array('nom' => 'epithete_infra_generique -> espaces en trop',
2058
			'description' => "Le champ annee doit :\n".
Line -... Line 2059...
-
 
2059
			" - contenir un nombre de 4 chiffres,\n".
-
 
2060
			" - être supérieur ou égal à 1753.",
-
 
2061
			'resultat' => false);
2043
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou après sa valeur.",
2062
		
2044
			'resultat' => false);
2063
		// Réalisation du test
2045
		
2064
		$noms_erreur = array();
-
 
2065
		foreach ($this->noms as &$nom) {
-
 
2066
			if ($nom['annee'] != '') {
-
 
2067
				if (!$this->verifierAnnee($nom['annee'])) {
-
 
2068
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
-
 
2069
				}
-
 
2070
			}
-
 
2071
		}
-
 
2072
		
-
 
2073
		// Analyse des résultats
-
 
2074
		if (count($noms_erreur) > 0) {
-
 
2075
			$info['message']['entete'] = array('num_nom', 'annee erroné');
-
 
2076
			$info['message']['lignes'] = $noms_erreur;
-
 
2077
		} else {
2046
		// Réalisation du test
2078
			$info['resultat'] = true;
2047
		$noms_erreur = array();
2079
		}
Line 2048... Line 2080...
2048
		foreach ($this->noms as &$nom) {
2080
		$noms_erreur = null;
2049
			if ($nom['epithete_infra_generique'] != '') {
2081
		
2050
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
2082
		$this->traiterResultatTest($info);
2051
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
2083
	}
2052
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2084
	
2053
				}
2085
	/**
2054
			}
2086
	 * Test #45
2055
		}
2087
	 */
2056
		
2088
	private function testerBiblioOrigineSyntaxe() {
2057
		// Analyse des résultats
2089
		$info = array('nom' => 'biblio_origine -> syntaxe',
Line 2058... Line 2090...
2058
		if (count($noms_erreur) > 0) {
2090
			'description' => "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères ".
2059
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
2091
			"précis qui sont dans l'ordre de gauche à droite :\n".
2060
			$info['message']['lignes'] = $noms_erreur;
2092
			" - éventuellement, le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
2061
		} else {
2093
			"l'ouvrage dans lequel la publication est parue),\n".
2062
			$info['resultat'] = true;
2094
			" - point-virgule « ; » (si l'info précédent a été renseignée),\n".
2063
		}
2095
			" - abréviation, ou nom, de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom. ".
2064
		$noms_erreur = null;
2096
			"Cette information ne doit pas contenir de caractère virgule « , »,\n".
2065
		
2097
			" - virgule « , »,\n".
Line 2066... Line 2098...
2066
		$this->traiterResultatTest($info);
2098
			" - informations permettant d'identifier plus précisément le document contenant le nom... ".
2067
	}
2099
			"(par exemple, l'éditeur, le tome, le numéro d'édition, le volume...) séparées par des virgules ou d'autres ".
Line -... Line 2100...
-
 
2100
			"caractères sauf deux points « : ».\n".
-
 
2101
			" - deux points « : »,\n".
-
 
2102
			" - numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière ".
2068
	
2103
			"pages de l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
2069
	private function testerEpitheteSpEspaces() {
2104
			"la position du nom dans le document. Le tiret « - » doit toujours servir à séparer un ensemble.",
2070
		$info = array('nom' => 'epithete_sp -> espaces en trop',
2105
			'resultat' => false);
2071
			'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou après le nom.\n".
-
 
2072
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
2106
		
2073
			'resultat' => false);
-
 
2074
		
-
 
2075
		// Réalisation du test
2107
		// Réalisation du test
2076
		$noms_erreur = array();
-
 
2077
		foreach ($this->noms as &$nom) {
-
 
2078
			if ($nom['epithete_sp'] != '') {
2108
		$noms_erreur = array();
Line 2079... Line 2109...
2079
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
2109
		foreach ($this->noms as &$nom) {
2080
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2110
			if ($nom['biblio_origine'] != '') {
2081
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2111
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
2082
				}
2112
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
2083
			}
-
 
2084
		}
-
 
2085
		
-
 
2086
		// Analyse des résultats
2113
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
2087
		if (count($noms_erreur) > 0) {
2114
				}
2088
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
-
 
2089
			$info['message']['lignes'] = $noms_erreur;
2115
			}
2090
		} else {
2116
		}
2091
			$info['resultat'] = true;
2117
		
Line 2092... Line 2118...
2092
		}
2118
		// Analyse des résultats
2093
		$noms_erreur = null;
2119
		if (count($noms_erreur) > 0) {
2094
		
2120
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
2095
		$this->traiterResultatTest($info);
2121
			$info['message']['lignes'] = $noms_erreur;
2096
	}
2122
		} else {
2097
	
2123
			$info['resultat'] = true;
2098
	private function testerEpitheteSpSyntaxe() {
2124
		}
2099
		$info = array('nom' => 'epithete_sp -> syntaxe',
2125
		$noms_erreur = null;
Line 2100... Line 2126...
2100
			'description' => "Le champ epithete_sp peut contenir :\n".
2126
		
2101
			 	" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
2127
		$this->traiterResultatTest($info);
Line -... Line 2128...
-
 
2128
	}
-
 
2129
	
-
 
2130
	/**
2102
				"   Il commence par une lettre minuscule [a-zëï].\n". 
2131
	 * Test #46
2103
				"   Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
2132
	 */
2104
				" - un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9) \n".
2133
	private function testerHomonymieSyntaxe() {
-
 
2134
		$info = array('nom' => 'homonyme -> syntaxe',
2105
				"   ou d'un seul caractère majuscule (A-Z) \n".
2135
			'description' => "Le champ homonyme contient :\n".
Line -... Line 2136...
-
 
2136
				" - une valeur vide,\n".
-
 
2137
				" - le chiffre 1.",
2106
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) \n".
2138
			'resultat' => false);
2107
				"   séparés entre eux par la lettre x entourée de caractères espaces.",
2139
		
2108
			'resultat' => false);
2140
		// Réalisation du test
2109
		
2141
		$noms_erreur = array();
2110
		// Réalisation du test
2142
		foreach ($this->noms as &$nom) {
2111
		$noms_erreur = array();
2143
			if ($nom['homonyme'] != '') {
2112
		foreach ($this->noms as &$nom) {
2144
				if (!$this->verifierBooleen($nom['homonyme'])) {
2113
			if ($nom['epithete_sp'] != '') {
2145
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
2114
				$mots = explode(' ', $nom['epithete_sp']);
2146
				}
-
 
2147
			}
Line 2115... Line 2148...
2115
				foreach ($mots as $mot) {
2148
		}
2116
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
2149
		
2117
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
2150
		// Analyse des résultats
2118
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
2151
		if (count($noms_erreur) > 0) {
2119
					}
2152
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
2120
				}
2153
			$info['message']['lignes'] = $noms_erreur;
2121
			}
2154
		} else {
2122
		}
2155
			$info['resultat'] = true;
Line 2123... Line 2156...
2123
		
2156
		}
2124
		// Analyse des résultats
2157
		$noms_erreur = null;
Line -... Line 2158...
-
 
2158
		
-
 
2159
		$this->traiterResultatTest($info);
2125
		if (count($noms_erreur) > 0) {
2160
	}
2126
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2161
	
-
 
2162
	/**
2127
			$info['message']['lignes'] = $noms_erreur;
2163
	 * Test #47
2128
		} else {
2164
	 */
2129
			$info['resultat'] = true;
2165
	private function testerHomonymieExistence() {
2130
		}
2166
		$info = array('nom' => 'homonyme -> existence',
2131
		$noms_erreur = null;
2167
			'description' => "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur ".
Line 2189... Line 2225...
2189
		}
2225
		}
2190
		$noms_erreur = null;
2226
		$noms_erreur = null;
Line 2191... Line 2227...
2191
		
2227
		
2192
		$this->traiterResultatTest($info);
2228
		$this->traiterResultatTest($info);
-
 
2229
	}
-
 
2230
 
-
 
2231
	
2193
	}
2232
 
2194
	//+--------------------------------------------------------------------------------------------------------------+//
2233
	//+--------------------------------------------------------------------------------------------------------------+//
Line 2195... Line 2234...
2195
	// MÉTHODES COMMUNES aux TESTS
2234
	// MÉTHODES COMMUNES aux TESTS
2196
	
2235
	
Line 2467... Line 2506...
2467
			}
2506
			}
2468
		}
2507
		}
2469
		return $noms_classes;
2508
		return $noms_classes;
2470
	}
2509
	}
Line -... Line 2510...
-
 
2510
 
-
 
2511
	private function getInfosTest($numero) {
-
 
2512
		$info = $this->tests[$numero];
-
 
2513
		$info['numero'] = $numero; 
-
 
2514
		$info['resultat'] = false;
-
 
2515
		return $info;
2471
 
2516
	}
2472
}
2517
}
2473
?>
2518
?>