Newsletter.php 6.14 KB
Newer Older
1 2 3 4
<?php

namespace PotageBundle\Services;

5
use PotageBundle\Entity\Groupe;
6
use PotageBundle\Entity\Lettre;
7 8
use PotageBundle\Entity\Offre;
use PotageBundle\Entity\User;
9 10
use Symfony\Component\DependencyInjection\ContainerInterface;

11 12
class Newsletter
{
Mat's avatar
Mat committed
13 14 15 16 17 18 19

    /**
     * Expéditeur, l'application elle-même
     * alternc sur grabuge: la mbox postmaster@potage.domainepublic.site est redirigée vers
     *  -> jaummathieu@collectifs.net
     */
    private $from = ['postmaster@potage.domainepublic.site' => 'Potage'];
20
    
21
    private $container;
22
    private $lettreToken;
Mat's avatar
Mat committed
23
    
24 25 26
    /**
     * Newsletter constructor.
     *
27
     * @param ContainerInterface $container
28
     * @param LettreToken $lettreToken
29
     */
30
    public function __construct(ContainerInterface $container, LettreToken $lettreToken)
31
    {
32
        $this->container = $container;
33
        $this->lettreToken = $lettreToken;
34 35
    }
    
36
    
37
    /**
38 39 40
     * Construit un email de la forme
     * Prenom Nom<mbox@domain.tld>
     *
41 42 43 44 45 46 47 48 49 50
     * @param array $email
     * @return string
     */
    private function parseMail(array $email)
    {
        return $email['fullName'] .'<'. $email['email'] .'>';
    }
    
    
    /**
51 52 53 54 55 56 57
     * Récupère le body de l'infolettre
     *
     * @param Lettre $lettre
     * @return array
     */
    private function getBody(Lettre $lettre)
    {
Mat's avatar
hop  
Mat committed
58
        
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
        $groupe = array(
            'nom' => $lettre->getGroupe()->getNom(),
            'slug' => $lettre->getGroupe()->getSlug(),
            'description' => $lettre->getGroupe()->getDescription(),
        );
        $depot = array(
            'localisation' => $lettre->getGroupe()->getDepot()->getLocalisation(),
            'responsable' => $lettre->getGroupe()->getDepot()->getResponsable(),
            'jour' => $lettre->getGroupe()->getDepot()->getJourPanier(),
            'heure' => $lettre->getGroupe()->getDepot()->getHeurePanier(),
        );
        $offre = array(
            'id' => $lettre->getOffre()->getId(),
            'reference' => $lettre->getOffre()->getReference(),
            'end' => $lettre->getOffre()->getEndedAt(),
            'status' => $lettre->getOffre()->getStatus(),
            'sorted' => $lettre->getOffre()->getSorted(),
        );
        $infos = $this->container->get('doctrine')
            ->getRepository('PotageBundle:Info')
            ->findAllForLettreReadInfosSorted(
                $lettre->getId(),
                $lettre->getSorted()
            );
        $legumes = $this->container->get('doctrine')
            ->getRepository('PotageBundle:OffreLegumes')
            ->findAllForSortedRead(
                $lettre->getOffre()->getId(),
                $lettre->getOffre()->getSorted()
            );
89 90
        $infolettre = array(
            'id' => $lettre->getId(),
91 92 93 94
            'reference' => $lettre->getReference(),
            'start' => $lettre->getStartedAt(),
            'end' => $lettre->getEndedAt(),
            'status' => $lettre->getStatus(),
95 96 97 98
            'sorted' => $lettre->getSorted(),
        );
        return array(
            'lettre' => $infolettre,
99 100 101 102 103 104 105 106 107 108 109 110
            'groupe' => $groupe,
            'depot' => $depot,
            'infos' => $infos,
            'offre' => $offre,
            'legumes' => $legumes
        );
    }
    
    
    /**
     * Potage (from) envoie un mail
     *
111
     * @param array $to
112
     * @param $subject
113
     * @param Lettre $lettre
114 115 116 117
     * @return int
     * @throws \Twig_Error_Loader
     * @throws \Twig_Error_Runtime
     * @throws \Twig_Error_Syntax
118
     */
119
    public function sendMail($to, $subject, Lettre $lettre)
120
    {
121 122
        $mailer = $this->container->get('mailer');
        $twig = $this->container->get('twig');
123 124 125
        
        $message = (new \Swift_Message())
            
Mat's avatar
Mat committed
126
            ->setFrom($this->from)
127
            ->setTo($to['email'], $to['fullName'])
128
            ->setSubject($subject)
129 130
            ->setBody(
                $twig->render('@Potage/Mail/bodyMail.html.twig', array(
131 132
                    'to' => $to,
                    'subject' => $subject,
133
                    'body' => $this->getBody($lettre),
134 135
                )),
                'text/html'
136 137 138 139
            );
        
        return $mailer->send($message);
    }
Mat's avatar
Mat committed
140
    
141 142
    
    /**
143 144 145
     * Envoie une infolettre
     * (à son groupe d'utilisateurs)
     *
146 147 148 149 150 151
     * @param Lettre $lettre
     * @return array
     * @throws \Twig_Error_Loader
     * @throws \Twig_Error_Runtime
     * @throws \Twig_Error_Syntax
     */
152
    public function sendLettreToGroup(Lettre $lettre)
153
    {
Mat's avatar
Mat committed
154
        $subject = $lettre->getSubject();
155 156 157 158 159 160 161
    
        /**
         * @var Offre $offre
         * @var Groupe $groupe
         */
        $offre = $lettre->getOffre();
        $groupe = $lettre->getGroupe();
Mat's avatar
Mat committed
162
        
Mat's avatar
Mat committed
163
        /**
164 165 166
         * Les destinataires du groupe de l'infolettre,
         * un tableau d'utilisteurs
         *
Mat's avatar
Mat committed
167 168
         * @var array $utilisateurs
         */
169 170
        $utilisateurs = $this->container->get('doctrine')
            ->getRepository('PotageBundle:Utilisateur')
171 172
            ->findAllByGroup($groupe->getId());
    
173
        
Mat's avatar
Mat committed
174 175 176 177
        /**
         * Boucle sur chaque utilisateur, envoie le mail,
         * récupère le code de retour dans un tableau
         */
178
        $retour = array();
179 180
        for ($i = 0; $i < count($utilisateurs); $i++)
        {
181 182 183 184 185 186 187 188 189 190 191 192
            /**
             * @var User $user
             */
            $user = $utilisateurs[$i]->getUser();

            $token = null;
            if ($user) {
                $token = $this->lettreToken->encodePotageUserToken($user, $offre);
            }

            // TODO quid des utilisateurs qui n'ont pas encore de compte user ?
            
193
            $to = array(
194 195 196 197 198 199 200
                'fullName' => $utilisateurs[$i]->getPrenom() .' '. $utilisateurs[$i]->getNom(),
                'email' => $utilisateurs[$i]->getEmail(),
                'token' => $token
            ); //dump($to);
            
            // envoi du mail
            $result = $this->sendMail($to, $subject, $lettre) === 1 ? 'Sent' : 'Error';
Mat's avatar
Mat committed
201
            
202 203 204 205
            $retour[$i] = array(
                'to' => $to,
                'tostring' => $this->parseMail($to),
                'result' => $result
206 207
            );
        }
208
        return $retour;
209 210 211
    }
    
}