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

namespace PotageBundle\Services;

5
use PotageBundle\Entity\Depot;
6
use PotageBundle\Entity\Groupe;
7
use PotageBundle\Entity\Info;
8
use PotageBundle\Entity\Lettre;
9
use PotageBundle\Entity\Offre;
10
use PotageBundle\Entity\OffreLegumes;
11
use PotageBundle\Entity\User;
12 13
use Symfony\Component\DependencyInjection\ContainerInterface;

14 15
class Newsletter
{
Mat's avatar
Mat committed
16 17 18 19 20 21 22

    /**
     * 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'];
23
    
24
    private $container;
25
    private $lettreToken;
Mat's avatar
Mat committed
26
    
27 28 29
    /**
     * Newsletter constructor.
     *
30
     * @param ContainerInterface $container
31
     * @param LettreToken $lettreToken
32
     */
33
    public function __construct(ContainerInterface $container, LettreToken $lettreToken)
34
    {
35
        $this->container = $container;
36
        $this->lettreToken = $lettreToken;
37 38
    }
    
39
    
40
    /**
41 42 43
     * Construit un email de la forme
     * Prenom Nom<mbox@domain.tld>
     *
44 45 46 47 48 49 50 51 52 53
     * @param array $email
     * @return string
     */
    private function parseMail(array $email)
    {
        return $email['fullName'] .'<'. $email['email'] .'>';
    }
    
    
    /**
54 55 56
     * Récupère le body de l'infolettre
     *
     * @param Lettre $lettre
57
     * @return Lettre
58 59 60
     */
    private function getBody(Lettre $lettre)
    {
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
        /**
         * @var Offre $offre
         * @var OffreLegumes $legume
         */
        $offre = $lettre->getOffre();
        $legumes = $offre->getOffreLegumes();
        foreach ($legumes as $legume) {
        }
    
        /**
         * @var Groupe $groupe
         * @var Depot $depot
         * @var Info $info
         */
        $groupe = $lettre->getGroupe();
        $depot = $groupe->getDepot();
        $infos = $lettre->getInfos();
        foreach ($infos as $info) {
        }
Mat's avatar
hop  
Mat committed
80
        
81
        return $lettre;
82 83 84
    }
    
    
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
    /**
     * Retourne un tableau d'objets Infos triés,
     * contenant un tableau d'objets OffreLegumes triés
     *
     * @param Lettre $lettre
     * @return array
     */
    private function getInfosSorted(Lettre $lettre)
    {
        $sortLettre = explode(",", $lettre->getSorted());
        foreach ($sortLettre as $k => $v)
        {
            if ($v !== "-1")
            {
                foreach ($lettre->getInfos() as $info)
                {
                    if ($info->getId() === intval($v))
                    {
                        $infosSorted[$k] = $info;
                    }
                }
            }
            else {
                $infosSorted[$k] = $this->getOffreLegumesSorted($lettre);
            }
        }
        return $infosSorted;
    }
    
    
    /**
     * Retourne un tableau d'objets OffreLegumes triés
     *
     * @param Lettre $lettre
     * @return mixed
     */
    private function getOffreLegumesSorted(Lettre $lettre)
    {
        /**
         * @val Offre $offre
         */
        $offre = $lettre->getOffre();
        $sortLegumes = explode(",", $offre->getSorted());
        
        foreach($sortLegumes as $k => $v)
        {
            /**
             * @val OffreLegumes $legume
             */
            foreach ($offre->getOffreLegumes() as $legume)
            {
                if ($legume->getId() === intval($v))
                {
                    $legumesSorted[$k] = $legume;
                }
            }
        }
        return $legumesSorted;
    }
    
    
146
    /**
147
     * Envoie une infolettre à un destinataire
148
     *
149
     * @param array $to
150
     * @param $subject
151
     * @param Lettre $lettre
152 153 154 155
     * @return int
     * @throws \Twig_Error_Loader
     * @throws \Twig_Error_Runtime
     * @throws \Twig_Error_Syntax
156
     */
157
    public function sendLettre($to, $subject, Lettre $lettre)
158
    {
159 160
        $mailer = $this->container->get('mailer');
        $twig = $this->container->get('twig');
161 162
    
        $itemsSorted = $this->getInfosSorted($this->getBody($lettre));
163 164 165
        
        $message = (new \Swift_Message())
            
Mat's avatar
Mat committed
166
            ->setFrom($this->from)
167
            ->setTo($to['email'], $to['fullName'])
168
            ->setSubject($subject)
169 170
            ->setBody(
                $twig->render('@Potage/Mail/bodyMail.html.twig', array(
171 172
                    'to' => $to,
                    'subject' => $subject,
173
                    'lettre' => $this->getBody($lettre),
174
                    'itemsSorted' => $itemsSorted,
175 176
                )),
                'text/html'
177 178 179 180
            );
        
        return $mailer->send($message);
    }
Mat's avatar
Mat committed
181
    
182 183
    
    /**
184
     * Envoie une infolettre à son groupe d'utilisateurs
185
     *
186 187 188 189 190 191
     * @param Lettre $lettre
     * @return array
     * @throws \Twig_Error_Loader
     * @throws \Twig_Error_Runtime
     * @throws \Twig_Error_Syntax
     */
192
    public function sendLettreToGroup(Lettre $lettre)
193
    {
Mat's avatar
Mat committed
194
        $subject = $lettre->getSubject();
195 196 197 198 199 200 201
    
        /**
         * @var Offre $offre
         * @var Groupe $groupe
         */
        $offre = $lettre->getOffre();
        $groupe = $lettre->getGroupe();
Mat's avatar
Mat committed
202
        
Mat's avatar
Mat committed
203
        /**
204 205 206
         * Les destinataires du groupe de l'infolettre,
         * un tableau d'utilisteurs
         *
Mat's avatar
Mat committed
207 208
         * @var array $utilisateurs
         */
209 210
        $utilisateurs = $this->container->get('doctrine')
            ->getRepository('PotageBundle:Utilisateur')
211 212
            ->findAllByGroup($groupe->getId());
    
213
        
Mat's avatar
Mat committed
214 215 216 217
        /**
         * Boucle sur chaque utilisateur, envoie le mail,
         * récupère le code de retour dans un tableau
         */
218
        $retour = array();
219 220
        for ($i = 0; $i < count($utilisateurs); $i++)
        {
221 222 223 224 225 226 227 228 229 230 231 232
            /**
             * @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 ?
            
233
            $to = array(
234 235 236 237 238 239
                'fullName' => $utilisateurs[$i]->getPrenom() .' '. $utilisateurs[$i]->getNom(),
                'email' => $utilisateurs[$i]->getEmail(),
                'token' => $token
            ); //dump($to);
            
            // envoi du mail
240
            $result = $this->sendLettre($to, $subject, $lettre) === 1 ? 'Sent' : 'Error';
Mat's avatar
Mat committed
241
            
242 243 244 245
            $retour[$i] = array(
                'to' => $to,
                'tostring' => $this->parseMail($to),
                'result' => $result
246 247
            );
        }
248
        return $retour;
249 250 251
    }
    
}