Subversion Repositories eFlore/Applications.del

Rev

Rev 2046 | 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
2038 mathias 6
 * Si un commentaire porte sur un autre commentaire, un message est envoyé à l'auteur
7
 * de celui-ci pour l'avertir de celui-là
1020 aurelien 8
 *
1867 jpm 9
 * @category   DEL
10
 * @package    Scripts
11
 * @subpackage Commentaires
12
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
13
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
14
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
2038 mathias 15
 * @author	   Michel GALABRU <ajudant-gerber@tela-botanica.org>
1867 jpm 16
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
17
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
2038 mathias 18
 * @copyright  1999-2015 Tela Botanica <accueil@tela-botanica.org>
1020 aurelien 19
 */
20
class AlerteMailCommentaires {
21
 
2038 mathias 22
	protected $conteneur;
23
	protected $testeurCourriel = null;
24
	protected $recapitulatifAdmin = [];
25
	protected $messageRecapitulatif = null;
26
	protected $dateRenvoi = null;
1571 jpm 27
 
2038 mathias 28
	protected $observations_concernees = array();
29
	protected $commentaires_concernes = array();
30
	protected $correspondance_id_obs_auteurs = array();
31
	protected $utilisateursInfos = array();
1747 jpm 32
 
1683 jpm 33
	public function __construct($conteneur) {
1020 aurelien 34
		$this->conteneur = $conteneur;
35
	}
1571 jpm 36
 
1020 aurelien 37
	public function executer() {
38
		try {
1737 jpm 39
			$this->verifierModeUtilisation();
1747 jpm 40
			$this->verifierDateRenvoi();
2038 mathias 41
			$observationsCommentees = $this->chargerObservationsCommentees();
42
			$commentairesCommentes = $this->chargerCommentairesCommentes();
43
			$this->formaterObservationsCommentees($observationsCommentees);
44
			$this->formaterCommentairesCommentes($commentairesCommentes);
45
			$this->envoyerMessageAuxDestinataires();
1020 aurelien 46
		} catch (Exception $e) {
2038 mathias 47
			echo "ERREUR: " . $e->getMessage() . "\n";
1020 aurelien 48
		}
49
	}
50
 
2038 mathias 51
	/**
52
	 * Passe en mode "test" si l'adresse email d'un testeur est fournie avec "-t"
53
	 */
54
	protected function verifierModeUtilisation() {
1737 jpm 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».";
2038 mathias 61
				throw new Exception($msg);
1737 jpm 62
			}
63
		}
64
	}
65
 
2038 mathias 66
	/**
67
	 * Simule l'envoi à une date arbitraire, si celle-ci est fournie avec "-d"
68
	 */
69
	protected function verifierDateRenvoi() {
1747 jpm 70
		$dateRenvoi = $this->conteneur->getParametre('d');
71
		if ($dateRenvoi) {
72
			if (preg_match('/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/', $dateRenvoi)) {
73
				$this->dateRenvoi = $dateRenvoi;
74
			} else {
75
				$msg = "Veuillez indiquer une date au format yyyy-mm-dd valide à la suite du paramètre «-d».";
2038 mathias 76
				throw new Exception($msg);
1747 jpm 77
			}
78
		}
79
	}
80
 
2038 mathias 81
	/**
82
	 * Charge toutes les observations ayant été commentées dans les dernières 24h
83
	 * et dont l'auteur souhaite être averti des commentaires
84
	 */
