Subversion Repositories Applications.referentiel

Rev

Rev 167 | Rev 173 | Go to most recent revision | Show entire file | Ignore 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();
-
 
259
		foreach ($this->noms as &$nom) {
-
 
260
			if ($nom['statut_introduction'] != '') {
239
		
Line -... Line 240...
-
 
240
		$champs_attendus = explode(',', $this->manuel['champs']);
261
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
241
		$champs_presents = array();
262
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
242
		foreach ($colonnes as $colonne) {
263
				}
243
			$champs_presents[$colonne['Field']] = $colonne;
264
			}
244
		}
265
		}
245
		
-
 
246
		$ok = true;
-
 
247
		$champs_manquant = array(); 
266
		
248
		foreach ($champs_attendus as $champ_attendu) {
-
 
249
			if (!isset($champs_presents[$champ_attendu])) {
-
 
250
				$champs_manquant[] = $champ_attendu; 
267
		// Analyse des résultats
251
				$ok = false;
268
		if (count($noms_erreur) > 0) {
-
 
Line 269... Line 252...
269
			$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
252
			}
-
 
253
		}
270
			$info['message']['lignes'] = $noms_erreur;
254
		$info['resultat'] = $ok;
Line -... Line 255...
-
 
255
		if (!$ok) {
-
 
256
			$info['message'] = sprintf($info['message'], implode(', ', $champs_manquant));
-
 
257
		}
271
		} else {
258
		
272
			$info['resultat'] = true;
-
 
273
		}
-
 
274
		$noms_erreur = null;
-
 
275
		
-
 
276
		$this->traiterResultatTest($info);
-
 
277
	}
-
 
278
	
259
		$this->traiterResultatTest($info);
Line -... Line 260...
-
 
260
		return ($info['resultat'] ? '1' : '0');
-
 
261
	}
-
 
262
	
-
 
263
	/**
-
 
264
	 * Test #03
-
 
265
	 */
279
	private function testerStatutOrigineSyntaxe() {
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
		
-
 
269
		$champs_attendus = explode(',', $this->manuel['champs_type']);
-
 
270
		$champs_presents = array();
-
 
271
		foreach ($colonnes as $colonne) {
282
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
272
			$champs_presents[$colonne['Field']] = $colonne['Type'];
283
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
273
		}
-
 
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));
284
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
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];
Line 288... Line 283...
288
		// Réalisation du test
283
				
289
		$noms_erreur = array();
284
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
290
		foreach ($this->noms as &$nom) {
-
 
291
			if ($nom['statut_origine'] != '') {
285
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
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
			}
-
 
Line 296... Line 289...
296
		}
289
				}
-
 
290
			}
297
		
291
		}
Line -... Line 292...
-
 
292
		
-
 
293
		// Analyse des résultats
-
 
294
		if (count($champs_erreur) > 0) {
298
		// Analyse des résultats
295
			$info['message'] = sprintf($info['message'], implode(', ', $champs_erreur));
299
		if (count($noms_erreur) > 0) {
296
		} else {
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;
-
 
Line 306... Line -...
306
		
-
 
307
		$this->traiterResultatTest($info);
-
 
308
	}
297
			$info['resultat'] = true;
309
	
298
		}
310
	private function testerPresenceSyntaxe() {
299
		
311
		$info = array('nom' => 'presence -> syntaxe',
-
 
312
			'description' => "Le champ presence contient soit :\n".
-
 
313
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
300
		$this->traiterResultatTest($info);
314
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
301
		return ($info['resultat'] ? '1' : '0');
Line 315... Line -...
315
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
-
 
316
								"un code de présence spécifique au référentiel.",
-
 
317
			'resultat' => false);
-
 
318
		
-
 
319
		// Réalisation du test
-
 
320
		$noms_erreur = array();
-
 
321
		foreach ($this->noms as &$nom) {
-
 
322
			if ($nom['presence'] != '') {
-
 
323
				if (!$this->verifierPresence($nom['presence'])) {
-
 
324
					$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
302
	}
-
 
303
	
325
				}
304
	/**
Line -... Line 305...
-
 
305
	 * Test #04
-
 
306
	 */
-
 
307
	private function testerNumNomClePrimaire($colonnes) {
-
 
308
		$info = $this->getInfosTest(4);
326
			}
309
		
327
		}
-
 
328
		
-
 
329
		// Analyse des résultats
-
 
330
		if (count($noms_erreur) > 0) {
310
		foreach ($colonnes as $colonne) {
Line 331... Line 311...
331
			$info['message']['entete'] = array('num_nom', 'presence erroné');
311
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
-
 
312
				$info['resultat'] = true;
-
 
313
			}
-
 
314
		}
-
 
315
		
-
 
316
		$this->traiterResultatTest($info);
-
 
317
		return ($info['resultat'] ? '1' : '0');
332
			$info['message']['lignes'] = $noms_erreur;
318
	}
333
		} else {
319
	
-
 
320
	
-
 
321
	/**
-
 
322
	 * Test #05
-
 
323
	 */
-
 
324
	private function testerTailleDesChamps($colonnes, $analyses) {
-
 
325
		$info = $this->getInfosTest(5);
-
 
326
		
334
			$info['resultat'] = true;
327
		$tailles_champs_maxi = array();
335
		}
328
		foreach ($colonnes as $colonne) {
336
		$noms_erreur = null;
329
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
-
 
330
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
337
		
331
			}
338
		$this->traiterResultatTest($info);
332
		}
339
	}
333
		
Line 340... Line 334...
340
	
334
		$tailles_trouvees = array();
341
	private function testerHybrideParent02Existence() {
335
		foreach ($analyses as $analyse) {
342
		$info = array('nom' => 'hybride_parent_02 -> existence',
-
 
343
			'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur ".
336
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
344
								"du champ num_nom.",
337
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
345
			'resultat' => false);
338
			}
346
		
339
		}
347
		// Réalisation du test
-
 
Line 348... Line 340...
348
		$noms_erreur = array();
340
		
349
		foreach ($this->noms as &$nom) {
341
		$champs_erreur = array();
350
			if ($nom['hybride_parent_02'] != '') {
342
		$champs_attendus = explode(',', $this->manuel['champs']);
-
 
343
		foreach ($champs_attendus as $champ_attendu) {
-
 
344
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
-
 
345
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
351
				if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
346
					$champs_erreur[] = $champ_attendu;
352
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
-
 
353
				}
-
 
354
			}
-
 
355
		}
-
 
356
		
347
				}
Line 357... Line 348...
357
		// Analyse des résultats
348
			}
358
		if (count($noms_erreur) > 0) {
349
		}
359
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
350
		
360
			$info['message']['lignes'] = $noms_erreur;
351
		// Analyse des résultats
361
		} else {
352
		if (count($champs_erreur) > 0) {
362
			$info['resultat'] = true;
-
 
363
		}
-
 
364
		$noms_erreur = null;
353
			$info['message'] = sprintf($info['message'], implode(', ', $champs_erreur));
365
		
354
		} else {
Line 366... Line 355...
366
		$this->traiterResultatTest($info);
355
			$info['resultat'] = true;
367
	}
356
		}
368
	
-
 
369
	private function testerHybrideParent02Syntaxe() {
357
		
370
		$info = array('nom' => 'hybride_parent_02 -> syntaxe',
358
		$this->traiterResultatTest($info);
371
			'description' => "Le champ hybride_parent_02 contient soit :\n".
359
	}
372
								" - une valeur vide,\n".
360
		
373
								" - un nombre.",
-
 
Line 374... Line 361...
374
			'resultat' => false);
361
	/**
375
		
362
	 * Test #06
Line -... Line 363...
-
 
363
	 */
-
 
364
	private function testerNumNomSuperieurAZero() {
376
		// Réalisation du test
365
		$info = $this->getInfosTest(6);
377
		$noms_erreur = array();
366
		
378
		foreach ($this->noms as &$nom) {
-
 
379
			if ($nom['hybride_parent_02'] != '') {
-
 
380
				if (!$this->verifierNombre($nom['hybride_parent_02'])) {
-
 
381
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
367
		// Réalisation du test
Line 382... Line 368...
382
				}
368
		$noms_erreur = array();
383
			}
369
		foreach ($this->noms as &$nom) {
384
		}
370
			if ($nom['num_nom'] <= 0) {
385
		
371
				$noms_erreur[] = $nom['num_nom'];
386
		// Analyse des résultats
372
			}
387
		if (count($noms_erreur) > 0) {
-
 
388
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
-
 
389
			$info['message']['lignes'] = $noms_erreur;
373
		}
390
		} else {
374
		
Line 391... Line 375...
391
			$info['resultat'] = true;
375
		// Analyse des résultats
392
		}
376
		if (count($noms_erreur) > 0) {
393
		$noms_erreur = null;
377
			$info['message'] = sprintf($info['message'], count($noms_erreur));
394
		
-
 
395
		$this->traiterResultatTest($info);
378
		} else {
396
	}
379
			$info['resultat'] = true;
397
	
380
		}
398
	
-
 
Line 399... Line 381...
399
	private function testerHybrideParent01Existence() {
381
		
400
		$info = array('nom' => 'hybride_parent_01 -> existence',
382
		$this->traiterResultatTest($info);
Line -... Line 383...
-
 
383
	}
-
 
384
	
-
 
385
	/**
401
			'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur ".
386
	 * Test #07
402
								"du champ num_nom.",
-
 
403
			'resultat' => false);
-
 
404
		
-
 
405
		// Réalisation du test
-
 
406
		$noms_erreur = array();
387
	 */
Line 407... Line 388...
407
		foreach ($this->noms as &$nom) {
388
	private function testerNumNomRetenuSuperieurAZero() {
408
			if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
389
		$info = $this->getInfosTest(7);
409
				if (!isset($this->noms[$nom['hybride_parent_01']])) {
390
		
410
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
-
 
411
				}
391
		// Réalisation du test
412
			}
392
		$noms_erreur = array();
413
		}
-
 
414
		
393
		foreach ($this->noms as &$nom) {
415
		// Analyse des résultats
394
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
Line 416... Line 395...
416
		if (count($noms_erreur) > 0) {
395
				$noms_erreur[] = $nom['num_nom'];
417
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
396
			}
418
			$info['message']['lignes'] = $noms_erreur;
397
		}
419
		} else {
-
 
420
			$info['resultat'] = true;
398
		
421
		}
