Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
1020 aurelien 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Le script récupère tous les commentaires et déterminations fait ce jour et envoie un mail
5
 * aux auteurs des observations récapitulant celle-ci
6
 *
1682 jpm 7
 * @category	php 5.4
8
 * @package		DEL
9
 * @subpackage 	Scripts
1020 aurelien 10
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
1682 jpm 11
 * @copyright	Copyright (c) 2012-2014, Tela Botanica (accueil@tela-botanica.org)
12
 * @license		CeCILL v2 http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt
13
 * @license		GNU-GPL http://www.gnu.org/licenses/gpl.html
1020 aurelien 14
 */
15
 
16
class AlerteMailCommentaires {
17
 
18
	private $conteneur;
1709 jpm 19
	private $testeurCourriel = null;
1710 jpm 20
	private $recapitulatifAdmin = [];
1722 jpm 21
	private $messageRecapitulatif = null;
1571 jpm 22
 
1020 aurelien 23
	private $observations_concernees = array();
24
	private $correspondance_id_obs_auteurs = array();
1571 jpm 25
 
1682 jpm 26
	public function __construct($conteneur) {
1020 aurelien 27
		$this->conteneur = $conteneur;
28
	}
1571 jpm 29
 
1020 aurelien 30
	public function executer() {
31
		try {
1709 jpm 32
			$this->verifierModeUtilisation();
1020 aurelien 33
			$observations = $this->chargerObservationsCommentees();
1571 jpm 34
			if (!empty($observations)) {
1349 aurelien 35
				$this->formaterObservations($observations);
1682 jpm 36
				$commentaires = $this->chargerCommentairesDuJour();
1349 aurelien 37
				$this->formaterCommentaires($commentaires);
1682 jpm 38
				$this->envoyerMessageAuxDestinataires();
1349 aurelien 39
			}
1020 aurelien 40
		} catch (Exception $e) {
41
			$this->traiterErreur($e->getMessage());
42
		}
43
	}
44
 
1709 jpm 45
	private function verifierModeUtilisation() {
46
		$testeurCourriel = $this->conteneur->getParametre('t');
47
		if ($testeurCourriel) {
48
			if (filter_var($testeurCourriel, FILTER_VALIDATE_EMAIL)) {
49
				$this->testeurCourriel = $testeurCourriel;
50
			} else {
51
				$msg = "Veuillez indiquer une adresse de courriel valide à la suite du paramètre «-t».";
52
				new Exception($msg);
53
			}
54
		}
55
	}
56
 
1682 jpm 57
	private function chargerObservationsCommentees() {
1650 aurelien 58
		// Seuls les utilisateurs ayant explicitement refusé le mail sont ignorés
1571 jpm 59
		$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_obs":"0"%');
1020 aurelien 60
		//TODO: optimiser la requête si beaucoup de mails sont envoyés
1571 jpm 61
		$requete = "SELECT * FROM del_observation AS do ".
1575 jpm 62
			"WHERE do.id_observation IN ".
63
				"( ".
1679 mathias 64
					//TODO: essayer de factoriser cette sous requete entre ici et la fonction du dessus
1575 jpm 65
					"SELECT dc.ce_observation ".
66
					"FROM del_commentaire AS dc ".
67
					"WHERE dc.ce_observation != '0' ".
68
					"AND dc.id_commentaire NOT IN ".
1571 jpm 69
					"( ".
1575 jpm 70
					"	SELECT dc.id_commentaire ".
71
					"	FROM del_commentaire AS dc, del_observation AS dob".
72
					"	WHERE dc.nom_sel = dob.nom_sel ".
73
					"		AND dc.ce_utilisateur = dob.ce_utilisateur ".
74
					"		AND dc.ce_observation = dob.id_observation ".
75
					") ".
76
					"AND TO_DAYS(NOW()) - TO_DAYS(dc.date) <= 1 ".
77
				") ".
1650 aurelien 78
				"AND do.ce_utilisateur NOT IN ".
79
					"( ".
80
					"	SELECT id_utilisateur ".
81
					"	FROM del_utilisateur_infos ".
82
					"	WHERE preferences LIKE $preferences ".
83
					") ".
1575 jpm 84
			"ORDER BY do.ce_utilisateur, do.id_observation ";
1020 aurelien 85
		$observations = $this->conteneur->getBdd()->recupererTous($requete);
86
		return $observations;
87
	}
1571 jpm 88
 
1682 jpm 89
	private function formaterObservations($liste_obs) {
1020 aurelien 90
		foreach ($liste_obs as $obs) {
91
			$id_obs = $obs['id_observation'];
92
			$auteur_obs = $obs['ce_utilisateur'];
93
			$obs['date'] = $this->formaterDateObs($obs['date_observation']);
1348 aurelien 94
			$obs['lieu'] = $this->formaterLieuObservation($obs);
1036 aurelien 95
			$obs['lien'] = $this->obtenirLienFicheObs($obs['id_observation']);
1276 aurelien 96
			$obs['commentaires'] = array();
1020 aurelien 97
			$this->correspondance_id_obs_auteurs[$id_obs] = $auteur_obs;
98
			$this->observations_concernees[$auteur_obs][$id_obs] = $obs;
99
		}
100
	}
1571 jpm 101
 
1682 jpm 102
	private function formaterDateObs($date) {
103
		$time = strtotime($date);
104
		return date('d/m/Y', $time);
105
	}
106
 
107
	private function formaterLieuObservation($obs) {
1348 aurelien 108
		$lieux = array();
1571 jpm 109
		if (!empty($obs['zone_geo'])) {
1348 aurelien 110
			$zone_geo = $obs['zone_geo'];
111
			$zone_geo.= (!empty($obs['ce_zone_geo']) ? ' ('.$this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']).')' : '');
112
			$lieux[] = $zone_geo;
113
		}
1571 jpm 114
		if (!empty($obs['lieudit'])) {
1348 aurelien 115
			$lieux[] = $obs['lieudit'];
116
		}
1571 jpm 117
		if (!empty($obs['station'])) {
1348 aurelien 118
			$lieux[] = $obs['station'];
119
		}
1682 jpm 120
		return implode(' > ', $lieux);
1348 aurelien 121
	}
1571 jpm 122
 
1682 jpm 123
 
124
	private function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
125
		$code_departement = '';
126
		if ($this->estUnCodeInseeDepartement($code_zone_geo)) {
127
			$code_departement = substr(ltrim($code_zone_geo, 'INSEE-C:'), 0, 2);
128
		}
129
		return $code_departement;
130
	}