85
	protected function chargerObservationsCommentees() {
1649 aurelien 86
		// Seuls les utilisateurs ayant explicitement refusé le mail sont ignorés
1571 jpm 87
		$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_obs":"0"%');
1747 jpm 88
		$date = ($this->dateRenvoi == null) ? 'NOW()' : "'$this->dateRenvoi'";
89
 
2038 mathias 90
		$requete = "SELECT do.id_observation, do.ce_utilisateur, do.courriel_utilisateur, do.date_observation"
91
		. ", do.nom_sel, do.nom_ret, do.zone_geo, do.ce_zone_geo, do.lieudit, do.station"
92
		. ", dc.nom_sel as dc_nom_sel, dc.utilisateur_prenom as dc_utilisateur_prenom, dc.utilisateur_nom as dc_utilisateur_nom, dc.texte as dc_texte"
93
		. " FROM del_commentaire dc" // tous les commentaires
94
		. " LEFT JOIN del_observation do" // infos obs d'origine
95
		. " ON dc.ce_observation = do.id_observation"
2041 mathias 96
		// ci-dessous un OR et non un AND car les non-inscrits ont tous le meme ce_utilisateur : 0
97
		. " WHERE (dc.ce_utilisateur != do.ce_utilisateur OR dc.utilisateur_courriel != do.courriel_utilisateur)" // en excluant les gens qui se parlent à eux-mêmes
2038 mathias 98
		. " AND TO_SECONDS($date) - TO_SECONDS(dc.date) < 86400 AND TO_SECONDS($date) - TO_SECONDS(dc.date) > 0" // depuis moins de 24h
99
		. " AND do.ce_utilisateur NOT IN ("
100
		. " 	SELECT id_utilisateur FROM del_utilisateur_infos WHERE preferences LIKE $preferences" // si l'auteur d'origine souhaite être averti
101
		. ")"
102
		. " -- " .__FILE__.':'.__LINE__;
103
 
1020 aurelien 104
		$observations = $this->conteneur->getBdd()->recupererTous($requete);
105
		return $observations;
106
	}
1571 jpm 107
 
2038 mathias 108
	/**
109
	 * Charge tous les commentaires ayant reçu une réponse dans les dernières 24h
110
	 * et dont l'auteur souhaite être averti des réponses à ses commentaires,
111
	 * le tout accompagné des infos de l'observation d'origine
112
	 */
113
	protected function chargerCommentairesCommentes() {
114
		// Seuls les utilisateurs ayant explicitement refusé le mail sont ignorés
2046 mathias 115
		$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_com":"0"%');
2038 mathias 116
		$date = ($this->dateRenvoi == null) ? 'NOW()' : "'$this->dateRenvoi'";
117
 
118
		$requete = "SELECT do.id_observation, do.ce_utilisateur, do.courriel_utilisateur, do.prenom_utilisateur, do.nom_utilisateur"
119
		. ",  do.date_observation, do.nom_sel, do.nom_ret, do.zone_geo, do.ce_zone_geo, do.lieudit, do.station"
120
		. ", dc.nom_sel as dc_nom_sel, dc.utilisateur_prenom as dc_utilisateur_prenom, dc.utilisateur_nom as dc_utilisateur_nom, dc.texte as dc_texte"
121
		. ", dco.id_commentaire as dco_id_commentaire, dco.ce_utilisateur as dco_ce_utilisateur, dco.date as dco_date, dco.texte as dco_texte"
122
		. ", dco.nom_sel as dco_nom_sel, dco.nom_ret as dco_nom_ret, dco.utilisateur_courriel as dco_utilisateur_courriel"
123
		. " FROM del_commentaire dc" // tous les commentaires
124
		. " LEFT JOIN del_commentaire dco" // portant sur un autre commentaire
125
		. " ON dc.ce_commentaire_parent = dco.id_commentaire"
126
		. " LEFT JOIN del_observation do" // infos obs d'origine
127
		. " ON dco.ce_observation = do.id_observation"
2041 mathias 128
		// ci-dessous un OR et non un AND car les non-inscrits ont tous le meme ce_utilisateur : 0
129
		. " WHERE (dc.ce_utilisateur != dco.ce_utilisateur OR dc.utilisateur_courriel != dco.utilisateur_courriel)" // en excluant les gens qui se parlent à eux-mêmes
2038 mathias 130
		. " AND TO_SECONDS($date) - TO_SECONDS(dc.date) < 86400 AND TO_SECONDS($date) - TO_SECONDS(dc.date) > 0" // depuis moins de 24h
131
		. " AND dco.ce_utilisateur NOT IN ("
132
		. "		SELECT id_utilisateur FROM del_utilisateur_infos WHERE preferences LIKE $preferences" // si l'auteur d'origine souhaite être averti
133
		. " )"
134
		. " -- " .__FILE__.':'.__LINE__;
135
 
136
		$commentaires = $this->conteneur->getBdd()->recupererTous($requete);
137
		return $commentaires;
138
	}
139
 
140
	/**
141
	 * Classe les observations par id_utilisateur (ou courriel si non inscrit)
142
	 * de l'auteur puis par id_observation, et enfile les données des commentaires
143
	 * relatifs à chaque obs
144
	 */
