Your IP : 216.73.217.79


Current Path : /var/www/v3.cesa.co.za/src/ContactBundle/Controller/
Upload File :
Current File : /var/www/v3.cesa.co.za/src/ContactBundle/Controller/MessageController.php

<?php

namespace App\ContactBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\ContactBundle\Form\Type\MessageEMailType;
use App\ContactBundle\Form\Type\MessageSmsType;
use App\CoreBundle\Services\ServiceGetterManager;

class MessageController extends AbstractController {

    /**
     * @IsGranted({"ROLE_USER"})
     */
    public function indexAction(Request $request, ServiceGetterManager $sg) {

        try {

            $companyManager = $sg->get('companies.manager');
            $messageManager = $sg->get('contact_message.manager');
            $settingManager = $sg->get('system_setting.manager');
            $tempValueManager = $sg->get('temp_value.manager');

            $companyId = $request->get('companyId');
            $removeFileId = $request->get('removeFileId');
            $sendAgainMessageId = $request->get('sendAgainMessageId');

            $userList = $this->getUser();

            if (strlen($companyId) <= 0 || $companyId == '0') {
                $companyId = $userList->getCompanyId();
            }

            $company = $companyManager->find($companyId);
            $companyName = '';

            if ((!is_object($company) || !$company->hasAgent($userList) || !$userList->getGranted('ROLE_COMPANY_ADMINISTRATOR')) &&
                    !$userList->getGranted('ROLE_SUPER_ADMINISTRATOR')) {
                throw new \Exception('You do not have access to this company', '4003');
            }

            $protocol = 'http:';

            if (is_object($company)) {
                $companyName = $company->getName();
            }

            if ($request->isSecure()) {
                $protocol = 'https:';
            }

            $sendEMailData = $request->get('message_e_mail', json_decode($sg->get('session_values.manager')->getValue(array('value_name' => 'messageDraft')), true));

            if (!isset($sendEMailData['text'])) {
                $sendEMailData['text'] = '';
            }

            if (!isset($sendEMailData['message_id'])) {
                $sendEMailData['message_id'] = '';
            }

            $messageId = $request->get('messageId', $sendEMailData['message_id']);
            $message = $messageManager->find($messageId);

            if (strlen($removeFileId) > 0 && is_object($message)) {
                $sg->get('contact_message_attachment.manager')->removeByFileId($message, $removeFileId);
                $sg->get('contact_message_embedded_image.manager')->removeByFileId($message, $removeFileId);
                $messageManager->getEm()->refresh($message);
            }

            if (strlen($sendAgainMessageId) > 0 && is_object($messageManager->find($sendAgainMessageId))) {
                $messageManager->populateSendAgainMessage($messageManager->find($sendAgainMessageId), $message);
            }

            $sendEMailData['site_path'] = str_replace('/app_dev.php', '', $protocol . $this->generateUrl('iga_core_home', array(), UrlGeneratorInterface::NETWORK_PATH));
            $sendEMailData['company_id'] = $companyId;
            $sendEMailData['company_name'] = $companyName;
            $sendEMailData['unsub_link'] = str_replace(
                    '/app_dev.php', '', $protocol . $this->generateUrl('iga_contact_message_unsubscribe', array('cultureString' => $cultureString), UrlGeneratorInterface::NETWORK_PATH)
            );
            $sendEMailData['stats_link'] = str_replace(
                    '/app_dev.php', '', $protocol . $this->generateUrl('iga_contact_message_stats', array(), UrlGeneratorInterface::NETWORK_PATH)
            );
            $sendEMailData['system_name'] = $sg->get('sites.manager')->getSiteName($companyName);
            $sendEMailData['text'] = str_replace("'", "``", $sendEMailData['text']);
            $sendEMailData['owner_id'] = $userList->getId();
            $sendEMailData['sender'] = $userList;

            $form = $this->createForm(MessageEMailType::class, $message, $sendEMailData);

            if ($form->isSubmitted() && $form->isValid()) {

                $form->handleRequest($request);

                if ($request->get('submitBtn') == 'save') {

                    $sendEMailData['draft'] = true;
                    $sendEMailData['contactMethod'] = $sg->get('contact_method.manager')->find($settingManager->getSetting('contact_method_e_mail'));
                    $sendEMailData['contactReason'] = $sg->get('contact_reason.manager')->find($settingManager->getSetting('contact_reason_mass_comms'));
                    $sendEMailData['messageType'] = $sg->get('contact_message_type.manager')->find($settingManager->getSetting('contact_reason_mass_comms'));

                    $sendEMailData['uploadedFiles'] = json_decode($tempValueManager->getTempValue('uploaded_files_' . $this->getUser()->getId()), true);
                    $sendEMailData['uploadedImages'] = json_decode($tempValueManager->getTempValue('embedded_files_' . $this->getUser()->getId()), true);

                    $saveMessageError = $messageManager->saveMessage($userList, array(), $sendEMailData, $message);

                    if (strlen($saveMessageError) <= 0) {
                        $sendEMailData['message_id'] = $message->getId();
                        unset($sendEMailData['contactMethod']);
                        unset($sendEMailData['contactReason']);
                        unset($sendEMailData['messageType']);
                        unset($sendEMailData['draft']);

                        $sg->get('session_values.manager')->setValue(array('value_name' => 'messageDraft', 'value' => json_encode($sendEMailData)));

                        $tempValue = $tempValueManager->findOneBy(array('temp_value_name' => 'uploaded_files_' . $this->getUser()->getId()));
                        if (is_object($tempValue)) {
                            $tempValueManager->remove($tempValue);
                        }
                        $tempValue = $tempValueManager->findOneBy(array('temp_value_name' => 'embedded_files_' . $this->getUser()->getId()));
                        if (is_object($tempValue)) {
                            $tempValueManager->remove($tempValue);
                        }

                        $this->get('session')->getFlashBag()->add('success', 'Message saved as draft');

                        return $this->redirect($this->generateUrl('iga_contact_message', array('messageId' => $message->getId())));
                    } else {
                        $form->get('subject')->addError(new FormError($saveMessageError));
                    }
                } else {

                    $sendEMailData['message_id'] = $message->getId();
                    $sendEMailData['draft'] = false;
                    $sendEMailData['uploadedFiles'] = json_decode($tempValueManager->getTempValue('uploaded_files_' . $this->getUser()->getId()), true);

                    $command = "\$userList = \$sg->get('user_list.manager')->find('" . $userList->getId() . "'); "
                            . "\$sendEMailData = json_decode('" . json_encode($sendEMailData) . "', true); "
                            . "\$sg->get('contact_message.manager')->sendBulkMails(\$userList, \$sendEMailData);";

                    $sg->get('batch_job.manager')->save($command, true, true, 50);

                    $tempValue = $tempValueManager->findOneBy(array('temp_value_name' => 'uploaded_files_' . $this->getUser()->getId()));
                    if (is_object($tempValue)) {
                        $tempValueManager->remove($tempValue);
                    }

                    $this->get('session')->getFlashBag()->add('success', 'Message scheduled to be sent');

                    return $this->redirect($this->generateUrl('iga_user_list', array('userTypeId' => $settingManager->getSetting('crm_user_type'))));
                }
            }

            $uploadedFiles = json_decode($tempValueManager->getTempValue('uploaded_files_' . $this->getUser()->getId()), true);
            $uploadedImgs = json_decode($tempValueManager->getTempValue('embedded_files_' . $this->getUser()->getId()), true);
            $fileManager = $sg->get('files.manager');
            $attachments = array();
            $uploaded = array();
            $uploadedImg = array();
            $images = array();

            if (is_array($uploadedFiles)) {
                foreach ($uploadedFiles as $name => $id) {
                    $oneFile = $fileManager->find($id);
                    if (is_object($oneFile)) {
                        $uploaded[] = $oneFile;
                    }
                }
            }

            if (is_array($uploadedImgs)) {
                foreach ($uploadedImgs as $name => $id) {
                    $uploadedImg[] = $fileManager->find($id);
                }
            }

            if (is_object($message)) {

                if (is_countable($message->getMessageAttachment())) {
                    foreach ($message->getMessageAttachment() as $attachment) {
                        $attachments[] = $attachment->getFiles();
                    }
                }

                if (is_countable($message->getMessageEmbeddedImage())) {
                    foreach ($message->getMessageEmbeddedImage() as $img) {
                        $images[] = $img->getFiles();
                    }
                }
            }
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error on message send: ' . $ex->getMessage());
            return $this->redirect($this->generateUrl('iga_core_500', array('message' => $ex->getMessage() . ' - ' . $ex->getTraceAsString())));
        }

        return $this->render(
                        '@ContactBundle/Message/index.html.twig', array(
                    'form' => $form->createView(),
                    'companyId' => $companyId,
                    'messageId' => $messageId,
                    'attachments' => $attachments,
                    'images' => $images,
                    'uploaded' => $uploaded,
                    'uploadedImg' => $uploadedImg,
                    'fields' => $sg->get('user_field.manager')->getSiteListQuery(array('user_list' => $userList))->execute(),
                        )
        );
    }

