<?php
namespace App\Controller\Mantenimiento;
use App\Entity\Equipos\Maquinaria;
use App\Entity\Mantenimiento\Departamento;
use App\Entity\Mantenimiento\PedidoReparacion;
use App\Entity\Mantenimiento\SectorPlanta;
use App\Form\Mantenimiento\PedidoReparacionType;
use App\Repository\Mantenimiento\PedidoReparacionRepository;
use Doctrine\ORM\EntityRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Validator\Constraints\NotNull;
use Knp\Snappy\Pdf;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Twig\Environment;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* @Route("/pedido/reparacion")
* @Security("is_granted('ROLE_INGRESO_ANOMALIAS') or is_granted('ROLE_CALIDAD')")
*/
class PedidoReparacionController extends AbstractController
{
private $twig;
private $pdf;
public function __construct(Environment $twig, Pdf $pdf)
{
$this->twig = $twig;
$this->pdf = $pdf;
}
/**
* @Route("/", name="app_mantenimiento_pedido_reparacion_index", methods={"GET", "POST"})
*/
public function index(Request $request, PedidoReparacionRepository $pedidoReparacionRepository): Response
{
$form = $this->formFilterTreas();
if ($request->isMethod('POST'))
{
$form->handleRequest($request);
$data = $form->getData();
return $this->render('mantenimiento/pedido_reparacion/index.html.twig', [
'pedido_reparacions' => $pedidoReparacionRepository->pedidosReparacionUsuarioWithParameters($this->getUser(), $data),
'form' => $form->createView()
]);
}
return $this->render('mantenimiento/pedido_reparacion/index.html.twig', [
'pedido_reparacions' => $pedidoReparacionRepository->pedidosReparacionUsuario($this->getUser()),
'form' => $form->createView()
]);
}
/**
* @Route("/informe/tareas/from/{from}/to/{to}/sector/{sector}/depto/{dpto}/export", name="app_mantenimiento_pedido_reparacion_informe_tareas_export", methods={"GET", "POST"})
*/
public function eportarInformeSenasa($from, $to, $sector, $dpto, Request $request, PedidoReparacionRepository $pedidoReparacionRepository, \Doctrine\ORM\EntityManagerInterface $entityManager): Response
{
$data = [
'desde' => (new \DateTime())->setTimestamp($from),
'hasta' => (new \DateTime())->setTimestamp($to),
'sector' => $sector == 'all' ? null : $entityManager->getRepository(SectorPlanta::class)->find($sector),
'departamento' => $dpto == 'all' ? null : $entityManager->getRepository(Departamento::class)->find($dpto)
];
$pendientes = $pedidoReparacionRepository->pedidosReparacionUsuarioWithParametersAllPendiente($data);
$realizadosDiagramados = $pedidoReparacionRepository->pedidosReparacionUsuarioWithParametersAll($data);
$pedido_reparacions = array_merge($pendientes, $realizadosDiagramados);
usort($pedido_reparacions, function($a, $b) {
return $a['fechaPedido'] <=> $b['fechaPedido'];
});
$html = $this->twig->render('mantenimiento/diagrama_tarea/pedidos.html.twig', [
'pedido_reparacions' => $pedido_reparacions,
'data' => $data
]);
$filename = sprintf('informe_pedidos_reparacion_%s_%s', $data['desde']->format('d_m_Y'), $data['hasta']->format('d_m_Y'));
return new PdfResponse(
$this->pdf->getOutputFromHtml($html, [
'margin-top' => 10,
'margin-right' => 10,
'margin-bottom' => 10,
'margin-left' => 10,
'encoding' => 'utf-8',
'page-size' => 'A4',
'orientation' => 'Landscape',
]),
$filename . '.pdf'
);
}
/**
* @Route("/informe/tareas", name="app_mantenimiento_pedido_reparacion_informe_tareas", methods={"GET", "POST"})
*/
public function informeSenasa(Request $request, PedidoReparacionRepository $pedidoReparacionRepository): Response
{
$form = $this->formFilterInformes();
if ($request->isMethod('POST'))
{
$form->handleRequest($request);
if ($form->isValid())
{
$data = $form->getData();
$url = $this->generateUrl('app_mantenimiento_pedido_reparacion_informe_tareas_export', [
'from' => $data['desde']->getTimestamp(),
'to' => $data['hasta']->getTimestamp(),
'sector' => $data['sector'] ? $data['sector']->getId() : 'all',
'dpto' => $data['departamento'] ? $data['departamento']->getId() : 'all',
], 0);
$pendientes = $pedidoReparacionRepository->pedidosReparacionUsuarioWithParametersAllPendiente($data);
$realizadosDiagramados = $pedidoReparacionRepository->pedidosReparacionUsuarioWithParametersAll($data);
$pedido_reparacions = array_merge($pendientes, $realizadosDiagramados);
return $this->render('mantenimiento/pedido_reparacion/informe.html.twig', [
'pedido_reparacions' => $pedido_reparacions,
'form' => $form->createView(),
'url' => $url
]);
}
}
return $this->render('mantenimiento/pedido_reparacion/informe.html.twig', [
'form' => $form->createView()
]);
}
private function formFilterInformes()
{
$user = $this->getUser();
$form = $this->createFormBuilder()
->add('sector', EntityType::class, [
'class' => SectorPlanta::class,
'required' => false,
'placeholder' => 'Todos',
'choices' => $user->getSectores()->toArray(),
])
->add('departamento', EntityType::class, [
'class' => Departamento::class,
'required' => false,
'placeholder' => 'Todos',
'choices' => $user->getDepartamentos()->toArray(),
])
->add('desde', DateType::class, [
'widget' => 'single_text',
'constraints' => [
new NotNull(['message' => 'Este campo no puede estar vacío.']),
],
])
->add('hasta', DateType::class, [
'widget' => 'single_text',
'constraints' => [
new NotNull(['message' => 'Este campo no puede estar vacío.']),
],
])
->getForm();
return $form;
}
private function formFilterTreas()
{
$user = $this->getUser();
$form = $this->createFormBuilder()
->add('realizado', ChoiceType::class, [
'choices' => [
'Todas' => 'all',
'Si' => true,
'No' => false,
],
'data' => 'all',
])
->add('diagramado', ChoiceType::class, [
'choices' => [
'Todas' => 'all',
'Si' => true,
'No' => false,
],
'data' => 'all',
])
->add('equipo', EntityType::class, [
'class' => Maquinaria::class,
'required' => false,
'placeholder' => 'Todos',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('d')
->andWhere('d.activo = true')
->orderBy('d.nombre', 'ASC');
},
'group_by' => function($choice, $key, $value) {
if ($choice && $choice->getSector())
{
return $choice->getSector() . '';
}
return 'Sin sector';
},
])
->add('sector', EntityType::class, [
'class' => SectorPlanta::class,
'required' => false,
'placeholder' => 'Todos',
'choices' => $user->getSectores()->toArray(),
])
->add('desde', DateType::class, [
'widget' => 'single_text',
'data' => (new \DateTime())->modify('-1 day'),
])
->add('hasta', DateType::class, [
'widget' => 'single_text',
'data' => new \DateTime(),
])
->add('departamento', EntityType::class, [
'class' => Departamento::class,
'required' => false,
'placeholder' => 'Todos',
'choices' => $user->getDepartamentos()->toArray(),
])
->getForm();
return $form;
}
/**
* @Route("/new", name="app_mantenimiento_pedido_reparacion_new", methods={"GET", "POST"})
*/
public function new(Request $request, PedidoReparacionRepository $pedidoReparacionRepository): Response
{
$pedidoReparacion = new PedidoReparacion();
$form = $this->createForm(PedidoReparacionType::class, $pedidoReparacion, ['user' => $this->getUser()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$uploadedFile = $form->get('archivoImagen')->getData();
if ($uploadedFile)
{
$allowedMimeTypes = ['jpeg', 'JPG', 'JPEG', 'jpg', 'png', 'PNG','gif', 'GIF'];
$extension = $uploadedFile->getClientOriginalExtension();
if (!in_array($extension, $allowedMimeTypes))
{
$form->get('archivoImagen')->addError(new FormError('Tipo de archivo no permitido. Solo se aceptan JPEG, PNG y GIF.'));
return $this->renderForm('mantenimiento/pedido_reparacion/new.html.twig', [
'pedido_reparacion' => $pedidoReparacion,
'form' => $form,
'dpto' => true
]);
}
$originalFilename = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()', $originalFilename);
$extension = $uploadedFile->getClientOriginalExtension();
$newFilename = $safeFilename.'-'.uniqid().'.'.$extension; // Usamos $extension aquí
try
{
$uploadedFile->move(
$this->getParameter('ruta_imagenes_pedidos'),
$newFilename
);
} catch (\Exception $e) {
// ...
}
$pedidoReparacion->setNombreArchivoImagen($newFilename);
}
$pedidoReparacionRepository->add($pedidoReparacion, true);
return $this->redirectToRoute('app_mantenimiento_pedido_reparacion_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('mantenimiento/pedido_reparacion/new.html.twig', [
'pedido_reparacion' => $pedidoReparacion,
'form' => $form,
'dpto' => true
]);
}
/**
* @Route("/{id}/modificar/{dpto}/departamento", name="app_mantenimiento_pedido_reparacion_change_depto", methods={"GET", "POST"})
*/
public function modificarDepartamento(PedidoReparacion $pedidoReparacion, Departamento $dpto, PedidoReparacionRepository $pedidoReparacionRepository): Response
{
try
{
$pedidoReparacion->setDepartamento($dpto);
$pedidoReparacionRepository->add($pedidoReparacion, true);
return new JsonResponse(['ok' => true]);
}
catch (\Exception $e)
{
return new JsonResponse(['ok' => false, 'message' => $e->getMessage()]);
}
}
/**
* @Route("/{id}", name="app_mantenimiento_pedido_reparacion_show", methods={"GET", "POST"})
*/
public function show(PedidoReparacion $pedidoReparacion): Response
{
return $this->render('mantenimiento/pedido_reparacion/show.html.twig', [
'pedido_reparacion' => $pedidoReparacion,
]);
}
/**
* @Route("/{id}/diagramar", name="app_mantenimiento_pedido_reparacion_diagramar", methods={"GET", "POST"})
*/
public function diagramar(Request $request, PedidoReparacion $pedidoReparacion, PedidoReparacionRepository $pedidoReparacionRepository): Response
{
if (in_array($this->getUser()->getId(), [1,11]))
{
$form = $this->createForm(PedidoReparacionType::class, $pedidoReparacion, ['user' => $this->getUser(), 'depto' => true ]);
}
else
{
$form = $this->createForm(PedidoReparacionType::class, $pedidoReparacion);
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$pedidoReparacionRepository->add($pedidoReparacion, true);
return $this->redirectToRoute('app_mantenimiento_pedido_reparacion_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('mantenimiento/pedido_reparacion/edit.html.twig', [
'pedido_reparacion' => $pedidoReparacion,
'form' => $form,
]);
}
/**
* @Route("/{id}/edit", name="app_mantenimiento_pedido_reparacion_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, PedidoReparacion $pedidoReparacion, PedidoReparacionRepository $pedidoReparacionRepository): Response
{
$form = $this->createForm(PedidoReparacionType::class, $pedidoReparacion, ['user' => $this->getUser(), 'depto' => in_array($this->getUser()->getId(), [1,11]) ]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$uploadedFile = $form->get('archivoImagen')->getData();
if ($uploadedFile)
{
$allowedMimeTypes = ['jpeg', 'JPG', 'JPEG', 'jpg', 'png', 'PNG','gif', 'GIF'];
$extension = $uploadedFile->getClientOriginalExtension();
if (!in_array($extension, $allowedMimeTypes))
{
$form->get('archivoImagen')->addError(new FormError('Tipo de archivo no permitido. Solo se aceptan JPEG, PNG y GIF.'));
return $this->renderForm('mantenimiento/pedido_reparacion/new.html.twig', [
'pedido_reparacion' => $pedidoReparacion,
'form' => $form,
'dpto' => true
]);
}
$originalFilename = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()', $originalFilename);
$extension = $uploadedFile->getClientOriginalExtension();
$newFilename = $safeFilename.'-'.uniqid().'.'.$extension; // Usamos $extension aquí
try
{
$uploadedFile->move(
$this->getParameter('ruta_imagenes_pedidos'),
$newFilename
);
} catch (\Exception $e) {
// ...
}
$pedidoReparacion->setNombreArchivoImagen($newFilename);
}
$pedidoReparacionRepository->add($pedidoReparacion, true);
return $this->redirectToRoute('app_mantenimiento_pedido_reparacion_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('mantenimiento/pedido_reparacion/edit.html.twig', [
'pedido_reparacion' => $pedidoReparacion,
'form' => $form,
'dpto' => in_array($this->getUser()->getId(), [1,11]),
]);
}
/**
* @Route("/{id}", name="app_mantenimiento_pedido_reparacion_delete", methods={"POST"})
*/
public function delete(Request $request, PedidoReparacion $pedidoReparacion, PedidoReparacionRepository $pedidoReparacionRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$pedidoReparacion->getId(), $request->request->get('_token'))) {
$pedidoReparacionRepository->remove($pedidoReparacion, true);
}
return $this->redirectToRoute('app_mantenimiento_pedido_reparacion_index', [], Response::HTTP_SEE_OTHER);
}
}