New file |
0,0 → 1,210 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Le script récupère tous les commentaires et déterminations fait ce jour et envoie un mail |
* aux auteurs des observations récapitulant celle-ci |
* |
* @category php 5.2 |
* @package del |
* @subpackage scripts |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
|
class AlerteMailCommentaires { |
|
private $parametres; |
private $conteneur; |
|
private $observations_concernees = array(); |
private $id_observation_commentees = array(); |
private $correspondance_id_obs_auteurs = array(); |
|
public function __construct($parametres, $conteneur) { |
$this->parametres = $parametres; |
$this->conteneur = $conteneur; |
} |
|
public function executer() { |
try { |
$observations = $this->chargerObservationsCommentees(); |
if (!empty($observations)) { |
$this->formaterObservations($observations); |
$commentaires = $this->chargerCommentairesAjourdhui(); |
$this->formaterCommentaires($commentaires); |
$this->parcourirListeCommentairesEtEnvoyerMessage($this->observations_concernees); |
} |
} catch (Exception $e) { |
$this->traiterErreur($e->getMessage()); |
} |
} |
|
protected function chargerCommentairesAjourdhui() { |
$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_obs":"0"%'); |
// TODO: optimiser la requête si beaucoup de mails sont envoyés |
$requete = "SELECT * ". |
"FROM del_commentaire AS dc ". |
"WHERE dc.ce_observation != '0' ". |
"AND dc.id_commentaire NOT IN ". |
"( ". |
" SELECT dc.id_commentaire ". |
" FROM del_commentaire AS dc, del_observation AS dob". |
" WHERE dc.nom_sel = dob.nom_sel ". |
" AND dc.ce_utilisateur = dob.ce_utilisateur ". |
" AND dc.ce_observation = dob.id_observation ". |
") ". |
"AND dc.ce_utilisateur NOT IN ". |
"( ". |
" SELECT id_utilisateur ". |
" FROM del_utilisateur_infos ". |
" WHERE preferences LIKE $preferences ". |
") ". |
"AND TO_DAYS(NOW()) - TO_DAYS(dc.date) <= 1 ". |
"ORDER BY dc.ce_observation"; |
$commentaires = $this->conteneur->getBdd()->recupererTous($requete); |
return $commentaires; |
} |
|
protected function chargerObservationsCommentees() { |
$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_obs":"0"%'); |
//TODO: optimiser la requête si beaucoup de mails sont envoyés |
$requete = "SELECT * FROM del_observation AS do ". |
"WHERE do.id_observation IN ". |
"( ". |
"SELECT dc.ce_observation ". |
"FROM del_commentaire AS dc ". |
"WHERE dc.ce_observation != '0' ". |
"AND dc.id_commentaire NOT IN ". |
"( ". |
" SELECT dc.id_commentaire ". |
" FROM del_commentaire AS dc, del_observation AS dob". |
" WHERE dc.nom_sel = dob.nom_sel ". |
" AND dc.ce_utilisateur = dob.ce_utilisateur ". |
" AND dc.ce_observation = dob.id_observation ". |
") ". |
"AND dc.ce_utilisateur NOT IN ". |
"( ". |
" SELECT id_utilisateur ". |
" FROM del_utilisateur_infos ". |
" WHERE preferences LIKE $preferences ". |
") ". |
"AND TO_DAYS(NOW()) - TO_DAYS(dc.date) <= 1 ". |
") ". |
"ORDER BY do.ce_utilisateur, do.id_observation "; |
$observations = $this->conteneur->getBdd()->recupererTous($requete); |
return $observations; |
} |
|
protected function convertirCodeZoneGeoVersDepartement($code_zone_geo) { |
$code_departement = ''; |
if ($this->estUnCodeInseeDepartement($code_zone_geo)) { |
$code_departement = substr(ltrim($code_zone_geo, 'INSEE-C:'), 0, 2); |
} |
|
return $code_departement; |
} |
|
protected function estUnCodeInseeDepartement($code_a_tester) { |
return preg_match('/^INSEE-C:[0-9]{5}/',$code_a_tester); |
} |
|
protected function formaterObservations($liste_obs) { |
foreach ($liste_obs as $obs) { |
$id_obs = $obs['id_observation']; |
$auteur_obs = $obs['ce_utilisateur']; |
$obs['date'] = $this->formaterDateObs($obs['date_observation']); |
$obs['lieu'] = $this->formaterLieuObservation($obs); |
$obs['lien'] = $this->obtenirLienFicheObs($obs['id_observation']); |
$obs['commentaires'] = array(); |
$this->correspondance_id_obs_auteurs[$id_obs] = $auteur_obs; |
$this->observations_concernees[$auteur_obs][$id_obs] = $obs; |
} |
} |
|
protected function formaterLieuObservation($obs) { |
$lieux = array(); |
if (!empty($obs['zone_geo'])) { |
$zone_geo = $obs['zone_geo']; |
$zone_geo.= (!empty($obs['ce_zone_geo']) ? ' ('.$this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']).')' : ''); |
$lieux[] = $zone_geo; |
} |
if (!empty($obs['lieudit'])) { |
$lieux[] = $obs['lieudit']; |
} |
if (!empty($obs['station'])) { |
$lieux[] = $obs['station']; |
} |
return implode(" > ", $lieux); |
} |
|
protected function formaterCommentaires($liste_commentaires) { |
$liste_commentaires_formatee = array(); |
foreach ($liste_commentaires as $commentaire) { |
$id_obs = $commentaire['ce_observation']; |
if (isset($this->correspondance_id_obs_auteurs[$commentaire['ce_observation']])) { |
$auteur_obs = $this->correspondance_id_obs_auteurs[$commentaire['ce_observation']]; |
$commentaire['auteur'] = $this->formaterAuteur($commentaire); |
$this->observations_concernees[$auteur_obs][$id_obs]['commentaires'][] = $commentaire; |
} |
} |
} |
|
protected function parcourirListeCommentairesEtEnvoyerMessage($liste_obs_a_auteur) { |
foreach ($liste_obs_a_auteur as $auteur => $liste_obs) { |
$message = $this->formaterMessagePourAuteur($liste_obs,$auteur); |
$this->envoyerMessage($message, $auteur); |
} |
} |
|
private function formaterMessagePourAuteur($liste_obs, $auteur) { |
$donnees = array(); |
// copie de la première obs pour en obtenir le nom et prénom de l'auteur |
// (en deux fois pour éviter un warning en mode strict) |
$valeurs = array_values($liste_obs); |
$premiere_obs = array_shift($valeurs); |
$donnees['liste_observations'] = $liste_obs; |
$donnees['auteur'] = $auteur; |
$donnees['auteur_formate'] = ucfirst($premiere_obs['prenom_utilisateur']).' '.ucfirst($premiere_obs['nom_utilisateur']); |
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR; |
return $this->conteneur->traiterSquelettePhp($this->squelette_dossier.'commentaires.tpl.html', $donnees); |
} |
|
protected function formaterDateObs($date) { |
$time = strtotime($date); |
return date('d/m/Y', $time); |
} |
|
private function formaterAuteur($commentaire) { |
return $commentaire['utilisateur_prenom'].' '.$commentaire['utilisateur_nom']; |
} |
|
private function obtenirLienFicheObs($id_obs) { |
return $this->conteneur->formaterUrl(Config::get('url_fiche_observation'), array('id' => $id_obs)); |
} |
|
protected function envoyerMessage($message, $auteur) { |
$url_requete = $this->conteneur->formaterUrl(Config::get('url_service_messagerie'), array('id' => $auteur)); |
$post = array( |
'sujet' => Config::get('titre_message_recapitulatif'), |
'message' => $message, |
'utilisateur_courriel' => Config::get('adresse_expediteur_recapitulatif'), |
'format' => 'html' |
); |
|
$ch = curl_init(); |
$options = array( |
CURLOPT_URL => $url_requete, |
CURLOPT_HEADER => false, |
CURLOPT_POST => 1, |
CURLOPT_POSTFIELDS => $post, |
CURLOPT_RETURNTRANSFER => true |
); |
curl_setopt_array($ch, $options); |
$envoi = curl_exec($ch); |
curl_close($ch); |
} |
} |
?> |