145
	protected function formaterObservationsCommentees($liste) {
146
		//print_r($liste);
147
		foreach ($liste as $o) {
148
			$id_obs = $o['id_observation'];
149
			$id_auteur_obs = $o['ce_utilisateur'];
150
			// si utilisateur non inscrit
151
			if (($id_auteur_obs == 0) && ($o['courriel_utilisateur'] != '')) {
152
				$id_auteur_obs = $o['courriel_utilisateur'];
1783 mathias 153
			}
1737 jpm 154
 
2038 mathias 155
			// mode gentleman
156
			if (! isset($this->observations_concernees[$id_auteur_obs])) {
157
				$this->observations_concernees[$id_auteur_obs] = array();
158
			}
1571 jpm 159
 
2039 mathias 160
			if (! isset($this->observations_concernees[$id_auteur_obs][$id_obs])) {
161
				// infos à mentionner dans l'email
162
				$infos = array();
163
				$infos['id'] = $id_obs;
164
				$infos['nom_sci'] = $this->formaterNomSci($o);
165
				$infos['date'] = $this->formaterDate($o['date_observation']);
166
				$infos['lieu'] = $this->formaterLieu($o);
167
				$infos['lien'] = $this->obtenirLienFiche($id_obs);
168
				$infos['commentaires'] = array();
169
 
170
				$this->observations_concernees[$id_auteur_obs][$id_obs] = $infos;
171
				$this->observations_concernees[$id_auteur_obs][$id_obs]['commentaires'] = array();
172
			}
173
 
2038 mathias 174
			// isolation des données du commentaire
175
			$commentaire = $this->arrayTranchette($o, 'dc_', true);
176
			//print_r($commentaire);
177
			$commentaire['auteur'] = $this->formaterAuteurCommentaire($o);
178
			$this->observations_concernees[$id_auteur_obs][$id_obs]['commentaires'][] = $commentaire;
1737 jpm 179
		}
2038 mathias 180
		//print_r($this->observations_concernees); exit;
1683 jpm 181
	}
182
 
2038 mathias 183
	/**
184
	 * Classe les commentaires par id_utilisateur (ou courriel si non inscrit)
185
	 * de l'auteur puis par id_commentaire, et enfile les données des réponses
186
	 * (commentaires) relatives à chaque commentaire
187
	 */
188
	protected function formaterCommentairesCommentes($liste) {
189
		//print_r($liste); exit;
190
		foreach ($liste as $o) {
191
			// infos sur le commentaire d'origine
192
			$id_co = $o['dco_id_commentaire'];
193
			$id_auteur_co = $o['dco_ce_utilisateur'];
194
			// si utilisateur non inscrit
195
			if (($id_auteur_co == 0) && ($o['dco_utilisateur_courriel'] != '')) {
196
				$id_auteur_co = $o['dco_utilisateur_courriel'];
197
			}
1737 jpm 198
 
2038 mathias 199
			// mode gentleman
200
			if (! isset($this->commentaires_concernes[$id_auteur_co])) {
201
				$this->commentaires_concernes[$id_auteur_co] = array();
1737 jpm 202
			}
1571 jpm 203
 
2043 mathias 204
			// @TODO grouper sur l'obs avant de grouper sur le commentaire d'origine
205
			// afin de ne pas répéter l'obs si 2 commentaires d'origine portent
206
			// sur la même
2039 mathias 207
			if (! isset($this->commentaires_concernes[$id_auteur_co][$id_co])) {
208
				// infos à mentionner dans l'email
209
				$infos = array();
210
				$infos['id_obs'] = $o['id_observation'];
211
				$id_auteur_obs = $o['ce_utilisateur'];
212
				// si utilisateur non inscrit
213
				if (($id_auteur_obs == 0) && ($o['courriel_utilisateur'] != '')) {
214
					$id_auteur_obs = $o['courriel_utilisateur'];
215
				}
216
				$infos['id_auteur_obs'] = $id_auteur_obs;
217
				$infos['auteur_obs'] = $this->formaterAuteurObs($o);
218
				$infos['nom_sci'] = $this->formaterNomSci($o);
2042 mathias 219
				$infos['nom_sel_co'] = $o['dco_nom_sel'];
2039 mathias 220
				$infos['nom_sci_co'] = $this->formaterNomSci($o, 'dco_');
221
				$infos['date'] = $this->formaterDate($o['date_observation']);
222
				$infos['date_co'] = $this->formaterDate($o['dco_date']);
223
				$infos['texte_co'] = $o['dco_texte'];
224
				$infos['lieu'] = $this->formaterLieu($o);
225
				$infos['lien'] = $this->obtenirLienFiche($o['id_observation']);
226
				$infos['commentaires'] = array();
227
				$this->commentaires_concernes[$id_auteur_co][$id_co] = $infos;
228
				$this->commentaires_concernes[$id_auteur_co][$id_co]['commentaires'] = array();
229
			}
230
 
2038 mathias 231
			// isolation des données du commentaire
232
			$commentaire = $this->arrayTranchette($o, 'dc_', true);
233
			$commentaire['auteur'] = $this->formaterAuteurCommentaire($o);
234
			$this->commentaires_concernes[$id_auteur_co][$id_co]['commentaires'][] = $commentaire;
1683 jpm 235
		}
2038 mathias 236
		//print_r($this->commentaires_concernes); exit;
1683 jpm 237
	}
