<?php
namespace App\Controller;
use App\Entity\Transfers;
use App\Form\TransfersType;
use App\Repository\DestinationsRepository;
use App\Repository\TransfersRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCodeBundle\Response\QrCodeResponse;
use Dompdf\Dompdf;
use Dompdf\Options;
#[Route('/transfers')]
class TransfersController extends AbstractController
{
/**
* @Route("/indexJson", name="app_transfers_index_json", methods={"GET","POST"})
*/
public function indexJson(Request $request, TransfersRepository $repo): Response
{
$search = trim((string) $request->get('searchPhrase', ''));
$current = max(1, (int) $request->get('current', 1));
$rowCount = max(1, (int) $request->get('rowCount', 10));
$offset = ($current - 1) * $rowCount;
$qb = $repo->createQueryBuilder('t')
->leftJoin('t.car', 'c')
->leftJoin('t.destination', 'd')
->addSelect('c', 'd')
->where('t.id > :id')
->setParameter('id', 0);
if ($search !== '') {
$s = mb_strtolower($search);
$qb->andWhere(
"LOWER(COALESCE(c.name, '')) LIKE :s
OR LOWER(COALESCE(c.patent, '')) LIKE :s
OR LOWER(COALESCE(d.name, '')) LIKE :s
OR LOWER(COALESCE(t.description, '')) LIKE :s"
)->setParameter('s', '%'.$s.'%');
}
// total (sin paginar)
$qbTotal = clone $qb;
$total = (int) $qbTotal->select('COUNT(t.id)')->getQuery()->getSingleScalarResult();
// datos paginados
$rows = $qb
->setFirstResult($offset)
->setMaxResults($rowCount)
->getQuery()
->getArrayResult();
return $this->json([
'current' => $current,
'rowCount' => $rowCount,
'total' => $total,
'rows' => $rows,
]);
}
#[Route('/', name: 'app_transfers_index', methods: ['GET'])]
public function index(ManagerRegistry $doctrine): Response
{
$query = "
SELECT id, name
FROM destinations
ORDER BY name ASC
";
$conn = $doctrine->getConnection();
$result = $conn->executeQuery($query);
$destinations = $result->fetchAllKeyValue();
return $this->render('transfers/index.html.twig', [
//'transfers' => $transfersRepository->findAll(),
'destinations' => $destinations,
'currentMenu' => 'transfers',
]);
}
#[Route('/new', name: 'app_transfers_new', methods: ['GET', 'POST'])]
public function new(ManagerRegistry $doctrine, Request $request, TransfersRepository $transfersRepository): Response
{
$error = '';
$transfer = new Transfers();
$form = $this->createForm(TransfersType::class, $transfer);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$query = "
SELECT *
FROM transfers
WHERE reception_date IS NULL
AND car_id = :carId
ORDER BY id DESC
"; //exit($query.$transfer->getCar()->getId());
$conn = $doctrine->getConnection();
$result = $conn->executeQuery($query, ['carId' => $transfer->getCar()->getId()]);
$checkTransfer = $result->fetchAll();
if ($checkTransfer) {
$error = 'Error. Ya existe un traslado pendiente de recepción para el vehículo '.$transfer->getCar()->getName().'.';
} else {
$transfersRepository->add($transfer);
return $this->redirectToRoute('app_transfers_index', [], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('transfers/new.html.twig', [
'transfer' => $transfer,
'form' => $form,
'error' => $error,
'currentMenu' => 'transfers',
]);
}
#[Route('/received', name: 'app_transfers_received', methods: ['GET'])]
public function received(ManagerRegistry $doctrine, Request $request, TransfersRepository $transfersRepository): Response
{
if ($request->get('t')) {
$id = str_replace('|d232r$', '', base64_decode($request->get('t')));
$transfer = $transfersRepository->findOneBy(['id' => $id]);
if (!$transfer) {
return $this->redirect('https://dgautomotores.com.ar');
}
$transferReceived = false;
if ($transfer->getReceptionDate() == null) {
$query = "
UPDATE transfers
SET reception_date = now()
WHERE id = :id
";
$conn = $doctrine->getConnection();
$result = $conn->executeQuery($query, ['id' => $id]);
$query = "
UPDATE car
SET destination_id = :destination
WHERE id = :id
";
$conn = $doctrine->getConnection();
$result = $conn->executeQuery($query, ['id' => $transfer->getCar()->getId(), 'destination' => $transfer->getDestination()->getId()]);
} else {
$transferReceived = true;
}
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setIsRemoteEnabled(true);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
$dompdf->getOptions()->setChroot( $this->getParameter('kernel.project_dir').'\public' );
// Retrieve the HTML generated in our twig file
$html = $this->renderView('pdf/received.html.twig', [
'transfer' => $transfer,
'transferReceived' => $transferReceived,
'server_root' => $_SERVER["DOCUMENT_ROOT"],
]);
//echo($html); exit();
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
ob_get_clean();
// Output the generated PDF to Browser (inline view)
$dompdf->stream("/Error.pdf", [
"Attachment" => false,
]);
} else {
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setIsRemoteEnabled(true);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
$dompdf->getOptions()->setChroot( $this->getParameter('kernel.project_dir').'\public' );
// Retrieve the HTML generated in our twig file
$html = $this->renderView('pdf/received_error.html.twig', [
'server_root' => $_SERVER["DOCUMENT_ROOT"],
]);
//echo($html); exit();
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
ob_get_clean();
// Output the generated PDF to Browser (inline view)
$dompdf->stream("/Error.pdf", [
"Attachment" => false,
]);
}
}
#[Route('/{id}', name: 'app_transfers_show', methods: ['GET'])]
public function show(Transfers $transfer): Response
{
return $this->render('transfers/show.html.twig', [
'transfer' => $transfer,
]);
}
#[Route('/{id}/edit', name: 'app_transfers_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Transfers $transfer, TransfersRepository $transfersRepository): Response
{
if ($transfer->getReceptionDate() != null) {
return $this->redirectToRoute('app_transfers_index', [], Response::HTTP_SEE_OTHER);
}
$form = $this->createForm(TransfersType::class, $transfer);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$transfersRepository->add($transfer);
return $this->redirectToRoute('app_transfers_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('transfers/edit.html.twig', [
'transfer' => $transfer,
'form' => $form,
'currentMenu' => 'transfers',
]);
}
#[Route('/{id}', name: 'app_transfers_delete', methods: ['POST'])]
public function delete(Request $request, Transfers $transfer, TransfersRepository $transfersRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$transfer->getId(), $request->request->get('_token'))) {
$transfersRepository->remove($transfer);
}
return $this->redirectToRoute('app_transfers_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/delete", name="transfers_delete_ra", methods={"GET"})
*/
public function deleteRa(Request $request): Response
{
$entityManager = $this->getDoctrine()->getManager();
$transfer = $entityManager->getReference(\App\Entity\Transfers::class, $request->get('id'));
$entityManager->remove($transfer);
$entityManager->flush();
return $this->redirectToRoute('app_transfers_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/qr", name="transfers_qr_ra", methods={"GET"})
*/
public function qr(Request $request, Transfers $transfer, TransfersRepository $transfersRepository)
{
if ($transfer->getReceptionDate() != null) {
return $this->redirectToRoute('app_transfers_index', [], Response::HTTP_SEE_OTHER);
}
$link = $this->getParameter('app.domain_qr').'transfers/received?t='.base64_encode($transfer->getId().'|d232r$');
$result = Builder::create()
->writer(new PngWriter())
->data($link)
->encoding(new Encoding('UTF-8'))
->size(300)
->margin(10)
->build();
$dataUri = $result->getDataUri();
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setIsRemoteEnabled(true);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
$dompdf->getOptions()->setChroot( $this->getParameter('kernel.project_dir').'\public' );
// Retrieve the HTML generated in our twig file
$html = $this->renderView('pdf/qr.html.twig', [
'qr' => $dataUri,
'transfer' => $transfer,
'server_root' => $_SERVER["DOCUMENT_ROOT"],
]);
//echo($html); exit();
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
ob_get_clean();
// Output the generated PDF to Browser (inline view)
$dompdf->stream("/Traslados.pdf", [
"Attachment" => false,
]);
}
}