<?php
namespace DcSiteBundle\Controller;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Brand;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Forms;
use CoreBundle\Entity\Vehicles\Equipment;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Entity\Vehicles\VehicleItem;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\DealerModel;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Services\MediaExtensionVidi;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use InsuranceBundle\Form\OrderInsuranceType;
use InsuranceBundle\Model\Program;
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\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Twig\Environment;
class InsuranceController 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 loadOptions(Program $programModel): JsonResponse
{
$options = $programModel->buildCascoOption();
$options['coefficient'] = [
'baseType' => Program::BASE_COEFFICIENT_TYPE,
'listType' => Program::LIST_COEFFICIENT_TYPE,
'optionType' => Program::OPTION_COEFFICIENT_TYPE,
'privacyUrl' => $this->router->generate('portal_privacy_policy'),
];
return new JsonResponse($options);
}
public function init(Request $request): JsonResponse
{
try {
$dealer = $this->getDealer();
$dealerId = $dealer->getId();
} catch (NotFoundHttpException $e) {
$dealerId = false;
}
$brandsArray = [];
if (!$dealerId) {
$mediaTwig = $this->mediaExtensionVidi;
$brands = $this->em->getRepository(Brand::class)->getAvailBrandsInstance(true, false, true);
/**
* @var int $key
* @var Brand $brand
*/
foreach ($brands as $key => $brand) {
$brandsArray[$key] = [
'id' => $brand->getId(),
'name' => $brand->getName(),
'image' => $mediaTwig->getPath($brand->getLogo(), 'menu'),
];
if (count($brand->getDealer()) == 1) {
$brandsArray[$key]['dealerId'] = $brand->getDealer()->first()->getId();
} else {
/** @var Dealer $dealer */
foreach ($brand->getDealer() as $dealer) {
$brandsArray[$key]['dealers'][] = [
'id' => $dealer->getId(),
'title' => $dealer->getNameByLocale($request->getLocale()),
'adres' => $dealer->getAddressByLocale($request->getLocale()),
];
}
}
}
}
return new JsonResponse(['success' => true, 'dealer' => $dealerId, 'brands' => $brandsArray]);
}
public function initByDealer(Request $Request): JsonResponse
{
$dealerId = $Request->request->get('dealer');
if ($dealerId) {
$Dealer = $this->em->getRepository(Dealer::class)->find($dealerId);
} else {
$Dealer = $this->getDealer();
}
$carsArray = [];
if ($Dealer->getId() == DealerModel::SECOND_HAND_DEALER) {
$vehicles = $this->vehicleRepository->getUsedByDealer($Dealer);
} else {
$vehicles = $this->vehicleRepository->getNewByDealer($Dealer);
}
$withoutGroup = $Request->request->get('withoutGroup');
/** @var Vehicle $vehicle */
foreach ($vehicles as $vehicle) {
$vehicleModel = $this->vehicleFactory->createByEntity($vehicle);
if (!$vehicleModel || $vehicleModel->isSold()) {
continue;
}
if (!$withoutGroup && !$vehicleModel->getCategory()) {
continue;
}
$groupId = $withoutGroup ? 'all' : $vehicleModel->getCategory()->getId();
if (!isset($carsArray[$groupId])) {
$title = $withoutGroup ? 'all' : $vehicleModel->getCategory()->getTitle($Request->getLocale());
$carsArray[$groupId] = [
'id' => $groupId,
'title' => $title,
'cars' => [],
];
}
$carItem = [
'image' => $vehicleModel->getPreviewPath('reference'),
'image_webp' => $vehicleModel->getPreviewPathWebp('reference'),
'carName' => $vehicleModel->isUsed() ? $vehicleModel->getFullName() : $vehicleModel->getModelName(),
'priceFrom' => $vehicleModel->price(),
'position' => $vehicleModel->getPosition(),
'price' => $vehicleModel->price(),
'isUsed' => $vehicleModel->isUsed(),
'id' => $vehicleModel->getVehicleId(),
'equipments' => []
];
/** @var Equipment $equipment */
foreach ($vehicleModel->getAvailEquipments() as $equipment) {
$equipmentItem = [
'id' => $equipment->getId(),
'title' => $equipment->getTitle(),
'priceFrom' => $equipment->minPrice(),
'variations' => []
];
/** @var VehicleItem $item */
foreach ($equipment->getVehicleItems() as $item) {
if (!$item->getState()) {
continue;
}
if ($item->calcPrice() == 0) {
continue;
}
$vehicleModel = $this->vehicleFactory->createByVehicleItem($item);
$transmission = $vehicleModel->getTransmissionTypeName($Request->getLocale());
$driveUnitType = $vehicleModel->getDriveUnitTypeName($Request->getLocale());
$equipmentItem['variations'][] = [
'id' => $item->getId(),
'price' => $vehicleModel->price(),
'fuel' => $vehicleModel->getFuelTypeName($Request->getLocale()),
'drive' => $driveUnitType,
'body' => $vehicleModel->getBodyTypeName($Request->getLocale()),
'transmission' => $transmission,
'transmission_stages' => $vehicleModel->getTransmissionStages($Request->getLocale()),
];
}
if (count($equipmentItem['variations'])) {
$carItem['equipments'][] = $equipmentItem;
}
}
if (count($carItem['equipments'])) {
$carsArray[$groupId]['cars'][] = $carItem;
}
}
foreach ($carsArray as $group => $item) {
if (count($item['cars']) == 0) {
unset($carsArray[$group]);
continue;
}
usort($carsArray[$group]['cars'], fn($a, $b) => $a['position'] <=> $b['position']);
}
return new JsonResponse([
'cars' => $carsArray
]);
}
public function saveForm(Request $Request, TokenStorageInterface $tokenStorage): JsonResponse
{
$id = $Request->request->get('car');
$Vehicle = false;
if ($id) {
$Vehicle = $this->vehicleFactory->createById($id);
}
$dealerId = $Request->request->get('dealer');
if ($dealerId) {
$Dealer = $this->em->getRepository(Dealer::class)->find($dealerId);
} else {
$Dealer = $this->getDealer();
}
$Token = $tokenStorage->getToken();
$User = $Token && $Token->getUser() != 'anon.' ? $Token->getUser() : null;
$orderInsurance = new Forms();
$orderInsurance->setUser($User);
$orderInsurance->setDateCreate(new DateTime());
$orderInsurance->setType(FormManager::TYPE_ORDER_INSURANCE_FORM);
$orderInsurance->setName($Request->request->get('name'));
$orderInsurance->setEmail($Request->request->get('email'));
$orderInsurance->setPhone($Request->request->get('phone'));
$orderInsurance->setVehicle($Vehicle->getVehicleEntity());
$orderInsurance->setDealer($Dealer);
$params = json_encode([
'options' => $Request->request->get('options'),
'price' => $Request->request->get('price'),
'amount' => $Request->request->get('amount'),
'model' => $Vehicle->getFullName(),
'insuranceType' => OrderInsuranceType::CASCO_ORDER_INSURANCE,
'message' => $Request->request->get('message')
]);
$orderInsurance->setData($params);
$this->em->persist($orderInsurance);
$this->em->flush();
return new JsonResponse(['success' => true]);
}
}