Subversion Repositories eFlore/Applications.del

Rev

Rev 1682 | Rev 1722 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1135 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
6
 *
1682 jpm 7
 * @category	php 5.4
8
 * @package		DEL
9
 * @subpackage	Scripts
1135 aurelien 10
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
11
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
1682 jpm 12
 * @license		CeCILL v2 http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt
13
 * @license		GNU-GPL http://www.gnu.org/licenses/gpl.html
1135 aurelien 14
 */
15
 
16
class AlerteMailADeterminer {
17
 
18
	private $conteneur;
1709 jpm 19
	private $testeurCourriel = null;
1571 jpm 20
 
1135 aurelien 21
	private $observations_concernees = array();
1571 jpm 22
 
1682 jpm 23
	public function __construct($conteneur) {
1135 aurelien 24
		$this->conteneur = $conteneur;
25
	}
1571 jpm 26
 
1135 aurelien 27
	public function executer() {
28
		try {
1709 jpm 29
			$this->verifierModeUtilisation();
1135 aurelien 30
			$observations = $this->chargerObsADeterminer();
1682 jpm 31
			if (!empty($observations)) {
1135 aurelien 32
				$this->formaterObservations($observations);
1682 jpm 33
				$message = $this->genererMessage();
34
				$this->envoyerMessageAuxDestinataires($message);
1135 aurelien 35
			}
36
		} catch (Exception $e) {
37
			$this->traiterErreur($e->getMessage());
38
		}
39
	}
40
 
1709 jpm 41
	private function verifierModeUtilisation() {
42
		$testeurCourriel = $this->conteneur->getParametre('t');
43
		if ($testeurCourriel) {
44
			if (filter_var($testeurCourriel, FILTER_VALIDATE_EMAIL)) {
45
				$this->testeurCourriel = $testeurCourriel;
46
			} else {
47
				$msg = "Veuillez indiquer une adresse de courriel valide à la suite du paramètre «-t».";
48
				new Exception($msg);
49
			}
50
		}
51
	}
52
 
1571 jpm 53
	protected function chargerObsADeterminer() {
1135 aurelien 54
		//TODO: optimiser la requête si beaucoup de mails sont envoyés
1571 jpm 55
		$requete = "SELECT * ".
56
			"FROM del_obs_image AS doi ".
57
			"	INNER JOIN del_observation AS do ON doi.id_observation = do.id_observation ".
58
			"	LEFT JOIN del_utilisateur AS du ON do.ce_utilisateur = du.id_utilisateur AND do.ce_utilisateur != 0 ".
1682 jpm 59
			'WHERE (do.mots_cles_texte LIKE "%aDeterminer%" '.
60
			'		OR nom_sel IS NULL OR nom_sel = "" '.
61
			'		OR nom_ret IS NULL OR nom_ret = "") '.
1571 jpm 62
			'	AND ('.
63
			'		do.date_transmission > DATE_SUB(CURDATE(), INTERVAL 1 DAY) '.
64
			'		OR do.date_creation > DATE_SUB(CURDATE(), INTERVAL 1 DAY) '.
65
			'		OR do.date_modification > DATE_SUB(CURDATE(), INTERVAL 1 DAY) '.
1576 jpm 66
			'	) '.
1571 jpm 67
			"ORDER BY do.id_observation ";
1135 aurelien 68
		$obs = $this->conteneur->getBdd()->recupererTous($requete);
69
		return $obs;
70
	}
1571 jpm 71
 
1682 jpm 72
	private function formaterObservations($liste_obs) {
1135 aurelien 73
		foreach ($liste_obs as $obs) {
74
			$id_obs = $obs['id_observation'];
1682 jpm 75
			$obs['date'] = $this->formaterDateObs($obs['date_observation']);
1135 aurelien 76
			$obs['nom_propose'] = $this->formaterNomSci($obs);
1682 jpm 77
			$obs['lien'] = $this->obtenirLienFicheObs($id_obs);
1135 aurelien 78
			$this->observations_concernees[$id_obs] = $obs;
79
		}
80
	}
1571 jpm 81
 
1682 jpm 82
	private function formaterDateObs($date) {
83
		$dateFmt = '(date inconnue)';
84
		if ($date != '0000-00-00 00:00:00') {
85
			$time = strtotime($date);
86
			$dateFmt = date('d/m/Y', $time);
1275 aurelien 87
		}
1682 jpm 88
		return $dateFmt;
1135 aurelien 89
	}
1571 jpm 90
 
1135 aurelien 91
	private function formaterNomSci($obs) {
92
		$nom = '';
1571 jpm 93
		if ($obs['nom_ret'] != '') {
1135 aurelien 94
			$nom = $obs['nom_ret'];
95
		} else if($obs['nom_sel'] != '') {
96
			$nom = $obs['nom_sel'];
97
		}
98
		return $nom;
99
	}
1571 jpm 100
 
1135 aurelien 101
	private function obtenirLienFicheObs($id_obs) {
1682 jpm 102
		return  sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
1135 aurelien 103
	}
1571 jpm 104
 
1682 jpm 105
	private function genererMessage() {
106
		$donnees = array();
107
		$donnees['liste_observations'] = $this->observations_concernees;
108
		$messageTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.html';
109
		$squelettePhp = $this->conteneur->getSquelettePhp();
110
		return $squelettePhp->analyser($messageTpl, $donnees);
111
	}
112
 
113
	private function envoyerMessageAuxDestinataires($message) {
114
		$this->envoyerMessageListeDetermination($message);
115
 
116
		$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
117
		foreach ($utilisateurs as $utilisateur) {
118
			$this->envoyerMessage($message, $utilisateur['id_utilisateur']);
119
		}
120
	}
121
 
1275 aurelien 122
	private function obtenirDestinatairesMailsRecapitulatif() {
1571 jpm 123
		$preference = $this->conteneur->getBdd()->proteger('%"mail_notification_toutes_obs":"1"%');
1275 aurelien 124
		$requete = "SELECT id_utilisateur ".
1571 jpm 125
			"FROM del_utilisateur_infos ".
126
			"WHERE preferences LIKE $preference ";
1275 aurelien 127
		$utilisateurs = $this->conteneur->getBdd()->recupererTous($requete);
128
		return $utilisateurs;
129
	}
1571 jpm 130
 
1275 aurelien 131
	/**
132
	 * Appelle le web service message de l'annuaire afin d'envoyer un mail à l'utilisateur dont l'identifiant est donné
133
	 * en paramètre
134
	 * Enter description here ...
135
	 * @param string $message
136
	 * @param int $id_destinataire
137
	 */
1682 jpm 138
	private function envoyerMessage($message, $id_destinataire) {
139
		$url_requete = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
1275 aurelien 140
		$post = array(
1571 jpm 141
			'sujet' => 'Récapitulatif des dernières observations à déterminer',
142
			'message' => $message,
1682 jpm 143
			'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
1571 jpm 144
			'format' => 'html'
1275 aurelien 145
		);
1571 jpm 146
 
1275 aurelien 147
		$ch = curl_init();
1576 jpm 148
		$options = array(
149
			CURLOPT_URL => $url_requete,
1571 jpm 150
			CURLOPT_HEADER => false,
151
			CURLOPT_POST => 1,
152
			CURLOPT_POSTFIELDS => $post,
153
			CURLOPT_RETURNTRANSFER => true
1275 aurelien 154
		);
155
		curl_setopt_array($ch, $options);
1682 jpm 156
		curl_exec($ch);
1275 aurelien 157
		curl_close($ch);
158
	}
1571 jpm 159
 
1275 aurelien 160
	/** La liste détermination n'étant pas un membre de tela botanica,
1571 jpm 161
	* on lui envoie un message directement
1275 aurelien 162
	* @param string $message contenu du mail
1135 aurelien 163
	* @return boolean true ou false suivant le succès ou non de l'envoi
164
	*/
1682 jpm 165
	private function envoyerMessageListeDetermination($message) {
1532 mathias 166
		$sujet = 'Récapitulatif des dernières observations à déterminer';
1576 jpm 167
		$message_html = $message;
168
		$message_texte = $this->supprimerHtml($message);
1571 jpm 169
 
1135 aurelien 170
		$limite = "_----------=_parties_".md5(uniqid (rand()));
1571 jpm 171
 
1135 aurelien 172
		// Définition d'un mail en texte simple et html
1571 jpm 173
		$entetes = "X-Sender: <http://www.tela-botanica.org>\n".
174
			"X-Mailer: PHP\n".
1682 jpm 175
			"X-auth-smtp-user: ".$this->conteneur->getParametre('adresse_expediteur_recapitulatif')." \n".
176
			"X-abuse-contact: ".$this->conteneur->getParametre('adresse_expediteur_recapitulatif')." \n".
1571 jpm 177
			"Date: ".date("D, j M Y G:i:s O")."\n".
1682 jpm 178
			'From: '.$this->conteneur->getParametre('adresse_expediteur_recapitulatif')."\n".
1571 jpm 179
			// multipart/alternative signifie même contenu de la forme la plus simple à la plus complexe
180
			"Content-Type: multipart/alternative; boundary=\"".$limite."\";\n\n";
181
 
1682 jpm 182
		$contenu = // message en texte simple
1571 jpm 183
			"--".$limite."\n".
1682 jpm 184
			"Content-Type: text/plain; charset=\"".$this->conteneur->getParametre('encodage_appli')."\";\n".
1571 jpm 185
			"Content-Transfer-Encoding: 7bit;\n\n".
186
			$message_texte."\n".
187
			// le message en html est préféré s'il est lisible
188
			"--".$limite."\n".
189
			"Content-Type: text/html;".
1682 jpm 190
			"charset=\"".$this->conteneur->getParametre('encodage_appli')."\";\n".
1571 jpm 191
			"Content-Transfer-Encoding: 7bit;\n\n".
1576 jpm 192
			$message_html."\n".
1571 jpm 193
			"--".$limite."--\n";
194
 
195
		$envoieStatut = mail(
1682 jpm 196
			$this->conteneur->getParametre('adresse_destinataire_recapitulatif_determination'),
197
			$this->conteneur->getParametre('titre_message_recapitulatif_obs'),
1576 jpm 198
			$contenu,
199
			$entetes
200
		);
1571 jpm 201
 
202
		return $envoieStatut;
1135 aurelien 203
	}
1576 jpm 204
 
205
	/** Transforme automatiquement le message html en message txt.
206
	 *
207
	 * Réalise un stip_tags et avant ça un remplacement des liens sur mesure pour les mettre au format email txt.
208
	 */
209
	private function supprimerHtml($messageHtml) {
210
		$html = $this->ajouterHrefDansBalise($messageHtml);
211
		$messageTxt = strip_tags($html);
212
		return $messageTxt;
213
	}
214
 
215
	/**
216
	 * Extrait la valeur de l'attribut href des balises HTML de liens (a) et ajoute le lien entre
217
	 * chevrons (<>) dans le contenu de la balise "a".
218
	 */
219
	private function ajouterHrefDansBalise($html) {
220
		$dom = new DOMDocument;
221
		$dom->loadHTML($html);
222
		foreach ($dom->getElementsByTagName('a') as $node) {
223
			if ($node->hasAttribute( 'href' )) {
224
				$href = $node->getAttribute('href');
1682 jpm 225
				$node->nodeValue = $node->nodeValue." ( $href )";
1576 jpm 226
			}
227
		}
228
		$html = $dom->saveHtml();
229
		return $html;
230
	}
1135 aurelien 231
}
232
?>