Subversion Repositories eFlore/Applications.del

Rev

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