<?php
namespace App\Controller\Front;
use App\Entity\Store;
use App\Repository\OrlOfficeRepository;
use App\Repository\StoreRepository;
use App\Service\GmapsService;
use App\Service\GooglePlaceService;
use Knp\Component\Pager\PaginatorInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class StorePageController extends AbstractController
{
private array $location;
private array $departmentsList;
public function __construct(array $location, array $departmentsList) {
$this->location = $location;
$this->departmentsList = $departmentsList;
}
/**
* List all store with store page
* @Route("/centre-auditif", name="index_store_page")
*/
public function listStorePages(
StoreRepository $storeRepository,
PaginatorInterface $paginator,
Request $request
): Response
{
// get all stores with store page
$stores = $storeRepository->findStoresWithStorePage();
// sort store by departments
$result = [];
foreach ($stores as $store) {
$cp = $store->getZipCode();
$department = substr($cp, 0, 2);
if (!isset($result[$department])) {
$result[$department] = [
'name_department' => $this->departmentsList[$department] ?? 'Autres',
'stores' => [],
];
}
$result[$department]['stores'][] = $store;
}
$pagination = $paginator->paginate(
$result,
$request->query->getInt('page', 1),
5,
['wrap-queries' => true]
);
$breadcrumbs = [
['name' => 'Accueil', 'url' => $this->generateUrl('home')],
['name' => 'Centre Auditif', 'url' => $this->generateUrl('index_store_page')],
];
return $this->render('front_v4/mca/store/list.html.twig', [
'pagination' => $pagination,
'stores' => $result,
'breadcrumbs' => $breadcrumbs
]);
}
/**
* Show page details for store
*
* @Route("/centre-auditif/{slug}", name="show_store_page")
* @param Request $request
* @param Store $store
* @param LoggerInterface $logger
* @param GooglePlaceService $googlePlaceService
* @param OrlOfficeRepository $orlOfficeRepository
* @return Response
*/
public function showStorePage(
Request $request,
Store $store,
LoggerInterface $logger,
GmapsService $gmapsService,
OrlOfficeRepository $orlOfficeRepository
): Response
{
$logger->info('Display Store page ' . $store->getId());
$storePlaceData = $gmapsService->fetchGooglePlaceDataFromApi($store);
// get lat/long from finder
$coordinatesUsedInFinder = $request->getSession()->get('finder_coordinates');
// check if store has lat/lon, if it does->search orl, else empty data
if ($store->hasLatitudeAndLongitude()) {
$orlOffices = $orlOfficeRepository->findActiveOrlOfficesAroundLocation($store->getLatitude(), $store->getLongitude(), 20, 3);
} else {
$orlOffices = null;
}
$breadcrumbs = [
['name' => 'Accueil', 'url' => $this->generateUrl('home')],
];
return $this->render('front_v4/mca/store/single.html.twig', [
'orls' => $orlOffices,
'store' => $store,
'is_partner' => $store->isOpenedForProspect(),
// todo : fix this bug => return empty array
'employees' => [],
'store_page' => $store->getStorePage(),
'store_place_data' => $storePlaceData,
'coordinates_used_in_finder' => $coordinatesUsedInFinder,
'breadcrumbs' => $breadcrumbs
]);
}
/**
* List store by region
* @Route("/centres-auditifs/regions", name="list_store_by_region")
*/
public function listStoreByRegion(
StoreRepository $storeRepository,
PaginatorInterface $paginator,
Request $request
): Response
{
// sort store by departments
$result = [];
foreach ($this->location['regions'] as $regionCode => $region) {
foreach($region['departments'] as $departmentCode => $department) {
$stores = $storeRepository->findStoreByDepartment($departmentCode, 5);
if ($stores) {
$result[$regionCode] = [
'slug' => $regionCode,
'name_category' => $region['name'],
'stores' => $stores,
];
}
}
}
$pagination = $paginator->paginate(
$result,
$request->query->getInt('page', 1),
5,
['wrap-queries' => true]
);
$breadcrumbs = [
['name' => 'Accueil', 'url' => $this->generateUrl('home')],
['name' => 'Centres Auditifs', 'url' => $this->generateUrl('list_store_by_region')],
];
return $this->render('front_v4/mca/store/list_location_hierarchy/index_region.html.twig', [
'pagination' => $pagination,
'stores' => $result,
'breadcrumbs' => $breadcrumbs
]);
}
/**
* List all store by department in region
* @Route("/centres-auditifs/{region_slug}", name="list_store_by_department")
*/
public function listStoreByDepartmentInRegion(
StoreRepository $storeRepository,
PaginatorInterface $paginator,
Request $request
): Response
{
$region = $this->location['regions'][$request->get('region_slug')];
// sort store by departments
$result = [];
foreach ($region['departments'] as $departmentCode => $department) {
$stores = $storeRepository->findStoreByDepartment($departmentCode, 5);
if($stores) {
$result[$departmentCode] = [
'slug' => $department['slug'],
'name_category' => $department['name'],
'stores' => $stores,
];
}
}
$pagination = $paginator->paginate(
$result,
$request->query->getInt('page', 1),
5,
['wrap-queries' => true]
);
$breadcrumbs = [
['name' => 'Accueil', 'url' => $this->generateUrl('home')],
['name' => 'Centres Auditifs', 'url' => $this->generateUrl('list_store_by_region')],
['name' => $this->location['regions'][$request->get('region_slug')]['name'], 'url' => $this->generateUrl('list_store_by_department', ['region_slug' => $request->get('region_slug')])],
];
return $this->render('front_v4/mca/store/list_location_hierarchy/index_department.html.twig', [
'pagination' => $pagination,
'stores' => $result,
'breadcrumbs' => $breadcrumbs,
'region_slug' => $request->get('region_slug'),
]);
}
/**
* List all store by city in department
* @Route("/centres-auditifs/{region_slug}/{department_slug}", name="list_store_by_city")
*/
public function listStoreByCityInDepartment(
StoreRepository $storeRepository,
PaginatorInterface $paginator,
Request $request
): Response
{
$departments = $this->location['regions'][$request->get('region_slug')]['departments'];
$dptName = null;
// sort store by departments
$result = [];
foreach ($departments as $departmentCode => $department) {
if ($request->get('department_slug') == $department['slug']) {
$stores = $storeRepository->findStoreByCity((array)$departmentCode);
$dptName = $department['name'];
foreach ($stores as $store) {
$result[$store->getCity()] = [
'name_category' => $store->getCity() ?? 'Autres',
'stores' => $stores,
];
}
}
}
if(isset($stores)) {
$result = $stores;
}
$pagination = $paginator->paginate(
$result,
$request->query->getInt('page', 1),
5,
['wrap-queries' => true]
);
$breadcrumbs = [
['name' => 'Accueil', 'url' => $this->generateUrl('home')],
['name' => 'Centres Auditifs', 'url' => $this->generateUrl('list_store_by_region')],
['name' => $this->location['regions'][$request->get('region_slug')]['name'], 'url' => $this->generateUrl('list_store_by_department', ['region_slug' => $request->get('region_slug')])],
['name' => $dptName, 'url' => $this->generateUrl('list_store_by_department', ['region_slug' => $request->get('region_slug')])],
];
return $this->render('front_v4/mca/store/list_location_hierarchy/index_city.html.twig', [
'pagination' => $pagination,
'stores' => $result,
'breadcrumbs' => $breadcrumbs,
]);
}
}