<?php
namespace App\Controller;
use App\Entity\Evaluacion;
use App\Entity\Periodo;
use App\Entity\Solicitud;
use App\Entity\Unidad;
use App\Entity\Usuario;
use App\Form\EvaluacionType;
use Box\Spout\Common\Exception\InvalidArgumentException;
use Box\Spout\Common\Exception\IOException;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Writer\Exception\WriterNotOpenedException;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
#[Route('/consulta/solicitud')]
class ConsultaReporteSolicitudController extends AbstractController
{
public EntityManagerInterface $entityManager;
/**
* @param EntityManagerInterface $entityManager
*/
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
#[Route('/', name: 'consulta_solicitud_index')]
public function index(Request $request): Response
{
date_default_timezone_set('America/Mexico_City');
setlocale(LC_ALL, 'es_MX');
/** @var Usuario $user */
$user = $this->getUser();
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[12]["nivel"];
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso al módulo de "Consulta y Reportes de Solicitudes" está restringido.');
return $this->redirectToRoute('homepage');
}
/*$periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);*/
if ($nivel == 1) {
$form = $this->createFormBuilder()
->add('finicio', DateType::class, [
'label' => 'Desde',
'attr' => ['class' => 'form-control', 'class' => 'js-datepicker'],
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'data' => new \DateTime(date('Y') . '-01-01'),
])
->add('ftermino', DateType::class, [
'label' => 'Hasta',
'attr' => ['class' => 'form-control'],
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'data' => new \DateTime()
])
/*->add('buscar', ButtonType::class, [
'attr' => ['class' => 'form-control btn-success', 'id' => 'submit-btn']
])*/
->getForm();
$form->handleRequest($request);
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($user->getIdUsu(), 2);
}
if ($nivel == 2){
$form = $this->createFormBuilder()
->add('finicio', DateType::class, [
'label' => 'Desde',
//'attr' => ['class' => 'form-control'],
'required' => true,
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'data' => new \DateTime(date('Y') . '-01-01'),
'attr' => ['class' => 'js-datepicker'],
])
->add('ftermino', DateType::class, [
'label' => 'Hasta',
'attr' => ['class' => 'form-control'],
'required' => true,
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'data' => new \DateTime(),
'attr' => ['class' => 'js-datepicker'],
])
->add('unidad', EntityType::class,[
'label' => 'Unidad administrativa',
'class' => Unidad::class,
'attr' => ['class' => 'form-control col-6','js-datepicker'],
'placeholder' => 'Todo',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.nombre', 'ASC');
}
])
/*->add('Consultar', ButtonType::class, [
'attr' => ['class' => 'form-control btn-success', 'id' => 'submit-btn']
])*/
->getForm();
if($user->getRol()->getIdRol() == 3){
$form->remove('unidad');
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3, $user->getUnidad()->getIdUni());
}
if($user->getRol()->getIdRol() == 2){
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3);
}
$form->handleRequest($request);
}
if ($request->isMethod('POST')) {
if($user->getRol()->getIdRol() == 4){
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($user->getIdUsu(), 2, '', $form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
}
if($user->getRol()->getIdRol() == 3){
if (empty($form['finicio']->getData()) && empty($form['ftermino']->getData())) {
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3, $user->getUnidad()->getIdUni());
}
if (!empty($form['finicio']->getData()) && !empty($form['ftermino']->getData())) {
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3, $user->getUnidad()->getIdUni(), $form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
}
}
if($user->getRol()->getIdRol() == 2){
if (empty($form['unidad']->getData()) && empty($form['finicio']->getData()) && empty($form['ftermino']->getData())) {
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3);
}
if (!empty($form['unidad']->getData()) && empty($form['finicio']->getData()) && empty($form['ftermino']->getData())) {
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3, $form->get('unidad')->getData()->getIdUni());
}
if (!empty($form['unidad']->getData()) && !empty($form['finicio']->getData()) && !empty($form['ftermino']->getData())) {
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3, $form->get('unidad')->getData()->getIdUni(), $form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
}
if (empty($form['unidad']->getData()) && !empty($form['finicio']->getData()) && !empty($form['ftermino']->getData())) {
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 3, '', $form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
}
}
$data = [];
$i = 0;
foreach ($solicitudes as $s){
$evaluacionUrl = $this->generateUrl('consulta_solicitud_evaluacion', ['idSol' => $s['id_sol']]);
$viewUrl = $this->generateUrl('consulta_solicitud_vista_solicitud', ['id' => $s['id_sol']]);
$data[$i]['id_sol'] = $s['id_sol'];
$data[$i]['tipo_equipo'] = $s['tipo_equipo'];
$data[$i]['marbete'] = $s['marbete'];
$data[$i]['marca'] = $s['marca'];
$data[$i]['modelo'] = $s['modelo'];
$data[$i]['id_equipo'] = $s['id_equipo'];
$data[$i]['ubicacion'] = $s['ubicacion'];
$data[$i]['usuario'] = $s['usuario'];
$data[$i]['gestor'] = $s['gestor'];
$data[$i]['periodo'] = $s['periodo'];
$data[$i]['tipo_mantenimiento'] = $s['tipo_mantenimiento'];
$data[$i]['falla'] = $s['falla'];
$data[$i]['srealizado'] = $s['srealizado'];
$data[$i]['fregistro'] = $s['fregistro'];
$data[$i]['fatencion'] = $s['fatencion'];
$data[$i]['ffin'] = $s['ffin'];
$data[$i]['fevaluacion'] = $s['fevaluacion'];
$data[$i]['refacciones'] = $s['refacciones'];
$data[$i]['estatus'] = $s['estatus'];
$data[$i]['unidad'] = $s['unidad'];
$data[$i]['ver'] = $viewUrl;
$data[$i]['evaluacion'] = $evaluacionUrl;
$i++;
}
return new JsonResponse($data, Response::HTTP_OK);
}
return $this->render('consulta_solicitud/index.html.twig', [
'form' => $form->createView(),
'solicitudes' => $solicitudes
]);
}
/**
* Vista detallada de solicitud
* @Route("/vista/solicitud/{id}", name="consulta_solicitud_vista_solicitud", methods={"GET", "POST"})
* @param Request $request
* @return Response
*/
public function vistaSolicitud(Request $request) :Response
{
$solicitud = $this->entityManager->getRepository(Solicitud::class)->detalleTipoEquipoSolicitud($request->get('id'));
return $this->render('prog_solicitud/informacion_solicitud.html.twig', ['info' => $solicitud]);
}
#[Route('/vista/contador', name: 'consulta_solicitud_vista')]
public function vistaContador() :JsonResponse
{
/** @var Usuario $user */
$user = $this->getUser();
if($user->getRol()->getIdRol() == 4) {
$cTodoEquipo = $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario($user->getIdUsu(), 2);
}
if($user->getRol()->getIdRol() == 3) {
$cTodoEquipo = $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario(0, 3, $user->getUnidad()->getIdUni());
}
if($user->getRol()->getIdRol() == 2) {
$cTodoEquipo = $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario(0, 4);
}
return new JsonResponse(['data' => $cTodoEquipo], Response::HTTP_OK);
}
/**
* Evaluación de mantenimiento por solicitud
* @Route("/evaluacion/{idSol}", name="consulta_solicitud_evaluacion", methods={"GET", "POST"})
* @param Solicitud $solicitud
* @param Request $request
* @return Response|JsonResponse
*/
public function evaluacionMantenimiento(Request $request, Solicitud $solicitud) :Response
{
date_default_timezone_set("America/Mexico_City");
$contestada = $this->entityManager->getRepository(Evaluacion::class)->findOneBy(['solicitud' => $solicitud->getIdSol()]);
$nueva = 0;
$info = [
'solicitud' => $solicitud->getIdSol(),
'tipoMantenimiento' => $solicitud->getTipoMantenimiento(),
];
if (empty($contestada) && $solicitud->getEstatus() == 3) {
$nueva = 1;
$time = new DateTime();
$form = $this->createForm(EvaluacionType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$evaluacion = new Evaluacion();
$evaluacion->setEvalua1($form->get('evalua1')->getData());
$evaluacion->setEvalua2($form->get('evalua2')->getData());
$evaluacion->setEvalua3($form->get('evalua3')->getData());
$evaluacion->setEvalua4($form->get('evalua4')->getData());
$evaluacion->setEvalua5($form->get('evalua5')->getData());
$evaluacion->setSolicitud($solicitud);
$this->entityManager->persist($evaluacion);
$this->entityManager->flush();
$solicitud->setEstatus(4);
$solicitud->setFevaluacion($time);
$this->entityManager->persist($solicitud);
$this->entityManager->flush();
if ($solicitud->getEstatus() == 4){
$estatus="<span class='badge bg-gradient-green d-block'>Evaluado</span>";
}
return new JsonResponse([
'id' => $solicitud->getIdSol(),
'estatus' => $estatus
]);
}
} else {
$form = $this->createForm(EvaluacionType::class, $contestada);
$form->handleRequest($request);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('prog_correctivo/evaluacion.html.twig', [
'form' => $form->createView(),
'info' => $info,
'nueva' => $nueva
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('prog_correctivo/evaluacion.html.twig', [
'form' => $form,
'info' => $info,
'nueva' => $nueva
]);
}
/**
* @Route("/reporte/excel/{id}/{finicio}/{ftermino}", name= "consulta_solicitud_reporte_excel")
* @param Request $request
* @return BinaryFileResponse
* @throws IOException
* @throws InvalidArgumentException
* @throws WriterNotOpenedException
*/
public function generarExcelReporteAction(Request $request): BinaryFileResponse
{
date_default_timezone_set('America/Mexico_City');
setlocale(LC_ALL, 'es_MX');
ini_set('memory_limit', '5120M');
ini_set('max_execution_time', 0);
ini_set('output_buffering', 0);
# Obtenemos los datos del documento
/** @var Usuario $user */
$user = $this->getUser();
if ($user->getRol()->getIdRol() == 3){
if($request->get('id') != "undefined"){
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 4, $request->get('id'), $request->get('finicio'), $request->get('ftermino'));
}
}
if ($user->getRol()->getIdRol() == 4){
if($request->get('id') != "undefined"){
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($request->get('id'), 5, '', $request->get('finicio'), $request->get('ftermino'));
}
}
# Definir el nombre temporal del archivo
$filePath = 'solicitudes.xlsx';
# Se definen las cabeceras del archivo
$cabecera = WriterEntityFactory::createRowFromArray([
'Nombre(s)',
'Apellido(s)',
'Correo',
'Marbete',
'Descripción',
'Acción a Realizar',
'No. Solicitud',
'Tipo de Equipo',
'Ubicación',
'Gestor',
'Periodo',
'Tipo de Mantenimiento',
'Incidente',
'Servicio Realizado',
'Fecha de Registro',
'Fecha de Atención',
'Fecha de Termino',
'Fecha de Evaluación',
'Refacciones',
'Estatus',
'Unidad',
'1. La falla reportada, Ya se había presentado en el reporte inmediato anterior',
'2. ¿Cómo calificas el tiempo de respuesta a tu reporte?',
'3. ¿La solución a tu problema, ¿satisface tus necesidades laborales?',
'4. ¿En general, cómo calificarías el servicio recibido?',
'5. Si pudieras, ¿qué mejorarías acerca del Servicio de Mantenimiento recibido?'
]);
# Se crea el arreglo con los datos del cuerpo del documento
$data = [];
$n = 1;
dump($solicitudes);
foreach ($solicitudes as $s) {
$estatus = $s['estatus'];
$r1 = '';
$r2 = '';
$r3 = '';
$r4 = '';
$r5 = '';
if ($estatus == 1)
{
$estatus = "Pendiente";
} elseif ($estatus == 2)
{
$estatus = "En proceso";
} elseif ($estatus == 3)
{
$estatus = "Atendido";
} elseif ($estatus == 4)
{
$estatus = "Evaluado";
$evaluacion = $this->entityManager->getRepository(Solicitud::class)->respuestasSolicitudEvaluacion($s['id_sol']);
if(!empty($evaluacion)){
$r1 = $evaluacion['evalua1'];
($r1 == 1) ? $r1 = "Si" : $r1 = "No";
$r2 = $evaluacion['evalua2'];
if ($r2 == 5)
{
$r2 = "Muy bueno";
} elseif ($r2 == 4)
{
$r2 = "Bueno";
} elseif ($r2 == 3)
{
$r2 = "Regular";
} elseif ($r2 == 2)
{
$r2 = "Aceptable";
} elseif ($r2 == 1)
{
$r2 = "Deficiente";
}
$r3 = $evaluacion['evalua3'];
if ($r3 == 5)
{
$r3 = "Muy bueno";
} elseif ($r3 == 4)
{
$r3 = "Bueno";
} elseif ($r3 == 3)
{
$r3 = "Regular";
} elseif ($r3 == 2)
{
$r3 = "Aceptable";
} elseif ($r3 == 1)
{
$r3 = "Deficiente";
}
$r4 = $evaluacion['evalua4'];
if ($r4 == 5)
{
$r4 = "Muy bueno";
} elseif ($r4 == 4)
{
$r4 = "Bueno";
} elseif ($r4 == 3)
{
$r4 = "Regular";
} elseif ($r4 == 2)
{
$r4 = "Aceptable";
} elseif ($r4 == 1)
{
$r4 = "Deficiente";
}
$r5 = $evaluacion['evalua5'];
}
}
$p = $s['refacciones'];
($p == '' || $p == null) ? $p = 'No' : $p = 'Si';
$data[] = WriterEntityFactory::createRowFromArray([
$s['unombre'],
$s['uapellido'],
$s['ucorreo'],
$s['marbete'],
'Marca: ' . $s['marca'] . ' Modelo: ' . $s['modelo'],
$s['falla'],
$s['id_sol'],
$s['tipo_equipo'],
$s['nubicacion'],
$s['gnombre'] . ' ' . $s['gapellido'] . ' ' . $s['gcorreo'],
$s['periodo'],
$s['tipo_mantenimiento'],
$s['falla'],
$s['srealizado'],
$s['fregistro'],
$s['fatencion'],
$s['ffin'],
$s['fevaluacion'],
$p,
$estatus,
$s['nunidad'],
$r1,
$r2,
$r3,
$r4,
$r5
]);
$n++;
}
# Se crea el documento en formato CSV
$writer = WriterEntityFactory::createXLSXWriter();
$writer
->openToFile($filePath)
->addRow($cabecera)
->addRows($data)
->close()
;
$response = new BinaryFileResponse($filePath);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'ReporteSolicitudes' . '_' . date('Y-m-d His') . '.xlsx'
);
$response->deleteFileAfterSend(true);
return $response;
}
//Para subir formulario
}