<?php
namespace PortalBundle\Controller;
use AutomarketBundle\Component\EstimateCaptcha;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Vehicles\CharacteristicValue;
use CoreBundle\Entity\Vehicles\RecommendGroup;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Model\Vehicles\Repository;
use DcSiteBundle\Model\CreditModel;
use Doctrine\ORM\EntityManagerInterface;
use PortalBundle\Model\Catalog;
use CoreBundle\Entity\Forms;
use InsuranceBundle\Model\Program;
use PortalBundle\Services\FinanceService;
use PortalBundle\Services\ServiceService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
class FinanceController extends BaseController
{
public function __construct(CoreFormFactory $coreFormFactory, RequestStack $requestStack, RouterInterface $router,
Repository $vehicleRepository, ServiceService $serviceService)
{
parent::__construct($coreFormFactory, $requestStack, $router, $vehicleRepository, $serviceService);
}
public function tradein(): Response
{
return $this->basePortalRender('@Portal/Finance/tradein.html.twig');
}
public function credit(): Response
{
return $this->basePortalRender('@Portal/Finance/new-credit.html.twig', [
'callMeForm' => $this->CoreFormFactory()
->callMeForm(new Forms(), true)
->createView(),
]);
}
public function insurance(EstimateCaptcha $estimateCaptcha): Response
{
return $this->basePortalRender('@Portal/Finance/insurance.html.twig', [
'token' => $estimateCaptcha->generateToken(),
'baseType' => Program::BASE_COEFFICIENT_TYPE,
'listType' => Program::LIST_COEFFICIENT_TYPE,
'optionType' => Program::OPTION_COEFFICIENT_TYPE,
]);
}
public function leasing(SessionInterface $session): Response
{
$token = md5(time() . 'bftsaltdre45leasing');
$session->set('leasing_form_token', $token);
return $this->basePortalRender('@Portal/Finance/leasing.html.twig', [
'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
'formToken' => $token,
]);
}
public function financeHelp(): Response
{
return $this->basePortalRender('@Portal/Finance/help.html.twig');
}
public function corporate(): Response
{
return $this->basePortalRender('@Portal/Finance/corporate.html.twig');
}
public function extendedWarranty(): Response
{
return $this->basePortalRender('@Portal/Finance/extended-warranty.html.twig', [
'warrantyForm' => $this->CoreFormFactory()->insuranceExtendForm()->createView(),
]);
}
public function business(Request $request, EntityManagerInterface $em, Catalog $catalog, SessionInterface $session, \CoreBundle\Factory\Vehicle $vehicleFactory)
{
$dealers = $em->getRepository(Dealer::class)->findBy([], ['position' => 'ASC']);
$logos = [];
$brands = [];
foreach ($dealers as $dealer) {
$Brand = $dealer->getBrand();
if (!$Brand or $Brand->getId() == 67) {
continue;
}
if (isset($brands[$Brand->getId()])) {
continue;
}
$brands[$Brand->getId()] = $Brand->getId();
$logos[] = [
'image' => $Brand->getLogo(),
'name' => $Brand->getName(),
];
}
$vehicles = [];
//TODO remove magic numbers
$toSearch = [
'pasbus' => ['type' => 'bus', 'id' => 18],
'frbus' => ['type' => 'truck', 'id' => 169],
'pickup' => ['type' => 'car', 'id' => 24],
];
$token = md5(time() . 'bftsaltdre45');
$session->set('business_form_token', $token);
foreach ($toSearch as $key => $sParams) {
$busCharValue =
$em->getRepository(CharacteristicValue::class)->find($sParams['id']);
if (!$busCharValue) {
$vehicles['lcv'][$key] = [];
continue;
}
$params = [
'dynamic' => [
$busCharValue->getCharacteristic()->getId() => [$busCharValue->getUrl() => 1],
],
];
//TODO remove magic numbers
$searchResult = $catalog->findByParams(['state' => 'new', 'type' => $sParams['type']], $params, 32);
if (!$searchResult) {
$vehicles['lcv'][$key] = [];
continue;
}
foreach ($searchResult['data'] as $veh) {
$model = $vehicleFactory->createByVehicleItem($veh[0]);
if (!$model) {
continue;
}
$vehicles['lcv'][$key][] = $model;
}
if (!isset($vehicles['lcv'][$key])) {
$vehicles['lcv'][$key] = [];
}
}
//TODO remove magic numbers
$trucks = $catalog->findByParams(['state' => 'new', 'type' => 'truck'], [], 32);
//TODO remove magic numbers
foreach ($trucks['data'] as $veh) {
$model = $vehicleFactory->createByVehicleItem($veh[0]);
if (!$model || $model->getBodyType()->getId() == 169) {
continue;
}
$vehicles['lcv']['truck'][] = $model;
}
$sortOrder = $request->get('sortOrder');
if ($sortOrder) {
switch ($sortOrder) {
case 'capacity-ASC':
usort($vehicles['lcv']['truck'], fn($a, $b) => $a->getLoadCapacity('ua') < $b->getLoadCapacity('ua') ? -1 : 1);
break;
case 'capacity-DESC':
usort($vehicles['lcv']['truck'], fn($a, $b) => $a->getLoadCapacity('ua') > $b->getLoadCapacity('ua') ? -1 : 1);
break;
case 'length-ASC':
usort($vehicles['lcv']['truck'], fn($a, $b) => $a->getBodyLength('ua') < $b->getBodyLength('ua') ? -1 : 1);
break;
case 'length-DESC':
usort($vehicles['lcv']['truck'], fn($a, $b) => $a->getBodyLength('ua') > $b->getBodyLength('ua') ? -1 : 1);
break;
case 'height-ASC':
usort($vehicles['lcv']['truck'], fn($a, $b) => $a->getBodyHeight('ua') < $b->getBodyHeight('ua') ? -1 : 1);
break;
case 'height-DESC':
usort($vehicles['lcv']['truck'], fn($a, $b) => $a->getBodyHeight('ua') > $b->getBodyHeight('ua') ? -1 : 1);
break;
}
}
//TODO remove magic numbers
$vehiclesM = $em->getRepository(Vehicle::class)
->findBy(['state' => 1, 'dealer' => 16, 'is_used' => 0, 'is_delete' => [0, null]]);
$result = [
'yamaha' => [],
'business' => [],
'top' => [],
];
foreach ($vehiclesM as $vehicle) {
$model = $vehicleFactory->createByEntity($vehicle);
if (!$model) {
continue;
}
$result['yamaha'][] = $model;
}
//TODO remove magic numbers
$topGroup = $em->getRepository(RecommendGroup::class)->find(21);
if ($topGroup) {
foreach ($topGroup->getVehicles() as $vehicle) {
$model = $vehicleFactory->createByEntity($vehicle);
if (!$model) {
continue;
}
$result['top'][] = $model;
}
}
//TODO remove magic numbers
$businessGroup = $em->getRepository(RecommendGroup::class)->find(20);
if ($businessGroup) {
foreach ($businessGroup->getVehicles() as $vehicle) {
$model = $vehicleFactory->createByEntity($vehicle);
if (!$model) {
continue;
}
$result['business'][] = $model;
}
}
return $this->basePortalRender('@Portal/Finance/business.html.twig', [
'logos' => $logos,
'formToken' => $token,
'allVehicles' => $vehicles,
'vehicles' => $result,
'baseParams' => [
'state' => 'new',
'type' => 'truck',
],
'sortOrder' => $sortOrder,
]);
}
public function creditInit(Request $request, \CoreBundle\Factory\Vehicle $vehicleFactory, EntityManagerInterface $em,
CreditModel $creditModel): JsonResponse
{
$vehicleId = $request->request->get('vehicleId');
if (!$vehicleId) {
throw new NotFoundHttpException();
}
$vehicle = $em->getRepository(Vehicle::class)->find($vehicleId);
$vehicleModel = $vehicleFactory->createByEntity($vehicle);
$programs = $creditModel->findCreditInDb($vehicleModel->getDealer(), $vehicleModel);
return $this->json($programs);
}
public function creditProgramByFirstPayment(Request $request, FinanceService $financeService): JsonResponse
{
$firstPayment = $request->request->get('firstPayment');
$monthPayment = $request->request->get('monthPayment');
$term = $request->request->get('term');
if (!$firstPayment || !$monthPayment || !$term) {
throw new NotFoundHttpException();
}
$responseData = $financeService->creditProgramWihVehicle($firstPayment, $monthPayment, $term, $request->getLocale());
return $this->json([
'success' => true,
'vehicles' => $responseData,
]);
}
public function creditProgramVehicleWithMinMaxPrice(Request $request, FinanceService $financeService): JsonResponse
{
$isUsed = (bool)($request->get('isUsed') === 'true');
$responseData = $financeService->creditProgramWihVehicleByMinPrice($isUsed, $request->getLocale());
if ($isUsed){
$responseDataNew = $financeService->creditProgramWihVehicleByMinPrice(false, $request->getLocale());
if (!empty($responseDataNew)) {
if ((int)str_replace(' ', '',$responseDataNew['max']['price']) > (int)str_replace(' ', '',$responseData['max']['price'])) {
$responseData['max'] = $responseDataNew['max'];
}
if ((int)str_replace(' ', '',$responseDataNew['min']['price']) < (int)str_replace(' ', '',$responseData['min']['price'])) {
$responseData['min'] = $responseDataNew['min'];
}
}
}
return $this->json([
'success' => true,
'vehicleWithMinPrice' => $responseData['min'],
'vehicleWithMaxPrice' => $responseData['max'],
]);
}
public function getCrmDataByUUID(Request $request, FinanceService $financeService): JsonResponse
{
$uuid = $request->get('uuid');
if (!isset($uuid) || empty($uuid)){
throw new NotFoundHttpException();
}
$crmLead = $financeService->getCrmLeadByUUID($uuid);
$isSend = $crmLead ? $crmLead->getIsSend() : false;
return $this->json(['isSend' => $isSend]);
}
public function saveCreditCalculationUserData(Request $request, FinanceService $financeService): JsonResponse
{
$calculationId = $financeService->saveCreditData($request->request->all());
return $this->json([
'success' => true,
'calculationId' => $calculationId,
]);
}
public function saveCreditPageReview(Request $request, FinanceService $financeService): JsonResponse
{
$financeService->saveReview($request->request->all());
return $this->json([
'success' => true
]);
}
}