<?php
namespace DcSiteBundle\Controller;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\ViDiDepartment;
use CoreBundle\Entity\ViDiWorker;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\Callback\CallbackRequest;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Services\MediaExtensionVidi;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use PortalBundle\Model\SeoMetaTag;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class CallbackController extends BaseDcController
{
public function __construct(CoreFormFactory $coreFormFactory, SeoMetaTag $seoMetaTag, RequestStack $requestStack, RouterInterface $router, FormManager $formManager, EntityManagerInterface $em, ApiServer1C $apiServer1C, SessionInterface $session, Filesystem $filesystem, MediaExtensionVidi $mediaExtensionVidi, Repository $vehicleRepository, VehicleFactory $vehicleFactory, Environment $twig)
{
parent::__construct($coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig);
}
public function init(Request $request): JsonResponse
{
$workersRepo = $this->em->getRepository(ViDiWorker::class)->findBy(['dealer' => $this->getDealer(), 'callback_available' => 1]);
$departments = [];
$inArray = [];
foreach ($workersRepo as $worker) {
$departmentId = $worker->getDepartment()->getId();
if (in_array($departmentId, $inArray)) {
continue;
}
array_push($inArray, $departmentId);
$departments[] = [
'id' => $departmentId,
'name' => $worker->getDepartment()->getTitle($request->getLocale()),
'position' => $worker->getDepartment()->getPriority(),
];
}
usort($departments, fn($a, $b) => $a['position'] <=> $b['position']);
/* Проверка на робочие часы салона */
$isWorkingTime = true;
$startWorkingTime = (new DateTime('today'))->modify('+ 8 hours');
$endWorkingTime = (new DateTime('today'))->modify('+ 20 hours');
if ($startWorkingTime->diff(new DateTime('now'))->invert === 1 || $endWorkingTime->diff(new DateTime('now'))->invert === 0) {
$isWorkingTime = false;
}
$user = null;
if ($this->getUser()) {
$user = [
'name' => $this->getUser()->getName(),
'surname' => $this->getUser()->getLastName(),
'email' => $this->getUser()->getEmail(),
'phone' => $this->getUser()->getPhone(),
];
}
return $this->json(['departments' => $departments, 'isWorkingTime' => $isWorkingTime, 'user' => $user]);
}
public function createRequest(Request $request, CallbackRequest $callbackRequest): JsonResponse
{
$utm = $request->get('utm') ?? $request->cookies->get('ViDiTrackUTM');
$phone = preg_replace('/\D/', '', $request->request->get('userPhone'));
$departmentId = $request->request->get('departmentId');
$dealerDomain = $request->request->get('dealerDomain');
$Dealer = $this->em->getRepository(Dealer::class)->findOneBy(['domain' => $dealerDomain]);
if ($dealerDomain == '') {
$Dealer = $this->getDealer();
}
$request = $callbackRequest->createRequest($Dealer, $phone, $departmentId, $utm);
if ($request) {
return $this->json(['success' => true, 'requestId' => $request->getId()]);
}
return $this->json(['success' => false]);
}
public function getState(Request $request, CallbackRequest $callbackRequest): JsonResponse
{
$requestId = $request->request->get('request');
return $this->json(['state' => $callbackRequest->checkState($requestId), 'requestId' => $requestId]);
}
public function getDealerI()
{
$Dealer = $this->em->getRepository(Dealer::class)->findAll();
}
public function getDepartmentVIDI(Request $request): JsonResponse
{
$locale = $request->getLocale();
$departments = $this->em->getRepository(ViDiDepartment::class)->findAll();
$dealerDepartment = [];
/** @var ViDiDepartment $department */
foreach ($departments as $department) {
$dealerId = $department->getDealer()->getId();
if (!isset($dealerDepartment[$dealerId])) {
$dealerDepartment[$dealerId] = [
'dealer' => [
'dealerId' => $dealerId,
'domain' => $department->getDealer()->getDomain(),
'title' => $department->getDealer()->getName(),
],
'departmnet' => [],
];
}
$dealerDepartment[$dealerId]['departmnet'][] = [
'departmentId' => $department->getId(),
'title' => $department->getTitle($locale),
];
}
return $this->json(['result' => $dealerDepartment]);
}
}