Subversion Repositories eFlore/Applications.del

Rev

Rev 1683 | Rev 1747 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1683 Rev 1737
Line 14... Line 14...
14
 */
14
 */
Line 15... Line 15...
15
 
15
 
Line 16... Line 16...
16
class AlerteMailADeterminer {
16
class AlerteMailADeterminer {
-
 
17
 
-
 
18
	private $conteneur;
-
 
19
	private $testeurCourriel = null;
Line 17... Line 20...
17
 
20
	private $recapitulatifAdmin = [];
-
 
21
	private $messageRecapitulatif = null;
-
 
22
 
-
 
23
	private $observations_concernees = array();
Line 18... Line 24...
18
	private $conteneur;
24
	private $messageHtml = null;
19
 
25
	private $messageTxt = null;
20
	private $observations_concernees = array();
26
	private 	$utilisateursInfos = array();
Line 21... Line 27...
21
 
27
 
22
	public function __construct($conteneur) {
28
	public function __construct($conteneur) {
-
 
29
		$this->conteneur = $conteneur;
23
		$this->conteneur = $conteneur;
30
	}
24
	}
31
 
25
 
32
	public function executer() {
26
	public function executer() {
33
		try {
27
		try {
34
			$this->verifierModeUtilisation();
28
			$observations = $this->chargerObsADeterminer();
35
			$observations = $this->chargerObsADeterminer();
29
			if (!empty($observations)) {
36
			if (!empty($observations)) {
30
				$this->formaterObservations($observations);
37
				$this->formaterObservations($observations);
31
				$message = $this->genererMessage();
38
				$this->genererMessage();
32
				$this->envoyerMessageAuxDestinataires($message);
39
				$this->envoyerMessageAuxDestinataires();
Line -... Line 40...
-
 
40
			}
-
 
41
		} catch (Exception $e) {
-
 
42
			$this->traiterErreur($e->getMessage());
-
 
43
		}
-
 
44
	}
-
 
45
 
-
 
46
	private function verifierModeUtilisation() {
-
 
47
		$testeurCourriel = $this->conteneur->getParametre('t');
-
 
48
		if ($testeurCourriel) {
-
 
49
			if (filter_var($testeurCourriel, FILTER_VALIDATE_EMAIL)) {
-
 
50
				$this->testeurCourriel = $testeurCourriel;
-
 
51
			} else {
33
			}
52
				$msg = "Veuillez indiquer une adresse de courriel valide à la suite du paramètre «-t».";
34
		} catch (Exception $e) {
53
				new Exception($msg);
35
			$this->traiterErreur($e->getMessage());
54
			}
36
		}
55
		}
37
	}
56
	}
Line 56... Line 75...
56
	}
75
	}
Line 57... Line 76...
57
 
76
 
58
	private function formaterObservations($liste_obs) {
77
	private function formaterObservations($liste_obs) {
59
		foreach ($liste_obs as $obs) {
78
		foreach ($liste_obs as $obs) {
-
 
79
			$id_obs = $obs['id_observation'];
-
 
80
			$infos = array();
60
			$id_obs = $obs['id_observation'];
81
			$infos['id'] = $id_obs;
61
			$obs['date'] = $this->formaterDateObs($obs['date_observation']);
82
			$infos['date'] = $this->formaterDateObs($obs['date_observation']);
62
			$obs['nom_propose'] = $this->formaterNomSci($obs);
83
			$infos['nom_propose'] = $this->formaterNomSci($obs);
-
 
84
			$infos['lien'] = $this->obtenirLienFicheObs($id_obs);
63
			$obs['lien'] = $this->obtenirLienFicheObs($id_obs);
85
			$infos['lieu'] = $this->formaterLieu($obs);
64
			$this->observations_concernees[$id_obs] = $obs;
86
			$this->observations_concernees[$id_obs] = $infos;
65
		}
87
		}
Line 66... Line 88...
66
	}
88
	}
67
 
89
 
Line 73... Line 95...
73
		}
