Subversion Repositories eFlore/Applications.del

Rev

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