Subversion Repositories eFlore/Applications.del

Rev

Rev 2041 | Rev 2043 | 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
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
115
		$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_commentaires":"0"%');
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
 
2039 mathias 204
			if (! isset($this->commentaires_concernes[$id_auteur_co][$id_co])) {
205
				// infos à mentionner dans l'email
206
				$infos = array();
207
				$infos['id_obs'] = $o['id_observation'];
208
				$id_auteur_obs = $o['ce_utilisateur'];
209
				// si utilisateur non inscrit
210
				if (($id_auteur_obs == 0) && ($o['courriel_utilisateur'] != '')) {
211
					$id_auteur_obs = $o['courriel_utilisateur'];
212
				}
213
				$infos['id_auteur_obs'] = $id_auteur_obs;
214
				$infos['auteur_obs'] = $this->formaterAuteurObs($o);
215
				$infos['nom_sci'] = $this->formaterNomSci($o);
2042 mathias 216
				$infos['nom_sel_co'] = $o['dco_nom_sel'];
2039 mathias 217
				$infos['nom_sci_co'] = $this->formaterNomSci($o, 'dco_');
218
				$infos['date'] = $this->formaterDate($o['date_observation']);
219
				$infos['date_co'] = $this->formaterDate($o['dco_date']);
220
				$infos['texte_co'] = $o['dco_texte'];
221
				$infos['lieu'] = $this->formaterLieu($o);
222
				$infos['lien'] = $this->obtenirLienFiche($o['id_observation']);
223
				$infos['commentaires'] = array();
224
				$this->commentaires_concernes[$id_auteur_co][$id_co] = $infos;
225
				$this->commentaires_concernes[$id_auteur_co][$id_co]['commentaires'] = array();
226
			}
227
 
2038 mathias 228
			// isolation des données du commentaire
229
			$commentaire = $this->arrayTranchette($o, 'dc_', true);
230
			$commentaire['auteur'] = $this->formaterAuteurCommentaire($o);
231
			$this->commentaires_concernes[$id_auteur_co][$id_co]['commentaires'][] = $commentaire;
1683 jpm 232
		}
2038 mathias 233
		//print_r($this->commentaires_concernes); exit;
1683 jpm 234
	}
235
 
2038 mathias 236
	/**
237
	 * Envoie un message par destinataire (auteur d'une observation ayant reçu
238
	 * un commentaire ou d'un commentaire ayant reçu une réponse), en format
239
	 * texte brut + HTML, avec un squelette différent selon que le destinataire
240
	 * est inscrit ou non; en mode test, n'envoie les messages qu'au testeur
241
	 */
242
	protected function envoyerMessageAuxDestinataires() {
243
		// liste des auteurs à contacter
244
		$auteurs = array_unique(array_merge(array_keys($this->observations_concernees), array_keys($this->commentaires_concernes)));
1683 jpm 245
 
2038 mathias 246
		foreach ($auteurs as $auteurId) {
247
			$messageTxt = '';
248
			$messageHtml = '';
1747 jpm 249
 
2038 mathias 250
			// données concernant cet auteur
251
			$obsDeCetAuteur = null;
252
			if (isset($this->observations_concernees[$auteurId])) {
253
				$obsDeCetAuteur = $this->observations_concernees[$auteurId];
1348 aurelien 254
			}
2038 mathias 255
			$comDeCetAuteur = null;
256
			if (isset($this->commentaires_concernes[$auteurId])) {
257
				$comDeCetAuteur = $this->commentaires_concernes[$auteurId];
258
			}
259
			$donnees = $this->formaterDonneesPourMessage($auteurId, $obsDeCetAuteur, $comDeCetAuteur);
1571 jpm 260
 
1784 mathias 261
			if (is_numeric($auteurId)) { // inscrits
262
				if ($auteurId != 0) {
263
					$messageTxt = $this->formaterMessageTxt($donnees, true);
264
					$messageHtml = $this->formaterMessageHtml($donnees, true);
265
					if ($this->testeurCourriel == null) {
1783 mathias 266
						$this->envoyerMessage($messageHtml, $messageTxt, $auteurId);
267
					}
1784 mathias 268
				}
269
			} else { // non-inscrits
270
				$messageTxt = $this->formaterMessageTxt($donnees, false);
271
				$messageHtml = $this->formaterMessageHtml($donnees, false);
272
				if ($this->testeurCourriel == null) {
1783 mathias 273
					$this->envoyerMessageAdresseArbitraire($messageHtml, $messageTxt, $auteurId);
274
				}
1737 jpm 275
			}
1784 mathias 276
 
1783 mathias 277
			$this->recapitulatifAdmin[$auteurId] = array('txt' => $messageTxt, 'html' => $messageHtml);
1020 aurelien 278
		}
1737 jpm 279
		if ($this->testeurCourriel == null) {
280
			$this->envoyerMessageRecap();
281
		}
282
		$this->envoyerMessagesTesteur();
1020 aurelien 283
	}