399
		// Analyse des résultats
422
		$noms_erreur = null;
400
		if (count($noms_erreur) > 0) {
423
		
-
 
Line 424... Line 401...
424
		$this->traiterResultatTest($info);
401
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
425
	}
402
		} else {
Line -... Line 403...
-
 
403
			$info['resultat'] = true;
-
 
404
		}
-
 
405
		
426
	
406
		$this->traiterResultatTest($info);
427
	private function testerHybrideParent01Syntaxe() {
-
 
428
		$info = array('nom' => 'hybride_parent_01 -> syntaxe',
-
 
429
			'description' => "Le champ hybride_parent_01 contient soit :\n".
-
 
430
								" - une valeur vide,\n".
407
	}
Line 431... Line 408...
431
								" - un nombre.",
408
	
432
			'resultat' => false);
409
	/**
433
		
410
	 * Test #08
434
		// Réalisation du test
411
	 */
435
		$noms_erreur = array();
-
 
436
		foreach ($this->noms as &$nom) {
412
	private function testerNumTaxSupEgalZeroUnique() {
437
			if ($nom['hybride_parent_01'] != '') {
-
 
438
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
413
		$info = $this->getInfosTest(8);
439
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
414
		
Line 440... Line 415...
440
				}
415
		// Réalisation du test
441
			}
416
		$noms_erreur = array();
442
		}
417
		foreach ($this->noms as &$nom) {
443
		
-
 
444
		// Analyse des résultats
418
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
445
		if (count($noms_erreur) > 0) {
419
				$noms_erreur[] = $nom['num_nom'];
446
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
420
			}
447
			$info['message']['lignes'] = $noms_erreur;
-
 
Line 448... Line 421...
448
		} else {
421
		}
449
			$info['resultat'] = true;
422
		
Line -... Line 423...
-
 
423
		// Analyse des résultats
-
 
424
		if (count($noms_erreur) > 1) {
-
 
425
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
450
		}
426
		} else {
451
		$noms_erreur = null;
-
 
452
		
-
 
453
		$this->traiterResultatTest($info);
-
 
454
	}
-
 
455
	
427
			$info['resultat'] = true;
Line 456... Line 428...
456
	private function testerSynonymeOrthographiqueExistence() {
428
		}
457
		$info = array('nom' => 'synonyme_orthographique -> existence',
429
		
458
			'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
430
		$this->traiterResultatTest($info);
459
								"à une valeur du champ num_nom.",
431
	}
460
			'resultat' => false);
432
	
461
		
433
	/**
462
		// Réalisation du test
434
	 * Test #09
463
		$noms_erreur = array();
435
	 */
464
		foreach ($this->noms as &$nom) {
436
	private function testerTaxSupPourTaxon() {
Line 465... Line 437...
465
			if ($nom['synonyme_orthographique'] != '') {
437
		$info = $this->getInfosTest(9);
466
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
438
		
467
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
439
		// Réalisation du test
468
				}
-
 
469
			}
440
		$noms_erreur = array();
470
		}
441
		foreach ($this->noms as &$nom) {
471
		
442
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
472
		// Analyse des résultats
-
 
Line 473... Line 443...
473
		if (count($noms_erreur) > 0) {
443
				$noms_erreur[] = $nom['num_nom']; 
474
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
444
			}
Line -... Line 445...
-
 
445
		}
-
 
446
		
-
 
447
		// Analyse des résultats
475
			$info['message']['lignes'] = $noms_erreur;
448
		if (count($noms_erreur) > 0) {
476
		} else {
-
 
477
			$info['resultat'] = true;
-
 
478
		}
-
 
479
		$noms_erreur = null;
-
 
480
		
449
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
Line 481... Line 450...
481
		$this->traiterResultatTest($info);
450
		} else {
482
	}
451
			$info['resultat'] = true;
483
	
452
		}
484
	private function testerSynonymeOrthographiqueSyntaxe() {
453
		
485
		$info = array('nom' => 'synonyme_orthographique -> syntaxe',
454
		$this->traiterResultatTest($info);
-
 
455
	}
-
 
456
	
-
 
457
	/**
-
 
458
	 * Test #10
486
			'description' => "Le champ synonyme_orthographique contient soit :\n".
459
	 */
-
 
460
	private function testerExitenceTaxonSuperieur() {
-
 
461
		$info = $this->getInfosTest(10);
487
								" - une valeur vide,\n".
462
		
488
								" - un nombre.",
463
		// Réalisation du test
489
			'resultat' => false);
464
		$noms_erreur = array();
Line 490... Line 465...
490
		
465
		foreach ($this->noms as &$nom) {
491
		// Réalisation du test
466
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
492
		$noms_erreur = array();
467
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
493
		foreach ($this->noms as $nom) {
-
 
494
			if ($nom['synonyme_orthographique'] != '') {
468
					$noms_erreur[] = $nom['num_nom'];
495
				if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
469
				} 
496
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
470
			}
497
				}
-
 
Line 498... Line 471...
498
			}
471
		}
499
		}
472
		
Line -... Line 473...
-
 
473
		// Analyse des résultats
-
 
474
		if (count($noms_erreur) > 0) {
500
		
475
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
501
		// Analyse des résultats
476
		} else {
502
		if (count($noms_erreur) > 0) {
-
 
503
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
-
 
504
			$info['message']['lignes'] = $noms_erreur;
-
 
505
		} else {
-
 
506
			$info['resultat'] = true;
477
			$info['resultat'] = true;
Line 507... Line 478...
507
		}
478
		}
508
		$noms_erreur = null;
479
		
-
 
480
		$this->traiterResultatTest($info);
509
		
481
	}
510
		$this->traiterResultatTest($info);
482
	
511
	}
483
	/**
-
 
484
	 * Test #11
-
 
485
	 */
-
 
486
	private function testerClassificationRang() {
-
 
487
		$info = $this->getInfosTest(11);
-
 
488
		
-
 
489
		// Réalisation du test
-
 
490
		$noms_erreur = array();
512
	
491
		foreach ($this->noms as &$nom) {
-
 
492
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
-
 
493
				if (isset($this->noms[$nom['num_tax_sup']])) {
-
 
494
					$nom_sup = $this->noms[$nom['num_tax_sup']];
513
	private function testerSynonymeMalAppliqueSyntaxe() {
495
					if ($nom_sup['rang'] >= $nom['rang']) {
514
		$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
496
						// Prise en compte de l'exception des clades
515
			'description' => "Le champ synonyme_mal_applique contient soit :\n".
497
						if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
-
 
498
							$noms_erreur[] = $nom['num_nom'];
Line 516... Line 499...
516
			" - une valeur vide,\n".
499
						}
517
			" - le chiffre 1.",
500
					}
518
			'resultat' => false);
501
				}
519
		
-
 
520
		// Réalisation du test
502
			}
521
		$noms_erreur = array();
503
		}
522
		foreach ($this->noms as &$nom) {
504
		
523
			if ($nom['synonyme_mal_applique'] != '') {
-
 
Line 524... Line 505...
524
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
505
		// Analyse des résultats
525
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
506
		if (count($noms_erreur) > 0) {
Line 526... Line 507...
526
				}
507
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
527
			}
508
		} else {
-
 
509
			$info['resultat'] = true;
-
 
510
		}
-
 
511
		
-
 
512
		$this->traiterResultatTest($info);
528
		}
513
	}
-
 
514
	
529
		
515
	/**
530
		// Analyse des résultats
-
 
-
 
516
	 * Test #12
531
		if (count($noms_erreur) > 0) {
517
	 */
-
 
518
	private function testerClassification() {
532
			$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
519
		$info = $this->getInfosTest(12);
-
 
520
		
-
 
521
		// Réalisation du test
533
			$info['message']['lignes'] = $noms_erreur;
522
		$noms_erreur = array();
534
		} else {
523
		$this->noms_ok = array();
-
 
524
		foreach ($this->noms as &$nom) {
535
			$info['resultat'] = true;
525
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
536
		}
526
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
537
		$noms_erreur = null;
-
 
538
		
-
 
539
		$this->traiterResultatTest($info);
-
 
540
	}
-
 
541
	
-
 
542
	
-
 
543
	private function testerSynonymeDouteuxSyntaxe() {
527
					$this->noms_ok[$nom['num_nom']] = true;
544
		$info = array('nom' => 'synonyme_douteux -> syntaxe',
528
				} else {
545
			'description' => "Le champ synonyme_douteux contient soit :\n".
529
					$this->detection_boucle_infini = array();
546
			" - une valeur vide,\n".
-
 
547
			" - le chiffre 1.",
-
 
548
			'resultat' => false);
530
					$classif_ok = $this->remonterClassif($nom);
549
		
531
					unset($this->detection_boucle_infini); 
-
 
532
					
-
 
533
					if ($classif_ok === false) {
550
		// Réalisation du test
534
						$noms_erreur[] = $nom['num_nom'];
551
		$noms_erreur = array();
535
					} else {
552
		foreach ($this->noms as &$nom) {
536
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
553
			if ($nom['synonyme_douteux'] != '') {
-
 
-
 
537
					}
554
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
538
				}
555
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
-
 
Line 556... Line 539...
556
				}
539
			}
557
			}
540
		}
558
		}
541
		unset($this->noms_ok);
559
		
-
 
560
		// Analyse des résultats
-
 
561
		if (count($noms_erreur) > 0) {
-
 
562
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
-
 
563
			$info['message']['lignes'] = $noms_erreur;
542
		
564
		} else {
543
		// Analyse des résultats
565
			$info['resultat'] = true;
-
 
566
		}
-
 
567
		$noms_erreur = null;
-
 
568
		
-
 
569
		$this->traiterResultatTest($info);
-
 
570
	}
544
		if (count($noms_erreur) > 0) {
571
	
545
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
Line 572... Line 546...
572
	private function testerSynonymeDouteuxNumNomRetenu() {
546
		} else {
573
		$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
547
			$info['resultat'] = true;
574
			'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
548
		}
575
			'resultat' => false);
