vendor/uvdesk/core-framework/Workflow/Actions/Ticket/MailAgent.php line 121

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Workflow\Actions\Ticket;
  3. use Symfony\Component\DependencyInjection\ContainerInterface;
  4. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  5. use Webkul\UVDesk\AutomationBundle\Workflow\Event;
  6. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket;
  7. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Thread;
  8. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Attachment;
  9. use Webkul\UVDesk\CoreFrameworkBundle\Entity\EmailTemplates;
  10. use Webkul\UVDesk\AutomationBundle\Workflow\FunctionalGroup;
  11. use Webkul\UVDesk\AutomationBundle\Workflow\Events\TicketActivity;
  12. use Webkul\UVDesk\AutomationBundle\Workflow\Action as WorkflowAction;
  13. class MailAgent extends WorkflowAction
  14. {
  15.     public static function getId()
  16.     {
  17.         return 'uvdesk.ticket.mail_agent';
  18.     }
  19.     public static function getDescription()
  20.     {
  21.         return "Mail to agent";
  22.     }
  23.     public static function getFunctionalGroup()
  24.     {
  25.         return FunctionalGroup::TICKET;
  26.     }
  27.     public static function getOptions(ContainerInterface $container)
  28.     {
  29.         $entityManager $container->get('doctrine.orm.entity_manager');
  30.         $emailTemplateCollection array_map(function ($emailTemplate) {
  31.             return [
  32.                 'id'   => $emailTemplate->getId(),
  33.                 'name' => $emailTemplate->getName(),
  34.             ];
  35.         }, $entityManager->getRepository(EmailTemplates::class)->findAll());
  36.         $agentCollection array_map(function ($agent) {
  37.             return [
  38.                 'id'   => $agent['id'],
  39.                 'name' => $agent['name'],
  40.             ];
  41.         }, $container->get('user.service')->getAgentPartialDataCollection());
  42.         array_unshift($agentCollection, [
  43.             'id'   => 'responsePerforming',
  44.             'name' => 'Response Performing Agent',
  45.         ], [
  46.             'id'   => 'assignedAgent',
  47.             'name' => 'Assigned Agent',
  48.         ]);
  49.         return [
  50.             'partResults' => $agentCollection,
  51.             'templates' => $emailTemplateCollection,
  52.         ];
  53.     }
  54.     public static function applyAction(ContainerInterface $containerEvent $event$value null$thread null)
  55.     {
  56.         if (!$event instanceof TicketActivity) {
  57.             return;
  58.         } else {
  59.             $ticket $event->getTicket();
  60.             if (empty($ticket)) {
  61.                 return;
  62.             }
  63.         }
  64.         $entityManager $container->get('doctrine.orm.entity_manager');
  65.         $emailTemplate $entityManager->getRepository(EmailTemplates::class)->findOneById($value['value']);
  66.         $emails self::getAgentMails($value['for'], (($ticketAgent $ticket->getAgent()) ? $ticketAgent->getEmail() : ''), $container);
  67.         $ticketCollaborators = [];
  68.         if ($emails || $emailTemplate) {
  69.             $queryBuilder $entityManager->createQueryBuilder()
  70.                 ->select('th.messageId as messageId')
  71.                 ->from(Thread::class, 'th')
  72.                 ->where('th.createdBy = :userType')->setParameter('userType''agent')
  73.                 ->orderBy('th.id''DESC')
  74.                 ->setMaxResults(1);
  75.             $inReplyTo $queryBuilder->getQuery()->getOneOrNullResult();
  76.             if (!empty($inReplyTo)) {
  77.                 $emailHeaders['In-Reply-To'] = $inReplyTo;
  78.             }
  79.             if (!empty($ticket->getReferenceIds())) {
  80.                 $emailHeaders['References'] = $ticket->getReferenceIds();
  81.             }
  82.             if ($thread == null) {
  83.                 $ticketId $ticket->getId();
  84.                 $thread $container->get('ticket.service')->getInitialThread("$ticketId");
  85.             }
  86.             // Only process attachments if required in the message body
  87.             // @TODO: Revist -> Maybe we should always include attachments if they are provided??
  88.             $createdThread = isset($ticket->createdThread) && $ticket->createdThread->getThreadType() != "note" $ticket->createdThread : (isset($ticket->currentThread) ? $ticket->currentThread "");
  89.             $attachments = [];
  90.             if ((!empty($createdThread) || !empty($thread)) && (strpos($emailTemplate->getMessage(), '{%ticket.attachments%}') !== false || strpos($emailTemplate->getMessage(), '{% ticket.attachments %}') !== false)) {
  91.                 $createdThread = !empty($createdThread) ? $createdThread $thread;
  92.                 $attachments array_map(function ($attachment) use ($container) {
  93.                     return str_replace('//''/'$container->get('kernel')->getProjectDir() . "/public" $attachment->getPath());
  94.                 }, $entityManager->getRepository(Attachment::class)->findByThread($createdThread));
  95.             }
  96.             $placeHolderValues $container->get('email.service')->getTicketPlaceholderValues($ticket'agent');
  97.             $subject $container->get('email.service')->processEmailSubject($emailTemplate->getSubject(), $placeHolderValues);
  98.             $message $container->get('email.service')->processEmailContent($emailTemplate->getMessage(), $placeHolderValues);
  99.             $thread = ($thread != null) ? $thread $createdThread;
  100.             if ($thread != null && $thread->getThreadType() == "reply" && $thread->getCreatedBy() != "collaborator") {
  101.                 $ticketCollaborators = (($thread != null) && !empty($thread->getTicket()) && $thread != "") ? $thread->getTicket()->getCollaborators() : [];
  102.             }
  103.             if (!empty($emails) && $emails != null) {
  104.                 foreach ($emails as $email) {
  105.                     if (is_array($email)) {
  106.                         $email $email['email'];
  107.                     }
  108.                     $messageId $container->get('email.service')->sendMail($subject$message$email$emailHeadersnull$attachments ?? []);
  109.                     if (!empty($messageId)) {
  110.                         $updatedReferenceIds $ticket->getReferenceIds() . ' ' $messageId;
  111.                         $ticket->setReferenceIds($updatedReferenceIds);
  112.                         $entityManager->persist($ticket);
  113.                         $entityManager->flush();
  114.                     }
  115.                 }
  116.             }
  117.             if (!empty($thread) && ($thread->getCc() || $thread->getBcc()) || $ticketCollaborators != null && count($ticketCollaborators) > 0) {
  118.                 self::sendCcBccMail($container$ticket$thread$subject$attachments$ticketCollaborators$message);
  119.             }
  120.         }
  121.     }
  122.     public static function getAgentMails($for$currentEmails$container)
  123.     {
  124.         $agentMails = [];
  125.         $entityManager $container->get('doctrine.orm.entity_manager');
  126.         foreach ($for as $agent) {
  127.             if ($agent == 'assignedAgent') {
  128.                 if (is_array($currentEmails)) {
  129.                     $agentMails array_merge($agentMails$currentEmails);
  130.                 } else {
  131.                     $agentMails[] = $currentEmails;
  132.                 }
  133.             } else if ($agent == 'responsePerforming' && is_object($currentUser $container->get('security.token_storage')->getToken()->getUser())) {
  134.                 // Add current user email if any
  135.                 $agentMails[] = $currentUser->getEmail();
  136.             } else if ($agent == 'baseAgent') {
  137.                 // Add selected user email if any
  138.                 if (is_array($currentEmails)) {
  139.                     $agentMails array_merge($agentMails$currentEmails);
  140.                 } else {
  141.                     $agentMails[] = $currentEmails;
  142.                 }
  143.             } else if ((int)$agent) {
  144.                 $qb $entityManager->createQueryBuilder();
  145.                 $emails $qb->select('u.email')->from(User::class, 'u')
  146.                     ->andWhere("u.id = :userId")
  147.                     ->setParameter('userId'$agent)
  148.                     ->getQuery()->getResult();
  149.                 foreach ($emails as $email) {
  150.                     $agent $entityManager->getRepository(User::class)->findOneBy($email);
  151.                     if ($agent != null && $agent->getAgentInstance() != null) {
  152.                         $agentMails[] = $email;
  153.                     }
  154.                 }
  155.             }
  156.         }
  157.         return array_filter($agentMails);
  158.     }
  159.     public static function sendCcBccMail($container$ticket$thread$subject$attachments$ticketCollaborators$message null)
  160.     {
  161.         $entityManager $container->get('doctrine.orm.entity_manager');
  162.         $collabrator = array();
  163.         $cc = array();
  164.         if ($thread->getCc() != null) {
  165.             foreach ($thread->getCc() as $EmailCC) {
  166.                 if ($entityManager->getRepository(Ticket::class)->isTicketCollaborator($thread->getTicket(), $EmailCC) != false) {
  167.                     $collabrator[] = $EmailCC;
  168.                 } else {
  169.                     $cc[] = $EmailCC;
  170.                 }
  171.             }
  172.         }
  173.         $emailOfcollabrator = !empty($thread) && $thread->getCreatedBy() == "collaborator" $thread->getUser()->getEmail() : null;
  174.         if ($collabrator != null && !empty($collabrator) || $ticketCollaborators != null && !empty($ticketCollaborators)) {
  175.             if (count($collabrator) == && count($ticketCollaborators) > && !empty($ticketCollaborators) && empty($collabrator)) {
  176.                 foreach ($ticketCollaborators as $collaborator) {
  177.                     if (!empty($collaborator->getEmail()) && $collaborator->getEmail() != $emailOfcollabrator) {
  178.                         $collabrator[] = $collaborator->getEmail();
  179.                     }
  180.                 }
  181.             }
  182.             $messageId $container->get('email.service')->sendMail($subject$messagenull, [], $ticket->getMailboxEmail(), $attachments ?? [], $collabrator ?? [], []);
  183.             if (!empty($messageId)) {
  184.                 $updatedReferenceIds $ticket->getReferenceIds() . ' ' $messageId;
  185.                 $ticket->setReferenceIds($updatedReferenceIds);
  186.                 $entityManager->persist($ticket);
  187.                 $entityManager->flush();
  188.             }
  189.             if ($thread->getCc() != null && count($thread->getCc()) == count($collabrator) && $thread->getBcc() != null) {
  190.                 $message '<html><body style="background-image: none"><p>' html_entity_decode($thread->getMessage()) . '</p></body></html>';
  191.                 $messageId $container->get('email.service')->sendMail($subject$messagenull, [], $ticket->getMailboxEmail(), $attachments ?? [], [], $thread->getBcc() ?? []);
  192.             }
  193.         }
  194.         if ($cc != null && !empty($cc)) {
  195.             $message '<html><body style="background-image: none"><p>' html_entity_decode($thread->getMessage()) . '</p></body></html>';
  196.             $messageId $container->get('email.service')->sendMail($subject$messagenull, [], $ticket->getMailboxEmail(), $attachments ?? [], $cc ?? [], $thread->getBcc() ?? []);
  197.         }
  198.         if ($thread->getBcc() != null && $thread->getCc() == null) {
  199.             $message '<html><body style="background-image: none"><p>' html_entity_decode($thread->getMessage()) . '</p></body></html>';
  200.             $messageId $container->get('email.service')->sendMail($subject$messagenull, [], $ticket->getMailboxEmail(), $attachments ?? [], $thread->getCc() ?? [], $thread->getBcc() ?? []);
  201.         }
  202.     }
  203. }