    /**
     * @IsGranted({"ROLE_USER"})
     */
    public function indexSmsAction(Request $request, ServiceGetterManager $sg) {

        try {

            $companyManager = $sg->get('companies.manager');

            $companyId = $request->get('companyId');

            $userList = $this->getUser();

            if (strlen($companyId) <= 0 || $companyId == '0') {
                $companyId = $userList->getCompanyId();
            }

            $company = $companyManager->find($companyId);

            if ((!is_object($company) || !$company->hasAgent($userList) || !$userList->getGranted('ROLE_COMPANY_ADMINISTRATOR')) &&
                    !$userList->getGranted('ROLE_SUPER_ADMINISTRATOR')) {
                throw new \Exception('You do not have access to this company', '4003');
            }

            $form = $this->createForm(MessageSmsType::class, null, array('company_id' => $companyId));
//            $form = $this->createForm(MessageSmsType::class);

            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {

                $sendEMailData = $request->get('message_sms');
                $sendEMailData['company_id'] = $companyId;
                $sendEMailData['company_name'] = '';

                if (is_object($company)) {
                    $sendEMailData['company_name'] = $company->getName();
                }

                $sendEMailData['text'] = str_replace("'", "``", $sendEMailData['text']);
                $sendEMailData['owner_id'] = $userList->getId();

                $command = "\$userList = \$sg->get('user_list.manager')->find('" . $userList->getId() . "'); "
                        . "\$sendEMailData = json_decode('" . json_encode($sendEMailData) . "', true); "
                        . "\$sg->get('contact_message.manager')->sendBulkSMSs(\$userList, \$sendEMailData);";

                $sg->get('batch_job.manager')->save($command, true, true, 50);

                $this->get('session')->getFlashBag()->add('success', 'Message scheduled to be sent');
            }
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error on message send: ' . $ex->getMessage());
            return $this->redirect($this->generateUrl('iga_core_500', array('message' => $ex->getMessage() . ' - ' . $ex->getTraceAsString())));
        }

        return $this->render(
                        '@ContactBundle/Message/sms.html.twig', array(
                    'form' => $form->createView(),
                    'companyId' => $companyId,
                    'fields' => $sg->get('user_field.manager')->getSiteListQuery(array('user_list' => $userList))->execute(),
                        )
        );
    }

