<?php
namespace App\Controller;
use App\Entity\Certificado;
use App\Form\CertificadoType;
use App\Repository\CertificadoRepository;
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 Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Contracts\Translation\TranslatorInterface;
use Dompdf\Dompdf;
use Dompdf\Options;
use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;
/**
* @Route("/certificado")
*/
class CertificadoController extends BaseController
{
/**
* @Route("/", name="certificado_index", methods={"GET"})
* @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
*/
public function index(CertificadoRepository $certificadoRepository, TranslatorInterface $translator): Response
{
$breadcrumbs[$translator->trans('Certificados')] = null;
$entityManager = $this->getDoctrine()->getManager();
return $this->render('certificado/index.html.twig', [
'certificados' => $certificadoRepository->findAll(),
'cantPendientes' => $entityManager->getRepository('App:Certificado')->getCantByEstado(Certificado::ESTADO_PENDIENTE),
'cantAceptados' => $entityManager->getRepository('App:Certificado')->getCantByEstado(Certificado::ESTADO_ACEPTADO),
'cantRechazados' => $entityManager->getRepository('App:Certificado')->getCantByEstado(Certificado::ESTADO_RECHAZADO),
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Certificados')
]);
}
/**
* @Route("/grid", name="certificado_grid", methods={"GET","POST"})
* @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
*/
public function indexGridAction(Request $request) {
$em = $this->getDoctrine()->getManager();
$idUser = $this->getUser()->getId();
$admin = false;
if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
$admin = true;
}
$search = $request->request->get('search');
$draw = $request->request->get('draw');
$start = $request->request->get('start');
$length = $request->request->get('length');
if (!$request->request->get('order')) {
$column = "c.orden, c.fechaSolicitud";
$direction = 'asc';
} else {
$order = $request->request->get('order');
$column = $order[0]['column']; // 1|2|..|n
switch ($column) {
case 0:
$column = 'c.identificador';
break;
case 1:
$column = 'c.apellido';
break;
case 2:
$column = 'c.nombre';
break;
case 3:
$column = 'c.numeroDocumento';
break;
case 4:
$column = 'c.carrera';
break;
case 5:
$column = 'c.tipoCertificacion';
break;
case 6:
$column = 'c.estado';
break;
}
$direction = $order[0]['dir']; // asc|desc
}
$recordsTotal = $em->getRepository('App:Certificado')->getCountRecords($idUser, $admin);
if ($search['value'] == "") {
$entities = $em->getRepository('App:Certificado')->getDrawForTable($start, $length, $column, $direction, $idUser, $admin);
$recordsFiltered = $recordsTotal;
} else {
$recordsFiltered = count($em->getRepository('App:Certificado')->getRecordsBySearch($search['value'], $idUser, $admin));
$entities = $em->getRepository('App:Certificado')->search($search['value'], $start, $length, $column, $direction, $idUser, $admin);
}
return $this->render('certificado/index_grid.html.twig', array(
'entities' => $entities,
'vdraw' => $draw,
'vrecordsTotal' => $recordsTotal,
'vrecordsFiltered' => $recordsFiltered
)
);
}
/**
* @Route("/new", name="certificado_new", methods={"GET","POST"})
*/
public function new(Request $request, TranslatorInterface $translator, Recaptcha3Validator $recaptcha3Validator): Response
{
$certificado = new Certificado();
$form = $this->createForm(CertificadoType::class, $certificado);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$score = $recaptcha3Validator->getLastResponse()->getScore();
if ($score >= 0.5) {
try {
$numeroDocumento = $form->get('numeroDocumento')->getData();
$entityManager = $this->getDoctrine()->getManager();
$exist = $entityManager->getRepository('App:Certificado')->findByDocumento($numeroDocumento);
if (!$exist) {
$certificado->setEstado(Certificado::ESTADO_PENDIENTE);
$certificado->setOrden(1);
$certificado->setFechaSolicitud(new \DateTime());
// Se comprueba la extensión de los archivos a subir
$extensions = array("pdf", "gif", "jpg", "jpeg", "png", "bmp");
$file1 = $form->get('imageFile1')->getData();
if (isset($file1)) {
// Comprueba que la extension del archivo 1 sea valida
if (!$this->validateExtensionFile($file1, $extensions)) {
$error = "Compruebe la extensión de los archivos a subir. Sólo se pueden subir archivos con extensiones: [.pdf | .png | .jpeg | .jpg | .gif | .bmp]";
$this->get('session')->getFlashBag()->add('error', $error);
return $this->redirect($this->generateUrl('certificado_new'));
}
$certificado->setUpdatedAt(new \DateTime());
}
$file2 = $form->get('imageFile2')->getData();
if (isset($file2)) {
// Comprueba que la extension del archivo 2 sea valida
if (!$this->validateExtensionFile($file2, $extensions)) {
$error = "Compruebe la extensión de los archivos a subir. Sólo se pueden subir archivos con extensiones: [.pdf | .png | .jpeg | .jpg | .gif | .bmp]";
$this->get('session')->getFlashBag()->add('error', $error);
return $this->redirect($this->generateUrl('certificado_index'));
}
$certificado->setUpdatedAt(new \DateTime());
}
$file3 = $form->get('imageFile3')->getData();
if (isset($file3)) {
// Comprueba que la extension del archivo 3 sea valida
if (!$this->validateExtensionFile($file3, $extensions)) {
$error = "Compruebe la extensión de los archivos a subir. Sólo se pueden subir archivos con extensiones: [.pdf | .png | .jpeg | .jpg | .gif | .bmp]";
$this->get('session')->getFlashBag()->add('error', $error);
return $this->redirect($this->generateUrl('certificado_index'));
}
$certificado->setUpdatedAt(new \DateTime());
}
$entityManager->persist($certificado);
$entityManager->flush();
} else {
$error = "Ocurrio un error al procesar su solicitud. Su certificado ya fue solicitado.";
$this->get('session')->getFlashBag()->add('error', $error);
return $this->redirectToRoute('certificado_new');
}
} catch (Exception $e) {
$exception = $e->getMessage();
$error = "Ocurrio un error al procesar su solicitud. Por favor, vuelva a intentarlo.";
$this->get('session')->getFlashBag()->add('error', $error);
return $this->redirectToRoute('certificado_new');
}
$this->get('session')->getFlashBag()->add('success', 'Su solicitud se envió correctamente.');
} else {
$error = "El captcha es invalido. Por favor, vuelva a intentarlo.";
$this->get('session')->getFlashBag()->add('error', $error);
return $this->redirectToRoute('certificado_new');
}
}
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
$breadcrumbs = array(
$translator->trans('Certificados') => $this->generateUrl('certificado_index'),
$translator->trans('Solicitud') => null
);
} else {
$breadcrumbs = null;
}
return $this->render('certificado/new.html.twig', [
'certificado' => $certificado,
'form' => $form->createView(),
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Solicitud de Certificado')
]);
}
/**
* @Route("/{id}", name="certificado_show", methods={"GET"})
* @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
*/
public function show(Certificado $certificado, TranslatorInterface $translator): Response
{
$breadcrumbs = array(
$translator->trans('Certificados') => $this->generateUrl('certificado_index'),
$translator->trans('Detalle') => null
);
return $this->render('certificado/show.html.twig', [
'certificado' => $certificado,
'rechazado' => Certificado::ESTADO_RECHAZADO,
'pendiente' => Certificado::ESTADO_PENDIENTE,
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Detalle Certificado')
]);
}
/**
* @Route("/{id}/accept", name="certificado_accept", methods={"GET","POST"})
* @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
*/
public function accept(Request $request, $id, TranslatorInterface $translator): Response
{
$entityManager = $this->getDoctrine()->getManager();
$certificado = $entityManager->getRepository('App:Certificado')->find($id);
$certificado->setEstado(Certificado::ESTADO_ACEPTADO);
$certificado->setOrden(2);
$identificador = uniqid();
$certificado->setIdentificador($identificador);
$certificado->setFechaProcesado(new \DateTime());
$certificado->setProcesadoPor($this->getUser()->getUsername());
$entityManager->persist($certificado);
$entityManager->flush();
$this->get('session')->getFlashBag()->add('success', 'El certificado se aceptó correctamente.');
return $this->redirectToRoute('certificado_index');
}
/**
* @Route("/reject", name="certificado_reject", methods={"GET","POST"})
* @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
*/
public function reject(Request $request, TranslatorInterface $translator): Response
{
$entityManager = $this->getDoctrine()->getManager();
$id = $request->request->get('id');
$motivo = $request->request->get('motivo');
$certificado = $entityManager->getRepository('App:Certificado')->find($id);
$certificado->setEstado(Certificado::ESTADO_RECHAZADO);
$certificado->setOrden(3);
$certificado->setMotivoRechazo($motivo);
$certificado->setFechaProcesado(new \DateTime());
$certificado->setProcesadoPor($this->getUser()->getUsername());
$entityManager->persist($certificado);
$entityManager->flush();
$this->get('session')->getFlashBag()->add('success', 'El certificado se rechazó correctamente.');
return $this->redirectToRoute('certificado_index');
}
private function redirectToHomepageWithMessage($msg, $msgValidate, $msgSearch) {
$breadcrumbs['Inicio'] = null;
return $this->render('default/index.html.twig', [
'breadcrumbs' => $breadcrumbs,
'msg' => $msg,
'msgValidate' => $msgValidate,
'msgSearch' => $msgSearch,
'page_title' => 'Inicio'
]);
}
/**
* @Route("/validate", name="certificado_validate", methods={"GET","POST"})
*/
public function validate(Request $request, TranslatorInterface $translator): Response
{
$entityManager = $this->getDoctrine()->getManager();
$identificador = $request->request->get('identificador');
try {
$certificado = $entityManager->getRepository('App:Certificado')->findByIdentificador($identificador);
if (!$certificado) {
$msg = "No se encontro ningún certificado con identificador <b>".$identificador."</b>.";
return $this->redirectToHomepageWithMessage($msg, true, false);
}
} catch (Exception $e) {
$exception = $e->getMessage();
$msg = "Ocurrio un error al intentar validar el certificado. Por favor, vuelva a intentarlo.";
return $this->redirectToHomepageWithMessage($msg, true, false);
}
$breadcrumbs = array(
$translator->trans('Inicio') => $this->generateUrl('homepage'),
$translator->trans('Validación de Certificado') => null
);
return $this->render('certificado/validate.html.twig', [
'certificado' => $certificado,
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Validación de Certificado')
]);
}
/**
* @Route("/search", name="certificado_search", methods={"GET","POST"}, options={"expose"=true})
*/
public function search(Request $request, TranslatorInterface $translator): Response
{
$xLegajo = true;
$legajo = $request->request->get('legajo');
if (!$legajo) {
$xLegajo = false;
$tipoDocumento = $request->request->get('tipo_documento');
$numeroDocumento = $request->request->get('numero_documento');
}
$entityManager = $this->getDoctrine()->getManager();
if ($xLegajo) {
$certificados = $entityManager->getRepository('App:Certificado')->findBy(array('legajo' => $legajo));
} else {
$certificados = $entityManager->getRepository('App:Certificado')->findBy(array('tipoDocumento' => $tipoDocumento, 'numeroDocumento' => $numeroDocumento));
}
if (is_array($certificados) && (count($certificados) > 0)) {
$breadcrumbs = array(
$translator->trans('Inicio') => $this->generateUrl('homepage'),
$translator->trans('Certificado') => null
);
return $this->render('certificado/search.html.twig', [
'certificados' => $certificados,
'estadoAceptado' => Certificado::ESTADO_ACEPTADO,
'estadoPendiente' => Certificado::ESTADO_PENDIENTE,
'estadoRechazado' => Certificado::ESTADO_RECHAZADO,
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Certificado')
]);
} else {
$msg = "El certificado buscado es inexistente.";
}
return $this->redirectToHomepageWithMessage($msg, false, true);
}
/**
* @Route("/export", name="certificado_export", methods={"GET","POST"}, options={"expose"=true})
*/
public function export(Request $request, TranslatorInterface $translator): Response
{
$tipoDocumento = $request->request->get('tipo_documento');
$numeroDocumento = $request->request->get('numero_documento');
$entityManager = $this->getDoctrine()->getManager();
$certificado = $entityManager->getRepository('App:Certificado')->findOneBy(array('tipoDocumento' => $tipoDocumento, 'numeroDocumento' => $numeroDocumento, 'estado' => Certificado::ESTADO_ACEPTADO));
$monthName = $this->getCurrentMonth();
$html = $this->renderView('certificado/pdf.html.twig', array(
'title' => "Certificado Único de Estudiantes Trabajadores y/o con familiares a cargo",
'monthName' => $monthName,
'certificado' => $certificado
));
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Calibri');
$pdfOptions->set('isRemoteEnabled', TRUE);
$pdfOptions->set('isHtml5ParserEnabled', TRUE);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4');
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// Render the HTML
$dompdf->render();
ob_end_clean();
$filename = str_replace(' ','_',(strtolower($certificado->getApellido()).'_'.strtolower($certificado->getNombre())));
$dompdf->stream($filename, array(
"Attachment" => FALSE
));
}
}