<?php
namespace App\Controller;
use App\Entity\Client;
use App\Entity\Brand;
use App\Form\ClientType;
use App\Repository\ClientRepository;
use App\Repository\CarSaleRepository;
use App\Repository\CarBuyRepository;
use App\Repository\BrandRepository;
use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/client")
*/
class ClientController extends AbstractController
{
/**
* @Route("/indexJson", name="client_index_json", methods={"GET", "POST"})
*/
public function indexJson(Request $request, ClientRepository $entityRepository, CarSaleRepository $carSaleRepository): Response
{
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$dateFrom = $request->get('dateFrom').' 00:00:00';
$dateTo = $request->get('dateTo').' 23:59:59';
$dateFilter = $request->get('dateFilter');
$operFilter = $request->get('operationsFilter');
$patentFilter = $request->get('patentFilter');
//exit($dateFrom.';'.$dateTo);
if (!empty($search)) {
}
/*---- Filters [END] ----*/
$totalR = 0;
$curPage = $request->get('current');
$sizePage = $request->get('rowCount');
$startPage = $curPage == 1 ? 0 : (($curPage - 1) * $sizePage);
$data = $entityRepository->createQueryBuilder('c')
->where('c.id > :id')
->setParameter('id', '0');
if ($patentFilter == 'true') {
} else {
$data = $data->andWhere('c.firstName like :search')
->orWhere('c.lastName like :search')
->orWhere('c.dni like :search')
->orWhere('c.telephone like :search')
->orWhere('c.cellphone like :search')
->orWhere('c.address like :search')
->setParameter(':search', "%$search%");
}
if ($dateFilter == 'true') {
$data = $data->andWhere('c.createdAt BETWEEN :dateFrom AND :dateTo')
->setParameter(':dateFrom', $dateFrom)
->setParameter(':dateTo', $dateTo);
}
$data = $data->leftJoin('c.user', 'u')
->addSelect('u');
if ($this->getUser()->getRoles()[0] == 'ROLE_ADMIN' || $this->getUser()->getRoles()[0] == 'ROLE_AGENCY') {
} else {
$data = $data->having('u.id = :user')
->setParameter(':user', $this->getUser()->getId());
}
//dump($data->getDQL()); exit();
if ($operFilter == 'true') {
$filterPatent = '';
if ($patentFilter == 'true') {
$filterPatent = "
LEFT JOIN car c ON c.id = cs.car_sale_id
WHERE c.patent like '%$search%'";
}
$query = "
SELECT DISTINCT cs.client_id, cs.client_id
FROM car_sale cs
$filterPatent
";
$em = $this->getDoctrine()->getManager();
$db = $em->getConnection();
$stmt = $db->prepare($query);
$result = $stmt->executeQuery();
$sales = $result->fetchAllKeyValue();
$aOperFilter = array();
foreach ($sales as $item) {
$aOperFilter[] = $item;
}
$filterPatent = '';
if ($patentFilter == 'true') {
$filterPatent = "
LEFT JOIN car c ON c.id = cb.car_id
WHERE c.patent like '%$search%'";
}
$query = "
SELECT DISTINCT cb.client_id, cb.client_id
FROM car_buy cb
$filterPatent
";
$em = $this->getDoctrine()->getManager();
$db = $em->getConnection();
$stmt = $db->prepare($query);
$result = $stmt->executeQuery();
$purchases = $result->fetchAllKeyValue();
foreach ($purchases as $item) {
$aOperFilter[] = $item;
}
//dump($aOperFilter); exit();
//dump(implode(',', $aOperFilter)); exit();
if (count($aOperFilter) > 0) {
$data = $data->andWhere('c.id IN (:clients)')
->setParameter(':clients', $aOperFilter);
} else if ($patentFilter == 'true') {
$data = $data->andWhere('c.id IN (:clients)')
->setParameter(':clients', 0);
}
}
//echo $search.'<br>'; print_r($aOperFilter); exit();
//echo $data->getQuery()->getSQL(); exit();
$total = $data->getQuery()
->getArrayResult();
$data = $data->setFirstResult($startPage)
->setMaxResults($sizePage)
->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
//dump($total); exit();
//dump($data); exit();
/*
if ($this->getUser()->getRoles()[0] == 'ROLE_ADMIN') {
if ($dateFilter == 'true') {
$data = $entityRepository->createQueryBuilder('c')
->leftJoin('c.user', 'u')
->addSelect('u')
->where('c.id > :id')
->andWhere('c.firstName like :search')
->orWhere('c.lastName like :search')
->orWhere('c.dni like :search')
->orWhere('c.telephone like :search')
->orWhere('c.cellphone like :search')
->orWhere('c.address like :search')
->andWhere('c.createdAt BETWEEN :dateFrom AND :dateTo')
->setParameter('id', '0')
->setParameter(':search', "%$search%")
->setParameter(':dateFrom', $dateFrom)
->setParameter(':dateTo', $dateTo)
->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
//dump($data->getSql());
//dump($data->getParameters());
//exit();
} else {
$data = $entityRepository->createQueryBuilder('c')
->leftJoin('c.user', 'u')
->addSelect('u')
->where('c.id > :id')
->andWhere('c.firstName like :search')
->orWhere('c.lastName like :search')
->orWhere('c.dni like :search')
->orWhere('c.telephone like :search')
->orWhere('c.cellphone like :search')
->orWhere('c.address like :search')
->setParameter('id', '0')
->setParameter(':search', "%$search%")
->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
//dump($data->getSql()); exit();
}
} else {
if ($dateFilter == 'true') {
$data = $entityRepository->createQueryBuilder('c')
->where('c.id > :id')
->andWhere('c.firstName like :search')
->andWhere('c.createdAt BETWEEN :dateFrom AND :dateTo')
->orWhere('c.lastName like :search')
->orWhere('c.dni like :search')
->orWhere('c.telephone like :search')
->orWhere('c.cellphone like :search')
->orWhere('c.address like :search')
->setParameter('id', '0')
->having('c.user = :user')
->setParameter(':search', "%$search%")
->setParameter(':user', $this->getUser()->getId())
->setParameter(':dateFrom', $dateFrom)
->setParameter(':dateTo', $dateTo)
->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
} else {
$data = $entityRepository->createQueryBuilder('c')
->where('c.id > :id')
->andWhere('c.firstName like :search')
->orWhere('c.lastName like :search')
->orWhere('c.dni like :search')
->orWhere('c.telephone like :search')
->orWhere('c.cellphone like :search')
->orWhere('c.address like :search')
->setParameter('id', '0')
->having('c.user = :user')
->setParameter(':search', "%$search%")
->setParameter(':user', $this->getUser()->getId())
->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
}
}
*/
$json_data = array(
"current" => intval($curPage),
"rowCount" => $sizePage,
"total" => count($total),
"rows" => $data,
);
return $this->json($json_data);
}
/**
* @Route("/clientList", name="client_list", methods={"GET", "POST"})
*/
public function clientList(Request $request, ClientRepository $entityRepository): Response
{
$list = '<option value=""></option>';
$data = $entityRepository->findAll();
foreach ($data as $item) {
$list .= '<option value="'.$item->getId().'">'.$item->getFirstName().' '.$item->getLastName().'</option>';
}
return new Response($list);
}
/**
* @Route("/", name="client_index", methods={"GET"})
*/
public function index(ClientRepository $clientRepository, CarSaleRepository $carSaleRepository, CarBuyRepository $carBuyRepository): Response
{
$sales = $carSaleRepository->getCountSales();
$purchases = $carBuyRepository->getCountPurchases();
return $this->render('client/index.html.twig', [
'clients' => $clientRepository->findAll(),
'currentMenu' => 'client',
'sales' => $sales,
'purchases' => $purchases,
]);
}
/**
* @Route("/settings", name="client_settings", methods={"GET"})
*/
public function settings(ClientRepository $clientRepository): Response
{
return $this->render('client/settings.html.twig', [
'clients' => $clientRepository->findAll(),
'currentMenu' => 'system',
]);
}
/**
* @Route("/new", name="client_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$client = new Client();
$form = $this->createForm(ClientType::class, $client);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
$client->SetUser($this->getUser());
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($client);
$entityManager->flush();
return $this->redirectToRoute('client_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('client/new.html.twig', [
'client' => $client,
'form' => $form->createView(),
'currentMenu' => 'client',
]);
}
/**
* @Route("/new/modal", name="client_new_modal", methods={"GET","POST"})
*/
public function newModal(Request $request): Response
{
$client = new Client();
$form = $this->createForm(ClientType::class, $client, [
'action' => $this->generateUrl('client_new_modal')
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
$client->SetUser($this->getUser());
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($client);
try {
$entityManager->flush();
$status = 'success';
$message = 'New client created';
$clientId = $client->getId();
} catch (\Exception $e) {
$status = 'error';
$message = $e->getMessage();
$clientId = 0;
}
$response = array(
'status' => $status,
'message' => $message,
'clientId' => $clientId,
);
return $this->json($response);
}
return $this->render('client/new_modal.html.twig', [
'client' => $client,
'form' => $form->createView(),
'currentMenu' => 'client',
]);
}
/**
* @Route("/{id}", name="client_show", methods={"GET"})
*/
public function show(Client $client): Response
{
return $this->render('client/show.html.twig', [
'client' => $client,
'currentMenu' => 'client',
]);
}
/**
* @Route("/{id}/modal", name="client_show_modal", methods={"GET"})
*/
public function showModal(Client $client): Response
{
return $this->render('client/show_modal.html.twig', [
'client' => $client,
'currentMenu' => 'client',
]);
}
/**
* @Route("/{id}/operations", name="client_operations_modal", methods={"GET"})
*/
public function operationsModal($id, Client $client, CarSaleRepository $carSaleRepository, CarBuyRepository $carBuyRepository): Response
{
/*
$query = "
SELECT *
FROM car_sale
WHERE client_id = $id
";
$em = $this->getDoctrine()->getManager();
$db = $em->getConnection();
$stmt = $db->prepare($query);
$result = $stmt->executeQuery();
$sales = $result->fetchAllKeyValue();
//$sales = $result->fetchAllAssociativeIndexed();
*/
$sales = $carSaleRepository->findBy( ['client' => $id] );
$purchases = $carBuyRepository->findBy( ['client' => $id] );
//dump($purchases); exit();
return $this->render('client/operations_modal.html.twig', [
'client' => $client,
'currentMenu' => 'client',
'sales' => $sales,
'purchases' => $purchases,
]);
}
/**
* @Route("/{id}/notifications", name="client_notifications_modal", methods={"GET"})
*/
public function notificationsModal($id, Client $client, BrandRepository $entityRepository): Response
{
$brand = $entityRepository->createQueryBuilder('b')
->indexBy('b', 'b.id')
->orderBy('b.name', 'ASC')
->getQuery()
->getArrayResult();
return $this->render('client/notifications_modal.html.twig', [
'client' => $client,
'currentMenu' => 'client',
'brand' => $brand,
]);
}
/**
* @Route("/{id}/notificationsSave", name="client_notifications_save", methods={"POST"})
*/
public function notificationsSave($id, Client $client, Request $request): Response
{
$notifyByEmail = $request->get('notification-mail') == 'true' ? 1 : 0;
$notifyByWhatsapp = $request->get('notification-whatsapp') == 'true' ? 1 : 0;
$notifyVehicleEntry = $request->get('notification-vehicle-entry') == 'true' ? 1 : 0;
$client->setNotifyByEmail($notifyByEmail);
$client->setNotifyByWhatsapp($notifyByWhatsapp);
$client->setNotifyVehicleEntry($notifyVehicleEntry);
$this->getDoctrine()->getManager()->flush();
return $this->json('1');
}
/**
* @Route("/{id}/notificationsNewCriteria", name="client_notifications_new_criteria", methods={"POST"})
*/
public function notificationsNewCriteria($id, Client $client, Request $request): Response
{
$brand = $request->get('brand');
$vehicleName = $request->get('vehicle-name');
if ($client->getNotifyCriteria() != null && count($client->getNotifyCriteria()) > 0) {
$data = $client->getNotifyCriteria();
$data[$brand][$vehicleName] = $vehicleName;
} else {
$data[$brand] = array($vehicleName => $vehicleName);
}
$client->setNotifyCriteria($data);
$this->getDoctrine()->getManager()->flush();
return $this->json('1');
}
/**
* @Route("/{id}/notificationsShowCriteria", name="client_notifications_show_criteria", methods={"POST"})
*/
public function notificationsShowCriteria(Client $client): Response
{
return $this->json($client->getNotifyCriteria());
}
/**
* @Route("/{id}/notificationsDeleteCriteria", name="client_notifications_delete_criteria", methods={"POST"})
*/
public function notificationsDeleteCriteria(Client $client, Request $request): Response
{
$brand = $request->get('brand');
$criteria = $request->get('criteria');
$data = $client->getNotifyCriteria();
unset($data[$brand][$criteria]);
$client->setNotifyCriteria($data);
$this->getDoctrine()->getManager()->flush();
return $this->json('1');
}
/**
* @Route("/oneNotificationSave", name="client_one_notification_save", methods={"POST"})
*/
public function oneNotificationSave(ClientRepository $client, Request $request): Response
{
$id = $request->get('id');
$type = $request->get('type');
$state = $request->get('state') == 'true' ? 1 : 0;
$client = $client->find($id);
switch ($type) {
case 'e':
$client->setNotifyByEmail($state);
break;
case 'w':
$client->setNotifyByWhatsapp($state);
break;
case 'v':
$client->setNotifyVehicleEntry($state);
break;
}
$this->getDoctrine()->getManager()->persist($client);
$this->getDoctrine()->getManager()->flush();
return $this->json('1');
}
/**
* @Route("/{id}/edit", name="client_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Client $client): Response
{
$form = $this->createForm(ClientType::class, $client);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
$client->SetUser($this->getUser());
}
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('client_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('client/edit.html.twig', [
'client' => $client,
'form' => $form->createView(),
'currentMenu' => 'client',
]);
}
/**
* @Route("/{id}", name="client_delete", methods={"POST"})
*/
public function delete(Request $request, Client $client): Response
{
if ($this->isCsrfTokenValid('delete'.$client->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($client);
$entityManager->flush();
}
return $this->redirectToRoute('client_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/delete", name="client_delete_ra", methods={"GET"})
*/
public function deleteRa(Request $request): Response
{
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getReference(\App\Entity\Client::class, $request->get('id'));
$entityManager->remove($user);
$entityManager->flush();
return $this->redirectToRoute('client_index', [], Response::HTTP_SEE_OTHER);
}
}