<?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\Entity\Mantenimiento\SolicitantePedidoReparacion;
use App\Form\Mantenimiento\PedidoReparacionType;
use App\Repository\Mantenimiento\PedidoReparacionRepository;
use Doctrine\ORM\EntityManagerInterface;
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}/state/{state}/export", name="app_mantenimiento_pedido_reparacion_informe_tareas_export", methods={"GET", "POST"})
*/
public function eportarInformeSenasa($from, $to, $sector, $dpto, $state, 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),
'estado' => $state
];
/* $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'];
});*/
$pedido_reparacions = $this->getPedidosFiltrados($data, $pedidoReparacionRepository);
if ($data['estado'] != 'all')
{
$filtrados = array_filter($pedido_reparacions, function($item) use ($data) {
return $item['estado'] === $data['estado'];
});
}
$html = $this->twig->render('mantenimiento/diagrama_tarea/pedidos.html.twig', [
'pedido_reparacions' => $filtrados ?? $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'
);
}
private function getPedidosFiltrados($data, PedidoReparacionRepository $pedidoReparacionRepository)
{
$pendientes = $pedidoReparacionRepository->getAllPedidosWithParameter($data);
$detalle = array();
foreach ($pendientes as $pedido)
{
$id = $pedido->getId();
$detalle[$id] = [
'detalle' => $pedido->getDetalle(),
'sector' => $pedido->getSector() ? $pedido->getSector()->getNombre() : '',
'departamento' => $pedido->getDepartamento() ? $pedido->getDepartamento()->getNombre() : '',
'fechaPedido' => $pedido->getFecha(),
'estado' => 'pen',
'diagramado' => 0
];
foreach ($pedido->getPedidosDiagramados() as $pedidoDiagramado)
{
$diagrama = $pedidoDiagramado->getDiagrama();
if (!isset($detalle[$id]['realizada'])) //No se ha seteado el campo de realizada
{
if ($diagrama->isProcesado())
{
$detalle[$id]['realizada'] = $pedidoDiagramado->isRealizada();
if (!$pedidoDiagramado->isRealizada())
{
unset($detalle[$id]['realizada']);
}
$detalle[$id]['fecha'] = $diagrama->getFecha();
$detalle[$id]['fechaDiagrama'] = $diagrama->getFecha();
$detalle[$id]['estado'] = $pedidoDiagramado->isRealizada() ? 'rea' : 'pen';
}
else
{
$detalle[$id]['realizada'] = 0;
$detalle[$id]['fechaDiagrama'] = $diagrama->getFecha();
$detalle[$id]['estado'] = 'pen';
$detalle[$id]['diagramado'] = 1;
}
}
else
{
if ($detalle[$id]['realizada'] == 0) //Si no se ha realizado
{
if ($diagrama->isProcesado())
{
if ($pedidoDiagramado->isRealizada())
{
$detalle[$id]['realizada'] = $pedidoDiagramado->isRealizada();
$detalle[$id]['fecha'] = $diagrama->getFecha();
$detalle[$id]['fechaDiagrama'] = $diagrama->getFecha();
$detalle[$id]['estado'] = 'rea';
}
else
{
unset($detalle[$id]['realizada']);
$detalle[$id]['fecha'] = $diagrama->getFecha();
$detalle[$id]['fechaDiagrama'] = $diagrama->getFecha();
$detalle[$id]['estado'] = 'pen';
}
}
else
{
$detalle[$id]['realizada'] = 0;
$detalle[$id]['fechaDiagrama'] = $diagrama->getFecha();
$detalle[$id]['estado'] = 'pen';
$detalle[$id]['diagramado'] = 1;
}
}
}
}
}
return $detalle;
}
/**
* @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',
'state' => $data['estado']
], 0);
/* $pendientes = $realizadosDiagramados = [];
if ($data['estado'] == 'pen')
{
//Representa todos los pedido de reparacion que no esten ni diagramados
$pendientes = $pedidoReparacionRepository->pedidosReparacionUsuarioWithParametersAllPendiente($data);
}
else
{
$realizadosDiagramados = $pedidoReparacionRepository->pedidosReparacionUsuarioWithParametersAll($data);
if ($data['estado'] == 'all')
{
$pendientes = $pedidoReparacionRepository->pedidosReparacionUsuarioWithParametersAllPendiente($data);
}
}*/
$pedido_reparacions = $this->getPedidosFiltrados($data, $pedidoReparacionRepository);
if ($data['estado'] != 'all')
{
$filtrados = array_filter($pedido_reparacions, function($item) use ($data) {
return $item['estado'] === $data['estado'];
});
}
//dd($pedido_reparacions);
// $pedido_reparacions = array_merge($pendientes, $realizadosDiagramados);
return $this->render('mantenimiento/pedido_reparacion/informe.html.twig', [
'pedido_reparacions' => $filtrados ?? $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->getAllSectoresActivos(),
])
->add('estado', ChoiceType::class, [
'choices' => [
'Todos' => 'all',
'Pendientes' => 'pen',
// 'Programados' => 'pro',
'Realizados' => 'rea',
],
'data' => 'all',
])
->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')
->join('d.sector', 's')
->andWhere('d.activo = true')
->andWhere('s.active = true')
->addOrderBy('s.nombre', 'ASC')
->addOrderBy('d.nombre', 'ASC');
},
'group_by' => function($choice, $key, $value) {
if ($choice && $choice->getSector())
{
return $choice->getSector() . '';
}
return 'Sin sector';
},
])
->add('solicitante', EntityType::class, [
'class' => SolicitantePedidoReparacion::class,
'required' => false,
'placeholder' => 'Todos',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('d')
->andWhere('d.activo = true')
->addOrderBy('d.nombre', 'ASC');
},
])
->add('sector', EntityType::class, [
'class' => SectorPlanta::class,
'required' => false,
'placeholder' => 'Todos',
'choices' => $user->getAllSectoresActivos(),
])
->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->getAllDepartamentosActivos(),
])
->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}/delete/pedido", name="app_mantenimiento_pedido_reparacion_delete", methods={"POST", "DELETE"})
*/
public function delete(Request $request, PedidoReparacion $pedidoReparacion, EntityManagerInterface $entityManager): Response
{
try
{
$realizada = 0;
foreach ($pedidoReparacion->getPedidosDiagramados() as $pedidoDiagramado)
{
if ($pedidoDiagramado->isRealizada())
{
$realizada++;
}
}
if ($realizada > 0)
{
return $this->json(['ok' => false, 'message' => 'No se puede eliminar el pedido de reparación. El mismo ya ha sido marcado como realizado.']);
}
$pedidoReparacion->setEliminada(true);
$entityManager->flush();
//$pedidoReparacionRepository->remove($pedidoReparacion, true);
return $this->json(['ok' => true]);
}
catch (\Exception $e)
{
return $this->json(['ok' => false, 'message' => 'No se ha podido eliminar el pedido de reparación. Posiblemente esté asociado a un organigrama.']);
}
}
}