Subversion Repositories eFlore/Applications.cel

Rev

Blame | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Service vérifiant si un taxon a été signalé ou non dans une zone géographique donnée
 *
 * @internal   Mininum PHP version : 5.2
 * @category   CEL
 * @package    Services
 * @subpackage Observations
 * @version    0.1
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
 */
class InventoryTaxonPresent extends Cel  {
        
        private $source = "chorologie";

        /**
         * Renvoie les zones où le taxon a été observé
         *
         * uid[0] : référentiel
         * uid[1] : numéro nomenclatural
         */
        public function getElement($uid) {
                // Référentiel et num nom obligatoires
                if(count($uid) < 2) {
                        return null;
                }
                
                $referentiel = $uid[0];
                $num_nom = intval($uid[1]);
                
                $this->source = !empty($_GET['source']) ? $_GET['source'] : $this->source;
                
                if(!empty($_GET['ce_zone_geo']) || !empty($_GET['pays'])) {
                        
                        $zone_geo = !empty($_GET['ce_zone_geo']) ? $_GET['ce_zone_geo'] : null;
                        $pays = !empty($_GET['pays']) ? $_GET['pays'] : null;
                        
                        if($this->source == "chorologie") {
                                $res = $this->taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo);
                        } else if($this->source == "cel") {
                                $res = $this->taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays, $zone_geo);
                        }
                                                
                } else {
                        $res = $this->obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom);
                }
                
                $this->envoyerJson($res);
        }
        
        private function taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo) {
                
                $res = "";
                // Pour le moment on ne gère que bdtfx, il suffira d'ajouter l'appel à d'autres ws de chorologies
                // dès qu'on les obtiendra (on pourrait peut être déjà le faire avec les antilles)
                switch($referentiel) {
                        case "bdtfx":
                                $dpt = $this->convertirZoneGeoVersDepartement($zone_geo);
                                $base_url_choro = $this->config['eflore']['url_service_chorologie_presence'];
                                $url_choro = str_replace('{num_nom}', $num_nom, $base_url_choro).'/'.$dpt;
                                
                                $res = json_decode(file_get_contents($url_choro), true);
                                
                                // Renvoyer un int "stringé" est bien plus pratique pour le parsing
                                $res = (string)intval(!empty($res) && $res['present']);
                        break;
                        default:
                                $res = "";
                }
                
                return $res;
        }
        
        private function convertirZoneGeoVersDepartement($zone_geo) {
                return substr(str_replace('INSEE-C:', '', $zone_geo), 0, 2);
        }
        
        private function taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays = null, $zone_geo = null) {
                
                $referentiel = Cel::db()->proteger($referentiel);
                $num_nom =  Cel::db()->proteger($num_nom);
                
                $requete = "SELECT COUNT(id_observation) > 1 as present FROM cel_obs ".
                                "WHERE nom_referentiel = ".$referentiel." AND ".
                                "(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.") ".
                                ($zone_geo != null ? " AND ce_zone_geo LIKE ".Cel::db()->proteger($zone_geo.'%') : '').
                                ($pays != null ? " AND pays = ".Cel::db()->proteger($pays) : '');                               
                $res = Cel::db()->requeter($requete);

                return $res[0]['present'];
        }
        
        private function obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom) {
                
                $referentiel = Cel::db()->proteger($referentiel);
                $num_nom =  Cel::db()->proteger($num_nom);
                
                $requete = "SELECT DISTINCT pays, ce_zone_geo FROM cel_obs WHERE nom_referentiel = ".$referentiel." AND ".
                                "(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.")";
                $res = Cel::db()->requeter($requete);
                
                return $this->formaterResultat($res);
        }
        
        private function formaterResultat($res) {
                $res_fmt = array();
                
                foreach($res as &$r) {
                        $pays = !empty($r['pays']) ? $r['pays'] : 'inconnu';
                        if($this->doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays)) {
                                $res_fmt[$pays] = array();
                        }
                        
                        if($this->estUneZoneGeoBienFormee($r)) {
                                $res_fmt[$pays][] = $r['ce_zone_geo'];
                        }
                }
                return $res_fmt;
        }
        
        private function doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays) {
                return !isset($res_fmt[$pays]) && $this->estUneZoneGeoBienFormee($r);
        }
        
        private function estUneZoneGeoBienFormee($r) {
                return !empty($r['ce_zone_geo']) && $r['ce_zone_geo'] != "INSEE-C:";
        }
}
?>