<?php
namespace App\Controller;
use App\Service\ServiceSTMP;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Service\UtilsTablesDataBase;
use App\Service\Utils;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\String\Slugger\AsciiSlugger;
use Dompdf\Dompdf;
class FrontendController extends AbstractController
{
/**
* @Route("/frontend", name="frontend")
*/
public function index(): Response
{
return $this->render('frontend/index.html.twig');
}
/**
* @Route("/frontend/preview-document-firmar",
* name="preview_document_firmar")
*/
public function previewDocumentFirmar(Request $request, ManagerRegistry $managerRegistry, UtilsTablesDataBase $utilsTablesDataBase, Utils $utils)
{
$oEm = $managerRegistry->getManager();
$oUser = $this->getUser();
$docFinal = '';
$btoken = $request->request->get('tokendoc');
$btype = $request->request->get('btype');
$btabla = $request->request->get('btabla');
$bentityId = $request->request->get('bentityid');
$bclienteId = $request->request->get('bclienteid');
$bdocclienteId = $request->request->get('bdoc');
$token = $utils->base64_url_decode($btoken);
$type = $utils->base64_url_decode($btype);
$tabla = $utils->base64_url_decode($btabla);
$entityId = $utils->base64_url_decode($bentityId);
$clienteId = $utils->base64_url_decode($bclienteId);
$docclienteId = $utils->base64_url_decode($bdocclienteId);
$oDocumentos = $oEm->getRepository('App\Entity\Documentos')
->getDocumentos();
$oDocumentoClientes = $oEm->getRepository('App\Entity\DocumentosClientes')
->findOneBy(['id' => $docclienteId]);
$is_signed = $oDocumentoClientes->isIsSigned();
$slugger = new AsciiSlugger();
$docId = 0;
$docFinal = "";
$fields = explode(":", $token);
if (isset($fields[0])) {
$docId = $fields[0];
}
/*if (!empty($oDocumentos)) {
foreach ($oDocumentos as $oDocumento) {
$docname = $oDocumento->getNombre();
$docname = $slugger->slug($docname)->lower();
$docname .= ".pdf";
$documentoId = $oDocumento->getId();
$dockey = $documentoId.":".$docname;
$hashed = hash("sha512", $dockey);
if ($hashed == $token){
$docId = $documentoId;
break;
}
}
} */
//$emailsCliente = $utilsTablesDataBase->getDestinatarioEmails($type, $tabla, $entityId);
//$contenido = $this->generateDocument($request, $managerRegistry,$utilsTablesDataBase, $oEmpresa, $type, $tabla, $entityId);
$mensaje = "En la parte inferior de la pantalla puede firmar este documento";
if ($is_signed) {
$mensaje = "El documento ha sido firmado con anterioridad";
}
$datos = [
'is_front' => true,
'ruta_doc' => $docFinal,
'type' => $type,
'tabla' => $tabla,
'entityId' => $entityId,
'clienteId' => $clienteId,
'documentoId' => $docId,
'documentoClienteId' => $docclienteId,
'is_signed' => $is_signed,
'mensaje' => $mensaje
];
return $this->render('documentos/modal-content-preview-doc-firmar.html.twig', $datos);
}
/**
* @Route("/frontend/generadocument",
* name="frontend_generadocument")
*/
public function generateDocument(Request $request, ManagerRegistry $managerRegistry, UtilsTablesDataBase $utilsTablesDataBase)
{
$oEm = $managerRegistry->getManager();
$oUser = $this->getUser();
$oEmpresa = '';
if (!empty($oUser) && !in_array('ROLE_SUPER_ADMIN', $oUser->getRoles())) {
$oEmpresa = $oUser->getEmpresa();
}
$type = $request->request->get('type');
$tabla = $request->request->get('tabla');
$entityId = $request->request->get('entityid');
$documentoId = $request->request->get('documentoid');
$documentoClienteId = $request->request->get('documentoClienteId');
$oDocumento = $oEm->getRepository('App\Entity\Documentos')
->findOneBy(['id' => $documentoId]);
if (!is_null($oDocumento->getEmpresa()) && $oEmpresa == '') {
$oEmpresa = $oDocumento->getEmpresa();
}
$host = $request->getHost();
/*$contenido = $utilsTablesDataBase->generateDocument($oEmpresa,$type,$documentoId,$tabla, $entityId, null, $host);
$dompdf = new Dompdf();
$dompdf->set_option('isRemoteEnabled', TRUE);
$dompdf->loadHtml($contenido);
// (Optional) Setup the paper size and orientation
if ($oDocumento->getOrientacion() == 'horizontal'){
$dompdf->setPaper('A4', 'landscape');
}
else{
$dompdf->setPaper('A4');
}
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$file_content = $dompdf->output(); //$dompdf->stream();*/
$rutapublic = $this->getParameter('kernel.project_dir') . '/public/';
$rutapdf = $rutapublic;
$oDocumentosClientes = $oEm->getRepository('App\Entity\DocumentosClientes')
->findOneBy(['id' => $documentoClienteId]);
$rutapdf .= $oDocumentosClientes->getUrl();
$file_content = file_get_contents($rutapdf);
$status = false;
$message = '';
return new Response($file_content,
200,
);
}
/**
* @Route("/frontent/documento_ajax_save_firma", name="frontend_documento_ajax_save_firma")
*/
public function saveFirma(Request $request, ManagerRegistry $managerRegistry, UtilsTablesDataBase $utilsTablesDataBase)
{
$rutapdf = "documentos/clientes/";
$isSecure = $request->isSecure();
$oEm = $managerRegistry->getManager();
$status = false;
$message = '';
$oUser = $this->getUser();
$documentoIdResponse = '';
$oEmpresa = '';
if (!empty($oUser) && !in_array('ROLE_SUPER_ADMIN', $oUser->getRoles())) {
$oEmpresa = $oUser->getEmpresa();
}
try {
$type = $request->request->get('type');
$tabla = $request->request->get('tabla');
$entityId = $request->request->get('entityid');
$documentoId = $request->request->get('documentoid');
$clienteId = $request->request->get('clienteid'); //destinatario email
$imageb64 = $request->request->get('imageb64');
$documentoClienteId = $request->request->get('documentoClienteId');
$cid = $request->request->get('cid');
if (!empty($cid)) {
$clienteId = $cid;
}
$documentName = "";
$oDocumento = $oEm->getRepository('App\Entity\Documentos')
->findOneBy(['id' => $documentoId]);
if (!empty($oDocumento)) {
$documentName = $oDocumento->getNombre();
}
$did = "";
$rutapdf = "documentos/clientes/";
if ($tabla == 'animales') {
$rutapdf = "documentos/animales/";
$oAnimalesPropietarios = $oEm->getRepository('App\Entity\AnimalesClientes')
->findBy(['animales' => $entityId]);
$did = $entityId;
foreach ($oAnimalesPropietarios as $animalesPropietario) {
if (!is_null($animalesPropietario->getClientes())) {
if (!$animalesPropietario->getIsDeleted()) {
$cliente = $animalesPropietario->getClientes();
$clienteId = $cliente->getId();
$clienteName = $cliente->getNombreCompleto();
break;
}
}
}
} else if ($tabla == "clientes") {
$did = $entityId;
if (!empty($oCliente)) {
$clienteName = $oCliente->getNombreCompleto();
}
} else if ($tabla == "visitas_tratamiento" || $tabla == "visitas") {
$infoVisitas = $utilsTablesDataBase->infoVisitasData($entityId);
$animalId = $infoVisitas['animal_id'];
$oAnimalesPropietarios = $oEm->getRepository('App\Entity\AnimalesClientes')
->findBy(['animales' => $animalId]);
foreach ($oAnimalesPropietarios as $animalesPropietario) {
if (!is_null($animalesPropietario->getClientes())) {
if (!$animalesPropietario->getIsDeleted()) {
$cliente = $animalesPropietario->getClientes();
$clienteId = $cliente->getId();
$clienteName = $cliente->getNombreCompleto();
break;
}
}
}
$did = $entityId;
} else if ($tabla == "receta_individual") {
$infoRecetas = $utilsTablesDataBase->infoRecetasData($entityId);
$animalId = $infoRecetas['animal_id'];
$oAnimalesPropietarios = $oEm->getRepository('App\Entity\AnimalesClientes')
->findBy(['animales' => $animalId]);
foreach ($oAnimalesPropietarios as $animalesPropietario) {
if (!is_null($animalesPropietario->getClientes())) {
if (!$animalesPropietario->getIsDeleted()) {
$cliente = $animalesPropietario->getClientes();
$clienteId = $cliente->getId();
$clienteName = $cliente->getNombreCompleto();
break;
}
}
}
$did = $entityId;
} else if ($tabla == "presupuesto") {
$clienteId = $utilsTablesDataBase->getDataColumnTable("presupuesto", "cliente_id", $entityId);
$did = $utilsTablesDataBase->getDataColumnTable("presupuesto", "numero_presupuesto", $entityId);
$oCliente = $oEm->getRepository('App\Entity\Clientes')
->findOneBy(['id' => $clienteId]);
if (!empty($oCliente)) {
$clienteName = $oCliente->getNombreCompleto();
}
} else if ($tabla == "albaran_venta") {
$dname = strtoupper($documentName);
$isFactura = false;
if (stripos($dname, "factura") !== FALSE) {
$isFactura = true;
}
$clienteId = $utilsTablesDataBase->getDataColumnTable("albaran_venta", "cliente_id", $entityId);
$propietarioId = $utilsTablesDataBase->getDataColumnTable("albaran_venta", "propietario_id", $entityId);
if (!empty($clienteId)) {
$oCliente = $oEm->getRepository('App\Entity\Clientes')
->findOneBy(['id' => $clienteId]);
} else if (!empty($propietarioId)) {
$oCliente = $oEm->getRepository('App\Entity\Clientes')
->findOneBy(['id' => $propietarioId]);
$clienteId = $propietarioId;
}
if (!empty($oCliente)) {
$clienteName = $oCliente->getNombreCompleto();
}
$oAlbaran = $oEm->getRepository('App\Entity\AlbaranVenta')->findOneBy(['id' => $entityId]);
$did = "";
if (!empty($oAlbaran)) {
if (!empty($oAlbaran->getNumeroFactura())) {
$did = $oAlbaran->getNumeroFactura();
} else {
$did = $oAlbaran->getNumeroAlbaran();
}
}
$did = str_replace('/', '-', $did);
}
$nombreFinal = $did . "-" . $documentName . ".pdf";
if (!empty($clienteName)) {
$nombreFinal = $did . "-" . $documentName . "-" . $clienteName . ".pdf";
}
$nombreFinal = trim($nombreFinal, "-");
if (empty($documentoClienteId)) {
$oAnimal = null;
$oDocumento = $oEm->getRepository('App\Entity\Documentos')
->findOneBy(['id' => $documentoId]);
$oCliente = $oEm->getRepository('App\Entity\Clientes')
->findOneBy(['id' => $clienteId]);
$oDocumentoClientes = new \App\Entity\DocumentosClientes();
$oDocumentoClientes->setClientes($oCliente);
$oDocumentoClientes->setDocumentos($oDocumento);
$oDocumentoClientes->setAnimales($oAnimal);
$oDocumentoClientes->setUrl("");
$oDocumentoClientes->setIsActive(true);
$oDocumentoClientes->setIsDeleted(false);
$oDocumentoClientes->setIsSigned(false);
$oDocumentoClientes->setIsSend(true);
$oDocumentoClientes->setFechaSend(new \DateTime('now'));
$oDocumentoClientes->setFechaActualizacion(new \DateTime('now'));
$oDocumentoClientes->setFechaCreacion(new \DateTime('now'));
$oDocumentoClientes->setFechaSigned(null);
$oEm->persist($oDocumentoClientes);
$oEm->flush();
$documentoClienteId = $oDocumentoClientes->getId();
}
if (!empty($documentoId) && !empty($documentoClienteId)) {
$oDocumento = $oEm->getRepository('App\Entity\Documentos')
->findOneBy(['id' => $documentoId]);
if (!empty($oDocumento->getEmpresa())) {
$oEmpresa = $oDocumento->getEmpresa();
}
$filename = $nombreFinal;//$oDocumento->getNombre().".pdf";
$host = $request->getHost();
$rutapublic = $this->getParameter('kernel.project_dir') . '/public/';
$contenido = $utilsTablesDataBase->generateDocument($oEmpresa, $type, $documentoId, $tabla, $entityId, null, $host, false, $rutapublic,0,$isSecure);
$contenido = $utilsTablesDataBase->replaceFirma($contenido, $imageb64);
$dompdf = new Dompdf();
$dompdf->set_option('isRemoteEnabled', TRUE);
$dompdf->loadHtml($contenido);
if ($oDocumento->getOrientacion() == 'horizontal') {
$dompdf->setPaper('A4', 'landscape');
} else {
$dompdf->setPaper('A4');
}
if ($tabla == 'animales') {
$rutapdf = "documentos/animales/";
$rutapdf .= "$entityId";
} else {
$rutapdf .= "$clienteId";
}
if (!file_exists($rutapdf)) {
mkdir($rutapdf, 0755, true);
}
$rutapdf .= "/$filename";
// (Optional) Setup the paper size and orientation
if ($oDocumento->getOrientacion() == 'horizontal') {
$dompdf->setPaper('A4', 'landscape');
} else {
$dompdf->setPaper('A4');
}
// Render the HTML as PDF
$dompdf->render();
//
$file_content = $dompdf->output();
@unlink($rutapdf);//borrar documento sin firmar
file_put_contents($rutapdf, $file_content);
$oDocumentoClientes = $oEm->getRepository('App\Entity\DocumentosClientes')
->findOneBy(['id' => $documentoClienteId]);
$oDocumentoClientes->setUrl($rutapdf);
$oDocumentoClientes->setIsSigned(true);
$oDocumentoClientes->setFechaActualizacion(new \DateTime('now'));
$oDocumentoClientes->setFechaSigned(new \DateTime('now'));
$oEm->persist($oDocumentoClientes);
$oEm->flush();
}
$status = true;
$message = 'Documento guardado correctamente';
} catch (\Exception $exception) {
$status = false;
$message = $exception->getMessage();
}
return new JsonResponse(['status' => $status, 'message' => $message, 'documentoId' => $documentoIdResponse]);
}
/**
* @Route("/restart-password", name="restart_password")
*/
public function restartPassword(Request $request, ManagerRegistry $managerRegistry)
{
return $this->render('security/restart-password.html.twig');
}
/**
* @Route("/validated-send-password", name="validated_send_password")
*/
public function validatedSendPassword(Request $request, ManagerRegistry $managerRegistry, Utils $utils, ServiceSTMP $serviceSTMP)
{
$oEm = $managerRegistry->getManager();
$status = false;
$message = '';
try {
$email = $request->request->get('email');
$userName = $request->request->get('username');
$oUser = $oEm->getRepository('App\Entity\User')
->findOneBy(['email' => $email, 'username' => $userName]);
if (is_null($oUser)) {
return new JsonResponse(['status' => false,
'message' => 'El email y el username que has introducido no existe en el sistema']);
}
$fechaActual = new \DateTime(); // Obtiene la fecha y hora actual
$fechaActual->add(new \DateInterval("PT1H"));
$token = $utils->generateToken();
$oUser->setTokenValidation($token);
$oUser->setDateTokenValidation($fechaActual);
$oEm->persist($oUser);
$oEm->flush();
$host = $request->getHost();
$urlRestartPassword = "https://" . $host . $this->generateUrl('validated_restart_password', ['token' => $token]);
$contentEmail = $this->renderView('templates-emails/restart-password.html.twig', ['reset_url' => $urlRestartPassword]);
$aEmailSend[] = $oUser->getEmail();
$aSendEmail = $serviceSTMP->sendEmailPlatform($aEmailSend, $contentEmail, 'Restablecer contraseña');
if (!$aSendEmail['status']) {
return new JsonResponse(['status' => $aSendEmail['status'], 'message' => $aSendEmail['message']]);
}
$status = true;
$message = 'Se ha enviado al correo eléctronico los paso a realizar para restablecer la contraseña';
} catch (\Exception $exception) {
$status = false;
$message = $exception->getMessage();
}
return new JsonResponse(['status' => $status, 'message' => $message]);
}
/**
* @Route("/validated-restart-password/{token}", name="validated_restart_password")
*/
public function validatedRestartPassword(Request $request, ManagerRegistry $managerRegistry, $token = '')
{
$oEm = $managerRegistry->getManager();
$fechaActual = new \DateTime();
$estado = 0;
$oUser = $oEm->getRepository('App\Entity\User')
->findOneBy(['tokenValidation' => $token]);
if (is_null($oUser)) {
$estado = 1; //No existe ningun usuario con este token
} else if ($fechaActual > $oUser->getDateTokenValidation()) {
$estado = 2; //Enlace no ha expirado
}
$datos = [
'estado' => $estado,
'tokenValidation' => $oUser->getTokenValidation()
];
return $this->render('security/change-password.html.twig', $datos);
}
/**
* @Route("/change-password", name="change_password")
*/
public function changePassword(Request $request, ManagerRegistry $managerRegistry, UserPasswordEncoderInterface $encoder)
{
$oEm = $managerRegistry->getManager();
$status = false;
$message = '';
try {
$token = $request->request->get('token');
$password = $request->request->get('password');
$oUser = $oEm->getRepository('App\Entity\User')
->findOneBy(['tokenValidation' => $token]);
if (is_null($oUser)) {
return new JsonResponse(['status' => false, 'message' => 'Usuario no existe']);
}
$encodePassword = $encoder->encodePassword($oUser, $password);
$oUser->setPassword($encodePassword);
$oUser->setFechaActualizacion(new \DateTime('now'));
$oUser->setDateTokenValidation(null);
$oUser->setTokenValidation(null);
$oEm->persist($oUser);
$oEm->flush();
$status = true;
$message = 'Contraseña modificada correctamente';
} catch (\Exception $exception) {
$status = false;
$message = $exception->getMessage();
}
return new JsonResponse(['status' => $status, 'message' => $message]);
}
}