<?php
namespace App\Controller\Mantenimiento;
use App\Entity\Mantenimiento\DiagramaTarea;
use App\Form\Mantenimiento\DiagramaTareaType;
use App\Repository\Mantenimiento\DiagramaTareaRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\Mantenimiento\PedidoReparacionRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Mantenimiento\PedidoReparacionDiagramado;
use App\Repository\Mantenimiento\PedidoReparacionDiagramadoRepository;
use Knp\Snappy\Pdf;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Twig\Environment;
use App\Repository\Equipos\MaquinariaRepository;
use App\Entity\Equipos\Maquinaria;
use App\Entity\Mantenimiento\Departamento;
use App\Entity\Mantenimiento\SectorPlanta;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Validator\Constraints\Choice;
/**
* @Route("/mantenimiento/organigrama/tarea")
*/
class DiagramaTareaController extends AbstractController
{
private $twig;
private $pdf;
public function __construct(Environment $twig, Pdf $pdf)
{
$this->twig = $twig;
$this->pdf = $pdf;
}
private function getFormSelect()
{
$user = $this->getUser();
return $this->createFormBuilder()
->add('from', DateType::class, [
'widget' => 'single_text',
])
->add('to', DateType::class, [
'widget' => 'single_text',
])
->add('equipo',
EntityType::class,
[
'class' => Maquinaria::class,
'group_by' => function($choice, $key, $value) {
if ($choice->getSector())
{
return $choice->getSector() . '';
}
return 'Sin Sector';
},
'query_builder' => function (EntityRepository $er) use ($user): QueryBuilder {
return $er->createQueryBuilder('u')
->andWhere('u.sector IN (:sectores)')
->setParameter('sectores', $user->getSectores())
->orderBy('u.nombre', 'ASC');
}
]
)
->add('cargar', SubmitType::class)
->getForm();
}
/**
* @Route("/informe", name="app_mantenimiento_informe_mantenimiento", methods={"GET", "POST"})
*/
public function informeMantenimiento(Request $request, DiagramaTareaRepository $diagramaTareaRepository): Response
{
$form = $this->getFormSelect();
if ($request->isMethod('POST'))
{
$form->handleRequest($request);
if ($form->isValid())
{
$data = $form->getData();
$history = $diagramaTareaRepository->getHitorialTrabajosEquipo($data);
return $this->render('mantenimiento/informes/index.html.twig',
[
'form' => $form->createView(),
'history' => $history
]);
}
}
return $this->render('mantenimiento/informes/index.html.twig',
[
'form' => $form->createView(),
]);
}
/**
* @Route("/print/{id}/diagrama", name="app_mantenimiento_diagrama_tarea_imprimir", methods={"GET"})
*/
public function pdfAction(DiagramaTarea $diagramaTarea, Pdf $knpSnappyPdf)
{
$html = $this->twig->render('mantenimiento/diagrama_tarea/imprimir.html.twig', [ 'diagrama' => $diagramaTarea ]);
$this->pdf->setTimeout(600);
return new PdfResponse(
$this->pdf->getOutputFromHtml($html),
'file.pdf'
);
}
/**
* @Route("/", name="app_mantenimiento_diagrama_tarea_index", methods={"GET", "POST"})
*/
public function index(Request $request, DiagramaTareaRepository $diagramaTareaRepository, EntityManagerInterface $entityManager): Response
{
$user = $this->getUser();
$form = $this->createFormBuilder()
->add('estado', ChoiceType::class, [
'choices' => [
'Todos' => 0,
'Pendientes' => 1,
'Procesados' => 2,
],
'data' => true,
])
->add('departamento', EntityType::class, [
'class' => Departamento::class,
'required' => false,
'placeholder' => 'Todos',
'choices' => $user->getDepartamentos(),
])
->add('desde', DateType::class, [
'widget' => 'single_text',
])
->add('hasta', DateType::class, [
'widget' => 'single_text',
])
->getForm();
if ($request->isMethod('POST'))
{
$form->handleRequest($request);
$data = $form->getData();
return $this->render('mantenimiento/diagrama_tarea/index.html.twig', [
'diagrama_tareas' => $diagramaTareaRepository->getDiagramas($this->getUser(), $data),
'form' => $form->createView()
]);
}
else
{
$queryParams = $request->query->all();
if (count($queryParams) > 0)
{
$data = array();
$data['desde'] = array_key_exists('desde', $queryParams) && $queryParams['desde'] ? \DateTime::createFromFormat('U', $queryParams['desde']) : null;
$data['hasta'] = array_key_exists('hasta', $queryParams) && $queryParams['hasta'] ? \DateTime::createFromFormat('U', $queryParams['hasta']) : null;
$data['departamento'] = array_key_exists('departamento', $queryParams) && $queryParams['departamento'] ? $queryParams['departamento'] : null;
$data['estado'] = array_key_exists('procesado', $queryParams) && $queryParams['procesado'] ? $queryParams['procesado'] : null;
$form = $this->createFormBuilder()
->add('estado', ChoiceType::class, [
'choices' => [
'Todos' => 0,
'Pendientes' => 1,
'Procesados' => 2,
],
'data' => $data['estado'],
])
->add('departamento', EntityType::class, [
'class' => Departamento::class,
'required' => false,
'placeholder' => 'Todos',
'choices' => $user->getDepartamentos(),
'data' => $data['departamento'] ? $entityManager->getRepository(Departamento::class)->find($data['departamento']) : null,
])
->add('desde', DateType::class, [
'widget' => 'single_text',
'data' => $data['desde'],
])
->add('hasta', DateType::class, [
'widget' => 'single_text',
'data' => $data['hasta'],
])
->getForm();
return $this->render('mantenimiento/diagrama_tarea/index.html.twig', [
'diagrama_tareas' => $diagramaTareaRepository->getDiagramas($this->getUser(), $data),
'form' => $form->createView()
]);
}
}
return $this->render('mantenimiento/diagrama_tarea/index.html.twig', [
'diagrama_tareas' => $diagramaTareaRepository->getDiagramas($this->getUser(), array('estado' => 1)),
'form' => $form->createView()
]);
}
/**
* @Route("/new", name="app_mantenimiento_diagrama_tarea_new", methods={"GET", "POST"})
*/
public function new(Request $request,
DiagramaTareaRepository $diagramaTareaRepository,
PedidoReparacionRepository $pedidoReparacionRepository,
EntityManagerInterface $entityManager,
MaquinariaRepository $repoEquipo): Response
{
$listaEquipos = $repoEquipo->listEquiposActivos();
$equipos = array();
foreach ($listaEquipos as $e)
{
$key = $e['sector'] ? $e['sector'] : 'Sin sector asignado';
if (!array_key_exists($key, $equipos))
{
$equipos[$key] = array();
}
$equipos[$key][] = $e;
}
$diagramaTarea = new DiagramaTarea();
$diagramaTarea->setFecha(new \DateTime());
$form = $this->createForm(DiagramaTareaType::class, $diagramaTarea, ['user' => $this->getUser()] );
$form->handleRequest($request);
$departamentos = $this->getUser()->getDepartamentos();
$sectores = $this->getUser()->getSectores();
if ($request->isMethod('POST'))
{
if ($form->isValid())
{
$all = $request->request->all();
$emptySelect = true;
$emptyDetail = false;
$emptyDate = false;
///Usado para validar la informacion
foreach ($all as $k => $v)
{
$key = explode('-', $k);
if ($key[0] == 'pedido')//Esta marcado el swith para diagramar la tarea, debe verificar si esta diagramada la tarea
{
$emptySelect = false;
$detail = $all["task-" . $key[1]];
if (!$detail)
{
$emptyDetail = true;
}
$date = $all["date-" . $key[1]];
if (!$date)
{
$emptyDate = true;
}
}
}
///Fin validar informacion
if ($emptySelect)
{
return new JsonResponse(['ok' => false, 'message' => 'Debe seleccionar al menos una tarea a realizar']);
}
elseif($emptyDetail)
{
return new JsonResponse(['ok' => false, 'message' => 'Todas las tareas deben ser completadas con las acciones a realizar']);
}
elseif($emptyDate)
{
return new JsonResponse(['ok' => false, 'message' => 'Todas las tareas deben tener la fecha de ejecucion']);
}
foreach ($all as $k => $v)
{
$key = explode('-', $k);
if ($key[0] == 'pedido')
{
$detail = $all["task-" . $key[1]];
$pedido = $pedidoReparacionRepository->find($key[1]);
if ($pedido)
{
$pedido->setDiagramada(true);
$date = $all["date-" . $key[1]];
$fecha = \DateTime::createFromFormat("Y-m-d", $date);
$pedidoDiagramado = new PedidoReparacionDiagramado();
$pedidoDiagramado->setObservacionResponsable($detail)
->setDiagrama($diagramaTarea)
->setPedido($pedido)
->setFecha($fecha);
$idEquipo = $all["team-" . $key[1]];
if ($idEquipo)
{
$team = $repoEquipo->find($idEquipo);
if ($team)
{
$pedidoDiagramado->setEquipo($team);
}
}
$entityManager->persist($pedidoDiagramado);
//$diagramaTarea->addPedido($pedido);
}
}
}
$entityManager->persist($diagramaTarea);
$entityManager->flush();
return new JsonResponse( ['ok' => true] );
// return $this->redirectToRoute('app_mantenimiento_diagrama_tarea_index', [], Response::HTTP_SEE_OTHER);
}
return new JsonResponse(['ok' => false, 'message' => 'Debe completar todos los campos para realizar la diagramacion de las tareas']);
}
$departamento = $request->query->get('departamento', 0);
$sector = $request->query->get('sector', 0);
$pedidos = $pedidoReparacionRepository->pedidosPendienteDiagramarWithSectorYDepartamento($this->getUser(), $departamento, $sector);
return $this->renderForm('mantenimiento/diagrama_tarea/new.html.twig', [
'diagrama_tarea' => $diagramaTarea,
'pedidosReparacion' => $pedidos,
'equipos' => $equipos,
'form' => $form,
'departamentos' => $departamentos,
'sectores' => $sectores,
'filtroDepartamento' => $departamento,
'filtroSector' => $sector
]);
}
/**
* @Route("/{id}", name="app_mantenimiento_diagrama_tarea_show", methods={"GET"})
*/
public function show(DiagramaTarea $diagramaTarea, Request $request): Response
{
$parameteres = $request->query->all();
//throw new \Exception(print_r($queryParams, true));
return $this->render('mantenimiento/diagrama_tarea/show.html.twig', [
'diagrama_tarea' => $diagramaTarea,
'params' => $parameteres
]);
}
/**
* @Route("/{id}/procesar", name="app_mantenimiento_diagrama_tarea_procesar", methods={"GET", "POST"})
*/
public function procesar(DiagramaTarea $diagramaTarea,
Request $request,
EntityManagerInterface $entityManager,
PedidoReparacionDiagramadoRepository $pedidoReparacionRepository): Response
{
$parameteres = $request->query->all();
// throw new \Exception(print_r($parameteres, true));
$all = $request->request->all();
foreach ($all as $k => $v)
{
$key = explode('-', $k);
if ($key[0] == 'pedido')
{
$detail = $all["task-" . $key[1]];
$pedido = $pedidoReparacionRepository->find($key[1]);
if ($pedido)
{
$pedidoOriginal = $pedido->getPedido();
$pedidoOriginal->setRealizada(true);
$pedido->setRealizada(true)
->setObservacionReparacion($detail);
}
}
}
$diagramaTarea->setProcesado(true);
$entityManager->flush();
// {desde : params.desde, hasta : params.hasta, departamento : params.departamento, procesado : params.procesad
return $this->redirectToRoute('app_mantenimiento_diagrama_tarea_index',
[
'desde' => $parameteres['desde'],
'hasta' => $parameteres['hasta'],
'departamento' => $parameteres['departamento'],
'procesado' => $parameteres['procesado']
],
Response::HTTP_SEE_OTHER);
return new JsonResponse( ['ok' => true] );
}
/**
* @Route("/{id}/edit", name="app_mantenimiento_diagrama_tarea_edit", methods={"GET", "POST"})
*/
public function edit(Request $request,
DiagramaTarea $diagramaTarea,
EntityManagerInterface $entityManager,
PedidoReparacionDiagramadoRepository $pedidoReparacionDiagramadaRepository,
PedidoReparacionRepository $pedidoReparacionRepository): Response
{
$ids = array();
$all = $request->request->all();
foreach ($diagramaTarea->getTareas() as $t)
{
$p = $t->getPedido();
$ids[] = $p->getId();
}
$pedidos = $pedidoReparacionRepository->pedidosPendienteDiagramar($this->getUser(), $ids);
$form = $this->createForm(DiagramaTareaType::class, $diagramaTarea, ['user' => $this->getUser()] );
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
foreach ($all as $k => $v)
{
$key = explode('-', $k);
if ($key[0] == 'task')
{
$detail = $v;
$pedido = $pedidoReparacionDiagramadaRepository->find($key[1]);
if ($pedido)
{
// throw new \Exception(print_r($k .' encontro ' . $detail));
$pedido->setObservacionResponsable($detail);
}
}
}
$entityManager->flush();
return $this->redirectToRoute('app_mantenimiento_diagrama_tarea_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('mantenimiento/diagrama_tarea/edit.html.twig', [
'diagrama_tarea' => $diagramaTarea,
'form' => $form,
'pedidos' => $pedidos
]);
}
/**
* @Route("/{id}/remove/tarea", name="app_mantenimiento_diagrama_tarea_quitar_de_diagrama", methods={"GET", "POST"})
*/
public function removePedido(Request $request,
PedidoReparacionDiagramado $pedido,
EntityManagerInterface $entityManager): Response
{
$diagrama = $pedido->getDiagrama();
if ($diagrama->isProcesado())
{
return new JsonResponse([ 'ok' => false, 'msg' => 'El diagrama ya ha sido procesado' ]);
}
$entityManager->remove($pedido);
$entityManager->flush();
return new JsonResponse(['ok' => true]);
}
/**
* @Route("/{id}/add/pedido", name="app_mantenimiento_diagrama_tarea_agregar_a_diagrama", methods={"GET", "POST"})
*/
public function addPedido(Request $request,
DiagramaTarea $diagramaTarea,
EntityManagerInterface $entityManager,
PedidoReparacionRepository $pedidoReparacionRepository): Response
{
if ($diagramaTarea->isProcesado())
{
return new JsonResponse([ 'ok' => false, 'msg' => 'El diagrama ya ha sido procesado' ]);
}
$task = $request->request->get('id');
$detail = $request->request->get('detail');
if (!$detail)
{
return new JsonResponse([ 'ok' => false, 'msg' => 'El campo Tarea a Realizar no puede permanecer en blanco' ]);
}
$pedido = $pedidoReparacionRepository->find($task);
if (!$pedido)
{
return new JsonResponse([ 'ok' => false, 'msg' => 'No se encuentra la tarea a diagramar' ]);
}
$pedidoDiagramado = new PedidoReparacionDiagramado();
$pedidoDiagramado->setObservacionResponsable($detail)
->setDiagrama($diagramaTarea)
->setPedido($pedido);
$entityManager->persist($pedidoDiagramado);
$pedido->setDiagramada(true);
$entityManager->flush();
return new JsonResponse(['ok' => true]);
}
/**
* @Route("/{id}/eliminar", name="app_mantenimiento_diagrama_tarea_delete", methods={"POST"})
*/
public function delete(Request $request, DiagramaTarea $diagramaTarea, DiagramaTareaRepository $diagramaTareaRepository): Response
{
if ($diagramaTarea->isProcesado())
{
if ( $diagramaTarea->getTareas()->count() > 0 )
{
return new JsonResponse([ 'ok' => false, 'msg' => 'El diagrama tiene tareas asignadas, debe primero eliminar las mismas' ]);
}
// return new JsonResponse([ 'ok' => false, 'msg' => 'El diagrama ya ha sido procesado. No es posible la eliminacion' ]);
}
$diagramaTareaRepository->remove($diagramaTarea, true);
return new JsonResponse(['ok' => true]);
}
}