src/Controller/VendorController.php line 123

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Command\VendorImageDownloadCommand;
  4. use App\Entity\Action;
  5. use App\Entity\User;
  6. use App\Entity\Vendor;
  7. use App\Entity\VendorCategory;
  8. use App\Entity\VendorContact;
  9. use App\Entity\VendorImage;
  10. use App\Entity\VendorNote;
  11. use App\Enumerations\ActionEnumeration;
  12. use App\Enumerations\TableCategoryEnumeration;
  13. use App\Enumerations\TableTypeEnumeration;
  14. use App\Enumerations\VendorAreaEnumeration;
  15. use App\Enumerations\VendorCategoryEnumeration;
  16. use App\Enumerations\VendorNoteLevelEnumeration;
  17. use App\Enumerations\VendorStatusEnumeration;
  18. use App\Exceptions\DownloadException;
  19. use App\Form\ScrubVendorsType;
  20. use App\Form\UpdateVendorStatusType;
  21. use App\Form\VendorFormType;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Doctrine\Persistence\ManagerRegistry;
  24. use HeadlessChromium\BrowserFactory;
  25. use HeadlessChromium\Page;
  26. use Knp\Component\Pager\PaginatorInterface;
  27. use League\Csv\Writer;
  28. use Psr\Log\LoggerInterface;
  29. use Symfony\Bundle\FrameworkBundle\Console\Application;
  30. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  31. use Symfony\Component\Console\Input\ArrayInput;
  32. use Symfony\Component\Console\Output\BufferedOutput;
  33. use Symfony\Component\Console\Output\NullOutput;
  34. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  35. use Symfony\Component\HttpFoundation\HeaderUtils;
  36. use Symfony\Component\HttpFoundation\JsonResponse;
  37. use Symfony\Component\HttpFoundation\RedirectResponse;
  38. use Symfony\Component\HttpFoundation\Request;
  39. use Symfony\Component\HttpFoundation\Response;
  40. use Symfony\Component\HttpKernel\KernelInterface;
  41. use Symfony\Component\Routing\Annotation\Route;
  42. use VStelmakh\UrlHighlight\UrlHighlight;
  43. class VendorController extends AbstractController
  44. {
  45.     protected ManagerRegistry $doctrine;
  46.     protected int $minWidth 640;
  47.     protected int $minHeight 480;
  48.     public function __construct(ManagerRegistry $doctrine)
  49.     {
  50.         $this->doctrine $doctrine;
  51.     }
  52.     #[Route('/vendor'name'app_vendor')]
  53.     public function index(PaginatorInterface $paginatorRequest $request): Response
  54.     {
  55.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  56.         /**
  57.          * @var User $user
  58.          */
  59.         $user $this->getUser();
  60.         $filter = [
  61.             'search' => $request->query->get('filter_search'),
  62.             'status' => $request->query->get('filter_status'),
  63.             'category' => $request->query->get('filter_category'),
  64.             'table' => $request->query->get('filter_table')
  65.         ]
  66.         ;
  67. //        dd($filter);
  68.         $filteredList $this->getVendorList($filter);
  69.         return $this->render('vendor/index.html.twig', [
  70.             'user' => [
  71.                 'name' => $user->getName(),
  72.                 'roles' => $user->getRoles()
  73.             ],
  74. //            'vendors' => $paginator->paginate($filteredList, $request->query->getInt('page', 1), 50),
  75.             'vendors' => $filteredList,
  76.             'search' => $filter['search'],
  77.             'status' => VendorStatusEnumeration::getList(),
  78.             'category' => VendorCategoryEnumeration::getList(),
  79.             'table' => TableCategoryEnumeration::getList(),
  80.             'filter' => $filter
  81.         ]);
  82.     }
  83.     #[Route('/vendor/collectimages''app_collectvendorimages')]
  84.     public function collectimages(Request $requestKernelInterface $kernelEntityManagerInterface $entityManagerParameterBagInterface $parameterBagLoggerInterface $logger): Response
  85.     {
  86.         set_time_limit(-1);
  87.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  88.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  89.         $vendorID $request->query->get('vendor''');
  90.         if (empty($vendorID)) {
  91.             return new RedirectResponse("/vendor");
  92.         }
  93.         $application = new Application($kernel);
  94.         $input = new ArrayInput([
  95.             'command' => 'vendor:collectimages',
  96.             'vendorid' => $vendorID
  97.         ]);
  98.         $output = new BufferedOutput();
  99.         $application->run($input$output);
  100.         return new RedirectResponse("/vendor");
  101.     }
  102.     #[Route('/vendor/view'name'app_viewvendor')]
  103.     public function viewvendor(Request $requestEntityManagerInterface $entityManager): Response
  104.     {
  105.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  106.         $user $this->getUser();
  107.         $form $this->createForm(UpdateVendorStatusType::class);
  108.         $form->handleRequest($request);
  109.         $vendorID $request->query->get('vendor''');
  110.         if (empty($vendorID)) {
  111.             return new RedirectResponse("/vendor");
  112.         }
  113.         /**
  114.          * @var Vendor $vendor
  115.          */
  116.         $vendor $entityManager->getRepository(Vendor::class)->find($vendorID);
  117.         if ($form->isSubmitted() && $form->isValid()) {
  118.             // Woohoo!
  119.             $status $form->get('status')->getData();
  120.             /**
  121.              * @var User $user
  122.              */
  123.             new Action($userActionEnumeration::ACTION_VENDOR"Set status of {$vendor->getName()} to {$status}"$entityManager);
  124.             $vendor->setStatus($status);
  125.             $entityManager->persist($vendor);
  126.             $entityManager->flush();
  127.         }
  128.         return $this->render("vendor/view.html.twig", [
  129.             'vendor' => $vendor,
  130.             'user' => [
  131.                 'name' => $user->getName(),
  132.                 'roles' => $user->getRoles()
  133.             ],
  134.             'vendorStatusForm' => $form->createView(),
  135.             'noteLabels' => VendorNoteLevelEnumeration::getList(),
  136.         ]);
  137.     }
  138.     #[Route('/vendor/addnote'name'app_addvendornote')]
  139.     public function addnote(Request $requestEntityManagerInterface $entityManager): Response
  140.     {
  141.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  142.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  143.         /**
  144.          * @var User $user
  145.          */
  146.         $user $this->getUser();
  147.         $vendid $request->request->get('vendorid');
  148.         $message $request->request->get('vendor-note-text');
  149.         $type $request->request->get('vendor-note-type');
  150.         /**
  151.          * @var Vendor $vendor
  152.          */
  153.         $vendor $entityManager->getRepository(Vendor::class)->find($vendid);
  154.         $note = new VendorNote();
  155.         $note
  156.             ->setOwner($user)
  157.             ->setVendor($vendor)
  158.             ->setMessage($message)
  159.             ->setType($type)
  160.             ->setCreatedon(new \DateTime())
  161.         ;
  162.         $entityManager->persist($note);
  163.         $entityManager->flush();
  164.         $returnTo $request->headers->get('referer');
  165.         return new RedirectResponse($returnTo);
  166.     }
  167.     #[Route('/vendor/deletenote'name'app_deletevendornote')]
  168.     public function deletenote(Request $requestEntityManagerInterface $entityManager): Response
  169.     {
  170.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  171.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  172.         /**
  173.          * @var User $user
  174.          */
  175.         $user $this->getUser();
  176.         $noteid $request->query->get('noteid');
  177.         $note $entityManager->getRepository(VendorNote::class)->find($noteid);
  178.         $entityManager->remove($note);
  179.         $entityManager->flush();
  180.         $returnTo $request->headers->get('referer');
  181.         return new RedirectResponse($returnTo);
  182.     }
  183.     #[Route('/vendor/edit/{vendorID?}'name'app_editvendor')]
  184.     public function editvendor(Request $requestEntityManagerInterface $entityManager, ?string $vendorID): Response
  185.     {
  186.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  187.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  188.         $user $this->getUser();
  189.         $vendor = new Vendor();
  190.         $vendor->setVendorContact(new VendorContact())->addVendorCategory(new VendorCategory());
  191.         if (!empty($vendorID)) {
  192.             /**
  193.              * @var Vendor $vendor
  194.              */
  195.             $vendor $entityManager->getRepository(Vendor::class)->find($vendorID);
  196.         } else {
  197.             $vendor->setRemoteId($this->getNewRemoteID($entityManager));
  198.         }
  199.         $curr $vendor->getArea();
  200.         $norm VendorAreaEnumeration::normalize($vendor->getArea());
  201.         $vendor->setArea($norm);
  202.         if (empty($vendor->getArea())) {
  203.             $vendor->setArea(VendorAreaEnumeration::AREA_GENERAL);
  204.         }
  205.         $form $this->createForm(VendorFormType::class, $vendor);
  206.         $form->handleRequest($request);
  207.         /**
  208.          * @var User $user
  209.          */
  210.         $user $this->getUser();
  211.         if ($form->isSubmitted() && $form->isValid()) {
  212.             // Here we do the field map.
  213.             new Action($userActionEnumeration::ACTION_VENDOR"Editing vendor {$vendor->getName()} id {$vendor->getId()}"$entityManager);
  214.             $vendor->detectTableCategory();
  215.             $entityManager->persist($vendor);
  216.             $entityManager->flush();
  217.             return new RedirectResponse("/vendor");
  218.         }
  219.         return $this->render("vendor/edit.html.twig", [
  220.             'vendorForm' => $form->createView(),
  221.             'user' => [
  222.                 'name' => $user->getName(),
  223.                 'roles' => $user->getRoles()
  224.             ]
  225.         ]);
  226.     }
  227.     protected function getNewRemoteID(EntityManagerInterface $entityManagerstring $prefix 'NRF-'): string
  228.     {
  229.         $ender str_pad(rand(099999), 5'0'STR_PAD_LEFT);
  230.         $id "{$prefix}{$ender}";
  231.         $vend $entityManager->getRepository(Vendor::class)->findOneBy(['remoteId' => $id]);
  232.         if (empty($vend)) {
  233.             return $id;
  234.         }
  235.         return $this->getNewRemoteID($entityManager$prefix);
  236.     }
  237.     #[Route('/vendor/delete'name"app_deletevendor")]
  238.     public function deletevendor(Request $requestEntityManagerInterface $entityManager): Response
  239.     {
  240.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  241.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  242.         /**
  243.          * @var User $user
  244.          */
  245.         $user $this->getUser();
  246.         $vendorID $request->query->get('vendor''');
  247.         /**
  248.          * @var Vendor $vendor
  249.          */
  250.         $vendor $entityManager->getRepository(Vendor::class)->find($vendorID);
  251.         new Action($userActionEnumeration::ACTION_VENDOR"Deleting vendor {$vendor->getName()} id {$vendor->getId()}"$entityManager);
  252.         $entityManager->remove($vendor);
  253.         $entityManager->flush();
  254.         return new RedirectResponse('/vendor');
  255.     }
  256.     #[Route('/vendor/scrub'name"app_scrubvendors")]
  257.     public function scrubvendors(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrine): Response
  258.     {
  259.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  260.         $this->denyAccessUnlessGranted('ROLE_EDITSTAFF');
  261.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  262.         /**
  263.          * @var User $user
  264.          */
  265.         $user $this->getUser();
  266.         $form $this->createForm(ScrubVendorsType::class, new Vendor());
  267.         $form->handleRequest($request);
  268.         if ($form->isSubmitted() && $form->isValid()) {
  269.             new Action($userActionEnumeration::ACTION_VENDOR"All vendors have been deleted from the database."$entityManager);
  270.             $connection $entityManager->getConnection();
  271.             $tables = [
  272.                 'vendor_note',
  273.                 'vendor_image',
  274.                 'vendor_address',
  275.                 'vendor_contact',
  276.                 'vendor_category',
  277.                 'vote_item',
  278.                 'vote_event',
  279.                 'vendor'
  280.             ];
  281.             foreach ($tables as $t) {
  282.                 /** @noinspection SqlNoDataSourceInspection */
  283.                 $sql "DELETE FROM {$t}";
  284.                 $statement $connection->prepare($sql);
  285.                 $statement->executeQuery([]);
  286.             }
  287.             /** @noinspection SqlNoDataSourceInspection */
  288.             $sql "DELETE FROM vendor";
  289.             $statement $connection->prepare($sql);
  290.             $statement->executeQuery([]);
  291.             $entityManager->flush();
  292.             return $this->redirectToRoute('app_dashboard');
  293.         }
  294.         return $this->render('vendor/scrubvendors.html.twig', [
  295.             'scrubvendorForm' => $form->createView(),
  296.             'user' => [
  297.                 'email' => $user->getEmail(),
  298.                 'name' => $user->getName(),
  299.                 'roles' => $user->getRoles(),
  300.             ]
  301.         ]);
  302.     }
  303.     #[Route('/vendor/getlist'name"app_downloadvendorlist")]
  304.     public function downloadFilteredList(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrine): Response
  305.     {
  306.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  307.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  308.         /**
  309.          * @var User $user
  310.          */
  311.         $user $this->getUser();
  312.         $filter = [
  313.             'status' => $request->query->get('filter_status'),
  314.             'category' => $request->query->get('filter_category'),
  315.             'table' => $request->query->get('filter_table')
  316.         ]
  317.         ;
  318.         $vendors $this->getVendorList($filter);
  319.         usort($vendors, function($a$b){
  320.             return $a->getName() <=> $b->getName();
  321.         });
  322.         $csv = [
  323.             [
  324.                 'Name',
  325.                 'Contact',
  326.                 'Email',
  327.                 'Table Requested',
  328.                 'Status'
  329.             ]
  330.         ];
  331.         /**
  332.          * @var Vendor $v
  333.          */
  334.         foreach ($vendors as $v) {
  335.             $temp = [
  336.                 $v->getName(),
  337.                 $v->getVendorContact()->getFirstName() . " " $v->getVendorContact()->getLastName(),
  338.                 $v->getVendorContact()->getEmailAddress(),
  339.                 $v->getTableRequestType(),
  340.                 $v->getStatus()
  341.             ];
  342.             $csv[] = $temp;
  343.         }
  344.         $writer Writer::createFromString();
  345.         $writer->insertAll($csv);
  346.         $output $writer->toString();
  347.         $response = new Response($output);
  348.         $stat = !empty($filter['status']) ? "_{$filter['status']}"";
  349.         $cat = !empty($filter['category']) ? "_{$filter['category']}"";
  350.         $tab = !empty($filter['table']) ? "_{$filter['table']}"";
  351.         $disp HeaderUtils::makeDisposition(
  352.             HeaderUtils::DISPOSITION_ATTACHMENT,
  353.             "dealerslist" strtolower(str_replace(" """$stat)) . strtolower(str_replace(" """$cat)) . strtolower(str_replace(" """$tab)) . "_" date("Ymd-his") . ".csv"
  354.         );
  355.         $response->headers->set('Content-Disposition'$disp);
  356.         return $response;
  357.     }
  358.     /**
  359.      * @return array
  360.      */
  361.     protected function getVendorList($filter null): array
  362.     {
  363.         $vendors $this->doctrine->getRepository(Vendor::class)->findByFilter($filter);
  364.         if(empty($filter['category'])) {
  365.             return $vendors;
  366.         }
  367.         $output = [];
  368.         /**
  369.          * @var Vendor $v
  370.          */
  371.         foreach ($vendors as $v) {
  372.             $cats $v->getVendorCategories();
  373.             /**
  374.              * @var VendorCategory $c
  375.              */
  376.             foreach ($cats as $c) {
  377.                 if ($c->getCategory() === $filter['category'] && $c->isIsPrimary() === true) {
  378.                     $output[] = $v;
  379.                 }
  380.             }
  381.         }
  382.         return $output;
  383.     }
  384.     #[Route('/vendor/resetcategories'name"app_resetvendorcategory")]
  385.     public function fixcategories(EntityManagerInterface $entityManager): Response
  386.     {
  387.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  388.         $this->denyAccessUnlessGranted('ROLE_EDITVENDOR');
  389.         $vendors $entityManager->getRepository(Vendor::class)->findAll();
  390.         /**
  391.          * @var Vendor $vendor
  392.          */
  393.         foreach ($vendors as $vendor) {
  394.             $vendor->detectTableCategory();
  395.             $entityManager->persist($vendor);
  396.         }
  397.         $entityManager->flush();
  398.         $this->addFlash('success''Table Categories have been rebuilt.');
  399.         return new RedirectResponse('/vendor');
  400.     }
  401. }