1571 jpm 284
 
1783 mathias 285
	// Envoie un message sans passer par l'annuaire, pour les utilisateurs non inscrits
2038 mathias 286
	protected function envoyerMessageAdresseArbitraire($messageHtml, $messageTxt, $adresseAuteur) {
1783 mathias 287
		$dateFmt = $this->formaterDateCourante();
288
		$sujet = sprintf($this->conteneur->getParametre('titre_message_recapitulatif'), $dateFmt);
289
		$messagerie = $this->conteneur->getMessagerie();
290
 
291
		// envoi mixte HTML + texte
292
		$envoieStatut = $messagerie->envoyerHtml($adresseAuteur, $sujet, $messageHtml, $messageTxt);
293
		return $envoieStatut;
294
	}
295
 
2038 mathias 296
	/**
297
	 * Organise un peu les données d'un auteur pour les traiter plus facilement
298
	 * dans les squelettes de messages
299
	 */
300
	protected function formaterDonneesPourMessage($auteurId, $liste_obs, $liste_com) {
301
		$donnees = array(
302
			'liste_observations' => array(),
303
			'liste_commentaires' => array()
304
		);
305
		if ($liste_obs != null) {
306
			$donnees['liste_observations'] = $liste_obs;
307
		}
308
		if ($liste_com != null) {
309
			$donnees['liste_commentaires'] = $liste_com;
310
		}
311
 
312
		if (is_numeric($auteurId)) { // inscrit
313
			$infosUtilisateur = $this->telechargerUtilisateurInfos($auteurId);
314
			$donnees['auteur_formate'] = $this->formaterIntituleUtilisateur($infosUtilisateur);
315
		} else { // non-inscrit
316
			$donnees['auteur_formate'] = $auteurId;
317
		}
318
 
319
		return $donnees;
320
	}
321
 
322
	/**
323
	 * Rédige un message HTML en appliquant les données fournies au squelette
324
	 * adéquat, selon que le destinataire est inscrit ou non
325
	 */
326
	protected function formaterMessageHtml($donnees, $inscrit=true) {
1783 mathias 327
		if ($inscrit) {
328
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.html';
329
		} else {
330
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires_non_inscrits.tpl.html';
331
		}
1737 jpm 332
		$squelettePhp = $this->conteneur->getSquelettePhp();
333
		$msgHtml = $squelettePhp->analyser($squelette, $donnees);
334
		return $msgHtml;
335
	}
336
 
2038 mathias 337
	/**
338
	 * Rédige un message en texte brut en appliquant les données fournies au squelette
339
	 * adéquat, selon que le destinataire est inscrit ou non
340
	 */
341
	protected function formaterMessageTxt($donnees, $inscrit=true) {
1783 mathias 342
		if ($inscrit) {
343
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.txt';
344
		} else {
345
			$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires_non_inscrits.tpl.txt';
346
		}
1737 jpm 347
		$squelettePhp = $this->conteneur->getSquelettePhp();
348
		$msgTxt = $squelettePhp->analyser($squelette, $donnees);
349
		// Nettoyage des tabulations pour indentation du code PHP
350
		$msgTxt = str_replace("\t", '', $msgTxt);
351
		return $msgTxt;
352
	}
353
 
1783 mathias 354
	// envoie un message à un utilisateur inscrit, à l'aide de l'annuaire
2038 mathias 355
	protected function envoyerMessage($messageHtml, $messageTxt, $id_destinataire) {
1783 mathias 356
 
1737 jpm 357
		$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
1747 jpm 358
		$dateFmt = $this->formaterDateCourante();
359
		$sujet = sprintf($this->conteneur->getParametre('titre_message_recapitulatif'), $dateFmt);
1737 jpm 360
		$donnees = array(
361
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
1789 mathias 362
			'reponse_courriel' => $this->conteneur->getParametre('adresse_reponse'),  // reply-to
1737 jpm 363
			'format' => 'html',
1747 jpm 364
			'sujet' => $sujet,
1737 jpm 365
			'message' => $messageHtml,
366
			'message_txt' => $messageTxt
1020 aurelien 367
		);
368
 
1737 jpm 369
		$clientRest = $this->conteneur->getRestClient();
370
		$clientRest->modifier($url, $donnees);
1020 aurelien 371
	}
1737 jpm 372
 
