<?php
namespace App\Controller;
use App\Entity\Car;
use App\Entity\CarImages;
use App\Entity\CarResale;
use App\Entity\CarSaleBankCheck;
use App\Entity\InfoautoTokens;
use App\Form\CarImagesType;
use App\Form\CarType;
use App\Repository\BranchesRepository;
use App\Repository\CarRepository;
use App\Repository\InfoautoTokensRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
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")
*/
class CarController extends AbstractController
{
/**
* @Route("/indexJson", name="car_index_json", methods={"GET", "POST"})
*/
public function indexJson(Request $request, CarRepository $entityRepository): Response
{
$totalR = 0;
$curPage = $request->get('current');
$sizePage = $request->get('rowCount');
$startPage = $curPage == 1 ? 1 : (($curPage - 1) * $sizePage) + 1;
$startPage = $curPage == 1 ? 0 : (($curPage - 1) * $sizePage);
$data = $entityRepository->createQueryBuilder('c')
->leftJoin('c.brand', 'b')
//->leftJoin('c.imageId', 'i')
->addSelect('b')
//->addSelect('b.name AS brand_name')
//->addSelect('i')
->where('c.id > :id')
->setParameter('id', '0');
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$status = $request->get('status');
$destination = $request->get('destination');
if (!empty($search)) {
$data = $data->andWhere('c.name like :search')
->orWhere('c.year like :search')
->orWhere('c.km like :search')
->orWhere('c.patent like :search')
->orWhere('c.pricePurchase like :search')
->orWhere('c.priceSale like :search')
->orWhere('b.name like :search')
->setParameter(':search', "%$search%");
}
if (!empty($status)) {
if (is_array($status)) {
$status = array_filter($status, fn($v) => $v !== '');
}
if (!empty($status)) {
if (is_array($status)) {
$data = $data->andWhere('c.status IN (:statuses)')
->setParameter('statuses', $status);
} else {
$data = $data->andWhere('c.status = :status')
->setParameter('status', $status);
}
}
}
if ($destination != '') {
$data = $data->andWhere('c.destination = :destination')
->setParameter(':destination', $destination);
}
/*---- Filters [END] ----*/
$data = $data->orderBy('b.name', 'ASC')
->addOrderBy('c.name', 'ASC');
$total = $data->getQuery()
->getArrayResult();
$data = $data->setFirstResult($startPage)
->setMaxResults($sizePage)
->getQuery()
//->getSQL();
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
//dump($data); exit();
$json_data = array(
"current" => intval($curPage),
"rowCount" => $sizePage,
"total" => count($total),
"rows" => $data,
);
return $this->json($json_data);
}
/**
* @Route("/excel", name="car_excel", methods={"GET"})
*/
public function excel(Request $request, CarRepository $entityRepository): Response
{
$qb = $entityRepository->createQueryBuilder('c')
->leftJoin('c.brand', 'b')
->addSelect('b')
->where('c.id > 0');
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$status = $request->get('status');
$destination = $request->get('destination');
if (!empty($search)) {
$expr = $qb->expr()->orX(
$qb->expr()->like('c.name', ':search'),
$qb->expr()->like('c.year', ':search'),
$qb->expr()->like('c.km', ':search'),
$qb->expr()->like('c.patent', ':search'),
$qb->expr()->like('c.pricePurchase', ':search'),
$qb->expr()->like('c.priceSale', ':search'),
$qb->expr()->like('b.name', ':search')
);
$qb->andWhere($expr)
->setParameter('search', "%$search%");
}
if (!empty($status)) {
if (!is_array($status)) {
$status = explode(',', $status);
}
$status = array_values(array_filter($status, static fn ($value) => $value !== ''));
if (!empty($status)) {
if (count($status) > 1) {
$qb->andWhere('c.status IN (:statuses)')
->setParameter('statuses', $status);
} else {
$qb->andWhere('c.status = :status')
->setParameter('status', $status[0]);
}
}
}
if (!empty($destination)) {
$qb->andWhere('c.destination = :destination')
->setParameter('destination', $destination);
}
/*---- Filters [END] ----*/
$qb->orderBy('b.name', 'ASC')
->addOrderBy('c.name', 'ASC');
$data = $qb->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
// Crear Excel
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Vehículos');
// Cabeceras
$headers = ['Vehículo','Marca','Año','Kilómetros','Patente','Precio Compra','Precio Venta','Estado','Ubicación'];
foreach ($headers as $col => $header) {
$sheet->setCellValueByColumnAndRow($col+1, 1, $header);
$sheet->getColumnDimensionByColumn($col+1)->setAutoSize(true);
}
$sheet->getStyle('A1:I1')
->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('dedede');
// Datos
$row = 2;
foreach ($data as $item) {
$statusLabel = match ($item['status']) {
'entered' => 'Ingresados',
'to enter' => 'Por Ingresar',
'signaled' => 'Señados',
default => '',
};
$sheet->setCellValue("A$row", $item['name']);
$sheet->setCellValue("B$row", $item['brand']['name']);
$sheet->setCellValue("C$row", $item['year']);
$sheet->setCellValue("D$row", $item['km']);
$sheet->setCellValue("E$row", $item['patent']);
$sheet->setCellValue("F$row", $item['priceCurrencyPurchase'].$item['pricePurchase']);
$sheet->setCellValue("G$row", $item['priceCurrencySale'].$item['priceSale']);
$sheet->setCellValue("H$row", $statusLabel);
$sheet->setCellValue("I$row", $item['destination'] ?? '');
$row++;
}
// Descargar
$writer = new Xlsx($spreadsheet);
$fileName = 'Vehículos.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/excel-admin", name="car_excel_admin", methods={"GET"})
*/
public function excelAdmin(Request $request, CarRepository $entityRepository): Response
{
$qb = $entityRepository->createQueryBuilder('c')
->leftJoin('c.brand', 'b')
->addSelect('b')
->leftJoin('c.destination', 'd')
->addSelect('d')
->where('c.id > 0');
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$status = $request->get('status');
$destination = $request->get('destination');
if (!empty($search)) {
$expr = $qb->expr()->orX(
$qb->expr()->like('c.name', ':search'),
$qb->expr()->like('c.year', ':search'),
$qb->expr()->like('c.km', ':search'),
$qb->expr()->like('c.patent', ':search'),
$qb->expr()->like('c.pricePurchase', ':search'),
$qb->expr()->like('c.priceSale', ':search'),
$qb->expr()->like('b.name', ':search'),
);
$qb->andWhere($expr)
->setParameter('search', "%$search%");
}
if (!empty($status)) {
if (!is_array($status)) {
$status = explode(',', $status);
}
$status = array_values(array_filter($status, static fn ($value) => $value !== ''));
if (!empty($status)) {
if (count($status) > 1) {
$qb->andWhere('c.status IN (:statuses)')
->setParameter('statuses', $status);
} else {
$qb->andWhere('c.status = :status')
->setParameter('status', $status[0]);
}
}
}
if (!empty($destination)) {
$qb->andWhere('c.destination = :destination')
->setParameter('destination', $destination);
}
/*---- Filters [END] ----*/
$qb->orderBy('b.name', 'ASC')
->addOrderBy('c.name', 'ASC');
$data = $qb->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
// Crear Excel
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Vehículos (Admin)');
// Cabeceras (agregamos Chasis, N° Motor, Fecha ingreso, Estado)
$headers = [
'Fecha ingreso','Vehículo','Marca','Año','Kilómetros','Patente','Chasis','N° Motor','Estado',
'Precio Compra','Precio Venta','Ubicación'
];
foreach ($headers as $col => $header) {
$sheet->setCellValueByColumnAndRow($col + 1, 1, $header);
$sheet->getColumnDimensionByColumn($col + 1)->setAutoSize(true);
}
$sheet->getStyle('A1:L1')
->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('dedede');
// Datos
$row = 2;
foreach ($data as $item) {
$statusLabel = match ($item['status'] ?? null) {
'entered' => 'Ingresados',
'to enter' => 'Por Ingresar',
'signaled' => 'Señados',
default => '',
};
$createdAt = '';
if (!empty($item['createdAt'])) {
if ($item['createdAt'] instanceof \DateTimeInterface) {
$createdAt = $item['createdAt']->format('d/m/Y H:i');
} elseif (is_string($item['createdAt'])) {
$createdAt = \DateTime::createFromFormat('Y-m-d H:i:s', $item['createdAt']);
if ($createdAt !== false) {
$createdAt = $createdAt->format('d/m/Y H:i');
} else {
$createdAt = $item['createdAt'];
}
}
}
$sheet->setCellValue("A$row", $createdAt);
$sheet->setCellValue("B$row", $item['name'] ?? '');
$sheet->setCellValue("C$row", $item['brand']['name'] ?? '');
$sheet->setCellValue("D$row", $item['year'] ?? '');
$sheet->setCellValue("E$row", $item['km'] ?? '');
$sheet->setCellValue("F$row", $item['patent'] ?? '');
$sheet->setCellValue("G$row", $item['chassisNumber'] ?? '');
$sheet->setCellValue("H$row", $item['engineNumber'] ?? '');
$sheet->setCellValue("I$row", $statusLabel);
$sheet->setCellValue("J$row", $item['pricePurchase'] ?? '');
$sheet->setCellValue("K$row", $item['priceSale'] ?? '');
$sheet->setCellValue("L$row", $item['destination']['name'] ?? '');
$row++;
}
$writer = new Xlsx($spreadsheet);
$fileName = 'Vehiculos-Administracion.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/carList", name="car_list", methods={"GET", "POST"})
*/
public function carList(Request $request, CarRepository $entityRepository): Response
{
$list = '<option value=""></option>';
$data = $entityRepository->findAll();
foreach ($data as $item) {
$list .= '<option value="'.$item->getId().'">'.$item->getName().' ('.$item->getPatent().')</option>';
}
return new Response($list);
}
/**
* @Route("/carSavePrices", name="car_save_prices", methods={"GET", "POST"})
*/
public function carSavePrices(Request $request, CarRepository $entityRepository): Response
{
$type = $request->get('type');
$data = $request->get('data');
$percent = ($request->get('percent') / 100) + 1;
$user = $this->getUser();
$userId = $user instanceof \App\Entity\User ? $user->getId() : null;
//dump($data); exit();
/*if ($percent == 100) {
$percent = 2;
} else {
$percent = '1.'.$percent/100;
}*/
$db = $this->getDoctrine()->getManager()->getConnection();
$db->connect();
if ($type == 'all') {
try {
$query = "
UPDATE car
SET price_sale = price_sale * $percent,
updated_at = NOW(),
updated_by_id = :userId
WHERE status = 'entered'
"; //exit($query);
$stmt = $db->prepare($query);
$stmt->bindValue('userId', $userId);
$stmt->execute();
$status = 'success';
$message = 'Updated price all vehicles';
} catch (\Exception $e) {
$status = 'error';
$message = $e->getMessage();
}
} else if ($type == 'selected') {
try {
$data = implode(',', $data);
$query = "
UPDATE car
SET price_sale = price_sale * $percent,
updated_at = NOW(),
updated_by_id = :userId
WHERE status = 'entered'
AND id in ($data)
";
$stmt = $db->prepare($query);
$stmt->bindValue('userId', $userId);
$stmt->execute();
$status = 'success';
$message = 'Updated price selected vehicles';
} catch (\Exception $e) {
$status = 'error';
$message = $e->getMessage();
}
} else {
foreach ($data as $key => $value) {
try {
$vehicle = $entityRepository->find($key);
$vehicle->setPriceSale($value);
if ($vehicle->getPriceCurrencySale() == null){
$vehicle->setPriceCurrencySale('$');
}
$user = $this->getUser();
if ($user instanceof \App\Entity\User) {
$vehicle->setUpdatedBy($user);
}
$this->getDoctrine()->getManager()->persist($vehicle);
$this->getDoctrine()->getManager()->flush();
$status = 'success';
$message = 'Updated manual price of selected vehicles';
} catch (\Exception $e) {
$status = 'error';
$message = $e->getMessage();
}
}
}
$response = array(
'status' => $status,
'message' => $message,
);
return $this->json($response);
}
/**
* @Route("/", name="car_index", methods={"GET"})
*/
public function index(ManagerRegistry $doctrine): Response
{
$query = "
SELECT id, name
FROM branches
ORDER BY name ASC
";
$conn = $doctrine->getConnection();
$result = $conn->executeQuery($query);
$branches = $result->fetchAllKeyValue();
$query = "
SELECT id, name
FROM destinations
ORDER BY name ASC
";
$conn = $doctrine->getConnection();
$result = $conn->executeQuery($query);
$destinations = $result->fetchAllKeyValue();
return $this->render('car/index.html.twig', [
'currentMenu' => 'car',
'branches' => $branches,
'destinations' => $destinations,
]);
}
/**
* @Route("/indexSetPrices", name="car_index_set_prices", methods={"GET"})
*/
public function indexSetPrices(): Response
{
return $this->render('car/index_set_prices.html.twig', [
'currentMenu' => 'car',
]);
}
/**
* @Route("/new/modal", name="car_new_modal", methods={"GET","POST"})
*/
public function newModal(Request $request): Response
{
$car = new Car();
$car->setStatus('to enter');
$form = $this->createForm(CarType::class, $car);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->attachUploadedImages($request, $car);
$this->syncImagesCollection($car);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($car);
try {
$entityManager->flush();
$status = 'success';
$message = 'New car created';
$carId = $car->getId();
$carName = $car->getName();
$carPatent = $car->getPatent();
$carPricePur = $car->getPricePurchase();
$carPriceCuPur = $car->getPriceCurrencyPurchase();
} catch (\Exception $e) {
$status = 'error';
$message = $e->getMessage();
$carId = 0;
$carName = 0;
$carPatent = '';
$carPricePur = 0;
$carPriceCuPur = '$';
}
$response = array(
'status' => $status,
'message' => $message,
'carId' => $carId,
'carName' => $carName,
'carPatent' => $carPatent,
'carPricePur' => $carPricePur,
'carPriceCuPur' => $carPriceCuPur,
);
return $this->json($response);
}
return $this->render('car/new_modal.html.twig', [
'car' => $car,
'form' => $form->createView(),
'm' => $request->get('m'),
'currentMenu' => 'car_new_modal',
]);
}
/**
* @Route("/new", name="car_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$car = new Car();
$form = $this->createForm(CarType::class, $car);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->attachUploadedImages($request, $car);
$this->syncImagesCollection($car);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($car);
$entityManager->flush();
return $this->redirectToRoute('car_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('car/new.html.twig', [
'car' => $car,
'form' => $form->createView(),
'currentMenu' => 'car',
]);
}
/**
* @Route("/{id}", name="car_show", methods={"GET"})
*/
public function show(Car $car): Response
{
//dump($car->getImageId());
//exit();
return $this->render('car/show.html.twig', [
'car' => $car,
'currentMenu' => 'car',
]);
}
/**
* @Route("/{id}/modal", name="car_show_modal", methods={"GET"})
*/
public function showModal(Car $car): Response
{
return $this->render('car/show_modal.html.twig', [
'car' => $car,
'currentMenu' => 'car',
]);
}
/**
* @Route("/{id}/modal/getPrice", name="car_get_price_modal", methods={"GET"})
*/
public function getPriceModal(ManagerRegistry $doctrine, Car $car, InfoautoTokensRepository $infoautoTokens): Response
{
$modelName = 'no_model_found';
$data['brand'] = $car->getBrand()->getName();
$data['brandId'] = $car->getBrand()->getInfoautoId();
$data['modelName'] = explode(' ', $car->getName());
$data['modelYear'] = $car->getYear();
$dataJson = json_decode(file_get_contents( $this->getParameter('kernel.project_dir').'/public/brands-groups.json' ), true);
/*---- Buscar grupo del vehículo [BEGIN] ----*/
// Buscar por marca
$foundBrand = null;
foreach ($dataJson as $brand) {
if ($brand['id'] == $data['brandId']) {
$foundBrand = $brand;
break; // Terminamos la búsqueda cuando lo encontramos
}
}
if ($foundBrand) {
$modelName = $data['modelName'][0];
// Buscar dentro de "groups" por modelo
$foundGroup = null;
foreach ($foundBrand['groups'] as $group) {
if ($group['name'] == $modelName) {
$foundGroup = $group;
break;
}
}
// Mostrar resultados
if ($foundGroup) {
$data['status'] = 'ok';
$data['type'] = 'model';
$data['message'] = 'Modelo encontrado';
$data['data'] = $foundGroup;
} else {
$data['status'] = 'error';
$data['type'] = 'model';
$data['message'] = 'No se encontró el modelo';
}
} else {
$data['status'] = 'error';
$data['type'] = 'brand';
$data['message'] = 'No se encontró la marca';
}
/*---- Buscar grupo del vehículo [END] ----*/
if ($data['status'] == 'error' && $data['type'] == 'brand') {
echo '<h3>'.$data['message'].'</h3>';
exit();
}
if ($data['status'] == 'error' && $data['type'] == 'model' && $data['brandId'] == '118') {
if ($foundBrand) {
if ( str_starts_with(strtolower($data['modelName'][0]), 'd') || str_starts_with(strtolower($data['modelName'][0]), 'x') ) {
$modelName = substr($data['modelName'][0], 0, 1).' '.substr($data['modelName'][0], 1);
}
// Buscar dentro de "groups" por modelo
$foundGroup = null;
foreach ($foundBrand['groups'] as $group) {
//echo $group['name'].' ; '.$modelName.'<br>';
if ( $group['name'] == $modelName ) {
$foundGroup = $group;
break;
}
}
// Mostrar resultados
if ($foundGroup) {
$data['status'] = 'ok';
$data['type'] = 'model';
$data['message'] = 'Modelo encontrado';
$data['data'] = $foundGroup;
} else {
$data['status'] = 'error';
$data['type'] = 'model';
$data['message'] = 'No se encontró el modelo (code 2)';
}
}
//echo '<h3>'.$data['message'].'</h3>';
//exit();
}
if ($data['status'] == 'error' && $data['type'] == 'model') {
echo '<h3>'.$data['message'].'</h3>';
exit();
}
$token = $this->getInfoautoToken($doctrine, $infoautoTokens);
// Define los encabezados necesarios
$headers = [
'Authorization: Bearer '.$token,
];
/*---- Buscar modelos por año [BEGIN] ----*/
$curl = curl_init();
curl_setopt_array($curl, array(
//CURLOPT_URL => 'https://api.infoauto.com.ar/cars/pub/search?query_string=Audi',
CURLOPT_URL => 'https://api.infoauto.com.ar/cars/pub//brands/'.$data['brandId'].'/groups/'.$data['data']['id'].'/models?query_string='.$data['modelName'][1].'&prices=true&prices_from='.$data['modelYear'].'&prices_to='.$data['modelYear'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers, // Encabezados de la petición
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
));
$response = curl_exec($curl);
curl_close($curl);
// Verifica si ocurrió un error de cURL
if ($response === false) {
$error = curl_error($curl);
curl_close($curl);
die("Error en cURL: $error");
}
// Obtiene el código HTTP de la respuesta
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$modelsJson = json_decode($response, true);
/*---- Buscar modelos por año [END] ----*/
//dump($modelsJson); exit();
/*---- Buscar precios [BEGIN] ----*/
// Recopilar CODIA
$aCodia = null;
foreach ($modelsJson as $item) {
$aCodia[] = ['name' => $item['description'], 'codia' => $item['codia']];
}
if ($aCodia) {
// Buscar precios por CODIA
foreach ($aCodia as $key => $item) {
curl_setopt_array($curl, array(
//CURLOPT_URL => 'https://api.infoauto.com.ar/cars/pub/search?query_string=Audi',
CURLOPT_URL => 'https://api.infoauto.com.ar/cars/pub/models/'.$item['codia'].'/prices',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers, // Encabezados de la petición
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
));
$response = curl_exec($curl);
curl_close($curl);
$aPrices = json_decode($response, true);
$price = 0;
foreach ($aPrices as $item2) {
if ($item2['year'] == $data['modelYear']) {
$price = number_format($item2['price'], 0, '', '.');
break;
}
}
$aCodia[$key]['price'] = $price;
}
/*---- Buscar precios [END] ----*/
} else {
$data['status'] = 'error';
$data['type'] = 'version';
$data['message'] = 'No se encontró versión para el modelo';
echo '<h3>'.$data['message'].'</h3>';
exit();
}
return $this->render('car/get_price_modal.html.twig', [
'car' => $car,
'codia' => $aCodia,
'infoFound' => [ $data['modelName'][0], $data['modelName'][1] ],
'currentMenu' => 'car',
]);
}
private function getInfoautoToken(ManagerRegistry $doctrine, InfoautoTokensRepository $infoautoTokens)
{
$tokenTmp = $infoautoTokens->findOneBy([], ['id' => 'DESC'], 1);
if ($tokenTmp) {
$hourMore = clone $tokenTmp->getCreatedAt();
$hourMore = ($hourMore)->add(new \DateInterval('PT1H'));
if (new \DateTime() > $hourMore) {
$tokenOk = false;
} else {
$tokenOk = true;
}
} else {
$tokenOk = false;
}
if ($tokenOk) {
return $tokenTmp->getAccessToken();
} else {
$headers = [
'Content-Type: application/json',
'Authorization: Basic '. base64_encode('rwaybar@yahoo.com.ar:NQlv38cCxODlq42f'),
'Content-Length: 0'
];
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.infoauto.com.ar/cars/auth/login',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers, // Encabezados de la petición
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
));
$response = curl_exec($curl);
curl_close($curl);
// Verifica si ocurrió un error de cURL
if ($response === false) {
$error = curl_error($curl);
curl_close($curl);
die("Error en cURL: $error");
}
$json = json_decode($response);
$tokens = new InfoautoTokens();
$tokens->setAccessToken($json->access_token);
$tokens->setRefreshToken($json->refresh_token);
$tokens->setCreatedAt(new \DateTime);
$doctrine->getManager()->persist($tokens);
$doctrine->getManager()->flush();
return $json->access_token;
}
}
/**
* @Route("/{id}/modalNotificationDeleteVehicle", name="car_modal_notification_delete_vehicle", methods={"GET"})
*/
public function showModalNotificationDeleteVehicle(Car $car): Response
{
$entityManager = $this->getDoctrine()->getManager();
$sales = $entityManager->getRepository(\App\Entity\CarSale::class)->createQueryBuilder('cs')
->where('cs.carSale = :id')
->orWhere('cs.carSalePayment = :id')
->setParameter('id', $car->getId())
->getQuery()
->getArrayResult();
$purchases = $entityManager->getRepository(\App\Entity\CarBuy::class)->createQueryBuilder('cb')
->where('cb.car = :id')
->orWhere('cb.carSwap = :id')
->setParameter('id', $car->getId())
->getQuery()
->getArrayResult();
return $this->render('car/modal_notification_delete_vehicle.html.twig', [
'car' => $car,
'sales' => $sales,
'purchases' => $purchases,
'currentMenu' => 'car',
]);
}
/**
* @Route("/{id}/edit", name="car_edit", requirements={"id"="\d+"}, methods={"GET","POST"})
*/
public function edit(Request $request, Car $car): Response
{
$form = $this->createForm(CarType::class, $car);
//$form = $this->createForm(CarType::class, $car, []);
$form->handleRequest($request);
/*dump($form);
exit('here'); //*/
if ($form->isSubmitted() && $form->isValid()) {
$this->attachUploadedImages($request, $car);
$this->syncImagesCollection($car);
/*if ($car->getStatus() == 'resale') {
$user = $this->getDoctrine()->getRepository('App\Entity\User')->find( $form->get('reseller')->getData() );
$carResaleCheck = $this->getDoctrine()->getRepository('App\Entity\CarResale')->findBy(['car' => $car->getId()]);
if ($carResaleCheck) {
$carResaleCheck[0]->setUser($user);
$carResaleCheck[0]->setUpdatedAt(new \DateTime());
$this->getDoctrine()->getManager()->persist($carResaleCheck[0]);
} else {
$carResale = new CarResale();
$carResale->setCurrency('$');
$carResale->setPrice(0);
$carResale->setIsDone(0);
$carResale->setCar($car);
$carResale->setUser($user);
$carResale->setCreatedAt(new \DateTime());
$this->getDoctrine()->getManager()->persist($carResale);
}
$this->getDoctrine()->getManager()->flush();
}*/
$user = $this->getUser();
if ($user instanceof \App\Entity\User) {
$car->setUpdatedBy($user);
}
$this->getDoctrine()->getManager()->flush();
//exit('success');
return $this->redirectToRoute('car_index', [], Response::HTTP_SEE_OTHER);
}
$form2 = $this->createForm(CarImagesType::class, new CarImages());
return $this->render('car/edit.html.twig', [
'car' => $car,
'form' => $form->createView(),
//'form2' => $form2->createView(),
'currentMenu' => 'car',
]);
}
private function attachUploadedImages(Request $request, Car $car): void
{
$orderRaw = $request->request->get('newImagesOrder', '');
$serverIds = [];
if (!empty($orderRaw)) {
$decoded = json_decode($orderRaw, true);
if (is_array($decoded)) {
$serverIds = $decoded;
}
}
if (empty($serverIds)) {
$serverIds = $request->request->all('newImages');
}
if (!is_array($serverIds) || empty($serverIds)) {
return;
}
$serverIds = array_values(array_unique(array_filter($serverIds, static function ($value) {
return is_string($value) && $value !== '';
})));
if (empty($serverIds)) {
return;
}
$projectDir = $this->getParameter('kernel.project_dir');
$tmpDir = $projectDir . '/var/tmp_uploads';
$fs = new Filesystem();
$fs->mkdir($projectDir . '/public/uploads/car');
$positionOffset = 0;
foreach ($car->getImageId() as $existing) {
$positionOffset = max($positionOffset, $existing->getPosition() + 1);
}
foreach ($serverIds as $position => $serverId) {
$filename = basename($serverId);
if ($filename === '') {
continue;
}
$tmpPath = $tmpDir . '/' . $filename;
if (!$fs->exists($tmpPath)) {
continue;
}
$uploadedFile = new UploadedFile($tmpPath, $filename, null, null, true);
$image = new CarImages();
$image->setPosition($positionOffset + $position);
$image->setCar($car);
$image->setImageFile($uploadedFile);
$car->addImageId($image);
}
}
private function syncImagesCollection(Car $car): void
{
$images = $car->getImageId();
foreach ($images as $key => $item) {
$item->setCar($car);
$images->set($key, $item);
if ($item->getImageFile() === null && $item->getImage() === null) {
$images->removeElement($item);
}
}
$ordered = $images->toArray();
usort($ordered, static fn(CarImages $a, CarImages $b) => $a->getPosition() <=> $b->getPosition());
foreach ($ordered as $index => $image) {
$image->setPosition($index);
}
}
/**
* @Route("/{id}", name="car_delete",requirements={"id"="\d+"}, methods={"POST"})
*/
public function delete(Request $request, Car $car): Response
{
if ($this->isCsrfTokenValid('delete'.$car->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($car);
$entityManager->flush();
}
return $this->redirectToRoute('car_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/delete", name="car_delete_ra", requirements={"id"="\d+"}, methods={"GET"})
*/
public function deleteRa(Request $request): Response
{
$entityManager = $this->getDoctrine()->getManager();
$sales = $entityManager->getRepository(\App\Entity\CarSale::class)->createQueryBuilder('cs')
->where('cs.carSale = :id')
->orWhere('cs.carSalePayment = :id')
->setParameter('id', $request->get('id'))
->getQuery()
->getArrayResult();
$purchases = $entityManager->getRepository(\App\Entity\CarBuy::class)->createQueryBuilder('cb')
->where('cb.car = :id')
->orWhere('cb.carSwap = :id')
->setParameter('id', $request->get('id'))
->getQuery()
->getArrayResult();
//dump($purchases); exit();
if ( count($sales) == 0 && count($purchases) == 0) {
$vehicle = $entityManager->getReference(\App\Entity\Car::class, $request->get('id'));
$entityManager->remove($vehicle);
$entityManager->flush();
} else {
$this->addFlash(
'notice',
$request->get('id')
);
}
return $this->redirectToRoute('car_index', [], Response::HTTP_SEE_OTHER);
}
}