-
 
576
		
549
		
577
		// Réalisation du test
550
		$this->traiterResultatTest($info);
578
		$noms_erreur = array();
551
	}
579
		foreach ($this->noms as &$nom) {
-
 
Line 580... Line 552...
580
			if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
552
	
581
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
553
	private function remonterClassif(&$nom) {
Line -... Line 554...
-
 
554
		$this->detection_boucle_infini[$nom['num_nom']] = true;
-
 
555
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
-
 
556
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
582
			}
557
				$this->noms_ok[$nom['num_nom']] = true;
583
		}
558
				return true;
584
		
559
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
585
		// Analyse des résultats
-
 
586
		if (count($noms_erreur) > 0) {
-
 
587
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
-
 
588
			$info['message']['lignes'] = $noms_erreur;
-
 
Line 589... Line 560...
589
		} else {
560
				$this->noms_ok[$nom['num_nom']] = true;
590
			$info['resultat'] = true;
561
				return true;
591
		}
562
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
592
		$noms_erreur = null;
563
				return false;
-
 
564
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
593
		$this->traiterResultatTest($info);
565
				return false;
-
 
566
			} else {
-
 
567
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
-
 
568
				if ($retour === true) {
594
	}
569
					$this->noms_ok[$nom['num_tax_sup']] = true;
595
	
570
				}
596
	
571
				return $retour;
597
	private function testerSynonymeProparteExistence() {
572
			}
Line 598... Line 573...
598
		$info = array('nom' => 'synonyme_proparte -> existence',
573
		} else {
599
			'description' => "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux ".
574
			return false;
600
								"doit correspondre à une valeur du champ num_nom.",
575
		}
601
			'resultat' => false);
576
	}
602
		
577
	
603
		// Réalisation du test
578
	/**
604
		$noms_erreur = array();
579
	 * Test #13
605
		foreach ($this->noms as &$nom) {
-
 
Line 606... Line 580...
606
			if ($nom['synonyme_proparte'] != '') {
580
	 */
607
				$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
581
	private function testerRang() {
Line -... Line 582...
-
 
582
		$info = $this->getInfosTest(13);
-
 
583
		
-
 
584
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
608
				$num_nom_en_erreur = array();
585
		
609
				foreach ($num_nom_a_verifier as $num_nom) {
586
		// Réalisation du test
610
					if (!isset($this->noms[$num_nom])) {
587
		$noms_erreur = array();
611
						$num_nom_en_erreur[] = $num_nom;
-
 
612
					}
-
 
Line 613... Line 588...
613
				}
588
		foreach ($this->noms as &$nom) {
614
				if (count($nbre_en_erreur) > 0) {
589
			if (!isset($rangs[$nom['rang']])) {
615
					$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
590
				$noms_erreur[] = $nom['num_nom'];
-
 
591
			}
-
 
592
		}
-
 
593
		
-
 
594
		// Analyse des résultats
616
				}
595
		if (count($noms_erreur) > 0) {
617
			}
596
			$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
618
		}
597
		} else {
619
		
598
			$info['resultat'] = true;
620
		// Analyse des résultats
599
		}
621
		if (count($noms_erreur) > 0) {
600
		
Line 622... Line 601...
622
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
601
		$this->traiterResultatTest($info);
623
			$info['message']['lignes'] = $noms_erreur;
602
	}
624
		} else {
603
	
625
			$info['resultat'] = true;
604
	/**
626
		}
605
	 * Test #14
627
		$noms_erreur = null;
606
	 */
628
		
607
	private function testerNomCompletSupraGenerique() {
629
		$this->traiterResultatTest($info);
-
 
Line 630... Line 608...
630
	}
608
		$info = $this->getInfosTest(14);
631
	
609
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
Line -... Line 610...
-
 
610
		
-
 
611
		// Réalisation du test
-
 
612
		$noms_erreur = array();
632
	private function testerSynonymeProparteSyntaxe() {
613
		foreach ($this->noms as &$nom) {
633
		$info = array('nom' => 'synonyme_proparte -> syntaxe',
614
			if ($nom['rang'] < $this->manuel['rang_genre']) {
634
			'description' => "Le champ synonyme_proparte contient soit :\n".
615
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
635
			" - une valeur vide,\n".
-
 
636
			" - un nombre,\n".
-
 
637
			" - une suite de nombres séparés par des virgules.",
-
 
Line 638... Line 616...
638
			'resultat' => false);
616
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
639
		
617
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
640
		// Réalisation du test
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
				}
641
		$noms_erreur = array();
622
			}
-
 
623
		}
-
 
624
		
-
 
625
		// Analyse des résultats
-
 
626
		if (count($noms_erreur) > 0) {
642
		foreach ($this->noms as &$nom) {
627
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
-
 
628
			$info['message']['lignes'] = $noms_erreur;
-
 
629
		} else {
-
 
630
			$info['resultat'] = true;
-
 
631
		}
-
 
632
		
-
 
633
		$this->traiterResultatTest($info);
643
			if ($nom['synonyme_proparte'] != '') {
634
	}
644
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
635
	
645
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
636
	/**
646
				}
637
	 * Test #15
Line 647... Line 638...
647
			}
638
	 */
648
		}
639
	private function testerNomCompletGenre() {
649
		
640
		$info = $this->getInfosTest(15);
650
		// Analyse des résultats
641
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
651
		if (count($noms_erreur) > 0) {
642
		
652
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
643
		// Réalisation du test
653
			$info['message']['lignes'] = $noms_erreur;
644
		$noms_erreur = array();
654
		} else {
645
		foreach ($this->noms as &$nom) {
Line 655... Line 646...
655
			$info['resultat'] = true;
646
			if ($nom['rang'] == $this->manuel['rang_genre']) {
656
		}
647
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
Line -... Line 648...
-
 
648
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
-
 
649
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
-
 
650
				if ($nom['nom_sci'] != $nom_sci_ideal) {
657
		$noms_erreur = null;
651
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
658
		
652
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
659
		$this->traiterResultatTest($info);
653
				}
660
	}
-
 
661
	
-
 
662
	private function testerBasionymeExistence() {
-
 
663
		$info = array('nom' => 'basionyme -> existence',
-
 
Line 664... Line 654...
664
			'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
654
			}
665
								"num_nom.",
655
		}
666
			'resultat' => false);
656
		
667
		
657
		// Analyse des résultats
-
 
658
		if (count($noms_erreur) > 0) {
-
 
659
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
-
 
660
			$info['message']['lignes'] = $noms_erreur;
-
 
661
		} else {
668
		// Réalisation du test
662
			$info['resultat'] = true;
-
 
663
		}
669
		$noms_erreur = array();
664
		
670
		foreach ($this->noms as &$nom) {
665
		$this->traiterResultatTest($info);
671
			if ($nom['basionyme'] != '') {
666
	}
672
				if (!isset($this->noms[$nom['basionyme']])) {
667
	
673
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
-
 
Line 674... Line 668...
674
				}
668
	/**
675
			}
669
	 * Test #16
676
		}
670
	 */
677
		
671
	private function testerNomCompletInfraGenre() {
678
		// Analyse des résultats
672
		$info = $this->getInfosTest(16);
679
		if (count($noms_erreur) > 0) {
673
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
680
			$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
674
		
681
			$info['message']['lignes'] = $noms_erreur;
675
		// Réalisation du test
Line 682... Line 676...
682
		} else {
676
		$noms_erreur = array();
683
			$info['resultat'] = true;
677
		foreach ($this->noms as &$nom) {
Line -... Line 678...
-
 
678
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
-
 
679
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
-
 
680
				$nom_sci_ideal = '';
684
		}
681
				if ($nom['type_epithete'] == 'agg.') {
685
		$noms_erreur = null;
682
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
686
		
683
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
687
		$this->traiterResultatTest($info);
-
 
688
	}
-
 
689
	
-
 
Line 690... Line 684...
690
	private function testerBasionymeSyntaxe() {
684
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
691
		$info = array('nom' => 'basionyme -> syntaxe',
685
				} else {
692
			'description' => "Le champ basionyme contient :\n".
686
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
-
 
687
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
-
 
688
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
-
 
689
				}
-
 
690
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
-
 
691
				if ($nom['nom_sci'] != $nom_sci_ideal) {
-
 
692
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
-
 
693
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
693
								" - une valeur vide,\n".
694
				}
694
								" - un nombre.",
695
			}
695
			'resultat' => false);
696
		}
696
		
697
		
697
		// Réalisation du test
698
		// Analyse des résultats
698
		$noms_erreur = array();
699
		if (count($noms_erreur) > 0) {
Line 699... Line 700...
699
		foreach ($this->noms as &$nom) {
700
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
700
			if ($nom['basionyme'] != '') {
701
			$info['message']['lignes'] = $noms_erreur;
701
				if (!$this->verifierNombre($nom['basionyme'])) {
702
		} else {
702
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
703
			$info['resultat'] = true;
703
				}
704
		}
704
			}
705
		$noms_erreur = null;
705
		}
706
		
706
		
707
		$this->traiterResultatTest($info);
Line 707... Line 708...
707
		// Analyse des résultats
708
	}
708
		if (count($noms_erreur) > 0) {
709
	
Line 709... Line -...
709
			$info['message']['entete'] = array('num_nom', 'basionyme erroné');
-
 
710
			$info['message']['lignes'] = $noms_erreur;
-
 
711
		} else {
-
 
712
			$info['resultat'] = true;
-
 
713
		}
-
 
714
		$noms_erreur = null;
-
 
715
		
-
 
716
		$this->traiterResultatTest($info);
-
 
717
	}
-
 
-
 
710
	/**
718
	
711
	 * Test #17
719
	private function testerHomonymieExistence() {
-
 
720
		$info = array('nom' => 'homonyme -> existence',
-
 
-
 
712
	 */
721
			'description' => "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur ".
713
	private function testerNomCompletEspece() {
722
								"dans le champ nom_sci.",
-
 
723
			'resultat' => false);
-
 
724
		
-
 
725
		$noms_homonymie = $this->classerNomsParNomComplet();
-
 
726
		
714
		$info = $this->getInfosTest(17);
Line 727... Line 715...
727
		// Réalisation du test
715
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
728
		$noms_erreur = array();
716
		
729
		foreach ($this->noms as &$nom) {
717
		// Réalisation du test
730
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
718
		$noms_erreur = array();
731
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
719
		foreach ($this->noms as &$nom) {
732
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
720
			if ($nom['rang'] == $this->manuel['rang_sp']) {
733
				}
721
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
734
			}
722
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
735
		}
723
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
736
		$noms_homonymie = null;
724
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
Line 737... Line 725...
737
		
725
				if ($nom['nom_sci'] != $nom_sci_ideal) {
738
		// Analyse des résultats
726
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
739
		if (count($noms_erreur) > 0) {
727
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
740
			$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
728
				}
741
			$info['message']['lignes'] = $noms_erreur;
729
			}
742
		} else {
730
		}