    /**
     * @IsGranted({"ROLE_USER"})
     */
    public function draftsAction(Request $request, ServiceGetterManager $sg) {
//        try {

        $companyManager = $sg->get('companies.manager');
        $messageManager = $sg->get('contact_message.manager');

        $companyId = $request->get('companyId');

        $userList = $this->getUser();

        if (strlen($companyId) <= 0 || $companyId == '0') {
            $companyId = $userList->getCompanyId();
        }

        $company = $companyManager->find($companyId);
        if ((!is_object($company) || !$userList->hasCompany($company) || !$userList->getGranted('ROLE_COMPANY_ADMINISTRATOR')) &&
                !$userList->getGranted('ROLE_SUPER_ADMINISTRATOR')) {
            throw new \Exception('You do not have access to this company', '4003');
        }

        $messagesQuery = $messageManager->getSiteListQuery(array('user_list' => $userList, 'drafts' => true));

        $paginator = $sg->get('knp_paginator');
        $pagination = $paginator->paginate($messagesQuery, $request->get('page', 1), 10, array('distinct' => false));

//        } catch (\Exception $ex) {
//            $logger = $this->get('error_log.manager');
//            $logger->error('Error on message send: ' . $ex->getMessage());
//            return $this->redirect($this->generateUrl('iga_core_500', array('message' => $ex->getMessage() . ' - ' . $ex->getTraceAsString())));
//        }

        return $this->render(
                        '@ContactBundle/Message/drafts.html.twig', array(
                    'pagination' => $pagination,
                    'companyId' => $companyId,
                        )
        );
    }