238
 
2038 mathias 239
	/**
240
	 * Envoie un message par destinataire (auteur d'une observation ayant reçu
241
	 * un commentaire ou d'un commentaire ayant reçu une réponse), en format
242
	 * texte brut + HTML, avec un squelette différent selon que le destinataire
243
	 * est inscrit ou non; en mode test, n'envoie les messages qu'au testeur
244
	 */
245
	protected function envoyerMessageAuxDestinataires() {
246
		// liste des auteurs à contacter
247
		$auteurs = array_unique(array_merge(array_keys($this->observations_concernees), array_keys($this->commentaires_concernes)));
1683 jpm 248
 
2038 mathias 249
		foreach ($auteurs as $auteurId) {
250
			$messageTxt = '';
251
			$messageHtml = '';
1747 jpm 252
 
2038 mathias 253
			// données concernant cet auteur
254
			$obsDeCetAuteur = null;
255
			if (isset($this->observations_concernees[$auteurId])) {
256
				$obsDeCetAuteur = $this->observations_concernees[$auteurId];
1348 aurelien 257
			}
2038 mathias 258
			$comDeCetAuteur = null;
259
			if (isset($this->commentaires_concernes[$auteurId])) {
260
				$comDeCetAuteur = $this->commentaires_concernes[$auteurId];
261
			}
262
			$donnees = $this->formaterDonneesPourMessage($auteurId, $obsDeCetAuteur, $comDeCetAuteur);
1571 jpm 263
 
1784 mathias 264
			if (is_numeric($auteurId)) { // inscrits
265
				if ($auteurId != 0) {
266
					$messageTxt = $this->formaterMessageTxt($donnees, true);
267
					$messageHtml = $this->formaterMessageHtml($donnees, true);
268
					if ($this->testeurCourriel == null) {
1783 mathias 269
						$this->envoyerMessage($messageHtml, $messageTxt, $auteurId);
270
					}
1784 mathias 271
				}
272
			} else { // non-inscrits
273
				$messageTxt = $this->formaterMessageTxt($donnees, false);
274
				$messageHtml = $this->formaterMessageHtml($donnees, false);
275
				if ($this->testeurCourriel == null) {
1783 mathias 276
					$this->envoyerMessageAdresseArbitraire($messageHtml, $messageTxt, $auteurId);
277
				}
1737 jpm 278
			}
1784 mathias 279
 
1783 mathias 280
			$this->recapitulatifAdmin[$auteurId] = array('txt' => $messageTxt, 'html' => $messageHtml);
1020 aurelien 281
		}
1737 jpm 282
		if ($this->testeurCourriel == null) {
283
			$this->envoyerMessageRecap();
284
		}
285
		$this->envoyerMessagesTesteur();
1020 aurelien 286
	}
1571 jpm 287
 
1783 mathias 288
	// Envoie un message sans passer par l'annuaire, pour les utilisateurs non inscrits
2038 mathias 289
	protected function envoyerMessageAdresseArbitraire($messageHtml, $messageTxt, $adresseAuteur) {
1783 mathias 290
		$dateFmt = $this->formaterDateCourante();
291
		$sujet = sprintf($this->conteneur->getParametre('titre_message_recapitulatif'), $dateFmt);
292
		$messagerie = $this->conteneur->getMessagerie();
293
 
294
		// envoi mixte HTML + texte
295
		$envoieStatut = $messagerie->envoyerHtml($adresseAuteur, $sujet, $messageHtml, $messageTxt);
296
		return $envoieStatut;
297
	}