131
 
132
	private function estUnCodeInseeDepartement($code_a_tester) {
133
		return preg_match('/^INSEE-C:[0-9]{5}/', $code_a_tester);
134
	}
135
 
136
	private function obtenirLienFicheObs($id_obs) {
137
		return sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
138
	}
139
 
140
	protected function chargerCommentairesDuJour() {
141
		$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_obs":"0"%');
142
		// TODO: optimiser la requête si beaucoup de mails sont envoyés
143
		$requete = "SELECT * ".
144
			"FROM del_commentaire AS dc ".
145
			"WHERE dc.ce_observation != '0' ".
146
			"AND dc.id_commentaire NOT IN ".
147
			"( ".
148
			"	SELECT dc.id_commentaire ".
149
			"	FROM del_commentaire AS dc, del_observation AS dob".
150
			"	WHERE dc.nom_sel = dob.nom_sel ".
151
			"		AND dc.ce_utilisateur = dob.ce_utilisateur ".
152
			"		AND dc.ce_observation = dob.id_observation ".
153
			") ".
154
			"AND dc.ce_utilisateur NOT IN ".
155
			"( ".
156
			"	SELECT id_utilisateur ".
157
			"	FROM del_utilisateur_infos ".
158
			"	WHERE preferences LIKE $preferences ".
159
			") ".
160
			"AND TO_DAYS(NOW()) - TO_DAYS(dc.date) <= 1 ".
161
			"ORDER BY dc.ce_observation";
162
		$commentaires = $this->conteneur->getBdd()->recupererTous($requete);
163
		return $commentaires;
164
	}
