src/Controller/ComputingController.php line 48

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\Entity\Timing;
  8. use App\Form\ComputingType;
  9. use App\Geoloc\MapsGeolocService;
  10. use App\Geoloc\DirectionsService;
  11. use App\Repository\AddresseRepository;
  12. use App\Repository\CityRepository;
  13. use App\Repository\ComputingRepository;
  14. use App\Repository\TimingRepository;
  15. use App\Service\DataFormatService;
  16. use App\Service\GeoLocService;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  19. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  22. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. /**
  28.  * @Route("/computing")
  29.  */
  30. class ComputingController extends AbstractController
  31. {
  32.     /**
  33.      * @Route("/", name="app_computing_index", methods={"GET"})
  34.      */
  35.     public function index(ComputingRepository $computingRepository): Response
  36.     {
  37.         return $this->render('computing/index.html.twig', [
  38.             'computings' => $computingRepository->findAll(),
  39.         ]);
  40.     }
  41.     /**
  42.      * @Route("/{id}/compute", name="app_computing_compute", methods={"GET"})
  43.      */
  44.     public function compute(ComputingRepository $computingRepositoryComputing $computingTimingRepository $timingRepository): Response
  45.     {
  46.         // Etape 1 : Geocodage
  47.         if($computing->getLat() == null || $computing->getLon() == null  ){
  48.             return $this->redirectToRoute('app_computing_geocode', ['id'=>$computing->getId()], Response::HTTP_SEE_OTHER);
  49.         }
  50.         $timingRepository->purgeComputingTiming($computing);
  51.         return $this->render('computing/bulk_compute.html.twig', [
  52.             'computing' => $computing
  53.         ]);
  54.     }
  55.     /**
  56.      * @Route("/{id}/ajax_geocode/{limit}/{offset}", name="app_computing_ajax_geocode", methods={"GET"})
  57.      */
  58.     public function ajax_geocode(ComputingRepository $computingRepositoryComputing $computingTimingRepository $timingRepositoryAddresseRepository $addresseRepository EntityManagerInterface $entityManagerint $limitint $offset): Response
  59.     {
  60.         $output = [];
  61.         $output['continue'] = true;
  62.         $addressesGroup $computing->getAddressesGroup();
  63.         $count $addresseRepository->coundByAddressGroup($addressesGroup->getId());
  64.         if($offset $limit $count){
  65.             $output['continue'] = false;
  66.         }
  67.         $addresses $addresseRepository->findByAddressGroup($addressesGroup->getId(), $limit$offset);
  68.         $modes = array();
  69.         $modes[] = DirectionsService::MODE_DRIVING_LABEL;
  70.         $modes[] = DirectionsService::MODE_BICYCLING_LABEL;
  71.         $modes[] = DirectionsService::MODE_TRANSIT_LABEL;
  72.         $modes[] = DirectionsService::MODE_WALKING_LABEL;
  73.         // Departure time :
  74.         $optionalData = [];
  75.         $departureDate $computing->getDepartureDateTime();
  76.         if($departureDate != NULL )
  77.         {
  78.             $optionalData['departure_time'] =$departureDate->getTimestamp();
  79.         }
  80.         foreach ($modes as $mode){
  81.             foreach ($addresses as $address){
  82.                 // Timing aller
  83.                 $timing = new Timing();
  84.                 $timing->setDirection(Timing::DIRECTION_ALLER);
  85.                 $timing->setAddressesList($addressesGroup);
  86.                 $timing->setAddress($address);
  87.                 $timing->setComputing($computing);
  88.                 $timing->setEngine('googleAPI');
  89.                 $timing->setTransportMode(DirectionsService::ConvertTransportModeToID($mode));
  90.                 $timing->setStatus(Timing::STATUT_A_CALCULER);
  91.                 $timingRepository->add($timing);
  92.                 $timingRepository->computeTiming($timing$mode$optionalData);
  93.                 /*
  94.                 // Timing retour
  95.                 $timing = new Timing();
  96.                 $timing->setDirection(Timing::DIRECTION_RETOUR);
  97.                 $timing->setAddressesList($addressesGroup);
  98.                 $timing->setAddress($address);
  99.                 $timing->setComputing($computing);
  100.                 $timing->setEngine('googleAPI');
  101.                 $timing->setTransportMode(DirectionsService::ConvertTransportModeToID($mode));
  102.                 $timing->setStatus(Timing::STATUT_A_CALCULER);
  103.                 $timingRepository->add($timing);
  104.                 $timingRepository->computeTiming($timing, $mode);
  105.                 */
  106.             }
  107.         }
  108.         $entityManager->flush();
  109.         $output['percentage'] = round(($offset+$limit)/$count *100 );
  110.         if($output['percentage']>100) {$output['percentage'] = 100;}
  111.         return new JsonResponse($output);
  112.     }
  113.         /**
  114.      * @Route("/{id}/geocode", name="app_computing_geocode", methods={"GET", "POST"})
  115.      */
  116.     public function geocode(Request $requestComputingRepository $computingRepository CityRepository  $cityRepositoryComputing $computing): Response
  117.     {
  118. //        $possibilites = GeoLocService::geolocAddress($computing->getAddresse());
  119.         $oAddresse = new oAddress();
  120.         $oAddresse->setAddress($computing->getAddresse());
  121.         $possibilites GeoLocService::geolocAddress($oAddresse$cityRepository);
  122.         if ($this->isCsrfTokenValid('geocode'.$computing->getId(), $request->request->get('_token'))) {
  123.             $geocodingChoice =  $request->request->get('geocodingChoice');
  124.             $tmp explode("||"$geocodingChoice);
  125.             $lat $tmp[0];
  126.             $lon $tmp[1];
  127.             $computing->setLat($lat);
  128.             $computing->setLon($lon);
  129.             $computing->setStatus(Computing::STATUT_GEO_VALIDE);
  130.             $computingRepository->add($computing);
  131.             return $this->redirectToRoute('app_computing_compute', ['id'=>$computing->getId()],  Response::HTTP_SEE_OTHER);
  132.         }
  133.         return $this->render('computing/geocode.html.twig', [
  134.             'computing' => $computing,
  135.             'possibilites' => $possibilites
  136.         ]);
  137.     }
  138.     /**
  139.      * @Route("/new", name="app_computing_new", methods={"GET", "POST"})
  140.      */
  141.     public function new(Request $requestComputingRepository $computingRepository): Response
  142.     {
  143.         $computing = new Computing();
  144.         $form $this->createForm(ComputingType::class, $computing);
  145.         $form->handleRequest($request);
  146.         if ($form->isSubmitted() && $form->isValid()) {
  147.             $computingRepository->add($computing);
  148.             return $this->redirectToRoute('app_computing_index', [], Response::HTTP_SEE_OTHER);
  149.         }
  150.         return $this->renderForm('computing/new.html.twig', [
  151.             'computing' => $computing,
  152.             'form' => $form,
  153.         ]);
  154.     }
  155.     /**
  156.      * @Route("/{id}", name="app_computing_show", methods={"GET"})
  157.      */
  158.     public function show(Computing $computingTimingRepository $timingRepository): Response
  159.     {
  160.         $outputTimings = [];
  161.         $moyennesData = [];
  162.         $addressesList $computing->getAddressesGroup();
  163.         $addresses $addressesList->getAddresses();
  164.         $transportModes DirectionsService::GetTransportModes();
  165.         //$directions = ['aller' => Timing::DIRECTION_ALLER, 'retour' =>Timing::DIRECTION_RETOUR];
  166.         $directions = ['aller' => Timing::DIRECTION_ALLER];
  167.         foreach ($addresses as $address)
  168.         {
  169.             $tmp = [];
  170.             $tmp["address_name"] = $address->toString();
  171.             foreach ($transportModes as $transportMode)
  172.             {
  173.                 $transportModeID DirectionsService::ConvertTransportModeToID($transportMode);
  174.                 foreach ($directions as $direction_label => $direction)
  175.                 {
  176.                     $timings $timingRepository->findTimingsByComputingAddressAndTransportMode($computing$address$transportModeID$direction);
  177.                     if(isset($timings[0]))
  178.                     {
  179.                         $seconds $timings[0]->getTime();
  180.                         $tmp[$direction_label]["timing"][$transportMode] =  DataFormatService::formatSecond($seconds);
  181.                         $tmp[$direction_label]["distance"][$transportMode] =  round($timings[0]->getDistance()/10002)."km";
  182.                         $moyennesData[$direction_label][$transportMode][] = $seconds;
  183.                     }
  184.                     else
  185.                     {
  186.                         $tmp[$direction_label]["timing"][$transportMode] = '';
  187.                         $tmp[$direction_label]["distance"][$transportMode] = '';
  188.                     }
  189.                 }
  190. //                var_dump($timings);
  191.  //               die();
  192.             }
  193.             $outputTimings[] = $tmp;
  194.         }
  195.         $moyennes = [];
  196.         foreach ($moyennesData as $directionLabel => $subData)
  197.         {
  198.             foreach ($subData as $tranportMode => $values)
  199.             {
  200.                 $moyennes[$directionLabel][$tranportMode] =  round(array_sum($values) / count($values)/60);
  201.             }
  202.         }
  203.         return $this->render('computing/show.html.twig', [
  204.             'moyennes' => $moyennes,
  205.             'timings' => $outputTimings,
  206.             'computing' => $computing,
  207.         ]);
  208.     }
  209.     /**
  210.      * @Route("/{id}/edit", name="app_computing_edit", methods={"GET", "POST"})
  211.      */
  212.     public function edit(Request $requestComputing $computingComputingRepository $computingRepository): Response
  213.     {
  214.         $form $this->createForm(ComputingType::class, $computing);
  215.         $form->handleRequest($request);
  216.         if ($form->isSubmitted() && $form->isValid()) {
  217.             //$computing->setLat(null);
  218.             //$computing->setLon(null);
  219.             $computingRepository->add($computing);
  220.             return $this->redirectToRoute('app_computing_index', [], Response::HTTP_SEE_OTHER);
  221.         }
  222.         return $this->renderForm('computing/edit.html.twig', [
  223.             'computing' => $computing,
  224.             'form' => $form,
  225.         ]);
  226.     }
  227.     /**
  228.      * @Route("/{id}/delete", name="app_computing_delete", methods={"POST"})
  229.      */
  230.     public function delete(Request $requestComputing $computingComputingRepository $computingRepositoryTimingRepository $timingRepository): Response
  231.     {
  232.         if ($this->isCsrfTokenValid('delete'.$computing->getId(), $request->request->get('_token'))) {
  233.             $computingRepository->remove($computing $timingRepository);
  234.         }
  235.         return $this->redirectToRoute('app_computing_index', [], Response::HTTP_SEE_OTHER);
  236.     }
  237.     /**
  238.      * @Route("/{id}/export/excell", name="app_computing_export_excell", methods={"GET"})
  239.      */
  240.     public function excell_exportComputing $computingComputingRepository $computingRepositoryTimingRepository $timingRepository)
  241.     {
  242.         $excell_tpl =  $this->getParameter('kernel.project_dir')."/public/ekotools/templates/Ekotools_generated_template.xls";
  243.         $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
  244.         $spreadsheet $reader->load($excell_tpl);
  245.         $sheet $spreadsheet->getActiveSheet();
  246.        // $sheet->setCellValue('A1', 'Hello World !');
  247.         $addressesList $computing->getAddressesGroup();
  248.         $addresses $addressesList->getAddresses();
  249.         $transportModes = [];
  250.         $transportModes[] = DirectionsService::MODE_DRIVING_LABEL;
  251.         $transportModes[] = DirectionsService::MODE_TRANSIT_LABEL;
  252.         $transportModes[] = DirectionsService::MODE_BICYCLING_LABEL;
  253.         $transportModes[] = DirectionsService::MODE_WALKING_LABEL;
  254.         $directions = ['aller' => Timing::DIRECTION_ALLER];
  255.         //$directions = ['aller' => Timing::DIRECTION_ALLER, 'retour' =>Timing::DIRECTION_RETOUR];
  256.         $row 3;
  257.         foreach ($addresses as  $address)
  258.         {
  259.             $row++;
  260.             $col 1;
  261.             $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow$col$row$address->toString());
  262.             $col 2;
  263.             $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($col$row$computing->getAddresse());
  264.             foreach ($transportModes as $transportMode)
  265.             {
  266.                 $transportModeID DirectionsService::ConvertTransportModeToID($transportMode);
  267.                 foreach ($directions as $direction_label => $direction)
  268.                 {
  269.                     $timings $timingRepository->findTimingsByComputingAddressAndTransportMode($computing$address$transportModeID$direction);
  270.                     if(isset($timings[0]))
  271.                     {
  272.                         $seconds $timings[0]->getTime();
  273.                         $tmp[$direction_label]["timing"][$transportMode] =  DataFormatService::formatSecond($seconds);
  274.                         $tmp[$direction_label]["distance"][$transportMode] =  round($timings[0]->getDistance()/10002)."km";
  275.                         $moyennesData[$direction_label][$transportMode][] = $seconds;
  276.                     }
  277.                     else
  278.                     {
  279.                         $tmp[$direction_label]["timing"][$transportMode] = '';
  280.                         $tmp[$direction_label]["distance"][$transportMode] = '';
  281.                     }
  282.                     $col++;
  283.                     $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($col$row$seconds);
  284.                     $col++;
  285.                     $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($col$row$timings[0]->getDistance());
  286.                     $col++;
  287.                     $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($col$row$timings[0]->getSteps());
  288.                     $col++;
  289.                     if($transportMode == DirectionsService::MODE_DRIVING_LABEL)
  290.                     {
  291.                         $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($col$rowround($timings[0]->getDistance()*254/1000,0));
  292.                     }
  293.                     elseif($transportMode == DirectionsService::MODE_TRANSIT_LABEL)
  294.                     {
  295.                         $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($col$rowround($timings[0]->getDistance()*0.08/1000,0));
  296.                     }
  297.                     else
  298.                     {
  299.                         $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($col$row0);
  300.                     }
  301.                 }
  302.             }
  303.             $outputTimings[] = $tmp;
  304.         }
  305.         $writer = new Xlsx($spreadsheet);
  306.         $writer->save('generated/result.xlsx');
  307.         // This should return the file located in /mySymfonyProject/web/public-resources/TextFile.txt
  308.         // to being viewed in the Browser
  309.         return new BinaryFileResponse($this->getParameter('kernel.project_dir')."/public/generated/result.xlsx");
  310.     }
  311. }