298
 
2038 mathias 299
	/**
300
	 * Organise un peu les données d'un auteur pour les traiter plus facilement
301
	 * dans les squelettes de messages
302
	 */
303
	protected function formaterDonneesPourMessage($auteurId, $liste_obs, $liste_com) {
304
		$donnees = array(
305
			'liste_observations' => array(),
306
			'liste_commentaires' => array()
307
		);
308
		if ($liste_obs != null) {
309
			$donnees['liste_observations'] = $liste_obs;
310
		}
311
		if ($liste_com != null) {
312
			$donnees['liste_commentaires'] = $liste_com;
313
		}
314
 
315
		if (is_numeric($auteurId)) { // inscrit
316
			$infosUtilisateur = $this->telechargerUtilisateurInfos($auteurId);
317
			$donnees['auteur_formate'] = $this->formaterIntituleUtilisateur($infosUtilisateur);
318
		} else { // non-inscrit
319
			$donnees['auteur_formate'] = $auteurId;
320
		}
321
 
322
		return $donnees;
323
	}
324
 
325
	/**
326
	 * Rédige un message HTML en appliquant les données fournies au squelette
327
	 * adéquat, selon que le destinataire est inscrit ou non
328
	 */
329
	protected function formaterMessageHtml($donnees, $inscrit=true) {
1783 mathias 330
		if ($inscrit) {
331
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.html';
332
		} else {
333
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires_non_inscrits.tpl.html';
334
		}
1737 jpm 335
		$squelettePhp = $this->conteneur->getSquelettePhp();
336
		$msgHtml = $squelettePhp->analyser($squelette, $donnees);
337
		return $msgHtml;
338
	}
339
 
2038 mathias 340
	/**
341
	 * Rédige un message en texte brut en appliquant les données fournies au squelette
342
	 * adéquat, selon que le destinataire est inscrit ou non
343
	 */
344
	protected function formaterMessageTxt($donnees, $inscrit=true) {
1783 mathias 345
		if ($inscrit) {
346
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.txt';
347
		} else {
348
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires_non_inscrits.tpl.txt';
349
		}
1737 jpm 350
		$squelettePhp = $this->conteneur->getSquelettePhp();
351
		$msgTxt = $squelettePhp->analyser($squelette, $donnees);
352
		// Nettoyage des tabulations pour indentation du code PHP
353
		$msgTxt = str_replace("\t", '', $msgTxt);
354
		return $msgTxt;
355
	}
356
 
1783 mathias 357
	// envoie un message à un utilisateur inscrit, à l'aide de l'annuaire
2038 mathias 358
	protected function envoyerMessage($messageHtml, $messageTxt, $id_destinataire) {
1783 mathias 359
 
1737 jpm 360
		$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
1747 jpm 361
		$dateFmt = $this->formaterDateCourante();
362
		$sujet = sprintf($this->conteneur->getParametre('titre_message_recapitulatif'), $dateFmt);
1737 jpm 363
		$donnees = array(
364
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
1789 mathias 365
			'reponse_courriel' => $this->conteneur->getParametre('adresse_reponse'),  // reply-to
1737 jpm 366
			'format' => 'html',
1747 jpm 367
			'sujet' => $sujet,
1737 jpm 368
			'message' => $messageHtml,
369
			'message_txt' => $messageTxt
1020 aurelien 370
		);
371
 
1737 jpm 372
		$clientRest = $this->conteneur->getRestClient();
373
		$clientRest->modifier($url, $donnees);
1020 aurelien 374
	}
1737 jpm 375
 
2038 mathias 376
	protected function envoyerMessageRecap() {
1737 jpm 377
		$msgRecap = $this->obtenirMessageRecap();
1747 jpm 378
		$dateFmt = $this->formaterDateCourante();
1772 jpm 379
		$sujet = "IdentiPlante : commentaires du $dateFmt";
1737 jpm 380
		$messagerie = $this->conteneur->getMessagerie();
381
		$destinataire = $this->conteneur->getParametre('email_recap');
382
		$messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
383
	}
384
 