743
			$info['resultat'] = true;
731
		
744
		}
732
		// Analyse des résultats
Line 745... Line 733...
745
		$noms_erreur = null;
733
		if (count($noms_erreur) > 0) {
746
		
734
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
Line -... Line 735...
-
 
735
			$info['message']['lignes'] = $noms_erreur;
-
 
736
		} else {
-
 
737
			$info['resultat'] = true;
747
		$this->traiterResultatTest($info);
738
		}
748
	}
739
		$noms_erreur = null;
749
	
-
 
750
	private function testerHomonymieSyntaxe() {
-
 
751
		$info = array('nom' => 'homonyme -> syntaxe',
-
 
752
			'description' => "Le champ homonyme contient :\n".
-
 
Line 753... Line 740...
753
				" - une valeur vide,\n".
740
		
754
				" - le chiffre 1.",
741
		$this->traiterResultatTest($info);
755
			'resultat' => false);
742
	}
756
		
743
	
-
 
744
	/**
757
		// Réalisation du test
745
	 * Test #18
758
		$noms_erreur = array();
746
	 */
759
		foreach ($this->noms as &$nom) {
747
	private function testerNomCompletInfraSpecifique() {
760
			if ($nom['homonyme'] != '') {
748
		$info = $this->getInfosTest(18);
761
				if (!$this->verifierBooleen($nom['homonyme'])) {
749
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
Line 762... Line 750...
762
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
750
		
763
				}
751
		// Réalisation du test
764
			}
752
		$noms_erreur = array();
765
		}
753
		foreach ($this->noms as &$nom) {
766
		
754
			if ($nom['rang'] > $this->manuel['rang_sp']) {
767
		// Analyse des résultats
755
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
768
		if (count($noms_erreur) > 0) {
756
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
769
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
757
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
Line 770... Line 758...
770
			$info['message']['lignes'] = $noms_erreur;
758
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
771
		} else {
759
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
Line -... Line 760...
-
 
760
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
-
 
761
				if ($nom['nom_sci'] != $nom_sci_ideal) {
-
 
762
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
772
			$info['resultat'] = true;
763
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
773
		}
764
				}
774
		$noms_erreur = null;
765
			}
775
		
-
 
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".
766
		}
785
			" - point-virgule « ; » (si l'info précédent a été renseignée),\n".
-
 
Line 786... Line 767...
786
			" - abréviation, ou nom, de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom. ".
767
		
787
			"Cette information ne doit pas contenir de caractère virgule « , »,\n".
768
		// Analyse des résultats
788
			" - virgule « , »,\n".
769
		if (count($noms_erreur) > 0) {
789
			" - informations permettant d'identifier plus précisément le document contenant le nom... ".
770
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
790
			"(par exemple, l'éditeur, le tome, le numéro d'édition, le volume...) séparées par des virgules ou d'autres ".
771
			$info['message']['lignes'] = $noms_erreur;
791
			"caractères sauf deux points « : ».\n".
-
 
792
			" - deux points « : »,\n".
772
		} else {
793
			" - numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière ".
773
			$info['resultat'] = true;
794
			"pages de l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
774
		}
795
			"la position du nom dans le document. Le tiret « - » doit toujours servir à séparer un ensemble.",
775
		$noms_erreur = null;
Line 796... Line 776...
796
			'resultat' => false);
776
		
797
		
777
		$this->traiterResultatTest($info);
798
		// Réalisation du test
778
	}
799
		$noms_erreur = array();
779
	
800
		foreach ($this->noms as &$nom) {
780
	/**
801
			if ($nom['biblio_origine'] != '') {
781
	 * Test #19
802
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
782
	 */
803
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
783
	private function testerNomSupraGeneriqueEspaces() {
Line 804... Line 784...
804
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
784
		$info = $this->getInfosTest(19);
805
				}
785
		
Line -... Line 786...
-
 
786
		// Réalisation du test
-
 
787
		$noms_erreur = array();
-
 
788
		foreach ($this->noms as &$nom) {
806
			}
789
			if ($nom['nom_supra_generique'] != '') {
807
		}
790
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
808
		
-
 
809
		// Analyse des résultats
-
 
810
		if (count($noms_erreur) > 0) {
-
 
811
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
-
 
Line 812... Line 791...
812
			$info['message']['lignes'] = $noms_erreur;
791
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
813
		} else {
792
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
814
			$info['resultat'] = true;
793
				}
815
		}
794
			}
816
		$noms_erreur = null;
795
		}
817
		
796
		
818
		$this->traiterResultatTest($info);
797
		// Analyse des résultats
819
	}
798
		if (count($noms_erreur) > 0) {
820
	
799
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
821
	private function testerAnneeSyntaxe() {
800
			$info['message']['lignes'] = $noms_erreur;
Line 822... Line 801...
822
		$info = array('nom' => 'annee -> syntaxe',
801
		} else {
823
			'description' => "Le champ annee doit :\n".
802
			$info['resultat'] = true;
824
			" - contenir un nombre de 4 chiffres,\n".
803
		}
825
			" - être supérieur ou égal à 1753.",
804
		$noms_erreur = null;
826
			'resultat' => false);
805
		
827
		
806
		$this->traiterResultatTest($info);
828
		// Réalisation du test
807
	}
829
		$noms_erreur = array();
808
	
Line 830... Line 809...
830
		foreach ($this->noms as &$nom) {
809
	/**
831
			if ($nom['annee'] != '') {
810
	 * Test #20
Line -... Line 811...
-
 
811
	 */
-
 
812
	private function testerNomSupraGeneriqueSyntaxe() {
-
 
813
		$info = $this->getInfosTest(20);
832
				if (!$this->verifierAnnee($nom['annee'])) {
814
		
833
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
-
 
834
				}
-
 
835
			}
-
 
836
		}
815
		// Réalisation du test
Line 837... Line 816...
837
		
816
		$noms_erreur = array();
838
		// Analyse des résultats
817
		foreach ($this->noms as &$nom) {
839
		if (count($noms_erreur) > 0) {
818
			if ($nom['nom_supra_generique'] != '') {
-
 
819
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
-
 
820
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
-
 
821
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
840
			$info['message']['entete'] = array('num_nom', 'annee erroné');
822
				}
-
 
823
			}
841
			$info['message']['lignes'] = $noms_erreur;
824
		}
-
 
825
		
-
 
826
		// Analyse des résultats
842
		} else {
827
		if (count($noms_erreur) > 0) {
843
			$info['resultat'] = true;
828
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
Line 844... Line 829...
844
		}
829
			$info['message']['lignes'] = $noms_erreur;
845
		$noms_erreur = null;
830
		} else {
846
		
831
			$info['resultat'] = true;
847
		$this->traiterResultatTest($info);
832
		}
848
	}
833
		$noms_erreur = null;
849
	
834
		
850
	private function testerAuteurSyntaxe() {
835
		$this->traiterResultatTest($info);
851
		$info = array('nom' => 'auteur -> syntaxe',
836
	}
Line 852... Line 837...
852
			'description' => "Le champ auteur doit :\n".
837
	
853
			" - contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié à l'origine la combinaison latine courante.\n".
838
	/**
Line -... Line 839...
-
 
839
	 * Test #21
-
 
840
	 */
-
 
841
	private function testerNomSupraGeneriqueRang() {
854
    		" - OU débuter par le mot « sensu » et contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ".
842
		$info = $this->getInfosTest(21);
855
			"ayant publié un nom dont la description ne correspond pas à celle de l'auteur, ou des auteurs, d'origine.\n".
843
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
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".
844
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
857
			" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
-
 
858
			" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
-
 
859
			" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
845
		
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();
-
 
Line 867... Line 846...
867
		foreach ($this->noms as &$nom) {
846
		// Réalisation du test
868
			if ($nom['auteur'] != '') {
847
		$noms_erreur = array();
869
				if (!$this->verifierAuteur($nom['auteur'])) {
848
		foreach ($this->noms as &$nom) {
870
					$intitule_traite = $this->repererEspace($nom['auteur']);
849
			if ($nom['nom_supra_generique'] != '') {
871
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
850
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
872
				}
-
 
873
			}
851
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
874
		}
852
				}
875
		
853
			}
876
		// Analyse des résultats
854
		}
Line 877... Line 855...
877
		if (count($noms_erreur) > 0) {
855
		
878
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
856
		// Analyse des résultats
879
			$info['message']['lignes'] = $noms_erreur;
857
		if (count($noms_erreur) > 0) {
880
		} else {
858
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
881
			$info['resultat'] = true;
859
			$info['message']['lignes'] = $noms_erreur;
882
		}
860
		} else {
883
		$noms_erreur = null;
861
			$info['resultat'] = true;
884
		
862
		}
Line 885... Line 863...
885
		$this->traiterResultatTest($info);
863
		$noms_erreur = null;
886
	}
864
		
887
	
865
		$this->traiterResultatTest($info);
-
 
866
	}
-
 
867
	
-
 
868
	/**
888
	private function testerNomCommercialSyntaxe() {
869
	 * Test #22
889
		$info = array('nom' => 'nom_commercial -> syntaxe',
-
 
890
			'description' => "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du ".
-
 
891
				"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
870
	 */
892
				"qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces.\n",
-
 
Line 893... Line 871...
893
			'resultat' => false);