    public function unsubscribeAction(Request $request, ServiceGetterManager $sg) {
        try {

            $messageRecipientManager = $sg->get('contact_message_recipient.manager');
            $messageStatManager = $sg->get('contact_message_stat.manager');
            $languagePhrasesManager = $sg->get('language_phrases.manager');

            $messageRecipientId = $request->get('messageRecipientId');

            $messageRecipient = $messageRecipientManager->find($messageRecipientId);

            if (!is_object($messageRecipient)) {
                throw new \Exception('Invalid unsubscribe link: ' . $messageRecipientId);
            }

            $messageStatManager->updateMessageRecipientUnsubscribe($messageRecipientId);
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error on unsubscribe: ' . $ex->getMessage());
            return $this->redirect($this->generateUrl('iga_core_500', array('message' => $ex->getMessage() . ' - ' . $ex->getTraceAsString())));
        }

        return $this->render(
                        '@ContactBundle/Message/unsubscribe.html.twig', array(
                    'messageRecipient' => $messageRecipient,
                        )
        );
    }

    public function recipientStatsAction(Request $request, ServiceGetterManager $sg) {

        try {

            $messageStatManager = $sg->get('contact_message_stat.manager');
            $statsFileManager = $sg->get('stats_file.manager');

            $messageRecipientId = $request->get('messageRecipientId');

            $messageStatManager->updateMessageRecipientRead($messageRecipientId);

            $response = new Response($statsFileManager->getStatsImage());
            $response->headers->set('Content-Type', 'image/png');
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error logging message stats: ' . $ex->getMessage());
            $response = new Response('');
        }

        $response->headers->set('X-robots-tag', 'noindex');
        $response->headers->set('Content-Type', 'image/png');
        return $response;
    }

    public function statsUpdateAction(Request $request, ServiceGetterManager $sg) {

        $messageStatManager = $sg->get('contact_message_stat.manager');

        $trackData = $request->get('sMessageId');
        $status = $request->get('sStatus');

        $messageStat = $messageStatManager->findOneBy(array('track_data' => $trackData));

        if (is_object($messageStat)) {

            $messageRecipientId = $messageStat->getMessageRecipient()->getId();

            if (in_array($status, array('DELIVRD', 'ACCEPTED'))) {
                $messageStatManager->updateMessageRecipientDelivered($messageRecipientId);
            } else {

                $messageErrorManager = $sg->get('contact_message_error.manager');

                $messageErrorManager->logError($messageStat->getMessageRecipient(), 'Error delivering SMS: ' . $request->getRequestUri());
            }
        }

        return $this->render('@ContactBundle/Message/stats_update.html.twig');
    }

