<?php
namespace App\Controller;
use App\Classes\oAddress;
use App\Entity\Addresse;
use App\Entity\AddressesList;
use App\Entity\Computing;
use App\Form\AddressesListType;
use App\Repository\AddresseRepository;
use App\Repository\AddressesListRepository;
use App\Repository\CityRepository;
use App\Repository\ComputingRepository;
use App\Repository\TimingRepository;
use App\Service\GeoLocService;
use Composer\Util\Filesystem;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Shapefile\Geometry\Point;
use Shapefile\Shapefile;
use Shapefile\ShapefileException;
use Shapefile\ShapefileWriter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* @Route("/addresses/list")
*/
class AddressesListController extends AbstractController
{
/**
* @Route("/", name="app_addresses_list_index", methods={"GET"})
*/
public function index(AddressesListRepository $addressesListRepository): Response
{
$addressesLists = $addressesListRepository->findAll();
// Surement inutiles - a Vérifier au cas ou
foreach ($addressesLists as $addressesList)
{
// $addressesListRepository->updateAddressesListStatus($addressesList);
}
return $this->render('addresses_list/index.html.twig', [
'addresses_lists' =>$addressesLists,
]);
}
/**
* @Route("/app_addresses_list_geofile/{id}", name="app_addresses_list_geofile_download", methods={"GET"})
*/
public function geofileDownload(Request $request, AddressesListRepository $addressesListRepository): Response
{
echo $this->getParameter('kernel.project_dir').'/public/generated/export.shp';
$Shapefile = new ShapefileWriter([
Shapefile::FILE_SHP => fopen($this->getParameter('kernel.project_dir').'/public/generated/export.shp' , 'c+b'),
]);
// die("test");
try {
// Open Shapefile
$Shapefile = new ShapefileWriter([
Shapefile::FILE_SHP => fopen($this->getParameter('kernel.project_dir').'/public/generated/export.shp', 'rw'),
]);
// Set shape type
$Shapefile->setShapeType(Shapefile::SHAPE_TYPE_POINT);
// Create field structure
$Shapefile->addNumericField('ID', 10);
$Shapefile->addCharField('DESC', 25);
$Point = new Point(12, 18);
// Set its data
$Point->setData('ID', 1);
$Point->setData('DESC', "Point number 1");
// Write the record to the Shapefile
$Shapefile->writeRecord($Point);
$Shapefile = null;
} catch (ShapefileException $e) {
var_dump($e);
die();
}
//die();
//return new Response('Contact us2');
// This should return the file located in /mySymfonyProject/web/public-resources/TextFile.txt
// to being viewed in the Browser
return new BinaryFileResponse($this->getParameter('kernel.project_dir')."/public/generated/export.shp");
}
/**
* @Route("/new", name="app_addresses_list_new", methods={"GET", "POST"})
*/
public function new(Request $request, AddressesListRepository $addressesListRepository): Response
{
$addressesList = new AddressesList();
$form = $this->createForm(AddressesListType::class, $addressesList);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$addressesList->setStatus(AddressesList::STATUT_VIDE);
$addressesList->setLocked(false);
$addressesListRepository->add($addressesList);
return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('addresses_list/new.html.twig', [
'addresses_list' => $addressesList,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_addresses_list_show", methods={"GET"})
*/
public function show(AddressesList $addressesList): Response
{
return $this->render('addresses_list/show_addresses.html.twig', [
'addresses_list' => $addressesList,
]);
}
/**
* @Route("/{id}/edit", name="app_addresses_list_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, AddressesList $addressesList, AddressesListRepository $addressesListRepository): Response
{
$form = $this->createForm(AddressesListType::class, $addressesList);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$addressesListRepository->add($addressesList);
return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('addresses_list/edit.html.twig', [
'addresses_list' => $addressesList,
'form' => $form,
]);
}
/**
* @Route("/{id}/delete", name="app_addresses_list_delete", methods={ "POST"})
*/
public function delete(Request $request, AddressesList $addressesList, AddressesListRepository $addressesListRepository, AddresseRepository $addresseRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$addressesList->getId(), $request->request->get('_token'))) {
$addresses = $addressesList->getAddresses();
foreach ($addresses as $address){
$addresseRepository->remove($address);
}
$addressesListRepository->remove($addressesList);
}
return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/lock", name="app_addresses_list_lock", methods={ "GET"})
*/
public function lock(Request $request, AddressesList $addressesList, AddressesListRepository $addressesListRepository): Response
{
if($addressesList->getStatus() == AddressesList::STATUT_GEOCODED){
$addressesList->setLocked(true);
$addressesListRepository->add($addressesList);
}
return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/unlock", name="app_addresses_list_unlock", methods={ "GET", "POST"})
*/
public function unlock(Request $request, AddressesList $addressesList, AddressesListRepository $addressesListRepository, ComputingRepository $computingRepository, TimingRepository $timingRepository): Response
{
if ($this->isCsrfTokenValid('unlock'.$addressesList->getId(), $request->request->get('_token'))) {
// On supprime tous les timings calculés
// Recup de toutes les computing lié
$computings = $computingRepository->findByAddressGroup($addressesList);
foreach ($computings as $computing)
{
$timingRepository->purgeComputingTiming($computing);
$computing->setStatus(Computing::STATUT_GROUPE_ADRESSE_NON_VERROUILLE);
$computingRepository->add($computing);
}
$addressesList->setLocked(false);
$addressesListRepository->add($addressesList);
return $this->redirectToRoute('app_addresses_list_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('addresses_list/unlock.html.twig', [
'addresses_list' => $addressesList,
]);
}
/**
* @Route("/{id}/import", name="app_addresse_import", methods={"GET", "POST"})
*/
public function import(Request $request, AddressesList $addressesList, AddressesListRepository $addressesListRepository , AddresseRepository $addresseRepository): Response
{
if ($this->isCsrfTokenValid('import'.$addressesList->getId(), $request->request->get('_token'))) {
$filename = $request->request->get('inputAddressesFile');
$file = $request->files->get('inputAddressesFile');
$pathname = $file->getPathname();
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load($pathname);
$sheet = $spreadsheet->getSheet($spreadsheet->getFirstSheetIndex());
$data = $sheet->toArray();
foreach ($data as $key => $elt){
if($key == 0){ continue;}
$adresse_txt = $elt[1];
$cp_txt = $elt[2];
$ville_txt = $elt[3];
$lon_text = $elt[4] ?? null;
$lat_text = $elt[5] ?? null;
$addresse = new Addresse();
$addresse->setAddress($adresse_txt);
$addresse->setZipcode($cp_txt);
$addresse->setCity($ville_txt);
$addresse->setAddressesGroup($addressesList);
if($lon_text != null){$addresse->setLon($lon_text);}
if($lat_text != null){$addresse->setLat($lat_text);}
if($lon_text != null && $lat_text != null)
{
$addresse->setStatus(Addresse::STATUT_GEOCODED);
}
else
{
$addresse->setStatus(Addresse::STATUT_NON_GEOCODED);
}
$addresseRepository->add($addresse);
}
return $this->redirectToRoute('app_addresses_list_show', ['id'=>$addressesList->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('addresses_list/import.html.twig', [
'addresses_list' => $addressesList,
]);
}
/**
* @Route("/{id}/update_status", name="app_addresses_list_update_status", methods={ "GET"})
*/
public function updateStatus(Request $request, AddressesList $addressesList, AddressesListRepository $addressesListRepository): Response
{
$addressesListRepository->updateAddressesListStatus($addressesList);
die("You should not be there");
return $this->redirectToRoute('app_addresses_list_show', ['id'=>$addressesList->getId()], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/maps", name="app_addresses_list_maps", methods={"GET"})
*/
public function maps(AddressesList $addressesList): Response
{
return $this->render('addresses_list/show_addresses_maps.html.twig', [
'addresses_list' => $addressesList,
]);
}
/**
* @Route("/{id}/ajax_geocode/{threshold}/{limit}/{offset}", name="app_addresses_list_ajax_geocode", methods={"GET"})
*/
public function ajax_geocode(AddressesList $addressesList, AddresseRepository $addresseRepository , EntityManagerInterface $entityManager, CityRepository $cityRepository, int $threshold, int $limit, int $offset): Response
{
$threshold = $threshold/100;
$output = [];
$output['continue'] = true;
$count = $addresseRepository->coundByAddressGroup($addressesList->getId());
if($offset + $limit > $count){
$output['continue'] = false;
}
$addresses = $addresseRepository->findByAddressGroup($addressesList->getId(), $limit, $offset);
foreach ($addresses as $address)
{
if($address->getStatus() == Addresse::STATUT_GEOCODED){
continue;
}
$oAddresse = new oAddress();
$oAddresse->setAddress($address->getAddress());
$oAddresse->setCity($address->getCity());
$oAddresse->setPostcode($address->getZipcode());
$possibilites = GeoLocService::geolocAddress($oAddresse, $cityRepository);
// $possibilites = GeoLocService::geolocAddress($address->getAddressLine());
if(isset($possibilites[0])){
if( $possibilites[0]['score'] >= $threshold)
{
$address->setLat($possibilites[0]['lat'] );
$address->setLon($possibilites[0]['lon']);
$address->setStatus(Addresse::STATUT_GEOCODED);
}
else
{
$address->setLat( NULL);
$address->setLon( NULL);
$address->setStatus(Addresse::STATUT_MULTIPLE_GEOCODING_MATCHES);
}
}
else
{
$address->setLat( NULL);
$address->setLon( NULL);
$address->setStatus(Addresse::STATUT_GEOCODING_ERROR);
}
$entityManager->persist($address);
}
$entityManager->flush();
$output['percentage'] = round(($offset+$limit)/$count *100 , 0 );
if($output['percentage']>100) {$output['percentage'] = 100;}
return new JsonResponse($output);
}
/**
* @Route("/{id}/bulk_geoloc", name="app_addresse_bulk_geoloc", methods={"GET"})
*/
public function bulk_geoloc(AddressesList $addressesList): Response
{
return $this->render('addresses_list/bulk_geoloc.html.twig', [
'addresses_list' => $addressesList,
]);
}
}