Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1526 → Rev 1527

/trunk/jrest/services/CoelStatistique.php
15,6 → 15,9
*/
class CoelStatistique extends Coel {
const META_CODE_FRANCE = 2654;
const META_LISTE_SIECLE = 1040;// Liste des siècles pour les collections naturalistes
const META_LISTE_TYPE_HERBIER = 1083;// Liste des types de collection botanique
private $parametres = array();
/**
178,14 → 181,21
}
private function getNombreCollectionParStructure() {
// Récupération des paramêtres
$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
// Récupération des données
$requete = 'SELECT COUNT(cc_id_collection) AS nbre '.
'FROM coel_collection '.
'GROUP BY cc_ce_structure';
( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ").
'GROUP BY cc_ce_structure ';
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (count($infos) == 0) {
$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
228,7 → 238,7
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=350x150'.
'&chs=400x150'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
237,9 → 247,509
'&chts=000000,12';
// Retour du html contenant l'image
return '<img src="'.$url.'"/>';
$sortie = '<img src="'.$url.'"/>';
$this->envoyerHTML($sortie);
}
private function getNombrePartParStructure() {
// Récupération des paramêtres
$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
// Récupération des données
$requete = 'SELECT cc_ce_structure, ccb_truk_unite_base '.
'FROM coel_collection_botanique '.
' LEFT JOIN coel_collection ON (ccb_id_collection = cc_id_collection) '.
( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (count($infos) == 0) {
$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Post traitement des données de la base de données
// Extraction du nombre de part
$structures = array();
foreach ($infos as $info) {
$structures[$info['cc_ce_structure']] = $this->extraireNbrePart($info['ccb_truk_unite_base']);
}
 
// Triage par classe
$donnees = array( '0 part' => 0,
'Entre 1 et 100' => 0,
'Entre 101 et 1000' => 0,
'Entre 1001 et 10.000' => 0,
'Entre 10.001 et 100.000' => 0,
'Entre 100.001 et 300.000' => 0,
'Supérieur à 301.000' => 0);
foreach ($structures as $nbre) {
if ($nbre == 0) {
$donnees['0 part']++;
} else if ($nbre >= 1 && $nbre <= 100) {
$donnees['Entre 1 et 100']++;
} else if ($nbre >= 101 && $nbre <= 1000) {
$donnees['Entre 101 et 1000']++;
} else if ($nbre >= 1001 && $nbre <= 10000) {
$donnees['Entre 1001 et 10.000']++;
} else if ($nbre >= 10001 && $nbre <= 100000) {
$donnees['Entre 10.001 et 100.000']++;
} else if ($nbre >= 100001 && $nbre <= 300000) {
$donnees['Entre 100.001 et 300.000']++;
} else if ($nbre >= 300001) {
$donnees['Supérieur à 301.000']++;
}
}
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as $cle => $valeur) {
$donnees[$cle.' ('.$valeur.')'] = $valeur;
}
$legende = implode('|', array_keys($donnees));
asort($donnees);
$valeurs = implode(',', $donnees);
$titre = str_replace(' ', '+', 'Nombre de parts conservées |par institution');
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=400x225'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chdl='.$legende.
'&chdlp=r,0,1,2,3,4,5'.
'&chtt='.$titre.
'&chts=000000,11.5'.
'&chts=000000,12';
// Retour du html contenant l'image
$sortie = '<img src="'.$url.'"/>';
$this->envoyerHTML($sortie);
}
private function getNombrePartParCollection() {
// Récupération des paramêtres
$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
// Récupération des données
$requete = 'SELECT ccb_truk_unite_base '.
'FROM coel_collection_botanique '.
( is_null($projet_id) ? '' : ' LEFT JOIN coel_collection ON (ccb_id_collection = cc_id_collection) ').
( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (count($infos) == 0) {
$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
$infos == false;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
$sortie = null;
if ($infos !== false) {
// Post traitement des données de la base de données
// Extraction du nombre de part
$collections = array();
foreach ($infos as $info) {
$collections[] = $this->extraireNbrePart($info['ccb_truk_unite_base']);
}
// Triage par classe
$donnees = array( '0 part' => 0,
'Entre 1 et 100' => 0,
'Entre 101 et 1000' => 0,
'Entre 1001 et 10.000' => 0,
'Entre 10.001 et 100.000' => 0,
'Entre 100.001 et 300.000' => 0,
'Supérieur à 301.000' => 0);
foreach ($collections as $nbre) {
if ($nbre == 0) {
$donnees['0 part']++;
} else if ($nbre >= 1 && $nbre <= 100) {
$donnees['Entre 1 et 100']++;
} else if ($nbre >= 101 && $nbre <= 1000) {
$donnees['Entre 101 et 1000']++;
} else if ($nbre >= 1001 && $nbre <= 10000) {
$donnees['Entre 1001 et 10.000']++;
} else if ($nbre >= 10001 && $nbre <= 100000) {
$donnees['Entre 10.001 et 100.000']++;
} else if ($nbre >= 100001 && $nbre <= 300000) {
$donnees['Entre 100.001 et 300.000']++;
} else if ($nbre >= 300001) {
$donnees['Supérieur à 301.000']++;
}
}
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as $cle => $valeur) {
$donnees[$cle.' ('.$valeur.')'] = $valeur;
}
$legende = implode('|', array_keys($donnees));
asort($donnees);
$valeurs = implode(',', $donnees);
$titre = str_replace(' ', '+', 'Nombre de parts conservées |par collection');
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=400x225'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chdl='.$legende.
'&chdlp=r,0,1,2,3,4,5'.
'&chtt='.$titre.
'&chts=000000,11.5'.
'&chts=000000,12';
// Retour du html contenant l'image
$sortie = '<img src="'.$url.'"/>';
}
$this->envoyerHTML($sortie);
}
private function getNombreCollectionParDepartement() {
// Récupération des paramêtres
$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
if ($projet_id !== null) {
// Récupération des données
$requete = 'SELECT cs_code_postal '.
'FROM coel_collection '.
' LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) '.
'WHERE cs_ce_truk_pays = '.self::META_CODE_FRANCE.' '.
( is_null($projet_id) ? '' : " AND cc_ce_projet = $projet_id ");
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (count($infos) == 0) {
$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
$infos == false;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
$sortie = null;
if ($infos !== false) {
// Post traitement des données de la base de données
// Extraction du nombre de part
$donnees = array();
foreach ($infos as $info) {
if (preg_match('/^([0-8][0-9]|9[0-5]|97[1-4]|976)/', $info['cs_code_postal'], $match)) {
if (! isset($donnees[$match[1]])) {
$donnees[$match[1]] = 1;
} else {
$donnees[$match[1]]++;
}
}
}
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as $cle => $valeur) {
$donnees[$cle.' ('.$valeur.' collections)'] = $valeur;
}
asort($donnees);
$valeurs = implode(',', $donnees);
$titre = str_replace(' ', '+', 'Nombre de collections conservées |par département');
$legende = implode('|', array_keys($donnees));
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=400x225'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chdl='.$legende.
'&chtt='.$titre.
'&chts=000000,11.5'.
'&chts=000000,12';
// Retour du html contenant l'image
$sortie = '<img src="'.$url.'"/>';
}
} else {
$this->messages[] = "Veuillez sélectionner un projet pour voir le graphique.";
}
$this->envoyerHTML($sortie);
}
private function getNombreCollectionParTypeStructure() {
// Récupération des paramêtres
$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
 
// Récupération des données
$requete = 'SELECT cmlv_prive.cmlv_nom AS type_prive, cmlv_public.cmlv_nom AS type_public '.
'FROM coel_collection '.
' LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) '.
' LEFT JOIN coel_meta_liste_valeur AS cmlv_prive ON (cs_ce_truk_type_prive = cmlv_prive.cmlv_id_valeur) '.
' LEFT JOIN coel_meta_liste_valeur AS cmlv_public ON (cs_ce_truk_type_public = cmlv_public.cmlv_id_valeur) '.
( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (count($infos) == 0) {
$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
$infos == false;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
//Coel::debug($infos);
$sortie = null;
if ($infos !== false) {
// Post traitement des données de la base de données
// Extraction du nombre de part
$donnees = array();
foreach ($infos as $info) {
if ($info['type_prive'] != '') {
$cle = $info['type_prive'].' [privé]';
} else if ($info['type_public'] != '') {
$cle = $info['type_public'].' [public]';
}
if (! isset($donnees[$cle])) {
$donnees[$cle] = 1;
} else {
$donnees[$cle]++;
}
}
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as $cle => $valeur) {
$donnees[$cle.' ('.$valeur.')'] = $valeur;
}
asort($donnees);
$valeurs = implode(',', $donnees);
$titre = str_replace(' ', '+', "Collections conservées |par type d'institution");
$legende = implode('|', array_keys($donnees));
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=400x225'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chdl='.$legende.
'&chtt='.$titre.
'&chts=000000,11.5'.
'&chts=000000,12';
// Retour du html contenant l'image
$sortie = '<img src="'.$url.'"/>';
}
$this->envoyerHTML($sortie);
}
private function getNombreCollectionParPeriode() {
// Récupération des paramêtres
$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
 
// Récupération des données
$requete = 'SELECT cc_truk_periode_constitution '.
'FROM coel_collection '.
( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (count($infos) == 0) {
$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
$infos == false;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
//Coel::debug($infos);
// Récupération des métadonnées nécessaires
$requete = 'SELECT cmlv_id_valeur, cmlv_nom, cmlv_abreviation '.
'FROM coel_meta_liste_valeur '.
'WHERE cmlv_ce_parent = '.self::META_LISTE_SIECLE.' ';
try {
$metadonnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($metadonnees === false) {
$this->messages[] = "La requête de recherche des métadonnées a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
$sortie = null;
if ($infos !== false) {
// Traitement des métadonées
$periodes = array(0 => array('nom' => 'Non renseigné', 'abr' => 0));
foreach ($metadonnees as $meta) {
$periodes[$meta['cmlv_id_valeur']] = array('nom' => $meta['cmlv_nom'], 'abr' => $meta['cmlv_abreviation']);
}
// Post traitement des données de la base de données
$donnees = array();
foreach ($infos as $info) {
// Récupération de la période de début de constitution
$truk_periodes = explode(';;', $info['cc_truk_periode_constitution']);
$periode_abr_mini = 10;
$periode_id_mini = 0;
foreach ($truk_periodes as $periode_id) {
if (! empty($periode_id)) {
if ($periode_abr_mini > $periodes[$periode_id]['abr']) {
$periode_abr_mini = $periodes[$periode_id]['abr'];
$periode_id_mini = $periode_id;
}
}
}
// Augmentation du nombre de collection par période
if (! isset($donnees[$periodes[$periode_id_mini]['nom']])) {
$donnees[$periodes[$periode_id_mini]['nom']] = 1;
} else {
$donnees[$periodes[$periode_id_mini]['nom']]++;
}
}
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as $cle => $valeur) {
$donnees[$cle.' ('.$valeur.')'] = $valeur;
}
asort($donnees);
$valeurs = implode(',', $donnees);
$titre = str_replace(' ', '+', "Collections recensées par|siècle de constitution");
$legende = implode('|', array_keys($donnees));
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=400x225'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chdl='.$legende.
'&chtt='.$titre.
'&chts=000000,11.5'.
'&chts=000000,12';
// Retour du html contenant l'image
$sortie = '<img src="'.$url.'"/>';
}
$this->envoyerHTML($sortie);
}
private function getNombreHerbierParType() {
// Récupération des paramêtres
$projet_id = (isset($this->parametres[0]) ? $this->bdd->quote($this->parametres[0]) : null);
 
// Récupération des données
$requete = 'SELECT ccb_ce_truk_type '.
'FROM coel_collection_botanique '.
( is_null($projet_id) ? '' : ' LEFT JOIN coel_collection ON (ccb_id_collection = cc_id_collection) ').
( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ");
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else if (count($infos) == 0) {
$this->messages[] = "Aucune collection n'est référencée dans ce projet.";
$infos == false;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
//Coel::debug($infos);
// Récupération des métadonnées nécessaires
$requete = 'SELECT cmlv_id_valeur, cmlv_nom, cmlv_abreviation '.
'FROM coel_meta_liste_valeur '.
'WHERE cmlv_ce_parent = '.self::META_LISTE_TYPE_HERBIER.' ';
try {
$metadonnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($metadonnees === false) {
$this->messages[] = "La requête de recherche des métadonnées a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
$sortie = null;
if ($infos !== false) {
// Traitement des métadonées
$types = array(0 => array('nom' => 'Non renseigné', 'abr' => 'NR'));
foreach ($metadonnees as $meta) {
$types[$meta['cmlv_id_valeur']] = array('nom' => $meta['cmlv_nom'], 'abr' => $meta['cmlv_abreviation']);
}
// Post traitement des données de la base de données
$donnees = array();
foreach ($infos as $info) {
// Récupération du type d'herbier
$type_id = ($info['ccb_ce_truk_type'] != '') ? $info['ccb_ce_truk_type'] : 0;
 
// Augmentation du nombre de collection par période
if (! isset($donnees[$types[$type_id]['nom']])) {
$donnees[$types[$type_id]['nom']] = 1;
} else {
$donnees[$types[$type_id]['nom']]++;
}
}
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as $cle => $valeur) {
$donnees[$cle.' ('.$valeur.')'] = $valeur;
}
asort($donnees);
$valeurs = implode(',', $donnees);
$titre = str_replace(' ', '+', "Nombre d'herbier par type");
$legende = implode('|', array_keys($donnees));
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=300x350'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chdl='.$legende.
'&chdlp=bv'.
'&chtt='.$titre.
'&chts=000000,11.5'.
'&chts=000000,12';
// Retour du html contenant l'image
$sortie = '<img src="'.$url.'"/>';
}
$this->envoyerHTML($sortie);
}
private function extraireNbrePart($truk_unite_base) {
$types = explode(';;', $truk_unite_base);
$nbre = 0;
foreach ($types as $type) {
$unite_base = explode('##', $type);
$unite_base_info = explode('||', $unite_base[1]);
$nbre_part = $unite_base_info[3];
$nbre += $nbre_part;
}
return $nbre;
}
private function executerRequeteNombreDansHistorique($table_identifiants, $etat, $personne_id = null) {
$requete = "SELECT COUNT(cmhl_date_modification) AS nbre ".
"FROM coel_meta_historique_ligne ".