165
 
1020 aurelien 166
	protected function formaterCommentaires($liste_commentaires) {
167
		foreach ($liste_commentaires as $commentaire) {
168
			$id_obs = $commentaire['ce_observation'];
1575 jpm 169
			if (isset($this->correspondance_id_obs_auteurs[$commentaire['ce_observation']])) {
1710 jpm 170
				$id_auteur_obs = $this->correspondance_id_obs_auteurs[$commentaire['ce_observation']];
1348 aurelien 171
				$commentaire['auteur'] = $this->formaterAuteur($commentaire);
1710 jpm 172
				$this->observations_concernees[$id_auteur_obs][$id_obs]['commentaires'][] = $commentaire;
1348 aurelien 173
			}
1020 aurelien 174
		}
175
	}
1571 jpm 176
 
1682 jpm 177
	private function formaterAuteur($commentaire) {
178
		return $commentaire['utilisateur_prenom'].' '.$commentaire['utilisateur_nom'];
179
	}
180
 
181
	protected function envoyerMessageAuxDestinataires() {
1710 jpm 182
		foreach ($this->observations_concernees as $auteurId => $liste_obs) {
1725 jpm 183
			$donnees = $this->formaterDonneesPourMessage($liste_obs);
1723 jpm 184
			$messageTxt = $this->formaterMessageTxt($donnees);
185
			$messageHtml = $this->formaterMessageHtml($donnees);
186
			$this->recapitulatifAdmin[$auteurId] = array('txt' => $messageTxt, 'html' => $messageHtml);
187
 
1709 jpm 188
			if ($this->testeurCourriel == null) {
1723 jpm 189
				$this->envoyerMessage($messageHtml, $messageTxt, $auteurId);
1709 jpm 190
			}
1020 aurelien 191
		}
1723 jpm 192
		if ($this->testeurCourriel == null) {
193
			$this->envoyerMessageRecap();
194
		}
195
		$this->envoyerMessagesTesteur();
1020 aurelien 196
	}
1571 jpm 197
 
1723 jpm 198
	private function formaterMessageHtml($donnees) {
199
		$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.html';
200
		$squelettePhp = $this->conteneur->getSquelettePhp();
201
		$msgHtml = $squelettePhp->analyser($squelette, $donnees);
202
		return $msgHtml;
203
	}
204
 
205
	private function formaterMessageTxt($donnees) {
206
		$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.txt';
207
		$squelettePhp = $this->conteneur->getSquelettePhp();
208
		$msgTxt = $squelettePhp->analyser($squelette, $donnees);
1724 jpm 209
		// Nettoyage des tabulations pour indentation du code PHP
210
		$msgTxt = str_replace("\t", '', $msgTxt);
1723 jpm 211
		return $msgTxt;
212
	}
213
 
1725 jpm 214
	private function formaterDonneesPourMessage($liste_obs) {
1020 aurelien 215
		$donnees = array();
1348 aurelien 216
		// copie de la première obs pour en obtenir le nom et prénom de l'auteur
1349 aurelien 217
		// (en deux fois pour éviter un warning en mode strict)
1348 aurelien 218
		$valeurs = array_values($liste_obs);
219
		$premiere_obs = array_shift($valeurs);
1020 aurelien 220
		$donnees['liste_observations'] = $liste_obs;
1348 aurelien 221
		$donnees['auteur_formate'] = ucfirst($premiere_obs['prenom_utilisateur']).' '.ucfirst($premiere_obs['nom_utilisateur']);
1571 jpm 222
 
1723 jpm 223
		return $donnees;
1020 aurelien 224
	}
1571 jpm 225
 
1723 jpm 226
	private function envoyerMessage($messageHtml, $messageTxt, $id_destinataire) {
1710 jpm 227
		$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
228
		$donnees = array(
1723 jpm 229
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
230
			'format' => 'html',
1682 jpm 231
			'sujet' => $this->conteneur->getParametre('titre_message_recapitulatif'),
1723 jpm 232
			'message' => $messageHtml,
233
			'message_txt' => $messageTxt
1020 aurelien 234
		);
235
 
1710 jpm 236
		$clientRest = $this->conteneur->getRestClient();
237
		$clientRest->modifier($url, $donnees);
1020 aurelien 238
	}
