Subversion Repositories eFlore/Applications.cel

Rev

Rev 3857 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2691 aurelien 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Service vérifiant si un taxon a été signalé ou non dans une zone géographique donnée
5
 *
6
 * @internal   Mininum PHP version : 5.2
7
 * @category   CEL
8
 * @package    Services
9
 * @subpackage Observations
10
 * @version    0.1
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 */
18
class InventoryTaxonPresent extends Cel  {
19
 
20
	private $source = "chorologie";
21
 
22
	/**
23
	 * Renvoie les zones où le taxon a été observé
24
	 *
25
	 * uid[0] : référentiel
26
	 * uid[1] : numéro nomenclatural
27
	 */
28
	public function getElement($uid) {
29
		// Référentiel et num nom obligatoires
30
		if(count($uid) < 2) {
31
			return null;
32
		}
33
 
34
		$referentiel = $uid[0];
35
		$num_nom = intval($uid[1]);
36
 
37
		$this->source = !empty($_GET['source']) ? $_GET['source'] : $this->source;
38
 
39
		if(!empty($_GET['ce_zone_geo']) || !empty($_GET['pays'])) {
40
 
41
			$zone_geo = !empty($_GET['ce_zone_geo']) ? $_GET['ce_zone_geo'] : null;
42
			$pays = !empty($_GET['pays']) ? $_GET['pays'] : null;
43
 
44
			if($this->source == "chorologie") {
45
				$res = $this->taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo);
46
			} else if($this->source == "cel") {
47
				$res = $this->taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays, $zone_geo);
48
			}
49
 
50
		} else {
51
			$res = $this->obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom);
52
		}
53
 
54
		$this->envoyerJson($res);
55
	}
56
 
57
	private function taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo) {
58
 
59
		$res = "";
60
		// Pour le moment on ne gère que bdtfx, il suffira d'ajouter l'appel à d'autres ws de chorologies
61
		// dès qu'on les obtiendra (on pourrait peut être déjà le faire avec les antilles)
62
		switch($referentiel) {
63
			case "bdtfx":
64
				$dpt = $this->convertirZoneGeoVersDepartement($zone_geo);
65
				$base_url_choro = $this->config['eflore']['url_service_chorologie_presence'];
66
				$url_choro = str_replace('{num_nom}', $num_nom, $base_url_choro).'/'.$dpt;
67
 
68
				$res = json_decode(file_get_contents($url_choro), true);
69
 
70
				// Renvoyer un int "stringé" est bien plus pratique pour le parsing
71
				$res = (string)intval(!empty($res) && $res['present']);
72
			break;
73
			default:
74
				$res = "";
75
		}
76
 
77
		return $res;
78
	}
79
 
80
	private function convertirZoneGeoVersDepartement($zone_geo) {
81
		return substr(str_replace('INSEE-C:', '', $zone_geo), 0, 2);
82
	}
83
 
84
	private function taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays = null, $zone_geo = null) {
85
 
86
		$referentiel = Cel::db()->proteger($referentiel);
87
		$num_nom =  Cel::db()->proteger($num_nom);
88
 
89
		$requete = "SELECT COUNT(id_observation) > 1 as present FROM cel_obs ".
90
				"WHERE nom_referentiel = ".$referentiel." AND ".
91
				"(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.") ".
92
				($zone_geo != null ? " AND ce_zone_geo LIKE ".Cel::db()->proteger($zone_geo.'%') : '').
93
				($pays != null ? " AND pays = ".Cel::db()->proteger($pays) : '');
94
		$res = Cel::db()->requeter($requete);
95
 
96
		return $res[0]['present'];
97
	}
98
 
99
	private function obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom) {
100
 
101
		$referentiel = Cel::db()->proteger($referentiel);
102
		$num_nom =  Cel::db()->proteger($num_nom);
103
 
104
		$requete = "SELECT DISTINCT pays, ce_zone_geo FROM cel_obs WHERE nom_referentiel = ".$referentiel." AND ".
105
				"(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.")";
106
		$res = Cel::db()->requeter($requete);
107
 
108
		return $this->formaterResultat($res);
109
	}
110
 
111
	private function formaterResultat($res) {
112
		$res_fmt = array();
113
 
114
		foreach($res as &$r) {
115
			$pays = !empty($r['pays']) ? $r['pays'] : 'inconnu';
116
			if($this->doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays)) {
117
				$res_fmt[$pays] = array();
118
			}
119
 
120
			if($this->estUneZoneGeoBienFormee($r)) {
121
				$res_fmt[$pays][] = $r['ce_zone_geo'];
122
			}
123
		}
124
		return $res_fmt;
125
	}
126
 
127
	private function doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays) {
128
		return !isset($res_fmt[$pays]) && $this->estUneZoneGeoBienFormee($r);
129
	}
130
 
131
	private function estUneZoneGeoBienFormee($r) {
132
		return !empty($r['ce_zone_geo']) && $r['ce_zone_geo'] != "INSEE-C:";
133
	}
134
}
135
?>