| 1582 | jpm | 1 | <?php
 | 
        
           |  |  | 2 | // declare(encoding='UTF-8');
 | 
        
           |  |  | 3 | /**
 | 
        
           |  |  | 4 |  * Service permettant de récupérer toutes les informations d'une observation publique.
 | 
        
           |  |  | 5 |  * Encodage en entrée : utf8
 | 
        
           |  |  | 6 |  * Encodage en sortie : utf8
 | 
        
           |  |  | 7 |  *
 | 
        
           |  |  | 8 |  * Cas d'utilisation :
 | 
        
           |  |  | 9 |  * GET /CelObs/[id] : oû id est l'identifiant d'une observation publique
 | 
        
           |  |  | 10 |  *
 | 
        
           |  |  | 11 |  * @author Jean-Pascal MILCENT <jpm@clapas.org>
 | 
        
           |  |  | 12 |  * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 | 
        
           |  |  | 13 |  * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 | 
        
           |  |  | 14 |  * @version $Id$
 | 
        
           |  |  | 15 |  * @copyright © 2013, Jean-Pascal MILCENT
 | 
        
           |  |  | 16 |  */
 | 
        
           |  |  | 17 | class CelObs extends Cel {
 | 
        
           |  |  | 18 | 	private $rechercheObs = null;
 | 
        
           |  |  | 19 | 	private $chpsEtendus = null;
 | 
        
           | 2143 | jpm | 20 | 	private $donnees = null;
 | 
        
           | 1582 | jpm | 21 |   | 
        
           |  |  | 22 | 	public function __construct($config) {
 | 
        
           |  |  | 23 | 		parent::__construct($config);
 | 
        
           |  |  | 24 | 		$this->rechercheObs = new RechercheObservation($config);
 | 
        
           |  |  | 25 | 		$this->chpsEtendus = new GestionChampsEtendus($config, 'obs');
 | 
        
           | 2152 | jpm | 26 |   | 
        
           |  |  | 27 | 		$this->chargerNomsTablesReferentiels();
 | 
        
           | 1582 | jpm | 28 | 	}
 | 
        
           |  |  | 29 |   | 
        
           | 2152 | jpm | 30 | 	private function chargerNomsTablesReferentiels() {
 | 
        
           | 2155 | mathias | 31 | 		// Créé des attributs avec le code du référentiel : bdtfx, bdtxa, apd, isfan
 | 
        
           | 2152 | jpm | 32 | 		foreach ( $this->config['referentiels'] as $referentiel => $table) {
 | 
        
           |  |  | 33 | 			$this->$referentiel = $table;
 | 
        
           |  |  | 34 | 		}
 | 
        
           |  |  | 35 | 	}
 | 
        
           |  |  | 36 |   | 
        
           | 1582 | jpm | 37 | 	function getElement($ressources){
 | 
        
           |  |  | 38 | 		$retour = false;
 | 
        
           |  |  | 39 | 		$idObs = $ressources[0];
 | 
        
           |  |  | 40 | 		if (isset($idObs) && preg_match('/^[0-9]+$/', $idObs)) {
 | 
        
           |  |  | 41 |   | 
        
           |  |  | 42 | 			$criteres = array('id_observation' => $idObs, 'transmission' => 1);
 | 
        
           | 1631 | raphael | 43 | 			$obsTrouvee = $this->rechercheObs->rechercherObservations(null, $criteres, 0, 1)->get();
 | 
        
           | 1582 | jpm | 44 |   | 
        
           |  |  | 45 | 			$observation = array();
 | 
        
           |  |  | 46 | 			if (is_array($obsTrouvee) && count($obsTrouvee) > 0) {
 | 
        
           |  |  | 47 | 				$observation = $obsTrouvee[0];
 | 
        
           |  |  | 48 | 			}
 | 
        
           |  |  | 49 | 			$observation = $this->preparerChamps($observation);
 | 
        
           |  |  | 50 | 			$observation = $this->selectionnerChamps($observation);
 | 
        
           |  |  | 51 | 			$observation = $this->formaterClePourJs($observation);
 | 
        
           |  |  | 52 |   | 
        
           |  |  | 53 | 			$champsEtendus = $this->chpsEtendus->consulter($idObs);
 | 
        
           |  |  | 54 | 			if (is_array($champsEtendus) && count($champsEtendus) > 0) {
 | 
        
           |  |  | 55 | 				$champsEtendus = $this->preparerChampsEtendus($champsEtendus);
 | 
        
           |  |  | 56 | 				$observation['extension'] = $champsEtendus;
 | 
        
           |  |  | 57 | 			}
 | 
        
           |  |  | 58 |   | 
        
           |  |  | 59 | 			$this->envoyerJson($observation);
 | 
        
           |  |  | 60 | 			$retour = true;
 | 
        
           |  |  | 61 | 		}
 | 
        
           |  |  | 62 | 		return $retour;
 | 
        
           |  |  | 63 | 	}
 | 
        
           |  |  | 64 |   | 
        
           |  |  | 65 | 	private function preparerChamps($champs) {
 | 
        
           |  |  | 66 | 		if (isset($champs['date_observation'])) {
 | 
        
           |  |  | 67 | 			$date = explode(' ', $champs['date_observation']);
 | 
        
           |  |  | 68 | 			$champs['date_observation'] = $date[0];
 | 
        
           |  |  | 69 | 		}
 | 
        
           |  |  | 70 | 		return $champs;
 | 
        
           |  |  | 71 | 	}
 | 
        
           |  |  | 72 |   | 
        
           |  |  | 73 | 	private function selectionnerChamps($observation) {
 | 
        
           |  |  | 74 | 		$champs = array('id_observation', 'nom_sel', 'nom_ret', 'nom_ret_nn', 'nt', 'famille',
 | 
        
           |  |  | 75 | 			'nom_referentiel', 'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'milieu', 'latitude', 'longitude',
 | 
        
           |  |  | 76 | 			'geodatum', 'date_observation', 'mots_cles_texte', 'commentaire', 'date_creation', 'date_modification',
 | 
        
           |  |  | 77 | 			'date_transmission', 'code_insee_calcule', 'abondance', 'certitude', 'phenologie', 'altitude');
 | 
        
           |  |  | 78 | 		$selection = array();
 | 
        
           |  |  | 79 | 		foreach ($champs as $chp) {
 | 
        
           |  |  | 80 | 			if (isset($observation[$chp])) {
 | 
        
           |  |  | 81 | 				$selection[$chp] = $observation[$chp];
 | 
        
           |  |  | 82 | 			}
 | 
        
           |  |  | 83 | 		}
 | 
        
           |  |  | 84 | 		return $selection;
 | 
        
           |  |  | 85 | 	}
 | 
        
           |  |  | 86 |   | 
        
           |  |  | 87 | 	private function formaterClePourJs(Array $tableau) {
 | 
        
           |  |  | 88 | 		$tableauJs = array();
 | 
        
           |  |  | 89 | 		foreach ($tableau as $cle => $valeur) {
 | 
        
           |  |  | 90 | 			if ($cle == 'ce_zone_geo') {
 | 
        
           |  |  | 91 | 				$cle = 'codeZoneGeo';
 | 
        
           |  |  | 92 | 			} else {
 | 
        
           |  |  | 93 | 				$cle = str_replace(' ', '', ucwords(str_replace('_', ' ', $cle)));
 | 
        
           |  |  | 94 | 				$cle{0} = strtolower($cle{0});
 | 
        
           |  |  | 95 | 			}
 | 
        
           |  |  | 96 | 			$tableauJs[$cle] = $valeur;
 | 
        
           |  |  | 97 | 		}
 | 
        
           |  |  | 98 | 		return $tableauJs;
 | 
        
           |  |  | 99 | 	}
 | 
        
           |  |  | 100 |   | 
        
           |  |  | 101 | 	private function preparerChampsEtendus($champs) {
 | 
        
           |  |  | 102 | 		$retour = array();
 | 
        
           |  |  | 103 | 		foreach ($champs as $chp) {
 | 
        
           |  |  | 104 | 			$retour[$chp['cle']] = array('valeur' => $chp['valeur'], 'label' => $chp['label']);
 | 
        
           |  |  | 105 | 		}
 | 
        
           |  |  | 106 | 		return $retour;
 | 
        
           |  |  | 107 | 	}
 | 
        
           | 2143 | jpm | 108 |   | 
        
           |  |  | 109 | 	/**
 | 
        
           |  |  | 110 | 	 * Méthode appelée avec une requête de type POST et un identifiant d'observation.
 | 
        
           |  |  | 111 | 	 * Modifie une observation en fonction des informations envoyées en POST.
 | 
        
           |  |  | 112 | 	 * Utilisé par:
 | 
        
           |  |  | 113 | 	 * - service:del:0.1/determinations/ : ValiderDetermination.php::modifierObservationParDetermination()
 | 
        
           |  |  | 114 | 	 * - service:del:0.1/observations/#idObs [POST] : pour dépublier une observation
 | 
        
           |  |  | 115 | 	 *
 | 
        
           |  |  | 116 | 	 * @param $uid array	$uid[0] (int) : identifiant observation
 | 
        
           |  |  | 117 | 	 * @param pairs array	tableau contenant les champs à modifier sous la forme : nom_du_champ=nouvelle_valeur
 | 
        
           |  |  | 118 | 	 */
 | 
        
           |  |  | 119 | 	public function updateElement($ressources, $donnees) {
 | 
        
           |  |  | 120 | 		$this->donnees = $donnees;
 | 
        
           |  |  | 121 | 		if ($this->controlerAccessibiliteWs()) {
 | 
        
           |  |  | 122 | 			if ($this->controleAppelIpAutorisee()) {
 | 
        
           |  |  | 123 | 				$idObs = isset($ressources[0]) ? $ressources[0] : '';
 | 
        
           |  |  | 124 | 				$this->verifierIdentifiantObs($idObs);
 | 
        
           |  |  | 125 |   | 
        
           | 2152 | jpm | 126 | 				if (count($this->donnees) == 1) {
 | 
        
           |  |  | 127 | 					$donneesObligatoires = array('transmission');
 | 
        
           |  |  | 128 | 					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
 | 
        
           |  |  | 129 | 						$this->depublierObs($idObs);
 | 
        
           | 2143 | jpm | 130 | 					}
 | 
        
           | 2205 | aurelien | 131 | 				} else if (count($this->donnees) == 3) {
 | 
        
           |  |  | 132 | 					$donneesObligatoires = array('id_observation', 'nom_sel_nn', 'nom_referentiel');
 | 
        
           | 2143 | jpm | 133 | 					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
 | 
        
           | 2152 | jpm | 134 | 						$this->accepterPropositionDEL($idObs);
 | 
        
           | 2143 | jpm | 135 | 					}
 | 
        
           |  |  | 136 | 				} else {
 | 
        
           | 2152 | jpm | 137 | 					$msg = "La modification complète d'une observation n'est pas implémentée.";
 | 
        
           | 2143 | jpm | 138 | 					$this->envoyerMessageErreur(501, $msg);
 | 
        
           |  |  | 139 | 				}
 | 
        
           |  |  | 140 |   | 
        
           | 2152 | jpm | 141 | 				$this->envoyer('ok');
 | 
        
           | 2143 | jpm | 142 | 			}
 | 
        
           |  |  | 143 | 		}
 | 
        
           | 2156 | jpm | 144 | 		return true;
 | 
        
           | 2143 | jpm | 145 | 	}
 | 
        
           |  |  | 146 |   | 
        
           |  |  | 147 | 	private function verifierIdentifiantObs($chaine) {
 | 
        
           | 2152 | jpm | 148 | 		$ok = preg_match('/^[0-9]+$/', $chaine);
 | 
        
           | 2143 | jpm | 149 | 		if ($ok == false) {
 | 
        
           | 2152 | jpm | 150 | 			$msg = "Indiquer un seul identifiant numérique d'observation.";
 | 
        
           | 2143 | jpm | 151 | 			$this->envoyerMessageErreur(412, $msg);
 | 
        
           |  |  | 152 | 		}
 | 
        
           |  |  | 153 | 		return $ok;
 | 
        
           |  |  | 154 | 	}
 | 
        
           |  |  | 155 |   | 
        
           |  |  | 156 | 	private function verifierDonneesObligatoires($champsObligatoires) {
 | 
        
           |  |  | 157 | 		foreach ($champsObligatoires as $param) {
 | 
        
           |  |  | 158 | 			if (! isset($this->donnees[$param])) {
 | 
        
           |  |  | 159 | 				$msg = sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $champsObligatoires));
 | 
        
           |  |  | 160 | 				$this->envoyerMessageErreur(412, $msg);
 | 
        
           |  |  | 161 | 			}
 | 
        
           |  |  | 162 | 		}
 | 
        
           | 2152 | jpm | 163 | 		return true;
 | 
        
           | 2143 | jpm | 164 | 	}
 | 
        
           |  |  | 165 |   | 
        
           | 2152 | jpm | 166 | 	private function depublierObs($idObs) {
 | 
        
           |  |  | 167 | 		$gestionnaireObs = new GestionObservation($this->config);
 | 
        
           |  |  | 168 | 		$depublication = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
 | 
        
           |  |  | 169 | 		if ($depublication === false) {
 | 
        
           |  |  | 170 | 			$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
 | 
        
           |  |  | 171 | 			$this->envoyerMessageErreur(304, $msg);
 | 
        
           | 2143 | jpm | 172 | 		}
 | 
        
           |  |  | 173 | 	}
 | 
        
           |  |  | 174 |   | 
        
           | 2152 | jpm | 175 | 	/**
 | 
        
           |  |  | 176 | 	 * Modifie une observation aveec les infos d'une proposition :
 | 
        
           |  |  | 177 | 	 * Nous complétons les données de la proposition acceptée ici car:
 | 
        
           |  |  | 178 | 	 * 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
 | 
        
           |  |  | 179 | 	 * 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
 | 
        
           |  |  | 180 | 	 * 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
 | 
        
           |  |  | 181 | 	 */
 | 
        
           |  |  | 182 | 	private function accepterPropositionDEL($idObs) {
 | 
        
           |  |  | 183 | 		$gestion_observation = new GestionObservation($this->config);
 | 
        
           |  |  | 184 | 		$donnees = array_map('trim', $this->donnees);
 | 
        
           |  |  | 185 | 		$donneesAModifier = array(
 | 
        
           |  |  | 186 | 			'certitude' => 'Certaine',
 | 
        
           |  |  | 187 | 			'nom_referentiel' => $donnees['nom_referentiel'],
 | 
        
           |  |  | 188 | 		);
 | 
        
           |  |  | 189 | 		// TODO : la récupération des infos du nom est aussi effectué par la suite voir ce qu'il faut garder
 | 
        
           |  |  | 190 | 		$infosNoms = $this->getNomInfos($donnees['nom_sel_nn'], $donnees['nom_referentiel']);
 | 
        
           |  |  | 191 | 		if ($infosNoms) {
 | 
        
           |  |  | 192 | 			$donneesAModifier = array_merge($donneesAModifier, $infosNoms);
 | 
        
           |  |  | 193 | 		}
 | 
        
           | 2143 | jpm | 194 |   | 
        
           | 2152 | jpm | 195 | 		$modification = $gestion_observation->modifierObservationPublique($idObs, $donneesAModifier);
 | 
        
           |  |  | 196 |   | 
        
           |  |  | 197 | 		if ($modification) {
 | 
        
           | 2205 | aurelien | 198 | 			// TODO: en modifiant bien la classe de gestion mots clés, on aurait peut être pas besoin de l'id
 | 
        
           |  |  | 199 | 			// utilisateur (car l'id de l'obs est déjà sans ambiguité)
 | 
        
           |  |  | 200 | 			$idUtilisateur = $this->rechercheObs->obtenirIdUtilisateurPourIdObs($idObs);
 | 
        
           |  |  | 201 |   | 
        
           | 2152 | jpm | 202 | 			// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
 | 
        
           |  |  | 203 | 			$gestionMotsClesObs = new GestionMotsClesChemin($this->config, 'obs');
 | 
        
           |  |  | 204 | 			$supp_liaison_mot_cle = $gestionMotsClesObs->supprimerLiaisonPourMotCleEtIdElementLie('aDeterminer', $idObs, $idUtilisateur);
 | 
        
           |  |  | 205 | 		} else {
 | 
        
           |  |  | 206 | 			$msg = "Impossible de modifier l'observation associée à cet identifiant. Erreur mysql : " . mysql_error();
 | 
        
           |  |  | 207 | 			$this->envoyerMessageErreur(500, $msg);// Internal Server Error
 | 
        
           |  |  | 208 | 		}
 | 
        
           |  |  | 209 | 	}
 | 
        
           |  |  | 210 |   | 
        
           |  |  | 211 | 	// TODO : cette méthode et celles qui en dépendent sont peut être inutiles au vue de la méthode traiterEspece() de GestionObservation
 | 
        
           |  |  | 212 | 	private function getNomInfos($id_nom, $code_referentiel) {
 | 
        
           |  |  | 213 | 		$retour = false;
 | 
        
           |  |  | 214 | 		if ($id_nom && $code_referentiel) {
 | 
        
           |  |  | 215 | 			switch ($code_referentiel) {
 | 
        
           |  |  | 216 | 				case 'bdtfx' :
 | 
        
           |  |  | 217 | 					$retour = $this->getInfosBdtfx($id_nom);
 | 
        
           |  |  | 218 | 					break;
 | 
        
           |  |  | 219 | 				case 'bdtxa' :
 | 
        
           |  |  | 220 | 					$retour = $this->getInfosBdtxa($id_nom);
 | 
        
           |  |  | 221 | 					break;
 | 
        
           |  |  | 222 | 				case 'isfan' :
 | 
        
           |  |  | 223 | 					$retour = $this->getInfosIsfan($id_nom);
 | 
        
           |  |  | 224 | 					break;
 | 
        
           | 2155 | mathias | 225 | 				case 'apd' :
 | 
        
           |  |  | 226 | 					$retour = $this->getInfosApd($id_nom);
 | 
        
           | 2152 | jpm | 227 | 					break;
 | 
        
           |  |  | 228 | 			}
 | 
        
           |  |  | 229 | 		}
 | 
        
           |  |  | 230 | 		return $retour;
 | 
        
           |  |  | 231 | 	}
 | 
        
           |  |  | 232 |   | 
        
           | 2143 | jpm | 233 | 	private function getInfosBdtfx($id_nom) {
 | 
        
           | 2152 | jpm | 234 | 		$idNomP = CEL::db()->proteger($id_nom);
 | 
        
           | 2143 | jpm | 235 | 		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
 | 
        
           |  |  | 236 | 			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
 | 
        
           |  |  | 237 | 			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
 | 
        
           | 2152 | jpm | 238 | 			"FROM {$this->bdtfx} AS o ".
 | 
        
           |  |  | 239 | 			"	LEFT JOIN {$this->bdtfx} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
 | 
        
           | 2143 | jpm | 240 | 			"WHERE o.num_nom = $idNomP ".
 | 
        
           |  |  | 241 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           | 2152 | jpm | 242 | 		$resultat = Cel::db()->requeterLigne($requete);
 | 
        
           | 2143 | jpm | 243 | 		return $resultat;
 | 
        
           |  |  | 244 | 	}
 | 
        
           | 2152 | jpm | 245 |   | 
        
           |  |  | 246 | 	private function getInfosBdtxa($id_nom) {
 | 
        
           |  |  | 247 | 		$idNomP = CEL::db()->proteger($id_nom);
 | 
        
           |  |  | 248 | 		// Champ "num_tax" au lieu de "num_taxonomique"
 | 
        
           |  |  | 249 | 		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, o.famille, ".
 | 
        
           |  |  | 250 | 			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
 | 
        
           |  |  | 251 | 			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
 | 
        
           |  |  | 252 | 			"FROM {$this->bdtxa} AS o ".
 | 
        
           |  |  | 253 | 			"	LEFT JOIN {$this->bdtxa} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
 | 
        
           |  |  | 254 | 			"WHERE o.num_nom = $idNomP ".
 | 
        
           |  |  | 255 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 256 | 		$resultat = Cel::db()->requeterLigne($requete);
 | 
        
           |  |  | 257 | 		return $resultat;
 | 
        
           |  |  | 258 | 	}
 | 
        
           |  |  | 259 |   | 
        
           |  |  | 260 | 	private function getInfosIsfan($id_nom) {
 | 
        
           |  |  | 261 | 		$idNomP = CEL::db()->proteger($id_nom);
 | 
        
           |  |  | 262 | 		// Champ "num_tax" au lieu de "num_taxonomique"
 | 
        
           |  |  | 263 | 		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
 | 
        
           |  |  | 264 | 			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
 | 
        
           |  |  | 265 | 			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
 | 
        
           |  |  | 266 | 			"FROM {$this->isfan} AS o ".
 | 
        
           |  |  | 267 | 			"	LEFT JOIN {$this->isfan} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
 | 
        
           |  |  | 268 | 			"WHERE o.num_nom = $idNomP ".
 | 
        
           |  |  | 269 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 270 | 		$resultat = Cel::db()->requeterLigne($requete);
 | 
        
           |  |  | 271 | 		return $resultat;
 | 
        
           |  |  | 272 | 	}
 | 
        
           |  |  | 273 |   | 
        
           | 2155 | mathias | 274 | 	private function getInfosApd($id_nom) {
 | 
        
           | 2152 | jpm | 275 | 		$idNomP = CEL::db()->proteger($id_nom);
 | 
        
           |  |  | 276 | 		// Champ "num_tax" au lieu de "num_taxonomique"
 | 
        
           |  |  | 277 | 		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
 | 
        
           |  |  | 278 | 			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
 | 
        
           |  |  | 279 | 			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
 | 
        
           | 2155 | mathias | 280 | 			"FROM {$this->apd} AS o ".
 | 
        
           |  |  | 281 | 			"	LEFT JOIN {$this->apd} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
 | 
        
           | 2152 | jpm | 282 | 			"WHERE o.num_nom = $idNomP ".
 | 
        
           |  |  | 283 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 284 | 		$resultat = Cel::db()->requeterLigne($requete);
 | 
        
           |  |  | 285 | 		return $resultat;
 | 
        
           |  |  | 286 | 	}
 | 
        
           | 1582 | jpm | 287 | }
 |