src/Controller/ProductController.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Category;
  4. use App\Entity\Product;
  5. use App\Entity\ProductAvailability;
  6. use App\Entity\ProductConnection;
  7. use App\Entity\Provider;
  8. use App\Integration\InSalesIntegration;
  9. use App\Service\PriceCalculatorService;
  10. use App\Service\ProductService;
  11. use Doctrine\Persistence\ManagerRegistry;
  12. use Knp\Component\Pager\PaginatorInterface;
  13. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  14. use PhpOffice\PhpSpreadsheet\Writer\Xls;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  19. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  20. use Symfony\Component\HttpFoundation\StreamedResponse;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. class ProductController extends AbstractController
  23. {
  24.     /**
  25.      * @Route("/product", name="product_list")
  26.      * @param Request $request
  27.      * @return Response
  28.      */
  29.     public function index(Request $requestManagerRegistry $managerRegistryPaginatorInterface $paginatorProductService $productService) {
  30.         $chosenCategoryId $request->get('c');
  31.         $filterProviderId $request->get('provider');
  32.         $filterName $request->get('name''');
  33.         $filterProviderArticle $request->get('provider_sku''');
  34.         $filterSiteArticle $request->get('site_sku''');
  35.         $filterProviderAvailability $request->get('availability''');
  36.         $filterSiteConnection $request->get('connected''');
  37.         $filterBrand $request->get('brand''');
  38.         $selectedProvider $managerRegistry->getRepository(Provider::class)->findOneBy(['id' => $filterProviderId]);
  39.         $qb $managerRegistry->getRepository(Product::class)->createQueryBuilder('p')
  40.             ->join(ProductAvailability::class, 'av''WITH''av.product = p')
  41.             ->leftJoin(ProductConnection::class, 'cn''WITH''cn.product = p')
  42.             ->orderBy('p.id''DESC');
  43.         if (!empty(trim($filterBrand))) {
  44.             $qb->andWhere('av.brand = :brand')
  45.                 ->setParameter('brand'trim($filterBrand));
  46.         }
  47.         if ($selectedProvider instanceof Provider) {
  48.             $qb->andWhere('av.provider = :provider')
  49.                 ->setParameter('provider'$selectedProvider);
  50.         }
  51.         if (($filterName trim($filterName)) != '') {
  52.             $qb->andWhere('av.providerName LIKE :filterName OR av.providerPartNumber LIKE :filterName')
  53.                 ->setParameter('filterName'"%$filterName%");
  54.         }
  55.         if (($filterProviderArticle trim($filterProviderArticle)) != '') {
  56.             $qb->andWhere('av.providerArticle LIKE :providerArticle')
  57.                 ->setParameter('providerArticle'"%$filterProviderArticle%");
  58.         }
  59.         if (($filterSiteArticle trim($filterSiteArticle)) != '') {
  60.             $qb->andWhere('cn.insalesSku LIKE :siteArticle')
  61.                 ->setParameter('siteArticle'"%$filterSiteArticle%");
  62.         }
  63.         if ($filterProviderAvailability == '1') {
  64.             $qb->andWhere('av.stock > 0');
  65.         } elseif ($filterProviderAvailability == '0') {
  66.             $qb->andWhere('av.stock <= 0');
  67.         }
  68.         if ($filterSiteConnection == '1') {
  69.             $qb->andWhere('cn IS NOT NULL');
  70.         } elseif ($filterSiteConnection == '0') {
  71.             $qb->andWhere('cn IS NULL');
  72.         }
  73.         $brands $productService->getAllBrands();
  74.         $providers $managerRegistry->getRepository(Provider::class)->findAll();
  75.         $categories = [];
  76.         $chosenCategory $managerRegistry->getRepository(Category::class)->findOneBy(['id' => $chosenCategoryId]);
  77.         if ($selectedProvider instanceof Provider) {
  78.             if (!empty($chosenCategoryId)) {
  79.                 $categories $managerRegistry->getRepository(Category::class)->findBy(['provider' => $selectedProvider'parent' => $chosenCategoryId], ['name' => 'ASC']);
  80.             } else {
  81.                 $categories $managerRegistry->getRepository(Category::class)->findBy(['provider' => $selectedProvider'parent' => null], ['name' => 'ASC']);
  82.             }
  83.         }
  84.         if ($chosenCategory instanceof Category) {
  85.             $children $managerRegistry->getRepository(Category::class)->getAllChildrenId($chosenCategory->getId());
  86.             $qb->andWhere('av.category = :category OR av.category IN (:children)')
  87.                 ->setParameter('category'$chosenCategory)
  88.                 ->setParameter('children'$children);
  89.         }
  90.         $pagination $paginator->paginate(
  91.             $qb->getQuery(),
  92.             $request->query->getInt('page'1),
  93.             100
  94.         );
  95.         $pagination->setTemplate('@KnpPaginator/Pagination/bootstrap_v5_pagination.html.twig');
  96.         return $this->render('product/list.html.twig', [
  97.             'pagination' => $pagination,
  98.             'brands' => $brands,
  99.             'providers' => $providers,
  100.             'selectedProvider' => $selectedProvider,
  101.             'children' => $categories,
  102.             'chosenCategory' => $chosenCategory
  103.         ]);
  104.     }
  105.     /**
  106.      * @Route("/product/exportSelected", name="product_export_selected")
  107.      * @param Request $request
  108.      * @param SessionInterface $session
  109.      * @param ManagerRegistry $managerRegistry
  110.      * @param PriceCalculatorService $priceCalculatorService
  111.      * @return Response
  112.      */
  113.     public function exportSelectedToExcel(Request $requestSessionInterface $sessionManagerRegistry  $managerRegistryPriceCalculatorService $priceCalculatorService) {
  114.         $selected $session->get('selected', []);
  115.         $providerId $request->get('provider_id');
  116.         $provider $managerRegistry->getRepository(Provider::class)->findOneBy(['id' => $providerId]);
  117.         $data = [];
  118.         foreach ($selected as $productId) {
  119.             $product $managerRegistry->getRepository(Product::class)->findOneBy(['id' => $productId]);
  120.             if ($provider instanceof Provider) {
  121.                 $availability $managerRegistry->getRepository(ProductAvailability::class)->findOneBy(['product' => $product'provider' => $provider]);
  122.             } else {
  123.                 $availability $priceCalculatorService->getOptimalAvailability($product);
  124.             }
  125.             $temp = [
  126.                 'id' => $product->getId(),
  127.                 'name' => $product->getName(),
  128.                 'provider' => ($availability instanceof ProductAvailability $availability->getProvider()->getName() : ''),
  129.                 'provider_article' => ($availability instanceof ProductAvailability $availability->getProviderArticle() : ''),
  130.                 'provider_part_number' => ($availability instanceof ProductAvailability $availability->getProviderPartNumber() : ''),
  131.                 'provider_name' => ($availability instanceof ProductAvailability $availability->getProviderName() : ''),
  132.                 'provider_qty' => ($availability instanceof ProductAvailability $availability->getStock() : ''),
  133.                 'input_price' => ($availability instanceof ProductAvailability $availability->getPriceRub() : ''),
  134.                 'sale_price' => ($availability instanceof ProductAvailability $availability->getPriceSale() : ''),
  135.                 'final_price' => ''
  136.             ];
  137.             if ($availability instanceof ProductAvailability) {
  138.                 $temp['final_price'] = $priceCalculatorService->calculatePriceForAvailability($availability);
  139.             }
  140.             $data[] = $temp;
  141.         }
  142.         $spreadsheet = new Spreadsheet();
  143.         $activeSheet $spreadsheet->getActiveSheet();
  144.         $headers = [
  145.             'id' => 'ID',
  146.             'name' => 'Наименование (в Provider)',
  147.             'provider' => 'Поставщик',
  148.             'provider_article' => 'Артикул у поставщика',
  149.             'provider_part_number' => 'Партномер',
  150.             'provider_name' => 'Наименование (у поставщика)',
  151.             'provider_qty' => 'Количество',
  152.             'input_price' => 'Цена вход',
  153.             'sale_price' => 'Цена продажи',
  154.             'final_price' => 'Финальная цена',
  155.         ];
  156.         foreach ($headers as $slug => $name) {
  157.             $col array_search($slugarray_keys($headers)) + 1;
  158.             $activeSheet->setCellValueByColumnAndRow($col1$name);
  159.             $activeSheet->getStyleByColumnAndRow($col1)->getFont()->setBold(true);
  160.             $activeSheet->getColumnDimensionByColumn($col)->setAutoSize(true);
  161.         }
  162.         $row 2;
  163.         foreach ($data as $item) {
  164.             foreach ($headers as $slug => $header) {
  165.                 $col array_search($slugarray_keys($headers)) + 1;
  166.                 $activeSheet->setCellValueByColumnAndRow($col$row$item[$slug] ?? '');
  167.             }
  168.             $row ++;
  169.         }
  170.         $writer = new Xls($spreadsheet);
  171.         $response =  new StreamedResponse(
  172.             function () use ($writer) {
  173.                 $writer->save('php://output');
  174.             }
  175.         );
  176.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  177.         $response->headers->set('Content-Disposition''attachment;filename="SelectedProducts.xls"');
  178.         $response->headers->set('Cache-Control','max-age=0');
  179.         return $response;
  180.     }
  181.     /**
  182.      * @Route("/product/removeAvailability/{id}", name="product_remove_availability")
  183.      * @param Request $request
  184.      * @param ProductAvailability $availability
  185.      * @param ManagerRegistry $managerRegistry
  186.      * @return void
  187.      */
  188.     public function removeAvailability(Request $requestProductAvailability $availabilityManagerRegistry $managerRegistry) {
  189.         $product $availability->getProduct();
  190.         $managerRegistry->getManager()->remove($availability);
  191.         $managerRegistry->getManager()->flush();
  192.         return $this->redirectToRoute('product_view', ['id' => $product->getId()]);
  193.     }
  194.     /**
  195.      * @Route("/product/moveAvailability/{id}", name="product_move_availability")
  196.      * @param Request $request
  197.      * @param ProductAvailability $availability
  198.      * @param ManagerRegistry $managerRegistry
  199.      * @param FlashBagInterface $flashBag
  200.      * @return void
  201.      */
  202.     public function moveAvailability(Request $requestProductAvailability $availabilityManagerRegistry $managerRegistryFlashBagInterface $flashBag) {
  203.         $to $request->get('to');
  204.         $product $managerRegistry->getRepository(Product::class)->findOneBy(['id' => $to]);
  205.         if ($product instanceof Product) {
  206.             $availability->setProduct($product);
  207.             $managerRegistry->getManager()->flush();
  208.             return $this->redirectToRoute('product_view', ['id' => $product->getId()]);
  209.         }
  210.         $flashBag->add('error'"Товар с ID $to не найден");
  211.         return $this->redirectToRoute('product_view', ['id' => $availability->getProduct()->getId()]);
  212.     }
  213.     /**
  214.      * @Route("/product/connect/{id}", name="product_connect")
  215.      */
  216.     public function connect(Request $requestProduct $productInSalesIntegration $inSalesIntegrationManagerRegistry $managerRegistryFlashBagInterface $flashBag) {
  217.         $insalesProductId $request->get('insales_product_id''');
  218.         $insalesProductId trim($insalesProductId);
  219.         if (!empty($insalesProductId)) {
  220.             $variants $inSalesIntegration->getVariantsOfProduct($insalesProductId);
  221.             if (isset($variants[0])) {
  222.                 $variant $variants[0];
  223.                 $connection $product->getConnection();
  224.                 if (!$connection instanceof ProductConnection) {
  225.                     $connection = new ProductConnection();
  226.                     $connection->setProduct($product);
  227.                     $managerRegistry->getManager()->persist($connection);
  228.                 }
  229.                 $connection->setDateConnected(time());
  230.                 $connection->setInsalesProductId($insalesProductId);
  231.                 $connection->setInsalesVariantId($variant['id']);
  232.                 $connection->setInsalesSku($variant['sku'] ?? 0);
  233.                 $managerRegistry->getManager()->flush();
  234.                 $flashBag->add('info'"Привязка к сайту добавлена");
  235.             } else {
  236.                 $flashBag->add('error'"Не найдены варианты для товара с ID $insalesProductId");
  237.             }
  238.         } else {
  239.             $connection $product->getConnection();
  240.             if ($connection instanceof ProductConnection) {
  241.                 $managerRegistry->getManager()->remove($connection);
  242.                 $managerRegistry->getManager()->flush();
  243.                 $flashBag->add('warning'"Привязка к сайту удалена");
  244.             }
  245.         }
  246.         return $this->redirectToRoute('product_view', [
  247.             'id' => $product->getId()
  248.         ]);
  249.     }
  250.     /**
  251.      * @Route("/product/view/{id}", name="product_view")
  252.      * @param Request $request
  253.      * @return Response
  254.      */
  255.     public function view(Request $requestProduct $product) {
  256.         return $this->render('product/view.html.twig', [
  257.             'product' => $product
  258.         ]);
  259.     }
  260. }