Subversion Repositories eFlore/Applications.del

Rev

Rev 1910 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1135 aurelien 1
<?php
2
// declare(encoding='UTF-8');
3
/**
1867 jpm 4
 * Récupère tous les commentaires et déterminations fait ce jour et envoie un mail
1135 aurelien 5
 * aux auteurs des observations récapitulant celle-ci
6
 *
1867 jpm 7
 * @category   DEL
8
 * @package    Scripts
9
 * @subpackage ADeterminer
10
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
1135 aurelien 16
 */
17
class AlerteMailADeterminer {
18
 
19
	private $conteneur;
1737 jpm 20
	private $testeurCourriel = null;
21
	private $recapitulatifAdmin = [];
22
	private $messageRecapitulatif = null;
1571 jpm 23
 
1747 jpm 24
	private $dateRenvoi = null;
25
 
1135 aurelien 26
	private $observations_concernees = array();
1737 jpm 27
	private $messageHtml = null;
28
	private $messageTxt = null;
29
	private 	$utilisateursInfos = array();
1571 jpm 30
 
1683 jpm 31
	public function __construct($conteneur) {
1135 aurelien 32
		$this->conteneur = $conteneur;
33
	}
1571 jpm 34
 
1135 aurelien 35
	public function executer() {
36
		try {
1737 jpm 37
			$this->verifierModeUtilisation();
1747 jpm 38
			$this->verifierDateRenvoi();
1135 aurelien 39
			$observations = $this->chargerObsADeterminer();
1683 jpm 40
			if (!empty($observations)) {
1135 aurelien 41
				$this->formaterObservations($observations);
1737 jpm 42
				$this->genererMessage();
43
				$this->envoyerMessageAuxDestinataires();
1135 aurelien 44
			}
45
		} catch (Exception $e) {
46
			$this->traiterErreur($e->getMessage());
47
		}
48
	}
49
 
2038 mathias 50
	protected function traiterErreur($msg) {
51
		echo "ERREUR: $msg\n";
52
	}
53
 
1737 jpm 54
	private function verifierModeUtilisation() {
55
		$testeurCourriel = $this->conteneur->getParametre('t');
56
		if ($testeurCourriel) {
57
			if (filter_var($testeurCourriel, FILTER_VALIDATE_EMAIL)) {
58
				$this->testeurCourriel = $testeurCourriel;
59
			} else {
60
				$msg = "Veuillez indiquer une adresse de courriel valide à la suite du paramètre «-t».";
61
				new Exception($msg);
62
			}
63
		}
64
	}
65
 
1747 jpm 66
	private function verifierDateRenvoi() {
67
		$dateRenvoi = $this->conteneur->getParametre('d');
68
		if ($dateRenvoi) {
69
			if (preg_match('/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/', $dateRenvoi)) {
70
				$this->dateRenvoi = $dateRenvoi;
71
			} else {
72
				$msg = "Veuillez indiquer une date au format yyyy-mm-dd valide à la suite du paramètre «-d».";
73
				new Exception($msg);
74
			}
75
		}
76
	}
77
 
1571 jpm 78
	protected function chargerObsADeterminer() {
1135 aurelien 79
		//TODO: optimiser la requête si beaucoup de mails sont envoyés
1747 jpm 80
		$date = ($this->dateRenvoi == null) ? 'CURDATE()' : "'$this->dateRenvoi'";
1884 jpm 81
		$requete = 'SELECT id_observation, do.courriel_utilisateur, '.
82
			'	date_observation, nom_ret, nom_sel, '.
83
			'	ce_zone_geo, zone_geo, lieudit, station '.
84
			'FROM del_observation AS do '.
85
			'WHERE do.ce_utilisateur != 0 '.
86
			'	AND do.ce_utilisateur IS NOT NULL '.
1910 jpm 87
			"	AND (do.mots_cles_texte LIKE '%aDeterminer%' ".
88
			"		OR (do.certitude = 'aDeterminer' OR do.certitude = 'A déterminer' OR do.certitude = 'douteux') ".
89
			"		OR nom_sel IS NULL OR nom_sel = '' ".
90
			"		OR nom_ret IS NULL OR nom_ret = '') ".
1571 jpm 91
			'	AND ('.
1747 jpm 92
			"		TO_DAYS($date) - TO_DAYS(do.date_transmission) IN (0, 1) ".
93
			"		OR TO_DAYS($date) - TO_DAYS(do.date_creation) IN (0, 1) ".
94
			"		OR TO_DAYS($date) - TO_DAYS(do.date_modification) IN (0, 1) ".
1576 jpm 95
			'	) '.
1571 jpm 96
			"ORDER BY do.id_observation ";
1135 aurelien 97
		$obs = $this->conteneur->getBdd()->recupererTous($requete);
98
		return $obs;
99
	}
1571 jpm 100
 
1683 jpm 101
	private function formaterObservations($liste_obs) {
1823 mathias 102
		// lister les courriels
103
		$courriels = array();
1135 aurelien 104
		foreach ($liste_obs as $obs) {
1823 mathias 105
			$courriels[] = $obs['courriel_utilisateur'];
106
		}
107
		$courriels = array_unique($courriels);
108
		$courriels = array_filter($courriels);
109
 
110
		// récupérer les pseudos
111
		$identites = TelaBotanica\Del\Commun\Utilisateurs::identiteUtilisateurs($courriels, $this->conteneur->getParametre('url_service_utilisateur'));
112
 
113
		// emboîter tout
114
		foreach ($liste_obs as $obs) {
115
			// identité de l'utilisateur : pseudo, nom-prénom ou courriel tronqué
116
			$identiteUtil = $obs['courriel_utilisateur']; // sera tronqué si rien de mieux n'a été trouvé
117
			if (isset($identites[$obs['courriel_utilisateur']])) {
118
				$identiteUtil = $identites[$obs['courriel_utilisateur']];
119
			}
120
			$identiteUtil = TelaBotanica\Del\Commun\Utilisateurs::identiteAAfficher($identiteUtil);
121
 
1135 aurelien 122
			$id_obs = $obs['id_observation'];
1737 jpm 123
			$infos = array();
124
			$infos['id'] = $id_obs;
125
			$infos['date'] = $this->formaterDateObs($obs['date_observation']);
126
			$infos['nom_propose'] = $this->formaterNomSci($obs);
127
			$infos['lien'] = $this->obtenirLienFicheObs($id_obs);
128
			$infos['lieu'] = $this->formaterLieu($obs);
1823 mathias 129
			$infos['auteur'] = $identiteUtil;
1737 jpm 130
			$this->observations_concernees[$id_obs] = $infos;
1135 aurelien 131
		}
132
	}
1571 jpm 133
 
1683 jpm 134
	private function formaterDateObs($date) {
135
		$dateFmt = '(date inconnue)';
136
		if ($date != '0000-00-00 00:00:00') {
137
			$time = strtotime($date);
138
			$dateFmt = date('d/m/Y', $time);
1275 aurelien 139
		}
1683 jpm 140
		return $dateFmt;
1135 aurelien 141
	}
1571 jpm 142
 
1135 aurelien 143
	private function formaterNomSci($obs) {
1737 jpm 144
		$nom = 'Espèce indéterminée';
1571 jpm 145
		if ($obs['nom_ret'] != '') {
1135 aurelien 146
			$nom = $obs['nom_ret'];
147
		} else if($obs['nom_sel'] != '') {
148
			$nom = $obs['nom_sel'];
149
		}
150
		return $nom;
151
	}
1571 jpm 152
 
1135 aurelien 153
	private function obtenirLienFicheObs($id_obs) {
1683 jpm 154
		return  sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
1135 aurelien 155
	}
1571 jpm 156
 
1737 jpm 157
	private function formaterLieu($obs) {
158
		$lieuInfos = [];
159
		$champsLieu = ['zone_geo', 'lieudit', 'station'];
160
		foreach ($champsLieu as $champ) {
161
			if (trim($obs[$champ]) == '') {
162
				continue;
163
			}
164
 
165
			$lieuIntitule = $obs[$champ];
166
			if ($champ == 'zone_geo') {
167
				$codeDept = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']);
168
				$lieuIntitule .= empty($codeDept) ? '' : " ($codeDept)";
169
			}
170
			$lieuInfos[] = $lieuIntitule;
171
		}
172
		$lieu = (count($lieuInfos) > 0) ? implode(' > ', $lieuInfos) : '(lieu inconnu)';
173
		return $lieu;
174
	}
175
 
176
	private function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
177
		$code_departement = '';
1752 jpm 178
		if (preg_match('/^INSEE-C:([0-9]{2})[0-9]{3}$/', $code_zone_geo, $match)) {
1737 jpm 179
			$code_departement = $match[1];
180
		}
181
		return $code_departement;
182
	}
