src/PortalBundle/Controller/MainController.php line 42

Open in your IDE?
  1. <?php
  2. namespace PortalBundle\Controller;
  3. use CoreBundle\Component\CoreFormFactory;
  4. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  5. use CoreBundle\Model\Vehicles\Repository;
  6. use CoreBundle\Services\CRM\ODataManager;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Exception;
  9. use DateTime;
  10. use PortalBundle\Services\MainService;
  11. use PortalBundle\Services\ServiceService;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use CoreBundle\Entity\Dealer;
  14. use CoreBundle\Entity\Quality\UserRating;
  15. use PortalBundle\Entity\Contest;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Mime\Address;
  22. use Symfony\Component\Mime\Email;
  23. use Symfony\Component\Routing\RouterInterface;
  24. class MainController extends BaseController
  25. {
  26.     private MainService $mainService;
  27.     public function __construct(MainService $mainServiceCoreFormFactory $coreFormFactoryRequestStack $requestStackRouterInterface $router,
  28.                                 Repository      $vehicleRepositoryServiceService $serviceService)
  29.     {
  30.         parent::__construct($coreFormFactory$requestStack$router$vehicleRepository$serviceService);
  31.         $this->mainService $mainService;
  32.     }
  33.     public function redirectMain(): RedirectResponse
  34.     {
  35.         return $this->redirectToRoute('portal_homepage', [], Response::HTTP_MOVED_PERMANENTLY);
  36.     }
  37.     public function index(Request $request): Response
  38.     {
  39.         $this->mainService->setLang($request->getLocale());
  40.         return $this->basePortalRender('@Portal/Main/new-index.html.twig', [
  41.             'brands' => $this->mainService->getBrands(),
  42.             'slides' => $this->mainService->getSlides(),
  43.             'vehicleItem' => $this->mainService->getCountOffers(),
  44.             'recommendGroup' => $this->mainService->getRecommendations(),
  45.             'vehicleFilter' => $this->mainService->getFilters()
  46.         ]);
  47.     }
  48.     public function errorMain(Request $request): Response
  49.     {
  50.         $Response = new Response();
  51.         $Response->setStatusCode(Response::HTTP_NOT_FOUND);
  52.         return $this->basePortalRender('@Portal/404.html.twig', ['_locale' => $request->getLocale()], $Response);
  53.     }
  54.     public function qualityService(Request $requestApiServer1C $apiServer1CEntityManagerInterface $em): Response
  55.     {
  56.         $type $request->get('type');
  57.         $dealer $request->get('dealer');
  58.         $documentId $request->get('document');
  59.         $uType $request->get('utype');
  60.         /** @var Dealer $dealer */
  61.         $dealer $em->getRepository(Dealer::class)->findOneBy(['uid_1c' => $dealer]);
  62.         if (!$dealer) {
  63.             throw $this->createNotFoundException();
  64.         }
  65.         try {
  66.             $documentData $apiServer1C->getDocumentInfo($type$documentId$dealer);
  67.         } catch (Exception $e) {
  68.             $documentData false;
  69.         }
  70.         if (!$documentData) {
  71.             $documentData = [
  72.                 "Date" => false,
  73.                 "Number" => false,
  74.                 "Customer" => false
  75.             ];
  76.         }
  77.         $documentData['id'] = $documentId;
  78.         if ($uType == 'u') {
  79.             return $this->basePortalRender('@Portal//quality-service-f.html.twig', ['data' => $documentData'type' => $type'dealer' => $dealer]);
  80.         }
  81.         if ($type == 'sale') {
  82.             return $this->basePortalRender('@Portal//quality-service.html.twig', ['data' => $documentData'type' => $type'dealer' => $dealer]);
  83.         } else {
  84.             return $this->basePortalRender('@Portal//quality-service-two.html.twig', ['data' => $documentData'type' => $type'dealer' => $dealer]);
  85.         }
  86.     }
  87.     public function questionnaireService(Request $requestApiServer1C $apiServer1CEntityManagerInterface $em): Response
  88.     {
  89.         $type $request->get('type');
  90.         $dealer $request->get('dealer');
  91.         $documentId $request->get('document');
  92.         $questionnaire $request->get('questionnaire');
  93.         /** @var Dealer $dealer */
  94.         $dealer $em->getRepository(Dealer::class)->findOneBy(['uid_1c' => $dealer]);
  95.         if (!$dealer) {
  96.             throw $this->createNotFoundException();
  97.         }
  98.         $checkRating $em->getRepository(UserRating::class)->findBy([
  99.             'type' => $type,
  100.             'dealer' => $dealer,
  101.             'document_id' => $documentId,
  102.         ]);
  103.         try {
  104.             $documentData $apiServer1C->getDocumentQuestionnaireInfo($type$documentId$dealer);
  105.             $questionData $apiServer1C->getQuestionInfo($dealer$questionnaire);
  106.         } catch (Exception $e) {
  107.             $documentData false;
  108.         }
  109.         if (!$documentData) {
  110.             $documentData = [
  111.                 "Date" => false,
  112.                 "Number" => false,
  113.                 "Customer" => false
  114.             ];
  115.         }
  116.         $documentData['id'] = $documentId;
  117.         return $this->basePortalRender('@Portal//quality-service-question.html.twig', [
  118.             'isAnswered' => count($checkRating) > 0,
  119.             'data' => $documentData,
  120.             'type' => $type,
  121.             'dealer' => $dealer,
  122.             'questionnaire' => $questionnaire,
  123.             'questions' => $questionData['Items'] ?? [],
  124.         ]);
  125.     }
  126.     public function qualitySave(Request $requestApiServer1C $apiServer1CMailerInterface $mailer,
  127.                                 EntityManagerInterface $em): JsonResponse
  128.     {
  129.         $data $request->request->all();
  130.         $dealerId $data['dealer'] ?? false;
  131.         $documentId $data['document'] ?? false;
  132.         $type $data['type'] ?? false;
  133.         if (!$dealerId || !$documentId || !$type) {
  134.             return $this->json(['success' => false]);
  135.         }
  136.         $dealer $em->getRepository(Dealer::class)->find($dealerId);
  137.         if (!$dealer) {
  138.             return $this->json(['success' => false]);
  139.         }
  140.         $checkRating $em->getRepository(UserRating::class)->findBy([
  141.             'type' => $type,
  142.             'dealer' => $dealer,
  143.             'document_id' => $documentId,
  144.         ]);
  145.         if (count($checkRating)) {
  146.             return $this->json(['success' => true]);
  147.         }
  148.         $userRating = new UserRating();
  149.         $userRating->setType($type);
  150.         $userRating->setDealer($dealer);
  151.         $userRating->setDocumentId($documentId);
  152.         $userRating->setDateCreate(new DateTime());
  153.         $userRating->setData(json_encode($data));
  154.         $em->persist($userRating);
  155.         $em->flush();
  156.         $info $data['info'] ?? null;
  157.         $apiServer1C->setInquirer($type$documentId$dealer$data['total'], $data['work'], $data['exp'], $info, isset($data['info']));
  158.         $mailBody $this->renderView('@Portal/Mail/quality-new.html.twig', ['data' => $data'dealer' => $dealer]);
  159.         $message = (new Email())
  160.             ->subject('Оценка качества обслуживания')
  161.             ->from(new Address('info@vidi.ua''Автодинастия'))
  162.             ->html($mailBody'text/html')
  163.             ->to('web-leads@vidi.ua''anna.pashaly@vidi.ua');
  164.         $mailer->send($message);
  165.         return $this->json(['success' => true]);
  166.     }
  167.     public function questionnaireSave(Request $requestMailerInterface $mailerApiServer1C $apiServer1CEntityManagerInterface $em): JsonResponse
  168.     {
  169.         $data $request->request->all();
  170.         $dealerId $data['dealer'] ?? false;
  171.         $documentId $data['document'] ?? false;
  172.         $type $data['type'] ?? false;
  173.         if (!$dealerId || !$documentId || !$type) {
  174.             return $this->json(['success' => false]);
  175.         }
  176.         $dealer $em->getRepository(Dealer::class)->find($dealerId);
  177.         if (!$dealer) {
  178.             return $this->json(['success' => false]);
  179.         }
  180.         $checkRating $em->getRepository(UserRating::class)->findBy([
  181.             'type' => $type,
  182.             'dealer' => $dealer,
  183.             'document_id' => $documentId,
  184.         ]);
  185.         if (count($checkRating)) {
  186.             return $this->json(['success' => true]);
  187.         }
  188.         $userRating = new UserRating();
  189.         $userRating->setType($type);
  190.         $userRating->setDealer($dealer);
  191.         $userRating->setDocumentId($documentId);
  192.         $userRating->setDateCreate(new DateTime());
  193.         $userRating->setData(json_encode($data));
  194.         $em->persist($userRating);
  195.         $em->flush();
  196.         $apiServer1C->setInquirerWithData($type$documentId$dealer$data);
  197.         $questionData $apiServer1C->getQuestionInfo($dealer$data['questionnaire']);
  198.         $mailBody $this->renderView('@Portal/Mail/quality-new.html.twig', ['data' => $data'dealer' => $dealer'questions' => $questionData['Items']]);
  199.         $message = (new Email())
  200.             ->subject('Оценка качества обслуживания')
  201.             ->from(new Address('info@vidi.ua''Автодинастия'))
  202.             ->html($mailBody)
  203.             ->to('web-leads@vidi.ua''anna.pashaly@vidi.ua');
  204.         $mailer->send($message);
  205.         return $this->json(['success' => true]);
  206.     }
  207.     public function qualityServiceTech(Request $requestMailerInterface $mailer): Response
  208.     {
  209.         $data = [
  210.             'dcCode' => $request->get('siteid'),
  211.             'clientGuid' => $request->get('guid'),
  212.             'clientCode' => $request->get('code'),
  213.             'clientName' => $request->get('name'),
  214.             'clientPhone' => $request->get('phone'),
  215.             'clientEmail' => $request->get('mail'),
  216.             'docDate' => $request->get('doc_date'),
  217.             'docNum' => $request->get('doc_num'),
  218.             'assessment' => $request->get('assessment'),
  219.         ];
  220.         $emails = [
  221.             'ni' => 'csi.sunrise-motors@vidi.ua',
  222.             'lx' => 'csi.elite@vidi.ua',
  223.             'fo' => 'csi.cry-motors@vidi.ua',
  224.             'to' => 'csi.avtostrada@vidi.ua',
  225.             'ci' => 'csi.elegance@vidi.ua',
  226.             'pk' => 'csi.avenue@vidi.ua',
  227.             'sk' => 'csi.grand@vidi.ua',
  228.             'ma' => 'csi.sky-motors@vidi.ua',
  229.             'pa' => 'csi.palmira@vidi.ua',
  230.             'lr' => 'csi.power-motors@vidi.ua',
  231.             'na' => 'csi.armada@vidi.ua',
  232.             'ho' => 'csi.insight@vidi.ua',
  233.             'in' => 'csi.liberty@vidi.ua',
  234.             'vo' => 'csi.nordway@vidi.ua',
  235.             'su' => 'csi.star-motors@vidi.ua',
  236.         ];
  237.         $mailBody $this->renderView('@Portal/Mail/quality.html.twig', ['data' => $data]);
  238.         $to $emails[$request->get('siteid')] ?? ['web-leads@vidi.ua'];
  239.         $message = (new Email())
  240.             ->subject('Оценка качества обслуживания')
  241.             ->from('info@vidi.ua''Автодинастия')
  242.             ->html($mailBody)
  243.             ->to(...$to);
  244.         $mailer->send($message);
  245.         return $this->basePortalRender('@Portal/window-sps/sps.html.twig');
  246.     }
  247.     //TODO delete when promotion end
  248.     public function contest_10000()
  249.     {
  250.         return $this->basePortalRender('@Portal//contest.html.twig');
  251.     }
  252.     //TODO delete when promotion end
  253.     public function saveContest_10000(Request $requestEntityManagerInterface $em): JsonResponse
  254.     {
  255.         $phone $request->get('phone');
  256.         $phone substr(preg_replace('~[^0-9]+~'''$phone), -10);
  257.         $userPhone $em->getRepository(Contest::class)->findOneBy(['phone' => $phone]);
  258.         if ($userPhone) {
  259.             return $this->json(['success' => false]);
  260.         }
  261.         $contest = new Contest();
  262.         $contest->setName($request->get('name'));
  263.         $contest->setPhone($phone);
  264.         $contest->setComment($request->get('comment'));
  265.         $em->persist($contest);
  266.         $em->flush();
  267.         return $this->json(['success' => true]);
  268.     }
  269.     public function charity(): Response
  270.     {
  271.         try {
  272.             $data $this->mainService->apiIntegrationReturnAlive();
  273.         } catch (Exception $e) {
  274.         }
  275.         return $this->basePortalRender('@Portal/About/charity.html.twig', [
  276.             'data' => $data
  277.         ]);
  278.     }
  279.     public function subscriptionManagement(Request $requestODataManager $ODataManager)
  280.     {
  281.         $uid $request->get('uid');
  282.         if (!$uid){
  283.             return $this->redirectToRoute('portal_homepage', [], Response::HTTP_MOVED_PERMANENTLY);
  284.         }
  285.         $getSubscrbMailTypes $ODataManager->getSubscriptionMailingType();
  286.         $getReasonForUnsubscribed $ODataManager->getReasonForUnsubscribed();
  287.         $getUserSubscribes $ODataManager->getUserSubscribtion($uid);
  288.         $userUnSubscribes = [];
  289.         if (!empty($getUserSubscribes)) {
  290.             foreach ($getUserSubscribes as $subscribe) {
  291.                 if ($subscribe->VIDIUnsubscribed == true) {
  292.                     $userUnSubscribes[] = $subscribe->SuBulkMessageCategoryId;
  293.                 }
  294.             }
  295.         }
  296.         $subscriptionMailTypes = [];
  297.         foreach ($getSubscrbMailTypes as $el){
  298.             if (isset($el->VIDIDeactivatedCategory) && $el->VIDIDeactivatedCategory != true) {
  299.                 $subscriptionMailTypes[] = [
  300.                     'id' => $el->Id,
  301.                     'name' => $el->Name,
  302.                     'description' => $el->Description,
  303.                     'checked' => !in_array($el->Id$userUnSubscribes) ? true false
  304.                 ];
  305.             }
  306.         }
  307.         $reasonForUnsubscribed = [];
  308.         foreach ($getReasonForUnsubscribed as $el){
  309.             $reasonForUnsubscribed[] = [
  310.                 'id' => $el->Id,
  311.                 'name' =>   str_replace("\\""\\\\"$el->Name),
  312.                 'description' => $el->Description,
  313.             ];
  314.         }
  315.         return $this->basePortalRender('@Portal/About/subscription-management.html.twig', [
  316.             'userSubscribes' => $userUnSubscribes,
  317.             'subscriptionMailTypes' => $subscriptionMailTypes,
  318.             'reasonForUnsubscribed' => $reasonForUnsubscribed,
  319.             'userUid' => $uid
  320.         ]);
  321.     }
  322.     public function addNewUnsubscribe(Request $requestODataManager $ODataManager): JsonResponse
  323.     {
  324.         $unsubscribes $request->get('unsubscribes');
  325.         $newSubscribes $request->get('newSubscribes');
  326.         $uid $request->get('uid');
  327.         $getUserSubscribes $ODataManager->getUserSubscribtion($uid);
  328.         $issetSubscribes = [];
  329.         if ($getUserSubscribes) {
  330.             foreach ($getUserSubscribes as $subscribe) {
  331.                 $issetSubscribes[$subscribe->SuBulkMessageCategoryId] = $subscribe->Id;
  332.             }
  333.         }
  334.         if ($unsubscribes) {
  335.             foreach ($unsubscribes as $unsubscribe) {
  336.                 if (isset($issetSubscribes[$unsubscribe])) {
  337.                     $data["VIDIUnsubscribed"] = true;
  338.                     $ODataManager->updateSubscribe($issetSubscribes[$unsubscribe], $data);
  339.                 } else {
  340.                     $data = [
  341.                         'SuBulkMessageCategoryId' => $unsubscribe,
  342.                         'VIDICommentary' => $request->get('commentary'),
  343.                         'VIDIReasonForUnsubscribedId' => $request->get('reason'),
  344.                         "VIDIUnsubscribed" => true,
  345.                         "VIDIContactId" => $uid
  346.                     ];
  347.                     $ODataManager->addNewUnsubscribe($data);
  348.                 }
  349.             }
  350.         }
  351.         if ($newSubscribes) {
  352.             foreach ($newSubscribes as $newSubscribe) {
  353.                 if (isset($issetSubscribes[$newSubscribe])) {
  354.                     $data = [
  355.                         "VIDIUnsubscribed" => false,
  356.                     ];
  357.                     $ODataManager->updateSubscribe($issetSubscribes[$newSubscribe], $data);
  358.                 }
  359.             }
  360.         }
  361.         return $this->json(['success' => true]);
  362.     }
  363.     public function landingPremiumPage(): Response
  364.     {
  365.         return $this->basePortalRender('@Portal/Landing/landing-premium-page.html.twig');
  366.     }
  367.     public function questionnaireCRMService(Request $requestODataManager $ODataManager): Response
  368.     {
  369.         $questionnaireUid $request->get('questionnaireUid');
  370.         $questionnaireClientData $ODataManager->getQuestionnaireClient($questionnaireUid);
  371.         $clientData = [];
  372.         if (isset($questionnaireClientData->VIDI_VisitDateTime)){
  373.             $date = new \DateTime($questionnaireClientData->VIDI_VisitDateTime);
  374.             $clientData['visitDate'] = $date->format('d.m.Y');
  375.         }
  376.         $clientData['fullName'] = $questionnaireClientData->VIDI_FullNameClient;
  377.         $clientData['nameDC'] = $questionnaireClientData->VIDI_MarkeningNameDC;
  378.         $questionnaireData $ODataManager->getQuestionnaireData($questionnaireUid);
  379.         usort($questionnaireData, function ($a$b) {
  380.             return $a->VIDI_PositionOfQuestion <=> $b->VIDI_PositionOfQuestion;
  381.         });
  382.         $questionTypes = [
  383.             '98d3d400-0807-493b-b7fe-34a0ac3f5661' => [
  384.                 'type' => 'enum',
  385.                 'crmType' => 'VIDI_AnswerYesNoId'
  386.             ],
  387.             '3fc760c7-f3d5-43aa-add9-ac53f03c3522' => [
  388.                 'type' => 'range',
  389.                 'crmType' => 'VIDI_FromOneToTenAnswer'
  390.             ],
  391.             'a59d79dd-768c-4312-b38b-f147ba7b6f9c' => [
  392.                 'type' => 'string',
  393.                 'crmType' => 'VIDI_AnyAnswer'
  394.             ],
  395.         ];
  396.         $yesNoValues = [
  397.             '465425f9-8cf4-455a-ae9c-b0250aaae1f9' => 'Так',
  398.             '4c94eeaa-2224-4923-9208-f934e0ab046f' => 'Ні'
  399.         ];
  400.         $questions = [];
  401.         foreach ($questionnaireData as $questionnaire) {
  402.             $questions[] = [
  403.                 'id' => $questionnaire->Id,
  404.                 'name' => $questionnaire->Name,
  405.                 'type' => $questionTypes[$questionnaire->VIDI_TypeOfQuestionId]['type'],
  406.                 'crmType' => $questionTypes[$questionnaire->VIDI_TypeOfQuestionId]['crmType'],
  407.             ];
  408.         }
  409.         return $this->basePortalRender('@Portal/quality-service-question-crm.html.twig', [
  410. //            'isAnswered' => current($questionnaireData)->VIDI_AnswerInText,
  411.             'isAnswered' => false,
  412.             'clientData' => $clientData,
  413.             'yesNoValues' => $yesNoValues,
  414.             'questionnaireUid' => $questionnaireUid,
  415.             'questions' => $questions ?? [],
  416.         ]);
  417.     }
  418.     public function questionnaireCRMSaveAction(Request $requestODataManager $ODataManager): JsonResponse
  419.     {
  420.         $questionnaireUid $request->request->get('questionnaireUid');
  421.         $answers $request->request->get('questions');
  422.         if (!$questionnaireUid || empty($answers)) {
  423.             return $this->json(['success' => false]);
  424.         }
  425.         $yesNoValues = [
  426.             '465425f9-8cf4-455a-ae9c-b0250aaae1f9' => 'Так',
  427.             '4c94eeaa-2224-4923-9208-f934e0ab046f' => 'Ні'
  428.         ];
  429.         foreach ($answers as $key => $answer){
  430.             $text $answer['value'];
  431.             if (isset($yesNoValues[$answer['value']])){
  432.                 $text $yesNoValues[$answer['value']];
  433.             }
  434.             $answer= [
  435.                 $answer['crmType'] =>  $answer['value'],
  436.                 "VIDI_AnswerInText" =>  $text,
  437.             ];
  438.             $ODataManager->setQuestionAnswer($key$answer);
  439.         }
  440.         if ($request->request->get('comment')){
  441.             $questionnaireComment = ["VIDI_Comment" => "Коментар від клієнта:: " $request->request->get('comment')];
  442.             $ODataManager->setQuestionnaireAnswerComment($questionnaireUid$questionnaireComment);
  443.         }
  444.         $datetime = new \DateTime();
  445.         $questionnaireFinishDate = ["VIDI_SurvayDateTime" => $datetime->format('Y-m-d\TH:i:sP')];
  446.         $ODataManager->setQuestionnaireAnswerTime($questionnaireUid$questionnaireFinishDate);
  447.         return $this->json(['success' => true]);
  448.     }
  449. }