871
	private function testerGenreEspaces() {
894
		
872
		$info = $this->getInfosTest(22);
895
		// Réalisation du test
873
		
896
		$noms_erreur = array();
874
		// Réalisation du test
-
 
875
		$noms_erreur = array();
897
		foreach ($this->noms as &$nom) {
876
		foreach ($this->noms as &$nom) {
898
			if ($nom['nom_commercial'] != '') {
877
			if ($nom['genre'] != '') {
899
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
878
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
900
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
879
					$nom_traite = $this->repererEspace($nom['genre']);
901
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
880
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
Line 902... Line 881...
902
				}
881
				}
903
			}
882
			}
904
		}
883
		}
905
		
884
		
906
		// Analyse des résultats
885
		// Analyse des résultats
907
		if (count($noms_erreur) > 0) {
886
		if (count($noms_erreur) > 0) {
908
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
887
			$info['message']['entete'] = array('num_nom', 'genre erroné');
909
			$info['message']['lignes'] = $noms_erreur;
888
			$info['message']['lignes'] = $noms_erreur;
Line 910... Line 889...
910
		} else {
889
		} else {
911
			$info['resultat'] = true;
890
			$info['resultat'] = true;
Line -... Line 891...
-
 
891
		}
-
 
892
		$noms_erreur = null;
-
 
893
		
912
		}
894
		$this->traiterResultatTest($info);
913
		$noms_erreur = null;
895
	}
914
		
-
 
915
		$this->traiterResultatTest($info);
-
 
916
	}
-
 
917
	
896
	
918
	private function testerNomCommercialPresenceCultivar() {
897
	/**
919
		$info = array('nom' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
-
 
Line 920... Line 898...
920
			'description' => "Si le champ nom_commercial contient un nom commercial alors le champ cultivar OU ".
898
	 * Test #23
921
				"cultivar_groupe ne doit pas être vide.",
899
	 */
922
			'resultat' => false);
900
	private function testerGenreSyntaxe() {
923
		
901
		$info = $this->getInfosTest(23);
924
		// Réalisation du test
-
 
925
		$noms_erreur = array();
902
		
926
		foreach ($this->noms as &$nom) {
903
		// Réalisation du test
927
			if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
904
		$noms_erreur = array();
928
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
905
		foreach ($this->noms as &$nom) {
929
			}
906
			if ($nom['genre'] != '') {
Line 930... Line 907...
930
		}
907
				$mots = explode(' ', $nom['genre']);
931
		
908
				foreach ($mots as $mot) {
932
		// Analyse des résultats
909
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
933
		if (count($noms_erreur) > 0) {
910
						$nom_traite = $this->repererEspace($nom['genre']);
934
			$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
911
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
935
			$info['message']['lignes'] = $noms_erreur;
912
					}
936
		} else {
913
				}
937
			$info['resultat'] = true;
914
			}
Line 938... Line 915...
938
		}
915
		}
939
		$noms_erreur = null;
916
		
Line -... Line 917...
-
 
917
		// Analyse des résultats
-
 
918
		if (count($noms_erreur) > 0) {
-
 
919
			$info['message']['entete'] = array('num_nom', 'genre erroné');
940
		
920
			$info['message']['lignes'] = $noms_erreur;
941
		$this->traiterResultatTest($info);
-
 
942
	}
-
 
943
	
-
 
944
	private function testerCultivarSyntaxe() {
921
		} else {
Line 945... Line 922...
945
		$info = array('nom' => 'cultivar -> syntaxe',
922
			$info['resultat'] = true;
946
			'description' => "Le champ cultivar_groupe doit contenir :\n".
923
		}
947
				" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature \n".
924
		$noms_erreur = null;
948
				"   des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques \n".
925
		
-
 
926
		$this->traiterResultatTest($info);
949
				"   (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.\n".
927
	}
950
				" - un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet \n".
928
	
951
				"   cyrillique, arabe, chinois...\n".
929
	/**
952
				" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour \n".
930
	 * Test #24
953
				"   les autres mots importants mais pas pour les mots mineurs.\n".
931
	 */
Line 954... Line 932...
954
				"Ne doit pas contenir :\n".
932
	private function testerGenreRang() {
955
				" - cv., convar. ou de guillemets simples (').\n",
933
		$info = $this->getInfosTest(24);
956
			'resultat' => false);
934
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
957
		
935
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
958
		// Réalisation du test
936
		
959
		$noms_erreur = array();
937
		// Réalisation du test
960
		foreach ($this->noms as &$nom) {
938
		$noms_erreur = array();
961
			if ($nom['cultivar'] != '') {
939
		foreach ($this->noms as &$nom) {
Line 962... Line 940...
962
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
940
			if ($nom['genre'] != '') {
963
					$epithete_traite = $this->repererEspace($nom['cultivar']);
941
				if ($nom['rang'] < $this->manuel['rang_genre']) {
Line -... Line 942...
-
 
942
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
-
 
943
				}
-
 
944
			}
964
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
945
		}
965
				}
-
 
966
			}
-
 
967
		}
-
 
968
		
946
		
Line 969... Line 947...
969
		// Analyse des résultats
947
		// Analyse des résultats
970
		if (count($noms_erreur) > 0) {
948
		if (count($noms_erreur) > 0) {
971
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
949
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
972
			$info['message']['lignes'] = $noms_erreur;
950
			$info['message']['lignes'] = $noms_erreur;
973
		} else {
951
		} else {
974
			$info['resultat'] = true;
952
			$info['resultat'] = true;
975
		}
953
		}
976
		$noms_erreur = null;
954
		$noms_erreur = null;
977
		
955
		
978
		$this->traiterResultatTest($info);
956
		$this->traiterResultatTest($info);
Line 979... Line 957...
979
	}
957
	}
980
	
958
		
981
	private function testerCultivarRang() {
959
	/**
982
		$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
960
	 * Test #25
983
			'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à ". 
961
	 */
984
								"{$this->manuel['rang_genre']}.",
962
	private function testerEpitheteInfraGeneriqueSyntaxe() {
985
			'resultat' => false);
963
		$info = $this->getInfosTest(25);
986
		
964
		
Line 987... Line 965...
987
		// Réalisation du test
965
		// Réalisation du test
988
		$noms_erreur = array();
966
		$noms_erreur = array();
Line -... Line 967...
-
 
967
		foreach ($this->noms as &$nom) {
-
 
968
			if ($nom['epithete_infra_generique'] != '') {
-
 
969
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
989
		foreach ($this->noms as &$nom) {
970
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
990
			if ($nom['cultivar'] != '') {
971
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
991
				if ($nom['rang'] < $this->manuel['rang_genre']) {
-
 
992
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
-
 
993
				}
-
 
994
			}
-
 
995
		}
-
 
996
		
-
 
997
		// Analyse des résultats
-
 
Line 998... Line 972...
998
		if (count($noms_erreur) > 0) {
972
				}
999
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
973
			}
1000
			$info['message']['lignes'] = $noms_erreur;
974
		}
1001
		} else {
975
		
1002
			$info['resultat'] = true;
976
		// Analyse des résultats
1003
		}
977
		if (count($noms_erreur) > 0) {
1004
		$noms_erreur = null;
978
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
1005
		
979
			$info['message']['lignes'] = $noms_erreur;
1006
		$this->traiterResultatTest($info);
980
		} else {
1007
	}
981
			$info['resultat'] = true;
1008
	
982
		}
1009
	private function testerGroupeCultivarSyntaxe() {
983
		$noms_erreur = null;
1010
		$info = array('nom' => 'cultivar_groupe -> syntaxe',
984
		
Line 1011... Line 985...
1011
			'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
985
		$this->traiterResultatTest($info);
1012
				"du code des plantes cultivées, c.-à-d. composer de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
986
	}
1013
				"signes diacritiques et marques de ponctuations.\n".
987
	
1014
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
988
	/**
1015
				"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
989
	 * Test #26
1016
			'resultat' => false);
990
	 */
1017
		
991
	private function testerEpitheteInfraGeneriqueRang() {
1018
		// Réalisation du test
992
		$info = $this->getInfosTest(26);
Line 1019... Line 993...
1019
		$noms_erreur = array();
993
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
1020
		foreach ($this->noms as &$nom) {
994
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
Line -... Line 995...
-
 
995
		
-
 
996
		// Réalisation du test
-
 
997
		$noms_erreur = array();
1021
			if ($nom['cultivar_groupe'] != '') {
998
		foreach ($this->noms as &$nom) {
-
 
999
			if ($nom['epithete_infra_generique'] != '') {
1022
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
1000
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
1023
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
1001
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1024
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
Line 1025... Line 1002...
1025
				}
1002
				}
1026
			}
1003
			}
1027
		}
1004
		}
1028
		
1005
		
1029
		// Analyse des résultats
1006
		// Analyse des résultats
1030
		if (count($noms_erreur) > 0) {
1007
		if (count($noms_erreur) > 0) {
1031
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
1008
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
1032
			$info['message']['lignes'] = $noms_erreur;
1009
			$info['message']['lignes'] = $noms_erreur;
1033
		} else {
1010
		} else {
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 -... Line 1223...
-
 
1223
	private function testerEpitheteInfraSpEspaces() {
1245
			'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
1224
		$info = $this->getInfosTest(34);
-
 
1225
		
1246
			'resultat' => false);
1226
		// Réalisation du test
-
 
1227
		$noms_erreur = array();
-
 
1228
		foreach ($this->noms as &$nom) {
-
 
1229
			if ($nom['epithete_infra_sp'] != '') {
-
 
1230
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
-
 
1231
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
-
 
1232
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
-
 
1233
				}
-
 
1234
			}
1247
		
1235
		}
-
 
1236
		
-
 
1237
		// Analyse des résultats
-
 
1238
		if (count($noms_erreur) > 0) {
1248
		$nbre_colonnes = count($colonnes);
1239
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1249
		$info['message'] = $nbre_colonnes;
1240
			$info['message']['lignes'] = $noms_erreur;
-
 
1241
		} else {
-
 
1242
			$info['resultat'] = true;
1250
		if ($nbre_colonnes >= 35) {
1243
		}
1251
			$info['resultat'] = true;
-
 
1252
		}
1244
		$noms_erreur = null;
Line 1253... Line -...
1253
		$this->traiterResultatTest($info);
-
 
1254
		return ($info['resultat'] ? '1' : '0');
-
 
1255
	}