1710 jpm 239
 
1722 jpm 240
	private function envoyerMessageRecap() {
241
		$msgRecap = $this->obtenirMessageRecap();
1723 jpm 242
		$sujet = "IdentiPlante : récapitulatif envoies alertes commentaires";
1722 jpm 243
		$messagerie = $this->conteneur->getMessagerie();
244
		$destinataire = $this->conteneur->getParametre('email_recap');
1723 jpm 245
		$messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
1722 jpm 246
	}
1710 jpm 247
 
1722 jpm 248
	private function obtenirMessageRecap() {
249
		if ($this->messageRecapitulatif == null) {
1710 jpm 250
			$msgRecap = '';
1722 jpm 251
			$separateur = str_repeat('-', 50);
252
			$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
1710 jpm 253
			foreach ($this->recapitulatifAdmin as $utilisateurId => $message) {
1723 jpm 254
				$messageTxt = $message['txt'];
1722 jpm 255
				$intitule = $utilisateursIntitules[$utilisateurId];
1730 jpm 256
				$msgRecap .= "Message envoyé à : $intitule\n\n$messageTxt\n$separateur\n";
1710 jpm 257
			}
1723 jpm 258
			$intituleRecap = implode("\n", $utilisateursIntitules);
1716 jpm 259
 
1723 jpm 260
			$msgTpl = "Messages envoyés aux utilisateurs suivant :\n%s\n%s\n%s";
261
			$this->messageRecapitulatif = sprintf($msgTpl, $intituleRecap, $separateur, $msgRecap);
1722 jpm 262
		}
263
		return $this->messageRecapitulatif;
264
	}
265
 
1723 jpm 266
	private function envoyerMessagesTesteur() {
1722 jpm 267
		if ($this->testeurCourriel != null) {
1723 jpm 268
			$messagerie = $this->conteneur->getMessagerie();
269
 
270
			$sujet = "TESTEUR : récapitulatif envoies alertes commentaires";
1722 jpm 271
			$msgRecap = $this->obtenirMessageRecap();
1723 jpm 272
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);
273
 
1730 jpm 274
			$message = $this->recapitulatifAdmin[array_rand($this->recapitulatifAdmin)];
1723 jpm 275
			$sujet = "TESTEUR : exemple message HTML - alerte commentaire";
276
			$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $message['html'], $message['txt']);
277
 
278
			$sujet = "TESTEUR : exemple message TXT - alerte commentaire";
279
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $message['txt']);
1710 jpm 280
		}
281
	}
1722 jpm 282
 
283
	private function obtenirInfosUtilisateurs() {
284
		$clientRest = $this->conteneur->getRestClient();
285
		$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
286
		$idUtilisateurs = array_keys($this->recapitulatifAdmin);
287
		$utilisateursIntitules = [];
288
		foreach ($idUtilisateurs as $utilisateurId) {
289
			$url = sprintf($urlTpl, $utilisateurId);
290
			$json = $clientRest->consulter($url);
291
			$infosUtilisateur = json_decode($json);
292
			if (isset($infosUtilisateur->courriel) && isset($infosUtilisateur->intitule)) {
1728 jpm 293
				$prenomNom = $infosUtilisateur->nom.' '.$infosUtilisateur->prenom;
294
				$pseudo = $infosUtilisateur->pseudoUtilise ? ' ['.$infosUtilisateur->pseudo.']' : '';
295
				$courriel = $infosUtilisateur->courriel;
296
				$intitule = "$prenomNom $pseudo ($courriel) - id#$utilisateurId";
1722 jpm 297
			} else {
298
				$intitule = "Utilisateur avec id $utilisateurId introuvable";
299
			}
1729 jpm 300
			$utilisateursIntitules[$utilisateurId] = $intitule;
1722 jpm 301
		}
1729 jpm 302
		asort($utilisateursIntitules);
1722 jpm 303
		return $utilisateursIntitules;
304
	}
1710 jpm 305
}