2038 mathias 373
	protected function envoyerMessageRecap() {
1737 jpm 374
		$msgRecap = $this->obtenirMessageRecap();
1747 jpm 375
		$dateFmt = $this->formaterDateCourante();
1772 jpm 376
		$sujet = "IdentiPlante : commentaires du $dateFmt";
1737 jpm 377
		$messagerie = $this->conteneur->getMessagerie();
378
		$destinataire = $this->conteneur->getParametre('email_recap');
379
		$messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
380
	}
381
 
2038 mathias 382
	protected function obtenirMessageRecap() {
1737 jpm 383
		if ($this->messageRecapitulatif == null) {
384
			$msgRecap = '';
385
			$separateur = str_repeat('-', 50);
386
			$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
387
			foreach ($this->recapitulatifAdmin as $utilisateurId => $message) {
388
				$messageTxt = $message['txt'];
389
				$intitule = $utilisateursIntitules[$utilisateurId];
390
				$msgRecap .= "Message envoyé à : $intitule\n\n$messageTxt\n$separateur\n";
391
			}
392
			$intituleRecap = implode("\n", $utilisateursIntitules);
393
 
394
			$msgTpl = "Messages envoyés aux utilisateurs suivant :\n%s\n%s\n%s";
395
			$this->messageRecapitulatif = sprintf($msgTpl, $intituleRecap, $separateur, $msgRecap);
396
		}
397
		return $this->messageRecapitulatif;
398
	}
399
 
1783 mathias 400
	// envoie au testeur une copie de chaque type de message envoyé aux utilisateurs
2038 mathias 401
	protected function envoyerMessagesTesteur() {
1737 jpm 402
		if ($this->testeurCourriel != null) {
403
			$messagerie = $this->conteneur->getMessagerie();
1747 jpm 404
			$dateFmt = $this->formaterDateCourante();
1737 jpm 405
 
1772 jpm 406
			$sujet = "TESTEUR : commentaires du $dateFmt";
1737 jpm 407
			$msgRecap = $this->obtenirMessageRecap();
408
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);
409
 
1783 mathias 410
			// deux types de messages (inscrits et non inscrits)
411
			$messageInscrits = null;
412
			$messageNonInscrits = null;
2038 mathias 413
 
1783 mathias 414
			// méga sous optimal
415
			foreach($this->recapitulatifAdmin as $idUtil => $mess) {
416
				if ($messageInscrits != null && $messageNonInscrits != null) {
417
					break; // arrière, Satan ! (mais c'est bien pratique)
418
				}
1785 mathias 419
				if (is_numeric($idUtil) && ($idUtil != 0)) {
1783 mathias 420
					$messageInscrits = $mess;
421
				} else {
422
					$messageNonInscrits = $mess;
423
				}
424
			}
1737 jpm 425
 
1783 mathias 426
			$sujet = "TESTEUR : HTML (inscrits) - commentaire du $dateFmt";
427
			$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $messageInscrits['html'], $messageInscrits['txt']);
428
 
429
			$sujet = "TESTEUR : TXT (inscrits) - commentaire du $dateFmt";
430
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $messageInscrits['txt']);
431
 
432
			$sujet = "TESTEUR : HTML (non inscrits) - commentaire du $dateFmt";
2038 mathias 433
			//echo "MNE HTML:: " . $messageNonInscrits['html'] . "\n\n"; exit;
1783 mathias 434
			$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $messageNonInscrits['html'], $messageNonInscrits['txt']);
435
 
436
			$sujet = "TESTEUR : TXT (non inscrits) - commentaire du $dateFmt";
437
			$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $messageNonInscrits['txt']);
1737 jpm 438
		}
439
	}
440
 
2038 mathias 441
	protected function obtenirInfosUtilisateurs() {
1737 jpm 442
		$idUtilisateurs = array_keys($this->recapitulatifAdmin);
443
		$utilisateursIntitules = [];
444
		foreach ($idUtilisateurs as $utilisateurId) {
1783 mathias 445
			if (is_numeric($utilisateurId)) { // inscrit
446
				$infosUtilisateur = $this->telechargerUtilisateurInfos($utilisateurId);
447
				$intitule = $this->formaterUtilisateurInfos($infosUtilisateur);
448
			} else { // non-inscrit
449
				$intitule = $utilisateurId . " - utilisateur non inscrit";
450
			}
1737 jpm 451
			$utilisateursIntitules[$utilisateurId] = $intitule;
452
		}
453
		asort($utilisateursIntitules);
454
		return $utilisateursIntitules;
455
	}
456
 