183
 
1683 jpm 184
	private function genererMessage() {
1737 jpm 185
		if ($this->messageHtml == null && $this->messageTxt == null) {
186
			$donnees = array();
187
			$donnees['liste_observations'] = $this->observations_concernees;
188
 
189
			$squelettePhp = $this->conteneur->getSquelettePhp();
190
			$messageHtmlTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.html';
191
			$this->messageHtml =  $squelettePhp->analyser($messageHtmlTpl, $donnees);
192
			$messageTxtTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.txt';
193
			$this->messageTxt =  $squelettePhp->analyser($messageTxtTpl, $donnees);
194
		}
1683 jpm 195
	}
196
 
1737 jpm 197
	private function envoyerMessageAuxDestinataires() {
198
		if ($this->testeurCourriel == null) {
199
			$this->envoyerMessageAuxUtilisateurs();
200
			$this->envoyerMessageListeDetermination();
201
			$this->envoyerMessageRecap();
202
		} else {
203
			$this->envoyerMessageTesteur();
204
		}
205
	}
1683 jpm 206
 
1737 jpm 207
	private function envoyerMessageAuxUtilisateurs() {
1683 jpm 208
		$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
1747 jpm 209
		foreach ($utilisateurs as $idUtilisateur) {
210
			$this->envoyerMessage($idUtilisateur);
1683 jpm 211
		}
212
	}
