Subversion Repositories Applications.referentiel

Compare Revisions

Ignore whitespace Rev 318 → Rev 344

/branches/v2.0-betulales/scripts/modules/tests/squelettes/message_p.tpl.html
New file
0,0 → 1,0
<p><?=$message?></p>
/branches/v2.0-betulales/scripts/modules/tests/squelettes/message_table.tpl.html
New file
0,0 → 1,28
<?php if (isset($erreur)) : ?>
<p class="attention"><?=$erreur?></p>
<?php endif; ?>
<table>
<caption><?=count($message['lignes'])?> lignes en erreur</caption>
<thead>
<tr>
<?php foreach ($message['entete'] as $num => $entete) : ?>
<th<?=(isset($message['title'][$num]) && !empty($message['title'][$num])) ? ' title="'.$message['title'][$num].'"' : ''?>><?=$entete?></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($message['lignes'] as $num => $ligne) : ?>
<tr>
<?php foreach ($ligne as $num => $info) : ?>
<td>
<?php $entete = explode(" ",$message['entete'][$num]) ; if (preg_match('/^(num_nom|num_nom_retenu|num_tax_sup)$/', $entete[0])) : ?>
<a href="{numNom::<?=$info?>}" title="Voir la fiche du nom"><?=$info?></a>
<?php else : ?>
<?=$info?>
<?php endif; ?>
</td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
/branches/v2.0-betulales/scripts/modules/tests/Tests.php
New file
0,0 → 1,2095
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Tests de référentiels de nomenclature et taxonomie
*
* Description : classe permettant de tester les référentiels selon le manuel technique
* Utilisation : php script.php tests -p bdnff -a tout
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Tela-Botanica 1999-2010
* @link http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
// TODO : supprimer l'utilisation du paramêtres 'p' et chercher les infos depuis la bdd
class Tests extends ScriptCommande {
const SCRIPT_NOM = 'tests';
const MANUEL_VERSION = '4.4';
private $projet = null;
private $traitement = null;
private $manuel = null;
private $manuel_nom = null;
private $manuel_chemin = null;
private $tests = null;
private $colonnes = null;
private $analyses = null;
private $noms = null;
private $erreurs = array();
private $resultatDao = null;
private $traitementDao = null;
private $tableStructureDao = null;
private $referentielDao = null;
public function executer() {
$this->manuel_nom = 'mtpr_v'.str_replace('.', '_', self::MANUEL_VERSION).'.pdf';
$this->manuel_chemin = Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS;
$manuel_config_nom = 'referentiel_v'.self::MANUEL_VERSION.'.ini';
$this->manuel = parse_ini_file($this->manuel_chemin.$manuel_config_nom);
$this->definirConstantes();
$this->tests = parse_ini_file($this->getModuleChemin().DS.'configurations'.DS.'tests.ini', true);
$this->resultatDao = new ResultatDao();
$this->traitementDao = new TraitementDao();
Debug::printr('Dans le script test');
// Récupération du dernier traitement demandé
$this->traitement = $this->traitementDao->getDernierTraitement('tout', self::SCRIPT_NOM);
if (isset($this->traitement)) {
$this->projet = $this->traitement['referentiel_code']; // Récupération du nom de projet
Debug::printr($this->traitement);
// Écriture de la date de début du traitement
Debug::printr('Debute:'.$this->traitementDao->debuterTraitement($this->traitement['id_traitement']));
// Nettoyage des traitements obsolètes
$traitements_obsoletes = $this->traitementDao->getTraitementsObsoletes($this->projet, self::SCRIPT_NOM);
if (isset($traitements_obsoletes)) {
Debug::printr('Supp. obsoletes:'.$this->traitementDao->supprimer($traitements_obsoletes));
}
$this->tableStructureDao = new TableStructureDao();
$this->referentielDao = new ReferentielDao();
// Lancement du test demandé
$cmd = $this->getParam('a');
switch ($cmd) {
case 'tout' :
Debug::printr('Départ lancement test:');
$this->recupererDonnees();
$this->lancerTestsAuto();
break;
case 'test14' :
$this->recupererDonnees();
Debug::printr('Départ lancement test 14 :');
$this->testerClassificationRang();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
// Écriture de la date de fin du traitement
Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement']));
} else {
Debug::printr("Aucun dernier traitement trouvé pour le script '".self::SCRIPT_NOM."' !");
}
}
/**
* Cette méthode définie des constantes qui peuvent ensuite être utilisée dans les fichier ini.
* Surtout utile pour le fichier tests.ini
*/
private function definirConstantes() {
define('RANG_GENRE', $this->manuel['rang_genre']);
define('RANG_SP', $this->manuel['rang_sp']);
date_default_timezone_set('Europe/Berlin');
define('ANNEE_EN_COURS', date('Y'));
define('ANNEE_MINIMUM', 1753);
}
public function recupererDonnees() {
// Récupération des données à tester
$this->colonnes = $this->tableStructureDao->getColonnes($this->projet);
$this->analyses = $this->tableStructureDao->getAnalyse($this->projet);
$this->noms = $this->referentielDao->getTout($this->projet);
Debug::printr('Nbre noms :'.count($this->noms));
}
public function lancerTestsAuto() {
$resultats = array();
 
// Lancement des tests unitaires
Debug::printr('Lancement des tests unitaires');
$tests_numeros = array_keys($this->tests);
Debug::printr($tests_numeros);
foreach ($tests_numeros as &$numero) {
$info = $this->getInfosTest($numero);
if ($numero < 5) {
// Tests spéciaux vérifiant la structure de la table
$resultats[] = $this->lancerTestUnitaire($info);
} else if ($numero >= 5 && $this->verifierResultats($resultats)) {
// Si la structure est bonne nous lançons les autres tests
$this->lancerTestUnitaire($info);
}
}
$info = $this->construireTotalErreur();
$this->traiterResultatTest($info);
}
private function getInfosTest($numero) {
$info = $this->tests[$numero];
$info['methode'] = 'tester'.implode('', explode(' ', ucwords($info['abr'])));
$info['numero'] = $numero;
$info['nom'] = '#'.$numero.' - '.$info['nom'];
$info['resultat'] = false;
return $info;
}
public function lancerTestUnitaire($info) {
Debug::printr($info['numero'].'::'.$info['methode']);
$methodeDeTest = $info['methode'];
$erreurs = $this->$methodeDeTest();
// Analyse des résultats
if (isset($erreurs['special'])) {
$info = $erreurs;
} else {
$info = $this->construireResultatErreur($erreurs, $info);
}
$this->traiterResultatTest($info);
if ($info['numero'] < 5) {
return ($info['resultat'] ? '1' : '0');
}
}
private function ajouterNumNomErreursTest($num_nom) {
if (count($this->erreurs) < 1000) {
if (isset($this->erreurs[$num_nom])) {
$this->erreurs[$num_nom] += 1;
} else {
$this->erreurs[$num_nom] = 1;
}
}
}
private function construireResultatErreur($erreurs, $info) {
if (count($erreurs) > 0) {
$info['message']['entete'] = explode(',', $info['entete']);
if (isset($info['title'])) {
$info['message']['title'] = explode(';', $info['title']);
}
$info['message']['lignes'] = $erreurs;
unset($erreurs);
} else {
$info['resultat'] = true;
}
return $info;
}
private function construireTotalErreur() {
if (count($this->erreurs) > 0) {
arsort($this->erreurs);
$info['abr'] = "erreurs par num_nom";
$info['nom'] = "erreurs -> num_nom";
$info['description'] = "nombre d'erreurs détecté par num_nom";
$info['numero'] = "0";
$info['message']['entete'] = array('num_nom', "nombre d'erreurs");
foreach ($this->erreurs as $num_nom=>$nombre) {
$erreurs[] = array(0 => $num_nom, 1 => $nombre);
}
$info['message']['lignes'] = $erreurs;
unset($this->erreurs);
} else {
$info['resultat'] = true;
}
return $info;
}
private function verifierResultats(&$resultats) {
$ok = true;
foreach ($resultats as $resultat) {
if ($resultat == '0') {
$ok = false;
break;
}
}
return $ok;
}
private function traiterResultatTest($info) {
if (isset($info['message'])) {
if (is_array($info['message'])) {
$erreurs_nbre = count($info['message']['lignes']);
$erreurs_max = 1000;
if ($erreurs_nbre > $erreurs_max) {
$info['message']['lignes'] = array_slice($info['message']['lignes'], 0, $erreurs_max);
$info['erreur'] = "$erreurs_nbre erreurs ont été détectées seules les $erreurs_max premières sont affichées";
}
$info['message'] = $this->getVue('tests/squelettes/message_table', $info);
} else {
$info['message'] = $this->getVue('tests/squelettes/message_p', $info);
}
}
Debug::printr($this->resultatDao->ajouter($this->traitement['id_traitement'], $info));
$info = null;
}
//+--------------------------------------------------------------------------------------------------------------+//
// TESTS
/**
* Test #01
*/
private function testerNombreDeChamps() {
$info = $this->getInfosTest(1);
$info['special'] = true;
$nbre_colonnes = count($this->colonnes);
$info['message'] = $nbre_colonnes;
if ($nbre_colonnes >= 37) {
$info['resultat'] = true;
}
return $info;
}
/**
* Test #02
*/
private function testerNomDesChamps() {
$info = $this->getInfosTest(2);
$info['special'] = true;
$champs_attendus = explode(',', $this->manuel['champs']);
$champs_presents = array();
foreach ($this->colonnes as &$colonne) {
$champs_presents[$colonne['Field']] = $colonne;
}
$ok = true;
$champs_manquant = array();
foreach ($champs_attendus as &$champ_attendu) {
if (!isset($champs_presents[$champ_attendu])) {
$champs_manquant[] = $champ_attendu;
$ok = false;
}
}
$info['resultat'] = $ok;
if (!$ok) {
$info['message'] = sprintf($info['message'], implode(', ', $champs_manquant));
}
return $info;
}
/**
* Test #03
*/
private function testerTypeDesChamps() {
$champs_attendus = explode(',', $this->manuel['champs_type']);
$champs_presents = array();
foreach ($this->colonnes as &$colonne) {
$champs_presents[$colonne['Field']] = $colonne['Type'];
}
// Recercherche des erreurs
$champs_erreur = array();
foreach ($champs_attendus as &$champ_attendu) {
list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
if (isset($champs_presents[$champ_attendu_nom])) {
$champs_present_type = $champs_presents[$champ_attendu_nom];
if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
$champs_erreur[] = array($champ_attendu, $champ_attendu_type, $champs_present_type);
}
}
}
return $champs_erreur;
}
/**
* Test #04
*/
private function testerNumNomClePrimaire() {
$info = $this->getInfosTest(4);
$info['special'] = true;
foreach ($this->colonnes as &$colonne) {
if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
$info['resultat'] = true;
break;
}
}
return $info;
}
/**
* Test #05
*/
private function testerTailleDesChamps() {
$tailles_champs_maxi = array();
foreach ($this->colonnes as &$colonne) {
if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
$tailles_champs_maxi[$colonne['Field']] = $match[1];
}
}
$tailles_trouvees = array();
foreach ($this->analyses as &$analyse) {
if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
$tailles_trouvees[$match[1]] = $analyse['Max_length'];
}
}
$champs_erreur = array();
$champs_attendus = explode(',', $this->manuel['champs']);
foreach ($champs_attendus as &$champ_attendu) {
if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
$champs_erreur[] = array($champ_attendu, $tailles_champs_maxi[$champ_attendu], $tailles_trouvees[$champ_attendu]);
}
}
}
return $champs_erreur;
}
/**
* Test #06
*/
private function testerNumNomSuperieurAZero() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom'] <= 0) {
$noms_erreur[] = array($nom['num_nom']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #07
*/
private function testerNumNomRetenuSuperieurAZero() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #08
*/
private function testerExistenceNumNomRetenu() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] != $nom['num_nom']) {
if ($nom['num_nom_retenu'] != 0 && !isset($this->noms[$nom['num_nom_retenu']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #09
*/
private function testerTransmissionNumNomRetenu() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['exclure_taxref'] == 0) {
if ($nom['num_nom_retenu'] != 0 && isset($this->noms[$nom['num_nom_retenu']])) {
if ($this->noms[$nom['num_nom_retenu']]['exclure_taxref'] != 0) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $this->noms[$nom['num_nom_retenu']]['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
}
return $noms_erreur;
}
/**
* Test #10
*/
private function testerSynonymeNumNomRetenu() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] != $nom['num_nom']) {
if ($nom['num_nom_retenu'] != 0 && isset($this->noms[$nom['num_nom_retenu']])) {
if ($this->noms[$nom['num_nom_retenu']]['num_nom'] != $this->noms[$nom['num_nom_retenu']]['num_nom_retenu']) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $this->noms[$nom['num_nom_retenu']]['num_nom_retenu']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
}
return $noms_erreur;
}
/**
* Test #11
*/
private function testerDoublonsNomSci() {
$noms_erreur = array();
$noms_complets = array();
foreach ($this->noms as &$nom) {
$a = $nom['nom_sci']." ".$nom['auteur']." ".$nom['nom_addendum']." ".$nom['biblio_origine'];
if (isset($noms_complets[$a])) {
$noms_erreur[] = array($nom['num_nom'], $a, $noms_complets[$a], $nom['exclure_taxref'], $nom['homonyme']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
} else {
$noms_complets[$a] = $nom['num_nom'];
}
}
return $noms_erreur;
}
/**
* Test #12
*/
private function testerNumTaxSupEgalZeroUnique() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if (preg_match('/^0$/', $nom['num_tax_sup'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
// Ce test est spécial car le nombre de noms en erreurs doit être supérieur à 1 et non à 0 pour être KO.
if (count($noms_erreur) == 1) {
$noms_erreur = array();
}
return $noms_erreur;
}
/**
* Test #13
*/
private function testerTaxSupPourTaxon() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #14
*/
private function testerExistenceTaxonSuperieur() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #15
*/
private function testerClassificationEspece() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['rang'] == 290) {
if (isset($this->noms[$nom['num_tax_sup']])) {
$nom_sup = $this->noms[$nom['num_tax_sup']];
if ($nom_sup['rang'] != 220 ) {
$noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom_sup['num_nom'], $nom_sup['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
}
return $noms_erreur;
}
/**
* Test #16
*/
private function testerTransmissionTaxonSuperieur() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['exclure_taxref'] == 0) {
if ($nom['num_tax_sup'] != 0 && isset($this->noms[$nom['num_tax_sup']])) {
if ($this->noms[$nom['num_tax_sup']]['exclure_taxref'] != 0) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $this->noms[$nom['num_tax_sup']]['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
}
return $noms_erreur;
}
/**
* Test #17
*/
private function testerClassificationRang() {
$noms_erreur = array();
//$rangs = explode(',', $this->manuel['rangs']);
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if (isset($this->noms[$nom['num_tax_sup']])) {
$nom_sup = $this->noms[$nom['num_tax_sup']];
//$num_rang = array_search($nom['rang'], $rangs);
if ($nom_sup['rang'] >= $nom['rang']) {
//if ($nom_sup['rang'] != $rangs[$num_rang-1] ) {
// Prise en compte de l'exception des clades
if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
$noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom_sup['num_nom'], $nom_sup['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
}
}
return $noms_erreur;
}
/**
* Test #18
*/
private function testerClassification() {
$noms_erreur = array();
$this->noms_ok = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if (isset($this->noms_ok[$nom['num_tax_sup']])) {
$this->noms_ok[$nom['num_nom']] = true;
} else {
$this->detection_boucle_infini = array();
$classif_ok = $this->remonterClassif($nom);
unset($this->detection_boucle_infini);
if ($classif_ok === true) {
$this->noms_ok[$nom['num_nom']] = $classif_ok;
} else {
$noms_erreur[] = array($nom['num_nom'], $classif_ok, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
}
unset($this->noms_ok);
return $noms_erreur;
}
private function remonterClassif(&$nom) {
$this->detection_boucle_infini[$nom['num_nom']] = true;
if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
if (isset($this->noms_ok[$nom['num_tax_sup']])) {
$this->noms_ok[$nom['num_nom']] = true;
return true;
} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
$this->noms_ok[$nom['num_nom']] = true;
return true;
} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
return 'Hiérarchie avec le taxon #'.$nom['num_nom'].' ayant un taxon superieur #'.$nom['num_tax_sup'].' inexistant';
} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
return 'Boucle infinie pour le taxon #'.$nom['num_tax_sup'];
} else {
$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
if ($retour === true) {
$this->noms_ok[$nom['num_tax_sup']] = true;
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
return $retour;
}
} else {
return 'Valeur num_tax_sup incorrecte : '.$nom['num_tax_sup'];
}
}
/**
* Test #19
*/
private function testerRang() {
$rangs = array_flip(explode(',', $this->manuel['rangs']));
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if (!isset($rangs[$nom['rang']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #20
*/
private function testerNomCompletSupraGenerique() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_sci'] != $nom_sci_ideal) {
$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #21
*/
private function testerNomCompletGenre() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['rang'] == $this->manuel['rang_genre']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_sci'] != $nom_sci_ideal) {
$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #22
*/
private function testerNomCompletInfraGenre() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_sci_ideal = '';
if ($nom['type_epithete'] == 'agg.') {
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' '.
$this->formaterStyleNomGenre($nom['epithete_infra_generique']).' '.
$nom['type_epithete'];
} else {
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' '.
$nom['type_epithete'].' '.
$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
}
$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_sci'] != $nom_sci_ideal) {
$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #23
*/
private function testerNomCompletEspece() {
$noms_erreur = array();
$erreur = '';
foreach ($this->noms as &$nom) {
if ($nom['rang'] == $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' ';
if (strstr($nom['nom_sci'] , ' x ') != false) {
list($nom_sci_ideal, $erreur) = $this->formaterStyleEpitheteSpHybride($nom_sci_ideal, $nom['epithete_sp']);
} else {
$nom_sci_ideal .= utf8_encode(strtolower(utf8_decode($nom['epithete_sp'])));
}
$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
$nom_sci_ideal = trim($nom_sci_ideal);
if ($nom['nom_sci'] != $nom_sci_ideal) {
$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $erreur, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #24
*/
private function testerNomCompletInfraSpecifique() {
$noms_erreur = array();
$erreur = null;
foreach ($this->noms as &$nom) {
if ($nom['rang'] > $this->manuel['rang_sp']) {
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' '.
utf8_encode(strtolower(utf8_decode($nom['epithete_sp']))).' '.
utf8_encode(strtolower(utf8_decode($nom['type_epithete']))).' ';
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
if (strstr($nom['nom_sci'] , ' x ') != false) {
list($nom_sci_ideal, $erreur) = $this->formaterStyleEpitheteInfraSpHybride($nom_sci_ideal, $nom['epithete_infra_sp'], $nom['genre']);
} else {
$nom_sci_ideal .= utf8_encode(strtolower(utf8_decode($nom['epithete_infra_sp'])));
}
$nom_sci_ideal = trim($nom_sci_ideal);
$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
if ($nom['nom_sci'] != $nom_sci_ideal) {
$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $erreur, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #25
*/
private function testerNomSupraGeneriqueEspaces() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['nom_supra_generique'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #26
*/
private function testerNomSupraGeneriqueSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['nom_supra_generique'] != '') {
if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #27
*/
private function testerNomSupraGeneriqueRang() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['nom_supra_generique'] != '') {
if ($nom['rang'] >= $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #28
*/
private function testerGenreEspaces() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['genre'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
$nom_traite = $this->repererEspace($nom['genre']);
$noms_erreur[] = array($nom['num_nom'], $nom_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #29
*/
private function testerGenreSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['genre'] != '') {
$mots = explode(' ', $nom['genre']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
$nom_traite = $this->repererEspace($nom['genre']);
$noms_erreur[] = array($nom['num_nom'], $nom_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
break;
}
}
}
}
return $noms_erreur;
}
/**
* Test #30
*/
private function testerGenreRang() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['genre'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #31
*/
private function testerEpitheteInfraGeneriqueSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_infra_generique'] != '') {
if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #32
*/
private function testerEpitheteInfraGeneriqueRang() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_infra_generique'] != '') {
if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #33
*/
private function testerEpitheteInfraGeneriqueEspaces() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_infra_generique'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #34
*/
private function testerEpitheteSpEspaces() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_sp'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #35
*/
private function testerEpitheteSpSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_sp'] != '') {
$formule_hybridite = (strpos($nom['epithete_sp'], ' x ') !== false);
$mots = explode(' ', $nom['epithete_sp']);
foreach ($mots as $mot) {
// TODO: créer un test qui vérifie la formule d'hybridité en la reconstruisant à partir des parents
// afin que seuls des formules valides parviennent à la fonction
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot) ||
($formule_hybridite && $this->verifierEpitheteGenre($mot) && !$this->verifierEstAbbreviationInfraSp($mot)))) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
break;
}
}
}
}
return $noms_erreur;
}
/**
* Test #36
*/
private function testerEpitheteSpRang() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_sp'] != '') {
if ($nom['rang'] < $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #37
*/
private function testerTypeEpitheteEspaces() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['type_epithete'] != '') {
if (preg_match('/\s+/', $nom['type_epithete'])) {
$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $valeur_traitee, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #38
*/
private function testerTypeEpitheteSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['type_epithete'] != '') {
if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #39
*/
private function testerTypeEpitheteHybridite() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['type_epithete'] != '') {
if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #40
*/
private function testerEpitheteInfraSpEspaces() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_infra_sp'] != '') {
if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #41
*/
private function testerEpitheteInfraSpSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_infra_sp'] != '') {
$mots = explode(' ', $nom['epithete_infra_sp']);
$hybride_contient_abbreviation_infra_sp = false;
$formule_hybridite = (strpos($nom['epithete_infra_sp'], ' x ') !== false);
foreach ($mots as $mot) {
if($formule_hybridite && $this->verifierEstAbbreviationInfraSp($mot)) {
$hybride_contient_abbreviation_infra_sp = true;
}
$formule_hybridite_valide = $this->verifierEpitheteGenre($mot) || $this->verifierEpitheteSp($mot) || $hybride_contient_abbreviation_infra_sp;
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot) || $this->verifierEpitheteSp($mot) ||
$formule_hybridite_valide)) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
break;
}
}
if($formule_hybridite && !$hybride_contient_abbreviation_infra_sp) {
$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #42
*/
private function testerEpitheteInfraSpRang() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_infra_sp'] != '') {
if ($nom['rang'] < $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #43
*/
private function testerGroupeCultivarSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['cultivar_groupe'] != '') {
if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #44
*/
private function testerGroupeCultivarRang() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['cultivar_groupe'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #45
*/
private function testerCultivarSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['cultivar'] != '') {
if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
$epithete_traite = $this->repererEspace($nom['cultivar']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #46
*/
private function testerCultivarRang() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['cultivar'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #47
*/
private function testerNomCommercialSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['nom_commercial'] != '') {
if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
$epithete_traite = $this->repererEspace($nom['nom_commercial']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #48
*/
private function testerNomCommercialPresenceCultivar() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #49
*/
private function testerAuteurSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['auteur'] != '') {
if (!$this->verifierAuteur($nom['auteur'])) {
$intitule_traite = $this->repererEspace($nom['auteur']);
$noms_erreur[] = array($nom['num_nom'], $intitule_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #50
*/
private function testerAnneeSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['annee'] != '') {
if (!$this->verifierAnnee($nom['annee'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['annee'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #51
*/
private function testerBiblioOrigineSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['biblio_origine'] != '') {
if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
$biblio_traite = $this->repererEspace($nom['biblio_origine']);
$noms_erreur[] = array($nom['num_nom'], $biblio_traite, $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #52
*/
private function testerHomonymieSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['homonyme'] != '') {
if (!$this->verifierBooleen($nom['homonyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['homonyme'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #53
*/
private function testerHomonymieExistence() {
$noms_homonymie = $this->classerNomsParNomComplet();
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
if ($noms_homonymie[$nom['nom_sci']] <= 1) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
$noms_homonymie = null;
return $noms_erreur;
}
/**
* Test #54
*/
private function testerBasionymeSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_basionyme'] != '') {
if (!$this->verifierNombre($nom['num_basionyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_basionyme'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
 
/**
* Test #55
*/
private function testerBasionymeExistence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_basionyme'] != '') {
if (!isset($this->noms[$nom['num_basionyme']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_basionyme'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #56
*/
private function testerSynonymeProparteSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_proparte'] != '') {
if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #57
*/
private function testerSynonymeProparteExistence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_proparte'] != '') {
$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
$num_nom_en_erreur = array();
foreach ($num_nom_a_verifier as $num_nom) {
if (!isset($this->noms[$num_nom])) {
$num_nom_en_erreur[] = $num_nom;
}
}
if (count($num_nom_en_erreur) > 0) {
$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur), $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #58
*/
private function testerSynonymeDouteuxSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_douteux'] != '') {
if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #59
*/
private function testerSynonymeDouteuxNumNomRetenu() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_douteux'] == 1 && !$this->verifierNombre($nom['num_nom_retenu'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #60
*/
private function testerSynonymeDouteuxSynonyme() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_douteux'] == 1 && $nom['num_nom'] == $nom['num_nom_retenu']) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $nom['synonyme_douteux'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #61
*/
private function testerSynonymeMalAppliqueSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_mal_applique'] != '') {
if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #62
*/
private function testerSynonymeMalAppliqueChampsAnnexe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_mal_applique'] == 1) {
$erreur = true;
$erreur = ($nom['annee'] == "") ? false : $erreur;
$erreur = ($nom['biblio_origine'] == "") ? false : $erreur;
$erreur = (strpos($nom['auteur'], "sensu") === 0) ? $erreur : false;
if ($erreur == false) {
$noms_erreur[] = array($nom['num_nom'], $nom['auteur'], $nom['annee'], $nom['biblio_origine'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #63
*/
private function testerSynonymeMalAppliqueSynonyme() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_mal_applique'] == 1 && $nom['num_nom'] == $nom['num_nom_retenu']) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $nom['synonyme_mal_applique'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
return $noms_erreur;
}
/**
* Test #64
*/
private function testerSynonymeOrthographiqueSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as $nom) {
if ($nom['synonyme_orthographique'] != '') {
if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #65
*/
private function testerSynonymeOrthographiqueExistence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_orthographique'] != '') {
if (!isset($this->noms[$nom['synonyme_orthographique']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #66
*/
private function testerHybrideParent01Syntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['hybride_parent_01'] != '') {
if (!$this->verifierNombre($nom['hybride_parent_01'])) {
$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']), $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #67
*/
private function testerHybrideParent01Existence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
if (!isset($this->noms[$nom['hybride_parent_01']])) {
$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']), $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #68
*/
private function testerHybrideParent02Syntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['hybride_parent_02'] != '') {
if (!$this->verifierNombre($nom['hybride_parent_02'])) {
$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']), $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #69
*/
private function testerHybrideParent02Existence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['hybride_parent_02'] != '') {
if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']), $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #70
*/
private function testerNumTypeSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_type'] != '') {
if (!$this->verifierNombre($nom['num_type'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_type'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #71
*/
private function testerNumTypeExistence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_type'] != '') {
if (!isset($this->noms[$nom['num_type']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['num_type'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #72
*/
private function testerPresenceSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['presence'] != '') {
if (!$this->verifierPresence($nom['presence'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['presence'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #73
*/
private function testerPresenceExistence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['exclure_taxref'] == 0) {
if ($nom['presence'] == "") {
$noms_erreur[] = array($nom['num_nom'],$nom['num_nom_retenu'], $nom['presence'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #74
*/
private function testerStatutOrigineSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['statut_origine'] != '') {
if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #75
*/
private function testerStatutIntroductionSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['statut_introduction'] != '') {
if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #76
*/
private function testerStatutCultureSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['statut_culture'] != '') {
if (!$this->verifierStatutCulture($nom['statut_culture'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #77
*/
private function testerExclureTaxRefSyntaxe() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
if (!preg_match('/^(?:0|1|9)$/', $nom['exclure_taxref'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #78
*/
private function testerNomFrancaisUnique() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['nom_francais'] != '' && $nom['nom_francais'] != null) {
if (strpbrk($nom['nom_francais'],',;')) {
$noms_erreur[] = array($nom['num_nom'], $this->repererCaracteresInvalidesNomFrancais($nom['nom_francais']));
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
return $noms_erreur;
}
/**
* Test #79
*/
private function testerExclureTaxRefPresence() {
$noms_erreur = array();
foreach ($this->noms as &$nom) {
// On vérifie tous les noms retenu nom exclus de taxref de rang inférieur ou égal à l'espèce
if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['exclure_taxref'] == 0 && $nom['rang'] >= 240) {
if($nom['presence'] == '' || !$this->verifierPresence($nom['presence'])) {
if(($nom['statut_origine'] == '' || !$this->verifierStatutOrigine($nom['statut_origine'])) &&
($nom['statut_introduction'] == '' || !$this->verifierStatutIntroduction($nom['statut_introduction'])) &&
($nom['statut_culture'] == '' || !$this->verifierStatutCulture($nom['statut_culture'])))
{
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'],
$this->mettreEnValeurAvertissement($nom['presence']),
$this->mettreEnValeurAvertissement($nom['statut_origine']),
$this->mettreEnValeurAvertissement($nom['statut_introduction']),
$this->mettreEnValeurAvertissement($nom['statut_culture'])
);
$this->ajouterNumNomErreursTest($nom['num_nom']);
} else {
//TODO: le comportement est identique mais il faudrait pouvoir afficher un avertissement
// si le champ présence n'est pas rempli mais que l'une des colonne de statut l'est
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'],
$nom['presence'],
$this->mettreEnValeurAvertissement($nom['statut_origine']),
$this->mettreEnValeurAvertissement($nom['statut_introduction']),
$this->mettreEnValeurAvertissement($nom['statut_culture'])
);
$this->ajouterNumNomErreursTest($nom['num_nom']);
}
}
}
}
return $noms_erreur;
}
 
//+--------------------------------------------------------------------------------------------------------------+//
// MÉTHODES COMMUNES aux TESTS
private function verifierPresence(&$valeur) {
$codes = $this->manuel['codes_presence'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutOrigine(&$valeur) {
$codes = $this->manuel['codes_statuts_origine'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutIntroduction(&$valeur) {
$codes = $this->manuel['codes_statuts_introduction'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatutCulture(&$valeur) {
$codes = $this->manuel['codes_statuts_culture'];
$ok = $this->verifierStatuts($valeur, $codes);
return $ok;
}
private function verifierStatuts(&$valeur, &$codes) {
$ok = true;
if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierBooleen(&$valeur) {
$ok = true;
if (!preg_match('/^1$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierNombre(&$valeur) {
$ok = true;
if (!preg_match('/^[0-9]+$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierNombreSuite(&$valeur) {
$ok = true;
if (!preg_match('/^(?:[0-9]+, ?)*[0-9]+$/', $valeur)) {
$ok = false;
}
return $ok;
}
private function verifierTypeEpithete(&$type) {
$ok = false;
$rejetes = $this->manuel['type_epithete_rejetes'];
if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
$ok = false;
} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
$ok = true;
}
return $ok;
}
private function verifierBiblioOrigine(&$intitule) {
$ok = true;
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
$ok = false;// Contient des espaces en trop
} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
$ok = false;
} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
$ok = false;// Contient une mauvaise suite de caractères
}
return $ok;
}
private function verifierAnnee(&$annee) {
$ok = true;
if (!preg_match('/^[0-9]{4}$/', $annee)) {
$ok = false;
} else if ($annee < ANNEE_MINIMUM) {
$ok = false;
} else if ($annee > ANNEE_EN_COURS) {
$ok = false;
}
return $ok;
}
private function verifierAuteur(&$intitule) {
$ok = true;
$acceptes = $this->manuel['auteur_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
$mots = explode(' ', $intitule);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if (preg_match("/^(?:(?:\p{L}|[.'\(\),-])+|[&])$/u", $mot)) {
continue;// Mot de l'intitulé auteur
} else {
$ok = false;
}
}
}
}
return $ok;
}
private function verifierNomCommercial(&$epithete) {
$ok = false;
if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
$ok = true;
}
return $ok;
}
private function verifierEpitheteCultivar(&$epithete) {
$ok = true;
$acceptes = $this->manuel['cultivar_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
$mots_mineurs = $this->manuel['mots_mineurs'];
$mots = explode(' ', $epithete);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
continue;// Mot mineur en minuscule qui n'est pas en 1ère position
} else {
$mots_tiret = explode('-', $mot);
foreach ($mots_tiret as $position_tiret => $mot_tiret) {
if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
} else {
$ok = false;
}
}
}
}
}
}
return $ok;
}
private function verifierEpitheteGroupeCultivar(&$epithete) {
$ok = true;
$acceptes = $this->manuel['cultivar_gp_acceptes'];
if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
$ok = false;// Contient des espaces en trop
} else {
$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
$mots_mineurs = $this->manuel['mots_mineurs'];
$mots = explode(' ', $epithete);
foreach ($mots as $position => $mot) {
if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
continue;// Mot accepté
} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
$ok = false;// Mot rejeté
} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
continue;// Mot mineur en minuscule qui n'est pas en 1ère position
} else {
$mots_tiret = explode('-', $mot);
foreach ($mots_tiret as $position_tiret => $mot_tiret) {
if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
} else {
$ok = false;
}
}
}
}
}
}
return $ok;
}
private function verifierEpitheteSp(&$epithete) {
$ok = false;
if (preg_match('/^[a-zäëḧïöẗüẅẍÿ][-a-zäëḧïöẗüẅẍÿ]+$/', $epithete)) {
$ok = true;
} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
$ok = true;
}
return $ok;
}
private function verifierEpitheteGenre(&$epithete) {
$ok = false;
if (preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ](?:[-a-zäëḧïöẗüẅẍÿ]+|[a-zäëḧïöẗüẅẍÿ]+-[A-ZÄËḦÏÖÜẄẌŸ][a-zäëḧïöẗüẅẍÿ]+)$/', $epithete)) {
$ok = true;
}
return $ok;
}
private function verifierEstAbbreviationInfraSp($mot) {
$ok = false;
if(preg_match($this->manuel['abbr_rangs_infra_specifique'], $mot)) {
$ok = true;
}
return $ok;
}
private function formaterStyleNomGenre(&$genre) {
$genre_fmt = '';
if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
$genre_fmt = utf8_encode(strtolower(utf8_decode($match[1]))).' '.utf8_encode(ucfirst(strtolower(utf8_decode($match[2]))));
} elseif (preg_match('/^(.+)\s+([x+])\s+(.+)$/i', $genre, $match)) {
$genre_fmt = utf8_encode(ucfirst(strtolower(utf8_decode($match[1])))).' '.
utf8_encode(strtolower(utf8_decode($match[2]))).' '.utf8_encode(ucfirst(strtolower(utf8_decode($match[3]))));
} else {
$genre_fmt = utf8_encode(ucfirst(strtolower(utf8_decode($genre))));
}
return $genre_fmt;
}
private function formaterStyleEpitheteSpHybride(&$genre, &$epithete) {
$nom_fmt = '';
$erreur = '';
if (trim($genre) == '') {
if ($epithete != '') {
$nom_fmt = $this->formaterFormuleHybridite($epithete);
} else {
$erreur = "Formule d'hybridité sans épithéte spécifique";
}
} else {
$nom_fmt = $this->formaterNomHybride($genre, $epithete);
}
return array($nom_fmt, $erreur);
}
private function formaterStyleEpitheteInfraSpHybride(&$nom_sci, &$infra, &$genre = null) {
$nom_fmt = '';
$erreur = '';
if (trim($genre) == '') {
if (trim($nom_sci) == '') {
if (trim($infra) != '') {
$nom_fmt = $this->formaterFormuleHybridite($infra);
} else {
$erreur = "Formule d'hybridité sans épithéte infraspécifique";
}
} else {
$erreur = "Formule d'hybridité avec épithéte spécifique";
}
} else {
$nom_fmt = $this->formaterNomHybride($nom_sci, $infra);
}
return array($nom_fmt, $erreur);
}
private function formaterNomHybride(&$nom_sci, &$epithete) {
if (preg_match('/^(.+)\s+([x+])\s+(.+)$/i', $epithete, $match) != '') {
$nom_fmt = $nom_sci.utf8_encode(ucfirst(strtolower(utf8_decode($match[1])))).' '.
utf8_encode(strtolower(utf8_decode($match[2]))).' '.
utf8_encode(ucfirst(strtolower(utf8_decode($match[3]))));
} elseif (preg_match('/^([x+])\s+(.+)$/i', $epithete, $match) != '') {
$nom_fmt = $nom_sci.utf8_encode(strtolower(utf8_decode($match[1]))).' '.
utf8_encode(strtolower(utf8_decode($match[2])));
} else {
$nom_fmt = $nom_sci.utf8_encode(strtolower(utf8_decode($epithete)));
}
return $nom_fmt;
}
private function formaterFormuleHybridite(&$epithete) {
$liste_parents = explode(' x ', $epithete);
if (count($liste_parents) == 2) {
$nom_fmt = utf8_encode(ucfirst(strtolower(utf8_decode($liste_parents[0])))).' x '.
utf8_encode(ucfirst(strtolower(utf8_decode($liste_parents[1]))));
} else {
for ($i=0; $i<count($liste_parents); $i++) {
if (strstr(trim($liste_parents[$i]), ' ') == false) {
$nom[] = utf8_encode(ucfirst(strtolower(utf8_decode(trim($liste_parents[$i]))))).' x '.
utf8_encode(strtolower(utf8_decode(trim($liste_parents[$i+1]))));
$i++;
} else {
$nom[] = utf8_encode(ucfirst(strtolower(utf8_decode($liste_parents[$i]))));
}
}
$nom_fmt = implode(' x ', $nom);
}
return $nom_fmt;
}
private function repererEspace($nom_sci) {
$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
return $nom_sci;
}
private function repererCaracteresInvalidesNomFrancais($nom_verna) {
$nom_verna = str_replace(',', '<span class="espace">,</span>', $nom_verna);
$nom_verna = str_replace(';', '<span class="espace">;</span>', $nom_verna);
return $nom_verna;
}
private function mettreEnValeurAvertissement($chaine) {
$chaine = '<span class="espace">'.$chaine.'</span>';
return $chaine;
}
private function construireSuffixeNomPltCultivee(&$nom) {
$suffixe = array();
$suffixe[] = $this->construireNomCultivarGroupe($nom);
$suffixe[] = $this->construireNomCommercial($nom);
$suffixe[] = $this->construireNomCultivar($nom);
$suffixe = array_filter($suffixe);
return implode(' ', $suffixe);
}
private function construireNomCultivarGroupe(&$nom) {
$nom_groupe_cultivar = '';
if ($nom['cultivar_groupe'] != '') {
if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
$nom_groupe_cultivar = '('.$nom['cultivar_groupe'].')';
} else {
$nom_groupe_cultivar = '('.$nom['cultivar_groupe'].' Gp)';
}
}
return $nom_groupe_cultivar;
}
private function construireNomCommercial(&$nom) {
$nom_commercial = '';
if ($nom['nom_commercial'] != '') {
$nom_commercial = strtoupper($nom['nom_commercial']);
}
return $nom_commercial;
}
private function construireNomCultivar(&$nom) {
$nom_cultivar = '';
if ($nom['cultivar'] != '') {
$nom_cultivar = "'".$nom['cultivar']."'";
}
return $nom_cultivar;
}
private function classerNomsParNomComplet() {
$noms_classes = array();
foreach ($this->noms as &$nom) {
if (!isset($noms_classes[$nom['nom_sci']])) {
$noms_classes[$nom['nom_sci']] = 1;
} else {
$noms_classes[$nom['nom_sci']]++;
}
}
return $noms_classes;
}
}
?>
/branches/v2.0-betulales/scripts/modules/tests/configurations/tests.ini
New file
0,0 → 1,570
[1]
abr = "Nombre De Champs"
nom = "Structure -> nombre de champs"
description = "Le nombre de champs présent dans la table contenant le référentiel doit être supérieur ou égal à 37."
message = "Le nombre de colonnes est de %s alors qu'il doit être supérieur ou égal à 37."
[2]
abr = "Nom Des Champs"
nom = "Structure -> noms des champs"
description = "Les noms des champs de la table contenant le référentiel doivent être conformes à ceux définis par le manuel technique."
message = "Champs manquants : %s."
[3]
abr = "Type Des Champs"
nom = "Structure -> types des champs"
description = "Les types des champs (text, varchar, int) de la table contenant le référentiel doivent être conformes à ceux définis par le manuel technique."
entete = "Champ,Type attendu,Type présent"
[4]
abr = "Num Nom Cle Primaire"
nom = "Structure -> num_nom est clé primaire"
description = "Le champ num_nom doit être clé primaire de la table."
[5]
abr = "Taille Des Champs"
nom = "Structure -> champs tronqués"
description = "Les champs indiqués en erreur ont atteint leur taille limite de remplissage (ex: varchar(4) pour le champ annee). Un résultat de type KO attire l'attention du coordinateur sur la possibilité que la valeur du champ d'origine ait été tronquée lors de son dépôt dans phpmyadmin."
entete="Champ,Taille attendu,Taille présente"
[6]
abr = "Num Nom Superieur A Zero"
nom = "num_nom -> supérieur à 0"
description = "Le champ num_nom doit contenir des nombres entiers supérieurs à 0."
entete="num_nom"
[7]
abr = "Num Nom Retenu Superieur A Zero"
nom = "num_nom_retenu -> supérieur à 0"
description = "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide."
entete="num_nom,num_nom_retenu"
[8]
abr = "Existence Num Nom Retenu"
nom = "num_nom_retenu -> existence"
description = "Les valeurs du champ num_nom_retenu doivent correspondre à un num_nom."
entete = "num_nom,num_nom_retenu,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[9]
abr = "Transmission Num Nom Retenu"
nom = "num_nom_retenu -> num_nom_retenu transmis au MNHN"
description = "Les valeurs du champ num_nom_retenu doivent correspondre à un num_nom dont la valeur du champ exclure_taxref est égale à 0."
entete = "num_nom,num_nom_retenu,Exclusion de Taxref num_nom_retenu"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[10]
abr = "Synonyme Num Nom Retenu"
nom = "num_nom_retenu -> renvoie à un nom retenu"
description = "Un synonyme doit être rattaché à un nom retenu. Son champ num_nom_retenu ne doit pas correspondre à un synonyme, soit num_nom = num_nom_retenu."
entete = "num_nom,num_nom_retenu,num_nom_retenu du num_nom_retenu"
[11]
abr = "Doublons Nom Sci"
nom = "nom_sci -> détection des doublons"
description = "La combinaison 'nom scientifique + auteur + année + nom addendum + biblio' existe en double."
entete = "num_nom,nom_sci,num_nom du doublon, exclusion de Taxref, homonyme"
[12]
abr = "Num Tax Sup Egal Zero Unique"
nom = "num_tax_sup -> égal à 0 unique"
description = "Un seul enregistrement doit posséder la valeur 0 dans le champ num_tax_sup. Il correspond au premier taxon de la classification."
entete = "num_nom,num_tax_sup"
[13]
abr = "Tax Sup Pour Taxon"
nom = "Classification -> uniquement pour les taxons"
description = "Seuls les noms retenus doivent posséder une valeur dans le champ num_tax_sup.
Si num_nom_retenu est différent de num_nom (cas des synonymes) alors num_tax_sup doit être vide."
entete = "num_nom,num_tax_sup,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[14]
abr = "Existence Taxon Superieur"
nom = "Classification -> existence du taxon supérieur"
description = "Tous les noms retenus doivent posséder un taxon supérieur existant dans la base (sauf la racine de la classification).
Si num_nom_retenu est égal à num_nom alors num_tax_sup doit être rempli et correspondre à un num_nom."
entete = "num_nom,num_tax_sup,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[15]
abr = "Classification Espece"
nom = "Classification -> espèce rattachée à genre"
description = "Pour chaque enregistrement représentant un taxon de rang 290, le taxon supérieur doit avoir un code de rang 220."
entete = "num_nom,rang,Taxon supérieur num_nom,Taxon supérieur rang,Exclusion de Taxref"
title=";;;;0 = non, 1 = oui, 9 = indéterminée"
[16]
abr = "Transmission Taxon Superieur"
nom = "Classification -> taxon supérieur transmis au MNHN"
description = "Chaque enregistrement transmis (exclure_taxref = 0) doit posséder un taxon supérieur transmis."
entete = "num_nom,num_tax_sup,Exclusion de Taxref num_tax_sup"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[17]
abr = "Classification Rang"
nom = "Classification -> taxon supérieur avec rang supérieur"
description = "Pour chaque enregistrement représentant un taxon, le taxon supérieur doit avoir un code de rang inférieur au code de rang du taxon courant (à l'exception des noms ayant le rang de Clade)."
entete = "num_nom,rang,Taxon supérieur num_nom,Taxon supérieur rang,Exclusion de Taxref"
title=";;;;0 = non, 1 = oui, 9 = indéterminée"
[18]
abr = "Classification"
nom = "Classification -> racine liée à chaque noeud"
description = "Pour chaque nom retenu, la classification doit pouvoir être remontée jusqu'à un nom unique possédant une valeur num_tax_sup de 0."
entete = "num_nom,Message du problème,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[19]
abr = "Rang"
nom = "rang"
description = "Le rang doit correspondre à une valeur numérique définie dans le manuel."
entete = "num_nom,Rang,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[20]
abr = "Nom Complet Supra Generique"
nom = "nom_sci -> noms supra-génériques"
description = "Si le rang est < à "RANG_GENRE" (> genre), le nom_sci doit correspondre à la valeur du champ nom_supra_generique. Les valeurs des champs cultivar_groupe, cultivar et
nom_commercial peuvent s'y ajouter."
entete = "num_nom,nom_sci,nom_sci corrigé,Exclusion de Taxref"
title=";;Proposition de correction. N'est pas obligatoirement correcte;0 = non, 1 = oui, 9 = indéterminée"
[21]
abr = "Nom Complet Genre"
nom = "nom_sci -> noms de genres"
description = "Si le rang est = à "RANG_GENRE" (= genre), le nom_sci doit correspondre à la valeur du champ genre. Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter."
entete = "num_nom,nom_sci,nom_sci corrigé,Exclusion de Taxref"
title=";;Proposition de correction. N'est pas obligatoirement correcte;0 = non, 1 = oui, 9 = indéterminée"
[22]
abr = "Nom Complet Infra Genre"
nom = "nom_sci -> noms infra-génériques"
description = "Si le rang est > à "RANG_GENRE" (< genre) et < à "RANG_SP" (> espèce), le nom_sci doit correspondre à une des formules suivantes :
genre + ' ' + type_epithete + ' ' + epithete_infra_generique
genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg.
Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter."
entete = "num_nom,nom_sci,nom_sci corrigé,Exclusion de Taxref"
title=";;Proposition de correction. N'est pas obligatoirement correcte;0 = non, 1 = oui, 9 = indéterminée"
[23]
abr = "Nom Complet Espece"
nom = "nom_sci -> noms d'espèce"
description = "Si le rang est = à "RANG_SP" (= espèce), le nom_sci doit correspondre à la formule :
genre + ' ' + epithete_sp
Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.
Des erreurs peuvent être générées lors de la reconstruction des formules d'hybridité à partir des champs cités ci-dessus. Pour les éviter, ne remplir que le champ concernant le rang de l'hybride)."
entete = "num_nom,nom_sci,nom_sci corrigé,Proposition d'erreur,Exclusion de Taxref"
title=";;Proposition de correction. N'est pas obligatoirement correcte;;0 = non, 1 = oui, 9 = indéterminée"
[24]
abr = "Nom Complet Infra Specifique"
nom = "nom_sci -> noms infra-spécifiques"
description = "Si le rang est > à "RANG_SP" (< espèce), le nom_sci doit correspondre à la formule :
genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_specifique
Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.
Des erreurs peuvent être générées lors de la reconstruction des formules d'hybridité à partir des champs cités ci-dessus. Pour les éviter, ne remplir que le champ concernant le rang de l'hybride."
entete = "num_nom,nom_sci,nom_sci corrigé,Proposition d'erreur,Exclusion de Taxref"
title=";;Proposition de correction. N'est pas obligatoirement correcte;;0 = non, 1 = oui, 9 = indéterminée"
[25]
abr = "Nom Supra Generique Espaces"
nom = "nom_supra_generique -> espaces en trop"
description = "Le champ nom_supra_generique ne doit pas contenir d'espace avant ou après le nom."
entete = "num_nom,nom_supra_generique erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[26]
abr = "Nom Supra Generique Syntaxe"
nom = "nom_supra_generique -> syntaxe"
description = "Le champ nom_supra_generique contient un mot composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-).
La première lettre (avec ou sans tréma) du mot doit être en majuscule."
entete = "num_nom,nom_supra_generique erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[27]
abr = "Nom Supra Generique Rang"
nom = "nom_supra_generique -> rang < "RANG_GENRE
description = "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à "RANG_GENRE" (> genre)."
entete = "num_nom,nom_sci,rang erroné,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[28]
abr = "Genre Espaces"
nom = "genre -> espaces en trop"
description = "Le champ genre ne doit pas contenir d'espace avant ou après le nom.
Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs."
entete = "num_nom,genre erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[29]
abr = "Genre Syntaxe"
nom = "genre -> syntaxe"
description = "Le champ genre peut contenir :
- un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-).
Il commence par une lettre majuscule (avec ou sans tréma) et peut être précédé par le signe + ou la lettre x suivi d'un espace.
- une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés
entre eux par la lettre x entourée de caractères espaces."
entete = "num_nom,genre erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[30]
abr = "Genre Rang"
nom = "genre -> rang >= "RANG_GENRE
description = "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à "RANG_GENRE" (< ou = genre)."
entete = "num_nom,nom_sci,rang erroné,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[31]
abr = "Epithete Infra Generique Syntaxe"
nom = "epithete_infra_generique -> syntaxe"
description = "Le champ epithete_infra_generique est composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-).
La première lettre (avec ou sans tréma) doit être en majuscule."
entete = "num_nom,epithete_infra_generique erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[32]
abr = "Epithete Infra Generique Rang"
nom = "epithete_infra_generique -> "RANG_GENRE" < rang < "RANG_SP
description = "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris entre "RANG_GENRE" (< genre) et "RANG_SP" (> espèce)."
entete = "num_nom,nom_sci,rang erroné,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[33]
abr = "Epithete Infra Generique Espaces"
nom = "epithete_infra_generique -> espaces en trop"
description = "Le champ epithete_infra_generique ne doit pas contenir d'espace avant ou après sa valeur."
entete = "num_nom,epithete_infra_generique erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[34]
abr = "Epithete Sp Espaces"
nom = "epithete_sp -> espaces en trop"
description = "Le champ epithete_sp ne doit pas contenir d'espace avant ou après le nom.
Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs."
entete = "num_nom,epithete_sp erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[35]
abr = "Epithete Sp Syntaxe"
nom = "epithete_sp -> syntaxe"
description = "Le champ epithete_sp peut contenir :
- un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-].
Il commence par une lettre minuscule [a-zëï].
Il peut être précédé par le signe + ou la lettre x suivi d'un espace.
- un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9)
ou d'un seul caractère majuscule (A-Z)
- une formule d'hybridité composée d'une série de noms d'espèce (au moins 2)
séparés entre eux par la lettre x entourée de caractères espaces."
entete = "num_nom,epithete_sp erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[36]
abr = "Epithete Sp Rang"
nom = "epithete_sp -> rang >= "RANG_SP
description = "Si le champ epithete_sp n'est pas vide alors le rang du nom doit être supérieur ou égal à "RANG_SP" (< ou = espèce)."
entete = "num_nom,nom_sci,rang erroné,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[37]
abr = "Type Epithete Espaces"
nom = "type_epithete -> espaces en trop"
description = "Le champ type_epithete ne doit pas contenir d'espace."
entete = "num_nom,type_epithete erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[38]
abr = "Type Epithete Syntaxe"
nom = "type_epithete -> syntaxe"
description = "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules, sans accent, et de tirets (-). Il commence par une lettre minuscule sans accent et se termine, ou pas, par un point."
entete = "num_nom,type_epithete erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[39]
abr = "Type Epithete Hybridite"
nom = "type_epithete -> hybridité"
description = "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme :
- «n-»
- «notho-»"
entete = "num_nom,type_epithete erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[40]
abr = "Epithete Infra Sp Espaces"
nom = "epithete_infra_sp -> espaces en trop"
description = "Le champ epithete_infra_sp ne doit pas contenir d'espace avant ou après le nom.
Si des espaces sont compris dans la valeur du champ, il ne doit pas y en avoir plusieurs consécutifs."
entete = "num_nom,epithete_infra_sp erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[41]
abr = "Epithete Infra Sp Syntaxe"
nom = "epithete_infra_sp -> syntaxe"
description = "Le champ epithete_infra_sp peut contenir :
- un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-).
Il commence par une lettre minuscule (avec ou sans tréma).
Il peut être précédé par le signe + ou la lettre x suivi d'un espace.
- une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce
(au moins 2) séparés entre eux par la lettre x entourée de caractères espaces."
entete = "num_nom,epithete_infra_sp erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[42]
abr = "Epithete Infra Sp Rang"
nom = "epithete_infra_sp -> rang > "RANG_SP
description = "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à "RANG_SP" (< espèce)."
entete = "num_nom,nom_sci,rang erroné,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[43]
abr = "Groupe Cultivar Syntaxe"
nom = "cultivar_groupe -> syntaxe"
description = "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles du code des plantes cultivées, c-à-d composer de caractères alphanumériques (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.
Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.
Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex."
entete = "num_nom,cultivar_groupe erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[44]
abr = "Groupe Cultivar Rang"
nom = "cultivar_groupe -> rang >= "RANG_GENRE
description = "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou égal à "RANG_GENRE" (< ou = genre)."
entete = "num_nom,nom_sci,rang erroné,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[45]
abr = "Cultivar Syntaxe"
nom = "cultivar -> syntaxe"
description = "Le champ cultivar_groupe doit contenir :
- un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature
des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques
(A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.
- un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet
cyrillique, arabe, chinois...
- une lettre majuscule obligatoire pour le premier caractère du premier mot et pour
les autres mots importants mais pas pour les mots mineurs.
Ne doit pas contenir :
- cv., convar. ou de guillemets simples (')."
entete = "num_nom,cultivar erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[46]
abr = "Cultivar Rang"
nom = "cultivar -> rang >= "RANG_GENRE
description = "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à "RANG_GENRE" (< ou = genre)."
entete = "num_nom,nom_sci,rang erroné,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[47]
abr = "Nom Commercial Syntaxe"
nom = "nom_commercial -> syntaxe"
description = "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces."
entete = "num_nom,cultivar erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[48]
abr = "Nom Commercial Presence Cultivar"
nom = "nom_commercial -> groupe_cultivar OU cultivar non vide"
description = "Si le champ nom_commercial contient un nom commercial alors le champ cultivar OU cultivar_groupe ne doit pas être vide."
entete = "num_nom,nom_commercial sans cultivar ou cultivar_groupe,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[49]
abr = "Auteur Syntaxe"
nom = "auteur -> syntaxe"
description = "Le champ auteur doit :
- contenir les abréviations du(es) nom(s) de l'auteur (des auteurs) ayant publié à l'origine la combinaison latine courante et respectant les standards.
- OU débuter par le mot « sensu » et contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié un nom dont la description ne correspond pas à celle de l'auteur, ou des auteurs, d'origine.
- 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 ( ).
- contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.
- inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.
- toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.
- si une citation comprend plus de deux auteurs, citer tous les auteurs (contrairement à la recommandation 46C.2 du CINB).
- pas d'espace entre le point de la dernière initiale du prénom et le nom.
- peut rester vide si le nom est un autonyme (epithete_sp = epithete_infra_sp)."
entete = "num_nom,auteur erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[50]
abr = "Annee Syntaxe"
nom = "annee -> syntaxe"
description = "Le champ annee doit :
- contenir un nombre de 4 chiffres,
- être supérieur ou égal à 1753,
- être inférieur ou égal à l'année courante."
entete = "num_nom, annee erronée,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[51]
abr = "Biblio Origine Syntaxe"
nom = "biblio_origine -> syntaxe"
description = "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères précis qui sont dans l'ordre de gauche à droite :
- éventuellement, le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de l'ouvrage dans lequel la publication est parue),
- point-virgule « ; » (si l'info précédent a été renseignée),
- abréviation, ou nom, de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom.
Cette information ne doit pas contenir de caractère virgule « , »,
- virgule « , »,
- informations permettant d'identifier plus précisément le document contenant le nom...
(par exemple, l'éditeur, le tome, le numéro d'édition, le volume...) séparées par des virgules ou d'autres caractères sauf deux points « : ».
- deux points « : »,
- numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière
pages de l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant
la position du nom dans le document. Le tiret « - » doit toujours servir à séparer un ensemble."
entete = "num_nom,biblio_origine erronée,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[52]
abr = "Homonymie Syntaxe"
nom = "homonyme -> syntaxe"
description = "Le champ homonyme contient :
- une valeur vide,
- le chiffre 1."
entete = "num_nom,homonyme erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[53]
abr = "Homonymie Existence"
nom = "homonyme -> existence"
description = "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur dans le champ nom_sci."
entete = "num_nom,homonyme introuvable,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[54]
abr = "Basionyme Syntaxe"
nom = "basionyme -> syntaxe"
description = "Le champ basionyme contient :
- une valeur vide,
- un nombre."
entete = "num_nom,basionyme erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[55]
abr = "Basionyme Existence"
nom = "basionyme -> existence"
description = "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ num_nom."
entete = "num_nom,basionyme introuvable,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[56]
abr = "Synonyme Proparte Syntaxe"
nom = "synonyme_proparte -> syntaxe"
description = "Le champ synonyme_proparte contient soit :
- une valeur vide,
- un nombre,
- une suite de nombres séparés par des virgules."
entete = "num_nom,synonyme_proparte erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[57]
abr = "Synonyme Proparte Existence"
nom = "synonyme_proparte -> existence"
description = "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux doit correspondre à une valeur du champ num_nom."
entete = "num_nom, synonyme_proparte introuvable,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[58]
abr = "Synonyme Douteux Syntaxe"
nom = "synonyme_douteux -> syntaxe"
description = "Le champ synonyme_douteux contient soit :
- une valeur vide,
- le chiffre 1."
entete = "num_nom,synonyme_douteux erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[59]
abr = "Synonyme Douteux Num Nom Retenu"
nom = "synonyme_douteux -> existence num_nom_retenu"
description = "Si le nom est un synonyme douteux, le champ num_nom_retenu doit être rempli."
entete = "num_nom,synonyme_douteux,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[60]
abr = "Synonyme Douteux Synonyme"
nom = "synonyme_douteux -> synonyme"
description = "Si le nom est un synonyme douteux, le champ num_nom_retenu doit être différent du champ num_nom."
entete = "num_nom,num_nom_retenu,synonyme_douteux,Exclusion de Taxref"
title=";;;0 = non, 1 = oui, 9 = indéterminée"
[61]
abr = "Synonyme Mal Applique Syntaxe"
nom = "synonyme_mal_applique -> syntaxe"
description = "Le champ synonyme_mal_applique contient soit :
- une valeur vide,
- le chiffre 1."
entete = "num_nom,synonyme_mal_applique erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[62]
abr = "Synonyme Mal Applique Champs Annexe"
nom = "synonyme_mal_applique -> autres champs"
description = "Si le nom est un synonyme_mal_applique, le champ auteur commence par sensu et les champs annee et auteur sont remplis."
entete = "num_nom,auteur,annee, biblio_origine,Exclusion de Taxref"
title=";;;;0 = non, 1 = oui, 9 = indéterminée"
[63]
abr = "Synonyme Mal Applique Synonyme"
nom = "synonyme_mal_applique -> synonyme"
description = "Si le nom est un synonyme_mal_applique, le champ num_nom_retenu doit être différent du champ num_nom.."
entete = "num_nom,année,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[64]
abr = "Synonyme Orthographique Syntaxe"
nom = "synonyme_orthographique -> syntaxe"
description = "Le champ synonyme_orthographique contient soit :
- une valeur vide,
- un nombre."
entete = "num_nom,synonyme_orthographique erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[65]
abr = "Synonyme Orthographique Existence"
nom = "synonyme_orthographique -> existence"
description = "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre à une valeur du champ num_nom."
entete = "num_nom,synonyme_orthographique introuvable,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[66]
abr = "Hybride Parent01 Syntaxe"
nom = "hybride_parent_01 -> syntaxe"
description = "Le champ hybride_parent_01 contient soit :
- une valeur vide,
- un nombre."
entete = "num_nom,hybride_parent_01 erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[67]
abr = "Hybride Parent01 Existence"
nom = "hybride_parent_01 -> existence"
description = "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur du champ num_nom."
entete = "num_nom,hybride_parent_01 introuvable,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[68]
abr = "Hybride Parent02 Syntaxe"
nom = "hybride_parent_02 -> syntaxe"
description = "Le champ hybride_parent_02 contient soit :
- une valeur vide,
- un nombre."
entete = "num_nom,hybride_parent_02 erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[69]
abr = "Hybride Parent02 Existence"
nom = "hybride_parent_02 -> existence"
description = "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur du champ num_nom."
entete = "num_nom,hybride_parent_02 introuvable,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[70]
abr = "Num Type Syntaxe"
nom = "num_type -> syntaxe"
description = "Le champ num_type contient :
- une valeur vide,
- un nombre."
entete = "num_nom,num_type erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[71]
abr = "Num Type Existence"
nom = "num_type -> existence"
description = "Si le champ num_type contient un nombre alors il doit correspondre à une valeur du champ num_nom."
entete = "num_nom,num_type introuvable,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[72]
abr = "Presence Syntaxe"
nom = "presence -> syntaxe"
description = "Le champ presence contient soit :
- le symbole tiret «-» précédant une autre information non référencée...
- une première lettre en majuscule indiquant le code standard attribué à ce taxon,
- éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant un code de présence spécifique au référentiel."
entete = "num_nom,presence erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[73]
abr = "Presence Existence"
nom = "presence -> existence"
description = "Pour chaque enregistrement représentant un taxon, le champ présence doit être rempli."
entete = "num_nom,num_nom_retenu,presence,Exclusion de Taxref"
title=";;;;"
[74]
abr = "Statut Origine Syntaxe"
nom = "statut_origine -> syntaxe"
description = "Le champ statut_origine peut contenir :
- le symbole tiret «-» précédant une autre information non référencée...
- une première lettre en majuscule indiquant le code standard attribué à ce taxon.
- éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant un code de présence spécifique au référentiel."
entete = "num_nom,statut_origine erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[75]
abr = "Statut Introduction Syntaxe"
nom = "statut_introduction -> syntaxe"
description = "Le champ statut_introduction peut contenir :
- le symbole tiret «-» précédant une autre information non référencée...
- une première lettre en majuscule indiquant le code standard attribué à ce taxon,
- éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant un code de présence spécifique au référentiel."
entete = "num_nom,statut_introduction erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[76]
abr = "Statut Culture Syntaxe"
nom = "statut_culture -> syntaxe"
description = "Le champ statut_culture peut contenir :
- le symbole tiret «-» précédant une autre information non référencée...
- une première lettre en majuscule indiquant le code standard attribué à ce taxon,
- éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant un code de présence spécifique au référentiel."
entete = "num_nom,statut_culture erroné,Exclusion de Taxref"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[77]
abr = "Exclure Tax Ref Syntaxe"
nom = "exclure_taxref -> syntaxe"
description = "Le champ exclure_taxref contient soit :
- une valeur vide ou NULL.
- le chiffre 0 : si le nom n'a pas à être exclu de TaxRef.
- le chiffre 1 : pour exclure le nom de TaxRef
- le chiffre 9 : quand la décision sur l'exclusion reste à prendre (le nom sera malgré tout exclu)."
entete = "num_nom,exclure_taxref erroné"
[78]
abr = "Nom francais Unique"
nom = "nom_francais -> unique"
description = "Le champ nom français peut contenir :
- une valeur vide ou NULL.
- un seul nom vernaculaire, ne contenant ni virgules, ni point-virgule"
entete = "num_nom, nom_francais"
title=";;0 = non, 1 = oui, 9 = indéterminée"
[79]
abr = "Exclure Tax Ref Presence"
nom = "exclure_taxref -> presence"
description = "Un nom retenu non-exclu de taxref doit contenir :
- une valeur correcte dans la colonne présence.
- si possible, une valeur correcte dans au moins une des colonnes de statut"
entete = "num_nom, nom_sci, presence, statut_origine, statut_introduction, statut_culture"
title=";;;;;;;"