<?php
namespace App\Controller\Mantenimiento\Preventivo;
use App\Entity\Equipos\Maquinaria;
use App\Entity\Mantenimiento\Preventivo\PlanMantenimientoDiagramado;
use App\Form\Mantenimiento\Preventivo\PlanMantenimientoDiagramadoType;
use App\Repository\Mantenimiento\Preventivo\PlanMantenimientoDiagramadoRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use App\Repository\Mantenimiento\Preventivo\PlanMantenimientoRepository;
use App\Entity\Mantenimiento\Preventivo\PlanMantenimiento;
use App\Entity\Equipos\Maquinaria as Equipo;
use App\Entity\Mantenimiento\Departamento;
use App\Entity\Mantenimiento\PedidoReparacion;
use App\Entity\Mantenimiento\Preventivo\TareaPlan;
use App\Entity\Mantenimiento\Preventivo\TareaPlanDiagramada;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Knp\Snappy\Pdf;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Twig\Environment;
/**
* @Route("/mantenimiento/preventivo/plan/diagramado")
*/
class PlanMantenimientoDiagramadoController extends AbstractController
{
private $twig;
private $pdf;
public function __construct(Environment $twig, Pdf $pdf)
{
$this->twig = $twig;
$this->pdf = $pdf;
}
private function getFormFechas()
{
return $this->createFormBuilder()
->add('desde',
DateType::class,
[
'widget' => 'single_text',
'required' => false,
'attr' => ['class' => 'form-control'],
])
->add('hasta',
DateType::class,
[
'widget' => 'single_text',
'required' => false,
'attr' => ['class' => 'form-control'],
])
->getForm();
}
private function getFormSelectPeriodo()
{
return $this->createFormBuilder()
->add('periodo', \Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, [
'choices' => [
'Semanal' => 7,
'Mensual' => 30,
'Semestral' => 180,
'Anual' => 365,
],
'attr' => ['class' => 'form-control form-select'],
])
->add('submit',
SubmitType::class, [
'label' => 'Cargar Planes',
'attr' => ['class' => 'btn btn-primary mt-4']
])
->getForm();
}
private function getFormSelectEquipo()
{
return $this->createFormBuilder()
->add('equipo',
EntityType::class,
[
'class' => Maquinaria::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->andWhere('u.activo = :activo')
->setParameter('activo', true)
->orderBy('u.nombre', 'ASC');
},
'group_by' => function($choice, $key, $value) {
if ($choice && $choice->getSector())
{
return $choice->getSector() . '';
}
return 'Sin sector';
},
])
->getForm();
}
/**
* @Route("/informe", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_informe", methods={"GET", "POST"})
*/
public function informePlanesRealizados(Request $request, PlanMantenimientoDiagramadoRepository $planMantenimientoRepository, EntityManagerInterface $em): Response
{
$form = $this->createFormBuilder()
->add('desde',
DateType::class,
[
'widget' => 'single_text',
'required' => false,
'attr' => ['class' => 'form-control'],
])
->add('hasta',
DateType::class,
[
'widget' => 'single_text',
'required' => false,
'attr' => ['class' => 'form-control'],
])
->add('equipo',
EntityType::class,
[
'class' => Maquinaria::class,
'required' => false,
'placeholder' => 'Todos los equipos',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->andWhere('u.activo = :activo')
->setParameter('activo', true)
->orderBy('u.nombre', 'ASC');
},
'group_by' => function($choice, $key, $value) {
if ($choice && $choice->getSector())
{
return $choice->getSector() . '';
}
return 'Sin sector';
},
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$data = $form->getData();
$planes = $planMantenimientoRepository->informePlanesPreventivosRealizados($data);
$response = array();
foreach ($planes as $plan)
{
$planM = $plan->getPlanMantenimiento();
$insumos = [];
foreach ($plan->getTareasDiagramadas() as $tareaDiagramada)
{
foreach ($tareaDiagramada->getInsumos() as $insumo)
{
foreach ($insumo->getItems() as $item)
{
$insumos[] = [
'nombre' => $item->getArticulo() . '',
'cantidad' => $item->getCantidad(),
];
}
}
}
$response[] = [
'id' => $plan->getId(),
'equipo' => $plan->getEquipo() . '',
'nombre' => $planM->getNombre(),
'departamento' => $plan->getDepartamento() . '',
'periodicidad' => $planM->getFrecuenciaPlan(),
'fechaRealizacion' => $plan->getFechaRealizacion() ? $plan->getFechaRealizacion()->format('d/m/Y') : null,
'fechaSort' => $plan->getFechaRealizacion() ? $plan->getFechaRealizacion()->format('Y-m-d') : null,
'insumos' => $insumos,
];
}
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/informe.html.twig',
[
'form' => $form->createView(),
'planes' => $response,
]);
}
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/informe.html.twig',
[
'form' => $form->createView(),
]);
}
/**
* @Route("/proximos/preventivos/realizar", name="app_mantenimiento_preventivo_plan_mantenimiento_proximos", methods={"GET", "POST"})
*/
public function proximosPreventivos(Request $request, PlanMantenimientoDiagramadoRepository $planMantenimientoRepository): Response
{
$formFechas = $this->getFormFechas();
$formFechas->handleRequest($request);
if ($formFechas->isSubmitted() && $formFechas->isValid())
{
$data = $formFechas->getData();
$desde = $data['desde'] ?? new \DateTime('now');
$hasta = $data['hasta'] ?? (new \DateTime('now'))->modify('+1 month');
$planes = $planMantenimientoRepository->proximosPlanesMantenimientoEquipos($desde, $hasta);
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/proximos.html.twig', [
'form' => $formFechas->createView(),
'planes' => $planes,
'desde' => $desde,
'hasta' => $hasta,
]);
}
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/proximos.html.twig', [
'form' => $formFechas->createView(),
]);
}
/**
* @Route("/gestion/masiva", name="app_mantenimiento_preventivo_plan_mantenimiento_gestion_masiva", methods={"GET", "POST"})
*/
public function gestionMasiva(Request $request, PlanMantenimientoRepository $planMantenimientoRepository): Response
{
$form = $this->getFormSelectPeriodo();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$data = $form->getData();
$periodo = $data['periodo'];
$planes = $planMantenimientoRepository->findPlanesActivosPorEquipoConUltimaFechaRealizacion($periodo);
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/masivo.html.twig', [
'form' => $form->createView(),
'planes' => $planes,
'periodo' => $periodo,
'departamentos' => $this->getUser()->getDepartamentos(),
]);
}
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/masivo.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/gestion/masiva/procesar", name="app_mantenimiento_preventivo_plan_mantenimiento_gestion_masiva_procesar", methods={"POST"})
*/
public function gestionMasivaProcesar(Request $request, PlanMantenimientoDiagramadoRepository $planMantenimientoDiagramadoRepository, EntityManagerInterface $em): Response
{
$all = $request->request->all();
if (!$all['departamento'])
{
return new JsonResponse([
'status' => false,
'message' => 'Debe seleccionar un departamento.',
]);
}
$departamento = $em->find(Departamento::class, $all['departamento']);
$fechaSeleccionada = \DateTime::createFromFormat('Y-m-d', $all['fecha_diagramacion']);
$numeroSemana= (int)$fechaSeleccionada->format('W');
$numeroAnio= (int)$fechaSeleccionada->format('Y');
$numeroMes = (int)$fechaSeleccionada->format('m');
$planesDiagramados = [];
foreach ($all as $key => $value)
{
$diagramar = false;
if (strpos($key, 'switch-') === 0)
{
$parts = explode('-', str_replace('switch-', '', $key));
if (count($parts) == 3)
{
$periodo = $parts[2];
$plan = $em->find(PlanMantenimiento::class, $parts[0]);
$equipo = $em->find(Maquinaria::class, $parts[1]);
$fechaDiagramado = $planMantenimientoDiagramadoRepository->findUltimaFechaDiagramada($plan, $equipo, $fechaSeleccionada);
if (!count($fechaDiagramado) )
{
$diagramar = true;
}
else
{
if ($periodo == 7)
{
$planesDiagramados[$key] = ["El plan se encuentra diagramado esta semana.", false];
}
elseif ($periodo == 30)
{
$planesDiagramados[$key] = ["El plan se encuentra diagramado este mes.", false];
}
elseif ($periodo == 365)
{
$planesDiagramados[$key] = ["El plan se encuentra diagramado este año.", false];
}
}
if ($diagramar)
{
$planDiagramado = new PlanMantenimientoDiagramado();
$planDiagramado->setPlanMantenimiento($plan)
->setEquipo($equipo)
->setFechaDiagrama($fechaSeleccionada)
->setDepartamento($departamento);
$em->persist($planDiagramado);
foreach ($plan->getTareas() as $tarea)
{
$tareaPlanDiagramada = new TareaPlanDiagramada();
$tareaPlanDiagramada->setTareaPlan($tarea)
->setDetalle($tarea->getDetalle())
->setPlanMantenimientoDiagramado($planDiagramado)
->setRealizada(false);
$em->persist($tareaPlanDiagramada);
}
$planesDiagramados[$key] = ["Plan mantenimineto diagramado exitosamente.", true];
}
}
}
}
$em->flush();
if (count($planesDiagramados) === 0)
{
return new JsonResponse([
'status' => false,
'message' => 'No se seleccionaron planes para diagramar.',
]);
}
return new JsonResponse([
'status' => true,
'planesDiagramados' => $planesDiagramados,
'fecha' => $fechaSeleccionada->format('d/m/Y'),
]);
}
/**
* @Route("/marcar/{id}/diagramado", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_realizar", methods={"GET", "POST"})
*/
public function marcarDiagramado(PlanMantenimientoDiagramado $planDiagramado, EntityManagerInterface $em): Response
{
if ($planDiagramado->isRealizado())
{
return new JsonResponse([
'status' => false,
'message' => 'El plan de mantenimiento ya ha sido realizado.',
]);
}
$dias = $planDiagramado->getPlanMantenimiento()->getPeriodicidad();
$proximaFecha = new \DateTime();
$proximaFecha->modify("+$dias days");
$planDiagramado->setFechaProximaRealizacion($proximaFecha);
$planDiagramado->setRealizado(true);
$planDiagramado->setFechaRealizacion(new \DateTime());
$em->flush();
return new JsonResponse([
'status' => true,
'message' => 'Plan de mantenimiento marcado como realizado.',
'fechaProximaRealizacion' => $proximaFecha->format('d/m/Y'),
]);
}
/**
* @Route("/print/{id}/plan", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_print", methods={"GET", "POST"})
*/
public function pdfAction(PlanMantenimientoDiagramado $planMantenimientoDiagramado, Pdf $knpSnappyPdf)
{
$html = $this->twig->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/imprimir.html.twig', [ 'plan' => $planMantenimientoDiagramado ]);
$this->pdf->setTimeout(600);
return new PdfResponse(
$this->pdf->getOutputFromHtml($html),
'file.pdf'
);
}
/**
* @Route("/print/pendiente", name="app_mantenimiento_preventivo_plan_mantenimiento_pendiente_realizar_print", methods={"GET", "POST"})
*/
public function pdfActionListaPendientes(Pdf $knpSnappyPdf, PlanMantenimientoDiagramadoRepository $planMantenimientoRepository)
{
$planes = $planMantenimientoRepository->planesMantenimientoEquiposPendientes();
$html = $this->twig->render('mantenimiento/diagrama_tarea/imprimirPlanesPendientes.html.twig', [ 'planes' => $planes ]);
$this->pdf->setTimeout(600);
return new PdfResponse(
$this->pdf->getOutputFromHtml($html),
'planes_pendientes.pdf'
);
}
/**
* @Route("/pendientes/realizar", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_pendientes_index", methods={"GET", "POST"})
*/
public function planesPendientes(Request $request, PlanMantenimientoDiagramadoRepository $planMantenimientoRepository): Response
{
$planes = $planMantenimientoRepository->planesMantenimientoEquiposPendientes();
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/administrar.html.twig', [
'planes' => $planes,
]);
}
/**
* @Route("/pendientes/{id}/gestionar", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_administrar_tareas", methods={"GET", "POST"})
*/
public function gestionarPlanDiagramado(PlanMantenimientoDiagramado $planMantenimientoDiagramado): Response
{
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/administrarTareas.html.twig', [
'plan' => $planMantenimientoDiagramado,
]);
}
/**
* @Route("/pendientes/{id}/gestionar/procesar/tareas", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_procesar_tareas", methods={"GET", "POST"})
*/
public function gestionarTareasDiagramado(Request $request, EntityManagerInterface $em, PlanMantenimientoDiagramado $planMantenimientoDiagramado): Response
{
if ($planMantenimientoDiagramado->isRealizado())
{
return new JsonResponse([
'status' => false,
'message' => 'El plan de mantenimiento ya ha sido realizado.',
]);
}
$all = $request->request->all();
try{
foreach ($all as $key => $value)
{
if (strpos($key, 'observa_') === 0)
{
$tareaId = str_replace('observa_', '', $key);
$tarea = $em->find(TareaPlanDiagramada::class, $tareaId);
if ($tarea)
{
$realizada = isset($all['realizada_' . $tareaId]) ? true : false;
$tarea->setRealizada($realizada)
->setDetalle($value);
if (isset($all['diagramar_' . $tareaId]))
{
$pedidoReparacion = new PedidoReparacion();
$pedidoReparacion->setTareaPlanDiagramada($tarea)
->setFecha(new \DateTimeImmutable())
->setDetalle($tarea->getTareaPlan()->getTarea())
->setSector($planMantenimientoDiagramado->getEquipo()->getSector())
->setEquipo($planMantenimientoDiagramado->getEquipo())
->setUsuarioAlta($this->getUser());
$em->persist($pedidoReparacion);
}
}
}
}
$dias = $planMantenimientoDiagramado->getPlanMantenimiento()->getPeriodicidad();
$proximaFecha = new \DateTime();
$proximaFecha->modify("+$dias days");
$planMantenimientoDiagramado->setFechaProximaRealizacion($proximaFecha);
$planMantenimientoDiagramado->setRealizado(true);
$planMantenimientoDiagramado->setFechaRealizacion(new \DateTime());
$em->flush();
return new JsonResponse([
'status' => true,
'message' => 'Tareas procesadas exitosamente.',
'fechaProximaRealizacion' => $proximaFecha->format('d/m/Y'),
]);
} catch (\Exception $e) {
return new JsonResponse([
'status' => false,
'message' => 'Error al procesar las tareas: ' . $e->getMessage(),
]);
}
}
/**
* @Route("/", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_index", methods={"GET", "POST"})
*/
public function pleaseGo(Request $request, PlanMantenimientoRepository $planMantenimientoRepository, EntityManagerInterface $em): Response
{
$form = $this->getFormSelectEquipo();
if ($request->isMethod('POST'))
{
$form->handleRequest($request);
if ($form->isValid())
{
$equipo = $form->get('equipo')->getData();
$planes = $planMantenimientoRepository->planesMantenimientoEquipos($equipo);
$dptos = $em->getRepository( Departamento::class )->findAll();
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/index.html.twig', [
'form' => $form->createView(),
'planes' => $planes,
'equipo' => $equipo,
'dptos' => $dptos
]);
}
}
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/index.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/home", name="app_mantenimiento_preventivo_plx", methods={"GET", "POST"})
*/
public function indiceHome(Request $request, PlanMantenimientoRepository $planMantenimientoRepository, EntityManagerInterface $em): Response
{
$form = $this->getFormSelectEquipo();
/////
if ($request->isMethod('POST'))
{
$form->handleRequest($request);
if ($form->isValid())
{
$equipo = $form->get('equipo')->getData();
$planes = $planMantenimientoRepository->planesMantenimientoEquipos($equipo);
$dptos = $em->getRepository( Departamento::class )->findAll();
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/index.html.twig', [
'form' => $form->createView(),
'planes' => $planes,
'equipo' => $equipo,
'dptos' => $dptos
]);
}
}
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/index.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/diagramar/{plan}/equipo/{equipo}/departamento/{depto}", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramar", methods={"GET", "POST"})
*/
public function diagramarPlan(PlanMantenimiento $plan, Equipo $equipo, EntityManagerInterface $em, $depto, PlanMantenimientoDiagramadoRepository $planMantenimientoDiagramadoRepository): Response
{
$existingPlan = $planMantenimientoDiagramadoRepository->findPlanMantenimiento($plan, $equipo);
$depto = $em->find(Departamento::class, $depto);
if ($existingPlan)
{
return new JsonResponse([
'status' => false,
'message' => 'El plan de mantenimiento ya ha sido diagramado para este equipo. ' ,
]);
}
$planMantenimientoDiagramado = new PlanMantenimientoDiagramado();
$planMantenimientoDiagramado->setPlanMantenimiento($plan)
->setEquipo($equipo)
->setFechaDiagrama(new \DateTime())
->setDepartamento($depto)
->setRealizado(false);
foreach ($plan->getTareas() as $tarea)
{
$tareaPlanDiagramada = new TareaPlanDiagramada();
$tareaPlanDiagramada->setTareaPlan($tarea)
->setPlanMantenimientoDiagramado($planMantenimientoDiagramado)
->setRealizada(false);
$em->persist($tareaPlanDiagramada);
}
$em->persist($planMantenimientoDiagramado);
$em->flush();
return new JsonResponse([
'status' => true,
'message' => 'Plan de mantenimiento diagramado exitosamente.',
'idPlan' => $planMantenimientoDiagramado->getId(),
]);
}
/**
* @Route("/new", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_new", methods={"GET", "POST"})
*/
public function new(Request $request, PlanMantenimientoDiagramadoRepository $planMantenimientoDiagramadoRepository): Response
{
$planMantenimientoDiagramado = new PlanMantenimientoDiagramado();
$form = $this->createForm(PlanMantenimientoDiagramadoType::class, $planMantenimientoDiagramado);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$planMantenimientoDiagramadoRepository->add($planMantenimientoDiagramado, true);
return $this->redirectToRoute('app_mantenimiento_preventivo_plan_mantenimiento_diagramado_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('mantenimiento/preventivo/plan_mantenimiento_diagramado/new.html.twig', [
'plan_mantenimiento_diagramado' => $planMantenimientoDiagramado,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_show", methods={"GET", "POST"})
*/
public function show(PlanMantenimientoDiagramado $planMantenimientoDiagramado): Response
{
return $this->render('mantenimiento/preventivo/plan_mantenimiento_diagramado/show.html.twig', [
'plan_mantenimiento_diagramado' => $planMantenimientoDiagramado,
]);
}
/**
* @Route("/{id}/edit", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, PlanMantenimientoDiagramado $planMantenimientoDiagramado, PlanMantenimientoDiagramadoRepository $planMantenimientoDiagramadoRepository): Response
{
$form = $this->createForm(PlanMantenimientoDiagramadoType::class, $planMantenimientoDiagramado);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$planMantenimientoDiagramadoRepository->add($planMantenimientoDiagramado, true);
return $this->redirectToRoute('app_mantenimiento_preventivo_plan_mantenimiento_diagramado_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('mantenimiento/preventivo/plan_mantenimiento_diagramado/edit.html.twig', [
'plan_mantenimiento_diagramado' => $planMantenimientoDiagramado,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_mantenimiento_preventivo_plan_mantenimiento_diagramado_delete", methods={"GET", "POST"})
*/
public function delete(Request $request, PlanMantenimientoDiagramado $planMantenimientoDiagramado, PlanMantenimientoDiagramadoRepository $planMantenimientoDiagramadoRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$planMantenimientoDiagramado->getId(), $request->request->get('_token'))) {
$planMantenimientoDiagramadoRepository->remove($planMantenimientoDiagramado, true);
}
return $this->redirectToRoute('app_mantenimiento_preventivo_plan_mantenimiento_diagramado_index', [], Response::HTTP_SEE_OTHER);
}
}