Subversion Repositories eFlore/Applications.del

Rev

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