Subversion Repositories eFlore/Applications.del

Rev

Rev 1716 | Rev 1723 | 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) {
183
			$message = $this->formaterMessagePourAuteur($liste_obs, $auteurId);
1709 jpm 184
			if ($this->testeurCourriel == null) {
1710 jpm 185
				$this->envoyerMessage($message, $auteurId);
1709 jpm 186
			}
1710 jpm 187
			$this->recapitulatifAdmin[$auteurId] = $message;
1020 aurelien 188
		}
1722 jpm 189
		$this->envoyerMessageRecap();
1710 jpm 190
		$this->envoyerMessageTesteur();
1020 aurelien 191
	}
1571 jpm 192
 
1020 aurelien 193
	private function formaterMessagePourAuteur($liste_obs, $auteur) {
194
		$donnees = array();
1348 aurelien 195
		// copie de la première obs pour en obtenir le nom et prénom de l'auteur
1349 aurelien 196
		// (en deux fois pour éviter un warning en mode strict)
1348 aurelien 197
		$valeurs = array_values($liste_obs);
198
		$premiere_obs = array_shift($valeurs);
1020 aurelien 199
		$donnees['liste_observations'] = $liste_obs;
200
		$donnees['auteur'] = $auteur;
1348 aurelien 201
		$donnees['auteur_formate'] = ucfirst($premiere_obs['prenom_utilisateur']).' '.ucfirst($premiere_obs['nom_utilisateur']);
1571 jpm 202
 
1682 jpm 203
		$messageSquelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.html';
204
		$squelettePhp = $this->conteneur->getSquelettePhp();
205
		return $squelettePhp->analyser($messageSquelette, $donnees);
1020 aurelien 206
	}
1571 jpm 207
 
1710 jpm 208
	private function envoyerMessage($message, $id_destinataire) {
209
		$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
210
		$donnees = array(
1682 jpm 211
			'sujet' => $this->conteneur->getParametre('titre_message_recapitulatif'),
1020 aurelien 212
			'message' => $message,
1682 jpm 213
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
1020 aurelien 214
			'format' => 'html'
215
		);
216
 
1710 jpm 217
		$clientRest = $this->conteneur->getRestClient();
218
		$clientRest->modifier($url, $donnees);
1020 aurelien 219
	}
1710 jpm 220
 
1722 jpm 221
	private function envoyerMessageRecap() {
222
		$msgRecap = $this->obtenirMessageRecap();
1710 jpm 223
		if ($this->testeurCourriel != null) {
1722 jpm 224
			$sujet = "IdentiPlante - TEST par {$this->testeurCourriel} : récapitulatif envoies alertes commentaires";
225
		} else {
226
			$sujet = "IdentiPlante : récapitulatif envoies alertes commentaires";
227
		}
228
		$messagerie = $this->conteneur->getMessagerie();
229
		$destinataire = $this->conteneur->getParametre('email_recap');
230
		$envoieStatut = $messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
231
	}
1710 jpm 232
 
1722 jpm 233
	private function obtenirMessageRecap() {
234
		if ($this->messageRecapitulatif == null) {
1710 jpm 235
			$msgRecap = '';
1722 jpm 236
			$separateur = str_repeat('-', 50);
237
			$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
1710 jpm 238
			foreach ($this->recapitulatifAdmin as $utilisateurId => $message) {
1722 jpm 239
				$intitule = $utilisateursIntitules[$utilisateurId];
240
				$msgRecap .= "Message envoyé à : $intitule\n$message\n$separateur\n";
1710 jpm 241
			}
1722 jpm 242
			$intituleRecap = implode(', ', $utilisateursIntitules);
1716 jpm 243
 
1722 jpm 244
			$this->messageRecapitulatif = "Messages envoyés aux utilisateurs suivant : $intituleRecap\n$msgRecap";
245
		}
246
		return $this->messageRecapitulatif;
247
	}
248
 
249
	private function envoyerMessageTesteur() {
250
		if ($this->testeurCourriel != null) {
251
			$msgRecap = $this->obtenirMessageRecap();
252
			$sujet = "TESTEUR : Récapitulatif envoies alertes commentaires";
1716 jpm 253
			$messagerie = $this->conteneur->getMessagerie();
254
			$envoieStatut = $messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);
1710 jpm 255
		}
256
	}
1722 jpm 257
 
258
	private function obtenirInfosUtilisateurs() {
259
		$clientRest = $this->conteneur->getRestClient();
260
		$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
261
		$idUtilisateurs = array_keys($this->recapitulatifAdmin);
262
		$utilisateursIntitules = [];
263
		foreach ($idUtilisateurs as $utilisateurId) {
264
			$url = sprintf($urlTpl, $utilisateurId);
265
			$json = $clientRest->consulter($url);
266
			$infosUtilisateur = json_decode($json);
267
			if (isset($infosUtilisateur->courriel) && isset($infosUtilisateur->intitule)) {
268
				$intitule = $infosUtilisateur->intitule.' ('.$infosUtilisateur->courriel.')';
269
			} else {
270
				$intitule = "Utilisateur avec id $utilisateurId introuvable";
271
			}
272
			$utilisateursIntitules[$utilisateurId] = $intitule;
273
		}
274
		return $utilisateursIntitules;
275
	}
1710 jpm 276
}