213
 
1275 aurelien 214
	private function obtenirDestinatairesMailsRecapitulatif() {
1737 jpm 215
		if (count($this->recapitulatifAdmin) == 0) {
216
			$preference = $this->conteneur->getBdd()->proteger('%"mail_notification_toutes_obs":"1"%');
217
			$requete = "SELECT id_utilisateur ".
218
				"FROM del_utilisateur_infos ".
219
				"WHERE preferences LIKE $preference ";
220
			$utilisateurs = $this->conteneur->getBdd()->recupererTous($requete);
221
 
222
			foreach ($utilisateurs as $utilisateur) {
223
				$this->recapitulatifAdmin[] = $utilisateur['id_utilisateur'];
224
			}
225
		}
226
		return $this->recapitulatifAdmin;
1275 aurelien 227
	}
1571 jpm 228
 
1275 aurelien 229
	/**
230
	 * Appelle le web service message de l'annuaire afin d'envoyer un mail à l'utilisateur dont l'identifiant est donné
231
	 * en paramètre
232
	 * Enter description here ...
233
	 * @param string $message
234
	 * @param int $id_destinataire
235
	 */
1737 jpm 236
	private function envoyerMessage($id_destinataire) {
237
		$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
1747 jpm 238
		$dateFmt = $this->formaterDateCourante();
239
		$sujet = sprintf($this->conteneur->getParametre('titre_message_recapitulatif_obs'), $dateFmt);
240
 
1737 jpm 241
		$donnees = array(
1683 jpm 242
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
1737 jpm 243
			'format' => 'html',
1747 jpm 244
			'sujet' => $sujet,
1737 jpm 245
			'message' => $this->messageHtml,
246
			'message_txt' => $this->messageTxt
1275 aurelien 247
		);
1571 jpm 248
 
1737 jpm 249
		$clientRest = $this->conteneur->getRestClient();
250
		$clientRest->modifier($url, $donnees);
1275 aurelien 251
	}
1571 jpm 252
 
1747 jpm 253
	private function formaterDateCourante() {
254
		$date = ($this->dateRenvoi == null) ? time() : strtotime($this->dateRenvoi);
255
		$dateFmt = date('d-m-Y', $date);
256
		return $dateFmt;
257
	}
258
 
1275 aurelien 259
	/** La liste détermination n'étant pas un membre de tela botanica,
1571 jpm 260
	* on lui envoie un message directement
1135 aurelien 261
	* @return boolean true ou false suivant le succès ou non de l'envoi
262
	*/
1737 jpm 263
	private function envoyerMessageListeDetermination() {
264
		$destinataires = $this->conteneur->getParametre('adresse_destinataire_recapitulatif_determination');
1747 jpm 265
		$dateFmt = $this->formaterDateCourante();
266
		$sujet = sprintf($this->conteneur->getParametre('titre_message_recapitulatif_obs'), $dateFmt);
1571 jpm 267
 
1737 jpm 268
		$messagerie = $this->conteneur->getMessagerie();
269
		$envoieStatut = $messagerie->envoyerHtml($destinataires, $sujet, $this->messageHtml, $this->messageTxt);
270
		return $envoieStatut;
271
	}