-
 
1256
	
-
 
-
 
1245
		
1257
	private function testerNomDesChamps($colonnes) {
1246
		$this->traiterResultatTest($info);
1258
		$info = array('nom' => 'Structure -> noms des champs',
1247
	}
1259
			'description' => 'Les noms des champs de la table contenant le référentiel doivent être conformes à ceux '. 
1248
	
1260
								'définis par le manuel technique.',
1249
	/**
1261
			'resultat' => false);
-
 
1262
		
-
 
1263
		$champs_attendus = explode(',', $this->manuel['champs']);
-
 
Line 1264... Line 1250...
1264
		$champs_presents = array();
1250
	 * Test #35
1265
		foreach ($colonnes as $colonne) {
1251
	 */
1266
			$champs_presents[$colonne['Field']] = $colonne;
1252
	private function testerEpitheteInfraSpSyntaxe() {
1267
		}
1253
		$info = $this->getInfosTest(35);
1268
		
1254
		
1269
		$ok = true;
1255
		// Réalisation du test
-
 
1256
		$noms_erreur = array();
-
 
1257
		foreach ($this->noms as &$nom) {
-
 
1258
			if ($nom['epithete_infra_sp'] != '') {
-
 
1259
				$mots = explode(' ', $nom['epithete_infra_sp']);
-
 
1260
				foreach ($mots as $mot) {
1270
		$champs_manquant = array(); 
1261
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1271
		foreach ($champs_attendus as $champ_attendu) {
1262
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
-
 
1263
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1272
			if (!isset($champs_presents[$champ_attendu])) {
1264
					}
1273
				$champs_manquant[] = $champ_attendu; 
1265
				}
1274
				$ok = false;
1266
			}
-
 
1267
		}
-
 
1268
		
-
 
1269
		// Analyse des résultats
1275
			}
1270
		if (count($noms_erreur) > 0) {
-
 
1271
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
Line 1276... Line 1272...
1276
		}
1272
			$info['message']['lignes'] = $noms_erreur;
1277
		$info['resultat'] = $ok;
-
 
1278
		if (!$ok) {
1273
		} else {
Line 1279... Line -...
1279
			$info['message'] = 'Champs manquants : '.implode(', ', $champs_manquant).'.';
-
 
1280
		}
-
 
1281
		
-
 
1282
		$this->traiterResultatTest($info);
-
 
-
 
1274
			$info['resultat'] = true;
1283
		return ($info['resultat'] ? '1' : '0');
1275
		}
1284
	}
1276
		$noms_erreur = null;
1285
	
1277
		
1286
	private function testerTypeDesChamps($colonnes) {
1278
		$this->traiterResultatTest($info);
1287
		$info = array('nom' => 'Structure -> types des champs',
1279
	}
1288
			'description' => 'Les types des champs de la table contenant le référentiel doivent être conformes à ceux '.
1280
	
1289
								'définis par le manuel technique.',
-
 
Line 1290... Line 1281...
1290
			'resultat' => false);
1281
	/**
1291
		
1282
	 * Test #36
1292
		$champs_attendus = explode(',', $this->manuel['champs_type']);
1283
	 */
1293
		$champs_presents = array();
-
 
1294
		foreach ($colonnes as $colonne) {
-
 
1295
			$champs_presents[$colonne['Field']] = $colonne['Type'];
-
 
1296
		}
1284
	private function testerEpitheteInfraSpRang() {
1297
		
1285
		$info = $this->getInfosTest(36);
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
			
1286
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_sp']);
1304
			if (isset($champs_presents[$champ_attendu_nom])) {
1287
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
1305
				$champs_present_type = $champs_presents[$champ_attendu_nom];
1288
		
1306
				
1289
		// Réalisation du test
Line 1307... Line 1290...
1307
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
1290
		$noms_erreur = array();
1308
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
1291
		foreach ($this->noms as &$nom) {
1309
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) 
1292
			if ($nom['epithete_infra_sp'] != '') {
-
 
1293
				if ($nom['rang'] < $this->manuel['rang_sp']) {
1310
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
1294
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
1311
					$champs_erreur[] = $champ_attendu." vaut ".$champs_present_type;
1295
				}
1312
				}
1296
			}
-
 
1297
		}
Line 1313... Line 1298...
1313
			}
1298
		
1314
		}
-
 
1315
		
1299
		// Analyse des résultats
Line 1316... Line 1300...
1316
		// Analyse des résultats
1300
		if (count($noms_erreur) > 0) {
1317
		if (count($champs_erreur) > 0) {
1301
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
-
 
1302
			$info['message']['lignes'] = $noms_erreur;
-
 
1303
		} else {
1318
			$info['message'] = "Champs n'ayant pas un type conforme : ".implode(', ', $champs_erreur).'.';
1304
			$info['resultat'] = true;
1319
		} else {
1305
		}
1320
			$info['resultat'] = true;
1306
		$noms_erreur = null;
1321
		}
1307
		
Line 1322... Line 1308...
1322
		
1308
		$this->traiterResultatTest($info);
1323
		$this->traiterResultatTest($info);
-
 
1324
		return ($info['resultat'] ? '1' : '0');
-
 
1325
	}
-
 
1326
	
-
 
1327
	private function testerTailleDesChamps($colonnes, $analyses) {
-
 
1328
		$info = array('nom' => 'Structure -> champs tronqués',
-
 
1329
			'description' => "Evalue le risque que des données de type texte aient pu être tronquées lors de leur insertion.\n".
1309
	}
1330
				"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
1310
	
1331
				"sur un problème éventuel.",
-
 
1332
			'resultat' => false);
-
 
1333
		
-
 
1334
		$tailles_champs_maxi = array();
-
 
1335
		foreach ($colonnes as $colonne) {
-
 
1336
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
-
 
1337
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
-
 
1338
			}
1311
private function testerStatutCultureSyntaxe() {
1339
		}
-
 
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".
1344
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
1316
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
Line 1345... Line 1317...
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) {
1351
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
1323
			if ($nom['statut_culture'] != '') {
-
 
1324
				if (!$this->verifierStatutCulture($nom['statut_culture'])) {
Line 1352... Line 1325...
1352
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
1325
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
1353
					$champs_erreur[] = $champ_attendu;
1326
				}
Line 1354... Line 1327...
1354
				}
1327
			}
1355
			}
1328
		}
1356
		}
1329
		
-
 
1330
		// Analyse des résultats
-
 
1331
		if (count($noms_erreur) > 0) {
-
 
1332
			$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
-
 
1333
			$info['message']['lignes'] = $noms_erreur;
1357
		
1334
		} else {
Line -... Line 1335...
-
 
1335
			$info['resultat'] = true;
-
 
1336
		}
1358
		// Analyse des résultats
1337
		$noms_erreur = null;
1359
		if (count($champs_erreur) > 0) {
1338
		
-
 
1339
		$this->traiterResultatTest($info);
1360
			$info['message'] = "Champs possédant des enregistrements qui atteignent la taille maximum autorisée : ".
1340
	}
-
 
1341
	
1361
								implode(', ', $champs_erreur).'.';
1342
	private function testerStatutIntroductionSyntaxe() {
1362
		} else {
1343
		$info = array('nom' => 'statut_introduction -> syntaxe',
Line -... Line 1344...
-
 
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
-
 
1352
		$noms_erreur = array();
1363
			$info['resultat'] = true;
1353
		foreach ($this->noms as &$nom) {
1364
		}
-
 
1365
		
1354
			if ($nom['statut_introduction'] != '') {
Line 1366... Line 1355...
1366
		$this->traiterResultatTest($info);
1355
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
1367
	}
1356
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
1368
	
1357
				}
-
 
1358
			}
-
 
1359
		}
-
 
1360
		
-
 
1361
		// Analyse des résultats
1369
	private function testerNumNomClePrimaire($colonnes) {
1362
		if (count($noms_erreur) > 0) {
Line 1370... Line 1363...
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 {
1373
		
1366
			$info['resultat'] = true;
-
 
1367
		}
1374
		foreach ($colonnes as $colonne) {
1368
		$noms_erreur = null;
-
 
1369
		
1375
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
1370
		$this->traiterResultatTest($info);
1376
				$info['resultat'] = true;
1371
	}
Line 1377... Line 1372...
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".
1383
	
1378
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
-
 
1379
								"un code de présence spécifique au référentiel.",
Line 1384... Line 1380...
1384
	private function testerNumNomSuperieurAZero() {
1380
			'resultat' => false);
1385
		$info = array('nom' => 'num_nom -> supérieur à 0',
1381
		
Line 1386... Line 1382...
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();
1388
		
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
				}
1389
		// Réalisation du test
1389
			}
Line 1390... Line 1390...
1390
		$noms_erreur = array();
1390
		}
1391
		foreach ($this->noms as &$nom) {
1391
		
1392
			if ($nom['num_nom'] <= 0) {
1392
		// Analyse des résultats
-
 
1393
		if (count($noms_erreur) > 0) {
1393
				$noms_erreur[] = $nom['num_nom'];
1394
			$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
1394
			}
1395
			$info['message']['lignes'] = $noms_erreur;
-
 
1396
		} else {
1395
		}
1397
			$info['resultat'] = true;
1396
		
1398
		}
Line 1397... Line 1399...
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() {
1403
		}
1405
		$info = array('nom' => 'presence -> syntaxe',
-
 
1406
			'description' => "Le champ presence contient soit :\n".
Line 1404... Line 1407...
1404
		
1407
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
1405
		$this->traiterResultatTest($info);
1408
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
Line 1406... Line 1409...
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
		
1410
			'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
1413
		// Réalisation du test
Line 1411... Line 1414...
1411
			'resultat' => false);
1414
		$noms_erreur = array();
1412
		
