src/DcSiteBundle/Services/AccessoryShopService.php line 455

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Services;
  3. use CoreBundle\Entity\AccessoriesReview;
  4. use CoreBundle\Entity\Dealer;
  5. use CoreBundle\Entity\Featured;
  6. use CoreBundle\Entity\Model;
  7. use CoreBundle\Entity\User;
  8. use CoreBundle\Services\MediaExtensionVidi;
  9. use DateTime;
  10. use DcSiteBundle\Entity\AccessoryWorkGroup;
  11. use DcSiteBundle\Entity\FuelTypes;
  12. use DcSiteBundle\Entity\ServiceVariation;
  13. use DcSiteBundle\Entity\ServiceWork;
  14. use DcSiteBundle\Entity\ServiceWorkGroup;
  15. use DcSiteBundle\Entity\ServiceWorkJob;
  16. use DcSiteBundle\Entity\ServiceWorkPart;
  17. use DcSiteBundle\Model\Pagination;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  21. use Symfony\Component\Routing\RouterInterface;
  22. class AccessoryShopService
  23. {
  24.     const PRE_PAGES 12;
  25.     const PAGINATION_BUTTON 5;
  26.     const PARAMS = [
  27.         'dealer',
  28.         'brand',
  29.         'model',
  30.         'fuel',
  31.         'year'
  32.     ];
  33.     const ACCESSORY_GROUP_UID 'a2435bdf-383c-11ee-9e83-005056a78c28';
  34.     public const ACCESSORY_UID 'eb2b75eb-4a5d-11ef-ac14-005056a799b6';
  35.     private EntityManagerInterface $em;
  36.     private RouterInterface $router;
  37.     private RequestStack $requestStack;
  38.     private Pagination $pagination;
  39.     private MediaExtensionVidi $mediaExtension;
  40.     public function __construct(EntityManagerInterface $emRouterInterface $routerRequestStack $requestStackPagination $paginationMediaExtensionVidi $mediaExtensionVidi)
  41.     {
  42.         $this->em $em;
  43.         $this->router $router;
  44.         $this->requestStack $requestStack;
  45.         $this->pagination $pagination;
  46.         $this->mediaExtension $mediaExtensionVidi;
  47.     }
  48.     public function getAccessoryCatalog(Dealer $dealer): array
  49.     {
  50.         $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUid(self::ACCESSORY_UID);
  51.         $filterParams $this->getAccessoryFilterParams();
  52.         $accessoryModel $this->getModels($dealer$serviceWorkGroup);
  53.         if ($filterParams['search']) {
  54.             $accessories $this->getAccessoryBySearch($dealer$filterParams['search']);
  55.         } else {
  56.             $accessories $this->getAccessoryByCategory($dealer$serviceWorkGroup$filterParams['filters']);
  57.         }
  58.         $accessoryCount count($accessories);
  59.         $accessoryCategories $this->getChildCategory($dealer$serviceWorkGroup$filterParams['filters']);
  60.         $pagination $this->pagination->initPagination($accessoryCountself::PRE_PAGESself::PAGINATION_BUTTON);
  61.         $accessories $this->paginationAccessory($accessories);
  62.         $categoryParams = [
  63.             'dealerId' => $dealer->getId(),
  64.             'categoryUrl' => $serviceWorkGroup->getUrl(),
  65.             'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
  66.         ];
  67.         $categoryParams array_merge($categoryParams$filterParams['filters']);
  68.         return [
  69.             'category' => $serviceWorkGroup,
  70.             'accessoryModel' => $this->serializeVehicleModels($accessoryModel),
  71.             'accessoryCategories' => $accessoryCategories,
  72.             'accessories' => $accessories,
  73.             'accessoryCount' => $accessoryCount,
  74.             'pagination' => $pagination,
  75.             'filterParams' => $filterParams,
  76.             'baseParams' => $categoryParams,
  77.         ];
  78.     }
  79. public function serializeVehicleModels(array $models)
  80.     {
  81.         $newModels = [];
  82.         foreach ($models as $model) {
  83.             $newModels[] = [
  84.                 'id' => $model->getId(),
  85.                 'state' => $model->getState(),
  86.                 'title' => $model->getTitle(),
  87.                 'brand' => $model->getBrand(),
  88.                 'crm_name' => $model->getCrmName(),
  89.                 'testdrive' => $model->getTestdrive(),
  90.                 'position' => $model->getPosition(),
  91.                 'crm_id' => $model->getCrmId(),
  92.                 'uid_1c' => $model->getUid1c(),
  93.                 'vehicle_type' => $model->getVehicleType(),
  94.                 'vehicles' => $model->getVehicles(),
  95.                 'is_autocreate' => $model->getIsAutocreate(),
  96.                 'url' => $model->getUrl(),
  97.                 'image_hash' => $model->getImageHash(),
  98.                 'image' =>  $this->mediaExtension->getPath($model->getImage(), 'reference'),
  99.                 'ria_id' => $model->getRiaId(),
  100.                 'service_variations' => $model->getServiceVariations(),
  101.             ];
  102.         }
  103.         return $newModels;
  104.     }
  105.     public function getAccessoryCategory(Dealer $dealer): array
  106.     {
  107.         $request $this->requestStack->getCurrentRequest();
  108.         $categoryUrl $request->get('categoryUrl');
  109.         $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
  110.         if (!$serviceWorkGroup) {
  111.             throw new NotFoundHttpException('category accessory not exists');
  112.         }
  113.         $filterParams $this->getAccessoryFilterParams();
  114.         $accessoryModel $this->getModels($dealer$serviceWorkGroup);
  115.         $accessories $this->getAccessoryByCategory($dealer$serviceWorkGroup$filterParams['filters']);
  116.         $accessoryCount count($accessories);
  117.         $accessoryCategories $this->getChildCategory($dealer$serviceWorkGroup$filterParams['filters']);
  118.         $pagination $this->pagination->initPagination($accessoryCountself::PRE_PAGESself::PAGINATION_BUTTON);
  119.         $accessories $this->paginationAccessory($accessories);
  120.         $breadcrumbs $serviceWorkGroup->getParentNodes();
  121.         krsort($breadcrumbs);
  122.         $categoryParams = [
  123.             'dealerId' => $dealer->getId(),
  124.             'categoryUrl' => $categoryUrl,
  125.             'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
  126.         ];
  127.         $categoryParams array_merge($categoryParams$filterParams['filters']);
  128.         return [
  129.             'category' => $serviceWorkGroup,
  130.             'accessories' => $accessories,
  131.             'accessoryCount' => $accessoryCount,
  132.             'accessoryCategories' => $accessoryCategories,
  133.             'accessoryModel' => $this->serializeVehicleModels($accessoryModel),
  134.             'breadcrumbs' => $breadcrumbs,
  135.             'pagination' => $pagination,
  136.             'baseParams' => $categoryParams,
  137.             'filterParams' => $filterParams,
  138.         ];
  139.     }
  140.     public function getAccessoryModel(Dealer $dealer): array
  141.     {
  142.         $request $this->requestStack->getCurrentRequest();
  143.         $modelUrl $request->get('modelUrl');
  144.         $categoryUrl $request->get('categoryUrl');
  145.         $model $this->em->getRepository(Model::class)->getModelOneByDealerAndModelUrl($dealer$modelUrl);
  146.         if (!$model) {
  147.             throw new NotFoundHttpException('accessory by model not exists');
  148.         }
  149.         if ($categoryUrl) {
  150.             $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
  151.         } else {
  152.             $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUid(self::ACCESSORY_UID);
  153.         }
  154.         if (!$serviceWorkGroup) {
  155.             throw new NotFoundHttpException('serviceWorkGroup not exists');
  156.         }
  157.         $filterParams $this->getAccessoryFilterParams();
  158.         $accessories $this->getAccessoryByModel($dealer$model$serviceWorkGroup$filterParams['filters']);
  159.         $accessoryCount count($accessories);
  160.         $accessoryCategories $this->getChildCategory($dealer$serviceWorkGroup$filterParams['filters']);
  161.         $pagination $this->pagination->initPagination($accessoryCountself::PRE_PAGESself::PAGINATION_BUTTON);
  162.         $accessories $this->paginationAccessory($accessories);
  163.         $categoryParams = [
  164.             'dealerId' => $dealer->getId(),
  165.             'categoryId' => $serviceWorkGroup->getId(),
  166.             'modelUrl' => $modelUrl,
  167.             'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
  168.         ];
  169.         $categoryParams array_merge($categoryParams$filterParams['filters']);
  170.         $variationsArray $this->getVariationsByModelId($dealer$request->getLocale(), $model->getId());
  171.         return [
  172.             'category' => $serviceWorkGroup,
  173.             'model' => $model,
  174.             'accessories' => $accessories,
  175.             'accessoryCount' => $accessoryCount,
  176.             'accessoryCategories' => $accessoryCategories,
  177.             'pagination' => $pagination,
  178.             'baseParams' => $categoryParams,
  179.             'filterParams' => $filterParams,
  180.             'modelVariations' => $variationsArray,
  181.         ];
  182.     }
  183.     public function getVariationsByModelId(Dealer $dealer$locale$variationId)
  184.     {
  185.         $variations $this->em->getRepository(ServiceVariation::class)
  186.             ->findBy(['dealer' => $dealer'model' => $variationId'is_delete' => [0,null]], ['year_from' => 'ASC']);
  187.         $variationsArray = [];
  188.         /** @var ServiceVariation $variation */
  189.         foreach ($variations as $variation) {
  190.             $hasRegulation false;
  191.             /** @var ServiceWork $work */
  192.             foreach ($variation->getServiceWorks() as $work) {
  193.                 if($work->getIsRegulations()) {
  194.                     $hasRegulation true;
  195.                 }
  196.             }
  197.             if(!$hasRegulation) {
  198.                 continue;
  199.             }
  200.             $key $variation->getYearFrom() . ' - ' . ($variation->getYearTo() ?: '...');
  201.             if (!isset($variationsArray[$key])) {
  202.                 $variationsArray[$key] = [
  203.                     'id' => $variation->getId(),
  204.                     'period' => $key,
  205.                     'from' => $variation->getYearFrom(),
  206.                     'to' => $variation->getYearTo() ?: (int)(new DateTime())->format('Y'),
  207.                     'image' => null,
  208.                     'image_webp' => null,
  209.                     'items' => [],
  210.                 ];
  211.             }
  212.             $vImage $variation->getImage();
  213.             if (!$variationsArray[$key]['image'] && $vImage) {
  214.                 $variationsArray[$key]['image'] = $this->mediaExtension->getPath($vImage'reference');
  215.                 $variationsArray[$key]['image_webp'] = $this->mediaExtension->pathWebp($vImage'reference');
  216.             } else if (!$variationsArray[$key]['image']) {
  217.                 $variationsArray[$key]['image'] = $this->mediaExtension->getPath($dealer->getBrand()->getLogo(), 'reference');
  218.                 $variationsArray[$key]['image_webp'] = $this->mediaExtension->pathWebp($dealer->getBrand()->getLogo(), 'reference');
  219.             }
  220.             $fuel $variation->getFuelType() ? $variation->getFuelType()->getValue($locale) : '';
  221.             $volume $variation->getEngineVolume();
  222.             if($volume 200) {
  223.                 $volume number_format(round($volume/10001), 1'.','');
  224.             }
  225.             $power $variation->getPower();
  226.             $transmission $variation->getTransmissionType() ? $variation->getTransmissionType()->getValue($locale) : false;
  227.             if($transmission && $variation->getTransmissionStepCount()) {
  228.                 $transmission .= ', '.$variation->getTransmissionStepCount().' ст.';
  229.             }
  230.             $variationsArray[$key]['items'][] = [
  231.                 'id' => $variation->getId(),
  232.                 'fuel' => $fuel,
  233.                 'volume' => $volume,
  234.                 'engineName' => $variation->getEngineName(),
  235.                 'emission' => $variation->getEmission(),
  236.                 'power' => $power,
  237.                 'trans' => $transmission,
  238.                 'drive' => $variation->getDriveUnit() ? $variation->getDriveUnit()->getValue($locale) : false,
  239.                 'description' => $variation->getDescription(),
  240.             ];
  241.             foreach ($variationsArray as &$variationPeriod) {
  242.                 usort($variationPeriod['items'], fn($item1$item2) => $item1['drive'] <=> $item2['drive']);
  243.                 usort($variationPeriod['items'], fn($item1$item2) => $item1['trans'] <=> $item2['trans']);
  244.                 usort($variationPeriod['items'], fn($item1$item2) => $item1['volume'] <=> $item2['volume']);
  245.             }
  246.         }
  247.         return $variationsArray;
  248.     }
  249.     public function getAccessoryModelAndVariation(Dealer $dealer)
  250.     {
  251.         $request $this->requestStack->getCurrentRequest();
  252.         $modelUrl $request->get('modelUrl');
  253.         $categoryUrl $request->get('categoryUrl');
  254.         $variationId $request->get('variationId');
  255.         $model $this->em->getRepository(Model::class)->getModelOneByDealerAndModelUrl($dealer$modelUrl);
  256.         if(!$model) {
  257.             throw new NotFoundHttpException('accessory by model not exists');
  258.         }
  259.         $variation $this->em->getRepository(ServiceVariation::class)
  260.             ->find(['id' => $variationId]);
  261.         if($variationId && !$variation) {
  262.             throw new NotFoundHttpException('accessory by variation not exists');
  263.         }
  264.         if($categoryUrl){
  265.             $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
  266.         }else{
  267.             $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUid(self::ACCESSORY_UID);
  268.         }
  269.         if(!$serviceWorkGroup) {
  270.             throw new NotFoundHttpException('serviceWorkGroup not exists');
  271.         }
  272.         $filterParams $this->getAccessoryFilterParams();
  273.         $accessories $this->getAccessoryByModelAndVariation($dealer$model$serviceWorkGroup$filterParams['filters'], $variation);
  274.         $accessoryCount count($accessories);
  275.         $accessoryCategories $this->getChildCategory($dealer$serviceWorkGroup$filterParams['filters']);
  276.         $pagination $this->pagination->initPagination($accessoryCountself::PRE_PAGESself::PAGINATION_BUTTON);
  277.         $accessories $this->paginationAccessory($accessories);
  278.         $categoryParams = [
  279.             'dealerId' => $dealer->getId(),
  280.             'categoryId' => $serviceWorkGroup->getId(),
  281.             'modelUrl' => $modelUrl,
  282.             'isMainCategory' => $serviceWorkGroup->getUid() == self::ACCESSORY_UID,
  283.         ];
  284.         $categoryParams array_merge($categoryParams$filterParams['filters']);
  285.         return[
  286.             'category' => $serviceWorkGroup,
  287.             'variation' => [
  288.                 'id' => $variation->getId(),
  289.                 'years' => $variation->getYearFrom() . ' - ' . ($variation->getYearTo() ?: '...'),
  290.             ],
  291.             'model' => $model,
  292.             'accessories' => $accessories,
  293.             'accessoryCount' => $accessoryCount,
  294.             'accessoryCategories' => $accessoryCategories,
  295.             'pagination' => $pagination,
  296.             'baseParams' => $categoryParams,
  297.             'filterParams' => $filterParams,
  298.         ];
  299.     }
  300. public function serializeVariations(array $variations)
  301.     {
  302.         foreach ($variations as $variation) {
  303.             $serializedVariations[] = [
  304.               'id' => $variation->getId(),
  305.               'title' => $variation->getYearFrom() . ' - ' . ($variation->getYearTo() ? $variation->getYearTo() : '...'),
  306.               'image' =>  $this->mediaExtension->getPath($variation->getImage(), 'reference'),
  307.             ];
  308.         }
  309.         return $serializedVariations;
  310.     }
  311.     public function getAccessoryPage(Dealer $dealer): array
  312.     {
  313.         $request $this->requestStack->getCurrentRequest();
  314.         $workId $request->get('workId');
  315.         $accessory $this->initAccessory($dealer$workId);
  316.         /** @var ServiceWork $work */
  317.         $work $this->em->getRepository(ServiceWork::class)->find($workId);
  318.         if (!$work) {
  319.             throw new NotFoundHttpException('accessory not exists');
  320.         }
  321.         $breadcrumbs $this->getAccessoryBreadcrumbs($work);
  322.         return [
  323.             'accessory' => $accessory,
  324.             'breadcrumbs' => $breadcrumbs,
  325.         ];
  326.     }
  327.     /**
  328.      * @param Dealer $dealer
  329.      * @return array
  330.      */
  331.     public function getModels(Dealer $dealerServiceWorkGroup $serviceWorkGroup): array
  332.     {
  333.         $dealerId $dealer->getId();
  334.         return $this->em->getRepository(Model::class)->getModelWithAccessories($dealer$serviceWorkGroup$dealerId == 33 'position' 'title');
  335.     }
  336.     public function getAccessoryByCategory(Dealer $dealerServiceWorkGroup $serviceWorkGroup$params)
  337.     {
  338.         $serviceWorks $this->em->getRepository(ServiceWork::class)->getAccessoryByCategory($dealer$serviceWorkGroup$params);
  339.         $accessories = [];
  340.         /** @var ServiceWork $work */
  341.         foreach ($serviceWorks as $work) {
  342.             $accessories[] = $this->getAccessory($work);
  343.         }
  344.         return $this->getFilterAccessory($accessories);
  345.     }
  346.     public function getAccessoryByDealer(Dealer $dealer): array
  347.     {
  348.         $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->findOneBy(['uid' => self::ACCESSORY_UID]);
  349.         $serviceWorks $this->em->getRepository(ServiceWork::class)->getAccessoryByCategory($dealer$serviceWorkGroup);
  350.         $accessories = [];
  351.         /** @var ServiceWork $work */
  352.         foreach ($serviceWorks as $work) {
  353.             $accessories[] = $this->getAccessory($work);
  354.         }
  355.         return $accessories;
  356.     }
  357.     public function getAccessoryBySearch(Dealer $dealer$search)
  358.     {
  359.         $serviceWorks $this->em->getRepository(ServiceWork::class)->getAccessoryBySearch($dealer$search);
  360.         $accessories = [];
  361.         /** @var ServiceWork $work */
  362.         foreach ($serviceWorks as $work) {
  363.             $accessories[] = $this->getAccessory($work);
  364.         }
  365.         return $this->getFilterAccessory($accessories);
  366.     }
  367.     public function getAccessoryByModel(Dealer $dealerModel $modelServiceWorkGroup $serviceWorkGroup$params)
  368.     {
  369.         $serviceWorks $this->em->getRepository(ServiceWork::class)->getAccessoryByModel($dealer$model$serviceWorkGroup$params);
  370.         $accessories = [];
  371.         /** @var ServiceWork $work */
  372.         foreach ($serviceWorks as $work) {
  373.             $accessories[] = $this->getAccessory($work);
  374.         }
  375.         return $this->getFilterAccessory($accessories);
  376.     }
  377.     public function getAccessoryByModelAndVariation(Dealer $dealerModel $modelServiceWorkGroup $serviceWorkGroup$params$variation)
  378.     {
  379.         $serviceWorks $this->em->getRepository(ServiceWork::class)->getAccessoryByModelAndVariation($dealer$model$serviceWorkGroup$params$variation->getId());
  380.         $accessories = [];
  381.         /** @var ServiceWork $work */
  382.         foreach ($serviceWorks as $work) {
  383.             $accessories[] = $this->getAccessory($work);
  384.         }
  385.         return $this->getFilterAccessory($accessories);
  386.     }
  387.     public function getChildCategory(Dealer $dealerServiceWorkGroup $serviceWorkGroup$params)
  388.     {
  389.         $category = [];
  390.         $result $this->em->getRepository(AccessoryWorkGroup::class)->getAccessoryCategoryByFilter($dealer$serviceWorkGroup$params);
  391.         /** @var AccessoryWorkGroup $item */
  392.         foreach ($result as $item) {
  393.             $category[$item->getGroup()->getId()] = $item->getGroup();
  394.         }
  395.         return $category;
  396.     }
  397.     public function getAccessoryCategoryByModel(Dealer $dealerModel $model): array
  398.     {
  399.         $category = [];
  400.         $result $this->em->getRepository(AccessoryWorkGroup::class)->getAccessoryCategoryByModel($dealer$model);
  401.         /** @var AccessoryWorkGroup $item */
  402.         foreach ($result as $item) {
  403.             if (!isset($category[$item->getGroup()->getId()])) {
  404.                 $category[$item->getGroup()->getId()] = $item->getGroup();
  405.             }
  406.         }
  407.         return $category;
  408.     }
  409.     public function initAccessory(Dealer $dealer$partId): array
  410.     {
  411.         $request $this->requestStack->getCurrentRequest();
  412.         $locale $request->getLocale();
  413.         $serviceWork $this->em->getRepository(ServiceWork::class)->findOneBy(['id' => $partId'dealer' => $dealer]);
  414.         if (!$serviceWork) {
  415.             throw new NotFoundHttpException('product accessory not exists');
  416.         }
  417.         return $this->getAccessory($serviceWork$locale);
  418.     }
  419.     public function getAccessory(ServiceWork $serviceWork$locale 'ua'): array
  420.     {
  421.         if ($serviceWork->getImage()) {
  422.             $image $serviceWork->getImage();
  423.         } elseif ($serviceWork->getGallery()) {
  424.             $galleryItems $serviceWork->getGallery()->getGalleryItems();
  425.             if ($galleryItems->first()) {
  426.                 $image $galleryItems->first()->getMedia();
  427.             }
  428.         }
  429.         if (empty($image)) {
  430.             $image $serviceWork->getDealer()->getBrand()->getLogo();
  431.         }
  432.         $accessories = [
  433.             'id' => $serviceWork->getId(),
  434.             'title' => $serviceWork->getTitle(),
  435.             'url' => $serviceWork->getUrl(),
  436.             'pricePart' => 0,
  437.             'priceJob' => 0,
  438.             'salePrice' => 0,
  439.             'salePricePart' => 0,
  440.             'isSale' => false,
  441.             'price' => 0,
  442.             'count' => 0,
  443.             'image' => $image,
  444.             'gallery' => $serviceWork->getGallery(),
  445.             'partId' => '',
  446.             'partNumber' => '',
  447.             'numberParts' => [],
  448.             'variations' => [],
  449.             'models' => [],
  450.             'dealer' => $serviceWork->getDealer(),
  451.             'description' => $serviceWork->getDescription($locale),
  452.             'review' => [
  453.                 'allGrade' => 0,
  454.                 'avg' => 5,
  455.                 'count' => count($serviceWork->getReview()) ?: 1,
  456.             ],
  457.             'position' => $serviceWork->getPosition(),
  458.             'vendorCode' => $serviceWork->getArticul(),
  459.             'isFeatured' => false,
  460.             'inSetPart' => [],
  461.             'noInSetPart' => [],
  462.             'advertise' => $serviceWork->getAdvertise(),
  463.         ];
  464.         /** @var ServiceVariation $variation */
  465.         foreach ($serviceWork->getVariations() as $variation) {
  466.             $accessories['variations'][] = $variation->getId();
  467.             $model $variation->getModel();
  468.             foreach ($model->getBrand()->getDealer() as $itemDealer) {
  469.                 if (!isset($accessories['models'][$model->getId()]) && $itemDealer === $serviceWork->getDealer()) {
  470.                     $accessories['models'][$model->getId()] = $model->getTitle();
  471.                 }
  472.             }
  473.         }
  474.         $priceParts 0;
  475.         $salePriceParts 0;
  476.         $hasSet false;
  477.         $countPart = [
  478.             'countPartInSet' => [],
  479.             'countPartNoInSet' => [],
  480.         ];
  481.         /** @var ServiceWorkPart $part */
  482.         foreach ($serviceWork->getParts() as $part) {
  483.             $count $part->getCount();
  484.             $unitCentsWithDiscount = (int)round(($part->getPrice() + $part->getDiscountPrice()) * 100);
  485.             $amountWithDiscount $unitCentsWithDiscount $count 100;
  486.             $unitCentsWithoutDiscount = (int)round($part->getPrice() * 100);
  487.             $amountWithoutDiscount $unitCentsWithoutDiscount $count 100;
  488.             if ($part->getInSet()) {
  489.                 $hasSet true;
  490.                 $accessories['pricePart'] += $amountWithDiscount;
  491.                 $accessories['salePricePart'] += $amountWithoutDiscount;
  492.                 $accessories['inSetPart'][] = $part;
  493.                 $countPart['countPartInSet'][] = $part->getPart()->getCount();
  494.             } else {
  495.                 $priceParts += $amountWithDiscount;
  496.                 $salePriceParts += $amountWithoutDiscount;
  497.                 $accessories['priceJob'] += $amountWithoutDiscount;
  498.                 $accessories['noInSetPart'][] = $part;
  499.                 $countPart['countPartNoInSet'][] = $part->getPart()->getCount();
  500.             }
  501.         }
  502.         if ($hasSet && !empty($countPart['countPartInSet'])) {
  503.             $accessories['count'] = min($countPart['countPartInSet']);
  504.         }
  505.         if (!$hasSet && !empty($countPart['countPartNoInSet'])) {
  506.             $accessories['count'] = min($countPart['countPartNoInSet']);
  507.         }
  508.         if (empty($countPart['countPartInSet']) && empty($countPart['countPartNoInSet'])) {
  509.             $accessories['count'] = 1;
  510.         }
  511.         $jobs $serviceWork->getJobs();
  512.         if (!$hasSet && count($serviceWork->getParts())) {
  513.             $accessories['pricePart'] = $priceParts;
  514.             $accessories['salePricePart'] = $salePriceParts;
  515.             if (count($jobs)) {
  516.                 $accessories['priceJob'] -= $priceParts;
  517.             } else {
  518.                 $accessories['priceJob'] = 0;
  519.             }
  520.         }
  521.         /** @var ServiceWorkJob $job */
  522.         foreach ($jobs as $job) {
  523.             $accessories['priceJob'] += $job->getPrice();
  524.         }
  525.         if (count($serviceWork->getReview())) {
  526.             /** @var AccessoriesReview $review */
  527.             foreach ($serviceWork->getReview() as $review) {
  528.                 $accessories['review']['allGrade'] += $review->getGrade();
  529.             }
  530.             $accessories['review']['avg'] = $accessories['review']['allGrade'] / count($serviceWork->getReview());
  531.         }
  532.         /** @var ServiceWorkPart $part */
  533.         $sourceArray = !empty($accessories['inSetPart']) ? $accessories['inSetPart'] : $accessories['noInSetPart'];
  534.         foreach ($sourceArray as $part) {
  535.             $accessories['numberParts'][] = $part->getPart()->getNumber();
  536.         }
  537.         if (!count($serviceWork->getParts())) {
  538.             $accessories['jobOnly'] = true;
  539.             $accessories['pricePart'] = $accessories['priceJob'];
  540.             $accessories['priceJob'] = 0;
  541.         }
  542.         $accessories['isSale'] = ($accessories['salePricePart'] < $accessories['pricePart'] && $accessories['salePricePart'] > 0);
  543.         $accessories['price'] = ($accessories['isSale']) ? $accessories['salePricePart'] : $accessories['pricePart'];
  544.         return $accessories;
  545.     }
  546.     public function getAccessoryFilterParams(): array
  547.     {
  548.         $request $this->requestStack->getCurrentRequest();
  549.         $params $request->query->all();
  550.         $filters = [];
  551.         foreach ($params as $key => $param) {
  552.             if (in_array($keyself::PARAMS)) {
  553.                 $filters[$key] = $param;
  554.             }
  555.         }
  556.         return [
  557.             'filters' => $filters,
  558.             'search' => $params['search'] ?? null,
  559.             'page' => $params['page'] ?? null,
  560.             'sort' => $params['sort'] ?? null,
  561.         ];
  562.     }
  563.     public function initInstallationAccessory($id)
  564.     {
  565.         $serviceWork $this->em->getRepository(ServiceWork::class)->find($id);
  566.         $addWorkBasket = [
  567.             'installation' => null,
  568.             'notInstallation' => [
  569.                 'workId' => $serviceWork->getId(),
  570.                 'withJob' => false,
  571.                 'dealerId' => $serviceWork->getDealer()->getId(),
  572.             ],
  573.         ];
  574.         if (!count($serviceWork->getParts())) {
  575.             return $addWorkBasket;
  576.         }
  577.         if ($serviceWork->getVariations()) {
  578.             foreach ($serviceWork->getVariations() as $variation) {
  579.                 $modelId $variation->getModel()->getId();
  580.                 $variationId $variation->getId();
  581.                 if (!isset($addWorkBasket['installation'][$modelId])) {
  582.                     $addWorkBasket['installation'][$modelId] = [
  583.                         'title' => $variation->getModel()->getTitle(),
  584.                         'model' => [],
  585.                     ];
  586.                 }
  587.                 $addWorkBasket['installation'][$modelId]['model'][$variationId] = [
  588.                     'installationPrice' => 0,
  589.                     'variation' => $variation,
  590.                     'dataBasket' => [
  591.                         'workId' => $serviceWork->getId(),
  592.                         'withJob' => true,
  593.                         'modelId' => $modelId,
  594.                         'variationId' => $variationId,
  595.                         'dealerId' => $serviceWork->getDealer()->getId(),
  596.                     ]
  597.                 ];
  598.                 foreach ($serviceWork->getJobs() as $job) {
  599.                     $addWorkBasket['installation'][$modelId]['model'][$variationId]['installationPrice'] += $job->getPrice();
  600.                 }
  601.                 /** @var ServiceWorkPart $part */
  602.                 foreach ($serviceWork->getParts() as $part) {
  603.                     if ($part->getInSet()) {
  604.                         continue;
  605.                     }
  606.                     $addWorkBasket['installation'][$modelId]['model'][$variationId]['installationPrice'] += round(($part->getPrice() * $part->getCount()), 2);
  607.                 }
  608.             }
  609.         }
  610.         return $addWorkBasket;
  611.     }
  612.     public function initFeaturedAccessory($accessoryUser $User null)
  613.     {
  614.         $featured false;
  615.         if ($User) {
  616.             $featureds $this->em->getRepository(Featured::class)->findBy(['type' => 'accessories''user' => $User]);
  617.             foreach ($featureds as $item) {
  618.                 $data json_decode($item->getData());
  619.                 if ($data->workId == $accessory['id']) {
  620.                     $featured $item->getId();
  621.                     continue;
  622.                 }
  623.             }
  624.         }
  625.         return $featured;
  626.     }
  627.     public function getFilterAccessory($accessories)
  628.     {
  629.         $request $this->requestStack->getCurrentRequest();
  630.         switch ($request->query->get('sort')) {
  631.             case 'price-asc':
  632.                 $value array_column($accessories'price');
  633.                 array_multisort($valueSORT_ASCSORT_NUMERIC$accessories);
  634.                 break;
  635.             case 'price-desc':
  636.                 $value array_column($accessories'price');
  637.                 array_multisort($valueSORT_DESCSORT_NUMERIC$accessories);
  638.                 break;
  639.             default:
  640.                 $value array_column($accessories'position');
  641.                 array_multisort($valueSORT_ASCSORT_NUMERIC$accessories);
  642.         }
  643.         return $accessories;
  644.     }
  645.     public function paginationAccessory($accessories)
  646.     {
  647.         $request $this->requestStack->getCurrentRequest();
  648.         $currentPage $request->query->get('page') ?: 1;
  649.         $offset self::PRE_PAGES * ($currentPage 1);
  650.         $accessories array_slice($accessories$offsetself::PRE_PAGES);
  651.         return $accessories;
  652.     }
  653.     public function getAccessoryBreadcrumbs(ServiceWork $serviceWork)
  654.     {
  655.         $serviceWorkGroup $serviceWork->getGroup();
  656.         $parentServiceWorkGroup $serviceWorkGroup->getParentNodes();
  657.         $breadcrumbs $parentServiceWorkGroup;
  658.         array_unshift($breadcrumbs$serviceWorkGroup);
  659.         krsort($breadcrumbs);
  660.         return $breadcrumbs;
  661.     }
  662.     public function buildAccessoryFilter(Dealer $dealer)
  663.     {
  664.         $request $this->requestStack->getCurrentRequest();
  665.         $categoryUrl $request->get('categoryUrl');
  666.         $modelUrl $request->get('modelUrl');
  667.         $categoryId $request->get('categoryId');
  668.         $filter = [];
  669.         foreach (self::PARAMS as $param) {
  670.             $filter[$param] = null;
  671.             $params[$param] = $request->get($param);
  672.         }
  673.         if ($categoryUrl) {
  674.             $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->getGroupByUrl($categoryUrl);
  675.         } elseif ($categoryId) {
  676.             $serviceWorkGroup $this->em->getRepository(ServiceWorkGroup::class)->findOneBy(['id' => $categoryId]);
  677.         }
  678.         $selectFilter = [];
  679.         if ($params['model'] && !$modelUrl) {
  680.             $result $this->em->getRepository(Model::class)->findBy(['id' => $params['model']]);
  681.             if ($result) {
  682.                 foreach ($result as $item) {
  683.                     $selectFilter['model'][$item->getId()] = [
  684.                         'id' => $item->getId(),
  685.                         'title' => $item->getTitle(),
  686.                     ];
  687.                 }
  688.             }
  689.         }
  690.         if ($params['fuel']) {
  691.             $result $this->em->getRepository(FuelTypes::class)->findBy(['id' => $params['fuel']]);
  692.             if ($result) {
  693.                 foreach ($result as $item) {
  694.                     $selectFilter['fuel'][$item->getId()] = [
  695.                         'id' => $item->getId(),
  696.                         'title' => $item->getValueUa(),
  697.                     ];
  698.                 }
  699.             }
  700.         }
  701.         if ($params['year']) {
  702.             foreach ($params['year'] as $year) {
  703.                 $selectFilter['year'][$year] = [
  704.                     'id' => (int)$year,
  705.                     'title' => (int)$year,
  706.                 ];
  707.             }
  708.         }
  709.         if ($modelUrl) {
  710.             $modelEm $this->em->getRepository(Model::class)->findOneBy(['url' => $modelUrl]);
  711.             $params['model'] = [$modelEm->getId()];
  712.         }
  713.         if (!$serviceWorkGroup) {
  714.             return $filter;
  715.         }
  716.         $serviceVariations $this->em->getRepository(ServiceVariation::class)->getAccessoryByCreateFilter($dealer$serviceWorkGroup$params);
  717.         /** @var ServiceVariation $serviceVariation */
  718.         foreach ($serviceVariations as $serviceVariation) {
  719.             $model $serviceVariation->getModel();
  720.             $fuel $serviceVariation->getFuelType();
  721.             $filter['dealer'][$serviceVariation->getDealer()->getId()] = [
  722.                 'id' => strtolower($serviceVariation->getDealer()->getUniqueId()),
  723.                 'title' => $serviceVariation->getDealer()->getName(),
  724.             ];
  725.             $filter['brand'][$serviceVariation->getDealer()->getBrand()->getId()] = [
  726.                 'id' => $serviceVariation->getDealer()->getBrand()->getUrl(),
  727.                 'title' => $serviceVariation->getDealer()->getBrand()->getName(),
  728.             ];
  729.             if (!empty($params['model']) && !in_array($model->getId(), $params['model'])) {
  730.                 continue;
  731.             }
  732.             if ($model) {
  733.                 if (!isset($filter['model'][$model->getId()])) {
  734.                     $filter['model'][$model->getId()] = [
  735.                         'id' => $model->getId(),
  736.                         'title' => $model->getTitle(),
  737.                     ];
  738.                 }
  739.             }
  740.             if ($fuel) {
  741.                 if (!isset($filter['fuel'][$fuel->getId()])) {
  742.                     $filter['fuel'][$fuel->getId()] = [
  743.                         'id' => $fuel->getId(),
  744.                         'title' => $fuel->getValueUA(),
  745.                     ];
  746.                 }
  747.             }
  748.             $yearTo = ($serviceVariation->getYearTo() != 0) ? $serviceVariation->getYearTo() : date('Y');
  749.             for ($i $serviceVariation->getYearFrom(); $i <= $yearTo$i++) {
  750.                 $filter['year'][$i] = [
  751.                     'id' => $i,
  752.                     'title' => $i,
  753.                 ];
  754.             }
  755.         }
  756.         if (!empty($filter['model'])) {
  757.             array_multisort(array_column($filter['model'], 'title'), SORT_ASC$filter['model']);
  758.         }
  759.         if (!empty($filter['year'])) {
  760.             array_multisort(array_column($filter['year'], 'title'), SORT_DESC$filter['year']);
  761.         }
  762.         foreach ($filter as $key => $value) {
  763.             if ($filter[$key] && count($filter[$key]) < 2) {
  764.                 $filter[$key] = null;
  765.             }
  766.         }
  767.         return ['filter' => $filter'selectFilter' => $selectFilter];
  768.     }
  769.     public function buildAccessoryUrl()
  770.     {
  771.         $request $this->requestStack->getCurrentRequest();
  772.         $categoryUrl $request->get('categoryUrl');
  773.         $modelUrl $request->get('modelUrl');
  774.         $variationId $request->get('currentVariation');
  775.         $params $request->request->all();
  776.         $getParams = [];
  777.         foreach ($params as $key => $value) {
  778.             if (!in_array($keyself::PARAMS) && $value) {
  779.                 $getParams[$key][] = $value;
  780.             } elseif (in_array($keyself::PARAMS)) {
  781.                 $getParams[$key] = array_keys($value);
  782.             }
  783.         }
  784.         if ($variationId && $categoryUrl && $modelUrl ) {
  785.             $getParams['variationId'] = $variationId;
  786.             $getParams['modelUrl'] = $modelUrl;
  787.             $getParams['categoryUrl'] = $categoryUrl;
  788.             $routeName 'shop_accessory_category_model_variation';
  789.         } elseif($variationId && !$categoryUrl){
  790.             $getParams['variationId'] = $variationId;
  791.             $getParams['modelUrl'] = $modelUrl;
  792.             $routeName 'shop_accessory_model_variation';
  793.         } elseif ($categoryUrl && $modelUrl) {
  794.             $getParams['categoryUrl'] = $categoryUrl;
  795.             $getParams['modelUrl'] = $modelUrl;
  796.             unset($getParams['model']);
  797.             $routeName 'shop_accessory_model';
  798.         } elseif ($categoryUrl) {
  799.             $getParams['categoryUrl'] = $categoryUrl;
  800.             $routeName 'shop_accessory_category';
  801.         } elseif ($modelUrl) {
  802.             $getParams['modelUrl'] = $modelUrl;
  803.             unset($getParams['model']);
  804.             $routeName 'shop_accessory_model';
  805.         } else {
  806.             $routeName 'shop_accessory_catalog';
  807.         }
  808.         $getParams['sort'] = current($getParams['sort']);
  809.         $url $this->router->generate($routeName$getParams);
  810.         return $url;
  811.     }
  812.     public function buildCategoryUrlByVariation(Dealer $dealer)
  813.     {
  814.         $request $this->requestStack->getCurrentRequest();
  815.         $uidVariation $request->get('variation');
  816.         $serviceVariation $this->em->getRepository(ServiceVariation::class)->findOneBy(['uid_1c' => $uidVariation]);
  817.         if (!$serviceVariation) {
  818.             return $this->router->generate('shop_accessory_catalog');
  819.         }
  820.         $params['model'][] = $serviceVariation->getModel()->getId();
  821.         $params['fuel'][] = $serviceVariation->getFuelType()->getId();
  822.         $params['year'][] = $serviceVariation->getYearFrom();
  823.         return $this->router->generate('shop_accessory_catalog'$params);
  824.     }
  825. }