src/Controller/ApiController.php line 2035

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Feedback;
  4. use App\Entity\Emails;
  5. use App\Repository\VideoRepository;
  6. use App\Repository\ProductTypeRepository;
  7. use App\Repository\ProductCategoryRepository;
  8. use App\Repository\NewsCategoryRepository;
  9. use App\Repository\NewsTagRepository;
  10. use App\Repository\AppAreaRepository;
  11. use App\Repository\OfficeRepository;
  12. use App\Repository\MarkRepository;
  13. use App\Repository\ColorRepository;
  14. use App\Repository\CombineActionRepository;
  15. use App\Repository\CombinePropRepository;
  16. use App\Repository\CombineRepository;
  17. use App\Repository\CombineProductRepository;
  18. use App\Repository\ProductRepository;
  19. use App\Repository\ProductColorRepository;
  20. use App\Repository\ProductArticleRepository;
  21. use App\Helper\ProductHelper;
  22. use App\Helper\ArticleHelper;
  23. use App\Helper\NewsHelper;
  24. use App\Repository\NewsRepository;
  25. use App\Service\CaptchaService;
  26. use App\Service\WheretobuyService;
  27. use App\Service\MailerService;
  28. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\HttpFoundation\JsonResponse;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\Session\Session;
  33. use Symfony\Component\Routing\Annotation\Route;
  34. use Doctrine\ORM\EntityManagerInterface;
  35. use OpenApi\Annotations as OA;
  36. /**
  37.  * @Route("/api")
  38.  */
  39. class ApiController extends AbstractController
  40. {
  41.     /**
  42.      * @var String
  43.      */
  44.     private $path '/files';
  45.     public function paramsCtrl(array $params, array $attributesstring $thisPage)
  46.     {
  47.         $session = new Session();
  48.         $search $session->get('search');
  49.         $sorted $session->get('sorted');
  50.     
  51.         if (isset($search)) {
  52.             $search $search['page'] != $thisPage null $search['query'];
  53.         }
  54.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  55.             $session->remove('sorted');
  56.             $sorted null;
  57.         }
  58.         if (isset($params['sort']) && array_search($params['sort'], $attributes) !== false) {
  59.             $sorted = [
  60.                 'page' => $thisPage,
  61.                 'field' => $thisPage.'.'.$params['sort'],
  62.                 'sort' => isset($params['sort_direct']) ? $params['sort_direct'] : 'ASC',
  63.             ];
  64.         }
  65.         if (isset($params['all']) && !filter_var($params['all'], FILTER_VALIDATE_BOOLEAN)) {
  66.             $params['public'] = true;    
  67.         }
  68.         return [
  69.             'params' => $params,
  70.             'sorted' => $sorted,
  71.             'search' => $search
  72.         ];
  73.     }
  74.     /**
  75.      * Получение списка "Категории"
  76.      * @Route("/get/news/category", methods={"get"})
  77.      * @OA\Tag (name="Публикации")
  78.      * @OA\Response (
  79.      *     response=200,
  80.      *     description="Получение списка категорий",
  81.      * )
  82.      * @OA\Parameter(
  83.      *     name="id",
  84.      *     in="query",
  85.      *     description="ID: Получить запись по id категории",
  86.      *     @OA\Schema(type="integer")
  87.      * )
  88.      * @OA\Parameter(
  89.      *     name="limit",
  90.      *     in="query",
  91.      *     description="Количество записей на одной странице",
  92.      *     @OA\Schema(type="integer")
  93.      * )
  94.      * @OA\Parameter(
  95.      *     name="page",
  96.      *     in="query",
  97.      *     description="Номер страницы",
  98.      *     @OA\Schema(type="integer")
  99.      * )
  100.      * @OA\Parameter(
  101.      *     name="short",
  102.      *     in="query",
  103.      *     description="Минимальный ответ",
  104.      *     @OA\Schema(type="boolean")
  105.      * )
  106.      * @OA\Parameter(
  107.      *     name="all",
  108.      *     in="query",
  109.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  110.      *     @OA\Schema(type="boolean")
  111.      * )
  112.      */
  113.     public function getNewsCategories(
  114.         Request $request,
  115.         NewsCategoryRepository $newsCategoryRepository
  116.     ): Response
  117.     {
  118.         $thisPage 'news_category';
  119.         $result = [];
  120.         $limit $request->query->get('limit') ?? 500;
  121.         $page $request->query->get('page') ?? 1;
  122.         $id $request->query->get('id');
  123.         $all $request->query->get('all');
  124.         $short $request->query->get('short');
  125.         $short filter_var($shortFILTER_VALIDATE_BOOLEAN);
  126.         $public = !filter_var($allFILTER_VALIDATE_BOOLEAN);
  127.         $session = new Session();
  128.         $search $session->get('search');
  129.         $sorted $session->get('sorted');
  130.         if (isset($search)) {
  131.             $search $search['page'] != $thisPage null $search['query'];
  132.         }
  133.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  134.             $session->remove('sorted');
  135.             $sorted null;
  136.         }
  137.         if ($id) {
  138.             $newsCategory $newsCategoryRepository->find($id);
  139.             $result $newsCategory $newsCategory->toArray() : [];
  140.         
  141.         } else {
  142.             $result['data'] = $newsCategoryRepository->findOnRequestFieldsLimit($limit$page$public$search$sorted);
  143.             $result['count'] = $newsCategoryRepository->findOnRequestFieldsCount($public$search);
  144.             foreach ($result['data'] as &$data) {
  145.                 if (!$short) {
  146.                     $data $data->toArray();
  147.                     $data['preview'] = '/files/news/category/'.$data['preview'];
  148.                 }
  149.                 else {
  150.                     $data $data->toShortArray();
  151.                 }
  152.             }
  153.             if ($sorted) {
  154.                 $result['sorted'] = $sorted;
  155.             }
  156.         }
  157.         return new JsonResponse($resultResponse::HTTP_OK);
  158.     }
  159.     /**
  160.      * Получение списка "Тегов"
  161.      * @Route("/get/news/tag", methods={"get"})
  162.      * @OA\Tag (name="Публикации")
  163.      * @OA\Response (
  164.      *     response=200,
  165.      *     description="Получение списка тегов",
  166.      * )
  167.      * @OA\Parameter(
  168.      *     name="id",
  169.      *     in="query",
  170.      *     description="ID: Получить запись по id тэга",
  171.      *     @OA\Schema(type="integer")
  172.      * )
  173.      * @OA\Parameter(
  174.      *     name="category",
  175.      *     in="query",
  176.      *     description="Получить метки по категории",
  177.      *     @OA\Schema(type="integer")
  178.      * )
  179.      * @OA\Parameter(
  180.      *     name="video",
  181.      *     in="query",
  182.      *     description="Получить метки статей имеющие видеоролики",
  183.      *     @OA\Schema(type="boolean")
  184.      * )
  185.      * @OA\Parameter(
  186.      *     name="limit",
  187.      *     in="query",
  188.      *     description="Количество записей на одной странице",
  189.      *     @OA\Schema(type="integer")
  190.      * )
  191.      * @OA\Parameter(
  192.      *     name="page",
  193.      *     in="query",
  194.      *     description="Номер страницы",
  195.      *     @OA\Schema(type="integer")
  196.      * )
  197.      * @OA\Parameter(
  198.      *     name="all",
  199.      *     in="query",
  200.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  201.      *     @OA\Schema(type="boolean")
  202.      * )
  203.      */
  204.     public function getNewsTags(
  205.         Request $request,
  206.         NewsTagRepository $newsTagRepository
  207.     ): Response
  208.     {
  209.         $thisPage 'news_tag';
  210.         $result = [];
  211.         $limit $request->query->get('limit') ?? 500;
  212.         $page $request->query->get('page') ?? 1;
  213.         $id $request->query->get('id');
  214.         $all $request->query->get('all');
  215.         $video $request->query->get('video');
  216.         
  217.         $category $request->query->get('category');
  218.         $video filter_var($videoFILTER_VALIDATE_BOOLEAN);
  219.         $public = !filter_var($allFILTER_VALIDATE_BOOLEAN);
  220.         $session = new Session();
  221.         $search $session->get('search');
  222.         $sorted $session->get('sorted');
  223.         if (isset($search)) {
  224.             $search $search['page'] != $thisPage null $search['query'];
  225.         }
  226.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  227.             $session->remove('sorted');
  228.             $sorted null;
  229.         }
  230.         if ($id) {
  231.             $newsTag $newsTagRepository->find($id);
  232.             $result $newsTag $newsTag->toArray() : [];
  233.         
  234.         } else {
  235.             $result['data'] = $newsTagRepository->findOnRequestFieldsLimit($video$category$limit$page$public$search$sorted);
  236.             $result['count'] = $newsTagRepository->findOnRequestFieldsCount($video$category$public$search);
  237.             foreach ($result['data'] as &$data) {
  238.                 $data $data->toShortArray();
  239.             }
  240.             if ($sorted) {
  241.                 $result['sorted'] = $sorted;
  242.             }
  243.         }
  244.         
  245.         return new JsonResponse($resultResponse::HTTP_OK);
  246.     }
  247.     
  248.     /**
  249.      * Получение списка "Публикаций"
  250.      * @Route("/get/news", methods={"get"})
  251.      * @OA\Tag (name="Публикации")
  252.      * @OA\Response (
  253.      *     response=200,
  254.      *     description="Получение списка публикаций",
  255.      * )
  256.      * @OA\Parameter(
  257.      *     name="id",
  258.      *     in="query",
  259.      *     description="ID: Получить запись по id публикации",
  260.      *     @OA\Schema(type="integer, string")
  261.      * )
  262.      * @OA\Parameter(
  263.      *     name="category",
  264.      *     in="query",
  265.      *     description="Получить публикации по категории",
  266.      *     @OA\Schema(type="integer")
  267.      * )
  268.      * @OA\Parameter(
  269.      *     name="tag",
  270.      *     in="query",
  271.      *     description="Получить публикации по метке",
  272.      *     @OA\Schema(type="integer")
  273.      * )
  274.      * @OA\Parameter(
  275.      *     name="product",
  276.      *     in="query",
  277.      *     description="Получить публикации по продукции",
  278.      *     @OA\Schema(type="integer")
  279.      * )
  280.      * @OA\Parameter(
  281.      *     name="serializer",
  282.      *     in="query",
  283.      *     description="Группировка для Serializer'а",
  284.      *     @OA\Schema(type="string")
  285.      * )
  286.      * @OA\Parameter(
  287.      *     name="limit",
  288.      *     in="query",
  289.      *     description="Количество записей на одной странице",
  290.      *     @OA\Schema(type="integer")
  291.      * )
  292.      * @OA\Parameter(
  293.      *     name="page",
  294.      *     in="query",
  295.      *     description="Номер страницы",
  296.      *     @OA\Schema(type="integer")
  297.      * )
  298.      * @OA\Parameter(
  299.      *     name="cards",
  300.      *     in="query",
  301.      *     description="Заменить тэги продукции на карточки (ProductCard.vue)",
  302.      *     @OA\Schema(type="boolean")
  303.      * )
  304.      * @OA\Parameter(
  305.      *     name="all",
  306.      *     in="query",
  307.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  308.      *     @OA\Schema(type="boolean")
  309.      * )
  310.      */
  311.     public function getNews(
  312.         Request $request,
  313.         NewsRepository $newsRepository,
  314.         NewsHelper $newsHelper
  315.     ): Response
  316.     {
  317.         $thisPage 'news';
  318.         $result = [];
  319.         $limit $request->query->get('limit') ?? 500;
  320.         $page $request->query->get('page') ?? 1;
  321.         $id $request->query->get('id');
  322.         $all $request->query->get('all');
  323.         $category $request->query->get('category');
  324.         $serializer $request->query->get('serializer');
  325.         $tag $request->query->get('tag');
  326.         $product $request->query->get('product');
  327.         $createCards filter_var($request->query->get('cards'), FILTER_VALIDATE_BOOLEAN);
  328.         $public = !filter_var($allFILTER_VALIDATE_BOOLEAN);
  329.         $session = new Session();
  330.         $search $session->get('search');
  331.         $sorted $session->get('sorted');
  332.         if (isset($search)) {
  333.             $search $search['page'] != $thisPage null $search['query'];
  334.         }
  335.         if ($this->getUser()) {
  336.             $public false;
  337.         }
  338.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  339.             $session->remove('sorted');
  340.             $sorted null;
  341.         }
  342.         if ($id) {
  343.             $news $newsRepository->findItem($id$public);
  344.             $result $news $newsHelper->getNews($news$this->path$thisPage'news_one'$createCards) : [];
  345.         } else {
  346.             $result['data'] = $newsRepository->findOnRequestFieldsLimit($product$category$tag$limit$page$public$search$sorted);
  347.             $result['count'] = $newsRepository->findOnRequestFieldsCount($product$category$tag$public$search);
  348.             foreach ($result['data'] as &$news) {
  349.                 $news $newsHelper->getNews($news$this->path$thisPage$serializer ?? 'news_show');
  350.             }
  351.             if ($sorted) {
  352.                 $result['sorted'] = $sorted;
  353.             }
  354.         }
  355.         
  356.         return new JsonResponse($resultResponse::HTTP_OK);
  357.     }
  358.     /**
  359.      * Получение списка "Видеозаписи"
  360.      * @Route("/get/video", methods={"get"})
  361.      * @OA\Tag (name="Видеозаписи")
  362.      * @OA\Response (
  363.      *     response=200,
  364.      *     description="Получение списка видеозаписей",
  365.      * )
  366.      * @OA\Parameter(
  367.      *     name="id",
  368.      *     in="query",
  369.      *     description="ID: Получить запись по id",
  370.      *     @OA\Schema(type="integer")
  371.      * )
  372.      * @OA\Parameter(
  373.      *     name="product",
  374.      *     in="query",
  375.      *     description="Получить видеоролики по связанной продукции",
  376.      *     @OA\Schema(type="integer")
  377.      * )
  378.      * @OA\Parameter(
  379.      *     name="tag",
  380.      *     in="query",
  381.      *     description="Получить видеоролики по метке статьи",
  382.      *     @OA\Schema(type="integer")
  383.      * )
  384.      * @OA\Parameter(
  385.      *     name="limit",
  386.      *     in="query",
  387.      *     description="Количество записей на одной странице",
  388.      *     @OA\Schema(type="integer")
  389.      * )
  390.      * @OA\Parameter(
  391.      *     name="page",
  392.      *     in="query",
  393.      *     description="Номер страницы",
  394.      *     @OA\Schema(type="integer")
  395.      * )
  396.      * @OA\Parameter(
  397.      *     name="all",
  398.      *     in="query",
  399.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  400.      *     @OA\Schema(type="boolean")
  401.      * )
  402.      */
  403.     public function getVideos(
  404.         Request $request,
  405.         VideoRepository $videoRepository,
  406.         ProductHelper $productHelper
  407.     ): Response
  408.     {
  409.         $thisPage 'video';
  410.         $result = [];
  411.         $params $request->query->all();
  412.         $id $request->query->get('id');
  413.         $attributes = ['id''title''sort''public''link'];
  414.         $filter $this->paramsCtrl($params$attributes$thisPage);
  415.         $params $filter['params'];
  416.         $search $filter['search'];
  417.         $sorted $filter['sorted'];
  418.         if ($id) {
  419.             $entity $videoRepository->find($id);
  420.          
  421.             if ($entity) {
  422.                 $result $entity->toArray();
  423.                 foreach ($entity->getProductsCollection() as $product) {
  424.                     $result['products'][] = $productHelper->getProduct($product$this->path'product''product_card');
  425.                 }
  426.                 foreach ($entity->getTag() as $tag) {
  427.                     $result['tags'][] = $tag->toShortArray();
  428.                 }
  429.             }
  430.         
  431.         } else {
  432.             $result['data'] = $videoRepository->findOnRequestFieldsLimit($params$search$sorted);
  433.             $result['count'] = $videoRepository->findOnRequestFieldsCount($params$search);
  434.             if ($sorted) {
  435.                 $result['sorted'] = $sorted;
  436.             }
  437.             
  438.             foreach ($result['data'] as &$data) {
  439.                 $products = [];
  440.                 foreach ($data->getProductsCollection() as $product) {
  441.                     $products[] = $productHelper->getProduct($product$this->path'product''product_card');
  442.                 }
  443.                 $tags = [];
  444.                 foreach ($data->getTag() as $tag) {
  445.                     $tags[] = $tag->toShortArray();
  446.                 }
  447.                 $data $data->toArray();
  448.                 $data['tags'] = $tags;
  449.                 $data['products'] = $products;
  450.             }   
  451.         }
  452.         return new JsonResponse($resultResponse::HTTP_OK);
  453.     }
  454.     /**
  455.      * Получение списка "Продукции"
  456.      * @Route("/get/product", methods={"get"})
  457.      * @OA\Tag (name="Каталог")
  458.      * @OA\Response (
  459.      *     response=200,
  460.      *     description="Получение списка продукций",
  461.      * )
  462.      * @OA\Parameter(
  463.      *     name="id",
  464.      *     in="query",
  465.      *     description="ID: Получить запись по id продукта",
  466.      *     @OA\Schema(type="integer, string")
  467.      * )
  468.      * @OA\Parameter(
  469.      *     name="limit",
  470.      *     in="query",
  471.      *     description="Количество записей на одной странице",
  472.      *     @OA\Schema(type="integer")
  473.      * )
  474.      * @OA\Parameter(
  475.      *     name="page",
  476.      *     in="query",
  477.      *     description="Номер страницы",
  478.      *     @OA\Schema(type="integer")
  479.      * )
  480.      * @OA\Parameter(
  481.      *     name="popular",
  482.      *     in="query",
  483.      *     description="Популярная продукция",
  484.      *     @OA\Schema(type="boolean")
  485.      * )
  486.      * @OA\Parameter(
  487.      *     name="products",
  488.      *     in="query",
  489.      *     description="Массив продукции",
  490.      *     @OA\Schema(type="string")
  491.      * )
  492.      * @OA\Parameter(
  493.      *     name="serializer",
  494.      *     in="query",
  495.      *     description="Группировка для Serializer'а",
  496.      *     @OA\Schema(type="string")
  497.      * )
  498.      * @OA\Parameter(
  499.      *     name="all",
  500.      *     in="query",
  501.      *     description="Указатель на видимость записей на сайте (публичные/все записи, для всех items и для ID)",
  502.      *     @OA\Schema(type="boolean")
  503.      * )
  504.      * @OA\Parameter(
  505.      *     name="product_category",
  506.      *     in="query",
  507.      *     description="ID категории продукта",
  508.      *     @OA\Schema(type="integer")
  509.      * )
  510.      * @OA\Parameter(
  511.      *     name="product_type",
  512.      *     in="query",
  513.      *     description="ID типа продукта",
  514.      *     @OA\Schema(type="integer")
  515.      * )
  516.      * @OA\Parameter(
  517.      *     name="group",
  518.      *     in="query",
  519.      *     description="Сгруппировать по категориям",
  520.      *     @OA\Schema(type="boolean")
  521.      * )
  522.     * @OA\Parameter(
  523.      *     name="search",
  524.      *     in="query",
  525.      *     description="Поиск по строке",
  526.      *     @OA\Schema(type="string")
  527.      * )
  528.      */
  529.     public function getProducts(
  530.         Request $request,
  531.         ProductRepository $productRepository,
  532.         ProductHelper $productHelper
  533.     ): Response
  534.     {
  535.         $thisPage 'product';
  536.         $result = [];    
  537.         $limit $request->query->get('limit') ?? 1000;
  538.         $page $request->query->get('page') ?? 1;
  539.         $id $request->query->get('id');
  540.         $product_category_id $request->query->get('product_category');
  541.         $product_type_id $request->query->get('product_type');
  542.         $products $request->query->get('products');
  543.         $serializer $request->query->get('serializer');
  544.         $all $request->query->get('all');
  545.         
  546.         if ($products) {
  547.             $products explode(','$products);
  548.         }
  549.         if (!$serializer) {
  550.             $serializer 'product_one';
  551.         }
  552.         $popular filter_var($request->query->get('popular'), FILTER_VALIDATE_BOOLEAN);
  553.         $group filter_var($request->query->get('group'), FILTER_VALIDATE_BOOLEAN);
  554.         $public = !filter_var($allFILTER_VALIDATE_BOOLEAN);
  555.         $session = new Session();
  556.         $search $session->get('search');
  557.         $sorted $session->get('sorted');
  558.         if (isset($search)) {
  559.             $search $search['page'] != $thisPage null $search['query'];
  560.         }
  561.         $search $search $search $request->query->get('search');
  562.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  563.             $session->remove('sorted');
  564.             $sorted null;
  565.         }
  566.         if ($id) {
  567.             
  568.             $product $productRepository->findItem($id$public);
  569.             $group 'product_one';
  570.        
  571.             
  572.             $result $product $productHelper->getProduct($product$this->path$thisPage$groupnull$all) : [];
  573.         } else {
  574.             $result['data'] = $productRepository->findOnRequestFieldsLimit($limit$page$public$search$sorted,  $product_category_id$product_type_id$popular$products);
  575.             $result['count'] = $productRepository->findOnRequestFieldsCount($public$search$product_category_id$product_type_id$popular$products);
  576.             foreach ($result['data'] as &$product) {
  577.                 $product $productHelper->getProduct($product$this->path$thisPage$serializer$product_category_id);
  578.             }
  579.             if ($group) {
  580.                 $result['data'] = $productHelper->groupBy($result['data'], $product_category_id);
  581.             }
  582.             if ($sorted) {
  583.                 $result['sorted'] = $sorted;
  584.             }     
  585.         }
  586.         return new JsonResponse($resultResponse::HTTP_OK);
  587.     }
  588.     /**
  589.      * Получение списка "Категорий продукции"
  590.      * @Route("/get/product/category", methods={"get"})
  591.      * @OA\Tag (name="Каталог")
  592.      * @OA\Response (
  593.      *     response=200,
  594.      *     description="Получение списка категорий",
  595.      * )
  596.      * @OA\Parameter(
  597.      *     name="id",
  598.      *     in="query",
  599.      *     description="ID: Получить запись по id категории",
  600.      *     @OA\Schema(type="integer")
  601.      * )
  602.      * @OA\Parameter(
  603.      *     name="parent",
  604.      *     in="query",
  605.      *     description="Получение списка родителей и детей",
  606.      *     @OA\Schema(type="boolean")
  607.      * )
  608.      * @OA\Parameter(
  609.      *     name="limit",
  610.      *     in="query",
  611.      *     description="Количество записей на одной странице",
  612.      *     @OA\Schema(type="integer")
  613.      * )
  614.      * @OA\Parameter(
  615.      *     name="page",
  616.      *     in="query",
  617.      *     description="Номер страницы",
  618.      *     @OA\Schema(type="integer")
  619.      * )
  620.      * @OA\Parameter(
  621.      *     name="all",
  622.      *     in="query",
  623.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  624.      *     @OA\Schema(type="boolean")
  625.      * )
  626.      * @OA\Parameter(
  627.      *     name="sort",
  628.      *     in="query",
  629.      *     description="Поле, по которому производится сортировка",
  630.      *     @OA\Schema(type="string")
  631.      * )
  632.      */
  633.     public function getProductCategories(
  634.         Request $request,
  635.         ProductCategoryRepository $productCategoryRepository
  636.     ): Response
  637.     {
  638.         $thisPage 'product_category';
  639.         $result = [];
  640.         $limit $request->query->get('limit') ?? 500;
  641.         $page $request->query->get('page') ?? 1;
  642.         $id $request->query->get('id');
  643.         $all $request->query->get('all');
  644.         $sort $request->query->get('sort');
  645.         $parent filter_var($request->query->get('parent'), FILTER_VALIDATE_BOOLEAN);
  646.         $public = !filter_var($allFILTER_VALIDATE_BOOLEAN);
  647.         $session = new Session();
  648.         $search $session->get('search');
  649.         $sorted $session->get('sorted');
  650.         
  651.         if (isset($search)) {
  652.             $search $search['page'] != $thisPage null $search['query'];
  653.         }
  654.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  655.             $session->remove('sorted');
  656.             $sorted null;
  657.         }
  658.         
  659.         $sortAccess = ['id'];
  660.         if ($sort && array_search($sort$sortAccess) !== false) {
  661.             $sorted = [
  662.                 'field' => 'c.'.$sort,
  663.                 'sort' => 'ASC',
  664.             ];
  665.         }
  666.         if ($id) {
  667.             $productCategory $productCategoryRepository->find($id);
  668.             $result $productCategory $productCategory->toArray() : [];
  669.         
  670.         } else {
  671.             $result['data'] = $productCategoryRepository->findOnRequestFieldsLimit($limit$page$public$parent$search$sorted);
  672.             $result['count'] = $productCategoryRepository->findOnRequestFieldsCount($public$parent$search);
  673.             foreach ($result['data'] as &$data) {
  674.                 $data $parent $data->toParentArray() : $data->toArray();
  675.             }
  676.             if ($sorted) {
  677.                 $result['sorted'] = $sorted;
  678.             }
  679.         }
  680.         return new JsonResponse($resultResponse::HTTP_OK);
  681.     }
  682.     /**
  683.      * Получение списка "Типы продукции"
  684.      * @Route("/get/product/type", methods={"get"})
  685.      * @OA\Tag (name="Каталог")
  686.      * @OA\Response (
  687.      *     response=200,
  688.      *     description="Получение списка типов",
  689.      * )
  690.      * @OA\Parameter(
  691.      *     name="id",
  692.      *     in="query",
  693.      *     description="ID: Получить запись по id типа",
  694.      *     @OA\Schema(type="integer")
  695.      * )
  696.      * @OA\Parameter(
  697.      *     name="limit",
  698.      *     in="query",
  699.      *     description="Количество записей на одной странице",
  700.      *     @OA\Schema(type="integer")
  701.      * )
  702.      * @OA\Parameter(
  703.      *     name="category",
  704.      *     in="query",
  705.      *     description="Найти типы по категории",
  706.      *     @OA\Schema(type="integer")
  707.      * )
  708.      * @OA\Parameter(
  709.      *     name="page",
  710.      *     in="query",
  711.      *     description="Номер страницы",
  712.      *     @OA\Schema(type="integer")
  713.      * )
  714.      * @OA\Parameter(
  715.      *     name="all",
  716.      *     in="query",
  717.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  718.      *     @OA\Schema(type="boolean")
  719.      * )
  720.      */
  721.     public function getProductTypes(
  722.         Request $request,
  723.         ProductTypeRepository $productTypeRepository
  724.     ): Response
  725.     {
  726.         $thisPage 'product_type';
  727.         $result = [];
  728.         $limit $request->query->get('limit') ?? 500;
  729.         $page $request->query->get('page') ?? 1;
  730.         $id $request->query->get('id');
  731.         $category $request->query->get('category');
  732.         $all $request->query->get('all');
  733.         $public = !filter_var($allFILTER_VALIDATE_BOOLEAN);
  734.         $session = new Session();
  735.         $search $session->get('search');
  736.         $sorted $session->get('sorted');
  737.         if (isset($search)) {
  738.             $search $search['page'] != $thisPage null $search['query'];
  739.         }
  740.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  741.             $session->remove('sorted');
  742.             $sorted null;
  743.         }
  744.         if ($id) {
  745.             $productType $productTypeRepository->find($id);
  746.             $result $productType $productType->toArray() : [];
  747.         
  748.         } else {
  749.             $result['data'] = $productTypeRepository->findOnRequestFieldsLimit($limit$page$public$category$search$sorted);
  750.             $result['count'] = $productTypeRepository->findOnRequestFieldsCount($public$category$search);
  751.             foreach ($result['data'] as &$data) {
  752.                 $data $data->toShortArray();
  753.             }
  754.             if ($sorted) {
  755.                 $result['sorted'] = $sorted;
  756.             }
  757.         }
  758.         return new JsonResponse($resultResponse::HTTP_OK);
  759.     }
  760.        /**
  761.      * Получение списка "Артикулы продукции"
  762.      * @Route("/get/product/article", methods={"get"})
  763.      * @OA\Tag (name="Каталог")
  764.      * @OA\Response (
  765.      *     response=200,
  766.      *     description="Получение списка артикулов",
  767.      * )
  768.      * @OA\Parameter(
  769.      *     name="id",
  770.      *     in="query",
  771.      *     description="ID: Получить запись по id артикула",
  772.      *     @OA\Schema(type="integer")
  773.      * )
  774.      * @OA\Parameter(
  775.      *     name="limit",
  776.      *     in="query",
  777.      *     description="Количество записей на одной странице",
  778.      *     @OA\Schema(type="integer")
  779.      * )
  780.      * @OA\Parameter(
  781.      *     name="page",
  782.      *     in="query",
  783.      *     description="Номер страницы",
  784.      *     @OA\Schema(type="integer")
  785.      * )
  786.      * @OA\Parameter(
  787.      *     name="all",
  788.      *     in="query",
  789.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  790.      *     @OA\Schema(type="boolean")
  791.      * )
  792.      * @OA\Parameter(
  793.      *     name="product",
  794.      *     in="query",
  795.      *     description="ID продукции",
  796.      *     @OA\Schema(type="integer")
  797.      * )
  798.      */
  799.     public function getProductArticles(
  800.         Request $request,
  801.         ProductArticleRepository $productArticleRepository,
  802.         ApplicationController $appctrl
  803.     ): Response
  804.     {
  805.         $thisPage 'product_article';
  806.         $result = [];
  807.         $limit $request->query->get('limit') ?? 500;
  808.         $page $request->query->get('page') ?? 1;
  809.         $id $request->query->get('id');
  810.         $all $request->query->get('all');
  811.         $product $request->query->get('product');
  812.         $all filter_var($allFILTER_VALIDATE_BOOLEAN);
  813.         $session = new Session();
  814.         $search $session->get('search');
  815.         $sorted $session->get('sorted');
  816.         if (isset($search)) {
  817.             $search $search['page'] != $thisPage null $search['query'];
  818.         }
  819.         if (isset($sorted) && $sorted['page'] != $thisPage) {
  820.             $session->remove('sorted');
  821.             $sorted null;
  822.         }
  823.         if ($id) {
  824.             $productArticle $productArticleRepository->find($id);
  825.             $result $productArticle $productArticle->toArray() : [];
  826.             $result $this->getArticleFiles($result$appctrl);
  827.         } else {
  828.             $result['data'] = $productArticleRepository->findOnRequestFieldsLimit($limit$page$all$search$sorted$product);
  829.             $result['count'] = $productArticleRepository->findOnRequestFieldsCount($all$search$product);
  830.             foreach ($result['data'] as &$data) {
  831.                 $data $data->toArray();
  832.                 $data $this->getArticleFiles($data$appctrl);
  833.             }
  834.             if ($sorted) {
  835.                 $result['sorted'] = $sorted;
  836.             }
  837.         }
  838.         return new JsonResponse($resultResponse::HTTP_OK);
  839.     }
  840.     public function getArticleFiles($result$appctrl$selection false) {
  841.         if ($selection) {
  842.             $result['link'] = $result['product']['articles'][0]['link'];
  843.             $result['path'] = $result['product']['path'];
  844.             if (isset($result['product']['hover'])) {
  845.                 $result['hover'] = $result['product']['hover'];
  846.             }
  847.             unset($result['product']);
  848.             return $result;
  849.         }
  850.         $result['file'] = null;
  851.         $part '-hover';
  852.         $src '/' $result['id'] . '/';
  853.         $result['files'] = $appctrl->getFiles('product/article'$src);
  854.         foreach ((array)$result['files'] as $file) {
  855.             if (strpos($file$part) === false) {
  856.                 $result['file'] = $result['id'] . '/' .$file;
  857.             }
  858.         }
  859.         if (!$result['file'] && $result['files']) {
  860.             $result['file'] = $result['id'] . '/' .$result['files'][0];
  861.         }
  862.         return $result;
  863.     }
  864.     /**
  865.      * Получение списка "Марки авто"
  866.      * @Route("/get/mark", methods={"get"})
  867.      * @OA\Tag (name="Подбор по цвету")
  868.      * @OA\Response (
  869.      *     response=200,
  870.      *     description="Получение списка марок",
  871.      * )
  872.      * @OA\Parameter(
  873.      *     name="id",
  874.      *     in="query",
  875.      *     description="ID: Получить запись по id",
  876.      *     @OA\Schema(type="integer")
  877.      * )
  878.      * @OA\Parameter(
  879.      *     name="limit",
  880.      *     in="query",
  881.      *     description="Количество записей на одной странице",
  882.      *     @OA\Schema(type="integer")
  883.      * )
  884.      * @OA\Parameter(
  885.      *     name="page",
  886.      *     in="query",
  887.      *     description="Номер страницы",
  888.      *     @OA\Schema(type="integer")
  889.      * )
  890.      * @OA\Parameter(
  891.      *     name="all",
  892.      *     in="query",
  893.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  894.      *     @OA\Schema(type="boolean")
  895.      * )
  896.      */
  897.     public function getMarks(
  898.         Request $request,
  899.         MarkRepository $markRepository
  900.     ): Response
  901.     {
  902.         $thisPage 'mark';
  903.         $result = [];
  904.         $params $request->query->all();
  905.         $id $request->query->get('id');
  906.         $attributes = ['id''title''public'];
  907.         $filter $this->paramsCtrl($params$attributes$thisPage);
  908.         $params $filter['params'];
  909.         $search $filter['search'];
  910.         $sorted $filter['sorted'];
  911.         if ($id) {
  912.             $entity $markRepository->find($id);
  913.             $result $entity $entity->toArray() : [];
  914.         
  915.         } else {
  916.             $result['data'] = $markRepository->findOnRequestFieldsLimit($params$search$sorted);
  917.             $result['count'] = $markRepository->findOnRequestFieldsCount($params$search);
  918.             if ($sorted) {
  919.                 $result['sorted'] = $sorted;
  920.             }
  921.             
  922.             foreach ($result['data'] as &$data) {
  923.                 $data $data->toArray();
  924.             }   
  925.         }
  926.         return new JsonResponse($resultResponse::HTTP_OK);
  927.     }
  928.     /**
  929.      * Получение списка "Цвета авто"
  930.      * @Route("/get/color", methods={"get"})
  931.      * @OA\Tag (name="Подбор по цвету")
  932.      * @OA\Response (
  933.      *     response=200,
  934.      *     description="Получение списка цветов",
  935.      * )
  936.      * @OA\Parameter(
  937.      *     name="id",
  938.      *     in="query",
  939.      *     description="ID: Получить запись по id",
  940.      *     @OA\Schema(type="integer")
  941.      * )
  942.      * @OA\Parameter(
  943.      *     name="limit",
  944.      *     in="query",
  945.      *     description="Количество записей на одной странице",
  946.      *     @OA\Schema(type="integer")
  947.      * )
  948.      * @OA\Parameter(
  949.      *     name="page",
  950.      *     in="query",
  951.      *     description="Номер страницы",
  952.      *     @OA\Schema(type="integer")
  953.      * )
  954.      * @OA\Parameter(
  955.      *     name="all",
  956.      *     in="query",
  957.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  958.      *     @OA\Schema(type="boolean")
  959.      * )
  960.         * @OA\Parameter(
  961.      *     name="mark",
  962.      *     in="query",
  963.      *     description="Получить по id марки авто",
  964.      *     @OA\Schema(type="integer")
  965.      * )
  966.      */
  967.     public function getColors(
  968.         Request $request,
  969.         ColorRepository $colorRepository
  970.     ): Response
  971.     {
  972.         $thisPage 'color';
  973.         $result = [];
  974.         $params $request->query->all();
  975.         $id $request->query->get('id');
  976.         $attributes = ['id''title''code'];
  977.         $filter $this->paramsCtrl($params$attributes$thisPage);
  978.         $params $filter['params'];
  979.         $search $filter['search'];
  980.         $sorted $filter['sorted'];
  981.         if ($id) {
  982.             $entity $colorRepository->find($id);
  983.             $result $entity $entity->toArray() : [];
  984.         
  985.         } else {
  986.             $result['data'] = $colorRepository->findOnRequestFieldsLimit($params$search$sorted);
  987.             $result['count'] = $colorRepository->findOnRequestFieldsCount($params$search);
  988.             if ($sorted) {
  989.                 $result['sorted'] = $sorted;
  990.             }
  991.             
  992.             foreach ($result['data'] as &$data) {
  993.                 $data $data->toArray();
  994.             }   
  995.         }
  996.         return new JsonResponse($resultResponse::HTTP_OK);
  997.     }
  998.     /**
  999.      * Получение списка "Подбор по цвету"
  1000.      * @Route("/get/selection", methods={"get"})
  1001.      * @OA\Tag (name="Подбор по цвету")
  1002.      * @OA\Response (
  1003.      *     response=200,
  1004.      *     description="Получение списка подбора",
  1005.      * )
  1006.      * @OA\Parameter(
  1007.      *     name="id",
  1008.      *     in="query",
  1009.      *     description="ID: Получить запись по id",
  1010.      *     @OA\Schema(type="integer")
  1011.      * )
  1012.      * @OA\Parameter(
  1013.      *     name="limit",
  1014.      *     in="query",
  1015.      *     description="Количество записей на одной странице",
  1016.      *     @OA\Schema(type="integer")
  1017.      * )
  1018.      * @OA\Parameter(
  1019.      *     name="page",
  1020.      *     in="query",
  1021.      *     description="Номер страницы",
  1022.      *     @OA\Schema(type="integer")
  1023.      * )
  1024.      * @OA\Parameter(
  1025.      *     name="color",
  1026.      *     in="query",
  1027.      *     description="ID цвета",
  1028.      *     @OA\Schema(type="integer")
  1029.      * )
  1030.      * @OA\Parameter(
  1031.      *     name="product_article",
  1032.      *     in="query",
  1033.      *     description="ID артикля продукции",
  1034.      *     @OA\Schema(type="integer")
  1035.      * )
  1036.      */
  1037.     public function getSelections(
  1038.         Request $request,
  1039.         ProductColorRepository $selectionRepository,
  1040.         ProductRepository $productRepository,
  1041.         ColorRepository $colorRepository,
  1042.         ProductHelper $productHelper,
  1043.         ApplicationController $appctrl
  1044.     ): Response
  1045.     {
  1046.         $thisPage 'selection';
  1047.         $result = [];
  1048.         $params $request->query->all();
  1049.         $id $request->query->get('id');
  1050.         $attributes = ['id''color'];
  1051.         $filter $this->paramsCtrl($params$attributes$thisPage);
  1052.         $params $filter['params'];
  1053.         $search $filter['search'] ?? $request->query->get('search');
  1054.         $sorted $filter['sorted'];
  1055.         if ($id) {
  1056.             $result $colorRepository->find($id);
  1057.             if ($result) {
  1058.                 $products = array();
  1059.                 foreach($result->getProductColors() as $productColor) {
  1060.                     $article $productColor->getProductArticle();
  1061.                     $article $article->toArray();
  1062.                     $product $productRepository->find($article['product']['id']);
  1063.                     $article['product'] = $productHelper->getProduct($product$this->path'product''product_card');
  1064.                     $products[] = $this->getArticleFiles($article$appctrltrue);
  1065.                 }
  1066.                 $result $result->toArray();
  1067.                 $result['products'] = $products;
  1068.             }
  1069.         } else {
  1070.             $data $selectionRepository->findOnRequestFieldsLimit($params$search$sorted);
  1071.             $result['count'] = $selectionRepository->findOnRequestFieldsCount($params$search);
  1072.             $result['data'] = array();
  1073.             // $articles = array();
  1074.             foreach($data as &$item) {   
  1075.                 $color $item->getColor();
  1076.                 $article $item->getProductArticle();
  1077.                 $article $article->toArray();
  1078.                 $product $productRepository->find($article['product']['id']);
  1079.                 $article['product'] = $productHelper->getProduct($product$this->path'product''product_card');
  1080.                 $articles $this->getArticleFiles($article$appctrltrue);
  1081.                 $result['data'][] = [
  1082.                     'id' => $item->getId(),
  1083.                     'color' => $color->toArray(),
  1084.                     'product' => $articles
  1085.                 ];
  1086.             }
  1087.             
  1088.             if ($sorted) {
  1089.                 $result['sorted'] = $sorted;
  1090.             }  
  1091.         }
  1092.         return new JsonResponse($resultResponse::HTTP_OK);
  1093.     }
  1094.     /**
  1095.      * Получение списка "Дейтсвия"
  1096.      * @Route("/get/action", methods={"get"})
  1097.      * @OA\Tag (name="Комбинирование")
  1098.      * @OA\Response (
  1099.      *     response=200,
  1100.      *     description="Получение списка действий комбинирования",
  1101.      * )
  1102.      * @OA\Parameter(
  1103.      *     name="id",
  1104.      *     in="query",
  1105.      *     description="ID: Получить запись по id",
  1106.      *     @OA\Schema(type="integer")
  1107.      * )
  1108.      * @OA\Parameter(
  1109.      *     name="limit",
  1110.      *     in="query",
  1111.      *     description="Количество записей на одной странице",
  1112.      *     @OA\Schema(type="integer")
  1113.      * )
  1114.      * @OA\Parameter(
  1115.      *     name="page",
  1116.      *     in="query",
  1117.      *     description="Номер страницы",
  1118.      *     @OA\Schema(type="integer")
  1119.      * )
  1120.      * @OA\Parameter(
  1121.      *     name="all",
  1122.      *     in="query",
  1123.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  1124.      *     @OA\Schema(type="boolean")
  1125.      * )
  1126.      */
  1127.     public function getCombineAction(
  1128.         Request $request,
  1129.         CombineActionRepository $combineActionRepository
  1130.     ): Response
  1131.     {
  1132.         $thisPage 'action';
  1133.         $result = [];
  1134.         $params $request->query->all();
  1135.         $id $request->query->get('id');
  1136.         $attributes = ['id''title''public'];
  1137.         $filter $this->paramsCtrl($params$attributes$thisPage);
  1138.         $params $filter['params'];
  1139.         $search $filter['search'];
  1140.         $sorted $filter['sorted'];
  1141.         if ($id) {
  1142.             $entity $combineActionRepository->find($id);
  1143.             $result $entity $entity->toArray() : [];
  1144.         
  1145.         } else {
  1146.             $result['data'] = $combineActionRepository->findOnRequestFieldsLimit($params$search$sorted);
  1147.             $result['count'] = $combineActionRepository->findOnRequestFieldsCount($params$search);
  1148.             if ($sorted) {
  1149.                 $result['sorted'] = $sorted;
  1150.             }
  1151.             
  1152.             foreach ($result['data'] as &$data) {
  1153.                 $data $data->toArray();
  1154.             }   
  1155.         }
  1156.         return new JsonResponse($resultResponse::HTTP_OK);
  1157.     }
  1158.     /**
  1159.      * Получение списка "Свойства"
  1160.      * @Route("/get/prop", methods={"get"})
  1161.      * @OA\Tag (name="Комбинирование")
  1162.      * @OA\Response (
  1163.      *     response=200,
  1164.      *     description="Получение списка свойств комбинирования",
  1165.      * )
  1166.      * @OA\Parameter(
  1167.      *     name="id",
  1168.      *     in="query",
  1169.      *     description="ID: Получить запись по id",
  1170.      *     @OA\Schema(type="integer")
  1171.      * )
  1172.      * @OA\Parameter(
  1173.      *     name="limit",
  1174.      *     in="query",
  1175.      *     description="Количество записей на одной странице",
  1176.      *     @OA\Schema(type="integer")
  1177.      * )
  1178.      * @OA\Parameter(
  1179.      *     name="page",
  1180.      *     in="query",
  1181.      *     description="Номер страницы",
  1182.      *     @OA\Schema(type="integer")
  1183.      * )
  1184.      * @OA\Parameter(
  1185.      *     name="all",
  1186.      *     in="query",
  1187.      *     description="Указатель на видимость записей на сайте (только публичные или все)",
  1188.      *     @OA\Schema(type="boolean")
  1189.      * )
  1190.      */
  1191.     public function getCombineProps(
  1192.         Request $request,
  1193.         CombinePropRepository $combinePropRepository
  1194.     ): Response
  1195.     {
  1196.         $thisPage 'prop';
  1197.         $result = [];
  1198.         $params $request->query->all();
  1199.         $id $request->query->get('id');
  1200.         $attributes = ['id''title''public'];
  1201.         $filter $this->paramsCtrl($params$attributes$thisPage);
  1202.         $params $filter['params'];
  1203.         $search $filter['search'];
  1204.         $sorted $filter['sorted'];
  1205.         if ($id) {
  1206.             $entity $combinePropRepository->find($id);
  1207.             $result $entity $entity->toArray() : [];
  1208.         
  1209.         } else {
  1210.             $result['data'] = $combinePropRepository->findOnRequestFieldsLimit($params$search$sorted);
  1211.             $result['count'] = $combinePropRepository->findOnRequestFieldsCount($params$search);
  1212.             if ($sorted) {
  1213.                 $result['sorted'] = $sorted;
  1214.             }
  1215.             
  1216.             foreach ($result['data'] as &$data) {
  1217.                 $data $data->toArray();
  1218.             }   
  1219.         }
  1220.         return new JsonResponse($resultResponse::HTTP_OK);
  1221.     }
  1222.     /**
  1223.      * Получение списка "Комбинирование"
  1224.      * @Route("/get/combine", methods={"get"})
  1225.      * @OA\Tag (name="Комбинирование")
  1226.      * @OA\Response (
  1227.      *     response=200,
  1228.      *     description="Получение списка комбинирования",
  1229.      * )
  1230.      * @OA\Parameter(
  1231.      *     name="id",
  1232.      *     in="query",
  1233.      *     description="ID: Получить запись по id",
  1234.      *     @OA\Schema(type="integer")
  1235.      * )
  1236.      * @OA\Parameter(
  1237.      *     name="limit",
  1238.      *     in="query",
  1239.      *     description="Количество записей на одной странице",
  1240.      *     @OA\Schema(type="integer")
  1241.      * )
  1242.      * @OA\Parameter(
  1243.      *     name="page",
  1244.      *     in="query",
  1245.      *     description="Номер страницы",
  1246.      *     @OA\Schema(type="integer")
  1247.      * )
  1248.      * @OA\Parameter(
  1249.      *     name="action",
  1250.      *     in="query",
  1251.      *     description="Получить записи по id действия",
  1252.      *     @OA\Schema(type="integer")
  1253.      * )
  1254.      * @OA\Parameter(
  1255.      *     name="prop",
  1256.      *     in="query",
  1257.      *     description="Получить записи по id свойства",
  1258.      *     @OA\Schema(type="integer")
  1259.      * )
  1260.      * @OA\Parameter(
  1261.      *     name="group",
  1262.      *     in="query",
  1263.      *     description="Сгруппировать результат по действия",
  1264.      *     @OA\Schema(type="boolean")
  1265.      * )
  1266.      */
  1267.     public function getCombineItems(
  1268.         Request $request,
  1269.         CombineRepository $combineRepository,
  1270.         CombineProductRepository $combineProductRepository,
  1271.         ProductHelper $productHelper
  1272.     ): Response
  1273.     {
  1274.         $thisPage 'combine';
  1275.         $result = [];
  1276.         $params $request->query->all();
  1277.         $id $request->query->get('id');
  1278.         // $group = $request->query->get('group');
  1279.         $group filter_var($request->query->get('group'), FILTER_VALIDATE_BOOLEAN);
  1280.         $attributes = ['id''title''description''period'];
  1281.         $filter $this->paramsCtrl($params$attributes$thisPage);
  1282.         $params $filter['params'];
  1283.         $search $filter['search'];
  1284.         $sorted $filter['sorted'];
  1285.         if ($id) {
  1286.             $entity $combineRepository->find($id);
  1287.             
  1288.             if ($entity) {
  1289.                 $result $entity->toArray();
  1290.                 foreach($entity->getCombineProducts() as $comProd) {
  1291.                     $result['product_'.$comProd->getSort()] = $productHelper->getProduct($comProd->getProduct(), $this->path'product''product_card');
  1292.                 }
  1293.             }
  1294.         } else {
  1295.             $data $combineRepository->findOnRequestFieldsLimit($params$search$sorted);
  1296.             $result['count'] = $combineRepository->findOnRequestFieldsCount($params$search);
  1297.             $result['data'] = array();
  1298.           
  1299.             foreach($data as $entity) {
  1300.                 $item $entity->toArray();
  1301.                 foreach($entity->getCombineProducts() as $comProd) {
  1302.                     $item['product_'.$comProd->getSort()] = $productHelper->getProduct($comProd->getProduct(), $this->path'product''product_card');
  1303.                 }
  1304.                 $result['data'][] = $item;
  1305.             } 
  1306.             if ($group && $result['count'] > 0$result['data'] = $this->groupCombine($result['data'], isset($params['prop']));
  1307.             if ($sorted) {
  1308.                 $result['sorted'] = $sorted;
  1309.             }
  1310.         }
  1311.         return new JsonResponse($resultResponse::HTTP_OK);
  1312.     }
  1313.     public function groupCombine($data$prop) {
  1314.         $group = [];
  1315.         $result = [];
  1316.         $group_title $prop $data[0]['prop']['title'] : 'Защита/Блеск/Цвет';
  1317.         foreach($data as $item)
  1318.         {
  1319.             $group[$item['action']['title']][] = $item;
  1320.         }
  1321.         foreach ($group as $key => $value)
  1322.         {
  1323.             $result[] = [
  1324.                 'group'     => $key.' + '.$group_title,
  1325.                 'combine'  => $value
  1326.             ];
  1327.         }
  1328.         return $result;
  1329.         
  1330.     }
  1331.     /**
  1332.      * Отправка формы
  1333.      * @Route("/post-form", methods={"post"})
  1334.      * @OA\Tag (name="Обратная связь")
  1335.      * @OA\Response (
  1336.      *     response=200,
  1337.      *     description="Отправка формы",
  1338.      * )
  1339.      * @OA\Parameter(
  1340.      *     name="name",
  1341.      *     in="query",
  1342.      *     description="Имя отрпавителя",
  1343.      *     @OA\Schema(type="string")
  1344.      * )
  1345.      * @OA\Parameter(
  1346.      *     name="email",
  1347.      *     in="query",
  1348.      *     description="Почтовый ящик отправителя",
  1349.      *     @OA\Schema(type="string")
  1350.      * )
  1351.      * @OA\Parameter(
  1352.      *     name="message",
  1353.      *     in="query",
  1354.      *     description="Сообщение отправителя",
  1355.      *     @OA\Schema(type="string")
  1356.      * )
  1357.      * @OA\Parameter(
  1358.      *     name="token",
  1359.      *     in="query",
  1360.      *     description="Google reCaptcha token",
  1361.      *     @OA\Schema(type="string")
  1362.      * )
  1363.      */
  1364.     public function postFeedbackForm(
  1365.         Request $request,
  1366.         EntityManagerInterface $em,
  1367.         CaptchaService $captchaService,
  1368.         MailerService $mailerService
  1369.     ): JsonResponse
  1370.     {
  1371.         $result = ['success' => true'message' => null'inputs' => []];
  1372.         $content json_decode($request->getContent(), true);
  1373.         $required = ['name''email''message''token'];
  1374.         $subject 'Обратная связь';
  1375.         try {
  1376.             foreach ($required as $field) {
  1377.                 if (!isset($content[$field]) || empty($content[$field])) {
  1378.                     /**
  1379.                      * throw new \Exception("Field {$field} isn't isset or empty");
  1380.                      * $result['inputs'][$field] = 'This field is empty';
  1381.                      **/
  1382.                     $result['inputs'][$field] = 'Это поле не может быть пустым';
  1383.                 }
  1384.             }
  1385.             if (isset($content['email']) && $content['email']) {
  1386.                 if (!filter_var($content['email'], FILTER_VALIDATE_EMAIL)) {
  1387.                     $result['inputs']['email'] = 'Указан неверный E-mail';
  1388.                 }
  1389.             }
  1390.             if ($result['inputs']) {
  1391.                 /**
  1392.                   * throw new \Exception("One or more fields are filled in incorrectly");
  1393.                   * $result['messages'] = "One or more fields are filled in incorrectly";
  1394.                   */
  1395.                 $result['message'] = "Некоторые поля заполнены неверено";
  1396.                 $result['success'] = false;
  1397.                 return new JsonResponse($result);
  1398.             }
  1399.             if (!$captchaService->check($content['token'], $request->getClientIp())) {
  1400.                 /**
  1401.                  * throw new \Exception("Captcha is invalid");
  1402.                  * $result['messages'] = "Captcha is invalid";
  1403.                  */
  1404.                 $result['message'] = "Не удается пройти проверку reCaptcha Google";
  1405.                 $result['success'] = false;
  1406.                 return new JsonResponse($result);
  1407.             }
  1408.             date_default_timezone_set('Asia/Vladivostok');
  1409.             $date = new \DateTimeImmutable();
  1410.             $feedback = (new Feedback())
  1411.                 ->setName($content['name'])
  1412.                 ->setEmail($content['email'])
  1413.                 ->setMessage($content['message'])
  1414.                 ->setSubject($subject)
  1415.                 ->setCreatedAt($date)
  1416.                 ->setViewed(false)
  1417.                 ->setSent(false)
  1418.             ;
  1419.             $message $this->renderView('mailer.html.twig', [
  1420.                 'content' => $content,
  1421.                 'subject' => $subject,
  1422.                 'name_site' => $mailerService->getNameSite()
  1423.             ]);
  1424.       
  1425.             $emails $this->getEmails();
  1426.             $send $mailerService->send($subject$message$content$emails);
  1427.             if ($send['status']) {
  1428.                 $feedback->setSent(true);
  1429.                 $result['message'] = $send['message'];
  1430.             } 
  1431.             $em->persist($feedback);
  1432.             $em->flush();
  1433.             
  1434.         } catch (Exception $ex) {
  1435.             $result['success'] = false;
  1436.             $result['message'][] = $ex->getMessage();
  1437.         }
  1438.         return new JsonResponse($result);
  1439.     }
  1440.     public function getEmails() {
  1441.         $result = [];
  1442.         $repository $this->getDoctrine()->getRepository(Emails::class);
  1443.         $emails $repository->findAll();
  1444.         foreach ($emails as $email) {
  1445.             $result[] = $email->toArray();
  1446.         }
  1447.         return $result;
  1448.     }
  1449.     /**
  1450.      * Получение списка офисов компании
  1451.      * @Route("/get/offices", methods={"get"})
  1452.      * @OA\Tag (name="Настройки")
  1453.      * @OA\Response (
  1454.      *     response=200,
  1455.      *     description="Получение списка офисов компании"
  1456.      * )
  1457.      * @OA\Parameter(
  1458.      *     name="id",
  1459.      *     in="query",
  1460.      *     description="Получить офис по идентификатору",
  1461.      *     @OA\Schema(type="integer")
  1462.      * )
  1463.      * @OA\Parameter(
  1464.      *     name="limit",
  1465.      *     in="query",
  1466.      *     description="Количество записей на одной странице",
  1467.      *     @OA\Schema(type="integer")
  1468.      * )
  1469.      * @OA\Parameter(
  1470.      *     name="page",
  1471.      *     in="query",
  1472.      *     description="Номер страницы",
  1473.      *     @OA\Schema(type="integer")
  1474.      * )
  1475.      */
  1476.     public function getOffices(
  1477.         Request $request,
  1478.         OfficeRepository $officeRepository
  1479.     ): JsonResponse
  1480.     {
  1481.         $limit $request->query->get('limit') ?? 100;
  1482.         $page $request->query->get('page') ?? 1;
  1483.         $session = new Session();
  1484.         $search $session->get('search');
  1485.         $sorted $session->get('sorted');
  1486.         if ($sorted && $sorted['page'] != 'offices') {
  1487.             $session->remove('sorted');
  1488.             $sorted null;
  1489.         }
  1490.         $id $request->query->get('id');
  1491.         if ($id) {
  1492.             $office $officeRepository->find($id);
  1493.             $result = [];
  1494.             if ($office) {
  1495.                 $result $office->toArray();
  1496.             }
  1497.         } else {
  1498.             $result['data'] = $officeRepository->findOnRequestFieldsLimit($limit$page$search$sorted);
  1499.             $result['count'] = $officeRepository->findOnRequestFieldsCount($search);
  1500.             if ($sorted) {
  1501.                 $result['sorted'] = $sorted;
  1502.             }
  1503.         }
  1504.         return new JsonResponse($resultResponse::HTTP_OK);
  1505.     }
  1506.     /**
  1507.      * Получение офисов Uniqom
  1508.      * @Route("/get/offices/point", methods={"get"})
  1509.      * @OA\Tag (name="Партнеры")
  1510.      * @OA\Response (
  1511.      *     response=200,
  1512.      *     description="Получение офисов Uniqom",
  1513.      * )
  1514.      */
  1515.     public function getOfficesPoint(OfficeRepository $officeRepository): JsonResponse
  1516.     {
  1517.         // $host = $this->getParameter('host_memcached');
  1518.         // $client = MemcachedAdapter::createConnection($host);
  1519.         // $cache = new MemcachedAdapter($client);
  1520.         // $result = $cache->get('db.offices', function (ItemInterface $itemInterface) use ($officeRepository) {
  1521.             $result = [];
  1522.             $offices $officeRepository->findAll();
  1523.             foreach ($offices as $office) {
  1524.                 $result[] = $office->toArray();
  1525.             }
  1526.             foreach ($result as $i => $item) {
  1527.                 $item['phone'] = str_replace("|"","$item['phone']);
  1528.                 $result[$i]['phone'] = array_map('trim'explode(','$item['phone']));
  1529.                 $result[$i]['email'] = array_map('trim'explode(','$item['email']));
  1530.             }
  1531.             $result $this->getNormalizeRequest($result);
  1532.         // return $result;
  1533.         // });
  1534.         return new JsonResponse($resultResponse::HTTP_OK);
  1535.     }
  1536.     /**
  1537.      * Получение списка городов, где есть офисы Uniqom
  1538.      * @Route("/get/offices/cities", methods={"get"})
  1539.      * @OA\Tag (name="Партнеры")
  1540.      * @OA\Response (
  1541.      *     response=200,
  1542.      *     description="Получение списка городов, где есть офисы Uniqom",
  1543.      * )
  1544.      */
  1545.     public function getCitiesOffice(OfficeRepository $officeRepository): JsonResponse
  1546.     {
  1547.         // $host = $this->getParameter('host_memcached');
  1548.         // $client = MemcachedAdapter::createConnection($host);
  1549.         // $cache = new MemcachedAdapter($client);
  1550.         // $result = $cache->get('db.office_cities', function () use ($officeRepository) {
  1551.         //    return $officeRepository->findCityOnly();
  1552.         // });
  1553.         $result $officeRepository->findCityOnly();
  1554.         return new JsonResponse($resultResponse::HTTP_OK);
  1555.     }
  1556.     /*
  1557.      * Нормализует полученные данные в красивый и адекватный вид
  1558.      */
  1559.     public function getNormalizeRequest($result) {
  1560.         foreach ($result as &$data) {
  1561.             if (isset($data['signboard'])) {
  1562.                 $data['signboard'] = str_replace('"'''$data['signboard']);
  1563.             }
  1564.             if (isset($data['address'])) {
  1565.                 if (!$data['address'] && $data['city']) $data['address'] = $data['city'];
  1566.                 $address $data['address']['name'] ?? $data['address'];
  1567.                 $address str_ends_with($address'.') ? substr($address0, -1) : $address;
  1568.                 $address = !str_starts_with($address'г.') ? 'г. ' $address $address;
  1569.                 $address str_replace('д.'''$address);
  1570.                 $address str_replace('ул.''ул. '$address);
  1571.                 $address str_replace(' корпус'', корп.'$address);
  1572.                 $address str_replace('переулок''пер.'$address);
  1573.                 if (isset($data['address']['name'])) $data['address']['name'] = $address;
  1574.                 else $data['address'] = $address;
  1575.             }
  1576.             if (isset($data['phone'])) {
  1577.                 foreach ($data['phone'] as $index => &$phone) {
  1578.                     $ph str_starts_with($phone'8') ? '+7' ltrim($phone$phone[0]) : $phone;
  1579.                     $ph str_replace(" "''$phone);
  1580.                     $ph str_replace("("''$ph);
  1581.                     $ph str_replace(")"''$ph);
  1582.                     $ph str_replace("-"''$ph);
  1583.                    
  1584.                     if (is_numeric($ph)) {
  1585.                         if (str_starts_with($ph'+') && strlen($ph) === 12) {
  1586.                             $ph =
  1587.                                 substr($ph02) . " (" substr($ph23) . ") " .
  1588.                                 substr($ph53) . '-' substr($ph82) . "-" .
  1589.                                 substr($ph102);
  1590.                             $phone $ph;
  1591.                         }
  1592.                         if (str_starts_with($ph'423') && strlen($ph) === 10) {
  1593.                             $ph =
  1594.                                 "(" substr($ph03) . ") " substr($ph31) . "-" .
  1595.                                 substr($ph43) . "-" substr($ph73);
  1596.                             $phone $ph;
  1597.                         }
  1598.                         if (strlen($ph) === 7) {
  1599.                             $ph =
  1600.                                 substr($ph01) . "-" substr($ph13) . "-" .
  1601.                                 substr($ph43);
  1602.                             $phone $ph;
  1603.                         }
  1604.                     }
  1605.                 }
  1606.             }
  1607.             if (isset($data['email'])) {
  1608.                 foreach ($data['email'] as $index => $email) {
  1609.                     if (!$email) unset($data['email'][$index]);
  1610.                 }
  1611.             }
  1612.             if (isset($data['working_time'])) {
  1613.                 $workingString $data['working_time'];
  1614.                 $days = ['пн''вт''ср''чт''пт''сб''вс'];
  1615.                 $workingDays = [];
  1616.                 foreach ($days as $day) {
  1617.                     if (($i mb_stripos(mb_strtolower($workingString), $day)) !== false) {
  1618.                         $workingDays[] = [
  1619.                             "day" => $day,
  1620.                             "index" => $i
  1621.                         ];
  1622.                     }
  1623.                 }
  1624.                 $workingString str_replace("\r"' '$workingString);
  1625.                 $workingString str_replace("\n"' '$workingString);
  1626.                 $workingTemp explode(' '$workingString);
  1627.                 $workingTime = [];
  1628.                 foreach ($workingTemp as &$wt) {
  1629.                     $wt str_ends_with($wt'.') ? substr($wt0, -1) : $wt;
  1630.                     $wt str_replace(";"''$wt);
  1631.                     $wt str_replace(","''$wt);
  1632.                     $wt str_replace("."':'$wt);
  1633.                     $ws str_replace(":"''$wt);
  1634.                     if (is_numeric($ws)) $workingTime[] = $wt;
  1635.                 }
  1636.                 $indexTime = [];
  1637.                 $tempString $workingString;
  1638.                 foreach ($workingTime as &$wt) {
  1639.                     if (($i mb_stripos($tempString$wt)) !== false) {
  1640.                         $tempString $this->str_replace_once($wt'00:00'$tempString);
  1641.                         $indexTime[] = $i;
  1642.                     }
  1643.                     if (false === $i) {
  1644.                         $temp str_replace(":"'.'$wt);
  1645.                         if (($i mb_stripos($tempString$temp)) !== false) {
  1646.                             $tempString $this->str_replace_once($temp'00:00'$tempString);
  1647.                             $indexTime[] = $i;
  1648.                         }
  1649.                     }
  1650.                 }
  1651.                 unset($tempString);
  1652.                 $pos1 null;
  1653.                 $pos2 null;
  1654.                 $day1 '';
  1655.                 $workingArray = [];
  1656.                 foreach ($workingDays as $day) {
  1657.                     if (($i mb_stripos($workingString'-')) !== false) {
  1658.                         if ($i $day['index']) {
  1659.                             $pos1 $day['index'];
  1660.                             $day1 $day['day'];
  1661.                         }
  1662.                         if ($i $day['index']) $pos2 $day['index'];
  1663.                     }
  1664.                     if ($pos1 !== null && $pos2 !== null) {
  1665.                         $day2 $day['day'];
  1666.                         for($di array_search($day1$days) + 1$di <= array_search($day2$days); $di++) {
  1667.                             $time1 null;
  1668.                             $time2 null;
  1669.                             foreach ($indexTime as $key => $index) {
  1670.                                 if ($day['index'] < $index && $time1 !== null$time2 $workingTime[$key];
  1671.                                 if ($day['index'] < $index && $time1 == null$time1 $workingTime[$key];
  1672.                                 if ($time1 && $time2) break;
  1673.                             }
  1674.                             $workingArray[] = [
  1675.                                 "day" => $days[$di],
  1676.                                 "start" => $time1,
  1677.                                 "end" => $time2,
  1678.                             ];
  1679.                         }
  1680.                         $pos1 null;
  1681.                         $pos2 null;
  1682.                         $day1 '';
  1683.                     } else {
  1684.                         $time1 null;
  1685.                         $time2 null;
  1686.                         foreach ($indexTime as $key => $index) {
  1687.                             if ($day['index'] < $index && $time1 !== null$time2 $workingTime[$key];
  1688.                             if ($day['index'] < $index && $time1 == null$time1 $workingTime[$key];
  1689.                             if ($time1 && $time2) break;
  1690.                         }
  1691.                         $workingArray[] = [
  1692.                             "day" => $day['day'],
  1693.                             "start" => $time1,
  1694.                             "end" => $time2,
  1695.                         ];
  1696.                     }
  1697.                 }
  1698.                 if ($workingArray && count($workingArray) < count($days)) {
  1699.                     $workingArrayTemp = [];
  1700.                     foreach ($days as $day) {
  1701.                         $index array_search($dayarray_column($workingArray'day'));
  1702.                         $workingArrayTemp[] = $index !== false $workingArray[$index] : [
  1703.                             "day" => $day,
  1704.                             "start" => null,
  1705.                             "end" => null,
  1706.                         ];
  1707.                     }
  1708.                     $workingArray $workingArrayTemp;
  1709.                 }
  1710.                 $data['working_time_array'] = $workingArray;
  1711.             }
  1712.         }
  1713.         return $result;
  1714.     }
  1715.     public function str_replace_once($search$replace$text)
  1716.     {
  1717.         $pos strpos($text$search);
  1718.         return $pos !== false substr_replace($text$replace$posstrlen($search)) : $text;
  1719.     }
  1720.     private function makeRequest(
  1721.         array $params,
  1722.         WheretobuyService $wheretobuyService
  1723.     ): JsonResponse
  1724.     {
  1725.         $splice '/';
  1726.         $url  $splice $params['action'];
  1727.         $url .= $splice $params['sitecode'];
  1728.         $url .= isset($params['city']) ? $splice $params['city'] : '';
  1729.         $target = [];
  1730.         if (isset($params['segment'])) {
  1731.             array_push($target'segment='.$params['segment']);
  1732.         }
  1733.         if (isset($params['isAuthorised'])) {
  1734.             array_push($target'is_authorised='.$params['isAuthorised']);
  1735.         }
  1736.         $target $target '?' implode('&'$target) : '';
  1737.         $data $wheretobuyService->invoke($url.$target);
  1738.         if (isset($params['city'])) {
  1739.             foreach ($data as $i => $item) {
  1740.                 $item['phone'] = str_replace(";"","$item['phone']);
  1741.                 $data[$i]['phone'] = array_map('trim'explode(','$item['phone']));
  1742.                 $data[$i]['email'] = array_map('trim'explode(','$item['email']));
  1743.                 $data[$i]['url'] = array_map('trim'explode(','$item['url']));
  1744.                 if (empty($item['phone'])) $data[$i]['phone'] = null;
  1745.                 if (empty($item['email'])) $data[$i]['email'] = null;
  1746.                 if (empty($item['url'])) $data[$i]['url'] = null;
  1747.             }
  1748.             $data $this->getNormalizeRequest($data);
  1749.         }
  1750.         return new JsonResponse($data);
  1751.     }
  1752.     /**
  1753.      * Получение списка городов
  1754.      * @Route("/get/cities/{sitecode}", methods={"get"})
  1755.      * @OA\Tag (name="Где купить")
  1756.      * @OA\Response (
  1757.      *     response=200,
  1758.      *     description="Получение списка городов",
  1759.      * )
  1760.      * */
  1761.     public function getCities(string $sitecodeWheretobuyService $wheretobuyService)
  1762.     {
  1763.         $data $this->makeRequest(array(
  1764.             'action' => 'cities',
  1765.             'sitecode' => $sitecode,
  1766.         ), $wheretobuyService);
  1767.         return $data;
  1768.     }
  1769.     /**
  1770.      * Получение списка точек
  1771.      * @Route("/get/points/{sitecode}/{city}", methods={"get"})
  1772.      * @OA\Tag (name="Где купить")
  1773.      * @OA\Response (
  1774.      *     response=200,
  1775.      *     description="Получение списка точек",
  1776.      * )
  1777.      * @OA\Parameter(
  1778.      *     name="segment",
  1779.      *     in="query",
  1780.      *     description="Сегмент (СТО, Интернет-магазин и т.д)",
  1781.      *     @OA\Schema(type="string")
  1782.      * )
  1783.      * @OA\Parameter(
  1784.      *     name="is_authorised",
  1785.      *     in="query",
  1786.      *     description="Авторизованные центры",
  1787.      *     @OA\Schema(type="boolean")
  1788.      * )
  1789.      * */
  1790.     public function getPoints(
  1791.         string $sitecode,
  1792.         int $city,
  1793.         WheretobuyService $wheretobuyService,
  1794.         Request $request
  1795.     ) {
  1796.         $segment $request->query->get('segment');
  1797.         $isAuthorised $request->query->get('is_authorised');
  1798.         $data $this->makeRequest(array(
  1799.             'action' => 'points',
  1800.             'sitecode' => $sitecode,
  1801.             'city' => $city,
  1802.             'segment' => $segment,
  1803.             'isAuthorised' => $isAuthorised
  1804.         ), $wheretobuyService);
  1805.         return $data;
  1806.     }
  1807.     /**
  1808.      * Поиска на сайте
  1809.      * @Route("/get/search", methods={"get"})
  1810.      * @OA\Tag (name="Поиск")
  1811.      * @OA\Response (
  1812.      *     response=200,
  1813.      *     description="Поиск продукции/публикаций на сайте",
  1814.      * )
  1815.      * @OA\Parameter(
  1816.      *     name="text",
  1817.      *     in="query",
  1818.      *     description="Поисковый запрос",
  1819.      *     @OA\Schema(type="string")
  1820.      * )
  1821.      * */
  1822.     public function getSearch(
  1823.         Request $request,
  1824.         ProductRepository $productRepository,
  1825.         ProductHelper $productHelper,
  1826.         NewsRepository $newsRepository,
  1827.         NewsHelper $newsHelper
  1828.     ) {
  1829.         $result = [];
  1830.         $search $request->query->get('text');
  1831.         $limit 1000;
  1832.         $page 1;
  1833.         if (!$search) {
  1834.             return new JsonResponse($resultResponse::HTTP_BAD_REQUEST);
  1835.         }
  1836.         
  1837.         $result['news'] = $newsRepository->findOnRequestFieldsLimit(nullnullnull$limit$pagetrue$searchnull);
  1838.         foreach ($result['news'] as &$news) {
  1839.             $news $newsHelper->getNews($news$this->path'news''news_card');
  1840.         }
  1841.         
  1842.         $result['products'] = $productRepository->findOnRequestFieldsLimit($limit$pagetrue$searchnullnullnullnullnull);
  1843.         foreach ($result['products'] as &$product) {
  1844.             $product $productHelper->getProduct($product$this->path'product''product_card'nullnull);
  1845.             
  1846.             $articles array_filter($product['articles'], function($article) {
  1847.                 if ($article['link'] !== null) return true;
  1848.                 return false;
  1849.             });
  1850.             foreach($product['articles'] as $i => &$article) {
  1851.                 $excluded = !(false !== mb_stripos($article['title'], $search) || false !== mb_stripos($article['code'], $search));
  1852.                
  1853.                 if ($excluded) {
  1854.                     foreach($article['charact'] as &$charact) {
  1855.                         $color $charact['colors'];     
  1856.                         if (count($color) && (false !== mb_stripos($color['code'], $search) || false !== mb_stripos($color['title'], $search))) {
  1857.                             $excluded false;
  1858.                         }
  1859.                     }
  1860.                     if ($excluded) {
  1861.                         unset($product['articles'][$i]);
  1862.                     }
  1863.                 }   
  1864.                 if (!$article['link']) {
  1865.                     $article['link'] = $articles[0]['link'];
  1866.                 }
  1867.             }
  1868.             if (!count($product['articles'])) {
  1869.                 $product['articles'] = $articles;
  1870.             }
  1871.             
  1872.             $product['articles'] = array_values($product['articles']);
  1873.         }
  1874.         return new JsonResponse($resultResponse::HTTP_OK);
  1875.     }
  1876. }