2038 mathias 385
	protected function obtenirMessageRecap() {
1737 jpm 386
		if ($this->messageRecapitulatif == null) {
387
			$msgRecap = '';
388
			$separateur = str_repeat('-', 50);
389
			$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
390
			foreach ($this->recapitulatifAdmin as $utilisateurId => $message) {
391
				$messageTxt = $message['txt'];
392
				$intitule = $utilisateursIntitules[$utilisateurId];
393
				$msgRecap .= "Message envoyé à : $intitule\n\n$messageTxt\n$separateur\n";
394
			}
395
			$intituleRecap = implode("\n", $utilisateursIntitules);
396
 
397
			$msgTpl = "Messages envoyés aux utilisateurs suivant :\n%s\n%s\n%s";
398
			$this->messageRecapitulatif = sprintf($msgTpl, $intituleRecap, $separateur, $msgRecap);
399
		}
400
		return $this->messageRecapitulatif;
401
	}
402
 
1783 mathias 403
	// envoie au testeur une copie de chaque type de message envoyé aux utilisateurs
2038 mathias 404
	protected function envoyerMessagesTesteur() {
1737 jpm 405
		if ($this->testeurCourriel != null) {
406
			$messagerie = $this->conteneur->getMessagerie();
1747 jpm 407
			$dateFmt = $this->formaterDateCourante();
1737 jpm 408
 
1772 jpm 409
			$sujet = "TESTEUR : commentaires du $dateFmt";
1737 jpm 410
			$msgRecap = $this->obtenirMessageRecap();
411
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);
412
 
1783 mathias 413
			// deux types de messages (inscrits et non inscrits)
414
			$messageInscrits = null;
415
			$messageNonInscrits = null;
2038 mathias 416
 
1783 mathias 417
			// méga sous optimal
418
			foreach($this->recapitulatifAdmin as $idUtil => $mess) {
419
				if ($messageInscrits != null && $messageNonInscrits != null) {
420
					break; // arrière, Satan ! (mais c'est bien pratique)
421
				}
1785 mathias 422
				if (is_numeric($idUtil) && ($idUtil != 0)) {
1783 mathias 423
					$messageInscrits = $mess;
424
				} else {
425
					$messageNonInscrits = $mess;
426
				}
427
			}
1737 jpm 428
 
1783 mathias 429
			$sujet = "TESTEUR : HTML (inscrits) - commentaire du $dateFmt";
430
			$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $messageInscrits['html'], $messageInscrits['txt']);
431
 
432
			$sujet = "TESTEUR : TXT (inscrits) - commentaire du $dateFmt";
433
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $messageInscrits['txt']);
434
 
435
			$sujet = "TESTEUR : HTML (non inscrits) - commentaire du $dateFmt";
2038 mathias 436
			//echo "MNE HTML:: " . $messageNonInscrits['html'] . "\n\n"; exit;
1783 mathias 437
			$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $messageNonInscrits['html'], $messageNonInscrits['txt']);
438
 
439
			$sujet = "TESTEUR : TXT (non inscrits) - commentaire du $dateFmt";
440
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $messageNonInscrits['txt']);
1737 jpm 441
		}
442
	}
443
 
2038 mathias 444
	protected function obtenirInfosUtilisateurs() {
1737 jpm 445
		$idUtilisateurs = array_keys($this->recapitulatifAdmin);
446
		$utilisateursIntitules = [];
447
		foreach ($idUtilisateurs as $utilisateurId) {
1783 mathias 448
			if (is_numeric($utilisateurId)) { // inscrit
449
				$infosUtilisateur = $this->telechargerUtilisateurInfos($utilisateurId);
450
				$intitule = $this->formaterUtilisateurInfos($infosUtilisateur);
451
			} else { // non-inscrit
452
				$intitule = $utilisateurId . " - utilisateur non inscrit";
453
			}
1737 jpm 454
			$utilisateursIntitules[$utilisateurId] = $intitule;
455
		}
456
		asort($utilisateursIntitules);
457
		return $utilisateursIntitules;
458
	}
459
 
2038 mathias 460
	protected function telechargerUtilisateurInfos($utilisateurId) {
1737 jpm 461
		if (! isset($this->utilisateursInfos[$utilisateurId])) {
462
			$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
463
			$url = sprintf($urlTpl, $utilisateurId);
464
			$clientRest = $this->conteneur->getRestClient();
465
			$json = $clientRest->consulter($url);
2038 mathias 466
			$infos = json_decode($json, true);
467
			if (is_array($infos)) {
468
				$infos = array_shift($infos);
469
			}
470
			$this->utilisateursInfos[$utilisateurId] = isset($infos['id']) ? $infos : $utilisateurId;
1737 jpm 471
		}
472
		return $this->utilisateursInfos[$utilisateurId];
473
	}
