<?php
namespace App\Controller;
use App\Entity\CarBuy;
use App\Form\CarBuyType;
use App\Repository\CarBuyRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
/**
* @Route("/car/buy")
*/
class CarBuyController extends AbstractController
{
/**
* @Route("/indexJson", name="car_buy_index_json", methods={"GET", "POST"})
*/
public function indexJson(Request $request, CarBuyRepository $entityRepository): Response
{
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$isDone = $request->get('isDone');
$curMonth = $request->get('curMonth');
$dateFromRaw = $request->get('dateFrom');
$dateToRaw = $request->get('dateTo');
$dateFilter = filter_var($request->get('dateFilter'), FILTER_VALIDATE_BOOLEAN);
$buyer = $request->get('buyer');
$dateFrom = $dateFromRaw ? $dateFromRaw . ' 00:00:00' : null;
$dateTo = $dateToRaw ? $dateToRaw . ' 23:59:59' : null;
/*---- Filters [END] ----*/
$totalR = 0;
$curPage = $request->get('current');
$sizePage = $request->get('rowCount');
$startPage = $curPage == 1 ? 0 : (($curPage - 1) * $sizePage);
$data = $entityRepository->createQueryBuilder('cb')
->leftJoin('cb.car', 'c')
->leftJoin('cb.carSwap', 'cs')
->leftJoin('cb.user', 'u')
->leftJoin('cb.client', 'cl')
->addSelect('c')
->addSelect('cs')
->addSelect('u')
->addSelect('cl')
->where('cb.id > :id')
->setParameter('id', '0')
->orderBy('cb.isDoneDate', 'DESC');
if ($search !== null && $search !== '') {
$data->andWhere(
$data->expr()->orX(
'c.name LIKE :search',
'c.patent LIKE :search',
'u.firstName LIKE :search',
'u.lastName LIKE :search',
'cb.price LIKE :search',
'cb.origin LIKE :search'
)
)->setParameter(':search', "%$search%");
}
if ($isDone !== '' && $isDone !== null) {
$data->andWhere('cb.isDone = :isDone')
->setParameter(':isDone', $isDone);
}
if ($dateFilter && $dateFrom && $dateTo) {
$data->andWhere('cb.isDoneDate BETWEEN :dateFrom AND :dateTo')
->setParameter(':dateFrom', $dateFrom)
->setParameter(':dateTo', $dateTo);
}
if (!empty($buyer)) {
$data->andWhere('u.id = :buyer')
->setParameter(':buyer', $buyer);
}
if ($curMonth === '1') {
$data->andWhere(
$data->expr()->orX(
$data->expr()->andX(
'cb.isDone = 1',
'MONTH(cb.isDoneDate) = MONTH(CURRENT_DATE())',
'YEAR(cb.isDoneDate) = YEAR(CURRENT_DATE())'
),
'cb.isDone = 0'
)
);
}
$total = $data->getQuery()
->getArrayResult();
$data = $data->setFirstResult($startPage)
->setMaxResults($sizePage)
->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("/excel", name="car_buy_excel", methods={"GET", "POST"})
*/
public function excel(Request $request, CarBuyRepository $entityRepository): Response
{
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$isDone = $request->get('isDone');
$curMonth = $request->get('curMonth');
$dateFromRaw = $request->get('dateFrom');
$dateToRaw = $request->get('dateTo');
$dateFilter = filter_var($request->get('dateFilter'), FILTER_VALIDATE_BOOLEAN);
$buyer = $request->get('buyer');
/*---- Filters [END] ----*/
$totalR = 0;
$curPage = $request->get('current');
$sizePage = $request->get('rowCount');
$data = $entityRepository->createQueryBuilder('cb')
->leftJoin('cb.car', 'c')
->leftJoin('cb.carSwap', 'cs')
->leftJoin('cb.user', 'u')
->leftJoin('cb.client', 'cl')
->addSelect('c')
->addSelect('cs')
->addSelect('u')
->addSelect('cl')
->where('cb.id > :id')
->setParameter('id', '0');
if ($search !== null && $search !== '') {
$data->andWhere(
$data->expr()->orX(
'c.name LIKE :search',
'c.patent LIKE :search',
'u.firstName LIKE :search',
'u.lastName LIKE :search',
'cb.price LIKE :search',
'cb.origin LIKE :search'
)
)->setParameter(':search', "%$search%");
}
$dateFrom = $dateFromRaw ? $dateFromRaw . ' 00:00:00' : null;
$dateTo = $dateToRaw ? $dateToRaw . ' 23:59:59' : null;
if ($isDone !== '' && $isDone !== null) {
$data->andWhere('cb.isDone = :isDone')
->setParameter(':isDone', $isDone);
}
if ($dateFilter && $dateFrom && $dateTo) {
$data->andWhere('cb.isDoneDate BETWEEN :dateFrom AND :dateTo')
->setParameter(':dateFrom', $dateFrom)
->setParameter(':dateTo', $dateTo);
}
if (!empty($buyer)) {
$data->andWhere('u.id = :buyer')
->setParameter(':buyer', $buyer);
}
if ($curMonth === '1') {
$data->andWhere(
$data->expr()->orX(
$data->expr()->andX(
'cb.isDone = 1',
'MONTH(cb.isDoneDate) = MONTH(CURRENT_DATE())',
'YEAR(cb.isDoneDate) = YEAR(CURRENT_DATE())'
),
'cb.isDone = 0'
)
);
}
$data = $data->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Listado');
$sheet->getCell('A1')->setValue('Comprador');
$sheet->getCell('B1')->setValue('Cliente');
$sheet->getCell('C1')->setValue('VehÃculo');
$sheet->getCell('D1')->setValue('Patente');
$sheet->getCell('E1')->setValue('Precio Compra');
$sheet->getCell('F1')->setValue('Adelanto');
$sheet->getCell('G1')->setValue('VehÃculo en parte de pago');
$sheet->getCell('H1')->setValue('Permuta');
$sheet->getCell('I1')->setValue('Finalizada');
$sheet->getCell('J1')->setValue('Origen');
$sheet->getCell('K1')->setValue('Creado');
$sheet->getCell('L1')->setValue('Modificado');
foreach(range('A','L') as $columnID) {
$sheet->getColumnDimension($columnID)->setAutoSize(true);
}
$sheet->getStyle('A1:L1')
->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('dedede');
$counter = 2;
foreach ($data as $item) {
$sheet->getCell('A'.$counter)->setValue($item['user']['firstName'].' '.$item['user']['lastName']);
$sheet->getCell('B'.$counter)->setValue($item['client']['firstName'].' '.$item['client']['lastName']);
$sheet->getCell('C'.$counter)->setValue($item['car']['name']);
$sheet->getCell('D'.$counter)->setValue($item['car']['patent']);
$sheet->getCell('E'.$counter)->setValue($item['price']);
$sheet->getCell('F'.$counter)->setValue($item['moneyAdvance']);
$carSwap = $item['carSwap'] ?? null;
$carSwapText = $carSwap ? ($carSwap['name'].' - '.($carSwap['priceCurrencySale'] ?? '').($carSwap['priceSale'] ?? '')) : '';
$sheet->getCell('G'.$counter)->setValue($carSwapText);
$sheet->getCell('H'.$counter)->setValue($carSwap ? 'SÃ' : 'No');
$sheet->getCell('I'.$counter)->setValue($item['isDone'] == 0 ? 'No' : 'SÃ');
$sheet->getCell('J'.$counter)->setValue($item['origin']);
if ($item['createdAt'] != null) {
$sheet->getCell('K' . $counter)->setValue($item['createdAt']->format('d-m-Y H:i:s'));
}
if ($item['updatedAt'] != null) {
$sheet->getCell('L'.$counter)->setValue($item['updatedAt']->format('d-m-Y H:i:s'));
}
$counter ++;
}
// Increase row cursor after header write
//$sheet->fromArray($data,null, 'A2', true);
$writer = new Xlsx($spreadsheet);
// Create a Temporary file in the system
$fileName = 'Compras.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
// Create the excel file in the tmp directory of the system
$writer->save($temp_file);
// Return the excel file as an attachment
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/", name="car_buy_index", methods={"GET"})
*/
public function index(CarBuyRepository $carBuyRepository): Response
{
$sellers = $this->getDoctrine()->getManager()->getRepository(\App\Entity\User::class)->createQueryBuilder('u')
->indexBy('u', 'u.id')
->orderBy('u.firstName', 'ASC')
->getQuery()
->getArrayResult();
return $this->render('car_buy/index.html.twig', [
'car_buys' => $carBuyRepository->findAll([], ['isDoneDate' => 'ASC']),
'currentMenu' => 'car_buy',
'sellers' => $sellers,
]);
}
/**
* @Route("/new", name="car_buy_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$carBuy = new CarBuy();
$form = $this->createForm(CarBuyType::class, $carBuy);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
$carBuy->SetUser($this->getUser());
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($carBuy);
$entityManager->flush();
/*---- Update car to buy [BEGIN] ----*/
$status = $carBuy->getIsDone() ? 'entered' : 'to enter';
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carBuy->getCar()->getId());
$car->setPricePurchase( $carBuy->getPrice() );
$car->setPriceCurrencyPurchase( $carBuy->getCurrency() );
$car->setStatus($status);
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
/*---- Update car to buy [END] ----*/
/*---- Update car to swap [BEGIN] ----*/
if ($carBuy->getCarSwap() != null) {
$status = $carBuy->getIsDone() ? 'swapped' : 'to swap';
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carBuy->getCarSwap()->getId());
$car->setStatus($status);
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
}
/*---- Update car to swap [END] ----*/
return $this->redirectToRoute('car_buy_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('car_buy/new.html.twig', [
'car_buy' => $carBuy,
'form' => $form->createView(),
'currentMenu' => 'car_buy',
]);
}
/**
* @Route("/{id}", name="car_buy_show", methods={"GET"})
*/
public function show(CarBuy $carBuy): Response
{
return $this->render('car_buy/show.html.twig', [
'car_buy' => $carBuy,
'currentMenu' => 'car_buy',
]);
}
/**
* @Route("/{id}/modal", name="car_buy_show_modal", methods={"GET"})
*/
public function showModal(CarBuy $carBuy): Response
{
return $this->render('car_buy/show_modal.html.twig', [
'car_buy' => $carBuy,
'currentMenu' => 'car_buy',
]);
}
/**
* @Route("/{id}/edit", name="car_buy_edit", methods={"GET","POST"})
*/
public function edit(Request $request, CarBuy $carBuy): Response
{
if ($carBuy->getIsDone() && $this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
return $this->render('messages/no_edit_record.html.twig', [
'currentMenu' => 'car_buy',
]);
}
$options['edit'] = true;
$options['carSwapId'] = $carBuy->getCarSwap() != null ? $carBuy->getCarSwap()->getId() : 0;
$oldEntity = clone $carBuy; // save old entity
$form = $this->createForm(CarBuyType::class, $carBuy, $options);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
$carBuy->SetUser($this->getUser());
}
$this->getDoctrine()->getManager()->flush();
/*---- Update car to buy [BEGIN] ----*/
$status = $carBuy->getIsDone() ? 'entered' : 'to enter';
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carBuy->getCar()->getId());
$car->setPricePurchase( $carBuy->getPrice() );
$car->setPriceCurrencyPurchase( $carBuy->getCurrency() );
$car->setStatus($status);
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
/*---- Update car to buy [END] ----*/
/*---- Update car to swap [BEGIN] ----*/
if ($carBuy->getCarSwap() != null) {
if ($oldEntity->getCarSwap() != null && $oldEntity->getCarSwap()->getId() != $carBuy->getCarSwap()->getId()) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $oldEntity->getCarSwap()->getId());
$car->setStatus('entered');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
}
$status = $carBuy->getIsDone() ? 'swapped' : 'to swap';
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carBuy->getCarSwap()->getId());
$car->setStatus($status);
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
}
/*---- Update car to swap [END] ----*/
return $this->redirectToRoute('car_buy_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('car_buy/edit.html.twig', [
'car_buy' => $carBuy,
'form' => $form->createView(),
'currentMenu' => 'car_buy',
]);
}
/**
* @Route("/{id}", name="car_buy_delete", methods={"POST"})
*/
public function delete(Request $request, CarBuy $carBuy): Response
{
if ($this->isCsrfTokenValid('delete'.$carBuy->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($carBuy);
$entityManager->flush();
}
return $this->redirectToRoute('car_buy_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/delete", name="car_buy_delete_ra", methods={"GET"})
*/
public function deleteRa(Request $request): Response
{
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getReference(\App\Entity\CarBuy::class, $request->get('id'));
$entityManager->remove($user);
$entityManager->flush();
return $this->redirectToRoute('car_buy_index', [], Response::HTTP_SEE_OTHER);
}
}