1415
		foreach ($this->noms as &$nom) {
1413
		// Réalisation du test
1416
			if ($nom['presence'] != '') {
1414
		$noms_erreur = array();
1417
				if (!$this->verifierPresence($nom['presence'])) {
-
 
1418
					$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
1415
		foreach ($this->noms as &$nom) {
1419
				}
-
 
1420
			}
1416
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
1421
		}
1417
				$noms_erreur[] = $nom['num_nom'];
1422
		
Line 1418... Line 1423...
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;
1424
								implode(', ', $noms_erreur).'.';
1429
		}
-
 
1430
		$noms_erreur = null;
Line 1425... Line 1431...
1425
		} else {
1431
		
1426
			$info['resultat'] = true;
1432
		$this->traiterResultatTest($info);
Line 1427... Line 1433...
1427
		}
1433
	}
1428
		
1434
	
1429
		$this->traiterResultatTest($info);
1435
	private function testerHybrideParent02Existence() {
1430
	}
1436
		$info = array('nom' => 'hybride_parent_02 -> existence',
-
 
1437
			'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur ".
1431
	
1438
								"du champ num_nom.",
Line 1432... Line 1439...
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();
1436
			'resultat' => false);
1443
		foreach ($this->noms as &$nom) {
-
 
1444
			if ($nom['hybride_parent_02'] != '') {
-
 
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']));
1438
		// Réalisation du test
1447
				}
Line 1439... Line 1448...
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');
1445
		
1454
			$info['message']['lignes'] = $noms_erreur;
-
 
1455
		} else {
Line 1446... Line 1456...
1446
		// Analyse des résultats
1456
			$info['resultat'] = true;
1447
		if (count($noms_erreur) > 1) {
1457
		}
Line -... Line 1458...
-
 
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
	
1452
		}
1463
	private function testerHybrideParent02Syntaxe() {
Line 1453... Line 1464...
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();
1461
			'resultat' => false);
1472
		foreach ($this->noms as &$nom) {
Line 1462... Line 1473...
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
		}
1468
			}
1479
		
-
 
1480
		// Analyse des résultats
Line 1469... Line 1481...
1469
		}
1481
		if (count($noms_erreur) > 0) {
1470
		
1482
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
Line 1471... Line 1483...
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;
1474
								"valeur dans num_tax_sup : ".implode(', ', $noms_erreur).'.';
1486
		}
-
 
1487
		$noms_erreur = null;
1475
		} else {
1488
		
Line 1476... Line 1489...
1476
			$info['resultat'] = true;
1489
		$this->traiterResultatTest($info);
1477
		}
1490
	}
1478
		
1491
	
1479
		$this->traiterResultatTest($info);
1492
	
1480
	}
1493
	private function testerHybrideParent01Existence() {
1481
	
1494
		$info = array('nom' => 'hybride_parent_01 -> existence',
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
		
-
 
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.",
1490
		foreach ($this->noms as &$nom) {
1497
			'resultat' => false);
Line 1491... Line 1498...
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
1493
					$noms_erreur[] = $nom['num_nom'];
1500
		$noms_erreur = array();
-
 
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']])) {
1496
		}
1504
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
-
 
1505
				}
Line 1497... Line 1506...
1497
		
1506
			}
1498
		// Analyse des résultats
1507
		}
Line 1499... Line 1508...
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');
1503
			$info['resultat'] = true;
1512
			$info['message']['lignes'] = $noms_erreur;
Line 1504... Line 1513...
1504
		}
1513
		} else {
1505
		
1514
			$info['resultat'] = true;
1506
		$this->traiterResultatTest($info);
-
 
1507
	}
1515
		}
1508
	
1516
		$noms_erreur = null;
1509
	private function testerClassificationRang() {
1517
		
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
		foreach ($this->noms as &$nom) {
1518
		$this->traiterResultatTest($info);
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']];
-
 
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)) {
1521
	private function testerHybrideParent01Syntaxe() {
1524
							$noms_erreur[] = $nom['num_nom'];
-
 
Line 1525... Line 1522...
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
		
1531
		// Analyse des résultats
1528
		// Réalisation du test
-
 
1529
		$noms_erreur = array();
Line 1532... Line 1530...
1532
		if (count($noms_erreur) > 0) {
1530
		foreach ($this->noms as &$nom) {
1533
			$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
1531
			if ($nom['hybride_parent_01'] != '') {
Line 1534... Line 1532...
1534
		} else {
1532
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
1535
			$info['resultat'] = true;
1533
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
1536
		}
-
 
1537
		
1534
				}
1538
		$this->traiterResultatTest($info);
1535
			}
1539
	}
1536
		}
1540
	
-
 
1541
	private function testerClassification() {
-
 
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.",
1539
		if (count($noms_erreur) > 0) {
1545
			'resultat' => false);
-
 
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']) {
1545
		$noms_erreur = null;
1552
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
-
 
1553
					$this->noms_ok[$nom['num_nom']] = true;
1546
		
-
 
1547
		$this->traiterResultatTest($info);
-
 
1548
	}
-
 
1549
	
-
 
1550
	private function testerSynonymeOrthographiqueExistence() {
-
 
1551
		$info = array('nom' => 'synonyme_orthographique -> existence',
-
 
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);
1556
					$classif_ok = $this->remonterClassif($nom);
1555
		
-
 
1556
		// Réalisation du test
-
 
1557
		$noms_erreur = array();
-
 
1558
		foreach ($this->noms as &$nom) {
1557
					unset($this->detection_boucle_infini); 
1559
			if ($nom['synonyme_orthographique'] != '') {
Line 1558... Line 1560...
1558
					
1560
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
1559
					if ($classif_ok === false) {
1561
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
1560
						$noms_erreur[] = $nom['num_nom'];
1562
				}
-
 
1563
			}
-
 
1564
		}
1561
					} else {
1565
		
Line 1562... Line -...
1562
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
-
 
1563
					}
-
 
1564
				}
1566
		// Analyse des résultats
1565
			}
1567
		if (count($noms_erreur) > 0) {
1566
		}
1568
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
1567
		unset($this->noms_ok);
1569
			$info['message']['lignes'] = $noms_erreur;
-
 
1570
		} else {
1568
		
1571
			$info['resultat'] = true;
-
 
1572
		}
1569
		// Analyse des résultats
1573
		$noms_erreur = null;
1570
		if (count($noms_erreur) > 0) {
1574
		
Line 1571... Line 1575...
1571
			$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".
1575
		$this->traiterResultatTest($info);
1572
								implode(', ', $noms_erreur).'.';
1576
	}
1573
		} else {
1577
	
-
 
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".
1576
		
1581
								" - une valeur vide,\n".
-
 
1582
								" - un nombre.",
Line 1577... Line 1583...
1577
		$this->traiterResultatTest($info);
1583
			'resultat' => false);
1578
	}
1584
		
Line -... Line 1585...
-
 
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']);
1584
				$this->noms_ok[$nom['num_nom']] = true;
1591
				}
Line 1585... Line 1592...
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;
1594
		
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']])) {
-
 
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 {
1597
				}
1600
			$info['resultat'] = true;
Line 1598... Line 1601...
1598
				return $retour;
1601
		}
1599
			}
1602
		$noms_erreur = null;
1600
		} else {
1603
		
1601
			return false;
1604
		$this->traiterResultatTest($info);
1602
		}
1605
	}
1603
	}
1606
	
1604
	
1607
	private function testerSynonymeMalAppliqueSyntaxe() {
-
 
1608
		$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
Line 1605... Line 1609...
1605
	private function testerRang() {
1609
			'description' => "Le champ synonyme_mal_applique contient soit :\n".
1606
		$info = array('nom' => 'rang',
1610
			" - une valeur vide,\n".
Line 1607... Line 1611...
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
		
1613
		
1610
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
-
 
1611
		
1614
		// Réalisation du test
Line 1612... Line 1615...
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']])) {
1618
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
1616
				$noms_erreur[] = $nom['num_nom'];
-
 
1617
			}
-
 
1618
		}
-
 
1619
		
-
 
1620
		// Analyse des résultats
-
 
1621
		if (count($noms_erreur) > 0) {
1619
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
1622
			$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
-
 
1623
		} else {
1620
				}
1624
			$info['resultat'] = true;
1621
			}
Line 1625... Line 1622...
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
		}
1634
								"nom_commercial peuvent s'y ajouter.",
1631
		$noms_erreur = null;
Line -... Line 1632...
-
 
1632
		
1635
			'resultat' => false);
1633
		$this->traiterResultatTest($info);
1636
		
1634
	}
1637
		// Réalisation du test
1635
	
1638
		$noms_erreur = array();
1636
	
1639
		foreach ($this->noms as &$nom) {
-
 
1640
			if ($nom['rang'] < $this->manuel['rang_genre']) {
-
 
1641
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
-
 
1642
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
1637
	private function testerSynonymeDouteuxSyntaxe() {
Line 1643... Line 1638...
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
		}
1644
		// Réalisation du test
1650
		
1645
		$noms_erreur = array();
1651
		// Analyse des résultats
-
 
1652
		if (count($noms_erreur) > 0) {
1646
		foreach ($this->noms as &$nom) {
1653
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1647
			if ($nom['synonyme_douteux'] != '') {
1654
			$info['message']['lignes'] = $noms_erreur;
-
 
1655
		} else {
-
 
1656
			$info['resultat'] = true;
-
 
1657
		}
1648
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
1658
		
-
 
1659
		$this->traiterResultatTest($info);
1649
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
1660
	}
-
 
1661
	
1650
				}
1662
	private function testerNomCompletGenre() {
1651
			}
1663
		$info = array('nom' => 'nom_sci -> noms de genres',
1652
		}
1664
			'description' => "Si le rang est = à {$this->manuel['rang_genre']}, le nom_sci doit correspondre à la valeur du champ genre. ".
1653
		
Line 1665... Line 1654...
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
		}
1672
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
1661
		$noms_erreur = null;
Line 1673... Line 1662...
1673
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
1662
		
1674
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
1663
		$this->traiterResultatTest($info);
Line 1675... Line 1664...
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() {
1678
				}
1667
		$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
-
 
1668
			'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
1679
			}
1669
			'resultat' => false);
1680
		}
1670
		
Line 1681... Line 1671...
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é');
1674
			if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