1571 jpm 272
 
1737 jpm 273
	private function envoyerMessageRecap() {
274
		$msgRecap = $this->obtenirMessageRecap();
1747 jpm 275
		$dateFmt = $this->formaterDateCourante();
1772 jpm 276
		$sujet = "IdentiPlante : obs du $dateFmt";
1737 jpm 277
		$messagerie = $this->conteneur->getMessagerie();
278
		$destinataire = $this->conteneur->getParametre('email_recap');
279
		$messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
280
	}
1571 jpm 281
 
1737 jpm 282
	private function obtenirMessageRecap() {
283
		if ($this->messageRecapitulatif == null) {
284
			$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
285
			$intituleRecap = implode("\n", $utilisateursIntitules);
286
			$separateur = str_repeat('-', 50);
287
			$msgTpl = "Messages envoyés aux utilisateurs suivant :\n%s\n%s\n%s";
288
			$this->messageRecapitulatif = sprintf($msgTpl, $intituleRecap, $separateur, $this->messageTxt);
289
		}
290
		return $this->messageRecapitulatif;
291
	}
1571 jpm 292
 
1737 jpm 293
	private function obtenirInfosUtilisateurs() {
294
		$utilisateursIntitules = [];
295
		$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
296
		foreach ($utilisateurs as $utilisateurId) {
297
			$infosUtilisateur = $this->telechargerUtilisateurInfos($utilisateurId);
298
			$intitule = $this->formaterUtilisateurInfos($infosUtilisateur);
299
			$utilisateursIntitules[$utilisateurId] = $intitule;
300
		}
301
		asort($utilisateursIntitules);
302
		return $utilisateursIntitules;
303
	}
1571 jpm 304
 
2038 mathias 305
	protected function telechargerUtilisateurInfos($utilisateurId) {
1737 jpm 306
		if (! isset($this->utilisateursInfos[$utilisateurId])) {
307
			$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
308
			$url = sprintf($urlTpl, $utilisateurId);
309
			$clientRest = $this->conteneur->getRestClient();
310
			$json = $clientRest->consulter($url);
2038 mathias 311
			$infos = json_decode($json, true);
312
			if (is_array($infos)) {
313
				$infos = array_shift($infos);
314
			}
315
			$this->utilisateursInfos[$utilisateurId] = isset($infos['id']) ? $infos : $utilisateurId;
1737 jpm 316
		}
317
		return $this->utilisateursInfos[$utilisateurId];
1135 aurelien 318
	}
1576 jpm 319
 
2038 mathias 320
	protected function formaterUtilisateurInfos($infos) {
321
		$utilisateurId = isset($infos['id']) ? $infos['id'] : intval($infos);
322
		if (isset($infos['courriel']) && isset($infos['intitule'])) {
323
			$prenomNom = $infos['nom'].' '.$infos['prenom'];
324
			$pseudo = empty($infos['pseudo']) ? '' : '['.$infos['pseudo'].'] ';
325
			$courriel = $infos['courriel'];
1737 jpm 326
			$intitule = "$prenomNom $pseudo($courriel) - id#$utilisateurId";
327
		} else {
328
			$intitule = "Utilisateur avec id $utilisateurId introuvable";
329
		}
330
		return $intitule;
1576 jpm 331
	}
332
 
1737 jpm 333
	private function envoyerMessageTesteur() {
334
		if ($this->testeurCourriel != null) {
335
			$messagerie = $this->conteneur->getMessagerie();
1747 jpm 336
			$dateFmt = $this->formaterDateCourante();
1737 jpm 337
 
1772 jpm 338
			$sujet = "TESTEUR : obs du $dateFmt";
1737 jpm 339
			$msgRecap = $this->obtenirMessageRecap();
340
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);
341
 
1772 jpm 342
			$sujet = "TESTEUR : HTML - obs du $dateFmt";
1737 jpm 343
			$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $this->messageHtml, $this->messageTxt);
344
 
1772 jpm 345
			$sujet = "TESTEUR : TXT - obs du $dateFmt";
1737 jpm 346
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $this->messageTxt);
1576 jpm 347
		}
348
	}
1737 jpm 349
}