474
 
2038 mathias 475
	protected function formaterUtilisateurInfos($infos) {
476
		$utilisateurId = isset($infos['id']) ? $infos['id'] : intval($infos);
477
		if (isset($infos['courriel']) && isset($infos['intitule'])) {
478
			$prenomNom = $infos['nom'].' '.$infos['prenom'];
479
			$pseudo = empty($infos['pseudo']) ? '' : '['.$infos['pseudo'].'] ';
480
			$courriel = $infos['courriel'];
1737 jpm 481
			$intitule = "$prenomNom $pseudo($courriel) - id#$utilisateurId";
482
		} else {
483
			$intitule = "Utilisateur avec id $utilisateurId introuvable";
484
		}
485
		return $intitule;
486
	}
2038 mathias 487
 
488
	protected function formaterNomSci($obs, $prefixe='') {
489
		$cnr = $prefixe . 'nom_ret';
490
		$cns = $prefixe . 'nom_sel';
491
		$nom = 'Espèce indéterminée';
492
		if ($obs[$cnr] != '') {
493
			$nom = $obs[$cnr];
494
		} else if($obs[$cns] != '') {
495
			$nom = $obs[$cns];
496
		}
497
		return $nom;
498
	}
499
 
500
	protected function formaterDate($date) {
501
		$dateFmt = '(date inconnue)';
502
		if ($date != '0000-00-00 00:00:00') {
503
			$time = strtotime($date);
504
			$dateFmt = date('d/m/Y', $time);
505
		}
506
		return $dateFmt;
507
	}
508
 
509
	protected function formaterLieu($obs) {
510
		$lieuInfos = [];
511
		$champsLieu = ['zone_geo', 'lieudit', 'station'];
512
		foreach ($champsLieu as $champ) {
513
			if (trim($obs[$champ]) == '') {
514
				continue;
515
			}
516
 
517
			$lieuIntitule = $obs[$champ];
518
			if ($champ == 'zone_geo') {
519
				$codeDept = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']);
520
				$lieuIntitule .= empty($codeDept) ? '' : " ($codeDept)";
521
			}
522
			$lieuInfos[] = $lieuIntitule;
523
		}
524
		$lieu = (count($lieuInfos) > 0) ? implode(' > ', $lieuInfos) : '(lieu inconnu)';
525
		return $lieu;
526
	}
527
 
528
	protected function formaterDateCourante() {
529
		$date = ($this->dateRenvoi == null) ? time() : strtotime($this->dateRenvoi);
530
		$dateFmt = date('d-m-Y', $date);
531
		return $dateFmt;
532
	}
533
 
534
	protected function formaterAuteurObs($obs) {
535
		return $obs['prenom_utilisateur'].' '.$obs['nom_utilisateur'];
536
	}
537
 
538
	protected function formaterAuteurCommentaire($commentaire) {
539
		return $commentaire['dc_utilisateur_prenom'].' '.$commentaire['dc_utilisateur_nom'];
540
	}
541
 
542
	protected function formaterIntituleUtilisateur($infos) {
543
		$intituleUtilisateur = isset($infos['intitule']) ? $infos['intitule'] : '';
544
		return $intituleUtilisateur;
545
	}
546
 
547
	protected function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
548
		$code_departement = '';
549
		if (preg_match('/^INSEE-C:([0-9]{2})[0-9]{3}$/', $code_zone_geo, $match)) {
550
			$code_departement = $match[1];
551
		}
552
		return $code_departement;
553
	}
554
 
555
	protected function obtenirLienFiche($id_obs) {
556
		return sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
557
	}
558
 
559
	/**
560
	 * Copie dans un nouveau tableau les valeurs de $tab dont les clefs
561
	 * commencent par $prefixe
562
	 */
563
	protected function arrayTranchette($tab, $prefixe, $enleverPrefixe=false) {
564
		$res = array();
565
		foreach ($tab as $k => $v) {
566
			if (strpos($k, $prefixe) === 0) {
567
				$clef = $k;
568
				if ($enleverPrefixe === true) {
569
					$clef = substr($k, strlen($prefixe));
570
				}
571
				$res[$clef] = $v;
572
			}
573
		}
574
		return $res;
575
	}
1737 jpm 576
}