1685
			$info['message']['lignes'] = $noms_erreur;
-
 
1686
		} else {
1675
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
1687
			$info['resultat'] = true;
-
 
1688
		}
-
 
1689
		
-
 
1690
		$this->traiterResultatTest($info);
-
 
1691
	}
1676
			}
1692
	
1677
		}
1693
	private function testerNomCompletInfraGenre() {
1678
		
1694
		$info = array('nom' => 'nom_sci -> noms infra-génériques',
1679
		// Analyse des résultats
Line 1695... Line 1680...
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;
1702
		// Réalisation du test
1687
		$this->traiterResultatTest($info);
Line 1703... Line 1688...
1703
		$noms_erreur = array();
1688
	}
1704
		foreach ($this->noms as &$nom) {
1689
	
Line 1705... Line 1690...
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 = '';
1692
		$info = array('nom' => 'synonyme_proparte -> existence',
1708
				if ($nom['type_epithete'] == 'agg.') {
-
 
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 ".
1710
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
1694
								"doit correspondre à une valeur du champ num_nom.",
Line 1711... Line 1695...
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'];
1698
		$noms_erreur = array();
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);
-
 
1721
				}
1699
		foreach ($this->noms as &$nom) {
1722
			}
-
 
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();
1726
		if (count($noms_erreur) > 0) {
1703
				foreach ($num_nom_a_verifier as $num_nom) {
Line 1727... Line 1704...
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
				}
1734
		$this->traiterResultatTest($info);
1711
			}
Line 1735... Line 1712...
1735
	}
1712
		}
1736
	
1713
		
Line 1737... Line 1714...
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) {
1739
			'description' => "Si le rang est = à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
1716
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
-
 
1717
			$info['message']['lignes'] = $noms_erreur;
-
 
1718
		} else {
1740
				" genre + ' ' + epithete_sp \n".
1719
			$info['resultat'] = true;
Line 1741... Line 1720...
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
1723
		$this->traiterResultatTest($info);
1745
		$noms_erreur = array();
-
 
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',
1750
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1728
			'description' => "Le champ synonyme_proparte contient soit :\n".
Line 1751... Line 1729...
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();
1758
		
1736
		foreach ($this->noms as &$nom) {
Line 1759... Line 1737...
1759
		// Analyse des résultats
1737
			if ($nom['synonyme_proparte'] != '') {
1760
		if (count($noms_erreur) > 0) {
1738
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
Line -... Line 1739...
-
 
1739
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
-
 
1740
				}
-
 
1741
			}
1761
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
1742
		}
1762
			$info['message']['lignes'] = $noms_erreur;
1743
		
1763
		} else {
1744
		// Analyse des résultats
-
 
1745
		if (count($noms_erreur) > 0) {
1764
			$info['resultat'] = true;
1746
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
-
 
1747
			$info['message']['lignes'] = $noms_erreur;
1765
		}
1748
		} else {
1766
		$noms_erreur = null;
1749
			$info['resultat'] = true;
Line 1767... Line 1750...
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 ".
1776
			'resultat' => false);
1759
								"num_nom.",
Line 1777... Line 1760...
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']])) {
1784
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
1767
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
Line 1785... Line 1768...
1785
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
1768
				}
1786
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
1769
			}
Line -... Line 1770...
-
 
1770
		}
-
 
1771
		
-
 
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');
1789
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
1775
			$info['message']['lignes'] = $noms_erreur;
-
 
1776
		} else {
1790
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
1777
			$info['resultat'] = true;
Line 1791... Line 1778...
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',
1799
		} else {
1786
			'description' => "Le champ basionyme contient :\n".
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
			}
1970
		}
1969
		}
-
 
1970
		
-
 
1971
		// Analyse des résultats
-
 
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;
1975
			$info['message']['lignes'] = $noms_erreur;
1977
		}
Line 1976... Line 1978...
1976
		} else {
1978
		$noms_erreur = null;
1977
			$info['resultat'] = true;
1979
		
1978
		}
1980
		$this->traiterResultatTest($info);
1979
		$noms_erreur = null;
-
 
1980
		
1981
	}
1981
		$this->traiterResultatTest($info);
-
 
1982
	}
1982
	
1983
		
-
 
1984
	private function testerEpitheteInfraGeneriqueSyntaxe() {
1983
	/**
1985
		$info = array('nom' => 'epithete_infra_generique -> syntaxe',
1984
	 * Test #42
Line 1986... Line 1985...
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
		
1993
			if ($nom['epithete_infra_generique'] != '') {
1992
		// Réalisation du test
Line 1994... Line 1993...
1994
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
1993
		$noms_erreur = array();
1995
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1994
		foreach ($this->noms as &$nom) {
Line -... Line 1995...
-
 
1995
			if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
-
 
1996
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
-
 
1997
			}
1996
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1998
		}
-
 
1999
		
-
 
2000
		// Analyse des résultats
1997
				}
2001
		if (count($noms_erreur) > 0) {
-
 
2002
			$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
1998
			}
2003
			$info['message']['lignes'] = $noms_erreur;
-
 
2004
		} else {
-
 
2005
			$info['resultat'] = true;
-
 
2006
		}
-
 
2007
		$noms_erreur = null;
-
 
2008
		
-
 
2009
		$this->traiterResultatTest($info);
1999
		}
2010
	}
2000
		
2011
	
Line 2001... Line 2012...
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
	 */
2004
			$info['message']['lignes'] = $noms_erreur;
2015
	private function testerAuteurSyntaxe() {
-
 
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".
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".
Line 2010... Line 2022...
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);
2017
			'resultat' => false);
2029
		
Line 2018... Line 2030...
2018
		
2030
		// Réalisation du test
2019
		// Réalisation du test
2031
		$noms_erreur = array();
Line -... Line 2032...
-
 
2032
		foreach ($this->noms as &$nom) {
-
 
2033
			if ($nom['auteur'] != '') {
-
 
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);
2022
			if ($nom['epithete_infra_generique'] != '') {
2037
				}
-
 
2038
			}
-
 
2039
		}
2023
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
2040
		
Line 2024... Line 2041...
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
		}
2044
			$info['message']['lignes'] = $noms_erreur;
2028
		
-
 
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;
2033
		} else {
2049
		
Line 2034... Line 2050...
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() {
2041
	private function testerEpitheteInfraGeneriqueEspaces() {
2057
		$info = array('nom' => 'annee -> syntaxe',
Line 2042... Line 2058...
2042
		$info = array('nom' => 'epithete_infra_generique -> espaces en trop',
2058
			'description' => "Le champ annee doit :\n".
2043
			'description' => "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou après sa valeur.",
2059
			" - contenir un nombre de 4 chiffres,\n".
Line -... Line 2060...
-
 
2060
			" - être supérieur ou égal à 1753.",
-
 
2061
			'resultat' => false);
-
 
2062
		
2044
			'resultat' => false);
2063
		// Réalisation du test
2045
		
2064
		$noms_erreur = array();
2046
		// Réalisation du test
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 {
-
 
2078
			$info['resultat'] = true;
2047
		$noms_erreur = array();
2079
		}
2048
		foreach ($this->noms as &$nom) {
2080
		$noms_erreur = null;
Line 2049... Line 2081...
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',
2058
		if (count($noms_erreur) > 0) {
2090
			'description' => "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères ".
Line 2059... Line 2091...
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".
2066
		$this->traiterResultatTest($info);
2098
			" - informations permettant d'identifier plus précisément le document contenant le nom... ".
Line 2067... Line 2099...
2067
	}
2099
			"(par exemple, l'éditeur, le tome, le numéro d'édition, le volume...) séparées par des virgules ou d'autres ".
2068
	
2100
			"caractères sauf deux points « : ».\n".
Line -... Line 2101...
-
 
2101
			" - deux points « : »,\n".
-
 
2102
			" - numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière ".
-
 
2103
			"pages de l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
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".
2106
		
2072
				"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
-
 
2073
			'resultat' => false);
2107
		// Réalisation du test
2074
		
-
 
2075
		// Réalisation du test
-
 
2076
		$noms_erreur = array();
2108
		$noms_erreur = array();
2077
		foreach ($this->noms as &$nom) {
-
 
2078
			if ($nom['epithete_sp'] != '') {
-
 
2079
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
2109
		foreach ($this->noms as &$nom) {
Line 2080... Line 2110...
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
			}
2113
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
2084
		}
-
 
2085
		
-
 
2086
		// Analyse des résultats
-
 
2087
		if (count($noms_erreur) > 0) {
2114
				}
2088
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2115
			}
2089
			$info['message']['lignes'] = $noms_erreur;
-
 
2090
		} else {
2116
		}
2091
			$info['resultat'] = true;
2117
		
2092
		}
2118
		// Analyse des résultats
Line 2093... Line 2119...
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;
2100
			'description' => "Le champ epithete_sp peut contenir :\n".
2126
		
Line 2101... Line 2127...
2101
			 	" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
2127
		$this->traiterResultatTest($info);
2102
				"   Il commence par une lettre minuscule [a-zëï].\n". 
2128
	}
Line -... Line 2129...
-
 
2129
	
-
 
2130
	/**
-
 
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() {
2105
				"   ou d'un seul caractère majuscule (A-Z) \n".
2134
		$info = array('nom' => 'homonyme -> syntaxe',
-
 
2135
			'description' => "Le champ homonyme contient :\n".
2106
				" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) \n".
2136
				" - une valeur vide,\n".
Line -... Line 2137...
-
 
2137
				" - le chiffre 1.",
-
 
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
				}
2115
				foreach ($mots as $mot) {
2147
			}
-
 
2148
		}
Line 2116... Line 2149...
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;
2123
		
2156
		}
Line 2124... Line 2157...
2124
		// Analyse des résultats
2157
		$noms_erreur = null;
2125
		if (count($noms_erreur) > 0) {
2158
		
Line -... Line 2159...
-
 
2159
		$this->traiterResultatTest($info);
-
 
2160
	}
2126
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
2161
	
2127
			$info['message']['lignes'] = $noms_erreur;
2162
	/**
-
 
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 ".
2132
		
2168
								"dans le champ nom_sci.",
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
?>