src/Controller/AddressesListController.php line 314

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Classes\oAddress;
  4. use App\Entity\Addresse;
  5. use App\Entity\AddressesList;
  6. use App\Entity\Computing;
  7. use App\Form\AddressesListType;
  8. use App\Repository\AddresseRepository;
  9. use App\Repository\AddressesListRepository;
  10. use App\Repository\CityRepository;
  11. use App\Repository\ComputingRepository;
  12. use App\Repository\TimingRepository;
  13. use App\Service\GeoLocService;
  14. use Composer\Util\Filesystem;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use PhpOffice\PhpSpreadsheet\IOFactory;
  17. use Shapefile\Geometry\Point;
  18. use Shapefile\Shapefile;
  19. use Shapefile\ShapefileException;
  20. use Shapefile\ShapefileWriter;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\HttpFoundation\JsonResponse;
  27. /**
  28.  * @Route("/addresses/list")
  29.  */
  30. class AddressesListController extends AbstractController
  31. {
  32.     /**
  33.      * @Route("/", name="app_addresses_list_index", methods={"GET"})
  34.      */
  35.     public function index(AddressesListRepository $addressesListRepository): Response
  36.     {
  37.         $addressesLists =  $addressesListRepository->findAll();
  38.         // Surement inutiles - a Vérifier au cas ou
  39.         foreach ($addressesLists as $addressesList)
  40.         {
  41.           //  $addressesListRepository->updateAddressesListStatus($addressesList);
  42.         }
  43.         return $this->render('addresses_list/index.html.twig', [
  44.             'addresses_lists' =>$addressesLists,
  45.         ]);
  46.     }
  47.     /**
  48.      * @Route("/app_addresses_list_geofile/{id}", name="app_addresses_list_geofile_download", methods={"GET"})
  49.      */
  50.     public function geofileDownload(Request $requestAddressesListRepository $addressesListRepository): Response
  51.     {
  52.         echo $this->getParameter('kernel.project_dir').'/public/generated/export.shp';
  53.         $Shapefile = new ShapefileWriter([
  54.             Shapefile::FILE_SHP => fopen($this->getParameter('kernel.project_dir').'/public/generated/export.shp' 'c+b'),
  55.         ]);
  56.        // die("test");
  57.         try {
  58.             // Open Shapefile
  59.             $Shapefile = new ShapefileWriter([
  60.                 Shapefile::FILE_SHP => fopen($this->getParameter('kernel.project_dir').'/public/generated/export.shp''rw'),
  61.             ]);
  62.             // Set shape type
  63.             $Shapefile->setShapeType(Shapefile::SHAPE_TYPE_POINT);
  64.             // Create field structure
  65.             $Shapefile->addNumericField('ID'10);
  66.             $Shapefile->addCharField('DESC'25);
  67.             $Point = new Point(1218);
  68.             // Set its data
  69.             $Point->setData('ID'1);
  70.             $Point->setData('DESC'"Point number 1");
  71.             // Write the record to the Shapefile
  72.             $Shapefile->writeRecord($Point);
  73.             $Shapefile null;
  74.         } catch (ShapefileException $e) {
  75.             var_dump($e);
  76.             die();
  77.         }
  78.         //die();
  79.         //return  new Response('Contact us2');
  80.         // This should return the file located in /mySymfonyProject/web/public-resources/TextFile.txt
  81.         // to being viewed in the Browser
  82.         return new BinaryFileResponse($this->getParameter('kernel.project_dir')."/public/generated/export.shp");
  83.     }
  84.     /**
  85.      * @Route("/new", name="app_addresses_list_new", methods={"GET", "POST"})
  86.      */
  87.     public function new(Request $requestAddressesListRepository $addressesListRepository): Response
  88.     {
  89.         $addressesList = new AddressesList();
  90.         $form $this->createForm(AddressesListType::class, $addressesList);
  91.         $form->handleRequest($request);
  92.         if ($form->isSubmitted() && $form->isValid()) {
  93.             $addressesList->setStatus(AddressesList::STATUT_VIDE);
  94.             $addressesList->setLocked(false);
  95.             $addressesListRepository->add($addressesList);
  96.             return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
  97.         }
  98.         return $this->renderForm('addresses_list/new.html.twig', [
  99.             'addresses_list' => $addressesList,
  100.             'form' => $form,
  101.         ]);
  102.     }
  103.     /**
  104.      * @Route("/{id}", name="app_addresses_list_show", methods={"GET"})
  105.      */
  106.     public function show(AddressesList $addressesList): Response
  107.     {
  108.         return $this->render('addresses_list/show_addresses.html.twig', [
  109.             'addresses_list' => $addressesList,
  110.         ]);
  111.     }
  112.     /**
  113.      * @Route("/{id}/edit", name="app_addresses_list_edit", methods={"GET", "POST"})
  114.      */
  115.     public function edit(Request $requestAddressesList $addressesListAddressesListRepository $addressesListRepository): Response
  116.     {
  117.         $form $this->createForm(AddressesListType::class, $addressesList);
  118.         $form->handleRequest($request);
  119.         if ($form->isSubmitted() && $form->isValid()) {
  120.             $addressesListRepository->add($addressesList);
  121.             return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
  122.         }
  123.         return $this->renderForm('addresses_list/edit.html.twig', [
  124.             'addresses_list' => $addressesList,
  125.             'form' => $form,
  126.         ]);
  127.     }
  128.     /**
  129.      * @Route("/{id}/delete", name="app_addresses_list_delete", methods={ "POST"})
  130.      */
  131.     public function delete(Request $requestAddressesList $addressesListAddressesListRepository $addressesListRepositoryAddresseRepository $addresseRepository): Response
  132.     {
  133.         if ($this->isCsrfTokenValid('delete'.$addressesList->getId(), $request->request->get('_token'))) {
  134.             $addresses $addressesList->getAddresses();
  135.             foreach ($addresses as $address){
  136.                 $addresseRepository->remove($address);
  137.             }
  138.             $addressesListRepository->remove($addressesList);
  139.         }
  140.         return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
  141.     }
  142.     /**
  143.      * @Route("/{id}/lock", name="app_addresses_list_lock", methods={ "GET"})
  144.      */
  145.     public function lock(Request $requestAddressesList $addressesListAddressesListRepository $addressesListRepository): Response
  146.     {
  147.         if($addressesList->getStatus() == AddressesList::STATUT_GEOCODED){
  148.             $addressesList->setLocked(true);
  149.             $addressesListRepository->add($addressesList);
  150.         }
  151.         return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
  152.     }
  153.     /**
  154.      * @Route("/{id}/unlock", name="app_addresses_list_unlock", methods={ "GET", "POST"})
  155.      */
  156.     public function unlock(Request $requestAddressesList $addressesListAddressesListRepository $addressesListRepositoryComputingRepository $computingRepositoryTimingRepository $timingRepository): Response
  157.     {
  158.         if ($this->isCsrfTokenValid('unlock'.$addressesList->getId(), $request->request->get('_token'))) {
  159.             // On supprime tous les timings calculés
  160.             // Recup de toutes les computing lié
  161.             $computings $computingRepository->findByAddressGroup($addressesList);
  162.             foreach ($computings as $computing)
  163.             {
  164.                 $timingRepository->purgeComputingTiming($computing);
  165.                 $computing->setStatus(Computing::STATUT_GROUPE_ADRESSE_NON_VERROUILLE);
  166.                 $computingRepository->add($computing);
  167.             }
  168.             $addressesList->setLocked(false);
  169.             $addressesListRepository->add($addressesList);
  170.             return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
  171.         }
  172.         return $this->renderForm('addresses_list/unlock.html.twig', [
  173.             'addresses_list' => $addressesList,
  174.         ]);
  175.     }
  176.     /**
  177.      * @Route("/{id}/import", name="app_addresse_import", methods={"GET", "POST"})
  178.      */
  179.     public function import(Request $requestAddressesList $addressesListAddressesListRepository $addressesListRepository AddresseRepository $addresseRepository): Response
  180.     {
  181.         if ($this->isCsrfTokenValid('import'.$addressesList->getId(), $request->request->get('_token'))) {
  182.             $filename $request->request->get('inputAddressesFile');
  183.             $file =  $request->files->get('inputAddressesFile');
  184.             $pathname  $file->getPathname();
  185.             $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  186.             $reader->setReadDataOnly(true);
  187.             $spreadsheet $reader->load($pathname);
  188.             $sheet $spreadsheet->getSheet($spreadsheet->getFirstSheetIndex());
  189.             $data $sheet->toArray();
  190.             foreach ($data as $key => $elt){
  191.                 if($key == 0){ continue;}
  192.                 $adresse_txt $elt[1];
  193.                 $cp_txt $elt[2];
  194.                 $ville_txt $elt[3];
  195.                 $lon_text $elt[4] ?? null;
  196.                 $lat_text $elt[5] ?? null;
  197.                 $addresse = new Addresse();
  198.                 $addresse->setAddress($adresse_txt);
  199.                 $addresse->setZipcode($cp_txt);
  200.                 $addresse->setCity($ville_txt);
  201.                 $addresse->setAddressesGroup($addressesList);
  202.                 if($lon_text != null){$addresse->setLon($lon_text);}
  203.                 if($lat_text != null){$addresse->setLat($lat_text);}
  204.                 if($lon_text != null && $lat_text != null)
  205.                 {
  206.                     $addresse->setStatus(Addresse::STATUT_GEOCODED);
  207.                 }
  208.                 else
  209.                 {
  210.                     $addresse->setStatus(Addresse::STATUT_NON_GEOCODED);
  211.                 }
  212.                 $addresseRepository->add($addresse);
  213.             }
  214.             return $this->redirectToRoute('app_addresses_list_show', ['id'=>$addressesList->getId()],  Response::HTTP_SEE_OTHER);
  215.         }
  216.         return $this->renderForm('addresses_list/import.html.twig', [
  217.             'addresses_list' => $addressesList,
  218.         ]);
  219.     }
  220.     /**
  221.      * @Route("/{id}/update_status", name="app_addresses_list_update_status", methods={ "GET"})
  222.      */
  223.     public function updateStatus(Request $requestAddressesList $addressesListAddressesListRepository $addressesListRepository): Response
  224.     {
  225.         $addressesListRepository->updateAddressesListStatus($addressesList);
  226.         die("You should not be there");
  227.         return $this->redirectToRoute('app_addresses_list_show', ['id'=>$addressesList->getId()], Response::HTTP_SEE_OTHER);
  228.     }
  229.     /**
  230.      * @Route("/{id}/maps", name="app_addresses_list_maps", methods={"GET"})
  231.      */
  232.     public function maps(AddressesList $addressesList): Response
  233.     {
  234.         return $this->render('addresses_list/show_addresses_maps.html.twig', [
  235.             'addresses_list' => $addressesList,
  236.         ]);
  237.     }
  238.     /**
  239.      * @Route("/{id}/ajax_geocode/{threshold}/{limit}/{offset}", name="app_addresses_list_ajax_geocode", methods={"GET"})
  240.      */
  241.     public function ajax_geocode(AddressesList $addressesListAddresseRepository $addresseRepository EntityManagerInterface $entityManagerCityRepository  $cityRepositoryint $thresholdint $limitint $offset): Response
  242.     {
  243.         $threshold $threshold/100;
  244.         $output = [];
  245.         $output['continue'] = true;
  246.         $count $addresseRepository->coundByAddressGroup($addressesList->getId());
  247.         if($offset $limit $count){
  248.             $output['continue'] = false;
  249.         }
  250.         $addresses $addresseRepository->findByAddressGroup($addressesList->getId(), $limit$offset);
  251.         foreach ($addresses as $address)
  252.         {
  253.             if($address->getStatus()  == Addresse::STATUT_GEOCODED){
  254.                continue;
  255.             }
  256.             $oAddresse = new oAddress();
  257.             $oAddresse->setAddress($address->getAddress());
  258.             $oAddresse->setCity($address->getCity());
  259.             $oAddresse->setPostcode($address->getZipcode());
  260.             $possibilites GeoLocService::geolocAddress($oAddresse$cityRepository);
  261.           // $possibilites = GeoLocService::geolocAddress($address->getAddressLine());
  262.            if(isset($possibilites[0])){
  263.                if( $possibilites[0]['score'] >= $threshold)
  264.                {
  265.                    $address->setLat($possibilites[0]['lat'] );
  266.                    $address->setLon($possibilites[0]['lon']);
  267.                    $address->setStatus(Addresse::STATUT_GEOCODED);
  268.                }
  269.                else
  270.                {
  271.                    $address->setLatNULL);
  272.                    $address->setLonNULL);
  273.                    $address->setStatus(Addresse::STATUT_MULTIPLE_GEOCODING_MATCHES);
  274.                }
  275.            }
  276.            else
  277.            {
  278.                $address->setLatNULL);
  279.                $address->setLonNULL);
  280.                $address->setStatus(Addresse::STATUT_GEOCODING_ERROR);
  281.            }
  282.             $entityManager->persist($address);
  283.         }
  284.         $entityManager->flush();
  285.         $output['percentage'] = round(($offset+$limit)/$count *100 );
  286.         if($output['percentage']>100) {$output['percentage'] = 100;}
  287.         return new JsonResponse($output);
  288.     }
  289.     /**
  290.      * @Route("/{id}/bulk_geoloc", name="app_addresse_bulk_geoloc", methods={"GET"})
  291.      */
  292.     public function bulk_geoloc(AddressesList $addressesList): Response
  293.     {
  294.         return $this->render('addresses_list/bulk_geoloc.html.twig', [
  295.             'addresses_list' => $addressesList,
  296.         ]);
  297.     }
  298. }