src/Event/MailSubscriber.php line 186

Open in your IDE?
  1. <?php
  2. namespace App\Event;
  3. use App\Entity\Communication\Message;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\Routing\RouterInterface;
  8. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  9. use Symfony\Component\Templating\EngineInterface;
  10. class MailSubscriber implements EventSubscriberInterface
  11. {
  12.     private $em;
  13.     private $tokenStorage;
  14.     private $params;
  15.     private $templating;
  16.     private $mailer;
  17.     private $router;
  18.     public function __construct(EntityManagerInterface $entityManagerTokenStorageInterface $tokenStorageParameterBagInterface $paramsEngineInterface $templating, \Swift_Mailer $mailerRouterInterface $router)
  19.     {
  20.         $this->em $entityManager;
  21.         $this->tokenStorage $tokenStorage;
  22.         $this->params $params;
  23.         $this->templating $templating;
  24.         $this->mailer $mailer;
  25.         $this->router $router;
  26.     }
  27.     public static function getSubscribedEvents()
  28.     {
  29.         return [
  30.             ContractUpdatedEvent::NAME => ['onContractUpdated'10],
  31.             SendPurchaseLinkEvent::NAME => ['onSendPurchaseLink'10],
  32.             SendSubscriptionLinkEvent::NAME => ['onSendSubscriptionLink'10],
  33.             SendRenewalReminderEvent::NAME => ['onSendRenewalReminder'10],
  34.             SendInvoiceReminderEvent::NAME => ['onSendInvoiceReminder'10],
  35.         ];
  36.     }
  37.     public function onContractUpdated(ContractUpdatedEvent $event)
  38.     {
  39.         $contract $event->getContract();
  40.         $client $contract->getUser();
  41.         $user $this->tokenStorage->getToken()->getUser();
  42.         if ($client) {
  43.             try {
  44.                 $message = new Message();
  45.                 $message->setTitle('Contrato subido');
  46.                 $message->setMessage($contract->getSigned() ? 'El contrato firmado ha sido subido a tu sección de Mis Contratos' 'Un contrato ha sido subido a tu sección de Mis Contratos');
  47.                 $message->setRecipient($client);
  48.                 $message->setSender($user);
  49.                 $this->em->persist($message);
  50.                 $this->em->flush();
  51.                 $msgParams = [
  52.                     'user' => $user,
  53.                     'subject' => 'Nuevo mensaje recibido.',
  54.                     'recipient' => $user->getEmail(),
  55.                     'object' => $contract,
  56.                 ];
  57.                 $this->sendMessage($msgParams);
  58.             } catch (\Exception $e) {
  59.                 dump($e->getMessage());
  60.                 exit;
  61.             }
  62.         }
  63.     }
  64.     public function onSendSubscriptionLink(SendSubscriptionLinkEvent $event)
  65.     {
  66.         $subscription $event->getSubscription();
  67.         $client $subscription->getUser();
  68.         $user $this->tokenStorage->getToken()->getUser();
  69.         if ($client) {
  70.             try {
  71.                 $message = new Message();
  72.                 $message->setTitle('Suscripción personalizado');
  73.                 $url $this->router->generate('shop_cart_addSub', ['subscriptionId' => $subscription->getId()]);
  74.                 $message->setMessage('<p>Su servicio personalizado ya esta disponible para comprar.</p><p>Pinche <a href="'.$url.'" target="_blank">aquí</a> para efectuar la compra.</p>');
  75.                 $message->setRecipient($client);
  76.                 $message->setSender($user);
  77.                 $this->em->persist($message);
  78.                 $this->em->flush();
  79.                 $msgParams = [
  80.                     'user' => $user,
  81.                     'subject' => 'NOMASPAPEL.ES: Enlace de compra',
  82.                     'recipient' => $client->getEmail(),
  83.                     'object' => $subscription,
  84.                 ];
  85.                 $this->sendMessage($msgParams);
  86.             } catch (\Exception $e) {
  87.                 dump($e->getMessage());
  88.                 exit;
  89.             }
  90.         }
  91.     }
  92.     public function onSendPurchaseLink(SendPurchaseLinkEvent $event)
  93.     {
  94.         $purchase $event->getPurchase();
  95.         $client $purchase->getUser();
  96.         $user $this->tokenStorage->getToken()->getUser();
  97.         if ($client) {
  98.             try {
  99.                 $message = new Message();
  100.                 $message->setTitle('Compra personalizada');
  101.                 $url $this->router->generate('shop_cart_addPurchase', ['purchaseId' => $purchase->getId()]);
  102.                 $message->setMessage('<p>Su servicio personalizado ya esta disponible para comprar.</p><p>Pinche <a href="'.$url.'" target="_blank">aquí</a> para efectuar la compra.</p>');
  103.                 $message->setRecipient($client);
  104.                 $message->setSender($user);
  105.                 $purchase->setNotifiedOn(new \DateTime());
  106.                 $this->em->persist($purchase);
  107.                 $this->em->persist($message);
  108.                 $this->em->flush();
  109.                 $msgParams = [
  110.                     'user' => $user,
  111.                     'subject' => 'NOMASPAPEL.ES: Enlace de compra',
  112.                     'recipient' => $client->getEmail(),
  113.                     'object' => $purchase,
  114.                 ];
  115.                 $this->sendMessage($msgParams);
  116.             } catch (\Exception $e) {
  117.                 dump($e->getMessage());
  118.                 exit;
  119.             }
  120.         }
  121.     }
  122.     public function onSendRenewalReminder(SendRenewalReminderEvent $event)
  123.     {
  124.         $subscription $event->getSubscription();
  125.         $client $this->em->getRepository('App\Entity\Profile\User')->findOneBy(['id' => $subscription->getUserId()]);
  126.         $user $this->em->getRepository('App\Entity\Profile\User')->findOneBy(['id' => 1]);
  127.         $templates = ['html' => 'email/renewalReminder.html.twig''text' => 'email/renewalReminder.txt.twig'];
  128.         if ($client) {
  129.             try {
  130.                 $msgParams = [
  131.                     'client' => $client,
  132.                     'subject' => 'NOMASPAPEL.ES: Suscripción trimestral a punto de caducar',
  133.                     'recipient' => $client->getEmail(),
  134.                     'object' => $subscription,
  135.                     'templates' => $templates,
  136.                 ];
  137.                 $message = new Message();
  138.                 $message->setTitle('Suscripción trimestral a punto de caducar');
  139.                 $messageBody $this->templating->render(
  140.                     $templates['html'],
  141.                     ['client' => $client'data' => $msgParams]
  142.                 );
  143.                 $message->setMessage($messageBody);
  144.                 $message->setRecipient($client);
  145.                 $message->setSender($user);
  146.                 $this->em->persist($message);
  147.                 $this->em->flush();
  148.                 $this->sendReminderMessage($msgParams);
  149.             } catch (\Exception $e) {
  150.                 dump($e->getMessage());
  151.                 exit;
  152.             }
  153.         }
  154.     }
  155.     public function onSendInvoiceReminder(SendInvoiceReminderEvent $event)
  156.     {
  157.         $subscription $event->getSubscription();
  158.         $client $this->em->getRepository('App\Entity\Profile\User')->findOneBy(['id' => $subscription->getUserId()]);
  159.         $user $this->em->getRepository('App\Entity\Profile\User')->findOneBy(['id' => 2]);
  160.         $template $this->getTemplateForDate(date('d-m'));
  161.         if (false !== $template) {
  162.             $templates = ['html' => $template'text' => str_replace('.html.''.txt.'$template)];
  163.             if ($client) {
  164.                 try {
  165.                     $msgParams = [
  166.                         'client' => $client,
  167.                         'subject' => 'NOMASPAPEL.ES: Recordatorio de envio de facturas',
  168.                         'recipient' => $client->getEmail(),
  169.                         'object' => $subscription,
  170.                         'templates' => $templates,
  171.                     ];
  172.                     $message = new Message();
  173.                     $message->setTitle('Recordatorio de envio de facturas');
  174.                     $messageBody $this->templating->render(
  175.                         $templates['html'],
  176.                         ['client' => $client'data' => $msgParams]
  177.                     );
  178.                     $message->setMessage($messageBody);
  179.                     $message->setRecipient($client);
  180.                     $message->setSender($user);
  181.                     $this->em->persist($message);
  182.                     $this->em->flush();
  183.                     $this->sendReminderMessage($msgParams);
  184.                 } catch (\Exception $e) {
  185.                     dump($e->getMessage());
  186.                     exit;
  187.                 }
  188.             }
  189.         } else {
  190.             return false;
  191.         }
  192.     }
  193.     /**
  194.      * Send email to user.
  195.      *
  196.      * @param [type] $data
  197.      */
  198.     public function sendMessage($data)
  199.     {
  200.         $em $this->em;
  201.         $entityName $em->getMetadataFactory()->getMetadataFor(get_class($data['object']))->getName();
  202.         switch ($entityName) {
  203.             case 'App\Entity\Accounting\Certificate':
  204.                 $data['section'] = 'Certificados';
  205.                 $templates = ['html' => 'email/uploadNotification.html.twig''text' => 'email/uploadNotification.txt.twig'];
  206.             break;
  207.             case 'App\Entity\Accounting\Document':
  208.                 switch ($data['object']->getDocumentType()) {
  209.                     default:
  210.                     case '':
  211.                     case 'document':
  212.                         $data['section'] = 'Documentos';
  213.                     break;
  214.                     case 'model':
  215.                         $data['section'] = 'Modelos';
  216.                     break;
  217.                 }
  218.                 $templates = ['html' => 'email/uploadNotification.html.twig''text' => 'email/uploadNotification.txt.twig'];
  219.             break;
  220.             case 'App\Entity\Accounting\Invoice':
  221.                 $data['section'] = 'Facturas';
  222.                 $templates = ['html' => 'email/uploadNotification.html.twig''text' => 'email/uploadNotification.txt.twig'];
  223.             break;
  224.             case 'App\Entity\Accounting\Salary':
  225.                 $data['section'] = 'Nóminas';
  226.                 $templates = ['html' => 'email/uploadNotification.html.twig''text' => 'email/uploadNotification.txt.twig'];
  227.             break;
  228.             case 'App\Entity\Profile\Contract':
  229.                 $data['section'] = 'Contratos';
  230.                 $templates = ['html' => 'email/uploadNotification.html.twig''text' => 'email/uploadNotification.txt.twig'];
  231.             break;
  232.             case 'App\Entity\Accounting\TaxReturn':
  233.                 $data['section'] = 'IRPF';
  234.                 $templates = ['html' => 'email/uploadNotification.html.twig''text' => 'email/uploadNotification.txt.twig'];
  235.             break;
  236.             case 'App\Entity\Product\SinglePurchase':
  237.             case 'App\Entity\Product\Subscription':
  238.                 $data['class'] = $entityName;
  239.                 $templates = ['html' => 'email/sendLink.html.twig''text' => 'email/sendLink.txt.twig'];
  240.             break;
  241.             case '':
  242.             default:
  243.                 $templates = ['html' => 'email/notification.html.twig''text' => 'email/notification.txt.twig'];
  244.             break;
  245.         }
  246.         $recipient $this->params->get('admin_email');
  247.         $msg = (new \Swift_Message())
  248.             ->setSubject('' != $data['subject'] ? $data['subject'] : 'Sin asunto.')
  249.             ->setFrom($this->params->get('from_email'))
  250.             ->setTo('' != $data['recipient'] ? $data['recipient'] : $recipient)
  251.             ->setBody(
  252.                 $this->templating->render(
  253.                     $templates['html'],
  254.                     ['user' => $data['user'], 'data' => $data]
  255.                 ),
  256.                 'text/html'
  257.             )
  258.             ->addPart(
  259.                 $this->templating->render(
  260.                     $templates['text'],
  261.                     ['user' => $data['user'], 'data' => $data]
  262.                 ),
  263.                 'text/plain'
  264.             )
  265.         ;
  266.         if (isset($data['attachment'])) {
  267.             $attachment = new \Swift_Attachment(file_get_contents($data['attachment']), $data['attachment_filename'], 'application/pdf');
  268.             $msg->attach($attachment);
  269.         }
  270.         return $this->mailer->send($msg);
  271.     }
  272.     public function sendReminderMessage($data)
  273.     {
  274.         $recipient $this->params->get('admin_email');
  275.         $templates $data['templates'];
  276.         $msg = (new \Swift_Message())
  277.             ->setSubject('' != $data['subject'] ? $data['subject'] : 'Sin asunto.')
  278.             ->setFrom($this->params->get('from_email'))
  279.             ->setTo('' != $data['recipient'] ? $data['recipient'] : $recipient)
  280.             ->setBody(
  281.                 $this->templating->render(
  282.                     $templates['html'],
  283.                     ['user' => $data['client'], 'data' => $data]
  284.                 ),
  285.                 'text/html'
  286.             )
  287.             ->addPart(
  288.                 $this->templating->render(
  289.                     $templates['text'],
  290.                     ['user' => $data['client'], 'data' => $data]
  291.                 ),
  292.                 'text/plain'
  293.             )
  294.         ;
  295.         if (isset($data['attachment'])) {
  296.             $attachment = new \Swift_Attachment(file_get_contents($data['attachment']), $data['attachment_filename'], 'application/pdf');
  297.             $msg->attach($attachment);
  298.         }
  299.         return $this->mailer->send($msg);
  300.     }
  301.     public function getTemplateForDate($date)
  302.     {
  303.         $folder 'email/reminders/';
  304.         $schedule = [
  305.             '01-01' => ['template' => 'jan-01.html.twig'],
  306.             '04-01' => ['template' => 'jan-04.html.twig'],
  307.             '28-01' => ['template' => 'jan-28.html.twig'],
  308.             '04-02' => ['template' => 'feb-04.html.twig'],
  309.             '23-02' => ['template' => 'feb-23.html.twig'],
  310.             '04-03' => ['template' => 'mar-04.html.twig'],
  311.             '28-03' => ['template' => 'mar-28.html.twig'],
  312.             '01-04' => ['template' => 'apr-01.html.twig'],
  313.             '04-04' => ['template' => 'apr-04.html.twig'],
  314.             '27-04' => ['template' => 'apr-27.html.twig'],
  315.             '04-05' => ['template' => 'may-04.html.twig'],
  316.             '28-05' => ['template' => 'may-28.html.twig'],
  317.             '04-06' => ['template' => 'jun-04.html.twig'],
  318.             '27-06' => ['template' => 'jun-27.html.twig'],
  319.             '01-07' => ['template' => 'jul-01.html.twig'],
  320.             '04-07' => ['template' => 'jul-04.html.twig'],
  321.             '28-07' => ['template' => 'jul-28.html.twig'],
  322.             '04-08' => ['template' => 'aug-04.html.twig'],
  323.             '28-08' => ['template' => 'aug-28.html.twig'],
  324.             '04-09' => ['template' => 'sep-04.html.twig'],
  325.             '27-09' => ['template' => 'sep-27.html.twig'],
  326.             '01-10' => ['template' => 'oct-01.html.twig'],
  327.             '04-10' => ['template' => 'oct-04.html.twig'],
  328.             '28-10' => ['template' => 'oct-28.html.twig'],
  329.             '04-11' => ['template' => 'nov-04.html.twig'],
  330.             '27-11' => ['template' => 'nov-27.html.twig'],
  331.             '04-12' => ['template' => 'dec-04.html.twig'],
  332.             '28-12' => ['template' => 'dec-28.html.twig'],
  333.         ];
  334.         return array_key_exists($date$schedule) ? $folder.$schedule[$date]['template'] : false;
  335.     }
  336. }