Subversion Repositories eFlore/Applications.del

Rev

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