<?php
namespace PortalBundle\Controller;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Services\CRM\ODataManager;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use DateTime;
use PortalBundle\Services\MainService;
use PortalBundle\Services\ServiceService;
use Symfony\Component\HttpFoundation\RedirectResponse;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Quality\UserRating;
use PortalBundle\Entity\Contest;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\RouterInterface;
class MainController extends BaseController
{
private MainService $mainService;
public function __construct(MainService $mainService, CoreFormFactory $coreFormFactory, RequestStack $requestStack, RouterInterface $router,
Repository $vehicleRepository, ServiceService $serviceService)
{
parent::__construct($coreFormFactory, $requestStack, $router, $vehicleRepository, $serviceService);
$this->mainService = $mainService;
}
public function redirectMain(): RedirectResponse
{
return $this->redirectToRoute('portal_homepage', [], Response::HTTP_MOVED_PERMANENTLY);
}
public function index(Request $request): Response
{
$this->mainService->setLang($request->getLocale());
return $this->basePortalRender('@Portal/Main/new-index.html.twig', [
'brands' => $this->mainService->getBrands(),
'slides' => $this->mainService->getSlides(),
'vehicleItem' => $this->mainService->getCountOffers(),
'recommendGroup' => $this->mainService->getRecommendations(),
'vehicleFilter' => $this->mainService->getFilters()
]);
}
public function errorMain(Request $request): Response
{
$Response = new Response();
$Response->setStatusCode(Response::HTTP_NOT_FOUND);
return $this->basePortalRender('@Portal/404.html.twig', ['_locale' => $request->getLocale()], $Response);
}
public function qualityService(Request $request, ApiServer1C $apiServer1C, EntityManagerInterface $em): Response
{
$type = $request->get('type');
$dealer = $request->get('dealer');
$documentId = $request->get('document');
$uType = $request->get('utype');
/** @var Dealer $dealer */
$dealer = $em->getRepository(Dealer::class)->findOneBy(['uid_1c' => $dealer]);
if (!$dealer) {
throw $this->createNotFoundException();
}
try {
$documentData = $apiServer1C->getDocumentInfo($type, $documentId, $dealer);
} catch (Exception $e) {
$documentData = false;
}
if (!$documentData) {
$documentData = [
"Date" => false,
"Number" => false,
"Customer" => false
];
}
$documentData['id'] = $documentId;
if ($uType == 'u') {
return $this->basePortalRender('@Portal//quality-service-f.html.twig', ['data' => $documentData, 'type' => $type, 'dealer' => $dealer]);
}
if ($type == 'sale') {
return $this->basePortalRender('@Portal//quality-service.html.twig', ['data' => $documentData, 'type' => $type, 'dealer' => $dealer]);
} else {
return $this->basePortalRender('@Portal//quality-service-two.html.twig', ['data' => $documentData, 'type' => $type, 'dealer' => $dealer]);
}
}
public function questionnaireService(Request $request, ApiServer1C $apiServer1C, EntityManagerInterface $em): Response
{
$type = $request->get('type');
$dealer = $request->get('dealer');
$documentId = $request->get('document');
$questionnaire = $request->get('questionnaire');
/** @var Dealer $dealer */
$dealer = $em->getRepository(Dealer::class)->findOneBy(['uid_1c' => $dealer]);
if (!$dealer) {
throw $this->createNotFoundException();
}
$checkRating = $em->getRepository(UserRating::class)->findBy([
'type' => $type,
'dealer' => $dealer,
'document_id' => $documentId,
]);
try {
$documentData = $apiServer1C->getDocumentQuestionnaireInfo($type, $documentId, $dealer);
$questionData = $apiServer1C->getQuestionInfo($dealer, $questionnaire);
} catch (Exception $e) {
$documentData = false;
}
if (!$documentData) {
$documentData = [
"Date" => false,
"Number" => false,
"Customer" => false
];
}
$documentData['id'] = $documentId;
return $this->basePortalRender('@Portal//quality-service-question.html.twig', [
'isAnswered' => count($checkRating) > 0,
'data' => $documentData,
'type' => $type,
'dealer' => $dealer,
'questionnaire' => $questionnaire,
'questions' => $questionData['Items'] ?? [],
]);
}
public function qualitySave(Request $request, ApiServer1C $apiServer1C, MailerInterface $mailer,
EntityManagerInterface $em): JsonResponse
{
$data = $request->request->all();
$dealerId = $data['dealer'] ?? false;
$documentId = $data['document'] ?? false;
$type = $data['type'] ?? false;
if (!$dealerId || !$documentId || !$type) {
return $this->json(['success' => false]);
}
$dealer = $em->getRepository(Dealer::class)->find($dealerId);
if (!$dealer) {
return $this->json(['success' => false]);
}
$checkRating = $em->getRepository(UserRating::class)->findBy([
'type' => $type,
'dealer' => $dealer,
'document_id' => $documentId,
]);
if (count($checkRating)) {
return $this->json(['success' => true]);
}
$userRating = new UserRating();
$userRating->setType($type);
$userRating->setDealer($dealer);
$userRating->setDocumentId($documentId);
$userRating->setDateCreate(new DateTime());
$userRating->setData(json_encode($data));
$em->persist($userRating);
$em->flush();
$info = $data['info'] ?? null;
$apiServer1C->setInquirer($type, $documentId, $dealer, $data['total'], $data['work'], $data['exp'], $info, isset($data['info']));
$mailBody = $this->renderView('@Portal/Mail/quality-new.html.twig', ['data' => $data, 'dealer' => $dealer]);
$message = (new Email())
->subject('Оценка качества обслуживания')
->from(new Address('info@vidi.ua', 'Автодинастия'))
->html($mailBody, 'text/html')
->to('web-leads@vidi.ua', 'anna.pashaly@vidi.ua');
$mailer->send($message);
return $this->json(['success' => true]);
}
public function questionnaireSave(Request $request, MailerInterface $mailer, ApiServer1C $apiServer1C, EntityManagerInterface $em): JsonResponse
{
$data = $request->request->all();
$dealerId = $data['dealer'] ?? false;
$documentId = $data['document'] ?? false;
$type = $data['type'] ?? false;
if (!$dealerId || !$documentId || !$type) {
return $this->json(['success' => false]);
}
$dealer = $em->getRepository(Dealer::class)->find($dealerId);
if (!$dealer) {
return $this->json(['success' => false]);
}
$checkRating = $em->getRepository(UserRating::class)->findBy([
'type' => $type,
'dealer' => $dealer,
'document_id' => $documentId,
]);
if (count($checkRating)) {
return $this->json(['success' => true]);
}
$userRating = new UserRating();
$userRating->setType($type);
$userRating->setDealer($dealer);
$userRating->setDocumentId($documentId);
$userRating->setDateCreate(new DateTime());
$userRating->setData(json_encode($data));
$em->persist($userRating);
$em->flush();
$apiServer1C->setInquirerWithData($type, $documentId, $dealer, $data);
$questionData = $apiServer1C->getQuestionInfo($dealer, $data['questionnaire']);
$mailBody = $this->renderView('@Portal/Mail/quality-new.html.twig', ['data' => $data, 'dealer' => $dealer, 'questions' => $questionData['Items']]);
$message = (new Email())
->subject('Оценка качества обслуживания')
->from(new Address('info@vidi.ua', 'Автодинастия'))
->html($mailBody)
->to('web-leads@vidi.ua', 'anna.pashaly@vidi.ua');
$mailer->send($message);
return $this->json(['success' => true]);
}
public function qualityServiceTech(Request $request, MailerInterface $mailer): Response
{
$data = [
'dcCode' => $request->get('siteid'),
'clientGuid' => $request->get('guid'),
'clientCode' => $request->get('code'),
'clientName' => $request->get('name'),
'clientPhone' => $request->get('phone'),
'clientEmail' => $request->get('mail'),
'docDate' => $request->get('doc_date'),
'docNum' => $request->get('doc_num'),
'assessment' => $request->get('assessment'),
];
$emails = [
'ni' => 'csi.sunrise-motors@vidi.ua',
'lx' => 'csi.elite@vidi.ua',
'fo' => 'csi.cry-motors@vidi.ua',
'to' => 'csi.avtostrada@vidi.ua',
'ci' => 'csi.elegance@vidi.ua',
'pk' => 'csi.avenue@vidi.ua',
'sk' => 'csi.grand@vidi.ua',
'ma' => 'csi.sky-motors@vidi.ua',
'pa' => 'csi.palmira@vidi.ua',
'lr' => 'csi.power-motors@vidi.ua',
'na' => 'csi.armada@vidi.ua',
'ho' => 'csi.insight@vidi.ua',
'in' => 'csi.liberty@vidi.ua',
'vo' => 'csi.nordway@vidi.ua',
'su' => 'csi.star-motors@vidi.ua',
];
$mailBody = $this->renderView('@Portal/Mail/quality.html.twig', ['data' => $data]);
$to = $emails[$request->get('siteid')] ?? ['web-leads@vidi.ua'];
$message = (new Email())
->subject('Оценка качества обслуживания')
->from('info@vidi.ua', 'Автодинастия')
->html($mailBody)
->to(...$to);
$mailer->send($message);
return $this->basePortalRender('@Portal/window-sps/sps.html.twig');
}
//TODO delete when promotion end
public function contest_10000()
{
return $this->basePortalRender('@Portal//contest.html.twig');
}
//TODO delete when promotion end
public function saveContest_10000(Request $request, EntityManagerInterface $em): JsonResponse
{
$phone = $request->get('phone');
$phone = substr(preg_replace('~[^0-9]+~', '', $phone), -10);
$userPhone = $em->getRepository(Contest::class)->findOneBy(['phone' => $phone]);
if ($userPhone) {
return $this->json(['success' => false]);
}
$contest = new Contest();
$contest->setName($request->get('name'));
$contest->setPhone($phone);
$contest->setComment($request->get('comment'));
$em->persist($contest);
$em->flush();
return $this->json(['success' => true]);
}
public function charity(): Response
{
try {
$data = $this->mainService->apiIntegrationReturnAlive();
} catch (Exception $e) {
}
return $this->basePortalRender('@Portal/About/charity.html.twig', [
'data' => $data
]);
}
public function subscriptionManagement(Request $request, ODataManager $ODataManager)
{
$uid = $request->get('uid');
if (!$uid){
return $this->redirectToRoute('portal_homepage', [], Response::HTTP_MOVED_PERMANENTLY);
}
$getSubscrbMailTypes = $ODataManager->getSubscriptionMailingType();
$getReasonForUnsubscribed = $ODataManager->getReasonForUnsubscribed();
$getUserSubscribes = $ODataManager->getUserSubscribtion($uid);
$userUnSubscribes = [];
if (!empty($getUserSubscribes)) {
foreach ($getUserSubscribes as $subscribe) {
if ($subscribe->VIDIUnsubscribed == true) {
$userUnSubscribes[] = $subscribe->SuBulkMessageCategoryId;
}
}
}
$subscriptionMailTypes = [];
foreach ($getSubscrbMailTypes as $el){
if (isset($el->VIDIDeactivatedCategory) && $el->VIDIDeactivatedCategory != true) {
$subscriptionMailTypes[] = [
'id' => $el->Id,
'name' => $el->Name,
'description' => $el->Description,
'checked' => !in_array($el->Id, $userUnSubscribes) ? true : false
];
}
}
$reasonForUnsubscribed = [];
foreach ($getReasonForUnsubscribed as $el){
$reasonForUnsubscribed[] = [
'id' => $el->Id,
'name' => str_replace("\\", "\\\\", $el->Name),
'description' => $el->Description,
];
}
return $this->basePortalRender('@Portal/About/subscription-management.html.twig', [
'userSubscribes' => $userUnSubscribes,
'subscriptionMailTypes' => $subscriptionMailTypes,
'reasonForUnsubscribed' => $reasonForUnsubscribed,
'userUid' => $uid
]);
}
public function addNewUnsubscribe(Request $request, ODataManager $ODataManager): JsonResponse
{
$unsubscribes = $request->get('unsubscribes');
$newSubscribes = $request->get('newSubscribes');
$uid = $request->get('uid');
$getUserSubscribes = $ODataManager->getUserSubscribtion($uid);
$issetSubscribes = [];
if ($getUserSubscribes) {
foreach ($getUserSubscribes as $subscribe) {
$issetSubscribes[$subscribe->SuBulkMessageCategoryId] = $subscribe->Id;
}
}
if ($unsubscribes) {
foreach ($unsubscribes as $unsubscribe) {
if (isset($issetSubscribes[$unsubscribe])) {
$data["VIDIUnsubscribed"] = true;
$ODataManager->updateSubscribe($issetSubscribes[$unsubscribe], $data);
} else {
$data = [
'SuBulkMessageCategoryId' => $unsubscribe,
'VIDICommentary' => $request->get('commentary'),
'VIDIReasonForUnsubscribedId' => $request->get('reason'),
"VIDIUnsubscribed" => true,
"VIDIContactId" => $uid
];
$ODataManager->addNewUnsubscribe($data);
}
}
}
if ($newSubscribes) {
foreach ($newSubscribes as $newSubscribe) {
if (isset($issetSubscribes[$newSubscribe])) {
$data = [
"VIDIUnsubscribed" => false,
];
$ODataManager->updateSubscribe($issetSubscribes[$newSubscribe], $data);
}
}
}
return $this->json(['success' => true]);
}
public function landingPremiumPage(): Response
{
return $this->basePortalRender('@Portal/Landing/landing-premium-page.html.twig');
}
public function questionnaireCRMService(Request $request, ODataManager $ODataManager): Response
{
$questionnaireUid = $request->get('questionnaireUid');
$questionnaireClientData = $ODataManager->getQuestionnaireClient($questionnaireUid);
$clientData = [];
if (isset($questionnaireClientData->VIDI_VisitDateTime)){
$date = new \DateTime($questionnaireClientData->VIDI_VisitDateTime);
$clientData['visitDate'] = $date->format('d.m.Y');
}
$clientData['fullName'] = $questionnaireClientData->VIDI_FullNameClient;
$clientData['nameDC'] = $questionnaireClientData->VIDI_MarkeningNameDC;
$questionnaireData = $ODataManager->getQuestionnaireData($questionnaireUid);
usort($questionnaireData, function ($a, $b) {
return $a->VIDI_PositionOfQuestion <=> $b->VIDI_PositionOfQuestion;
});
$questionTypes = [
'98d3d400-0807-493b-b7fe-34a0ac3f5661' => [
'type' => 'enum',
'crmType' => 'VIDI_AnswerYesNoId'
],
'3fc760c7-f3d5-43aa-add9-ac53f03c3522' => [
'type' => 'range',
'crmType' => 'VIDI_FromOneToTenAnswer'
],
'a59d79dd-768c-4312-b38b-f147ba7b6f9c' => [
'type' => 'string',
'crmType' => 'VIDI_AnyAnswer'
],
];
$yesNoValues = [
'465425f9-8cf4-455a-ae9c-b0250aaae1f9' => 'Так',
'4c94eeaa-2224-4923-9208-f934e0ab046f' => 'Ні'
];
$questions = [];
foreach ($questionnaireData as $questionnaire) {
$questions[] = [
'id' => $questionnaire->Id,
'name' => $questionnaire->Name,
'type' => $questionTypes[$questionnaire->VIDI_TypeOfQuestionId]['type'],
'crmType' => $questionTypes[$questionnaire->VIDI_TypeOfQuestionId]['crmType'],
];
}
return $this->basePortalRender('@Portal/quality-service-question-crm.html.twig', [
// 'isAnswered' => current($questionnaireData)->VIDI_AnswerInText,
'isAnswered' => false,
'clientData' => $clientData,
'yesNoValues' => $yesNoValues,
'questionnaireUid' => $questionnaireUid,
'questions' => $questions ?? [],
]);
}
public function questionnaireCRMSaveAction(Request $request, ODataManager $ODataManager): JsonResponse
{
$questionnaireUid = $request->request->get('questionnaireUid');
$answers = $request->request->get('questions');
if (!$questionnaireUid || empty($answers)) {
return $this->json(['success' => false]);
}
$yesNoValues = [
'465425f9-8cf4-455a-ae9c-b0250aaae1f9' => 'Так',
'4c94eeaa-2224-4923-9208-f934e0ab046f' => 'Ні'
];
foreach ($answers as $key => $answer){
$text = $answer['value'];
if (isset($yesNoValues[$answer['value']])){
$text = $yesNoValues[$answer['value']];
}
$answer= [
$answer['crmType'] => $answer['value'],
"VIDI_AnswerInText" => $text,
];
$ODataManager->setQuestionAnswer($key, $answer);
}
if ($request->request->get('comment')){
$questionnaireComment = ["VIDI_Comment" => "Коментар від клієнта:: " . $request->request->get('comment')];
$ODataManager->setQuestionnaireAnswerComment($questionnaireUid, $questionnaireComment);
}
$datetime = new \DateTime();
$questionnaireFinishDate = ["VIDI_SurvayDateTime" => $datetime->format('Y-m-d\TH:i:sP')];
$ODataManager->setQuestionnaireAnswerTime($questionnaireUid, $questionnaireFinishDate);
return $this->json(['success' => true]);
}
}