2038 mathias 457
	protected function telechargerUtilisateurInfos($utilisateurId) {
1737 jpm 458
		if (! isset($this->utilisateursInfos[$utilisateurId])) {
459
			$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
460
			$url = sprintf($urlTpl, $utilisateurId);
461
			$clientRest = $this->conteneur->getRestClient();
462
			$json = $clientRest->consulter($url);
2038 mathias 463
			$infos = json_decode($json, true);
464
			if (is_array($infos)) {
465
				$infos = array_shift($infos);
466
			}
467
			$this->utilisateursInfos[$utilisateurId] = isset($infos['id']) ? $infos : $utilisateurId;
1737 jpm 468
		}
469
		return $this->utilisateursInfos[$utilisateurId];
470
	}
471
 
2038 mathias 472
	protected function formaterUtilisateurInfos($infos) {
473
		$utilisateurId = isset($infos['id']) ? $infos['id'] : intval($infos);
474
		if (isset($infos['courriel']) && isset($infos['intitule'])) {
475
			$prenomNom = $infos['nom'].' '.$infos['prenom'];
476
			$pseudo = empty($infos['pseudo']) ? '' : '['.$infos['pseudo'].'] ';
477
			$courriel = $infos['courriel'];
1737 jpm 478
			$intitule = "$prenomNom $pseudo($courriel) - id#$utilisateurId";
479
		} else {
480
			$intitule = "Utilisateur avec id $utilisateurId introuvable";
481
		}
482
		return $intitule;
483
	}
2038 mathias 484
 
485
	protected function formaterNomSci($obs, $prefixe='') {
486
		$cnr = $prefixe . 'nom_ret';
487
		$cns = $prefixe . 'nom_sel';
488
		$nom = 'Espèce indéterminée';
489
		if ($obs[$cnr] != '') {
490
			$nom = $obs[$cnr];
491
		} else if($obs[$cns] != '') {
492
			$nom = $obs[$cns];
493
		}
494
		return $nom;
495
	}
496
 
497
	protected function formaterDate($date) {
498
		$dateFmt = '(date inconnue)';
499
		if ($date != '0000-00-00 00:00:00') {
500
			$time = strtotime($date);
501
			$dateFmt = date('d/m/Y', $time);
502
		}
503
		return $dateFmt;
504
	}
505
 
506
	protected function formaterLieu($obs) {
507
		$lieuInfos = [];
508
		$champsLieu = ['zone_geo', 'lieudit', 'station'];
509
		foreach ($champsLieu as $champ) {
510
			if (trim($obs[$champ]) == '') {
511
				continue;
512
			}
513
 
514
			$lieuIntitule = $obs[$champ];
515
			if ($champ == 'zone_geo') {
516
				$codeDept = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']);
517
				$lieuIntitule .= empty($codeDept) ? '' : " ($codeDept)";
518
			}
519
			$lieuInfos[] = $lieuIntitule;
520
		}
521
		$lieu = (count($lieuInfos) > 0) ? implode(' > ', $lieuInfos) : '(lieu inconnu)';
522
		return $lieu;
523
	}
524
 
525
	protected function formaterDateCourante() {
526
		$date = ($this->dateRenvoi == null) ? time() : strtotime($this->dateRenvoi);
527
		$dateFmt = date('d-m-Y', $date);
528
		return $dateFmt;
529
	}
530
 
531
	protected function formaterAuteurObs($obs) {
532
		return $obs['prenom_utilisateur'].' '.$obs['nom_utilisateur'];
533
	}
534
 
535
	protected function formaterAuteurCommentaire($commentaire) {
536
		return $commentaire['dc_utilisateur_prenom'].' '.$commentaire['dc_utilisateur_nom'];
537
	}
538
 
539
	protected function formaterIntituleUtilisateur($infos) {
540
		$intituleUtilisateur = isset($infos['intitule']) ? $infos['intitule'] : '';
541
		return $intituleUtilisateur;
542
	}
543
 
544
	protected function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
545
		$code_departement = '';
546
		if (preg_match('/^INSEE-C:([0-9]{2})[0-9]{3}$/', $code_zone_geo, $match)) {
547
			$code_departement = $match[1];
548
		}
549
		return $code_departement;
550
	}
551
 
552
	protected function obtenirLienFiche($id_obs) {
553
		return sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
554
	}
555
 
556
	/**
557
	 * Copie dans un nouveau tableau les valeurs de $tab dont les clefs
558
	 * commencent par $prefixe
559
	 */
560
	protected function arrayTranchette($tab, $prefixe, $enleverPrefixe=false) {
561
		$res = array();
562
		foreach ($tab as $k => $v) {
563
			if (strpos($k, $prefixe) === 0) {
564
				$clef = $k;
565
				if ($enleverPrefixe === true) {
566
					$clef = substr($k, strlen($prefixe));
567
				}
568
				$res[$clef] = $v;
569
			}
570
		}
571
		return $res;
572
	}
1737 jpm 573
}