    /**
     * @IsGranted({"ROLE_USER"})
     */
    public function emailStatAction(Request $request, ServiceGetterManager $sg) {

        $pagination = array();

        try {

            $userList = $this->getUser();

            $settingManager = $sg->get('system_setting.manager');
            $messageType = $sg->get('contact_message_type.manager')->find($settingManager->getSetting('contact_message_type_mass_e_mail'));

            $paginationQuery = $sg->get('contact_message.manager')->getSiteListQuery(array(
                'user_list' => $userList, 'message_type' => $messageType,
                    )
            );

            $paginator = $sg->get('knp_paginator');
            $pagination = $paginator->paginate($paginationQuery, $request->get('page', 1), 10, array('distinct' => false));
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error viewing e-mail stats: ' . $ex->getMessage());
        }

        return $this->render('@ContactBundle/Message/e-mail.stats.html.twig', array('pagination' => $pagination));
    }

    /**
     * @IsGranted({"ROLE_USER"})
     */
    public function smsStatAction(Request $request, ServiceGetterManager $sg) {

        $pagination = array();

        try {

            $userList = $this->getUser();

            $settingManager = $sg->get('system_setting.manager');
            $messageType = $sg->get('contact_message_type.manager')->find($settingManager->getSetting('contact_message_type_mass_sms'));

            $paginationQuery = $sg->get('contact_message.manager')->getSiteListQuery(array(
                'user_list' => $userList, 'message_type' => $messageType,
                    )
            );

            $paginator = $sg->get('knp_paginator');
            $pagination = $paginator->paginate($paginationQuery, $request->get('page', 1), 10, array('distinct' => false));
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error viewing sms stats: ' . $ex->getMessage());
        }

        return $this->render('@ContactBundle/Message/sms.stats.html.twig', array('pagination' => $pagination));
    }

    /**
     * @IsGranted({"ROLE_USER"})
     */
    public function showEMailAction(Request $request, ServiceGetterManager $sg, $messageId) {

        $pagination = array();

        try {

            $userList = $this->getUser();

            $message = $sg->get('contact_message.manager')->find($messageId);
            $createdByUser = $sg->get('user_list.manager')->find($message->getCreatedBy());

            if (!is_object($message) || $message->getCreatedBy() != $userList->getId()) {
                return $this->redirect(
                                $this->generateUrl('iga_core_500', array('message' => 'You do not have access to this message'))
                );
            }

            $messageType = $message->getMessageType();

            $paginationQuery = $sg->get('contact_message_recipient.manager')->getSiteListQuery(array('message' => $message,));

            $paginator = $sg->get('knp_paginator');
            $pagination = $paginator->paginate($paginationQuery, $request->get('page', 1), 10, array('distinct' => false));
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error viewing e-mail message: ' . $ex->getMessage());
        }

        return $this->render('@ContactBundle/Message/e-mail.show.html.twig', array('pagination' => $pagination, 'message' => $message, 'createdByUser' => $createdByUser));
    }

    /**
     * @IsGranted({"ROLE_USER"})
     */
    public function showSmsAction(Request $request, ServiceGetterManager $sg, $cultureString, $messageId) {

        $pagination = array();

        try {

            $userList = $this->getUser();

            $message = $sg->get('contact_message.manager')->find($messageId);
            $createdByUser = $sg->get('user_list.manager')->find($message->getCreatedBy());

            if (!is_object($message) || $message->getCreatedBy() != $userList->getId()) {
                return $this->redirect(
                                $this->generateUrl('iga_core_500', array('message' => 'You do not have access to this SMS'))
                );
            }

            $paginationQuery = $sg->get('contact_message_recipient.manager')->getSiteListQuery(array('message' => $message,));

            $paginator = $sg->get('knp_paginator');
            $pagination = $paginator->paginate($paginationQuery, $request->get('page', 1), 10, array('distinct' => false));
        } catch (\Exception $ex) {
            $logger = $sg->get('error_log.manager');
            $logger->error('Error viewing e-mail message: ' . $ex->getMessage());
        }

        return $this->render('@ContactBundle/Message/sms.show.html.twig', array('pagination' => $pagination, 'message' => $message, 'createdByUser' => $createdByUser));
    }
}