<?php
namespace DcSiteBundle\Services;
use CoreBundle\Entity\AccessoriesReview;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Featured;
use CoreBundle\Entity\Model;
use CoreBundle\Entity\User;
use CoreBundle\Services\MediaExtensionVidi;
use DateTime;
use DcSiteBundle\Entity\AccessoryWorkGroup;
use DcSiteBundle\Entity\FuelTypes;
use DcSiteBundle\Entity\ServiceVariation;
use DcSiteBundle\Entity\ServiceWork;
use DcSiteBundle\Entity\ServiceWorkGroup;
use DcSiteBundle\Entity\ServiceWorkJob;
use DcSiteBundle\Entity\ServiceWorkPart;
use DcSiteBundle\Model\Pagination;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
class AccessoryShopService
{
const PRE_PAGES = 12;
const PAGINATION_BUTTON = 5;
const PARAMS = [
'dealer',
'brand',
'model',
'fuel',
'year'
];
const ACCESSORY_GROUP_UID = 'a2435bdf-383c-11ee-9e83-005056a78c28';
public const ACCESSORY_UID = 'eb2b75eb-4a5d-11ef-ac14-005056a799b6';
private EntityManagerInterface $em;
private RouterInterface $router;
private RequestStack $requestStack;
private Pagination $pagination;
private MediaExtensionVidi $mediaExtension;
public function __construct(EntityManagerInterface $em, RouterInterface $router, RequestStack $requestStack, Pagination $pagination, MediaExtensionVidi $mediaExtensionVidi)
{
$this->em = $em;
$this->router = $router;
$this->requestStack = $requestStack;
$this->pagination = $pagination;
$this->mediaExtension = $mediaExtensionVidi;
}
public function getAccessoryCatalog(Dealer $dealer): array
{
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUid(self::ACCESSORY_UID);
$filterParams = $this->getAccessoryFilterParams();
$accessoryModel = $this->getModels($dealer, $serviceWorkGroup);
if ($filterParams['search']) {
$accessories = $this->getAccessoryBySearch($dealer, $filterParams['search']);
} else {
$accessories = $this->getAccessoryByCategory($dealer, $serviceWorkGroup, $filterParams['filters']);
}
$accessoryCount = count($accessories);
$accessoryCategories = $this->getChildCategory($dealer, $serviceWorkGroup, $filterParams['filters']);
$pagination = $this->pagination->initPagination($accessoryCount, self::PRE_PAGES, self::PAGINATION_BUTTON);
$accessories = $this->paginationAccessory($accessories);
$categoryParams = [
'dealerId' => $dealer->getId(),
'categoryUrl' => $serviceWorkGroup->getUrl(),
'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
];
$categoryParams = array_merge($categoryParams, $filterParams['filters']);
return [
'category' => $serviceWorkGroup,
'accessoryModel' => $this->serializeVehicleModels($accessoryModel),
'accessoryCategories' => $accessoryCategories,
'accessories' => $accessories,
'accessoryCount' => $accessoryCount,
'pagination' => $pagination,
'filterParams' => $filterParams,
'baseParams' => $categoryParams,
];
}
public function serializeVehicleModels(array $models)
{
$newModels = [];
foreach ($models as $model) {
$newModels[] = [
'id' => $model->getId(),
'state' => $model->getState(),
'title' => $model->getTitle(),
'brand' => $model->getBrand(),
'crm_name' => $model->getCrmName(),
'testdrive' => $model->getTestdrive(),
'position' => $model->getPosition(),
'crm_id' => $model->getCrmId(),
'uid_1c' => $model->getUid1c(),
'vehicle_type' => $model->getVehicleType(),
'vehicles' => $model->getVehicles(),
'is_autocreate' => $model->getIsAutocreate(),
'url' => $model->getUrl(),
'image_hash' => $model->getImageHash(),
'image' => $this->mediaExtension->getPath($model->getImage(), 'reference'),
'ria_id' => $model->getRiaId(),
'service_variations' => $model->getServiceVariations(),
];
}
return $newModels;
}
public function getAccessoryCategory(Dealer $dealer): array
{
$request = $this->requestStack->getCurrentRequest();
$categoryUrl = $request->get('categoryUrl');
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
if (!$serviceWorkGroup) {
throw new NotFoundHttpException('category accessory not exists');
}
$filterParams = $this->getAccessoryFilterParams();
$accessoryModel = $this->getModels($dealer, $serviceWorkGroup);
$accessories = $this->getAccessoryByCategory($dealer, $serviceWorkGroup, $filterParams['filters']);
$accessoryCount = count($accessories);
$accessoryCategories = $this->getChildCategory($dealer, $serviceWorkGroup, $filterParams['filters']);
$pagination = $this->pagination->initPagination($accessoryCount, self::PRE_PAGES, self::PAGINATION_BUTTON);
$accessories = $this->paginationAccessory($accessories);
$breadcrumbs = $serviceWorkGroup->getParentNodes();
krsort($breadcrumbs);
$categoryParams = [
'dealerId' => $dealer->getId(),
'categoryUrl' => $categoryUrl,
'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
];
$categoryParams = array_merge($categoryParams, $filterParams['filters']);
return [
'category' => $serviceWorkGroup,
'accessories' => $accessories,
'accessoryCount' => $accessoryCount,
'accessoryCategories' => $accessoryCategories,
'accessoryModel' => $this->serializeVehicleModels($accessoryModel),
'breadcrumbs' => $breadcrumbs,
'pagination' => $pagination,
'baseParams' => $categoryParams,
'filterParams' => $filterParams,
];
}
public function getAccessoryModel(Dealer $dealer): array
{
$request = $this->requestStack->getCurrentRequest();
$modelUrl = $request->get('modelUrl');
$categoryUrl = $request->get('categoryUrl');
$model = $this->em->getRepository(Model::class)->getModelOneByDealerAndModelUrl($dealer, $modelUrl);
if (!$model) {
throw new NotFoundHttpException('accessory by model not exists');
}
if ($categoryUrl) {
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
} else {
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUid(self::ACCESSORY_UID);
}
if (!$serviceWorkGroup) {
throw new NotFoundHttpException('serviceWorkGroup not exists');
}
$filterParams = $this->getAccessoryFilterParams();
$accessories = $this->getAccessoryByModel($dealer, $model, $serviceWorkGroup, $filterParams['filters']);
$accessoryCount = count($accessories);
$accessoryCategories = $this->getChildCategory($dealer, $serviceWorkGroup, $filterParams['filters']);
$pagination = $this->pagination->initPagination($accessoryCount, self::PRE_PAGES, self::PAGINATION_BUTTON);
$accessories = $this->paginationAccessory($accessories);
$categoryParams = [
'dealerId' => $dealer->getId(),
'categoryId' => $serviceWorkGroup->getId(),
'modelUrl' => $modelUrl,
'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
];
$categoryParams = array_merge($categoryParams, $filterParams['filters']);
$variationsArray = $this->getVariationsByModelId($dealer, $request->getLocale(), $model->getId());
return [
'category' => $serviceWorkGroup,
'model' => $model,
'accessories' => $accessories,
'accessoryCount' => $accessoryCount,
'accessoryCategories' => $accessoryCategories,
'pagination' => $pagination,
'baseParams' => $categoryParams,
'filterParams' => $filterParams,
'modelVariations' => $variationsArray,
];
}
public function getVariationsByModelId(Dealer $dealer, $locale, $variationId)
{
$variations = $this->em->getRepository(ServiceVariation::class)
->findBy(['dealer' => $dealer, 'model' => $variationId, 'is_delete' => [0,null]], ['year_from' => 'ASC']);
$variationsArray = [];
/** @var ServiceVariation $variation */
foreach ($variations as $variation) {
$hasRegulation = false;
/** @var ServiceWork $work */
foreach ($variation->getServiceWorks() as $work) {
if($work->getIsRegulations()) {
$hasRegulation = true;
}
}
if(!$hasRegulation) {
continue;
}
$key = $variation->getYearFrom() . ' - ' . ($variation->getYearTo() ?: '...');
if (!isset($variationsArray[$key])) {
$variationsArray[$key] = [
'id' => $variation->getId(),
'period' => $key,
'from' => $variation->getYearFrom(),
'to' => $variation->getYearTo() ?: (int)(new DateTime())->format('Y'),
'image' => null,
'image_webp' => null,
'items' => [],
];
}
$vImage = $variation->getImage();
if (!$variationsArray[$key]['image'] && $vImage) {
$variationsArray[$key]['image'] = $this->mediaExtension->getPath($vImage, 'reference');
$variationsArray[$key]['image_webp'] = $this->mediaExtension->pathWebp($vImage, 'reference');
} else if (!$variationsArray[$key]['image']) {
$variationsArray[$key]['image'] = $this->mediaExtension->getPath($dealer->getBrand()->getLogo(), 'reference');
$variationsArray[$key]['image_webp'] = $this->mediaExtension->pathWebp($dealer->getBrand()->getLogo(), 'reference');
}
$fuel = $variation->getFuelType() ? $variation->getFuelType()->getValue($locale) : '';
$volume = $variation->getEngineVolume();
if($volume > 200) {
$volume = number_format(round($volume/1000, 1), 1, '.','');
}
$power = $variation->getPower();
$transmission = $variation->getTransmissionType() ? $variation->getTransmissionType()->getValue($locale) : false;
if($transmission && $variation->getTransmissionStepCount()) {
$transmission .= ', '.$variation->getTransmissionStepCount().' ст.';
}
$variationsArray[$key]['items'][] = [
'id' => $variation->getId(),
'fuel' => $fuel,
'volume' => $volume,
'engineName' => $variation->getEngineName(),
'emission' => $variation->getEmission(),
'power' => $power,
'trans' => $transmission,
'drive' => $variation->getDriveUnit() ? $variation->getDriveUnit()->getValue($locale) : false,
'description' => $variation->getDescription(),
];
foreach ($variationsArray as &$variationPeriod) {
usort($variationPeriod['items'], fn($item1, $item2) => $item1['drive'] <=> $item2['drive']);
usort($variationPeriod['items'], fn($item1, $item2) => $item1['trans'] <=> $item2['trans']);
usort($variationPeriod['items'], fn($item1, $item2) => $item1['volume'] <=> $item2['volume']);
}
}
return $variationsArray;
}
public function getAccessoryModelAndVariation(Dealer $dealer)
{
$request = $this->requestStack->getCurrentRequest();
$modelUrl = $request->get('modelUrl');
$categoryUrl = $request->get('categoryUrl');
$variationId = $request->get('variationId');
$model = $this->em->getRepository(Model::class)->getModelOneByDealerAndModelUrl($dealer, $modelUrl);
if(!$model) {
throw new NotFoundHttpException('accessory by model not exists');
}
$variation = $this->em->getRepository(ServiceVariation::class)
->find(['id' => $variationId]);
if($variationId && !$variation) {
throw new NotFoundHttpException('accessory by variation not exists');
}
if($categoryUrl){
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
}else{
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUid(self::ACCESSORY_UID);
}
if(!$serviceWorkGroup) {
throw new NotFoundHttpException('serviceWorkGroup not exists');
}
$filterParams = $this->getAccessoryFilterParams();
$accessories = $this->getAccessoryByModelAndVariation($dealer, $model, $serviceWorkGroup, $filterParams['filters'], $variation);
$accessoryCount = count($accessories);
$accessoryCategories = $this->getChildCategory($dealer, $serviceWorkGroup, $filterParams['filters']);
$pagination = $this->pagination->initPagination($accessoryCount, self::PRE_PAGES, self::PAGINATION_BUTTON);
$accessories = $this->paginationAccessory($accessories);
$categoryParams = [
'dealerId' => $dealer->getId(),
'categoryId' => $serviceWorkGroup->getId(),
'modelUrl' => $modelUrl,
'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
];
$categoryParams = array_merge($categoryParams, $filterParams['filters']);
return[
'category' => $serviceWorkGroup,
'variation' => [
'id' => $variation->getId(),
'years' => $variation->getYearFrom() . ' - ' . ($variation->getYearTo() ?: '...'),
],
'model' => $model,
'accessories' => $accessories,
'accessoryCount' => $accessoryCount,
'accessoryCategories' => $accessoryCategories,
'pagination' => $pagination,
'baseParams' => $categoryParams,
'filterParams' => $filterParams,
];
}
public function serializeVariations(array $variations)
{
foreach ($variations as $variation) {
$serializedVariations[] = [
'id' => $variation->getId(),
'title' => $variation->getYearFrom() . ' - ' . ($variation->getYearTo() ? $variation->getYearTo() : '...'),
'image' => $this->mediaExtension->getPath($variation->getImage(), 'reference'),
];
}
return $serializedVariations;
}
public function getAccessoryPage(Dealer $dealer): array
{
$request = $this->requestStack->getCurrentRequest();
$workId = $request->get('workId');
$accessory = $this->initAccessory($dealer, $workId);
/** @var ServiceWork $work */
$work = $this->em->getRepository(ServiceWork::class)->find($workId);
if (!$work) {
throw new NotFoundHttpException('accessory not exists');
}
$breadcrumbs = $this->getAccessoryBreadcrumbs($work);
return [
'accessory' => $accessory,
'breadcrumbs' => $breadcrumbs,
];
}
/**
* @param Dealer $dealer
* @return array
*/
public function getModels(Dealer $dealer, ServiceWorkGroup $serviceWorkGroup): array
{
$dealerId = $dealer->getId();
return $this->em->getRepository(Model::class)->getModelWithAccessories($dealer, $serviceWorkGroup, $dealerId == 33 ? 'position' : 'title');
}
public function getAccessoryByCategory(Dealer $dealer, ServiceWorkGroup $serviceWorkGroup, $params)
{
$serviceWorks = $this->em->getRepository(ServiceWork::class)->getAccessoryByCategory($dealer, $serviceWorkGroup, $params);
$accessories = [];
/** @var ServiceWork $work */
foreach ($serviceWorks as $work) {
$accessories[] = $this->getAccessory($work);
}
return $this->getFilterAccessory($accessories);
}
public function getAccessoryByDealer(Dealer $dealer): array
{
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->findOneBy(['uid' => self::ACCESSORY_UID]);
$serviceWorks = $this->em->getRepository(ServiceWork::class)->getAccessoryByCategory($dealer, $serviceWorkGroup);
$accessories = [];
/** @var ServiceWork $work */
foreach ($serviceWorks as $work) {
$accessories[] = $this->getAccessory($work);
}
return $accessories;
}
public function getAccessoryBySearch(Dealer $dealer, $search)
{
$serviceWorks = $this->em->getRepository(ServiceWork::class)->getAccessoryBySearch($dealer, $search);
$accessories = [];
/** @var ServiceWork $work */
foreach ($serviceWorks as $work) {
$accessories[] = $this->getAccessory($work);
}
return $this->getFilterAccessory($accessories);
}
public function getAccessoryByModel(Dealer $dealer, Model $model, ServiceWorkGroup $serviceWorkGroup, $params)
{
$serviceWorks = $this->em->getRepository(ServiceWork::class)->getAccessoryByModel($dealer, $model, $serviceWorkGroup, $params);
$accessories = [];
/** @var ServiceWork $work */
foreach ($serviceWorks as $work) {
$accessories[] = $this->getAccessory($work);
}
return $this->getFilterAccessory($accessories);
}
public function getAccessoryByModelAndVariation(Dealer $dealer, Model $model, ServiceWorkGroup $serviceWorkGroup, $params, $variation)
{
$serviceWorks = $this->em->getRepository(ServiceWork::class)->getAccessoryByModelAndVariation($dealer, $model, $serviceWorkGroup, $params, $variation->getId());
$accessories = [];
/** @var ServiceWork $work */
foreach ($serviceWorks as $work) {
$accessories[] = $this->getAccessory($work);
}
return $this->getFilterAccessory($accessories);
}
public function getChildCategory(Dealer $dealer, ServiceWorkGroup $serviceWorkGroup, $params)
{
$category = [];
$result = $this->em->getRepository(AccessoryWorkGroup::class)->getAccessoryCategoryByFilter($dealer, $serviceWorkGroup, $params);
/** @var AccessoryWorkGroup $item */
foreach ($result as $item) {
$category[$item->getGroup()->getId()] = $item->getGroup();
}
return $category;
}
public function getAccessoryCategoryByModel(Dealer $dealer, Model $model): array
{
$category = [];
$result = $this->em->getRepository(AccessoryWorkGroup::class)->getAccessoryCategoryByModel($dealer, $model);
/** @var AccessoryWorkGroup $item */
foreach ($result as $item) {
if (!isset($category[$item->getGroup()->getId()])) {
$category[$item->getGroup()->getId()] = $item->getGroup();
}
}
return $category;
}
public function initAccessory(Dealer $dealer, $partId): array
{
$request = $this->requestStack->getCurrentRequest();
$locale = $request->getLocale();
$serviceWork = $this->em->getRepository(ServiceWork::class)->findOneBy(['id' => $partId, 'dealer' => $dealer]);
if (!$serviceWork) {
throw new NotFoundHttpException('product accessory not exists');
}
return $this->getAccessory($serviceWork, $locale);
}
public function getAccessory(ServiceWork $serviceWork, $locale = 'ua'): array
{
if ($serviceWork->getImage()) {
$image = $serviceWork->getImage();
} elseif ($serviceWork->getGallery()) {
$galleryItems = $serviceWork->getGallery()->getGalleryItems();
if ($galleryItems->first()) {
$image = $galleryItems->first()->getMedia();
}
}
if (empty($image)) {
$image = $serviceWork->getDealer()->getBrand()->getLogo();
}
$accessories = [
'id' => $serviceWork->getId(),
'title' => $serviceWork->getTitle(),
'url' => $serviceWork->getUrl(),
'pricePart' => 0,
'priceJob' => 0,
'salePrice' => 0,
'salePricePart' => 0,
'isSale' => false,
'price' => 0,
'count' => 0,
'image' => $image,
'gallery' => $serviceWork->getGallery(),
'partId' => '',
'partNumber' => '',
'numberParts' => [],
'variations' => [],
'models' => [],
'dealer' => $serviceWork->getDealer(),
'description' => $serviceWork->getDescription($locale),
'review' => [
'allGrade' => 0,
'avg' => 5,
'count' => count($serviceWork->getReview()) ?: 1,
],
'position' => $serviceWork->getPosition(),
'vendorCode' => $serviceWork->getArticul(),
'isFeatured' => false,
'inSetPart' => [],
'noInSetPart' => [],
'advertise' => $serviceWork->getAdvertise(),
];
/** @var ServiceVariation $variation */
foreach ($serviceWork->getVariations() as $variation) {
$accessories['variations'][] = $variation->getId();
$model = $variation->getModel();
foreach ($model->getBrand()->getDealer() as $itemDealer) {
if (!isset($accessories['models'][$model->getId()]) && $itemDealer === $serviceWork->getDealer()) {
$accessories['models'][$model->getId()] = $model->getTitle();
}
}
}
$priceParts = 0;
$salePriceParts = 0;
$hasSet = false;
$countPart = [
'countPartInSet' => [],
'countPartNoInSet' => [],
];
/** @var ServiceWorkPart $part */
foreach ($serviceWork->getParts() as $part) {
$count = $part->getCount();
$unitCentsWithDiscount = (int)round(($part->getPrice() + $part->getDiscountPrice()) * 100);
$amountWithDiscount = $unitCentsWithDiscount * $count / 100;
$unitCentsWithoutDiscount = (int)round($part->getPrice() * 100);
$amountWithoutDiscount = $unitCentsWithoutDiscount * $count / 100;
if ($part->getInSet()) {
$hasSet = true;
$accessories['pricePart'] += $amountWithDiscount;
$accessories['salePricePart'] += $amountWithoutDiscount;
$accessories['inSetPart'][] = $part;
$countPart['countPartInSet'][] = $part->getPart()->getCount();
} else {
$priceParts += $amountWithDiscount;
$salePriceParts += $amountWithoutDiscount;
$accessories['priceJob'] += $amountWithoutDiscount;
$accessories['noInSetPart'][] = $part;
$countPart['countPartNoInSet'][] = $part->getPart()->getCount();
}
}
if ($hasSet && !empty($countPart['countPartInSet'])) {
$accessories['count'] = min($countPart['countPartInSet']);
}
if (!$hasSet && !empty($countPart['countPartNoInSet'])) {
$accessories['count'] = min($countPart['countPartNoInSet']);
}
if (empty($countPart['countPartInSet']) && empty($countPart['countPartNoInSet'])) {
$accessories['count'] = 1;
}
$jobs = $serviceWork->getJobs();
if (!$hasSet && count($serviceWork->getParts())) {
$accessories['pricePart'] = $priceParts;
$accessories['salePricePart'] = $salePriceParts;
if (count($jobs)) {
$accessories['priceJob'] -= $priceParts;
} else {
$accessories['priceJob'] = 0;
}
}
/** @var ServiceWorkJob $job */
foreach ($jobs as $job) {
$accessories['priceJob'] += $job->getPrice();
}
if (count($serviceWork->getReview())) {
/** @var AccessoriesReview $review */
foreach ($serviceWork->getReview() as $review) {
$accessories['review']['allGrade'] += $review->getGrade();
}
$accessories['review']['avg'] = $accessories['review']['allGrade'] / count($serviceWork->getReview());
}
/** @var ServiceWorkPart $part */
$sourceArray = !empty($accessories['inSetPart']) ? $accessories['inSetPart'] : $accessories['noInSetPart'];
foreach ($sourceArray as $part) {
$accessories['numberParts'][] = $part->getPart()->getNumber();
}
if (!count($serviceWork->getParts())) {
$accessories['jobOnly'] = true;
$accessories['pricePart'] = $accessories['priceJob'];
$accessories['priceJob'] = 0;
}
$accessories['isSale'] = ($accessories['salePricePart'] < $accessories['pricePart'] && $accessories['salePricePart'] > 0);
$accessories['price'] = ($accessories['isSale']) ? $accessories['salePricePart'] : $accessories['pricePart'];
return $accessories;
}
public function getAccessoryFilterParams(): array
{
$request = $this->requestStack->getCurrentRequest();
$params = $request->query->all();
$filters = [];
foreach ($params as $key => $param) {
if (in_array($key, self::PARAMS)) {
$filters[$key] = $param;
}
}
return [
'filters' => $filters,
'search' => $params['search'] ?? null,
'page' => $params['page'] ?? null,
'sort' => $params['sort'] ?? null,
];
}
public function initInstallationAccessory($id)
{
$serviceWork = $this->em->getRepository(ServiceWork::class)->find($id);
$addWorkBasket = [
'installation' => null,
'notInstallation' => [
'workId' => $serviceWork->getId(),
'withJob' => false,
'dealerId' => $serviceWork->getDealer()->getId(),
],
];
if (!count($serviceWork->getParts())) {
return $addWorkBasket;
}
if ($serviceWork->getVariations()) {
foreach ($serviceWork->getVariations() as $variation) {
$modelId = $variation->getModel()->getId();
$variationId = $variation->getId();
if (!isset($addWorkBasket['installation'][$modelId])) {
$addWorkBasket['installation'][$modelId] = [
'title' => $variation->getModel()->getTitle(),
'model' => [],
];
}
$addWorkBasket['installation'][$modelId]['model'][$variationId] = [
'installationPrice' => 0,
'variation' => $variation,
'dataBasket' => [
'workId' => $serviceWork->getId(),
'withJob' => true,
'modelId' => $modelId,
'variationId' => $variationId,
'dealerId' => $serviceWork->getDealer()->getId(),
]
];
foreach ($serviceWork->getJobs() as $job) {
$addWorkBasket['installation'][$modelId]['model'][$variationId]['installationPrice'] += $job->getPrice();
}
/** @var ServiceWorkPart $part */
foreach ($serviceWork->getParts() as $part) {
if ($part->getInSet()) {
continue;
}
$addWorkBasket['installation'][$modelId]['model'][$variationId]['installationPrice'] += round(($part->getPrice() * $part->getCount()), 2);
}
}
}
return $addWorkBasket;
}
public function initFeaturedAccessory($accessory, User $User = null)
{
$featured = false;
if ($User) {
$featureds = $this->em->getRepository(Featured::class)->findBy(['type' => 'accessories', 'user' => $User]);
foreach ($featureds as $item) {
$data = json_decode($item->getData());
if ($data->workId == $accessory['id']) {
$featured = $item->getId();
continue;
}
}
}
return $featured;
}
public function getFilterAccessory($accessories)
{
$request = $this->requestStack->getCurrentRequest();
switch ($request->query->get('sort')) {
case 'price-asc':
$value = array_column($accessories, 'price');
array_multisort($value, SORT_ASC, SORT_NUMERIC, $accessories);
break;
case 'price-desc':
$value = array_column($accessories, 'price');
array_multisort($value, SORT_DESC, SORT_NUMERIC, $accessories);
break;
default:
$value = array_column($accessories, 'position');
array_multisort($value, SORT_ASC, SORT_NUMERIC, $accessories);
}
return $accessories;
}
public function paginationAccessory($accessories)
{
$request = $this->requestStack->getCurrentRequest();
$currentPage = $request->query->get('page') ?: 1;
$offset = self::PRE_PAGES * ($currentPage - 1);
$accessories = array_slice($accessories, $offset, self::PRE_PAGES);
return $accessories;
}
public function getAccessoryBreadcrumbs(ServiceWork $serviceWork)
{
$serviceWorkGroup = $serviceWork->getGroup();
$parentServiceWorkGroup = $serviceWorkGroup->getParentNodes();
$breadcrumbs = $parentServiceWorkGroup;
array_unshift($breadcrumbs, $serviceWorkGroup);
krsort($breadcrumbs);
return $breadcrumbs;
}
public function buildAccessoryFilter(Dealer $dealer)
{
$request = $this->requestStack->getCurrentRequest();
$categoryUrl = $request->get('categoryUrl');
$modelUrl = $request->get('modelUrl');
$categoryId = $request->get('categoryId');
$filter = [];
foreach (self::PARAMS as $param) {
$filter[$param] = null;
$params[$param] = $request->get($param);
}
if ($categoryUrl) {
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
} elseif ($categoryId) {
$serviceWorkGroup = $this->em->getRepository(ServiceWorkGroup::class)->findOneBy(['id' => $categoryId]);
}
$selectFilter = [];
if ($params['model'] && !$modelUrl) {
$result = $this->em->getRepository(Model::class)->findBy(['id' => $params['model']]);
if ($result) {
foreach ($result as $item) {
$selectFilter['model'][$item->getId()] = [
'id' => $item->getId(),
'title' => $item->getTitle(),
];
}
}
}
if ($params['fuel']) {
$result = $this->em->getRepository(FuelTypes::class)->findBy(['id' => $params['fuel']]);
if ($result) {
foreach ($result as $item) {
$selectFilter['fuel'][$item->getId()] = [
'id' => $item->getId(),
'title' => $item->getValueUa(),
];
}
}
}
if ($params['year']) {
foreach ($params['year'] as $year) {
$selectFilter['year'][$year] = [
'id' => (int)$year,
'title' => (int)$year,
];
}
}
if ($modelUrl) {
$modelEm = $this->em->getRepository(Model::class)->findOneBy(['url' => $modelUrl]);
$params['model'] = [$modelEm->getId()];
}
if (!$serviceWorkGroup) {
return $filter;
}
$serviceVariations = $this->em->getRepository(ServiceVariation::class)->getAccessoryByCreateFilter($dealer, $serviceWorkGroup, $params);
/** @var ServiceVariation $serviceVariation */
foreach ($serviceVariations as $serviceVariation) {
$model = $serviceVariation->getModel();
$fuel = $serviceVariation->getFuelType();
$filter['dealer'][$serviceVariation->getDealer()->getId()] = [
'id' => strtolower($serviceVariation->getDealer()->getUniqueId()),
'title' => $serviceVariation->getDealer()->getName(),
];
$filter['brand'][$serviceVariation->getDealer()->getBrand()->getId()] = [
'id' => $serviceVariation->getDealer()->getBrand()->getUrl(),
'title' => $serviceVariation->getDealer()->getBrand()->getName(),
];
if (!empty($params['model']) && !in_array($model->getId(), $params['model'])) {
continue;
}
if ($model) {
if (!isset($filter['model'][$model->getId()])) {
$filter['model'][$model->getId()] = [
'id' => $model->getId(),
'title' => $model->getTitle(),
];
}
}
if ($fuel) {
if (!isset($filter['fuel'][$fuel->getId()])) {
$filter['fuel'][$fuel->getId()] = [
'id' => $fuel->getId(),
'title' => $fuel->getValueUA(),
];
}
}
$yearTo = ($serviceVariation->getYearTo() != 0) ? $serviceVariation->getYearTo() : date('Y');
for ($i = $serviceVariation->getYearFrom(); $i <= $yearTo; $i++) {
$filter['year'][$i] = [
'id' => $i,
'title' => $i,
];
}
}
if (!empty($filter['model'])) {
array_multisort(array_column($filter['model'], 'title'), SORT_ASC, $filter['model']);
}
if (!empty($filter['year'])) {
array_multisort(array_column($filter['year'], 'title'), SORT_DESC, $filter['year']);
}
foreach ($filter as $key => $value) {
if ($filter[$key] && count($filter[$key]) < 2) {
$filter[$key] = null;
}
}
return ['filter' => $filter, 'selectFilter' => $selectFilter];
}
public function buildAccessoryUrl()
{
$request = $this->requestStack->getCurrentRequest();
$categoryUrl = $request->get('categoryUrl');
$modelUrl = $request->get('modelUrl');
$variationId = $request->get('currentVariation');
$params = $request->request->all();
$getParams = [];
foreach ($params as $key => $value) {
if (!in_array($key, self::PARAMS) && $value) {
$getParams[$key][] = $value;
} elseif (in_array($key, self::PARAMS)) {
$getParams[$key] = array_keys($value);
}
}
if ($variationId && $categoryUrl && $modelUrl ) {
$getParams['variationId'] = $variationId;
$getParams['modelUrl'] = $modelUrl;
$getParams['categoryUrl'] = $categoryUrl;
$routeName = 'shop_accessory_category_model_variation';
} elseif($variationId && !$categoryUrl){
$getParams['variationId'] = $variationId;
$getParams['modelUrl'] = $modelUrl;
$routeName = 'shop_accessory_model_variation';
} elseif ($categoryUrl && $modelUrl) {
$getParams['categoryUrl'] = $categoryUrl;
$getParams['modelUrl'] = $modelUrl;
unset($getParams['model']);
$routeName = 'shop_accessory_model';
} elseif ($categoryUrl) {
$getParams['categoryUrl'] = $categoryUrl;
$routeName = 'shop_accessory_category';
} elseif ($modelUrl) {
$getParams['modelUrl'] = $modelUrl;
unset($getParams['model']);
$routeName = 'shop_accessory_model';
} else {
$routeName = 'shop_accessory_catalog';
}
$getParams['sort'] = current($getParams['sort']);
$url = $this->router->generate($routeName, $getParams);
return $url;
}
public function buildCategoryUrlByVariation(Dealer $dealer)
{
$request = $this->requestStack->getCurrentRequest();
$uidVariation = $request->get('variation');
$serviceVariation = $this->em->getRepository(ServiceVariation::class)->findOneBy(['uid_1c' => $uidVariation]);
if (!$serviceVariation) {
return $this->router->generate('shop_accessory_catalog');
}
$params['model'][] = $serviceVariation->getModel()->getId();
$params['fuel'][] = $serviceVariation->getFuelType()->getId();
$params['year'][] = $serviceVariation->getYearFrom();
return $this->router->generate('shop_accessory_catalog', $params);
}
}