95
		}
74
		return $dateFmt;
96
		return $dateFmt;
75
	}
97
	}
Line 76... Line 98...
76
 
98
 
77
	private function formaterNomSci($obs) {
99
	private function formaterNomSci($obs) {
78
		$nom = '';
100
		$nom = 'Espèce indéterminée';
79
		if ($obs['nom_ret'] != '') {
101
		if ($obs['nom_ret'] != '') {
80
			$nom = $obs['nom_ret'];
102
			$nom = $obs['nom_ret'];
81
		} else if($obs['nom_sel'] != '') {
103
		} else if($obs['nom_sel'] != '') {
82
			$nom = $obs['nom_sel'];
104
			$nom = $obs['nom_sel'];
Line 86... Line 108...
86
 
108
 
87
	private function obtenirLienFicheObs($id_obs) {
109
	private function obtenirLienFicheObs($id_obs) {
88
		return  sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
110
		return  sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
Line -... Line 111...
-
 
111
	}
-
 
112
 
-
 
113
	private function formaterLieu($obs) {
-
 
114
		$lieuInfos = [];
-
 
115
		$champsLieu = ['zone_geo', 'lieudit', 'station'];
-
 
116
		foreach ($champsLieu as $champ) {
-
 
117
			if (trim($obs[$champ]) == '') {
-
 
118
				continue;
-
 
119
			}
-
 
120
 
-
 
121
			$lieuIntitule = $obs[$champ];
-
 
122
			if ($champ == 'zone_geo') {
-
 
123
				$codeDept = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']);
-
 
124
				$lieuIntitule .= empty($codeDept) ? '' : " ($codeDept)";
-
 
125
			}
-
 
126
			$lieuInfos[] = $lieuIntitule;
-
 
127
		}
-
 
128
		$lieu = (count($lieuInfos) > 0) ? implode(' > ', $lieuInfos) : '(lieu inconnu)';
-
 
129
		return $lieu;
-
 
130
	}
-
 
131
 
-
 
132
	private function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
-
 
133
		$code_departement = '';
-
 
134
		if (preg_match('/^INSEE-C:([0-9]){2}[0-9]{3}$/', $code_zone_geo, $match)) {
-
 
135
			$code_departement = $match[1];
-
 
136
		}
-
 
137
		return $code_departement;
89
	}
138
	}
-
 
139
 
90
 
140
	private function genererMessage() {
91
	private function genererMessage() {
141
		if ($this->messageHtml == null && $this->messageTxt == null) {
-
 
142
			$donnees = array();
-
 
143
			$donnees['liste_observations'] = $this->observations_concernees;
92
		$donnees = array();
144
 
93
		$donnees['liste_observations'] = $this->observations_concernees;
145
			$squelettePhp = $this->conteneur->getSquelettePhp();
-
 
146
			$messageHtmlTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.html';
94
		$messageTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.html';
147
			$this->messageHtml =  $squelettePhp->analyser($messageHtmlTpl, $donnees);
-
 
148
			$messageTxtTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.txt';
95
		$squelettePhp = $this->conteneur->getSquelettePhp();
149
			$this->messageTxt =  $squelettePhp->analyser($messageTxtTpl, $donnees);
Line 96... Line 150...
96
		return $squelettePhp->analyser($messageTpl, $donnees);
150
		}
-
 
151
	}
-
 
152
 
97
	}
153
	private function envoyerMessageAuxDestinataires() {
-
 
154
		if ($this->testeurCourriel == null) {
-
 
155
			$this->envoyerMessageAuxUtilisateurs();
-
 
156
			$this->envoyerMessageListeDetermination();
-
 
157
			$this->envoyerMessageRecap();
-
 
158
		} else {
Line -... Line 159...
-
 
159
			$this->envoyerMessageTesteur();
98
 
160
		}
99
	private function envoyerMessageAuxDestinataires($message) {
161
	}
100
		$this->envoyerMessageListeDetermination($message);
162
 
101
 
163
	private function envoyerMessageAuxUtilisateurs() {
102
		$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
164
		$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
Line 103... Line 165...
103
		foreach ($utilisateurs as $utilisateur) {
165
		foreach ($utilisateurs as $utilisateur) {
-
 
166
			$this->envoyerMessage($utilisateur['id_utilisateur']);
104
			$this->envoyerMessage($message, $utilisateur['id_utilisateur']);
167
		}
105
		}
168
	}
106
	}
169
 
107
 
170
	private function obtenirDestinatairesMailsRecapitulatif() {
108
	private function obtenirDestinatairesMailsRecapitulatif() {
171
		if (count($this->recapitulatifAdmin) == 0) {
-
 
172
			$preference = $this->conteneur->getBdd()->proteger('%"mail_notification_toutes_obs":"1"%');
-
 
173
			$requete = "SELECT id_utilisateur ".
-
 
174
				"FROM del_utilisateur_infos ".
-
 
175
				"WHERE preferences LIKE $preference ";
-
 
176
			$utilisateurs = $this->conteneur->getBdd()->recupererTous($requete);
109
		$preference = $this->conteneur->getBdd()->proteger('%"mail_notification_toutes_obs":"1"%');
177
 
110
		$requete = "SELECT id_utilisateur ".
178
			foreach ($utilisateurs as $utilisateur) {
Line 111... Line 179...
111
			"FROM del_utilisateur_infos ".
179
				$this->recapitulatifAdmin[] = $utilisateur['id_utilisateur'];
112
			"WHERE preferences LIKE $preference ";
180
			}
113
		$utilisateurs = $this->conteneur->getBdd()->recupererTous($requete);
181
		}
114
		return $utilisateurs;
182
		return $this->recapitulatifAdmin;
115
	}
183
	}
116
 
184
 
117
	/**
185
	/**
118
	 * Appelle le web service message de l'annuaire afin d'envoyer un mail à l'utilisateur dont l'identifiant est donné
186
	 * Appelle le web service message de l'annuaire afin d'envoyer un mail à l'utilisateur dont l'identifiant est donné
119
	 * en paramètre
187
	 * en paramètre
120
	 * Enter description here ...
188
	 * Enter description here ...
121
	 * @param string $message
-
 
122
	 * @param int $id_destinataire
-
 
123
	 */
189
	 * @param string $message
124
	private function envoyerMessage($message, $id_destinataire) {
190
	 * @param int $id_destinataire
-
 
191
	 */
-
 
192
	private function envoyerMessage($id_destinataire) {
-
 
193
		$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
125
		$url_requete = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
194
		$donnees = array(
Line 126... Line -...
126
		$post = array(
-
 
127
			'sujet' => 'Récapitulatif des dernières observations à déterminer',
-
 
128
			'message' => $message,
195
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
129
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
-
 
130
			'format' => 'html'
-
 
131
		);
-
 
132
 
-
 
133
		$ch = curl_init();
-
 
134
		$options = array(
196
			'format' => 'html',
135
			CURLOPT_URL => $url_requete,
-
 
136
			CURLOPT_HEADER => false,
-
 
137
			CURLOPT_POST => 1,
197
			'sujet' => $this->conteneur->getParametre('titre_message_recapitulatif_obs'),
Line 138... Line 198...
138
			CURLOPT_POSTFIELDS => $post,
198
			'message' => $this->messageHtml,
139
			CURLOPT_RETURNTRANSFER => true
199
			'message_txt' => $this->messageTxt
140
		);
-
 
141
		curl_setopt_array($ch, $options);
200
		);
142
		curl_exec($ch);
201
 
143
		curl_close($ch);
202
		$clientRest = $this->conteneur->getRestClient();
144
	}
-
 
145
 
-
 
146
	/** La liste détermination n'étant pas un membre de tela botanica,
-
 
147
	* on lui envoie un message directement
-
 
148
	* @param string $message contenu du mail
-
 
149
	* @return boolean true ou false suivant le succès ou non de l'envoi
-
 
150
	*/
-
 
151
	private function envoyerMessageListeDetermination($message) {
-
 
152
		$sujet = 'Récapitulatif des dernières observations à déterminer';
-
 
153
		$message_html = $message;
-
 
154
		$message_texte = $this->supprimerHtml($message);
-
 
155
 
-
 
156
		$limite = "_----------=_parties_".md5(uniqid (rand()));
-
 
157
 
-
 
158
		// Définition d'un mail en texte simple et html
-
 
159
		$entetes = "X-Sender: <http://www.tela-botanica.org>\n".
-
 
160
			"X-Mailer: PHP\n".
-
 
161
			"X-auth-smtp-user: ".$this->conteneur->getParametre('adresse_expediteur_recapitulatif')." \n".
-
 
162
			"X-abuse-contact: ".$this->conteneur->getParametre('adresse_expediteur_recapitulatif')." \n".
-
 
163
			"Date: ".date("D, j M Y G:i:s O")."\n".
-
 
164
			'From: '.$this->conteneur->getParametre('adresse_expediteur_recapitulatif')."\n".
-
 
165
			// multipart/alternative signifie même contenu de la forme la plus simple à la plus complexe
-
 
166
			"Content-Type: multipart/alternative; boundary=\"".$limite."\";\n\n";
-
 
167
 
-
 
168
		$contenu = // message en texte simple
-
 
169
			"--".$limite."\n".
-
 
170
			"Content-Type: text/plain; charset=\"".$this->conteneur->getParametre('encodage_appli')."\";\n".
-
 
171
			"Content-Transfer-Encoding: 7bit;\n\n".
-
 
172
			$message_texte."\n".
-
 
173
			// le message en html est préféré s'il est lisible
-
 
174
			"--".$limite."\n".
203
		$clientRest->modifier($url, $donnees);
175
			"Content-Type: text/html;".
204
	}
176
			"charset=\"".$this->conteneur->getParametre('encodage_appli')."\";\n".
-
 
177
			"Content-Transfer-Encoding: 7bit;\n\n".
-
 
178
			$message_html."\n".
-
 
Line -... Line 205...
-
 
205
 
-
 
206
	/** La liste détermination n'étant pas un membre de tela botanica,
179
			"--".$limite."--\n";
207
	* on lui envoie un message directement
180
 
208
	* @return boolean true ou false suivant le succès ou non de l'envoi
Line 181... Line 209...
181
		$envoieStatut = mail(
209
	*/
182
			$this->conteneur->getParametre('adresse_destinataire_recapitulatif_determination'),
-
 
-
 
210
	private function envoyerMessageListeDetermination() {
183
			$this->conteneur->getParametre('titre_message_recapitulatif_obs'),
211
		$destinataires = $this->conteneur->getParametre('adresse_destinataire_recapitulatif_determination');
184
			$contenu,
-
 
185
			$entetes
212
		$sujet = $this->conteneur->getParametre('titre_message_recapitulatif_obs');
186
		);
213
 
187
 
214
		$messagerie = $this->conteneur->getMessagerie();
188
		return $envoieStatut;
-
 
189
	}
215
		$envoieStatut = $messagerie->envoyerHtml($destinataires, $sujet, $this->messageHtml, $this->messageTxt);
Line -... Line 216...
-
 
216
		return $envoieStatut;
-
 
217
	}
-
 
218
 
-
 
219
	private function envoyerMessageRecap() {
-
 
220
		$msgRecap = $this->obtenirMessageRecap();
-
 
221
		$sujet = "IdentiPlante : récapitulatif envoies alertes à déterminer";
-
 
222
		$messagerie = $this->conteneur->getMessagerie();
190
 
223
		$destinataire = $this->conteneur->getParametre('email_recap');
-
 
224
		$messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
-
 
225
	}
-
 
226
 
-
 
227
	private function obtenirMessageRecap() {
-
 
228
		if ($this->messageRecapitulatif == null) {
191
	/** Transforme automatiquement le message html en message txt.
229
			$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
192
	 *
230
			$intituleRecap = implode("\n", $utilisateursIntitules);
-
 
231
			$separateur = str_repeat('-', 50);
-
 
232
			$msgTpl = "Messages envoyés aux utilisateurs suivant :\n%s\n%s\n%s";
-
 
233
			$this->messageRecapitulatif = sprintf($msgTpl, $intituleRecap, $separateur, $this->messageTxt);
193
	 * Réalise un stip_tags et avant ça un remplacement des liens sur mesure pour les mettre au format email txt.
234
		}
-
 
235
		return $this->messageRecapitulatif;
-
 
236
	}
-
 
237
 
-
 
238
	private function obtenirInfosUtilisateurs() {
194
	 */
239
		$utilisateursIntitules = [];
-
 
240
		$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
-
 
241
		foreach ($utilisateurs as $utilisateurId) {
-
 
242
			$infosUtilisateur = $this->telechargerUtilisateurInfos($utilisateurId);
-
 
243
			$intitule = $this->formaterUtilisateurInfos($infosUtilisateur);
195
	private function supprimerHtml($messageHtml) {
244
			$utilisateursIntitules[$utilisateurId] = $intitule;
196
		$html = $this->ajouterHrefDansBalise($messageHtml);
245
		}
-
 
246
		asort($utilisateursIntitules);
-
 
247
		return $utilisateursIntitules;
-
 
248
	}
-
 
249
 
-
 
250
	private function telechargerUtilisateurInfos($utilisateurId) {
197
		$messageTxt = strip_tags($html);
251
		if (! isset($this->utilisateursInfos[$utilisateurId])) {
-
 
252
			$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
198
		return $messageTxt;
253
			$url = sprintf($urlTpl, $utilisateurId);
199
	}
254
			$clientRest = $this->conteneur->getRestClient();
-
 
255
			$json = $clientRest->consulter($url);
200
 
256
			$infos = json_decode($json);
-
 
257
			$this->utilisateursInfos[$utilisateurId] = isset($infos->id) ? $infos : $utilisateurId;
-
 
258
		}
-
 
259
		return $this->utilisateursInfos[$utilisateurId];
201
	/**
260
	}
-
 
261
 
-
 
262
	private function formaterUtilisateurInfos($infos) {
-
 
263
		$utilisateurId = isset($infos->id) ? $infos->id : intval($infos);
-
 
264
		if (isset($infos->courriel) && isset($infos->intitule)) {
-
 
265
			$prenomNom = $infos->nom.' '.$infos->prenom;
-
 
266
			$pseudo = empty($infos->pseudo) ? '' : '['.$infos->pseudo.'] ';
-
 
267
			$courriel = $infos->courriel;
-
 
268
			$intitule = "$prenomNom $pseudo($courriel) - id#$utilisateurId";
-
 
269
		} else {
-
 
270
			$intitule = "Utilisateur avec id $utilisateurId introuvable";
-
 
271
		}
-
 
272
		return $intitule;
-
 
273
	}
-
 
274
 
-
 
275
	private function envoyerMessageTesteur() {
-
 
276
		if ($this->testeurCourriel != null) {
202
	 * Extrait la valeur de l'attribut href des balises HTML de liens (a) et ajoute le lien entre
277
			$messagerie = $this->conteneur->getMessagerie();
203
	 * chevrons (<>) dans le contenu de la balise "a".
-
 
204
	 */
-
 
205
	private function ajouterHrefDansBalise($html) {
278
 
206
		$dom = new DOMDocument;
-
 
207
		$dom->loadHTML($html);
-
 
208
		foreach ($dom->getElementsByTagName('a') as $node) {
279
			$sujet = "TESTEUR : récapitulatif envoies alertes à déterminer";
-
 
280
			$msgRecap = $this->obtenirMessageRecap();
209
			if ($node->hasAttribute( 'href' )) {
281
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);