Subversion Repositories Applications.referentiel

Compare Revisions

Ignore whitespace Rev 170 → Rev 171

/trunk/scripts/modules/tests/Tests.php
24,6 → 24,7
private $traitement = null;
private $manuel = null;
private $tests = null;
private $colonnes = null;
private $analyses = null;
private $noms = null;
35,6 → 36,7
public function executer() {
$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v4.1.ini');
$this->tests = parse_ini_file($this->getModuleChemin().DS.'configurations'.DS.'tests.ini', true);
$this->resultatDao = new ResultatDao();
$this->traitementDao = new TraitementDao();
214,171 → 216,288
//+--------------------------------------------------------------------------------------------------------------+//
// TESTS
private function testerStatutCultureSyntaxe() {
$info = array('nom' => 'statut_culture -> syntaxe',
'description' => "Le champ statut_culture peut contenir :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
" - é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.",
'resultat' => false);
/**
* Test #01
*/
private function testerNombreDeChamps($colonnes) {
$info = $this->getInfosTest(1);
$nbre_colonnes = count($colonnes);
$info['message'] = $nbre_colonnes;
if ($nbre_colonnes >= 35) {
$info['resultat'] = true;
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
/**
* Test #02
*/
private function testerNomDesChamps($colonnes) {
$info = $this->getInfosTest(2);
$champs_attendus = explode(',', $this->manuel['champs']);
$champs_presents = array();
foreach ($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));
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
/**
* Test #03
*/
private function testerTypeDesChamps($colonnes) {
$info = $this->getInfosTest(3);
$champs_attendus = explode(',', $this->manuel['champs_type']);
$champs_presents = array();
foreach ($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[] = $champ_attendu." vaut ".$champs_present_type;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = sprintf($info['message'], implode(', ', $champs_erreur));
} else {
$info['resultat'] = true;
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
/**
* Test #04
*/
private function testerNumNomClePrimaire($colonnes) {
$info = $this->getInfosTest(4);
foreach ($colonnes as $colonne) {
if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
$info['resultat'] = true;
}
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
/**
* Test #05
*/
private function testerTailleDesChamps($colonnes, $analyses) {
$info = $this->getInfosTest(5);
$tailles_champs_maxi = array();
foreach ($colonnes as $colonne) {
if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
$tailles_champs_maxi[$colonne['Field']] = $match[1];
}
}
$tailles_trouvees = array();
foreach ($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[] = $champ_attendu;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = sprintf($info['message'], implode(', ', $champs_erreur));
} else {
$info['resultat'] = true;
}
$this->traiterResultatTest($info);
}
/**
* Test #06
*/
private function testerNumNomSuperieurAZero() {
$info = $this->getInfosTest(6);
// Réalisation du test
$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']);
}
if ($nom['num_nom'] <= 0) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
$info['message']['lignes'] = $noms_erreur;
$info['message'] = sprintf($info['message'], count($noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerStatutIntroductionSyntaxe() {
$info = array('nom' => 'statut_introduction -> syntaxe',
'description' => "Le champ statut_introduction peut contenir :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
" - é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.",
'resultat' => false);
/**
* Test #07
*/
private function testerNumNomRetenuSuperieurAZero() {
$info = $this->getInfosTest(7);
// Réalisation du test
$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']);
}
if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
$info['message']['lignes'] = $noms_erreur;
$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerStatutOrigineSyntaxe() {
$info = array('nom' => 'statut_origine -> syntaxe',
'description' => "Le champ statut_origine peut contenir :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - é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.",
'resultat' => false);
/**
* Test #08
*/
private function testerNumTaxSupEgalZeroUnique() {
$info = $this->getInfosTest(8);
// Réalisation du test
$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']);
}
if (preg_match('/^0$/', $nom['num_tax_sup'])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
$info['message']['lignes'] = $noms_erreur;
if (count($noms_erreur) > 1) {
$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerPresenceSyntaxe() {
$info = array('nom' => 'presence -> syntaxe',
'description' => "Le champ presence contient soit :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
" - é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.",
'resultat' => false);
/**
* Test #09
*/
private function testerTaxSupPourTaxon() {
$info = $this->getInfosTest(9);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['presence'] != '') {
if (!$this->verifierPresence($nom['presence'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
}
if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'presence erroné');
$info['message']['lignes'] = $noms_erreur;
$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerHybrideParent02Existence() {
$info = array('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.",
'resultat' => false);
/**
* Test #10
*/
private function testerExitenceTaxonSuperieur() {
$info = $this->getInfosTest(10);
// Réalisation du test
$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']));
}
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
$info['message']['lignes'] = $noms_erreur;
$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerHybrideParent02Syntaxe() {
$info = array('nom' => 'hybride_parent_02 -> syntaxe',
'description' => "Le champ hybride_parent_02 contient soit :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
/**
* Test #11
*/
private function testerClassificationRang() {
$info = $this->getInfosTest(11);
// Réalisation du test
$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']));
if ($nom['num_nom_retenu'] == $nom['num_nom']) {
if (isset($this->noms[$nom['num_tax_sup']])) {
$nom_sup = $this->noms[$nom['num_tax_sup']];
if ($nom_sup['rang'] >= $nom['rang']) {
// Prise en compte de l'exception des clades
if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
$noms_erreur[] = $nom['num_nom'];
}
}
}
}
}
385,86 → 504,120
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
$info['message']['lignes'] = $noms_erreur;
$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerHybrideParent01Existence() {
$info = array('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.",
'resultat' => false);
/**
* Test #12
*/
private function testerClassification() {
$info = $this->getInfosTest(12);
// Réalisation du test
$noms_erreur = array();
$this->noms_ok = 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']));
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 === false) {
$noms_erreur[] = $nom['num_nom'];
} else {
$this->noms_ok[$nom['num_nom']] = $classif_ok;
}
}
}
}
unset($this->noms_ok);
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
$info['message']['lignes'] = $noms_erreur;
$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerHybrideParent01Syntaxe() {
$info = array('nom' => 'hybride_parent_01 -> syntaxe',
'description' => "Le champ hybride_parent_01 contient soit :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
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 false;
} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
return false;
} else {
$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
if ($retour === true) {
$this->noms_ok[$nom['num_tax_sup']] = true;
}
return $retour;
}
} else {
return false;
}
}
/**
* Test #13
*/
private function testerRang() {
$info = $this->getInfosTest(13);
$rangs = array_flip(explode(',', $this->manuel['rangs']));
// Réalisation du test
$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']));
}
if (!isset($rangs[$nom['rang']])) {
$noms_erreur[] = $nom['num_nom'];
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
$info['message']['lignes'] = $noms_erreur;
$info['message'] = sprintf($info['message'], count($noms_erreur), implode(', ', $noms_erreur));
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerSynonymeOrthographiqueExistence() {
$info = array('nom' => 'synonyme_orthographique -> existence',
'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
"à une valeur du champ num_nom.",
'resultat' => false);
/**
* Test #14
*/
private function testerNomCompletSupraGenerique() {
$info = $this->getInfosTest(14);
$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
// Réalisation du test
$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']);
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);
}
}
}
471,29 → 624,32
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerSynonymeOrthographiqueSyntaxe() {
$info = array('nom' => 'synonyme_orthographique -> syntaxe',
'description' => "Le champ synonyme_orthographique contient soit :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
/**
* Test #15
*/
private function testerNomCompletGenre() {
$info = $this->getInfosTest(15);
$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
// Réalisation du test
$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']);
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);
}
}
}
500,36 → 656,48
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerSynonymeMalAppliqueSyntaxe() {
$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
'description' => "Le champ synonyme_mal_applique contient soit :\n".
" - une valeur vide,\n".
" - le chiffre 1.",
'resultat' => false);
/**
* Test #16
*/
private function testerNomCompletInfraGenre() {
$info = $this->getInfosTest(16);
$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
// Réalisation du test
$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']);
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']);
$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
$nom_sci_ideal .= ' '.$nom['type_epithete'];
} else {
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_sci_ideal .= ' '.$nom['type_epithete'];
$nom_sci_ideal .= ' '.$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);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
539,20 → 707,24
$this->traiterResultatTest($info);
}
private function testerSynonymeDouteuxSyntaxe() {
$info = array('nom' => 'synonyme_douteux -> syntaxe',
'description' => "Le champ synonyme_douteux contient soit :\n".
" - une valeur vide,\n".
" - le chiffre 1.",
'resultat' => false);
/**
* Test #17
*/
private function testerNomCompletEspece() {
$info = $this->getInfosTest(17);
$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
// Réalisation du test
$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']);
if ($nom['rang'] == $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
$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);
}
}
}
559,7 → 731,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
569,57 → 741,62
$this->traiterResultatTest($info);
}
private function testerSynonymeDouteuxNumNomRetenu() {
$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
'resultat' => false);
/**
* Test #18
*/
private function testerNomCompletInfraSpecifique() {
$info = $this->getInfosTest(18);
$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
if ($nom['rang'] > $this->manuel['rang_sp']) {
$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
$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);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerSynonymeProparteExistence() {
$info = array('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.",
'resultat' => false);
/**
* Test #19
*/
private function testerNomSupraGeneriqueEspaces() {
$info = $this->getInfosTest(19);
// Réalisation du test
$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 ($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);
}
if (count($nbre_en_erreur) > 0) {
$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
629,20 → 806,19
$this->traiterResultatTest($info);
}
private function testerSynonymeProparteSyntaxe() {
$info = array('nom' => 'synonyme_proparte -> syntaxe',
'description' => "Le champ synonyme_proparte contient soit :\n".
" - une valeur vide,\n".
" - un nombre,\n".
" - une suite de nombres séparés par des virgules.",
'resultat' => false);
/**
* Test #20
*/
private function testerNomSupraGeneriqueSyntaxe() {
$info = $this->getInfosTest(20);
// Réalisation du test
$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']);
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);
}
}
}
649,7 → 825,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
659,18 → 835,20
$this->traiterResultatTest($info);
}
private function testerBasionymeExistence() {
$info = array('nom' => 'basionyme -> existence',
'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
/**
* Test #21
*/
private function testerNomSupraGeneriqueRang() {
$info = $this->getInfosTest(21);
$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['basionyme'] != '') {
if (!isset($this->noms[$nom['basionyme']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
if ($nom['nom_supra_generique'] != '') {
if ($nom['rang'] >= $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
}
}
}
677,7 → 855,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
687,19 → 865,19
$this->traiterResultatTest($info);
}
private function testerBasionymeSyntaxe() {
$info = array('nom' => 'basionyme -> syntaxe',
'description' => "Le champ basionyme contient :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
/**
* Test #22
*/
private function testerGenreEspaces() {
$info = $this->getInfosTest(22);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['basionyme'] != '') {
if (!$this->verifierNombre($nom['basionyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
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);
}
}
}
706,7 → 884,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'basionyme erroné');
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
716,28 → 894,29
$this->traiterResultatTest($info);
}
private function testerHomonymieExistence() {
$info = array('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.",
'resultat' => false);
/**
* Test #23
*/
private function testerGenreSyntaxe() {
$info = $this->getInfosTest(23);
$noms_homonymie = $this->classerNomsParNomComplet();
// Réalisation du test
$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']);
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);
}
}
}
}
$noms_homonymie = null;
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
747,19 → 926,20
$this->traiterResultatTest($info);
}
private function testerHomonymieSyntaxe() {
$info = array('nom' => 'homonyme -> syntaxe',
'description' => "Le champ homonyme contient :\n".
" - une valeur vide,\n".
" - le chiffre 1.",
'resultat' => false);
/**
* Test #24
*/
private function testerGenreRang() {
$info = $this->getInfosTest(24);
$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['homonyme'] != '') {
if (!$this->verifierBooleen($nom['homonyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
if ($nom['genre'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
}
}
}
766,7 → 946,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'homonyme erroné');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
775,33 → 955,20
$this->traiterResultatTest($info);
}
private function testerBiblioOrigineSyntaxe() {
$info = array('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 :\n".
" - éventuellement, le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
"l'ouvrage dans lequel la publication est parue),\n".
" - point-virgule « ; » (si l'info précédent a été renseignée),\n".
" - 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 « , »,\n".
" - virgule « , »,\n".
" - 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 « : ».\n".
" - deux points « : »,\n".
" - 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.",
'resultat' => false);
/**
* Test #25
*/
private function testerEpitheteInfraGeneriqueSyntaxe() {
$info = $this->getInfosTest(25);
// Réalisation du test
$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);
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);
}
}
}
808,7 → 975,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
818,19 → 985,20
$this->traiterResultatTest($info);
}
private function testerAnneeSyntaxe() {
$info = array('nom' => 'annee -> syntaxe',
'description' => "Le champ annee doit :\n".
" - contenir un nombre de 4 chiffres,\n".
" - être supérieur ou égal à 1753.",
'resultat' => false);
/**
* Test #26
*/
private function testerEpitheteInfraGeneriqueRang() {
$info = $this->getInfosTest(26);
$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['annee'] != '') {
if (!$this->verifierAnnee($nom['annee'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
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']);
}
}
}
837,7 → 1005,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'annee erroné');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
847,28 → 1015,19
$this->traiterResultatTest($info);
}
private function testerAuteurSyntaxe() {
$info = array('nom' => 'auteur -> syntaxe',
'description' => "Le champ auteur doit :\n".
" - contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié à l'origine la combinaison latine courante.\n".
" - 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.\n".
" - 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".
" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
'resultat' => false);
/**
* Test #27
*/
private function testerEpitheteInfraGeneriqueEspaces() {
$info = $this->getInfosTest(27);
// Réalisation du test
$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);
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);
}
}
}
875,7 → 1034,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'auteur erroné');
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
885,19 → 1044,18
$this->traiterResultatTest($info);
}
private function testerNomCommercialSyntaxe() {
$info = array('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.\n",
'resultat' => false);
/**
* Test #28
*/
private function testerEpitheteSpEspaces() {
$info = $this->getInfosTest(28);
// Réalisation du test
$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']);
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);
}
}
905,7 → 1063,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
915,23 → 1073,29
$this->traiterResultatTest($info);
}
private function testerNomCommercialPresenceCultivar() {
$info = array('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.",
'resultat' => false);
/**
* Test #29
*/
private function testerEpitheteSpSyntaxe() {
$info = $this->getInfosTest(29);
// Réalisation du test
$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']);
if ($nom['epithete_sp'] != '') {
$mots = explode(' ', $nom['epithete_sp']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
941,27 → 1105,20
$this->traiterResultatTest($info);
}
private function testerCultivarSyntaxe() {
$info = array('nom' => 'cultivar -> syntaxe',
'description' => "Le champ cultivar_groupe doit contenir :\n".
" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature \n".
" des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques \n".
" (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.\n".
" - un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet \n".
" cyrillique, arabe, chinois...\n".
" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour \n".
" les autres mots importants mais pas pour les mots mineurs.\n".
"Ne doit pas contenir :\n".
" - cv., convar. ou de guillemets simples (').\n",
'resultat' => false);
/**
* Test #30
*/
private function testerEpitheteSpRang() {
$info = $this->getInfosTest(30);
$info['nom'] = sprintf($info['nom'], $this->manuel['rang_sp']);
$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
// Réalisation du test
$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);
if ($nom['epithete_sp'] != '') {
if ($nom['rang'] < $this->manuel['rang_sp']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
}
}
}
968,7 → 1125,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
978,18 → 1135,19
$this->traiterResultatTest($info);
}
private function testerCultivarRang() {
$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à ".
"{$this->manuel['rang_genre']}.",
'resultat' => false);
/**
* Test #31
*/
private function testerTypeEpitheteEspaces() {
$info = $this->getInfosTest(31);
// Réalisation du test
$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']);
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);
}
}
}
996,32 → 1154,27
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerGroupeCultivarSyntaxe() {
$info = array('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.\n".
"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
'resultat' => false);
/**
* Test #32
*/
private function testerTypeEpitheteSyntaxe() {
$info = $this->getInfosTest(32);
// Réalisation du test
$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);
if ($nom['type_epithete'] != '') {
if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
}
}
}
1028,28 → 1181,27
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerGroupeCultivarRang() {
$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou ".
"égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
/**
* Test #33
*/
private function testerTypeEpitheteHybridite() {
$info = $this->getInfosTest(33);
// Réalisation du test
$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']);
if ($nom['type_epithete'] != '') {
if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
}
}
}
1056,21 → 1208,20
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
/**
* Test #34
*/
private function testerEpitheteInfraSpEspaces() {
$info = array('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.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
'resultat' => false);
$info = $this->getInfosTest(34);
// Réalisation du test
$noms_erreur = array();
1095,15 → 1246,11
$this->traiterResultatTest($info);
}
/**
* Test #35
*/
private function testerEpitheteInfraSpSyntaxe() {
$info = array('nom' => 'epithete_infra_sp -> syntaxe',
'description' => "Le champ epithete_infra_sp peut contenir :\n".
" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
" Il commence par une lettre minuscule (avec ou sans tréma).\n".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - une formule d'hybridité composée d'une série de noms d'espèce ou d'infra espèce \n".
" (au moins 2) séparés entre eux par la lettre x entourée de caractères espaces.",
'resultat' => false);
$info = $this->getInfosTest(35);
// Réalisation du test
$noms_erreur = array();
1131,10 → 1278,13
$this->traiterResultatTest($info);
}
/**
* Test #36
*/
private function testerEpitheteInfraSpRang() {
$info = array('nom' => "epithete_infra_sp -> rang > {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_infra_sp n'est pas vide alors le rang du nom doit être supérieur à {$this->manuel['rang_sp']}.",
'resultat' => false);
$info = $this->getInfosTest(36);
$info['nom'] = sprintf($info['nom'], $this->manuel['rang_sp']);
$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
// Réalisation du test
$noms_erreur = array();
1158,18 → 1308,21
$this->traiterResultatTest($info);
}
private function testerTypeEpitheteEspaces() {
$info = array('nom' => 'type_epithete -> espaces en trop',
'description' => "Le champ type_epithete ne doit pas contenir d'espace.",
private function testerStatutCultureSyntaxe() {
$info = array('nom' => 'statut_culture -> syntaxe',
'description' => "Le champ statut_culture peut contenir :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
" - é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.",
'resultat' => false);
// Réalisation du test
$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);
if ($nom['statut_culture'] != '') {
if (!$this->verifierStatutCulture($nom['statut_culture'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
}
}
}
1176,27 → 1329,31
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerTypeEpitheteSyntaxe() {
$info = array('nom' => 'type_epithete -> syntaxe',
'description' => "Le champ type_epithete doit contenir un mot unique composé de lettres minuscules, sans ".
" accents, et de tirets (-). Il commence par une lettre minuscule sans accent.",
private function testerStatutIntroductionSyntaxe() {
$info = array('nom' => 'statut_introduction -> syntaxe',
'description' => "Le champ statut_introduction peut contenir :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
" - é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.",
'resultat' => false);
// Réalisation du test
$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']);
if ($nom['statut_introduction'] != '') {
if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
}
}
}
1203,28 → 1360,31
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerTypeEpitheteHybridite() {
$info = array('nom' => 'type_epithete -> hybridité',
'description' => "Le champ type_epithete ne doit pas contenir de préfixe indiquant l'hybridité comme : \n".
" - «n-» \n".
" - «notho-» \n",
private function testerStatutOrigineSyntaxe() {
$info = array('nom' => 'statut_origine -> syntaxe',
'description' => "Le champ statut_origine peut contenir :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
" - é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.",
'resultat' => false);
// Réalisation du test
$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']);
if ($nom['statut_origine'] != '') {
if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
}
}
}
1231,299 → 1391,174
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerNombreDeChamps($colonnes) {
$info = array('nom' => 'Structure -> nombre de champs',
'description' => 'Le nombre de champs présent dans la table doit être supérieur ou égal à 35.',
private function testerPresenceSyntaxe() {
$info = array('nom' => 'presence -> syntaxe',
'description' => "Le champ presence contient soit :\n".
" - le symbole tiret «-» précédant une autre information non référencée...\n".
" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
" - é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.",
'resultat' => false);
$nbre_colonnes = count($colonnes);
$info['message'] = $nbre_colonnes;
if ($nbre_colonnes >= 35) {
$info['resultat'] = true;
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
private function testerNomDesChamps($colonnes) {
$info = array('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.',
'resultat' => false);
$champs_attendus = explode(',', $this->manuel['champs']);
$champs_presents = array();
foreach ($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'] = 'Champs manquants : '.implode(', ', $champs_manquant).'.';
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
private function testerTypeDesChamps($colonnes) {
$info = array('nom' => 'Structure -> types des champs',
'description' => 'Les types des champs de la table contenant le référentiel doivent être conformes à ceux '.
'définis par le manuel technique.',
'resultat' => false);
$champs_attendus = explode(',', $this->manuel['champs_type']);
$champs_presents = array();
foreach ($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[] = $champ_attendu." vaut ".$champs_present_type;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = "Champs n'ayant pas un type conforme : ".implode(', ', $champs_erreur).'.';
} else {
$info['resultat'] = true;
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
private function testerTailleDesChamps($colonnes, $analyses) {
$info = array('nom' => 'Structure -> champs tronqués',
'description' => "Evalue le risque que des données de type texte aient pu être tronquées lors de leur insertion.\n".
"Un résultat de type KO ne signifie pas forcément un problème à résoudre mais attire l'attention du coordinateur ".
"sur un problème éventuel.",
'resultat' => false);
$tailles_champs_maxi = array();
foreach ($colonnes as $colonne) {
if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
$tailles_champs_maxi[$colonne['Field']] = $match[1];
}
}
$tailles_trouvees = array();
foreach ($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[] = $champ_attendu;
}
}
}
// Analyse des résultats
if (count($champs_erreur) > 0) {
$info['message'] = "Champs possédant des enregistrements qui atteignent la taille maximum autorisée : ".
implode(', ', $champs_erreur).'.';
} else {
$info['resultat'] = true;
}
$this->traiterResultatTest($info);
}
private function testerNumNomClePrimaire($colonnes) {
$info = array('nom' => 'Structure -> num_nom est clé primaire',
'description' => "Vérifie que le champ num_nom est bien la clé primaire de la table.",
'resultat' => false);
foreach ($colonnes as $colonne) {
if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
$info['resultat'] = true;
}
}
$this->traiterResultatTest($info);
return ($info['resultat'] ? '1' : '0');
}
private function testerNumNomSuperieurAZero() {
$info = array('nom' => 'num_nom -> supérieur à 0',
'description' => "Le champ num_nom doit contenir des nombres entiers supérieurs à 0.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom'] <= 0) {
$noms_erreur[] = $nom['num_nom'];
if ($nom['presence'] != '') {
if (!$this->verifierPresence($nom['presence'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements contiennent dans le champ num_nom une valeur ".
"inférieure ou égale à 0.";
$info['message']['entete'] = array('num_nom', 'presence erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerNumNomRetenuSuperieurAZero() {
$info = array('nom' => 'num_nom_retenu -> supérieur à 0',
'description' => "Le champ num_nom_retenu doit contenir des nombres entiers supérieurs à 0 ou être vide.",
private function testerHybrideParent02Existence() {
$info = array('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.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
$noms_erreur[] = $nom['num_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']));
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements dont le champ num_nom_retenu est inférieur ou égal à 0 : ".
implode(', ', $noms_erreur).'.';
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerNumTaxSupEgalZeroUnique() {
$info = array('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.",
private function testerHybrideParent02Syntaxe() {
$info = array('nom' => 'hybride_parent_02 -> syntaxe',
'description' => "Le champ hybride_parent_02 contient soit :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if (preg_match('/^0$/', $nom['num_tax_sup'])) {
$noms_erreur[] = $nom['num_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']));
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 1) {
$info['message'] = count($noms_erreur)." enregistrements ont une valeur de 0 dans le champ num_tax_sup : ".
implode(', ', $noms_erreur).'.';
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerTaxSupPourTaxon() {
$info = array('nom' => 'Classification -> uniquement pour les taxons',
'description' => "Seuls les enregistrements représentant un taxon doivent posséder une valeur dans le champ ".
"num_tax_sup.\n Si num_nom_retenu est différent de num_nom (= nom synonyme) alors num_tax_sup doit être vide.",
private function testerHybrideParent01Existence() {
$info = array('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.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
$noms_erreur[] = $nom['num_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']));
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements ne sont pas des taxons et possèdent une ".
"valeur dans num_tax_sup : ".implode(', ', $noms_erreur).'.';
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerExitenceTaxonSuperieur() {
$info = array('nom' => 'Classification -> existence du taxon supérieur',
'description' => "Chaque enregistrement représentant un taxon doit posséder un taxon supérieur sauf ".
"la racine de la classification.",
private function testerHybrideParent01Syntaxe() {
$info = array('nom' => 'hybride_parent_01 -> syntaxe',
'description' => "Le champ hybride_parent_01 contient soit :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
// Réalisation du test
$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[] = $nom['num_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']));
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements dont le taxon supérieur n'existe pas : ".
implode(', ', $noms_erreur).'.';
$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerClassificationRang() {
$info = array('nom' => 'Classification -> taxon supérieur avec rang inférieur',
'description' => "Pour chaque enregistrement représentant un taxon, le taxon supérieur doit avoir ".
"un rang inférieur au taxon courant (à l'exception des noms ayant le rang de Clade).",
private function testerSynonymeOrthographiqueExistence() {
$info = array('nom' => 'synonyme_orthographique -> existence',
'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
"à une valeur du champ num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
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']];
if ($nom_sup['rang'] >= $nom['rang']) {
// Prise en compte de l'exception des clades
if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
$noms_erreur[] = $nom['num_nom'];
}
}
if ($nom['synonyme_orthographique'] != '') {
if (!isset($this->noms[$nom['synonyme_orthographique']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
}
}
}
1530,120 → 1565,88
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." enregistrements avec un problème : ".implode(', ', $noms_erreur).'.';
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerClassification() {
$info = array('nom' => 'Classification -> racine liée à chaque noeud',
'description' => "Pour chaque enregistrement, la classification doit pouvoir être remontée ".
"jusqu'à un nom unique possédant une valeur num_tax_sup de 0.",
private function testerSynonymeOrthographiqueSyntaxe() {
$info = array('nom' => 'synonyme_orthographique -> syntaxe',
'description' => "Le champ synonyme_orthographique contient soit :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
// Réalisation du test
$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 === false) {
$noms_erreur[] = $nom['num_nom'];
} else {
$this->noms_ok[$nom['num_nom']] = $classif_ok;
}
foreach ($this->noms as $nom) {
if ($nom['synonyme_orthographique'] != '') {
if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
}
}
}
unset($this->noms_ok);
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." taxons dont la classification n'est pas bonne : ".
implode(', ', $noms_erreur).'.';
$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
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 false;
} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
return false;
} else {
$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
if ($retour === true) {
$this->noms_ok[$nom['num_tax_sup']] = true;
}
return $retour;
}
} else {
return false;
}
}
private function testerRang() {
$info = array('nom' => 'rang',
'description' => "Le rang doit correspondre à une valeur numérique définie dans le manuel.",
private function testerSynonymeMalAppliqueSyntaxe() {
$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
'description' => "Le champ synonyme_mal_applique contient soit :\n".
" - une valeur vide,\n".
" - le chiffre 1.",
'resultat' => false);
$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[] = $nom['num_nom'];
if ($nom['synonyme_mal_applique'] != '') {
if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
}
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message'] = count($noms_erreur)." noms dont le rang n'est pas bon : ".implode(', ', $noms_erreur).'.';
$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerNomCompletSupraGenerique() {
$info = array('nom' => 'nom_sci -> noms supra-génériques',
'description' => "Si le rang est < à {$this->manuel['rang_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.",
private function testerSynonymeDouteuxSyntaxe() {
$info = array('nom' => 'synonyme_douteux -> syntaxe',
'description' => "Le champ synonyme_douteux contient soit :\n".
" - une valeur vide,\n".
" - le chiffre 1.",
'resultat' => false);
// Réalisation du test
$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);
if ($nom['synonyme_douteux'] != '') {
if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
}
}
}
1650,74 → 1653,60
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerNomCompletGenre() {
$info = array('nom' => 'nom_sci -> noms de genres',
'description' => "Si le rang est = à {$this->manuel['rang_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.",
private function testerSynonymeDouteuxNumNomRetenu() {
$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
'resultat' => false);
// Réalisation du test
$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);
}
if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
}
$noms_erreur = null;
$this->traiterResultatTest($info);
}
private function testerNomCompletInfraGenre() {
$info = array('nom' => 'nom_sci -> noms infra-génériques',
'description' => "Si le rang est > à {$this->manuel['rang_genre']} et < à {$this->manuel['rang_sp']},".
" le nom_sci doit correspondre à une des formules suivantes : \n".
" genre + ' ' + type_epithete + ' ' + epithete_infra_generique \n".
" genre + ' ' + epithete_infra_generique + ' ' + type_epithete=agg. \n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
private function testerSynonymeProparteExistence() {
$info = array('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.",
'resultat' => false);
// Réalisation du test
$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']);
$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
$nom_sci_ideal .= ' '.$nom['type_epithete'];
} else {
$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
$nom_sci_ideal .= ' '.$nom['type_epithete'];
$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
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;
}
}
$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);
if (count($nbre_en_erreur) > 0) {
$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
}
}
}
1724,7 → 1713,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1734,24 → 1723,20
$this->traiterResultatTest($info);
}
private function testerNomCompletEspece() {
$info = array('nom' => "nom_sci -> noms d'espèce",
'description' => "Si le rang est = à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
" genre + ' ' + epithete_sp \n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
private function testerSynonymeProparteSyntaxe() {
$info = array('nom' => 'synonyme_proparte -> syntaxe',
'description' => "Le champ synonyme_proparte contient soit :\n".
" - une valeur vide,\n".
" - un nombre,\n".
" - une suite de nombres séparés par des virgules.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
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']);
$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
$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);
if ($nom['synonyme_proparte'] != '') {
if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
}
}
}
1758,7 → 1743,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1768,26 → 1753,18
$this->traiterResultatTest($info);
}
private function testerNomCompletInfraSpecifique() {
$info = array('nom' => 'nom_sci -> noms infra-spécifiques',
'description' => "Si le rang est > à {$this->manuel['rang_sp']}, le nom_sci doit correspondre à la formule : \n".
" genre + ' ' + epithete_sp + ' ' + type_epithete + ' ' + epithete_infra_generique\n".
"Les valeurs des champs cultivar_groupe, cultivar et nom_commercial peuvent s'y ajouter.",
private function testerBasionymeExistence() {
$info = array('nom' => 'basionyme -> existence',
'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
"num_nom.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
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']);
$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
$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);
if ($nom['basionyme'] != '') {
if (!isset($this->noms[$nom['basionyme']])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
}
}
}
1794,7 → 1771,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1804,18 → 1781,19
$this->traiterResultatTest($info);
}
private function testerNomSupraGeneriqueEspaces() {
$info = array('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.",
private function testerBasionymeSyntaxe() {
$info = array('nom' => 'basionyme -> syntaxe',
'description' => "Le champ basionyme contient :\n".
" - une valeur vide,\n".
" - un nombre.",
'resultat' => false);
// Réalisation du test
$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);
if ($nom['basionyme'] != '') {
if (!$this->verifierNombre($nom['basionyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
}
}
}
1822,7 → 1800,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['entete'] = array('num_nom', 'basionyme erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1832,20 → 1810,25
$this->traiterResultatTest($info);
}
private function testerNomSupraGeneriqueSyntaxe() {
$info = array('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 (-). \n".
"La première lettre (avec ou sans tréma) du mot doit être en majuscule.",
/**
* Test #37
*/
private function testerGroupeCultivarSyntaxe() {
$info = array('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.\n".
"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
'resultat' => false);
// Réalisation du test
$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);
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);
}
}
}
1852,7 → 1835,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1862,16 → 1845,20
$this->traiterResultatTest($info);
}
private function testerNomSupraGeneriqueRang() {
$info = array('nom' => "nom_supra_generique -> rang < {$this->manuel['rang_genre']}",
'description' => "Si le champ nom_supra_generique n'est pas vide alors le rang du nom doit être inférieur à {$this->manuel['rang_genre']}.",
/**
* Test #38
*/
private function testerGroupeCultivarRang() {
$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou ".
"égal à {$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['nom_supra_generique'] != '') {
if ($nom['rang'] >= $this->manuel['rang_genre']) {
if ($nom['cultivar_groupe'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
}
}
1889,19 → 1876,30
$this->traiterResultatTest($info);
}
private function testerGenreEspaces() {
$info = array('nom' => 'genre -> espaces en trop',
'description' => "Le champ genre ne doit pas contenir d'espace avant ou après le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
/**
* Test #39
*/
private function testerCultivarSyntaxe() {
$info = array('nom' => 'cultivar -> syntaxe',
'description' => "Le champ cultivar_groupe doit contenir :\n".
" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature \n".
" des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques \n".
" (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.\n".
" - un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet \n".
" cyrillique, arabe, chinois...\n".
" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour \n".
" les autres mots importants mais pas pour les mots mineurs.\n".
"Ne doit pas contenir :\n".
" - cv., convar. ou de guillemets simples (').\n",
'resultat' => false);
// Réalisation du test
$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);
if ($nom['cultivar'] != '') {
if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
$epithete_traite = $this->repererEspace($nom['cultivar']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
}
}
1908,7 → 1906,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1918,26 → 1916,21
$this->traiterResultatTest($info);
}
private function testerGenreSyntaxe() {
$info = array('nom' => 'genre -> syntaxe',
'description' => "Le champ genre peut contenir :\n".
" - un mot unique composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
" Il commence par une lettre majuscule (avec ou sans tréma) et peut être précédé par \n".
" le signe + ou la lettre x suivi d'un espace.\n".
" - une formule d'hybridité composée d'une série de noms de genre (au moins 2) séparés\n".
" entre eux par la lettre x entourée de caractères espaces.",
/**
* Test #40
*/
private function testerCultivarRang() {
$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à ".
"{$this->manuel['rang_genre']}.",
'resultat' => false);
// Réalisation du test
$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);
}
if ($nom['cultivar'] != '') {
if ($nom['rang'] < $this->manuel['rang_genre']) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
}
}
}
1944,7 → 1937,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'genre erroné');
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1954,17 → 1947,23
$this->traiterResultatTest($info);
}
private function testerGenreRang() {
$info = array('nom' => "genre -> rang >= {$this->manuel['rang_genre']}",
'description' => "Si le champ genre n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_genre']}.",
/**
* Test #41
*/
private function testerNomCommercialSyntaxe() {
$info = array('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.\n",
'resultat' => false);
// Réalisation du test
$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']);
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);
}
}
}
1971,7 → 1970,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['entete'] = array('num_nom', 'cultivar erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
1980,27 → 1979,27
$this->traiterResultatTest($info);
}
private function testerEpitheteInfraGeneriqueSyntaxe() {
$info = array('nom' => 'epithete_infra_generique -> syntaxe',
'description' => "Le champ epithete_infra_generique est composé de lettres minuscules, avec ou sans tréma (¨), et de tirets (-). \n".
"La première lettre (avec ou sans tréma) doit être en majuscule.",
/**
* Test #42
*/
private function testerNomCommercialPresenceCultivar() {
$info = array('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.",
'resultat' => false);
// Réalisation du test
$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);
}
if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
}
}
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
2010,18 → 2009,31
$this->traiterResultatTest($info);
}
private function testerEpitheteInfraGeneriqueRang() {
$info = array('nom' => "epithete_infra_generique -> {$this->manuel['rang_genre']} < rang < {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_infra_generique n'est pas vide alors le rang du nom doit être compris ".
"entre {$this->manuel['rang_genre']} et {$this->manuel['rang_sp']}.",
/**
* Test #43
*/
private function testerAuteurSyntaxe() {
$info = array('nom' => 'auteur -> syntaxe',
'description' => "Le champ auteur doit :\n".
" - contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié à l'origine la combinaison latine courante.\n".
" - 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.\n".
" - 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".
" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
'resultat' => false);
// Réalisation du test
$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']);
if ($nom['auteur'] != '') {
if (!$this->verifierAuteur($nom['auteur'])) {
$intitule_traite = $this->repererEspace($nom['auteur']);
$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
}
}
}
2028,7 → 2040,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['entete'] = array('num_nom', 'auteur erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
2038,18 → 2050,22
$this->traiterResultatTest($info);
}
private function testerEpitheteInfraGeneriqueEspaces() {
$info = array('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.",
/**
* Test #44
*/
private function testerAnneeSyntaxe() {
$info = array('nom' => 'annee -> syntaxe',
'description' => "Le champ annee doit :\n".
" - contenir un nombre de 4 chiffres,\n".
" - être supérieur ou égal à 1753.",
'resultat' => false);
// Réalisation du test
$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);
if ($nom['annee'] != '') {
if (!$this->verifierAnnee($nom['annee'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
}
}
}
2056,7 → 2072,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
$info['message']['entete'] = array('num_nom', 'annee erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
2066,19 → 2082,35
$this->traiterResultatTest($info);
}
private function testerEpitheteSpEspaces() {
$info = array('nom' => 'epithete_sp -> espaces en trop',
'description' => "Le champ epithete_sp ne doit pas contenir d'espace avant ou après le nom.\n".
"Si des espaces sont compris dans la valeur du champ, il ne doit pas en avoir plusieurs consécutifs.",
/**
* Test #45
*/
private function testerBiblioOrigineSyntaxe() {
$info = array('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 :\n".
" - éventuellement, le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
"l'ouvrage dans lequel la publication est parue),\n".
" - point-virgule « ; » (si l'info précédent a été renseignée),\n".
" - 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 « , »,\n".
" - virgule « , »,\n".
" - 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 « : ».\n".
" - deux points « : »,\n".
" - 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.",
'resultat' => false);
// Réalisation du test
$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);
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);
}
}
}
2085,7 → 2117,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
2095,28 → 2127,22
$this->traiterResultatTest($info);
}
private function testerEpitheteSpSyntaxe() {
$info = array('nom' => 'epithete_sp -> syntaxe',
'description' => "Le champ epithete_sp peut contenir :\n".
" - un mot unique composé de lettres minuscules [a-z] incluant les caractères [ëï-]. \n".
" Il commence par une lettre minuscule [a-zëï].\n".
" Il peut être précédé par le signe + ou la lettre x suivi d'un espace.\n".
" - un mot contenant sp. suivi d'un ou plusieurs caractères numériques (1-9) \n".
" ou d'un seul caractère majuscule (A-Z) \n".
" - une formule d'hybridité composée d'une série de noms d'espèce (au moins 2) \n".
" séparés entre eux par la lettre x entourée de caractères espaces.",
/**
* Test #46
*/
private function testerHomonymieSyntaxe() {
$info = array('nom' => 'homonyme -> syntaxe',
'description' => "Le champ homonyme contient :\n".
" - une valeur vide,\n".
" - le chiffre 1.",
'resultat' => false);
// Réalisation du test
$noms_erreur = array();
foreach ($this->noms as &$nom) {
if ($nom['epithete_sp'] != '') {
$mots = explode(' ', $nom['epithete_sp']);
foreach ($mots as $mot) {
if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
$epithete_traite = $this->repererEspace($nom['epithete_sp']);
$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
}
if ($nom['homonyme'] != '') {
if (!$this->verifierBooleen($nom['homonyme'])) {
$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
}
}
}
2123,7 → 2149,7
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
$info['message']['entete'] = array('num_nom', 'homonyme erroné');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
2133,24 → 2159,31
$this->traiterResultatTest($info);
}
private function testerEpitheteSpRang() {
$info = array('nom' => "epithete_sp -> rang >= {$this->manuel['rang_sp']}",
'description' => "Si le champ epithete_sp n'est pas vide alors le rang du nom doit être supérieur ou égal à {$this->manuel['rang_sp']}.",
/**
* Test #47
*/
private function testerHomonymieExistence() {
$info = array('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.",
'resultat' => false);
$noms_homonymie = $this->classerNomsParNomComplet();
// Réalisation du test
$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']);
if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
if ($noms_homonymie[$nom['nom_sci']] <= 1) {
$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
}
}
}
$noms_homonymie = null;
// Analyse des résultats
if (count($noms_erreur) > 0) {
$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
$info['message']['lignes'] = $noms_erreur;
} else {
$info['resultat'] = true;
2160,8 → 2193,11
$this->traiterResultatTest($info);
}
/**
* Test #65
*/
private function testerExclureTaxRefSyntaxe() {
$info = $this->getInfosTest(65);
$info = array('nom' => 'exclure_taxref -> syntaxe',
'description' => "Le champ exclure_taxref contient soit :\n".
" - une valeur vide.\n".
2191,6 → 2227,9
$this->traiterResultatTest($info);
}
 
 
//+--------------------------------------------------------------------------------------------------------------+//
// MÉTHODES COMMUNES aux TESTS
2469,5 → 2508,11
return $noms_classes;
}
 
private function getInfosTest($numero) {
$info = $this->tests[$numero];
$info['numero'] = $numero;
$info['resultat'] = false;
return $info;
}
}
?>